From: Eduardo Date: Wed, 26 Feb 2025 15:55:45 +0000 (+0100) Subject: updated to 4.4 X-Git-Url: http://git.edufdez.es/?a=commitdiff_plain;h=5b9fab62567abbe3affca4ae893eca897b490f5e;p=rpg-template.git updated to 4.4 there were also works on the inventory and the save system\n Also a new Event manager system for global signaling --- diff --git a/addons/gloot/LICENSE b/addons/gloot/LICENSE deleted file mode 100644 index e9b4efd..0000000 --- a/addons/gloot/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Peter Kish - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/addons/gloot/README.md b/addons/gloot/README.md new file mode 100644 index 0000000..6825acb --- /dev/null +++ b/addons/gloot/README.md @@ -0,0 +1,16 @@ +# GLoot Directory Contents + +## Directories + +| Directory | Description | +| --------- | ----------- | +| `core` | Core GLoot functionality. Contains classes like `Inventory`, `InventoryItem`, `ProtoTree` etc. | +| `editor` | Code that will exclusively be run in the editor. Contains implementations of the inventory editor, item editor, item slot editor etc. | +| `images` | Images/icons used by the pluigin. | +| `ui` | UI control classes like `CtrlInventory`, `CtrlInventoryGrid` etc. | + +## Files + +| File | Description | +| ---------- | ----------- | +| `gloot.gd` | GLoot `EditorPlugin` implementation | \ No newline at end of file diff --git a/addons/gloot/core/README.md b/addons/gloot/core/README.md new file mode 100644 index 0000000..d613bb4 --- /dev/null +++ b/addons/gloot/core/README.md @@ -0,0 +1,20 @@ +# Core Directory Contents + +## Directories + +| Directory | Description | +| ------------- | ----------- | +| `constraints` | Constraint implementations (`WeightConstraint`, `GridConstraint` and `ItemCountConstraint`) | +| `prototree` | Prototree related code (`Prototype` and `ProtoTree`) | + +## Files + +| File | Description | +| ------------------- | ----------- | +| `inventory_item.gd` | `InventoryItem` implementation. | +| `inventory.gd` | `Inventory` implementation. | +| `item_count.gd` | A helper script for item count arithmetics that support infinity. | +| `item_slot.gd` | `ItemSlot` implementation. | +| `stack_manager.gd` | A helper script for managing item stacks. | +| `utils.gd` | Miscellaneous helper utility functions. | +| `verify.gd` | A helper script for data verification. | diff --git a/addons/gloot/core/constraints/README.md b/addons/gloot/core/constraints/README.md new file mode 100644 index 0000000..f44041b --- /dev/null +++ b/addons/gloot/core/constraints/README.md @@ -0,0 +1,12 @@ +# Constraints Directory Contents + +## Files + +| File | Description | +| ------------------- | ----------- | +| `constraint_manager.gd` | Helper script for managing inventory constraints. | +| `grid_constraint.gd` | `GridConstraint` implementation. | +| `inventory_constraint.gd` | Inventory constraint base class (`InventoryConstraint`). | +| `item_count_constraint.gd` | `ItemCountConstraint` implementation. | +| `quadtree.gd` | Implements quad-trees used in `GridConstraint` for organizing items in a 2d space. | +| `weight_constraint.gd` | `WeightConstraint` implementation. | diff --git a/addons/gloot/core/constraints/constraint_manager.gd b/addons/gloot/core/constraints/constraint_manager.gd index 82a038b..de343dc 100644 --- a/addons/gloot/core/constraints/constraint_manager.gd +++ b/addons/gloot/core/constraints/constraint_manager.gd @@ -1,264 +1,131 @@ extends RefCounted -const KEY_WEIGHT_CONSTRAINT = "weight_constraint" -const KEY_STACKS_CONSTRAINT = "stacks_constraint" -const KEY_GRID_CONSTRAINT = "grid_constraint" - -const Verify = preload("res://addons/gloot/core/verify.gd") -const WeightConstraint = preload("res://addons/gloot/core/constraints/weight_constraint.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -var _weight_constraint: WeightConstraint = null -var _stacks_constraint: StacksConstraint = null -var _grid_constraint: GridConstraint = null -var inventory: Inventory = null : - set(new_inventory): - assert(new_inventory != null, "Can't set inventory to null!") - assert(inventory == null, "Inventory already set!") - inventory = new_inventory - if _weight_constraint != null: - _weight_constraint.inventory = inventory - if _stacks_constraint != null: - _stacks_constraint.inventory = inventory - if _grid_constraint != null: - _grid_constraint.inventory = inventory - - -enum Configuration {WSG, WS, WG, SG, W, S, G, VANILLA} +signal constraint_changed(constraint: InventoryConstraint) +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") -func _init(inventory_: Inventory) -> void: - inventory = inventory_ - - -func _on_item_added(item: InventoryItem) -> void: - assert(_enforce_constraints(item), "Failed to enforce constraints!") +const _KEY_CONSTRAINT_NAME: String = "name" +const _KEY_CONSTRAINT_DATA: String = "data" - # Enforcing constraints can result in the item being removed from the inventory - # (e.g. when it's merged with another item stack) - if !is_instance_valid(item.get_inventory()) || item.is_queued_for_deletion(): - item = null - - if _weight_constraint != null: - _weight_constraint._on_item_added(item) - if _stacks_constraint != null: - _stacks_constraint._on_item_added(item) - if _grid_constraint != null: - _grid_constraint._on_item_added(item) +var inventory: Inventory = null +var _constraints: Array[InventoryConstraint] = [] -func _on_item_removed(item: InventoryItem) -> void: - if _weight_constraint != null: - _weight_constraint._on_item_removed(item) - if _stacks_constraint != null: - _stacks_constraint._on_item_removed(item) - if _grid_constraint != null: - _grid_constraint._on_item_removed(item) - +func _init(inventory_: Inventory) -> void: + inventory = inventory_ + if !is_instance_valid(inventory): + return -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - if _weight_constraint != null: - _weight_constraint._on_item_property_changed(item, property_name) - if _stacks_constraint != null: - _stacks_constraint._on_item_property_changed(item, property_name) - if _grid_constraint != null: - _grid_constraint._on_item_property_changed(item, property_name) +func is_empty() -> bool: + return _constraints.is_empty() -func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: - if _weight_constraint != null && !_weight_constraint._on_pre_item_swap(item1, item2): - return false - if _stacks_constraint != null && !_stacks_constraint._on_pre_item_swap(item1, item2): - return false - if _grid_constraint != null && !_grid_constraint._on_pre_item_swap(item1, item2): - return false - return true +func register_constraint(constraint: InventoryConstraint) -> void: + _constraints.append(constraint) + _Utils.safe_connect(constraint.changed, _on_constraint_changed.bind(constraint)) -func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: - if _weight_constraint != null: - _weight_constraint._on_post_item_swap(item1, item2) - if _stacks_constraint != null: - _stacks_constraint._on_post_item_swap(item1, item2) - if _grid_constraint != null: - _grid_constraint._on_post_item_swap(item1, item2) - - -func _enforce_constraints(item: InventoryItem) -> bool: - match get_configuration(): - Configuration.G: - return _grid_constraint.move_item_to_free_spot(item) - Configuration.WG: - return _grid_constraint.move_item_to_free_spot(item) - Configuration.SG: - if _grid_constraint.move_item_to_free_spot(item): - return true - _stacks_constraint.pack_item(item) - Configuration.WSG: - if _grid_constraint.move_item_to_free_spot(item): - return true - _stacks_constraint.pack_item(item) - return true +func unregister_constraint(constraint: InventoryConstraint) -> void: + _constraints.erase(constraint) + _Utils.safe_disconnect(constraint.changed, _on_constraint_changed.bind(constraint)) -func get_configuration() -> int: - if _weight_constraint && _stacks_constraint && _grid_constraint: - return Configuration.WSG +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + constraint_changed.emit(constraint) - if _weight_constraint && _stacks_constraint: - return Configuration.WS - if _weight_constraint && _grid_constraint: - return Configuration.WG +func _on_item_added(item: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_item_added(item) - if _stacks_constraint && _grid_constraint: - return Configuration.SG - if _weight_constraint: - return Configuration.W +func _on_item_removed(item: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_item_removed(item) - if _stacks_constraint: - return Configuration.S - if _grid_constraint: - return Configuration.G +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + for constraint in _constraints: + constraint._on_item_property_changed(item, property) - return Configuration.VANILLA +func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: + for constraint in _constraints: + if !constraint._on_pre_item_swap(item1, item2): + return false + return true -func get_space_for(item: InventoryItem) -> ItemCount: - match get_configuration(): - Configuration.W: - return _weight_constraint.get_space_for(item) - Configuration.S: - return _stacks_constraint.get_space_for(item) - Configuration.G: - return _grid_constraint.get_space_for(item) - Configuration.WS: - return _ws_get_space_for(item) - Configuration.WG: - return ItemCount.min(_grid_constraint.get_space_for(item), _weight_constraint.get_space_for(item)) - Configuration.SG: - return _sg_get_space_for(item) - Configuration.WSG: - return ItemCount.min(_sg_get_space_for(item), _ws_get_space_for(item)) - return ItemCount.inf() +func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_post_item_swap(item1, item2) -func _ws_get_space_for(item: InventoryItem) -> ItemCount: - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var result := _weight_constraint.get_space_for(item).div(stack_size) - return result +func _get_constraints() -> Array[InventoryConstraint]: + return _constraints -func _sg_get_space_for(item: InventoryItem) -> ItemCount: - var grid_space := _grid_constraint.get_space_for(item) - var max_stack_size := ItemCount.new(_stacks_constraint.get_item_max_stack_size(item)) - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var free_stacks_space := _stacks_constraint.get_free_stack_space_for(item) - return grid_space.mul(max_stack_size).add(free_stacks_space).div(stack_size) +func get_space_for(item: InventoryItem) -> _ItemCount: + var min := _ItemCount.inf() + for constraint in _constraints: + var space_for_item: _ItemCount = _ItemCount.new(constraint.get_space_for(item)) + if space_for_item.lt(min): + min = space_for_item + return min func has_space_for(item: InventoryItem) -> bool: - match get_configuration(): - Configuration.W: - return _weight_constraint.has_space_for(item) - Configuration.S: - return _stacks_constraint.has_space_for(item) - Configuration.G: - return _grid_constraint.has_space_for(item) - Configuration.WS: - return _weight_constraint.has_space_for(item) - Configuration.WG: - return _weight_constraint.has_space_for(item) && _grid_constraint.has_space_for(item) - Configuration.SG: - return _sg_has_space_for(item) - Configuration.WSG: - return _sg_has_space_for(item) && _weight_constraint.has_space_for(item) - + for constraint in _constraints: + if !constraint.has_space_for(item): + return false return true -func _sg_has_space_for(item: InventoryItem) -> bool: - if _grid_constraint.has_space_for(item): - return true - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var free_stacks_space := _stacks_constraint.get_free_stack_space_for(item) - return free_stacks_space.ge(stack_size) - - -func enable_weight_constraint(capacity: float = 0.0) -> void: - assert(_weight_constraint == null, "Weight constraint is already enabled") - _weight_constraint = WeightConstraint.new(inventory) - _weight_constraint.capacity = capacity - - -func enable_stacks_constraint() -> void: - assert(_stacks_constraint == null, "Stacks constraint is already enabled") - _stacks_constraint = StacksConstraint.new(inventory) - - -func enable_grid_constraint(size: Vector2i = GridConstraint.DEFAULT_SIZE) -> void: - assert(_grid_constraint == null, "Grid constraint is already enabled") - _grid_constraint = GridConstraint.new(inventory) - _grid_constraint.size = size - - -func get_weight_constraint() -> WeightConstraint: - return _weight_constraint - - -func get_stacks_constraint() -> StacksConstraint: - return _stacks_constraint - - -func get_grid_constraint() -> GridConstraint: - return _grid_constraint +func get_constraint(script: Script) -> InventoryConstraint: + for constraint in _constraints: + if constraint.get_script() == script: + return constraint + return null func reset() -> void: - if get_weight_constraint(): - get_weight_constraint().reset() - if get_stacks_constraint(): - get_stacks_constraint().reset() - if get_grid_constraint(): - get_grid_constraint().reset() + while !_constraints.is_empty(): + var constraint := _constraints.pop_back() + inventory.remove_child(constraint) + constraint.free() func serialize() -> Dictionary: var result := {} - if get_weight_constraint(): - result[KEY_WEIGHT_CONSTRAINT] = get_weight_constraint().serialize() - if get_stacks_constraint(): - result[KEY_STACKS_CONSTRAINT] = get_stacks_constraint().serialize() - if get_grid_constraint(): - result[KEY_GRID_CONSTRAINT] = get_grid_constraint().serialize() + for constraint in _constraints: + result[constraint.get_script().resource_path] = { + _KEY_CONSTRAINT_NAME: constraint.name, + _KEY_CONSTRAINT_DATA: constraint.serialize() + } return result func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_WEIGHT_CONSTRAINT, TYPE_DICTIONARY): - return false - if !Verify.dict(source, false, KEY_STACKS_CONSTRAINT, TYPE_DICTIONARY): - return false - if !Verify.dict(source, false, KEY_GRID_CONSTRAINT, TYPE_DICTIONARY): - return false + for constraint_script_path in source: + if !_Verify.dict(source[constraint_script_path], true, _KEY_CONSTRAINT_NAME, [TYPE_STRING, TYPE_STRING_NAME]): + return false + if !_Verify.dict(source[constraint_script_path], true, _KEY_CONSTRAINT_DATA, TYPE_DICTIONARY): + return false reset() - if source.has(KEY_WEIGHT_CONSTRAINT): - if !get_weight_constraint().deserialize(source[KEY_WEIGHT_CONSTRAINT]): - return false - if source.has(KEY_STACKS_CONSTRAINT): - if !get_stacks_constraint().deserialize(source[KEY_STACKS_CONSTRAINT]): - return false - if source.has(KEY_GRID_CONSTRAINT): - if !get_grid_constraint().deserialize(source[KEY_GRID_CONSTRAINT]): - return false + for constraint_script_path in source: + var constraint_script = load(constraint_script_path) + var new_constraint: InventoryConstraint = constraint_script.new() + new_constraint.name = source[constraint_script_path].name + new_constraint.deserialize(source[constraint_script_path].data) + inventory.add_child(new_constraint) + if Engine.is_editor_hint(): + new_constraint.owner = inventory.get_tree().edited_scene_root return true diff --git a/addons/gloot/core/constraints/constraint_manager.gd.uid b/addons/gloot/core/constraints/constraint_manager.gd.uid new file mode 100644 index 0000000..bc440d5 --- /dev/null +++ b/addons/gloot/core/constraints/constraint_manager.gd.uid @@ -0,0 +1 @@ +uid://bcmjj8jnlmkvt diff --git a/addons/gloot/core/constraints/grid_constraint.gd b/addons/gloot/core/constraints/grid_constraint.gd index 9a57c8f..2118354 100644 --- a/addons/gloot/core/constraints/grid_constraint.gd +++ b/addons/gloot/core/constraints/grid_constraint.gd @@ -1,28 +1,34 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" - -signal size_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const QuadTree = preload("res://addons/gloot/core/constraints/quadtree.gd") -const Utils = preload("res://addons/gloot/core/utils.gd") - -# TODO: Replace KEY_WIDTH and KEY_HEIGHT with KEY_SIZE -const KEY_WIDTH: String = "width" -const KEY_HEIGHT: String = "height" -const KEY_SIZE: String = "size" -const KEY_ROTATED: String = "rotated" -const KEY_POSITIVE_ROTATION: String = "positive_rotation" -const KEY_GRID_POSITION: String = "grid_position" +@tool +@icon("res://addons/gloot/images/icon_grid_constraint.svg") +extends InventoryConstraint +class_name GridConstraint +## A constraint that limits the inventory to a 2d grid of a given size. +## +## The constraint implements a grid-based inventory of a configurable size. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _QuadTree = preload("res://addons/gloot/core/constraints/quadtree.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") + +## Default size of the 2d grid. const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) -var _swap_position := Vector2i.ZERO -var _quad_tree := QuadTree.new(size) +const _KEY_SIZE: String = "size" +const _KEY_ROTATED: String = "rotated" +const _KEY_POSITIVE_ROTATION: String = "positive_rotation" +const _KEY_ITEM_POSITIONS: String = "item_positions" +const _KEY_INSERTION_PRIORITY: String = "insertion_priority" -@export var size: Vector2i = DEFAULT_SIZE : +enum {INSERTION_PRIORITY_HORIZONTAL = 0, INSERTION_PRIORITY_VERTICAL = 1} + +var _swap_positions: Array[Vector2i] +var _item_positions := {} +var _quad_tree := _QuadTree.new(size) +var _inventory_set_stack: Array[Callable] + +## The size of the 2d grid. +@export var size: Vector2i = DEFAULT_SIZE: set(new_size): - assert(inventory, "Inventory not set!") assert(new_size.x > 0, "Inventory width must be positive!") assert(new_size.y > 0, "Inventory height must be positive!") var old_size = size @@ -32,82 +38,89 @@ var _quad_tree := QuadTree.new(size) size = old_size if size != old_size: _refresh_quad_tree() - size_changed.emit() + changed.emit() +## Insertion priority. Defines whether items will be stacked horizontally-first or vertically-first when inserted into +## the 2d grid. +@export_enum("Horizontal", "Vertical") var insertion_priority: int = INSERTION_PRIORITY_VERTICAL: + set(new_insertion_priority): + if new_insertion_priority == insertion_priority: + return + insertion_priority = new_insertion_priority + changed.emit() + + +func _push_inventory_set_operation(c: Callable) -> void: + _inventory_set_stack.push_back(c) func _refresh_quad_tree() -> void: - _quad_tree = QuadTree.new(size) + _quad_tree = _QuadTree.new(size) + if !is_instance_valid(inventory): + return for item in inventory.get_items(): _quad_tree.add(get_item_rect(item), item) func _on_inventory_set() -> void: + _item_positions.clear() + while !_inventory_set_stack.is_empty(): + _inventory_set_stack.pop_back().call() _refresh_quad_tree() func _on_item_added(item: InventoryItem) -> void: if item == null: return - _quad_tree.add(get_item_rect(item), item) + if move_item_to_free_spot(item): + _quad_tree.add(get_item_rect(item), item) + else: + inventory.pack_item(item) func _on_item_removed(item: InventoryItem) -> void: _quad_tree.remove(item) + _item_positions.erase(item) -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - KEY_SIZE, - KEY_ROTATED, - KEY_WIDTH, - KEY_HEIGHT, - KEY_GRID_POSITION, - ] - if property_name in relevant_properties: - _quad_tree.remove(item) - _quad_tree.add(get_item_rect(item), item) +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == _KEY_SIZE: + _refresh_quad_tree() func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: - if !_size_check(item1, item2): - return false - - if inventory.has_item(item1): - _swap_position = get_item_position(item1) - elif inventory.has_item(item2): - _swap_position = get_item_position(item2) - return true - - -func _size_check(item1: InventoryItem, item2: InventoryItem) -> bool: var inv1 = item1.get_inventory() - var grid_constraint1: GridConstraint = null - if is_instance_valid(inv1): - grid_constraint1 = inv1._constraint_manager.get_grid_constraint() var inv2 = item2.get_inventory() + var grid_constraint1: GridConstraint = null var grid_constraint2: GridConstraint = null + var pos1 = Vector2i.ZERO + var pos2 = Vector2i.ZERO + if is_instance_valid(inv1): + grid_constraint1 = inv1.get_constraint(GridConstraint) + if is_instance_valid(grid_constraint1): + pos1 = grid_constraint1.get_item_position(item1) if is_instance_valid(inv2): - grid_constraint2 = inv2._constraint_manager.get_grid_constraint() - + grid_constraint2 = inv2.get_constraint(GridConstraint) + if is_instance_valid(grid_constraint2): + pos2 = grid_constraint2.get_item_position(item2) + + _swap_positions = [pos1, pos2] if is_instance_valid(grid_constraint1) || is_instance_valid(grid_constraint2): return get_item_size(item1) == get_item_size(item2) return true func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: - var has1 := inventory.has_item(item1) - var has2 := inventory.has_item(item2) - if has1 && has2: - var temp_pos = get_item_position(item1) - _move_item_to_unsafe(item1, get_item_position(item2)) - _move_item_to_unsafe(item2, temp_pos) - elif has1: - move_item_to(item1, _swap_position) - elif has2: - move_item_to(item2, _swap_position) + const ITEM1_IDX = 0 + const ITEM2_IDX = 1 + if is_instance_valid(item1.get_inventory()) && is_instance_valid(item1.get_inventory().get_constraint(GridConstraint)): + item1.get_inventory().get_constraint(GridConstraint).set_item_position_unsafe(item1, _swap_positions[ITEM2_IDX]) + if is_instance_valid(item2.get_inventory()) && is_instance_valid(item2.get_inventory().get_constraint(GridConstraint)): + item2.get_inventory().get_constraint(GridConstraint).set_item_position_unsafe(item2, _swap_positions[ITEM1_IDX]) func _bounds_broken() -> bool: + if !is_instance_valid(inventory): + return false for item in inventory.get_items(): if !rect_free(get_item_rect(item), item): return true @@ -115,40 +128,56 @@ func _bounds_broken() -> bool: return false +## Returns the position of the given item on the 2d grid. func get_item_position(item: InventoryItem) -> Vector2i: - return item.get_property(KEY_GRID_POSITION, Vector2i.ZERO) + if !_item_positions.has(item): + return Vector2i.ZERO + return _item_positions[item] -# TODO: Consider making a static "unsafe" version of this +## Sets the position of the given item on the 2d grid. func set_item_position(item: InventoryItem, new_position: Vector2i) -> bool: var new_rect := Rect2i(new_position, get_item_size(item)) if inventory.has_item(item) and !rect_free(new_rect, item): return false - item.set_property(KEY_GRID_POSITION, new_position) + set_item_position_unsafe(item, new_position) return true +## Sets the position of the given item on the 2d grid without any validity checks (somewhat faster than +## set_item_position). +func set_item_position_unsafe(item: InventoryItem, new_position: Vector2i) -> void: + if new_position == get_item_position(item): + return + + _item_positions[item] = new_position + _refresh_quad_tree() + changed.emit() + + +## Returns the size of the given item (i.e. the `size` property). func get_item_size(item: InventoryItem) -> Vector2i: - var result: Vector2i + var result: Vector2i = item.get_property(_KEY_SIZE, Vector2i.ONE) if is_item_rotated(item): - result.x = item.get_property(KEY_HEIGHT, 1) - result.y = item.get_property(KEY_WIDTH, 1) - else: - result.x = item.get_property(KEY_WIDTH, 1) - result.y = item.get_property(KEY_HEIGHT, 1) + var temp := result.x + result.x = result.y + result.y = temp return result +## Checks wether the given item is rotated (i.e. whether the `rotated` property is set). static func is_item_rotated(item: InventoryItem) -> bool: - return item.get_property(KEY_ROTATED, false) + return item.get_property(_KEY_ROTATED, false) +## Checks wether the given item has positive rotation. static func is_item_rotation_positive(item: InventoryItem) -> bool: - return item.get_property(KEY_POSITIVE_ROTATION, false) + return item.get_property(_KEY_POSITIVE_ROTATION, false) # TODO: Consider making a static "unsafe" version of this +## Sets the size of the given item (i.e. the `size` property). func set_item_size(item: InventoryItem, new_size: Vector2i) -> bool: if new_size.x < 1 || new_size.y < 1: return false @@ -157,11 +186,11 @@ func set_item_size(item: InventoryItem, new_size: Vector2i) -> bool: if inventory.has_item(item) and !rect_free(new_rect, item): return false - item.set_property(KEY_WIDTH, new_size.x) - item.set_property(KEY_HEIGHT, new_size.y) + item.set_property(_KEY_SIZE, new_size) return true +## Sets the rotation of the given item (i.e. the `rotated` property). func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: if is_item_rotated(item) == rotated: return false @@ -169,24 +198,27 @@ func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: return false if rotated: - item.set_property(KEY_ROTATED, true) + item.set_property(_KEY_ROTATED, true) else: - item.clear_property(KEY_ROTATED) + item.clear_property(_KEY_ROTATED) return true +## Rotates the given item (i.e. toggles the `rotated` property). func rotate_item(item: InventoryItem) -> bool: return set_item_rotation(item, !is_item_rotated(item)) +## Sets the rotation direction of the given item (positive or negative, i.e. sets the `positive_rotation` property). static func set_item_rotation_direction(item: InventoryItem, positive: bool) -> void: if positive: - item.set_property(KEY_POSITIVE_ROTATION, true) + item.set_property(_KEY_POSITIVE_ROTATION, true) else: - item.clear_property(KEY_POSITIVE_ROTATION) + item.clear_property(_KEY_POSITIVE_ROTATION) +## Checks if the given item can be rotated. func can_rotate_item(item: InventoryItem) -> bool: var rotated_rect := get_item_rect(item) var temp := rotated_rect.size.x @@ -195,12 +227,15 @@ func can_rotate_item(item: InventoryItem) -> bool: return rect_free(rotated_rect, item) +## Returns a rectangle constructed from the position and size of the given item. func get_item_rect(item: InventoryItem) -> Rect2i: var item_pos := get_item_position(item) var item_size := get_item_size(item) return Rect2i(item_pos, item_size) +## Sets the position and size of the given item based on the given rectangle. Returns `false` if the new position and +## size cannot be applied to the item. func set_item_rect(item: InventoryItem, new_rect: Rect2i) -> bool: if !rect_free(new_rect, item): return false @@ -213,27 +248,12 @@ func set_item_rect(item: InventoryItem, new_rect: Rect2i) -> bool: func _get_prototype_size(prototype_id: String) -> Vector2i: assert(inventory != null, "Inventory not set!") - assert(inventory.item_protoset != null, "Inventory protoset is null!") - var width: int = inventory.item_protoset.get_prototype_property(prototype_id, KEY_WIDTH, 1) - var height: int = inventory.item_protoset.get_prototype_property(prototype_id, KEY_HEIGHT, 1) - return Vector2i(width, height) - - -func _is_sorted() -> bool: - assert(inventory != null, "Inventory not set!") - for item1 in inventory.get_items(): - for item2 in inventory.get_items(): - if item1 == item2: - continue - - var rect1: Rect2i = get_item_rect(item1) - var rect2: Rect2i = get_item_rect(item2) - if rect1.intersects(rect2): - return false; - - return true + assert(inventory.protoset != null, "Inventory protoset is null!") + var size: Vector2i = inventory.get_prototree().get_prototype_property(prototype_id, _KEY_SIZE, Vector2i.ONE) + return size +## Adds the given item to the inventory and sets its position. func add_item_at(item: InventoryItem, position: Vector2i) -> bool: assert(inventory != null, "Inventory not set!") @@ -242,12 +262,14 @@ func add_item_at(item: InventoryItem, position: Vector2i) -> bool: if rect_free(rect): if not inventory.add_item(item): return false - assert(move_item_to(item, position), "Can't move the item to the given place!") + var success = move_item_to(item, position) + assert(success, "Can't move the item to the given place!") return true return false +## Creates and adds the given item to the inventory and sets its position. func create_and_add_item_at(prototype_id: String, position: Vector2i) -> InventoryItem: assert(inventory != null, "Inventory not set!") var item_rect := Rect2i(position, _get_prototype_size(prototype_id)) @@ -265,6 +287,7 @@ func create_and_add_item_at(prototype_id: String, position: Vector2i) -> Invento return item +## Returns the item at the given grid position. Returns `null` if no item can be found at that position. func get_item_at(position: Vector2i) -> InventoryItem: assert(inventory != null, "Inventory not set!") var first = _quad_tree.get_first(position) @@ -273,6 +296,7 @@ func get_item_at(position: Vector2i) -> InventoryItem: return first.metadata +## Returns an array of items under the given rectangle. func get_items_under(rect: Rect2i) -> Array[InventoryItem]: assert(inventory != null, "Inventory not set!") var result: Array[InventoryItem] @@ -283,18 +307,20 @@ func get_items_under(rect: Rect2i) -> Array[InventoryItem]: return result +## Moves the given item to a new position. Returns `false` if the item cannot be moved. func move_item_to(item: InventoryItem, position: Vector2i) -> bool: assert(inventory != null, "Inventory not set!") var item_size := get_item_size(item) var rect := Rect2i(position, item_size) if rect_free(rect, item): - _move_item_to_unsafe(item, position) - inventory.contents_changed.emit() + set_item_position_unsafe(item, position) + changed.emit() return true return false +## Moves the given item to a free spot. Returns `false` if no free spot can be found. func move_item_to_free_spot(item: InventoryItem) -> bool: if rect_free(get_item_rect(item), item): return true @@ -303,28 +329,7 @@ func move_item_to_free_spot(item: InventoryItem) -> bool: if not free_place.success: return false - _move_item_to_unsafe(item, free_place.position) - return true - - -func _move_item_to_unsafe(item: InventoryItem, position: Vector2i) -> void: - item.set_property(KEY_GRID_POSITION, position) - if item.get_property(KEY_GRID_POSITION) == Vector2i.ZERO: - item.clear_property(KEY_GRID_POSITION) - - -func transfer_to(item: InventoryItem, destination: GridConstraint, position: Vector2i) -> bool: - assert(inventory != null, "Inventory not set!") - assert(destination.inventory != null, "Destination inventory not set!") - var item_size = get_item_size(item) - var rect := Rect2i(position, item_size) - if destination.rect_free(rect) && destination.add_item_at(item, position): - return true - - if _merge_to(item, destination, position): - return true - - return InventoryItem.swap(item, destination.get_item_at(position)) + return move_item_to(item, free_place.position) func _merge_to(item: InventoryItem, destination: GridConstraint, position: Vector2i) -> bool: @@ -332,17 +337,14 @@ func _merge_to(item: InventoryItem, destination: GridConstraint, position: Vecto if item_dst == null: return false - return inventory._constraint_manager.get_stacks_constraint().join_stacks(item_dst, item) - + return item.merge_into(item_dst) + func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: - if inventory._constraint_manager.get_stacks_constraint() == null: - return null - var rect := Rect2i(position, get_item_size(item)) var mergable_items := _get_mergable_items_under(item, rect) for mergable_item in mergable_items: - if inventory._constraint_manager.get_stacks_constraint().stacks_joinable(item, mergable_item): + if item.can_merge_into(mergable_item): return mergable_item return null @@ -353,12 +355,14 @@ func _get_mergable_items_under(item: InventoryItem, rect: Rect2i) -> Array[Inven for item_dst in get_items_under(rect): if item_dst == item: continue - if StacksConstraint.items_mergable(item_dst, item): + if item.can_merge_into(item_dst): result.append(item_dst) return result +## Checks if the given rectangle is free (i.e. no items can be found under it). The `exception` item will be disregarded +## during the check, if set. func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: assert(inventory != null, "Inventory not set!") @@ -373,16 +377,31 @@ func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: # TODO: Check if this is needed after adding find_free_space +## Finds a place for the given item. The `exception` item will be disregarded during the search, if set. Returns a +## dictionary containing two fields: `success` and `position`. `success` will be set to `false` if not free place can be +## found and to `true` otherwise. If `success` is true the `position` field contains the resulting coordinates. func find_free_place(item: InventoryItem, exception: InventoryItem = null) -> Dictionary: var result := {success = false, position = Vector2i(-1, -1)} var item_size = get_item_size(item) - for x in range(size.x - (item_size.x - 1)): + + var check_position := func(pos: Vector2i) -> bool: + var rect := Rect2i(pos, item_size) + if rect_free(rect, exception): + result.success = true + result.position = pos + return true + return false + + if insertion_priority == INSERTION_PRIORITY_VERTICAL: + for x in range(size.x - (item_size.x - 1)): + for y in range(size.y - (item_size.y - 1)): + if check_position.call(Vector2i(x, y)): + return result + else: for y in range(size.y - (item_size.y - 1)): - var rect := Rect2i(Vector2i(x, y), item_size) - if rect_free(rect, exception): - result.success = true - result.position = Vector2i(x, y) - return result + for x in range(size.x - (item_size.x - 1)): + if check_position.call(Vector2i(x, y)): + return result return result @@ -393,6 +412,7 @@ func _compare_items(item1: InventoryItem, item2: InventoryItem) -> bool: return rect1.get_area() > rect2.get_area() +## Sorts the inventory based on item size. func sort() -> bool: assert(inventory != null, "Inventory not set!") @@ -402,7 +422,7 @@ func sort() -> bool: item_array.sort_custom(_compare_items) for item in item_array: - _move_item_to_unsafe(item, -get_item_size(item)) + set_item_position_unsafe(item, -get_item_size(item)) for item in item_array: var free_place := find_free_place(item) @@ -413,28 +433,46 @@ func sort() -> bool: return true -func _sort_if_needed() -> void: - if !_is_sorted() || _bounds_broken(): - sort() +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + var result = _get_free_space_for(item) * item.get_max_stack_size() + for i in inventory.get_items(): + if item.can_merge_into(i, true): + result += i.get_free_stack_space() + + return result -func get_space_for(item: InventoryItem) -> ItemCount: - var occupied_rects: Array[Rect2i] - var item_size = get_item_size(item) +func _get_free_space_for(item: InventoryItem) -> int: + var item_size = get_item_size(item) + var occupied_rects: Array[Rect2i] var free_space := find_free_space(item_size, occupied_rects) + while free_space.success: occupied_rects.append(Rect2i(free_space.position, item_size)) free_space = find_free_space(item_size, occupied_rects) - return ItemCount.new(occupied_rects.size()) - + return occupied_rects.size() + +## Checks if the constraint can receive the given item. func has_space_for(item: InventoryItem) -> bool: - var item_size = get_item_size(item) - return find_free_space(item_size).success + var item_size = get_item_size(item) + + if find_free_space(item_size).success: + return true + + var total_free_stack_space = 0 + for i in inventory.get_items(): + if item.compatible_with(i): + total_free_stack_space += i.get_free_stack_space() + return total_free_stack_space >= item.get_stack_size() # TODO: Check if find_free_place is needed +## Finds a place for the given item with regard to the given occupied rectangles. Returns a dictionary containing two +## fields: `success` and `position`. `success` will be set to `false` if not free place can be found and to `true` +## otherwise. If `success` is true the `position` field contains the resulting coordinates. func find_free_space(item_size: Vector2i, occupied_rects: Array[Rect2i] = []) -> Dictionary: var result := {success = false, position = Vector2i(-1, -1)} for x in range(size.x - (item_size.x - 1)): @@ -455,27 +493,61 @@ static func _rect_intersects_rect_array(rect: Rect2i, occupied_rects: Array[Rect return false +## Resets the constraint, i.e. sets its size to default (`Vector2i(10, 10)`). func reset() -> void: size = DEFAULT_SIZE + _quad_tree = _QuadTree.new(size) + _item_positions.clear() + insertion_priority = INSERTION_PRIORITY_VERTICAL +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: var result := {} # Store Vector2i as string to make JSON conversion easier later - result[KEY_SIZE] = var_to_str(size) + result[_KEY_SIZE] = var_to_str(size) + result[_KEY_ITEM_POSITIONS] = _serialize_item_positions() + if insertion_priority == INSERTION_PRIORITY_HORIZONTAL: + result[_KEY_INSERTION_PRIORITY] = int(insertion_priority) + + return result + +func _serialize_item_positions() -> Dictionary: + var result = {} + for item in _item_positions.keys(): + var str_item_index := var_to_str(inventory.get_item_index(item)) + var str_item_position = var_to_str(_item_positions[item]) + result[str_item_index] = str_item_position return result +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_SIZE, TYPE_STRING): + if !_Verify.dict(source, true, _KEY_SIZE, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_INSERTION_PRIORITY, [TYPE_INT, TYPE_FLOAT]): return false reset() - var s: Vector2i = Utils.str_to_var(source[KEY_SIZE]) - self.size = s + # Queue this part of the deserialization for later if the inventory is still not set + if is_instance_valid(inventory): + _deserialize_item_positions(source[_KEY_ITEM_POSITIONS]) + else: + _push_inventory_set_operation(_deserialize_item_positions.bind(source[_KEY_ITEM_POSITIONS].duplicate())) + + size = _Utils.str_to_var(source[_KEY_SIZE]) + if source.has(_KEY_INSERTION_PRIORITY): + insertion_priority = int(source[_KEY_INSERTION_PRIORITY]) return true + +func _deserialize_item_positions(source: Dictionary) -> bool: + for str_item_index in source.keys(): + var item_index: int = _Utils.str_to_var(str_item_index) + var item := inventory.get_items()[item_index] + var item_position = _Utils.str_to_var(source[str_item_index]) + set_item_position_unsafe(item, item_position) + return true diff --git a/addons/gloot/core/constraints/grid_constraint.gd.uid b/addons/gloot/core/constraints/grid_constraint.gd.uid new file mode 100644 index 0000000..13e9fe0 --- /dev/null +++ b/addons/gloot/core/constraints/grid_constraint.gd.uid @@ -0,0 +1 @@ +uid://rk48gcn3clet diff --git a/addons/gloot/core/constraints/inventory_constraint.gd b/addons/gloot/core/constraints/inventory_constraint.gd index 77f2dfc..f006ac0 100644 --- a/addons/gloot/core/constraints/inventory_constraint.gd +++ b/addons/gloot/core/constraints/inventory_constraint.gd @@ -1,67 +1,99 @@ -extends Object - -var inventory: Inventory = null : +@tool +extends Node +class_name InventoryConstraint +## Base inventory constraint class. +## +## Base inventory constraint class which implements some basic constraint functionality and defines methods that can be +## overridden. + +## Emitted when the state of the constraint has changed. +signal changed + +## Reference to an inventory that this constraint belongs to. +var inventory: Inventory = null: set(new_inventory): - assert(new_inventory != null, "Can't set inventory to null!") - assert(inventory == null, "Inventory already set!") inventory = new_inventory - _on_inventory_set() + if is_instance_valid(inventory): + _on_inventory_set() -func _init(inventory_: Inventory) -> void: - inventory = inventory_ +func _notification(what: int) -> void: + if what == NOTIFICATION_PARENTED: + _on_parented(get_parent()) + elif what == NOTIFICATION_UNPARENTED: + _on_unparented() -# Override this -func get_space_for(item: InventoryItem) -> ItemCount: - return ItemCount.zero() +func _on_parented(parent: Node) -> void: + if parent is Inventory: + inventory = parent + inventory._on_constraint_added(self) + else: + inventory = null + update_configuration_warnings() -# Override this -func has_space_for(item:InventoryItem) -> bool: - return false +func _on_unparented() -> void: + if inventory == null: + return + inventory._on_constraint_removed(self) + inventory = null + update_configuration_warnings() -# Override this -func reset() -> void: - pass +func _get_configuration_warnings() -> PackedStringArray: + if inventory == null: + return PackedStringArray([ + "InventoryConstraint nodes only serve to provide constraints to Inventory nodes. Please only use them as " \ + + "children of Inventory nodes."]) + return PackedStringArray() + + +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + return 0 + + +## Checks if the constraint can receive the given item. +func has_space_for(item: InventoryItem) -> bool: + return false -# Override this +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: return {} -# Override this +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: return true -# Override this +## Called when constraint inventory is set/changed. func _on_inventory_set() -> void: pass -# Override this +## Called when an item is added to the inventory. func _on_item_added(item: InventoryItem) -> void: pass -# Override this +## Called when an item is removed from the inventory. func _on_item_removed(item: InventoryItem) -> void: pass -# Override this -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: +## Called when an item property has changed. +func _on_item_property_changed(item: InventoryItem, property: String) -> void: pass -# Override this +## Called before the two given items are swapped. func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: return true -# Override this +## Called after the two given items have been swapped. func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: pass diff --git a/addons/gloot/core/constraints/inventory_constraint.gd.uid b/addons/gloot/core/constraints/inventory_constraint.gd.uid new file mode 100644 index 0000000..52c7f95 --- /dev/null +++ b/addons/gloot/core/constraints/inventory_constraint.gd.uid @@ -0,0 +1 @@ +uid://ywmav23pfy8k diff --git a/addons/gloot/core/constraints/item_count_constraint.gd b/addons/gloot/core/constraints/item_count_constraint.gd new file mode 100644 index 0000000..d4f5f72 --- /dev/null +++ b/addons/gloot/core/constraints/item_count_constraint.gd @@ -0,0 +1,78 @@ +@tool +@icon("res://addons/gloot/images/icon_item_count_constraint.svg") +extends InventoryConstraint +class_name ItemCountConstraint +## A constraint that limits the inventory to a given item stack count. +## +## The constraint implements a count-based inventory where the total number of item stacks cannot exceed the configured +## capacity of the inventory. + +const _Verify = preload("res://addons/gloot/core/verify.gd") + +## Default capacity. +const DEFAULT_CAPACITY = 1 + +const _KEY_CAPACITY: String = "capacity" + +## Maximum number of item stacks the inventory can hold. +@export var capacity: int = DEFAULT_CAPACITY: + set(new_capacity): + if new_capacity < 1: + new_capacity = 1 + if new_capacity == capacity: + return + if new_capacity > 0.0 && get_occupied_space() > new_capacity: + return + capacity = new_capacity + changed.emit() + + +## Returns the number of item stacks that can be added to the inventory. +func get_free_space() -> int: + return max(0, capacity - get_occupied_space()) + + +## Returns the total number of item stacks in the inventory. +func get_occupied_space() -> int: + if !is_instance_valid(inventory): + return 0 + return inventory.get_item_count() + + +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + var free_stack_space := 0 + for i in inventory.get_items(): + if item.can_merge_into(i): + free_stack_space += i.get_free_stack_space() + + var free_space = get_free_space() * item.get_max_stack_size() + return free_stack_space + free_space + + +## Checks if the constraint can receive the given item. +func has_space_for(item: InventoryItem) -> bool: + return get_occupied_space() < capacity || get_space_for(item) > 0 + + +## Resets the constraint, i.e. sets its capacity to default (`1`). +func reset() -> void: + capacity = DEFAULT_CAPACITY + + +## Serializes the constraint into a `Dictionary`. +func serialize() -> Dictionary: + var result := {} + result[_KEY_CAPACITY] = capacity + return result + + +## Loads the constraint data from the given `Dictionary`. +func deserialize(source: Dictionary) -> bool: + if !_Verify.dict(source, true, _KEY_CAPACITY, [TYPE_INT, TYPE_FLOAT]): + return false + + reset() + capacity = source[_KEY_CAPACITY] + + return true diff --git a/addons/gloot/core/constraints/item_count_constraint.gd.uid b/addons/gloot/core/constraints/item_count_constraint.gd.uid new file mode 100644 index 0000000..86a3809 --- /dev/null +++ b/addons/gloot/core/constraints/item_count_constraint.gd.uid @@ -0,0 +1 @@ +uid://catvy2gpuw1gg diff --git a/addons/gloot/core/constraints/item_map.gd b/addons/gloot/core/constraints/item_map.gd deleted file mode 100644 index eee718b..0000000 --- a/addons/gloot/core/constraints/item_map.gd +++ /dev/null @@ -1,85 +0,0 @@ -var map: Array -var _free_fields: int -var free_fields : - get: - return _free_fields - set(new_free_fields): - assert(false, "free_fields is read-only!") - - -func _init(size: Vector2i) -> void: - resize(size) - - -func resize(size: Vector2i) -> void: - map = [] - map.resize(size.x) - for i in map.size(): - map[i] = [] - map[i].resize(size.y) - _free_fields = size.x * size.y - - -func fill_rect(rect: Rect2i, value) -> void: - assert(value != null, "Can't fill with null!") - _fill_rect_unsafe(rect, value) - - -func _fill_rect_unsafe(rect: Rect2i, value) -> void: - for x in range(rect.size.x): - for y in range(rect.size.y): - var map_coords := Vector2i(rect.position.x + x, rect.position.y + y) - if !contains(map_coords): - continue - if map[map_coords.x][map_coords.y] != value: - if value == null: - _free_fields += 1 - else: - _free_fields -= 1 - map[map_coords.x][map_coords.y] = value - - -func clear_rect(rect: Rect2i) -> void: - _fill_rect_unsafe(rect, null) - - -func print() -> void: - if map.is_empty(): - return - var output: String - var size = get_size() - for j in range(size.y): - for i in range(size.x): - if map[i][j]: - output = output + "x" - else: - output = output + "." - output = output + "\n" - print(output + "\n") - - -func clear() -> void: - for column in map: - column.fill(null) - var size = get_size() - _free_fields = size.x * size.y - - -func contains(position: Vector2i) -> bool: - if map.is_empty(): - return false - - var size = get_size() - return (position.x >= 0) && (position.y >= 0) && (position.x < size.x) && (position.y < size.y) - - -func get_field(position: Vector2i): - assert(contains(position), "%s out of bounds!" % position) - return map[position.x][position.y] - - -func get_size() -> Vector2i: - if map.is_empty(): - return Vector2i.ZERO - return Vector2i(map.size(), map[0].size()) - diff --git a/addons/gloot/core/constraints/quadtree.gd b/addons/gloot/core/constraints/quadtree.gd index b610e78..7e11d64 100644 --- a/addons/gloot/core/constraints/quadtree.gd +++ b/addons/gloot/core/constraints/quadtree.gd @@ -1,4 +1,3 @@ - class QtRect: var rect: Rect2i var metadata: Variant diff --git a/addons/gloot/core/constraints/quadtree.gd.uid b/addons/gloot/core/constraints/quadtree.gd.uid new file mode 100644 index 0000000..0d8c5d6 --- /dev/null +++ b/addons/gloot/core/constraints/quadtree.gd.uid @@ -0,0 +1 @@ +uid://c8wauomqxb5j6 diff --git a/addons/gloot/core/constraints/stacks_constraint.gd b/addons/gloot/core/constraints/stacks_constraint.gd deleted file mode 100644 index 705162e..0000000 --- a/addons/gloot/core/constraints/stacks_constraint.gd +++ /dev/null @@ -1,312 +0,0 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" - -const WeightConstraint = preload("res://addons/gloot/core/constraints/weight_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -const KEY_STACK_SIZE: String = "stack_size" -const KEY_MAX_STACK_SIZE: String = "max_stack_size" - -const DEFAULT_STACK_SIZE: int = 1 -# TODO: Consider making the default max stack size 1 -const DEFAULT_MAX_STACK_SIZE: int = 100 - -enum MergeResult {SUCCESS = 0, FAIL, PARTIAL} - - -# TODO: Check which util functions can be made private -# TODO: Consider making these util methods work with ItemCount -static func _get_free_stack_space(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return get_item_max_stack_size(item) - get_item_stack_size(item) - - -static func _has_custom_property(item: InventoryItem, property: String, value) -> bool: - assert(item != null, "item is null!") - return item.properties.has(property) && item.properties[property] == value; - - -static func get_item_stack_size(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return item.get_property(KEY_STACK_SIZE, DEFAULT_STACK_SIZE) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return item.get_property(KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) - - -static func set_item_stack_size(item: InventoryItem, stack_size: int) -> bool: - assert(item != null, "item is null!") - assert(stack_size >= 0, "stack_size can't be negative!") - if stack_size > get_item_max_stack_size(item): - return false - if stack_size == 0: - var inventory: Inventory = item.get_inventory() - if inventory != null: - inventory.remove_item(item) - item.queue_free() - return true - item.set_property(KEY_STACK_SIZE, stack_size) - return true - - -static func set_item_max_stack_size(item: InventoryItem, max_stack_size: int) -> void: - assert(item != null, "item is null!") - assert(max_stack_size > 0, "max_stack_size can't be less than 1!") - item.set_property(KEY_MAX_STACK_SIZE, max_stack_size) - - -static func get_prototype_stack_size(protoset: ItemProtoset, prototype_id: String) -> int: - assert(protoset != null, "protoset is null!") - return protoset.get_prototype_property(prototype_id, KEY_STACK_SIZE, 1.0) - - -static func get_prototype_max_stack_size(protoset: ItemProtoset, prototype_id: String) -> int: - assert(protoset != null, "protoset is null!") - return protoset.get_prototype_property(prototype_id, KEY_MAX_STACK_SIZE, 1.0) - - -func get_mergable_items(item: InventoryItem) -> Array[InventoryItem]: - assert(inventory != null, "Inventory not set!") - assert(item != null, "item is null!") - - var result: Array[InventoryItem] = [] - - for i in inventory.get_items(): - if i == item: - continue - if !items_mergable(i, item): - continue - - result.append(i) - - return result - - -static func items_mergable(item_1: InventoryItem, item_2: InventoryItem) -> bool: - # Two item stacks are mergable if they have the same prototype ID and neither of the two contain - # custom properties that the other one doesn't have (except for "stack_size", "max_stack_size", - # "grid_position", or "weight"). - assert(item_1 != null, "item_1 is null!") - assert(item_2 != null, "item_2 is null!") - - var ignore_properies: Array[String] = [ - KEY_STACK_SIZE, - KEY_MAX_STACK_SIZE, - GridConstraint.KEY_GRID_POSITION, - WeightConstraint.KEY_WEIGHT - ] - - if item_1.prototype_id != item_2.prototype_id: - return false - - for property in item_1.properties.keys(): - if property in ignore_properies: - continue - if !_has_custom_property(item_2, property, item_1.properties[property]): - return false - - for property in item_2.properties.keys(): - if property in ignore_properies: - continue - if !_has_custom_property(item_1, property, item_2.properties[property]): - return false - - return true - - -func add_item_automerge( - item: InventoryItem, - ignore_properies: Array[String] = [] -) -> bool: - assert(item != null, "Item is null!") - assert(inventory != null, "Inventory not set!") - if !inventory._constraint_manager.has_space_for(item): - return false - - var target_items = get_mergable_items(item) - for target_item in target_items: - if _merge_stacks(target_item, item) == MergeResult.SUCCESS: - return true - - assert(inventory.add_item(item)) - return true - - -static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> int: - assert(item_dst != null, "item_dst is null!") - assert(item_src != null, "item_src is null!") - assert(items_mergable(item_dst, item_src), "Items must be mergable!") - - var src_size: int = get_item_stack_size(item_src) - assert(src_size > 0, "Item stack size must be greater than 0!") - - var dst_size: int = get_item_stack_size(item_dst) - var dst_max_size: int = get_item_max_stack_size(item_dst) - var free_dst_stack_space: int = dst_max_size - dst_size - if free_dst_stack_space <= 0: - return MergeResult.FAIL - - assert(set_item_stack_size(item_src, max(src_size - free_dst_stack_space, 0))) - assert(set_item_stack_size(item_dst, min(dst_size + src_size, dst_max_size))) - - if free_dst_stack_space >= src_size: - return MergeResult.SUCCESS - - return MergeResult.PARTIAL - - -static func split_stack(item: InventoryItem, new_stack_size: int) -> InventoryItem: - assert(item != null, "item is null!") - assert(new_stack_size >= 1, "New stack size must be greater or equal to 1!") - - var stack_size = get_item_stack_size(item) - assert(stack_size > 1, "Size of the item stack must be greater than 1!") - assert( - new_stack_size < stack_size, - "New stack size must be smaller than the original stack size!" - ) - - var new_item = item.duplicate() - if new_item.get_parent(): - new_item.get_parent().remove_child(new_item) - - assert(set_item_stack_size(new_item, new_stack_size)) - assert(set_item_stack_size(item, stack_size - new_stack_size)) - return new_item - - -# TODO: Rename this -func split_stack_safe(item: InventoryItem, new_stack_size: int) -> InventoryItem: - assert(inventory != null, "inventory is null!") - assert(inventory.has_item(item), "The inventory does not contain the given item!") - - var new_item = split_stack(item, new_stack_size) - if new_item: - assert(inventory.add_item(new_item)) - return new_item - - -static func join_stacks( - item_dst: InventoryItem, - item_src: InventoryItem -) -> bool: - if item_dst == null || item_src == null: - return false - - if (!stacks_joinable(item_dst, item_src)): - return false - - # TODO: Check if this can be an assertion - _merge_stacks(item_dst, item_src) - return true - - -static func stacks_joinable( - item_dst: InventoryItem, - item_src: InventoryItem -) -> bool: - assert(item_dst != null, "item_dst is null!") - assert(item_src != null, "item_src is null!") - - if not items_mergable(item_dst, item_src): - return false - - var dst_free_space = _get_free_stack_space(item_dst) - if dst_free_space < get_item_stack_size(item_src): - return false - - return true - - -func get_space_for(item: InventoryItem) -> ItemCount: - return ItemCount.inf() - - -func has_space_for(item: InventoryItem) -> bool: - return true - - -func get_free_stack_space_for(item: InventoryItem) -> ItemCount: - assert(inventory != null, "Inventory not set!") - - var item_count = ItemCount.zero() - var mergable_items = get_mergable_items(item) - for mergable_item in mergable_items: - var free_stack_space := _get_free_stack_space(mergable_item) - item_count.add(ItemCount.new(free_stack_space)) - return item_count - - -static func pack_item(item: InventoryItem) -> void: - if !is_instance_valid(item.get_inventory()): - return - - var sc := item.get_inventory()._constraint_manager.get_stacks_constraint() - if sc == null: - return - - var mergable_items = sc.get_mergable_items(item) - for mergable_item in mergable_items: - var merge_result := _merge_stacks(mergable_item, item) - if merge_result == MergeResult.SUCCESS: - return - - -func transfer_autosplit(item: InventoryItem, destination: Inventory) -> InventoryItem: - assert(inventory._constraint_manager.get_configuration() == destination._constraint_manager.get_configuration()) - if inventory.transfer(item, destination): - return item - - var stack_size := get_item_stack_size(item) - if stack_size <= 1: - return null - - var item_count := _get_space_for_single_item(destination, item) - assert(!item_count.eq(ItemCount.inf()), "Item count shouldn't be infinite!") - - if item_count.le(ItemCount.zero()): - return null - - var new_item: InventoryItem = split_stack(item, item_count.count) - assert(new_item != null) - - assert(destination.add_item(new_item)) - return new_item - - -func _get_space_for_single_item(inventory: Inventory, item: InventoryItem) -> ItemCount: - var single_item := item.duplicate() - assert(set_item_stack_size(single_item, 1)) - var count := inventory._constraint_manager.get_space_for(single_item) - single_item.free() - return count - - -func transfer_autosplitmerge(item: InventoryItem, destination: Inventory) -> bool: - if destination._constraint_manager.has_space_for(item): - # No need for splitting - return transfer_automerge(item, destination) - - var item_count := _get_space_for_single_item(destination, item) - if item_count.eq(ItemCount.zero()): - return false - var new_item: InventoryItem = split_stack(item, item_count.count) - assert(transfer_automerge(new_item, destination)) - return true - - -func transfer_automerge(item: InventoryItem, destination: Inventory) -> bool: - assert(inventory._constraint_manager.get_configuration() == destination._constraint_manager.get_configuration()) - - if !destination._constraint_manager.has_space_for(item): - return false - for i in destination.get_items(): - if items_mergable(i, item): - _merge_stacks(i, item) - if item.is_queued_for_deletion(): - # Stack size reached 0 - return true - assert(destination.add_item(item)) - return true - diff --git a/addons/gloot/core/constraints/weight_constraint.gd b/addons/gloot/core/constraints/weight_constraint.gd index 84b3cf5..5d60e34 100644 --- a/addons/gloot/core/constraints/weight_constraint.gd +++ b/addons/gloot/core/constraints/weight_constraint.gd @@ -1,37 +1,40 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" +@tool +@icon("res://addons/gloot/images/icon_weight_constraint.svg") +extends InventoryConstraint +class_name WeightConstraint +## A constraint that limits the inventory to a given weight capacity. +## +## The constraint implements a weight-based inventory where the total sum of the item weights cannot exceed the +## configured capacity of the inventory. -signal capacity_changed -signal occupied_space_changed +## Default capacity. +const DEFAULT_CAPACITY: float = 1.0 -const KEY_WEIGHT: String = "weight" -const KEY_CAPACITY: String = "capacity" -const KEY_OCCUPIED_SPACE: String = "occupied_space" +const _KEY_WEIGHT: String = "weight" +const _KEY_CAPACITY: String = "capacity" +const _KEY_OCCUPIED_SPACE: String = "occupied_space" -const Verify = preload("res://addons/gloot/core/verify.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") -var capacity: float : +## Maximum weight the inventory can hold. +@export var capacity: float = DEFAULT_CAPACITY: set(new_capacity): if new_capacity < 0.0: new_capacity = 0.0 if new_capacity == capacity: return - if new_capacity > 0.0 && occupied_space > new_capacity: + if new_capacity > 0.0 && _occupied_space > new_capacity: return capacity = new_capacity - capacity_changed.emit() + changed.emit() var _occupied_space: float -var occupied_space: float : - get: - return _occupied_space - set(new_occupied_space): - assert(false, "occupied_space is read-only!") -func _init(inventory: Inventory) -> void: - super._init(inventory) +## Returns the total sum of the item weights. +func get_occupied_space() -> float: + return _occupied_space func _on_inventory_set() -> void: @@ -46,12 +49,8 @@ func _on_item_removed(item: InventoryItem) -> void: _calculate_occupied_space() -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - KEY_WEIGHT, - StacksConstraint.KEY_STACK_SIZE, - ] - if property_name in relevant_properties: +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == _KEY_WEIGHT || property == Inventory._KEY_STACK_SIZE: _calculate_occupied_space() @@ -64,25 +63,16 @@ static func _can_swap(item_dst: InventoryItem, item_src: InventoryItem) -> bool: if !is_instance_valid(inv): return true - var weight_constraint = inv._constraint_manager.get_weight_constraint() + var weight_constraint = inv._constraint_manager.get_constraint(WeightConstraint) if !is_instance_valid(weight_constraint): return true - if weight_constraint.has_unlimited_capacity(): - return true - - var space_needed: float = weight_constraint.occupied_space - get_item_weight(item_dst) + get_item_weight(item_src) + var space_needed: float = weight_constraint._occupied_space - get_item_weight(item_dst) + get_item_weight(item_src) return space_needed <= weight_constraint.capacity -func has_unlimited_capacity() -> bool: - return capacity == 0.0 - - +## Returns the available space in the inventory. func get_free_space() -> float: - if has_unlimited_capacity(): - return capacity - var free_space: float = capacity - _occupied_space if free_space < 0.0: free_space = 0.0 @@ -92,70 +82,68 @@ func get_free_space() -> float: func _calculate_occupied_space() -> void: var old_occupied_space = _occupied_space _occupied_space = 0.0 - for item in inventory.get_items(): - _occupied_space += get_item_weight(item) + if is_instance_valid(inventory): + for item in inventory.get_items(): + _occupied_space += get_item_weight(item) if _occupied_space != old_occupied_space: - emit_signal("occupied_space_changed") + changed.emit() if !Engine.is_editor_hint(): - assert(has_unlimited_capacity() || _occupied_space <= capacity, "Inventory overflow!") + assert(_occupied_space <= capacity, "Inventory overflow!") static func _get_item_unit_weight(item: InventoryItem) -> float: - var weight = item.get_property(KEY_WEIGHT, 1.0) + var weight = item.get_property(_KEY_WEIGHT, 1.0) return weight +## Returns the weight of the given item (i.e. the `weight` property). static func get_item_weight(item: InventoryItem) -> float: if item == null: return -1.0 - return StacksConstraint.get_item_stack_size(item) * _get_item_unit_weight(item) + # TODO: Handle infinity? + return item.get_stack_size() * _get_item_unit_weight(item) +## Sets the weight of the given item (i.e. the `weight` property). static func set_item_weight(item: InventoryItem, weight: float) -> void: assert(weight >= 0.0, "Item weight must be greater or equal to 0!") - item.set_property(KEY_WEIGHT, weight) + item.set_property(_KEY_WEIGHT, weight) -func get_space_for(item: InventoryItem) -> ItemCount: - if has_unlimited_capacity(): - return ItemCount.inf() - var unit_weight := _get_item_unit_weight(item) - return ItemCount.new(floor(get_free_space() / unit_weight)) +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + return floor(get_free_space() / _get_item_unit_weight(item)) +## Checks if the constraint can receive the given item. func has_space_for(item: InventoryItem) -> bool: - if has_unlimited_capacity(): - return true var item_weight := get_item_weight(item) return get_free_space() >= item_weight +## Resets the constraint, i.e. sets its capacity to default (`1.0`). func reset() -> void: - capacity = 0.0 + capacity = DEFAULT_CAPACITY +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: var result := {} - result[KEY_CAPACITY] = capacity - # TODO: Check if this is needed - result[KEY_OCCUPIED_SPACE] = _occupied_space + result[_KEY_CAPACITY] = capacity return result +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_CAPACITY, TYPE_FLOAT) ||\ - !Verify.dict(source, true, KEY_OCCUPIED_SPACE, TYPE_FLOAT): + if !_Verify.dict(source, true, _KEY_CAPACITY, TYPE_FLOAT): return false reset() - capacity = source[KEY_CAPACITY] - # TODO: Check if this is needed - _occupied_space = source[KEY_OCCUPIED_SPACE] + capacity = source[_KEY_CAPACITY] + _calculate_occupied_space() return true - - diff --git a/addons/gloot/core/constraints/weight_constraint.gd.uid b/addons/gloot/core/constraints/weight_constraint.gd.uid new file mode 100644 index 0000000..e28dffb --- /dev/null +++ b/addons/gloot/core/constraints/weight_constraint.gd.uid @@ -0,0 +1 @@ +uid://3e0y8fv4t2bg diff --git a/addons/gloot/core/inventory.gd b/addons/gloot/core/inventory.gd index 53627a1..1195601 100644 --- a/addons/gloot/core/inventory.gd +++ b/addons/gloot/core/inventory.gd @@ -2,328 +2,377 @@ @icon("res://addons/gloot/images/icon_inventory.svg") extends Node class_name Inventory +## Basic stack-based inventory class. +## +## Supports basic inventory operations (adding, removing, transferring items etc.). Can contain an unlimited amount of item stacks. + +signal item_added(item: InventoryItem) ## Emitted when an item has been added to the inventory. +signal item_removed(item: InventoryItem) ## Emitted when an item has been removed from the inventory. +signal item_property_changed(item: InventoryItem, property: String) ## Emitted when a property of an item inside the inventory has been changed. +signal item_moved(item: InventoryItem) ## Emitted when an item has moved to a new index. +signal protoset_changed ## Emitted when the protoset property has changed. +signal constraint_added(constraint: InventoryConstraint) ## Emitted when a new constraint has been added to the inventory. +signal constraint_removed(constraint: InventoryConstraint) ## Emitted when a constraint has been removed from the inventory. +signal constraint_changed(constraint: InventoryConstraint) ## Emitted when an inventory constraint has changed. + +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") +const _ConstraintManager = preload("res://addons/gloot/core/constraints/constraint_manager.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _ProtoTreeCache = preload("res://addons/gloot/core/prototree/proto_tree_cache.gd") + +const _KEY_NODE_NAME: String = "node_name" +const _KEY_PROTOSET: String = "protoset" +const _KEY_CONSTRAINTS: String = "constraints" +const _KEY_ITEMS: String = "items" +const _KEY_STACK_SIZE = _StackManager._KEY_STACK_SIZE +const _KEY_MAX_STACK_SIZE = _StackManager._KEY_MAX_STACK_SIZE + +## A JSON resource containing prototype information. +@export var protoset: JSON: + set(new_protoset): + if new_protoset == protoset: + return + clear() + _disconnect_protoset_signals() + protoset = new_protoset + _prototree = _ProtoTreeCache.get_cached(protoset) + _connect_protoset_signals() + protoset_changed.emit() + update_configuration_warnings() + +var _prototree := _ProtoTreeCache.get_empty() -signal item_added(item) -signal item_removed(item) -signal item_modified(item) -signal item_property_changed(item, property_name) -signal contents_changed -signal protoset_changed - -const ConstraintManager = preload("res://addons/gloot/core/constraints/constraint_manager.gd") - -@export var item_protoset: ItemProtoset: - set(new_item_protoset): - if new_item_protoset == item_protoset: - return - clear() - _disconnect_protoset_signals() - item_protoset = new_item_protoset - _connect_protoset_signals() - protoset_changed.emit() - update_configuration_warnings() var _items: Array[InventoryItem] = [] -var _constraint_manager: ConstraintManager = null +var _constraint_manager: _ConstraintManager = null +var _serialized_format: Dictionary: + set(new_serialized_format): + _serialized_format = new_serialized_format -const KEY_NODE_NAME: String = "node_name" -const KEY_ITEM_PROTOSET: String = "item_protoset" -const KEY_CONSTRAINTS: String = "constraints" -const KEY_ITEMS: String = "items" -const Verify = preload("res://addons/gloot/core/verify.gd") + +## Returns the inventory prototree parsed from the protoset JSON resource. +func get_prototree() -> ProtoTree: + # TODO: Consider returning null when protoset is null + return _prototree func _disconnect_protoset_signals() -> void: - if !is_instance_valid(item_protoset): - return - item_protoset.changed.disconnect(_on_protoset_changed) + if !is_instance_valid(protoset): + return + protoset.changed.disconnect(_on_protoset_changed) func _connect_protoset_signals() -> void: - if !is_instance_valid(item_protoset): - return - item_protoset.changed.connect(_on_protoset_changed) + if !is_instance_valid(protoset): + return + protoset.changed.connect(_on_protoset_changed) func _on_protoset_changed() -> void: - protoset_changed.emit() - + protoset_changed.emit() -func _get_configuration_warnings() -> PackedStringArray: - if item_protoset == null: - return PackedStringArray([ - "This inventory node has no protoset. Set the 'item_protoset' field to be able to " \ - + "populate the inventory with items."]) - return PackedStringArray() + +func _get_property_list(): + return [ + { + "name": "_serialized_format", + "type": TYPE_DICTIONARY, + "usage": PROPERTY_USAGE_STORAGE + }, + ] -static func _get_item_script() -> Script: - return preload("inventory_item.gd") +func _update_serialized_format() -> void: + if Engine.is_editor_hint(): + _serialized_format = serialize() -func _enter_tree(): - for child in get_children(): - if not child is InventoryItem: - continue - if has_item(child): - continue - _items.append(child) +func _get_configuration_warnings() -> PackedStringArray: + if protoset == null: + return PackedStringArray([ + "This inventory node has no prototree. Set the 'protoset' field to be able to " \ + + "populate the inventory with items."]) + return PackedStringArray() func _init() -> void: - _constraint_manager = ConstraintManager.new(self) + _constraint_manager = _ConstraintManager.new(self) + _constraint_manager.constraint_changed.connect(_on_constraint_changed) -func _ready() -> void: - for item in get_items(): - _connect_item_signals(item) +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _update_serialized_format() + constraint_changed.emit(constraint) -func _on_item_added(item: InventoryItem) -> void: - _items.append(item) - contents_changed.emit() - _connect_item_signals(item) - if _constraint_manager: - _constraint_manager._on_item_added(item) - item_added.emit(item) +func _ready() -> void: + renamed.connect(_update_serialized_format) + if !_serialized_format.is_empty(): + deserialize(_serialized_format) -func _on_item_removed(item: InventoryItem) -> void: - _items.erase(item) - contents_changed.emit() - _disconnect_item_signals(item) - if _constraint_manager: - _constraint_manager._on_item_removed(item) - item_removed.emit(item) + for item in get_items(): + _connect_item_signals(item) +## Moves the item at the given index in the inventory to a new index. func move_item(from: int, to: int) -> void: - assert(from >= 0) - assert(from < _items.size()) - assert(to >= 0) - assert(to < _items.size()) - if from == to: - return + assert(from >= 0) + assert(from < _items.size()) + assert(to >= 0) + assert(to < _items.size()) + if from == to: + return - var item = _items[from] - _items.remove_at(from) - _items.insert(to, item) + var item = _items[from] + _items.remove_at(from) + _items.insert(to, item) + _update_serialized_format() - contents_changed.emit() + item_moved.emit() +## Returns the index of the given item in the inventory. func get_item_index(item: InventoryItem) -> int: - return _items.find(item) + return _items.find(item) +## Returns the number of items in the inventory. func get_item_count() -> int: - return _items.size() + return _items.size() func _connect_item_signals(item: InventoryItem) -> void: - if !item.protoset_changed.is_connected(_emit_item_modified): - item.protoset_changed.connect(_emit_item_modified.bind(item)) - if !item.prototype_id_changed.is_connected(_emit_item_modified): - item.prototype_id_changed.connect(_emit_item_modified.bind(item)) - if !item.properties_changed.is_connected(_emit_item_modified): - item.properties_changed.connect(_emit_item_modified.bind(item)) - if !item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.connect(_on_item_property_changed.bind(item)) - + _Utils.safe_connect(item.property_changed, _on_item_property_changed.bind(item)) -func _disconnect_item_signals(item:InventoryItem) -> void: - if item.protoset_changed.is_connected(_emit_item_modified): - item.protoset_changed.disconnect(_emit_item_modified) - if item.prototype_id_changed.is_connected(_emit_item_modified): - item.prototype_id_changed.disconnect(_emit_item_modified) - if item.properties_changed.is_connected(_emit_item_modified): - item.properties_changed.disconnect(_emit_item_modified) - if item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.disconnect(_on_item_property_changed.bind(item)) +func _disconnect_item_signals(item: InventoryItem) -> void: + _Utils.safe_disconnect(item.property_changed, _on_item_property_changed) -func _emit_item_modified(item: InventoryItem) -> void: - item_modified.emit(item) - -func _on_item_property_changed(property_name: String, item: InventoryItem) -> void: - _constraint_manager._on_item_property_changed(item, property_name) - item_property_changed.emit(item, property_name) +func _on_item_property_changed(property: String, item: InventoryItem) -> void: + _update_serialized_format() + _constraint_manager._on_item_property_changed(item, property) + item_property_changed.emit(item, property) +## Returns an array containing all the items in the inventory. func get_items() -> Array[InventoryItem]: - return _items + return _items +## Checks if the inventory contains the given item. func has_item(item: InventoryItem) -> bool: - return item in _items + return item in _items +## Adds the given item to the inventory. func add_item(item: InventoryItem) -> bool: - if !can_add_item(item): - return false - - if item.get_parent(): - item.get_parent().remove_child(item) - - # HACK: In case of InventoryGridStacked we can end up adding the item and - # removing it immediately, after a successful pack() call (in case the grid - # constraint has no space for the item). This causes some errors because - # Godot still tries to call the ENTER_TREE notification. To avoid that, we - # call transfer_automerge(), which should be able to pack the item without - # adding it first. - var gc := _constraint_manager.get_grid_constraint() - var sc := _constraint_manager.get_stacks_constraint() - if gc != null && sc != null && !gc.has_space_for(item): - assert(sc.transfer_automerge(item, self)) - else: - add_child(item) - - if Engine.is_editor_hint() && !item.is_queued_for_deletion(): - item.owner = get_tree().edited_scene_root - return true + if !can_add_item(item): + return false + if item.get_inventory() != null: + item.get_inventory().remove_item(item) -func can_add_item(item: InventoryItem) -> bool: - if item == null || has_item(item): - return false - - if !can_hold_item(item): - return false - - if !_constraint_manager.has_space_for(item): - return false + _items.append(item) + _update_serialized_format() + item._inventory = self + _connect_item_signals(item) + _constraint_manager._on_item_added(item) + # Adding an item can result in the item being freed (e.g. when it's merged with another item stack) + if !is_instance_valid(item): + item = null + item_added.emit(item) + return true - return true +## Checks if the given item can be added to the inventory. +func can_add_item(item: InventoryItem) -> bool: + if item == null || has_item(item): + return false + + if !_constraint_manager.has_space_for(item): + return false -func can_hold_item(item: InventoryItem) -> bool: - return true + return true +## Creates an `InventoryItem` based on the given prototype ID adds it to the inventory. Returns `null` if the item +## cannot be added. func create_and_add_item(prototype_id: String) -> InventoryItem: - var item: InventoryItem = InventoryItem.new() - item.protoset = item_protoset - item.prototype_id = prototype_id - if add_item(item): - return item - else: - item.free() - return null + var item: InventoryItem = InventoryItem.new(protoset, prototype_id) + if add_item(item): + return item + else: + return null +## Removes the given item from the inventory. Returns `false` if the item is not inside the inventory. func remove_item(item: InventoryItem) -> bool: - if !_can_remove_item(item): - return false + if !_can_remove_item(item): + return false - remove_child(item) - return true + _items.erase(item) + _update_serialized_format() + item._inventory = null + _disconnect_item_signals(item) + _constraint_manager._on_item_removed(item) + item_removed.emit(item) + return true func _can_remove_item(item: InventoryItem) -> bool: - return item != null && has_item(item) + return item != null && has_item(item) -func remove_all_items() -> void: - while get_child_count() > 0: - remove_child(get_child(0)) - _items = [] +## Returns the first found item with the given prototype ID. +func get_item_with_prototype_id(prototype_id: String) -> InventoryItem: + for item in get_items(): + if !is_instance_valid(item.get_prototype()): + continue + if item.get_prototype().get_prototype_id() == prototype_id: + return item + + return null -func get_item_by_id(prototype_id: String) -> InventoryItem: - for item in get_items(): - if item.prototype_id == prototype_id: - return item - - return null +## Returns an array of all the items with the given prototype ID. +func get_items_with_prototype_id(prototype_id: String) -> Array[InventoryItem]: + var result: Array[InventoryItem] = [] + for item in get_items(): + if !is_instance_valid(item.get_prototype()): + continue + if item.get_prototype().get_prototype_id() == prototype_id: + result.append(item) + + return result -func get_items_by_id(prototype_id: String) -> Array[InventoryItem]: - var result: Array[InventoryItem] = [] - for item in get_items(): - if item.prototype_id == prototype_id: - result.append(item) - - return result +## Checks if the inventory has an item with the given prototype ID. +func has_item_with_prototype_id(prototype_id: String) -> bool: + return get_item_with_prototype_id(prototype_id) != null -func has_item_by_id(prototype_id: String) -> bool: - return get_item_by_id(prototype_id) != null +func _on_constraint_added(constraint: InventoryConstraint) -> void: + _constraint_manager.register_constraint(constraint) + constraint_added.emit(constraint) + +func _on_constraint_removed(constraint: InventoryConstraint) -> void: + _constraint_manager.unregister_constraint(constraint) + constraint_removed.emit(constraint) -func transfer(item: InventoryItem, destination: Inventory) -> bool: - return destination.add_item(item) +## Returns the inventory constraint of the given type (script). Returns `null` if the inventory has no constraints of +## that type. +func get_constraint(script: Script) -> InventoryConstraint: + return _constraint_manager.get_constraint(script) + +## Removes all items from the inventory and sets its protoset to `null`. func reset() -> void: - clear() - item_protoset = null - _constraint_manager.reset() + clear() + protoset = null +## Removes all the items from the inventory. func clear() -> void: - for item in get_items(): - item.queue_free() - remove_all_items() + while _items.size() > 0: + remove_item(_items[0]) + _update_serialized_format() +## Serializes the inventory into a `Dictionary`. func serialize() -> Dictionary: - var result: Dictionary = {} + var result: Dictionary = {} + + if protoset == null || _constraint_manager == null: + return result - result[KEY_NODE_NAME] = name as String - result[KEY_ITEM_PROTOSET] = _serialize_item_protoset(item_protoset) - result[KEY_CONSTRAINTS] = _constraint_manager.serialize() - if !get_items().is_empty(): - result[KEY_ITEMS] = [] - for item in get_items(): - result[KEY_ITEMS].append(item.serialize()) + result[_KEY_NODE_NAME] = name as String + result[_KEY_PROTOSET] = _serialize_protoset(protoset) + if !_constraint_manager.is_empty(): + result[_KEY_CONSTRAINTS] = _constraint_manager.serialize() + if !get_items().is_empty(): + result[_KEY_ITEMS] = [] + for item in get_items(): + result[_KEY_ITEMS].append(item.serialize()) - return result + return result -static func _serialize_item_protoset(item_protoset: ItemProtoset) -> String: - if !is_instance_valid(item_protoset): - return "" - elif item_protoset.resource_path.is_empty(): - return item_protoset.json_data - else: - return item_protoset.resource_path +static func _serialize_protoset(protoset: JSON) -> String: + if !is_instance_valid(protoset): + return "" + elif protoset.resource_path.is_empty(): + return protoset.stringify(protoset.data) + else: + return protoset.resource_path +## Loads the inventory data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_NODE_NAME, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_ITEM_PROTOSET, TYPE_STRING) ||\ - !Verify.dict(source, false, KEY_ITEMS, TYPE_ARRAY, TYPE_DICTIONARY) ||\ - !Verify.dict(source, false, KEY_CONSTRAINTS, TYPE_DICTIONARY): - return false - - clear() - item_protoset = null - - if !source[KEY_NODE_NAME].is_empty() && source[KEY_NODE_NAME] != name: - name = source[KEY_NODE_NAME] - item_protoset = _deserialize_item_protoset(source[KEY_ITEM_PROTOSET]) - # TODO: Check return value: - if source.has(KEY_CONSTRAINTS): - _constraint_manager.deserialize(source[KEY_CONSTRAINTS]) - if source.has(KEY_ITEMS): - var items = source[KEY_ITEMS] - for item_dict in items: - var item = _get_item_script().new() - # TODO: Check return value: - item.deserialize(item_dict) - assert(add_item(item), "Failed to add item '%s'. Inventory full?" % item.prototype_id) - - return true - - -static func _deserialize_item_protoset(data: String) -> ItemProtoset: - if data.is_empty(): - return null - elif data.begins_with("res://"): - return load(data) - else: - var protoset := ItemProtoset.new() - protoset.json_data = data - return protoset + if !_Verify.dict(source, true, _KEY_NODE_NAME, TYPE_STRING) || \ + !_Verify.dict(source, true, _KEY_PROTOSET, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_ITEMS, TYPE_ARRAY, TYPE_DICTIONARY) || \ + !_Verify.dict(source, false, _KEY_CONSTRAINTS, TYPE_DICTIONARY): + return false + + clear() + protoset = null + + if !source[_KEY_NODE_NAME].is_empty() && source[_KEY_NODE_NAME] != name: + name = source[_KEY_NODE_NAME] + protoset = _Utils._deserialize_protoset(source[_KEY_PROTOSET]) + # TODO: Check return value: + if source.has(_KEY_ITEMS): + var items = source[_KEY_ITEMS] + for item_dict in items: + var item = InventoryItem.new() + # TODO: Check return value: + item.deserialize(item_dict) + var success = add_item(item) + assert(success, "Failed to add item '%s'. Inventory full?" % item.get_title()) + if source.has(_KEY_CONSTRAINTS): + if !_constraint_manager.deserialize(source[_KEY_CONSTRAINTS]): + return false + + return true + + +## Splits the given item stack into two within the inventory. `new_stack_size` defines the size of the new stack, +## which is added to the inventory. Returns `null` if the split cannot be performed or if the new stack cannot be added +## to the inventory. +func split_stack(item: InventoryItem, new_stack_size: int) -> InventoryItem: + return _StackManager.inv_split_stack(self, item, _ItemCount.new(new_stack_size)) + + +## Merges the `item_src` item stack into the `item_dst` stack which is inside the inventory. If `item_dst` doesn't have +## enough stack space and `split_source` is set to `true`, `item_src` will be split and only partially merged. Returns +## `false` if the merge cannot be performed. +func merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + return _StackManager.inv_merge_stack(self, item_dst, item_src, split_source) + + +## Adds the given item to the inventory and merges it with all compatible items. Returns `false` if the item cannot be +## added. +func add_item_automerge(item: InventoryItem) -> bool: + return _StackManager.inv_add_automerge(self, item) + + +## Adds the given item to the inventory, splitting it if there is not enough space for the whole stack. +func add_item_autosplit(item: InventoryItem) -> bool: + return _StackManager.inv_add_autosplit(self, item) + + +## A combination of `add_item_autosplit` and `add_item_automerge`. Adds the given item stack into the inventory, splitting it up +## and joining it with available item stacks, as needed. +func add_item_autosplitmerge(item: InventoryItem) -> bool: + return _StackManager.inv_add_autosplitmerge(self, item) + +## Merges the given item with all compatible items in the same inventory. +func pack_item(item: InventoryItem) -> void: + return _StackManager.inv_pack_stack(self, item) diff --git a/addons/gloot/core/inventory.gd.uid b/addons/gloot/core/inventory.gd.uid new file mode 100644 index 0000000..bfa7c27 --- /dev/null +++ b/addons/gloot/core/inventory.gd.uid @@ -0,0 +1 @@ +uid://bxtv6f17pkdmm diff --git a/addons/gloot/core/inventory_grid.gd b/addons/gloot/core/inventory_grid.gd deleted file mode 100644 index 4e519eb..0000000 --- a/addons/gloot/core/inventory_grid.gd +++ /dev/null @@ -1,97 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_grid.svg") -extends Inventory -class_name InventoryGrid - -signal size_changed - -const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) - -@export var size: Vector2i = DEFAULT_SIZE : - get: - if _constraint_manager == null: - return DEFAULT_SIZE - if _constraint_manager.get_grid_constraint() == null: - return DEFAULT_SIZE - return _constraint_manager.get_grid_constraint().size - set(new_size): - _constraint_manager.get_grid_constraint().size = new_size - - -func _init() -> void: - super._init() - _constraint_manager.enable_grid_constraint() - _constraint_manager.get_grid_constraint().size_changed.connect(func(): size_changed.emit()) - - -func get_item_position(item: InventoryItem) -> Vector2i: - return _constraint_manager.get_grid_constraint().get_item_position(item) - - -func get_item_size(item: InventoryItem) -> Vector2i: - return _constraint_manager.get_grid_constraint().get_item_size(item) - - -func get_item_rect(item: InventoryItem) -> Rect2i: - return _constraint_manager.get_grid_constraint().get_item_rect(item) - - -func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: - return _constraint_manager.get_grid_constraint().set_item_rotation(item, rotated) - - -func rotate_item(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().rotate_item(item) - - -func is_item_rotated(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().is_item_rotated(item) - - -func can_rotate_item(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().can_rotate_item(item) - - -func set_item_rotation_direction(item: InventoryItem, positive: bool) -> void: - _constraint_manager.set_item_rotation_direction(item, positive) - - -func is_item_rotation_positive(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().is_item_rotation_positive(item) - - -func add_item_at(item: InventoryItem, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().add_item_at(item, position) - - -func create_and_add_item_at(prototype_id: String, position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint().create_and_add_item_at(prototype_id, position) - - -func get_item_at(position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint().get_item_at(position) - - -func get_items_under(rect: Rect2i) -> Array[InventoryItem]: - return _constraint_manager.get_grid_constraint().get_items_under(rect) - - -func move_item_to(item: InventoryItem, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().move_item_to(item, position) - - -func transfer_to(item: InventoryItem, destination: Inventory, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) - - -func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: - return _constraint_manager.get_grid_constraint().rect_free(rect, exception) - - -func find_free_place(item: InventoryItem) -> Dictionary: - return _constraint_manager.get_grid_constraint().find_free_place(item) - - -func sort() -> bool: - return _constraint_manager.get_grid_constraint().sort() - diff --git a/addons/gloot/core/inventory_grid_stacked.gd b/addons/gloot/core/inventory_grid_stacked.gd deleted file mode 100644 index 934775a..0000000 --- a/addons/gloot/core/inventory_grid_stacked.gd +++ /dev/null @@ -1,72 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_grid_stacked.svg") -extends InventoryGrid -class_name InventoryGridStacked - -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") - - -func _init() -> void: - super._init() - _constraint_manager.enable_stacks_constraint() - - -func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) - - -func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) - - -func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) - - -func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) - - -static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) - - -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: - return StacksConstraint.set_item_stack_size(item, new_stack_size) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) - - -static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_max_stack_size(item, new_stack_size) - - -func get_prototype_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_stack_size(item_protoset, prototype_id) - - -func get_prototype_max_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_max_stack_size(item_protoset, prototype_id) - - -func transfer_automerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) - - -func transfer_autosplitmerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) - - -static func pack(item: InventoryItem) -> void: - return StacksConstraint.pack_item(item) - - -func transfer_to(item: InventoryItem, destination: Inventory, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) - - -func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint()._get_mergable_item_at(item, position) - diff --git a/addons/gloot/core/inventory_item.gd b/addons/gloot/core/inventory_item.gd index 8e8919a..cc854af 100644 --- a/addons/gloot/core/inventory_item.gd +++ b/addons/gloot/core/inventory_item.gd @@ -1,297 +1,267 @@ @tool @icon("res://addons/gloot/images/icon_item.svg") -extends Node +extends RefCounted class_name InventoryItem - -signal protoset_changed -signal prototype_id_changed -signal properties_changed -signal property_changed(property_name) -signal added_to_inventory(inventory) -signal removed_from_inventory(inventory) -signal equipped_in_slot(item_slot) -signal removed_from_slot(item_slot) - -const Utils = preload("res://addons/gloot/core/utils.gd") - -@export var protoset: ItemProtoset : +## Stack-based inventory item class. +## +## It is based on an item prototype from an prototree. Can hold additional properties. The default stack size and +## maximum stack size is 1, which can be changed by setting the `stack_size` and `maximum_stack_size` properties inside +## the prototype or directly inside the item. + +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") +const _ProtoTreeCache = preload("res://addons/gloot/core/prototree/proto_tree_cache.gd") + +signal property_changed(property_name: String) ## Emitted when an item property has changed. + +## A JSON resource containing prototype information. +var protoset: JSON: set(new_protoset): if new_protoset == protoset: return - if (_inventory != null) && (new_protoset != _inventory.item_protoset): + if (_inventory != null) && (new_protoset != _inventory.protoset): return _disconnect_protoset_signals() protoset = new_protoset + _prototree = _ProtoTreeCache.get_cached(protoset) + _on_prototree_changed() _connect_protoset_signals() + +var _prototree: ProtoTree = _ProtoTreeCache.get_empty() +var _prototype: Prototype = null +var _properties: Dictionary - # Reset the prototype ID (pick the first prototype from the protoset) - if protoset && protoset._prototypes && protoset._prototypes.keys().size() > 0: - prototype_id = protoset._prototypes.keys()[0] - else: - prototype_id = "" - - protoset_changed.emit() - update_configuration_warnings() - -@export var prototype_id: String : - set(new_prototype_id): - if new_prototype_id == prototype_id: - return - if protoset == null && !new_prototype_id.is_empty(): - return - if (protoset != null) && (!protoset.has_prototype(new_prototype_id)): - return - prototype_id = new_prototype_id - _reset_properties() - update_configuration_warnings() - prototype_id_changed.emit() - -@export var properties: Dictionary : - set(new_properties): - properties = new_properties - properties_changed.emit() - update_configuration_warnings() - -var _inventory: Inventory : +var _inventory: Inventory: set(new_inventory): if new_inventory == _inventory: return _inventory = new_inventory if _inventory: - protoset = _inventory.item_protoset -var _item_slot: ItemSlot + protoset = _inventory.protoset -const KEY_PROTOSET: String = "protoset" -const KEY_PROTOTYE_ID: String = "prototype_id" -const KEY_PROPERTIES: String = "properties" -const KEY_NODE_NAME: String = "node_name" -const KEY_TYPE: String = "type" -const KEY_VALUE: String = "value" +const _KEY_PROTOSET: String = "protoset" +const _KEY_PROTOTYPE_ID: String = "prototype_id" +const _KEY_PROPERTIES: String = "properties" +const _KEY_TYPE: String = "type" +const _KEY_VALUE: String = "value" -const KEY_IMAGE: String = "image" -const KEY_NAME: String = "name" +const _KEY_IMAGE: String = "image" +const _KEY_NAME: String = "name" -const Verify = preload("res://addons/gloot/core/verify.gd") func _connect_protoset_signals() -> void: - if protoset == null: + if !is_instance_valid(protoset): return + protoset.changed.connect(_on_protoset_changed) func _disconnect_protoset_signals() -> void: - if protoset == null: + if !is_instance_valid(protoset): return - protoset.changed.disconnect(_on_protoset_changed) - -func _on_protoset_changed() -> void: - update_configuration_warnings() + protoset.changed.disconnect(_on_protoset_changed) -func _get_configuration_warnings() -> PackedStringArray: - if !protoset: - return PackedStringArray() +func _init(protoset_: JSON = null, prototype_id: String = "") -> void: + protoset = protoset_ + if _prototree.has_prototype(prototype_id): + _prototype = _prototree.get_prototype(prototype_id) - if !protoset.has_prototype(prototype_id): - return PackedStringArray(["Undefined prototype '%s'. Check the item protoset!" % prototype_id]) - return PackedStringArray() +func _on_protoset_changed() -> void: + _prototree.deserialize(protoset) + _on_prototree_changed() -func _reset_properties() -> void: - if !protoset || prototype_id.is_empty(): - properties = {} +func _on_prototree_changed() -> void: + if protoset == null: + _prototype = null return - # Reset (erase) all properties from the current prototype but preserve the rest - var prototype: Dictionary = protoset.get_prototype(prototype_id) - var keys: Array = properties.keys().duplicate() - for property in keys: - if prototype.has(property): - properties.erase(property) - - -func _notification(what): - if what == NOTIFICATION_PARENTED: - _on_parented(get_parent()) - elif what == NOTIFICATION_UNPARENTED: - _on_unparented() - - -func _on_parented(parent: Node) -> void: - if parent is Inventory: - _on_added_to_inventory(parent as Inventory) - else: - _inventory = null - - if parent is ItemSlot: - _link_to_slot(parent as ItemSlot) - else: - _unlink_from_slot() - - -func _on_added_to_inventory(inventory: Inventory) -> void: - assert(inventory != null) - _inventory = inventory - - added_to_inventory.emit(_inventory) - _inventory._on_item_added(self) - - -func _on_unparented() -> void: - if _inventory: - _on_removed_from_inventory(_inventory) - _inventory = null + if _prototype == null: + # Pick the first one from the prototree + var prototypes := _prototree.get_prototypes() + if prototypes.size() > 0: + _prototype = prototypes[0] + else: + _prototype = null + return - _unlink_from_slot() + _prototype = _prototree.get_prototype(_prototype.get_prototype_id()) -func _on_removed_from_inventory(inventory: Inventory) -> void: - if inventory: - removed_from_inventory.emit(inventory) - inventory._on_item_removed(self) +## Returns the inventory prototree parsed from the protoset JSON resource. +func get_prototree() -> ProtoTree: + return _prototree -func _link_to_slot(item_slot: ItemSlot) -> void: - _item_slot = item_slot - _item_slot._on_item_added(self) - equipped_in_slot.emit(item_slot) +## Returns the item prototype. +func get_prototype() -> Prototype: + return _prototype -func _unlink_from_slot() -> void: - if _item_slot == null: - return - var temp_slot := _item_slot - _item_slot = null - temp_slot._on_item_removed() - removed_from_slot.emit(temp_slot) +## Returns a duplicate of the item. +func duplicate() -> InventoryItem: + var result := InventoryItem.new(protoset, _prototype.get_prototype_id()) + result._properties = _properties.duplicate() + return result +## Returns the `Inventory` this item belongs to, or `null` if it is not inside an inventory. func get_inventory() -> Inventory: return _inventory -func get_item_slot() -> ItemSlot: - return _item_slot - - +## Swaps the two given items. Returns `false` if the items cannot be swapped. static func swap(item1: InventoryItem, item2: InventoryItem) -> bool: if item1 == null || item2 == null || item1 == item2: return false - var owner1 = item1.get_inventory() - if owner1 == null: - owner1 = item1.get_item_slot() - var owner2 = item2.get_inventory() - if owner2 == null: - owner2 = item2.get_item_slot() - if owner1 == null || owner2 == null: + var inv1 = item1.get_inventory() + var inv2 = item2.get_inventory() + if inv1 == null || inv2 == null: return false - if owner1 is Inventory: - if !owner1._constraint_manager._on_pre_item_swap(item1, item2): - return false - if owner2 is Inventory && owner1 != owner2: - if !owner2._constraint_manager._on_pre_item_swap(item1, item2): + if !inv1._constraint_manager._on_pre_item_swap(item1, item2): + return false + if inv1 != inv2: + if !inv2._constraint_manager._on_pre_item_swap(item1, item2): return false - var idx1 = _remove_item_from_owner(item1, owner1) - var idx2 = _remove_item_from_owner(item2, owner2) - if !_add_item_to_owner(item1, owner2, idx2): - _add_item_to_owner(item1, owner1, idx1) - _add_item_to_owner(item2, owner2, idx2) + var idx1 = inv1.get_item_index(item1) + var idx2 = inv2.get_item_index(item2) + inv1.remove_item(item1) + inv2.remove_item(item2) + + if !inv2.add_item(item1): + inv1.add_item(item1) + inv1.move_item(inv1.get_item_index(item1), idx1) + inv2.add_item(item2) + inv2.move_item(inv2.get_item_index(item2), idx2) return false - if !_add_item_to_owner(item2, owner1, idx1): - _add_item_to_owner(item1, owner1, idx1) - _add_item_to_owner(item2, owner2, idx2) + if !inv1.add_item(item2): + inv1.add_item(item1) + inv1.move_item(inv1.get_item_index(item1), idx1) + inv2.add_item(item2) + inv2.move_item(inv2.get_item_index(item2), idx2) return false + inv2.move_item(inv2.get_item_index(item1), idx2) + inv1.move_item(inv1.get_item_index(item2), idx1) - if owner1 is Inventory: - owner1._constraint_manager._on_post_item_swap(item1, item2) - if owner2 is Inventory && owner1 != owner2: - owner2._constraint_manager._on_post_item_swap(item1, item2) + if inv1 is Inventory: + inv1._constraint_manager._on_post_item_swap(item1, item2) + if inv2 is Inventory && inv1 != inv2: + inv2._constraint_manager._on_post_item_swap(item1, item2) return true; -static func _remove_item_from_owner(item: InventoryItem, item_owner) -> int: - if item_owner is Inventory: - var inventory := (item_owner as Inventory) - var item_idx = inventory.get_item_index(item) - inventory.remove_item(item) - return item_idx - - # TODO: Consider removing/deprecating ItemSlot.remember_source_inventory - var item_slot := (item_owner as ItemSlot) - var temp_remember_source_inventory = item_slot.remember_source_inventory - item_slot.remember_source_inventory = false - item_slot.clear() - item_slot.remember_source_inventory = temp_remember_source_inventory - return 0 - - -static func _add_item_to_owner(item: InventoryItem, item_owner, index: int) -> bool: - if item_owner is Inventory: - var inventory := (item_owner as Inventory) - if inventory.add_item(item): - inventory.move_item(inventory.get_item_index(item), index) - return true - return false - return (item_owner as ItemSlot).equip(item) +static func _add_item_to_inventory(item: InventoryItem, inventory: Inventory, index: int) -> bool: + if inventory.add_item(item): + inventory.move_item(inventory.get_item_index(item), index) + return true + return false + + +## Checks if the item has the given property. +func has_property(property_name: String) -> bool: + if _properties.has(property_name): + return true + if _prototype != null && _prototype.has_property(property_name): + return true + return false +## Returns the given item property. If the item does not define the item property, `default_value` is returned. func get_property(property_name: String, default_value = null) -> Variant: - # Note: The protoset editor still doesn't support arrays and dictionaries, - # but those can still be added via JSON definitions or via code. - if properties.has(property_name): - var value = properties[property_name] + if _properties.has(property_name): + var value = _properties[property_name] if typeof(value) == TYPE_DICTIONARY || typeof(value) == TYPE_ARRAY: return value.duplicate() return value - if protoset && protoset.prototype_has_property(prototype_id, property_name): - var value = protoset.get_prototype_property(prototype_id, property_name, default_value) + if _prototype != null && _prototype.has_property(property_name): + var value = _prototype.get_property(property_name, default_value) if typeof(value) == TYPE_DICTIONARY || typeof(value) == TYPE_ARRAY: return value.duplicate() return value - + + if _properties.has(property_name): + return _properties[property_name] + if _prototype != null && _prototree.get_prototypes().is_empty(): + return _prototype.get_property(property_name, default_value) return default_value +## Sets the given item property to the given value. func set_property(property_name: String, value) -> void: - if properties.has(property_name) && properties[property_name] == value: + if get_property(property_name) == value: return - properties[property_name] = value - property_changed.emit(property_name) - properties_changed.emit() + if _prototype != null && _prototype.has_property(property_name): + if _prototype.get_property(property_name) == value && _properties.has(property_name): + _properties.erase(property_name) + property_changed.emit(property_name) + return + + if value == null: + if _properties.has(property_name): + _properties.erase(property_name) + property_changed.emit(property_name) + else: + _properties[property_name] = value + property_changed.emit(property_name) + +## Clears (un-defines) the given item property. func clear_property(property_name: String) -> void: - if properties.has(property_name): - properties.erase(property_name) + if _properties.has(property_name): + _properties.erase(property_name) property_changed.emit(property_name) - properties_changed.emit() +## Returns an array of properties that the item overrides. +func get_overridden_properties() -> Array: + return _properties.keys().duplicate() + + +## Returns an array of item properties (includes prototype properties). +func get_properties() -> Array: + if _prototype != null: + return _Utils.array_union(_properties.keys(), _prototype.get_properties().keys()) + else: + return _properties.keys() + + +## Checks if the item overrides the given property. +func is_property_overridden(property_name) -> bool: + return _properties.has(property_name) + + +## Resets item data. Clears its properties and sets its protoset to `null`. func reset() -> void: protoset = null - prototype_id = "" - properties = {} + _properties = {} +## Serializes the item into a `Dictionary`. func serialize() -> Dictionary: var result: Dictionary = {} - result[KEY_NODE_NAME] = name as String - result[KEY_PROTOSET] = Inventory._serialize_item_protoset(protoset) - result[KEY_PROTOTYE_ID] = prototype_id - if !properties.is_empty(): - result[KEY_PROPERTIES] = {} - for property_name in properties.keys(): - result[KEY_PROPERTIES][property_name] = _serialize_property(property_name) + result[_KEY_PROTOSET] = Inventory._serialize_protoset(protoset) + if _prototype != null: + result[_KEY_PROTOTYPE_ID] = str(_prototype.get_prototype_id()) + else: + result[_KEY_PROTOTYPE_ID] = "" + if !_properties.is_empty(): + result[_KEY_PROPERTIES] = {} + for property_name in _properties.keys(): + result[_KEY_PROPERTIES][property_name] = _serialize_property(property_name) return result @@ -299,33 +269,33 @@ func serialize() -> Dictionary: func _serialize_property(property_name: String) -> Dictionary: # Store all properties as strings for JSON support. var result: Dictionary = {} - var property_value = properties[property_name] + var property_value = _properties[property_name] var property_type = typeof(property_value) result = { - KEY_TYPE: property_type, - KEY_VALUE: var_to_str(property_value) + _KEY_TYPE: property_type, + _KEY_VALUE: var_to_str(property_value) } return result; +## Loads the item data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_NODE_NAME, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_PROTOSET, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_PROTOTYE_ID, TYPE_STRING) ||\ - !Verify.dict(source, false, KEY_PROPERTIES, TYPE_DICTIONARY): + if !_Verify.dict(source, true, _KEY_PROTOSET, TYPE_STRING) || \ + !_Verify.dict(source, true, _KEY_PROTOTYPE_ID, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_PROPERTIES, TYPE_DICTIONARY): return false reset() - if !source[KEY_NODE_NAME].is_empty() && source[KEY_NODE_NAME] != name: - name = source[KEY_NODE_NAME] - protoset = Inventory._deserialize_item_protoset(source[KEY_PROTOSET]) - prototype_id = source[KEY_PROTOTYE_ID] - if source.has(KEY_PROPERTIES): - for key in source[KEY_PROPERTIES].keys(): - properties[key] = _deserialize_property(source[KEY_PROPERTIES][key]) - if properties[key] == null: - properties = {} + # TODO: Check return values + protoset = _Utils._deserialize_protoset(source[_KEY_PROTOSET]) + _prototype = _prototree.get_prototype(source[_KEY_PROTOTYPE_ID]) + if source.has(_KEY_PROPERTIES): + for key in source[_KEY_PROPERTIES].keys(): + var value = _deserialize_property(source[_KEY_PROPERTIES][key]) + set_property(key, value) + if value == null: + _properties = {} return false return true @@ -333,18 +303,20 @@ func deserialize(source: Dictionary) -> bool: func _deserialize_property(data: Dictionary): # Properties are stored as strings for JSON support. - var result = Utils.str_to_var(data[KEY_VALUE]) - var expected_type: int = data[KEY_TYPE] + var result = _Utils.str_to_var(data[_KEY_VALUE]) + var expected_type: int = data[_KEY_TYPE] var property_type: int = typeof(result) if property_type != expected_type: print("Property has unexpected type: %s. Expected: %s" % - [Verify.type_names[property_type], Verify.type_names[expected_type]]) + [_Verify.type_names[property_type], _Verify.type_names[expected_type]]) return null return result +## Helper function for retrieving the item texture. It checks the image item property and loads it as a texture, if +## available. func get_texture() -> Texture2D: - var texture_path = get_property(KEY_IMAGE) + var texture_path = get_property(_KEY_IMAGE) if texture_path && texture_path != "" && ResourceLoader.exists(texture_path): var texture = load(texture_path) if texture is Texture2D: @@ -352,9 +324,64 @@ func get_texture() -> Texture2D: return null +## Helper function for retrieving the item title. It checks the name item property and uses it as the title, if +## available. Otherwise, prototype_id is returned as title. func get_title() -> String: - var title = get_property(KEY_NAME, prototype_id) - if !(title is String): - title = prototype_id + var title = get_property(_KEY_NAME, null) + if title is String: + return title + if is_instance_valid(_prototype): + return _prototype.get_prototype_id() + return "" + + +## Returns the stack size. +func get_stack_size() -> int: + return _StackManager.get_item_stack_size(self).count + + +## Returns the maximum stack size. +func get_max_stack_size() -> int: + return _StackManager.get_item_max_stack_size(self).count + + +## Sets the stack size. +func set_stack_size(stack_size: int) -> bool: + return _StackManager.set_item_stack_size(self, _ItemCount.new(stack_size)) + + +## Sets the maximum stack size. +func set_max_stack_size(max_stack_size: int) -> void: + _StackManager.set_item_max_stack_size(self, _ItemCount.new(max_stack_size)) + + +## Merges the item stack into the `item_dst` stack. If `item_dst` doesn't have enough stack space and `split` is set to +## `true`, the stack will be split and only partially merged. Returns `false` if the merge cannot be performed. +func merge_into(item_dst: InventoryItem, split: bool = false) -> bool: + return _StackManager.merge_stacks(item_dst, self, split) + + +## Checks if the item stack can be merged into `item_dst` with, or without splitting (`split` parameter). +func can_merge_into(item_dst: InventoryItem, split: bool = false) -> bool: + return _StackManager.can_merge_stacks(item_dst, self, split) + + +## Checks if the item stack is compatible for merging with `item_dst`. +func compatible_with(item_dst: InventoryItem) -> bool: + return _StackManager.stacks_compatible(self, item_dst) + + +## Returns the free stack space in the item stack (maximum_stack_size - stack_size). +func get_free_stack_space() -> int: + return _StackManager.get_free_stack_space(self).count + + +## Splits the item stack into two and returns a reference to the new stack. `new_stack_size` defines the size of the new +## stack. Returns `null` if the split cannot be performed. +func split(new_stack_size: int) -> InventoryItem: + return _StackManager.split_stack(self, _ItemCount.new(new_stack_size)) + - return title +## Checks if the item stack can be split using the given new stack size. +func can_split(new_stack_size: int) -> bool: + return _StackManager.can_split_stack(self, _ItemCount.new(new_stack_size)) diff --git a/addons/gloot/core/inventory_item.gd.uid b/addons/gloot/core/inventory_item.gd.uid new file mode 100644 index 0000000..a79bb3e --- /dev/null +++ b/addons/gloot/core/inventory_item.gd.uid @@ -0,0 +1 @@ +uid://ck2rwh6t6ek8p diff --git a/addons/gloot/core/inventory_stacked.gd b/addons/gloot/core/inventory_stacked.gd deleted file mode 100644 index cca608f..0000000 --- a/addons/gloot/core/inventory_stacked.gd +++ /dev/null @@ -1,100 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_stacked.svg") -extends Inventory -class_name InventoryStacked - -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") - -signal capacity_changed -signal occupied_space_changed - -@export var capacity: float : - get: - if _constraint_manager == null: - return 0.0 - if _constraint_manager.get_weight_constraint() == null: - return 0.0 - return _constraint_manager.get_weight_constraint().capacity - set(new_capacity): - _constraint_manager.get_weight_constraint().capacity = new_capacity -var occupied_space: float : - get: - if _constraint_manager == null: - return 0.0 - if _constraint_manager.get_weight_constraint() == null: - return 0.0 - return _constraint_manager.get_weight_constraint().occupied_space - set(new_occupied_space): - assert(false, "occupied_space is read-only!") - - -func _init() -> void: - super._init() - _constraint_manager.enable_weight_constraint() - _constraint_manager.enable_stacks_constraint() - _constraint_manager.get_weight_constraint().capacity_changed.connect(func(): capacity_changed.emit()) - _constraint_manager.get_weight_constraint().occupied_space_changed.connect(func(): occupied_space_changed.emit()) - - -func has_unlimited_capacity() -> bool: - return _constraint_manager.get_weight_constraint().has_unlimited_capacity() - - -func get_free_space() -> float: - return _constraint_manager.get_weight_constraint().get_free_space() - - -func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) - - -func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) - - -func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) - - -static func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return StacksConstraint.join_stacks(item_dst, item_src) - - -static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) - - -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: - return StacksConstraint.set_item_stack_size(item, new_stack_size) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) - - -static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_max_stack_size(item, new_stack_size) - - -func get_prototype_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_stack_size(item_protoset, prototype_id) - - -func get_prototype_max_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_max_stack_size(item_protoset, prototype_id) - - -func transfer_autosplit(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplit(item, destination) != null - - -func transfer_automerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) - - -func transfer_autosplitmerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) - - -static func pack(item: InventoryItem) -> void: - return StacksConstraint.pack_item(item) diff --git a/addons/gloot/core/item_count.gd b/addons/gloot/core/item_count.gd index 4e3493c..a8e7163 100644 --- a/addons/gloot/core/item_count.gd +++ b/addons/gloot/core/item_count.gd @@ -1,8 +1,9 @@ -class_name ItemCount +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") const Inf: int = -1 -@export var count: int = 0 : +## The item count as an integer (-1 equals infinity). +@export var count: int = 0: set(new_count): if new_count < 0: new_count = -1 @@ -15,11 +16,13 @@ func _init(count_: int = 0) -> void: count = count_ +## Checks if the count is infinite. func is_inf() -> bool: return count < 0 -func add(item_count_: ItemCount) -> ItemCount: +## Adds the given _ItemCount to the current one and returns the result. +func add(item_count_: _ItemCount) -> _ItemCount: if item_count_.is_inf(): count = Inf elif !self.is_inf(): @@ -28,7 +31,19 @@ func add(item_count_: ItemCount) -> ItemCount: return self -func mul(item_count_: ItemCount) -> ItemCount: +## Subtracts the given _ItemCount from the current one and returns the result. +func sub(item_count_: _ItemCount) -> _ItemCount: + assert(!item_count_.gt(self), "Can't subtract a count greater than self!") + if item_count_.is_inf(): + count = 0 + elif !self.is_inf(): + count -= item_count_.count + + return self + + +## Multiplies the given _ItemCount with the current one and returns the result. +func mul(item_count_: _ItemCount) -> _ItemCount: if (count == 0): return self if item_count_.is_inf(): @@ -44,7 +59,8 @@ func mul(item_count_: ItemCount) -> ItemCount: return self -func div(item_count_: ItemCount) -> ItemCount: +## Divides the current _ItemCount with the given one and returns the result. +func div(item_count_: _ItemCount) -> _ItemCount: assert(item_count_.count > 0 || item_count_.is_inf(), "Can't devide by zero!") if (count == 0): return self @@ -61,15 +77,17 @@ func div(item_count_: ItemCount) -> ItemCount: return self -func eq(item_count_: ItemCount) -> bool: +## Check if the item count is equal with the given item count. +func eq(item_count_: _ItemCount) -> bool: return item_count_.count == count -func less(item_count_: ItemCount) -> bool: +## Check if the item count is less than the given item count. +func lt(item_count_: _ItemCount) -> bool: if item_count_.is_inf(): if self.is_inf(): return false - return true + return true if self.is_inf(): return false @@ -77,15 +95,17 @@ func less(item_count_: ItemCount) -> bool: return count < item_count_.count -func le(item_count_: ItemCount) -> bool: - return self.less(item_count_) || self.eq(item_count_) +## Check if the item count is less or equal than the given item count. +func le(item_count_: _ItemCount) -> bool: + return self.lt(item_count_) || self.eq(item_count_) -func gt(item_count_: ItemCount) -> bool: +## Check if the item count is greater than the given item count. +func gt(item_count_: _ItemCount) -> bool: if item_count_.is_inf(): if self.is_inf(): return false - return false + return false if self.is_inf(): return true @@ -93,22 +113,37 @@ func gt(item_count_: ItemCount) -> bool: return count > item_count_.count -func ge(item_count_: ItemCount) -> bool: +## Check if the item count is greater or equal than the given item count. +func ge(item_count_: _ItemCount) -> bool: return self.gt(item_count_) || self.eq(item_count_) -static func min(item_count_l: ItemCount, item_count_r: ItemCount) -> ItemCount: - if item_count_l.less(item_count_r): +## Returns the smaller item count out of the two. +static func min(item_count_l: _ItemCount, item_count_r: _ItemCount) -> _ItemCount: + if item_count_l.lt(item_count_r): return item_count_l return item_count_r -static func inf() -> ItemCount: - return ItemCount.new(Inf) +## Returns an infinite item count. +static func inf() -> _ItemCount: + return _ItemCount.new(Inf) + + +## Returns an item count if 0. +static func zero() -> _ItemCount: + return _ItemCount.new(0) -static func zero() -> ItemCount: - return ItemCount.new(0) +## Returns an item count if 1. +static func one() -> _ItemCount: + return _ItemCount.new(1) + + +func _to_string() -> String: + if self.is_inf(): + return "INF" + return str(count) # TODO: Implement max() diff --git a/addons/gloot/core/item_count.gd.uid b/addons/gloot/core/item_count.gd.uid new file mode 100644 index 0000000..5aacf7f --- /dev/null +++ b/addons/gloot/core/item_count.gd.uid @@ -0,0 +1 @@ +uid://b06sm2con2bxy diff --git a/addons/gloot/core/item_protoset.gd b/addons/gloot/core/item_protoset.gd deleted file mode 100644 index 86e9f85..0000000 --- a/addons/gloot/core/item_protoset.gd +++ /dev/null @@ -1,162 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_protoset.svg") -class_name ItemProtoset -extends Resource - -const Utils = preload("res://addons/gloot/core/utils.gd") - -const KEY_ID: String = "id" - -@export_multiline var json_data: String : - set(new_json_data): - json_data = new_json_data - if !json_data.is_empty(): - parse(json_data) - _save() - -var _prototypes: Dictionary = {} : - set(new_prototypes): - _prototypes = new_prototypes - _update_json_data() - _save() - - -func parse(json: String) -> void: - _prototypes.clear() - - var test_json_conv: JSON = JSON.new() - assert(test_json_conv.parse(json) == OK, "Failed to parse JSON!") - var parse_result = test_json_conv.data - assert(parse_result is Array, "JSON file must contain an array!") - - for prototype in parse_result: - assert(prototype is Dictionary, "Item prototype must be a dictionary!") - assert(prototype.has(KEY_ID), "Item prototype must have an '%s' property!" % KEY_ID) - assert(prototype[KEY_ID] is String, "'%s' property must be a string!" % KEY_ID) - - var id = prototype[KEY_ID] - assert(!_prototypes.has(id), "Item prototype ID '%s' already in use!" % id) - _prototypes[id] = prototype - _unstringify_prototype(_prototypes[id]) - - -func _to_json() -> String: - var result: Array[Dictionary] - for prototype_id in _prototypes.keys(): - result.append(get_prototype(prototype_id)) - - for prototype in result: - _stringify_prototype(prototype) - - var indent = "\t" - if ProjectSettings.get_setting("gloot/JSON_serialization/indent_using_spaces", true): - indent = "" - for i in ProjectSettings.get_setting("gloot/JSON_serialization/indent_size", 4): - indent += " " - - return JSON.stringify( - result, - indent, - ProjectSettings.get_setting("gloot/JSON_serialization/sort_keys", true), - ProjectSettings.get_setting("gloot/JSON_serialization/full_precision", false), - ) - - -func _stringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if (type != TYPE_STRING) and (type != TYPE_FLOAT): - prototype[key] = var_to_str(prototype[key]) - - -func _unstringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if type == TYPE_STRING: - var variant = Utils.str_to_var(prototype[key]) - if variant != null: - prototype[key] = variant - - -func _update_json_data() -> void: - json_data = _to_json() - - -func _save() -> void: - if !Engine.is_editor_hint(): - return - emit_changed() - if !resource_path.is_empty(): - ResourceSaver.save(self) - - -func get_prototype(id: StringName) -> Variant: - assert(has_prototype(id), "No prototype with ID: %s" % id) - return _prototypes[id] - - -func add_prototype(id: String) -> void: - assert(!has_prototype(id), "Prototype with ID already exists") - _prototypes[id] = {KEY_ID: id} - _update_json_data() - _save() - - -func remove_prototype(id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - _prototypes.erase(id) - _update_json_data() - _save() - - -func duplicate_prototype(id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - var new_id = "%s_duplicate" % id - var new_dict = _prototypes[id].duplicate() - new_dict[KEY_ID] = new_id - _prototypes[new_id] = new_dict - _update_json_data() - _save() - - -func rename_prototype(id: String, new_id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - assert(!has_prototype(new_id), "Prototype with ID already exists") - add_prototype(new_id) - _prototypes[new_id] = _prototypes[id].duplicate() - _prototypes[new_id][KEY_ID] = new_id - remove_prototype(id) - _update_json_data() - _save() - - -func set_prototype_properties(id: String, new_properties: Dictionary) -> void: - _prototypes[id] = new_properties - _update_json_data() - _save() - - -func has_prototype(id: String) -> bool: - return _prototypes.has(id) - - -func set_prototype_property(id: String, property_name: String, value) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - var prototype = get_prototype(id) - prototype[property_name] = value - - -func get_prototype_property(id: String, property_name: String, default_value = null) -> Variant: - if has_prototype(id): - var prototype = get_prototype(id) - if !prototype.is_empty() && prototype.has(property_name): - return prototype[property_name] - - return default_value - - -func prototype_has_property(id: String, property_name: String) -> bool: - if has_prototype(id): - return get_prototype(id).has(property_name) - - return false diff --git a/addons/gloot/core/item_ref_slot.gd b/addons/gloot/core/item_ref_slot.gd deleted file mode 100644 index e83f6d8..0000000 --- a/addons/gloot/core/item_ref_slot.gd +++ /dev/null @@ -1,186 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_ref_slot.svg") -class_name ItemRefSlot -extends "res://addons/gloot/core/item_slot_base.gd" - -signal inventory_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const KEY_ITEM_INDEX: String = "item_index" -const EMPTY_SLOT = -1 - -@export var inventory_path: NodePath : - set(new_inv_path): - if inventory_path == new_inv_path: - return - inventory_path = new_inv_path - update_configuration_warnings() - _set_inventory_from_path(inventory_path) - -var _wr_item: WeakRef = weakref(null) -var _wr_inventory: WeakRef = weakref(null) -@export var _equipped_item: int = EMPTY_SLOT : set = _set_equipped_item_index -var inventory: Inventory = null : - get = _get_inventory, set = _set_inventory - - -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "Inventory path not set! Inventory path needs to point to an inventory node, so " +\ - "items from that inventory can be equipped in the slot."]) - return PackedStringArray() - - -func _set_equipped_item_index(new_value: int) -> void: - _equipped_item = new_value - equip_by_index(new_value) - - -func _ready() -> void: - _set_inventory_from_path(inventory_path) - equip_by_index(_equipped_item) - - -func _set_inventory_from_path(path: NodePath) -> bool: - if path.is_empty(): - return false - - var node: Node = null - - if is_inside_tree(): - node = get_node_or_null(inventory_path) - - if node == null || !(node is Inventory): - return false - - clear() - _set_inventory(node) - return true - - -func _set_inventory(inventory: Inventory) -> void: - if inventory == _wr_inventory.get_ref(): - return - - if _get_inventory() != null: - _disconnect_inventory_signals() - - clear() - _wr_inventory = weakref(inventory) - inventory_changed.emit() - - if _get_inventory() != null: - _connect_inventory_signals() - - -func _connect_inventory_signals() -> void: - if _get_inventory() == null: - return - - if !_get_inventory().item_removed.is_connected(_on_item_removed): - _get_inventory().item_removed.connect(_on_item_removed) - - -func _disconnect_inventory_signals() -> void: - if _get_inventory() == null: - return - - if _get_inventory().item_removed.is_connected(_on_item_removed): - _get_inventory().item_removed.disconnect(_on_item_removed) - - -func _on_item_removed(item: InventoryItem) -> void: - clear() - - -func _get_inventory() -> Inventory: - return _wr_inventory.get_ref() - - -func equip(item: InventoryItem) -> bool: - if !can_hold_item(item): - return false - - if _wr_item.get_ref() == item: - return false - - if get_item() != null && !clear(): - return false - - _wr_item = weakref(item) - _equipped_item = _get_inventory().get_item_index(item) - item_equipped.emit() - return true - - -func equip_by_index(index: int) -> bool: - if _get_inventory() == null: - return false - if index < 0: - return false - if index >= _get_inventory().get_item_count(): - return false - return equip(_get_inventory().get_items()[index]) - - -func clear() -> bool: - if get_item() == null: - return false - - _wr_item = weakref(null) - _equipped_item = EMPTY_SLOT - cleared.emit() - return true - - -func get_item() -> InventoryItem: - return _wr_item.get_ref() - - -func can_hold_item(item: InventoryItem) -> bool: - if item == null: - return false - - if _get_inventory() == null || !_get_inventory().has_item(item): - return false - - return true - - -func reset() -> void: - clear() - - -func serialize() -> Dictionary: - var result: Dictionary = {} - var item : InventoryItem = _wr_item.get_ref() - - if item != null && item.get_inventory() != null: - result[KEY_ITEM_INDEX] = item.get_inventory().get_item_index(item) - - return result - - -func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_ITEM_INDEX, [TYPE_INT, TYPE_FLOAT]): - return false - - reset() - - if source.has(KEY_ITEM_INDEX): - var item_index: int = source[KEY_ITEM_INDEX] - if !_equip_item_with_index(item_index): - return false - - return true - - -func _equip_item_with_index(item_index: int) -> bool: - if _get_inventory() == null: - return false - if item_index >= _get_inventory().get_item_count(): - return false - equip(_get_inventory().get_items()[item_index]) - return true - diff --git a/addons/gloot/core/item_slot.gd b/addons/gloot/core/item_slot.gd index e780217..f264e6f 100644 --- a/addons/gloot/core/item_slot.gd +++ b/addons/gloot/core/item_slot.gd @@ -1,130 +1,140 @@ @tool @icon("res://addons/gloot/images/icon_item_slot.svg") class_name ItemSlot -extends "res://addons/gloot/core/item_slot_base.gd" - -signal protoset_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const KEY_ITEM: String = "item" - -@export var item_protoset: ItemProtoset: - set(new_item_protoset): - if new_item_protoset == item_protoset: +extends Node +## An item slot that can hold an inventory item. +## +## An item slot that can hold an inventory item. + +signal protoset_changed ## Emitted when the protoset property has been changed. +signal item_equipped ## Emitted when an item is placed in the slot. +signal cleared ## Emitted when the slot is cleared.Emitted when the slot is cleared. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _KEY_ITEM: String = "item" + +## A JSON resource containing prototype information. +@export var protoset: JSON: + set(new_protoset): + if new_protoset == protoset: return - if _item: - _item = null - item_protoset = new_item_protoset + protoset = new_protoset + if is_instance_valid(_inventory): + _inventory.protoset = protoset protoset_changed.emit() update_configuration_warnings() -@export var remember_source_inventory: bool = true +var _inventory: Inventory = null: + set(new_inventory): + if new_inventory == _inventory: + return + _disconnect_inventory_signals() + _inventory = new_inventory + _connect_inventory_signals() + + +func _connect_inventory_signals() -> void: + if !is_instance_valid(_inventory): + return + _inventory.item_added.connect(_on_item_added) + _inventory.item_removed.connect(_on_item_removed) -var _wr_source_inventory: WeakRef = weakref(null) -var _item: InventoryItem + +func _disconnect_inventory_signals() -> void: + if !is_instance_valid(_inventory): + return + _inventory.item_added.disconnect(_on_item_added) + _inventory.item_removed.disconnect(_on_item_removed) + + +func _init() -> void: + _inventory = Inventory.new() + _inventory.protoset = protoset + var item_count_constraint := ItemCountConstraint.new() + _inventory.add_child(item_count_constraint) + add_child(_inventory) + + +func _on_item_added(item: InventoryItem) -> void: + item_equipped.emit() + + +func _on_item_removed(item: InventoryItem) -> void: + cleared.emit() func _get_configuration_warnings() -> PackedStringArray: - if item_protoset == null: + if protoset == null: return PackedStringArray([ - "This item slot has no protoset. Set the 'item_protoset' field to be able to equip items."]) + "This item slot has no protoset. Set the 'protoset' field to be able to equip items."]) return PackedStringArray() +## Equips the given inventory item in the slot. If the slot already contains an item, clear() will be called first. +## Returns false if the clear call fails, the slot can't hold the given item, or already holds the given item. Returns +## true otherwise. func equip(item: InventoryItem) -> bool: if !can_hold_item(item): return false - if item.get_parent() == self: - return false - if get_item() != null && !clear(): return false - _wr_source_inventory = weakref(item.get_inventory()) + if item.get_inventory() != null: + item.get_inventory().remove_item(item) - if item.get_parent(): - item.get_parent().remove_child(item) - - add_child(item) - if Engine.is_editor_hint(): - item.owner = get_tree().edited_scene_root + _inventory.add_item(item) return true -func _on_item_added(item: InventoryItem) -> void: - _item = item - item_equipped.emit() - - +## Clears the item slot. Returns false if there's no item in the slot. func clear() -> bool: - return _clear_impl(remember_source_inventory) - - -func _clear_impl(return_item: bool) -> bool: if get_item() == null: return false - if return_item && _return_item_to_source_inventory(): - return true - - remove_child(get_item()) + _inventory.clear() return true -func _return_item_to_source_inventory() -> bool: - var inventory: Inventory = (_wr_source_inventory.get_ref() as Inventory) - if inventory != null: - if inventory.add_item(get_item()): - return true - return false - - -func _on_item_removed() -> void: - _item = null - _wr_source_inventory = weakref(null) - cleared.emit() - - +## Returns the equipped item or `null` if there's no item in the slot. func get_item() -> InventoryItem: - return _item + if _inventory.get_item_count() == 0: + return null + return _inventory.get_items()[0] +## Checks if the slot can hold the given item, i.e. the slot uses the same protoset as the item and the item is not +## `null`. func can_hold_item(item: InventoryItem) -> bool: - assert(item_protoset != null, "Item protoset not set!") + assert(protoset != null, "Item protoset not set!") if item == null: return false - if item_protoset != item.protoset: + if protoset != item.protoset: return false return true -func reset() -> void: - if _item: - _item.queue_free() - _clear_impl(false) - - +## Serializes the item slot into a `Dictionary`. func serialize() -> Dictionary: var result: Dictionary = {} - if _item != null: - result[KEY_ITEM] = _item.serialize() + if get_item() != null: + result[_KEY_ITEM] = get_item().serialize() return result +## Loads the item slot data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_ITEM, [TYPE_DICTIONARY]): + if !_Verify.dict(source, false, _KEY_ITEM, [TYPE_DICTIONARY]): return false - reset() + clear() - if source.has(KEY_ITEM): + if source.has(_KEY_ITEM): var item := InventoryItem.new() - if !item.deserialize(source[KEY_ITEM]): + if !item.deserialize(source[_KEY_ITEM]): return false equip(item) return true - diff --git a/addons/gloot/core/item_slot.gd.uid b/addons/gloot/core/item_slot.gd.uid new file mode 100644 index 0000000..a09274d --- /dev/null +++ b/addons/gloot/core/item_slot.gd.uid @@ -0,0 +1 @@ +uid://dhlhquhwb0h0d diff --git a/addons/gloot/core/item_slot_base.gd b/addons/gloot/core/item_slot_base.gd deleted file mode 100644 index 0c9679e..0000000 --- a/addons/gloot/core/item_slot_base.gd +++ /dev/null @@ -1,42 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_slot.svg") -class_name ItemSlotBase -extends Node - -signal item_equipped -signal cleared - - -# Override this -func equip(item: InventoryItem) -> bool: - return false - - -# Override this -func clear() -> bool: - return false - - -# Override this -func get_item() -> InventoryItem: - return null - - -# Override this -func can_hold_item(item: InventoryItem) -> bool: - return false - - -# Override this -func reset() -> void: - pass - - -# Override this -func serialize() -> Dictionary: - return {} - - -# Override this -func deserialize(source: Dictionary) -> bool: - return false \ No newline at end of file diff --git a/addons/gloot/core/prototree/proto_tree.gd b/addons/gloot/core/prototree/proto_tree.gd new file mode 100644 index 0000000..8b4c205 --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree.gd @@ -0,0 +1,96 @@ +class_name ProtoTree +extends RefCounted +## A prototype tree (prototree). +## +## A tree structure of prototypes with a root prototype that can have a number of child prototypes. + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +var _root := Prototype.new("ROOT") + + +## Returns the root prototype. +func get_root() -> Prototype: + return _root + + +## Creates a child prototype for the root prototype. +func create_prototype(prototype_id: String) -> Prototype: + return _root.inherit(prototype_id) + + +## Returns the prototype with the given ID. +func get_prototype(prototype_id: String) -> Prototype: + return _root.get_derived_prototype(prototype_id) + + +## Returns an array of all child prototypes of the root. +func get_prototypes() -> Array: + return _root.get_derived_prototypes() + + +## Checks if the prototree contains the prototype with the given ID. +func has_prototype(prototype_id: String) -> bool: + return _root.is_inherited_by(prototype_id) + + +## Checks if the prototype with the given ID has the given property defined. +func prototype_has_property(prototype_id: String, property: String) -> bool: + if !has_prototype(prototype_id): + return false + return _root.get_derived_prototype(prototype_id).has_property(property) + + +## Returns the given property of the prototype with the given ID. If the prototype does not have the property defined, +## `default_value` is returned. +func get_prototype_property(prototype_id: String, property: String, default_value: Variant = null) -> Variant: + if has_prototype(prototype_id): + var prototype = get_prototype(prototype_id) + if prototype.has_property(property): + return prototype.get_property(property) + + return default_value + + +## Clears the prototree by clearing the roots properties and child prototypes. +func clear() -> void: + _root._clear() + + +## Checks if the prototree is empty (the root has no properties and no child prototypes). +func is_empty() -> bool: + return _root.get_properties().is_empty() && _root.get_derived_prototypes().is_empty() + + +## Parses the given JSON resource into a prototree. Returns `false` if parsing fails. +func deserialize(json: JSON) -> bool: + clear() + if !is_instance_valid(json): + return false + if json.data == null: + return false + if json.data.is_empty(): + return true + for prototype_id in json.data.keys(): + var base: Prototype = null + var prototype_dict = json.data[prototype_id] + if prototype_dict.has("inherits"): + base = _root.get_derived_prototype(prototype_dict["inherits"]) + else: + base = _root + + if base == null: + clear() + return false + var new_protototype = base.inherit(prototype_id) + assert(new_protototype) + for property in prototype_dict.keys(): + if typeof(prototype_dict[property]) == TYPE_STRING: + var value = _Utils.str_to_var(prototype_dict[property]) + if value == null: + new_protototype.set_property(property, prototype_dict[property]) + else: + new_protototype.set_property(property, value) + else: + new_protototype.set_property(property, prototype_dict[property]) + return true diff --git a/addons/gloot/core/prototree/proto_tree.gd.uid b/addons/gloot/core/prototree/proto_tree.gd.uid new file mode 100644 index 0000000..23e5040 --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree.gd.uid @@ -0,0 +1 @@ +uid://sw487eanji4w diff --git a/addons/gloot/core/prototree/proto_tree_cache.gd b/addons/gloot/core/prototree/proto_tree_cache.gd new file mode 100644 index 0000000..02485eb --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree_cache.gd @@ -0,0 +1,22 @@ +@tool + +static var _cache: Dictionary = {} +static var _empty: ProtoTree = ProtoTree.new() + + +static func get_cached(key: JSON) -> ProtoTree: + if Engine.is_editor_hint(): + var result := ProtoTree.new() + result.deserialize(key) + return result + + if _cache.has(key): + return _cache[key] + else: + _cache[key] = ProtoTree.new() + _cache[key].deserialize(key) + return _cache[key] + + +static func get_empty() -> ProtoTree: + return _empty diff --git a/addons/gloot/core/prototree/proto_tree_cache.gd.uid b/addons/gloot/core/prototree/proto_tree_cache.gd.uid new file mode 100644 index 0000000..0798d7d --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree_cache.gd.uid @@ -0,0 +1 @@ +uid://bqgnjnqjte3f diff --git a/addons/gloot/core/prototree/prototype.gd b/addons/gloot/core/prototree/prototype.gd new file mode 100644 index 0000000..9bac966 --- /dev/null +++ b/addons/gloot/core/prototree/prototype.gd @@ -0,0 +1,156 @@ +class_name Prototype +extends RefCounted +## An item prototype. +## +## An item prototype contains a set of properties and is identified with an ID string. It can also contain other "child" +## prototypes as part of a prototype tree (prototree). + +const _KEY_PROPERTIES = "properties" +const _KEY_PROTOTYPES = "prototypes" + +var _id: String +var _properties: Dictionary +var _parent: Prototype +var _prototypes: Dictionary + + +func _init(id: String) -> void: + _id = id + + +## Returns the prototype ID string. +func get_id() -> String: + return _id + + +## Checks if the prototype inherits the prototype with the given ID. +func inherits(prototype_id: String) -> bool: + var x = self + while x: + if x._id == prototype_id: + return true + x = x._parent + return false + + +func _defines_or_overrides_property(property: String) -> bool: + return _properties.has(property) + + +## Checks if the prototype inherits the given property. +func inherits_property(property: String) -> bool: + if is_instance_valid(_parent): + return _parent.has_property(property) + return false + + +## Checks if the prototype defines the given property. +func defines_property(property: String) -> bool: + return _defines_or_overrides_property(property) && !inherits_property(property) + + +## Checks if the prototype overrides the given property. +func overrides_property(property: String) -> bool: + return _defines_or_overrides_property(property) && inherits_property(property) + + +## Checks if the prototype has the given property (either by defining, inheriting or overriding it). +func has_property(property: String) -> bool: + if _defines_or_overrides_property(property): + return true + if is_instance_valid(_parent): + return _parent.has_property(property) + return false + + +## Returns the value of the given property. If the prototype does not have the property, `default_value` is returned. +func get_property(property: String, default_value: Variant = null) -> Variant: + if _properties.has(property): + return _properties[property] + if is_instance_valid(_parent): + return _parent.get_property(property) + return default_value + + +## Returns a `Dictionary` of all prototype properties (defined, inherited or overridden). +func get_properties() -> Dictionary: + var result := _properties.duplicate() + if !is_instance_valid(_parent): + return result + + result.merge(_parent.get_properties()) + return result + + +## Sets the given property for the prototype. +func set_property(property: String, value: Variant): + if get_property(property) == value: + return + _properties[property] = value + + +## Checks if the prototype contains the prototype with the given ID within the prototype tree. +func is_inherited_by(prototype_id: String) -> bool: + return _find_derived_prototype(prototype_id) != null + + +## Creates a child prototype with the given ID that inherits the prototype. +func inherit(prototype_id: String) -> Prototype: + # TODO: Consider using a prototype as input + assert(!is_inherited_by(prototype_id), "'%s' already inherits '%s'" % [prototype_id, _id]) + var new_prototype := Prototype.new(prototype_id) + new_prototype._parent = self + _prototypes[prototype_id] = new_prototype + return new_prototype + + +## Returns the derived prototype with the given ID. +func get_derived_prototype(prototype_id: String) -> Prototype: + assert(!prototype_id.is_empty(), "Invalid prototype ID (empty string)!") + var result := _find_derived_prototype(prototype_id) + assert(result != null, "Derived prototype not found: '%s'" % prototype_id) + return result + + +func _find_derived_prototype(prototype_id: String) -> Prototype: + if _prototypes.has(prototype_id): + return _prototypes[prototype_id] + for p in _prototypes: + var prototype: Prototype = _prototypes[p]._find_derived_prototype(prototype_id) + if is_instance_valid(prototype): + return prototype + return null + + +## Returns the ID of the prototype. +func get_prototype_id() -> String: + return _id + + +func _is_root() -> bool: + return !is_instance_valid(_parent) + + +## Returns an array of all derived prototypes. +func get_derived_prototypes() -> Array: + return _prototypes.values().duplicate() + + +## Removes the derived prototype with the given ID. +func remove_derived_prototype(prototype_id: String) -> void: + var prototype = get_derived_prototype(prototype_id) + var parent = prototype._parent + assert(parent != null, "Derived prototype has no parent!") + parent._prototypes.erase(prototype.get_id()) + + +func _get_root() -> Prototype: + var root = self + while is_instance_valid(root._parent): + root = root._parent + return root + + +func _clear() -> void: + _properties.clear() + _prototypes.clear() diff --git a/addons/gloot/core/prototree/prototype.gd.uid b/addons/gloot/core/prototree/prototype.gd.uid new file mode 100644 index 0000000..f5e5d64 --- /dev/null +++ b/addons/gloot/core/prototree/prototype.gd.uid @@ -0,0 +1 @@ +uid://dihy7hdpnvxgi diff --git a/addons/gloot/core/stack_manager.gd b/addons/gloot/core/stack_manager.gd new file mode 100644 index 0000000..ef2ee0b --- /dev/null +++ b/addons/gloot/core/stack_manager.gd @@ -0,0 +1,296 @@ +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") + +const _KEY_STACK_SIZE: String = "stack_size" +const _KEY_MAX_STACK_SIZE: String = "max_stack_size" + +const DEFAULT_STACK_SIZE: int = 1 +const DEFAULT_MAX_STACK_SIZE: int = 1 + + +static func get_item_stack_size(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + var stack_size: int = item.get_property(_KEY_STACK_SIZE, DEFAULT_STACK_SIZE) + return _ItemCount.new(stack_size) + + +static func get_item_max_stack_size(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + var max_stack_size: int = item.get_property(_KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) + return _ItemCount.new(max_stack_size) + + +static func set_item_stack_size(item: InventoryItem, stack_size: _ItemCount) -> bool: + assert(item != null, "item is null!") + assert(stack_size != null, "stack_size is null!") + if stack_size.gt(get_item_max_stack_size(item)): + return false + if stack_size.eq(_ItemCount.new(0)): + var inventory: Inventory = item.get_inventory() + if inventory != null: + inventory.remove_item(item) + item.set_property(_KEY_STACK_SIZE, stack_size.count) + return true + + +static func set_item_max_stack_size(item: InventoryItem, max_stack_size: _ItemCount) -> void: + assert(item != null, "item is null!") + assert(max_stack_size != null, "max_stack_size is null!") + item.set_property(_KEY_MAX_STACK_SIZE, max_stack_size.count) + + +static func get_prototype_stack_size(prototree: ProtoTree, prototype_id: String) -> _ItemCount: + assert(prototree != null, "prototree is null!") + var stack_size: int = prototree.get_prototype_property(prototype_id, _KEY_STACK_SIZE, DEFAULT_STACK_SIZE) + return _ItemCount.new(stack_size) + + +static func get_prototype_max_stack_size(prototree: ProtoTree, prototype_id: String) -> _ItemCount: + assert(prototree != null, "prototree is null!") + var max_stack_size: int = prototree.get_prototype_property(prototype_id, _KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) + return _ItemCount.new(max_stack_size) + + +static func stacks_compatible(item_1: InventoryItem, item_2: InventoryItem) -> bool: + # Two item stacks are compatible for merging if they have the same prototype and neither of the two contain + # overridden properties that the other one doesn't have (except for "stack_size", "max_stack_size"). + assert(item_1 != null, "item_1 is null!") + assert(item_2 != null, "item_2 is null!") + + var ignore_properies: Array[String] = [ + _KEY_STACK_SIZE, + _KEY_MAX_STACK_SIZE + ] + + if !item_1.get_prototype().get_prototype_id() == item_2.get_prototype().get_prototype_id(): + return false + + for property in item_1.get_overridden_properties(): + if property in ignore_properies: + continue + if !item_2.is_property_overridden(property) || item_2.get_property(property) != item_1.get_property(property): + return false + + for property in item_2.get_overridden_properties(): + if property in ignore_properies: + continue + if !item_1.is_property_overridden(property) || item_1.get_property(property) != item_2.get_property(property): + return false + + return true + + +static func merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _merge_stacks_split_source(item_dst, item_src) + return _merge_stacks(item_dst, item_src) + + +static func can_merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _can_merge_stacks_split_source(item_dst, item_src) + return _can_merge_stacks(item_dst, item_src) + + +static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + + if item_dst == item_src: + return false + + if !_can_merge_stacks(item_dst, item_src): + return false + + var src_size := get_item_stack_size(item_src) + set_item_stack_size(item_src, _ItemCount.zero()) + set_item_stack_size(item_dst, get_item_stack_size(item_dst).add(src_size)) + return true + + +static func _can_merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + if !stacks_compatible(item_dst, item_src): + return false + + var src_size: _ItemCount = get_item_stack_size(item_src) + var dst_size := get_item_stack_size(item_dst) + var free_dst_stack_space := get_free_stack_space(item_dst) + + if free_dst_stack_space.eq(_ItemCount.zero()): + return false + if src_size.gt(free_dst_stack_space): + return false + return true + + +static func _merge_stacks_split_source(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + + if !_can_merge_stacks_split_source(item_dst, item_src): + return false + if _merge_stacks(item_dst, item_src): + return true + + var free_dst_stack_space := get_free_stack_space(item_dst) + var new_stack := split_stack(item_src, free_dst_stack_space) + var success = _merge_stacks(item_dst, new_stack) + assert(success, "Failed to merge stacks!") + return true + + +static func _can_merge_stacks_split_source(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + if item_dst == item_src: + return false + if !stacks_compatible(item_dst, item_src): + return false + return !get_free_stack_space(item_dst).eq(_ItemCount.zero()) + + +static func get_free_stack_space(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + return get_item_max_stack_size(item).sub(get_item_stack_size(item)) + + +static func split_stack(item: InventoryItem, new_stack_size: _ItemCount) -> InventoryItem: + if !can_split_stack(item, new_stack_size): + return null + + var new_item := item.duplicate() + set_item_stack_size(item, get_item_stack_size(item).sub(new_stack_size)) + set_item_stack_size(new_item, new_stack_size) + return new_item + + +static func can_split_stack(item: InventoryItem, new_stack_size: _ItemCount) -> bool: + if get_item_stack_size(item).gt(new_stack_size): + return true + return false + + +static func inv_split_stack(inv: Inventory, item: InventoryItem, new_stack_size: _ItemCount) -> InventoryItem: + assert(inv.has_item(item), "Inventory must contain item!") + + var old_item_stack_size := get_item_stack_size(item) + var new_stack := split_stack(item, new_stack_size) + if new_stack == null: + return null + + if !inv.add_item(new_stack): + set_item_stack_size(item, old_item_stack_size) + return null + + return new_stack + + +static func inv_merge_stack(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _inv_merge_stack_split_source(inv, item_dst, item_src) + return _inv_merge_stack(inv, item_dst, item_src) + + +static func _inv_merge_stack(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(inv.has_item(item_dst), "Inventory must contain item_dst!") + + if !inv.has_item(item_src) && !inv.can_add_item(item_src): + return false + + if !merge_stacks(item_dst, item_src): + return false + + var inv_src := item_src.get_inventory() + if is_instance_valid(inv_src): + inv_src.remove_item(item_src) + return true + + +static func _inv_merge_stack_split_source(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(inv.has_item(item_dst), "Inventory must contain item_dst!") + + if !stacks_compatible(item_dst, item_src): + return false + + # item_dst and item_src are in the same inventory + if inv.has_item(item_src): + return merge_stacks(item_dst, item_src, true) + + # item_dst and item_src are in different inventories + if inv._constraint_manager.has_space_for(item_src): + _merge_stacks_split_source(item_dst, item_src) + return true + + var receivable_stack_size := _ItemCount.min(get_free_stack_space(item_dst), inv._constraint_manager.get_space_for(item_src)) + if receivable_stack_size.eq(_ItemCount.zero()): + return false + var src_stack_size := get_item_stack_size(item_src) + if receivable_stack_size.ge(src_stack_size): + # No splitting of item_src is needed + var success = _inv_merge_stack(inv, item_dst, item_src) + assert(success, "Failed to merge stacks!") + return true + + # Need to split item_src + var partial_stack := split_stack(item_src, receivable_stack_size) + assert(partial_stack != null) + var success = merge_stacks(item_dst, partial_stack) + assert(success, "Failed to merge stacks!") + return true + + +static func inv_add_automerge(inv: Inventory, item: InventoryItem) -> bool: + assert(!inv.has_item(item), "Inventory must not contain item!") + + if !inv._constraint_manager.has_space_for(item): + return false + var success = inv.add_item(item) + assert(success, "Failed to add item!") + inv_pack_stack(inv, item) + return true + + +static func inv_add_autosplit(inv: Inventory, item: InventoryItem) -> bool: + if inv.add_item(item): + return true + + var space_for_item := inv._constraint_manager.get_space_for(item) + if space_for_item.eq(_ItemCount.zero()): + return false + + var new_stack := split_stack(item, space_for_item) + assert(new_stack) + var success = inv.add_item(new_stack) + assert(success, "Failed to add item!") + return true + + +static func inv_add_autosplitmerge(inv: Inventory, item: InventoryItem) -> bool: + assert(!inv.has_item(item), "Inventory must not contain item!") + + if inv._constraint_manager.has_space_for(item): + inv.add_item(item) + inv_pack_stack(inv, item) + return true + + if !_inv_has_space_for_single_item(inv, item): + return false + + for i in inv.get_items(): + _merge_stacks_split_source(i, item) + if get_item_stack_size(item).eq(_ItemCount.zero()): + return true + inv.add_item(item) + return true + + +static func _inv_has_space_for_single_item(inv: Inventory, item: InventoryItem) -> bool: + var test_item := item.duplicate() + set_item_stack_size(test_item, _ItemCount.one()) + return inv._constraint_manager.has_space_for(test_item) + + +static func inv_pack_stack(inv: Inventory, item: InventoryItem) -> void: + for mergable_item in inv.get_items(): + if !can_merge_stacks(mergable_item, item, true): + continue + merge_stacks(mergable_item, item, true) diff --git a/addons/gloot/core/stack_manager.gd.uid b/addons/gloot/core/stack_manager.gd.uid new file mode 100644 index 0000000..d844ab8 --- /dev/null +++ b/addons/gloot/core/stack_manager.gd.uid @@ -0,0 +1 @@ +uid://b7wnv2qfxvu8o diff --git a/addons/gloot/core/utils.gd b/addons/gloot/core/utils.gd index a4294ea..95a8b3e 100644 --- a/addons/gloot/core/utils.gd +++ b/addons/gloot/core/utils.gd @@ -1,7 +1,16 @@ +static func safe_connect(s: Signal, c: Callable) -> void: + if !s.is_connected(c): + s.connect(c) + + +static func safe_disconnect(s: Signal, c: Callable) -> void: + if s.is_connected(c): + s.disconnect(c) + static func str_to_var(s: String) -> Variant: var variant = str_to_var(s) - # str_to_var considers all strings that start with a digit convertable to + # str_to_var considers all strings that start with a digit convertible to # int/float (which is not consistent with String.is_valid_int and # String.is_valid_float). if typeof(variant) == TYPE_INT && !s.is_valid_int(): @@ -9,3 +18,21 @@ static func str_to_var(s: String) -> Variant: if typeof(variant) == TYPE_FLOAT && !s.is_valid_float(): variant = null return variant + + +static func array_union(a: Array, b: Array) -> Array: + var result: Array = a.duplicate() + for x in b: + if not x in result: + result.push_back(x) + return result + + +static func _deserialize_protoset(data: String) -> JSON: + assert(!data.is_empty(), "Invalid protoset data (empty string)!") + if data.begins_with("res://"): + return load(data) + else: + var prototree := JSON.new() + prototree.parse(data) + return prototree diff --git a/addons/gloot/core/utils.gd.uid b/addons/gloot/core/utils.gd.uid new file mode 100644 index 0000000..3c8f0f3 --- /dev/null +++ b/addons/gloot/core/utils.gd.uid @@ -0,0 +1 @@ +uid://cl86i2lo5k6s diff --git a/addons/gloot/core/verify.gd b/addons/gloot/core/verify.gd index db6679d..446a446 100644 --- a/addons/gloot/core/verify.gd +++ b/addons/gloot/core/verify.gd @@ -1,4 +1,3 @@ - const type_names: Array = [ "null", "bool", @@ -79,7 +78,7 @@ static func create_var(type: int): return Basis() TYPE_TRANSFORM3D: return Transform3D() - TYPE_PROJECTION : + TYPE_PROJECTION: return Projection() TYPE_COLOR: return Color() diff --git a/addons/gloot/core/verify.gd.uid b/addons/gloot/core/verify.gd.uid new file mode 100644 index 0000000..631e9f0 --- /dev/null +++ b/addons/gloot/core/verify.gd.uid @@ -0,0 +1 @@ +uid://br7rpdsj2gwtr diff --git a/addons/gloot/editor/README.md b/addons/gloot/editor/README.md new file mode 100644 index 0000000..cb13d88 --- /dev/null +++ b/addons/gloot/editor/README.md @@ -0,0 +1,17 @@ +# Editor Directory Contents + +## Directories + +| Directory | Description | +| ------------------ | ----------- | +| `common` | Editor functionality commonly used by the rest of the editor-related code. | +| `inventory_editor` | Inventory editor implementation. | +| `item_editor` | Item editor implementation. | +| `item_slot_editor` | Slot editor implementation. | + +## Files + +| Directory | Description | +| -------------------------------- | ----------- | +| `inventory_inspector_plugin.gd` | GLoot `EditorInspectorPlugin` class implementation. | +| `undoables.gd` | Helper script for executing undoable operations in the editor. | \ No newline at end of file diff --git a/addons/gloot/editor/common/choice_filter.gd b/addons/gloot/editor/common/choice_filter.gd deleted file mode 100644 index 77d51a6..0000000 --- a/addons/gloot/editor/common/choice_filter.gd +++ /dev/null @@ -1,129 +0,0 @@ -@tool -extends Control - -signal choice_picked(value_index) -signal choice_selected(value_index) - - -@onready var lbl_filter: Label = $HBoxContainer/Label -@onready var line_edit: LineEdit = $HBoxContainer/LineEdit -@onready var item_list: ItemList = $ItemList -@onready var btn_pick: Button = $Button -@export var pick_button_visible: bool = true : - set(new_pick_button_visible): - pick_button_visible = new_pick_button_visible - if btn_pick: - btn_pick.visible = pick_button_visible -@export var pick_text: String : - set(new_pick_text): - pick_text = new_pick_text - if btn_pick: - btn_pick.text = pick_text -@export var pick_icon: Texture2D : - set(new_pick_icon): - pick_icon = new_pick_icon - if btn_pick: - btn_pick.icon = pick_icon -@export var filter_text: String = "Filter:" : - set(new_filter_text): - filter_text = new_filter_text - if lbl_filter: - lbl_filter.text = filter_text -@export var filter_icon: Texture2D : - set(new_filter_icon): - filter_icon = new_filter_icon - if line_edit: - line_edit.right_icon = filter_icon -@export var values: Array[String] - - -func refresh() -> void: - _clear() - _populate() - - -func _clear() -> void: - if item_list: - item_list.clear() - - -func _populate() -> void: - if line_edit == null || item_list == null: - return - - if values == null || values.size() == 0: - return - - for value_index in range(values.size()): - var value = values[value_index] - assert(value is String, "values must be an array of strings!") - - if !line_edit.text.is_empty() && !(line_edit.text.to_lower() in value.to_lower()): - continue - - item_list.add_item(value) - item_list.set_item_metadata(item_list.get_item_count() - 1, value_index) - - -func _ready() -> void: - btn_pick.pressed.connect(_on_btn_pick) - line_edit.text_changed.connect(_on_filter_text_changed) - item_list.item_activated.connect(_on_item_activated) - item_list.item_selected.connect(_on_item_selected) - refresh() - if btn_pick: - btn_pick.text = pick_text - btn_pick.icon = pick_icon - btn_pick.visible = pick_button_visible - if lbl_filter: - lbl_filter.text = filter_text - if line_edit: - line_edit.right_icon = filter_icon - - -func _on_btn_pick() -> void: - var selected_items: PackedInt32Array = item_list.get_selected_items() - if selected_items.size() == 0: - return - - var selected_item = selected_items[0] - var selected_value_index = item_list.get_item_metadata(selected_item) - choice_picked.emit(selected_value_index) - - -func _on_filter_text_changed(_new_text: String) -> void: - refresh() - - -func _on_item_activated(index: int) -> void: - var selected_value_index = item_list.get_item_metadata(index) - choice_picked.emit(selected_value_index) - - -func _on_item_selected(index: int) -> void: - var selected_value_index = item_list.get_item_metadata(index) - choice_selected.emit(selected_value_index) - - -func get_selected_item() -> int: - var selected := item_list.get_selected_items() - if selected.size() > 0: - return item_list.get_item_metadata(selected[0]) - return -1 - - -func get_selected_text() -> String: - var selected := get_selected_item() - if selected >= 0: - return values[selected] - - return "" - - -func set_values(new_values: Array) -> void: - values.clear() - for new_value in new_values: - if typeof(new_value) == TYPE_STRING: - values.push_back(new_value) - - refresh() diff --git a/addons/gloot/editor/common/choice_filter.tscn b/addons/gloot/editor/common/choice_filter.tscn deleted file mode 100644 index 561f8bb..0000000 --- a/addons/gloot/editor/common/choice_filter.tscn +++ /dev/null @@ -1,31 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dj577duf8yjeb"] - -[ext_resource type="Script" path="res://addons/gloot/editor/common/choice_filter.gd" id="1"] - -[node name="ChoiceFilter" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1") - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Label" type="Label" parent="HBoxContainer"] -layout_mode = 2 -text = "Filter:" - -[node name="LineEdit" type="LineEdit" parent="HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -clear_button_enabled = true - -[node name="ItemList" type="ItemList" parent="."] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Button" type="Button" parent="."] -layout_mode = 2 diff --git a/addons/gloot/editor/common/choice_filter_test.tscn b/addons/gloot/editor/common/choice_filter_test.tscn deleted file mode 100644 index 062709d..0000000 --- a/addons/gloot/editor/common/choice_filter_test.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://rfjw5a8ppj1b"] - -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] - -[node name="Control" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="ChoiceFilter" parent="." instance=ExtResource("1")] -layout_mode = 0 -anchors_preset = 0 -anchor_right = 0.0 -anchor_bottom = 0.0 -offset_right = 217.0 -offset_bottom = 267.0 -pick_text = "Pick" -values = Array[String](["foo", "bar", "baz"]) diff --git a/addons/gloot/editor/common/dict_editor.gd b/addons/gloot/editor/common/dict_editor.gd index 3801161..f1bbbee 100644 --- a/addons/gloot/editor/common/dict_editor.gd +++ b/addons/gloot/editor/common/dict_editor.gd @@ -1,12 +1,12 @@ @tool extends Control -signal value_changed(key, value) -signal value_removed(key) +signal value_changed(key: String, value: Variant) +signal value_removed(key: String) -const Verify = preload("res://addons/gloot/core/verify.gd") -const ValueEditor = preload("res://addons/gloot/editor/common/value_editor.gd") -const supported_types: Array[int] = [ +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _ValueEditor = preload("res://addons/gloot/editor/common/value_editor.gd") +const _supported_types: Array[int] = [ TYPE_BOOL, TYPE_INT, TYPE_FLOAT, @@ -32,23 +32,23 @@ const supported_types: Array[int] = [ @onready var opt_type = $VBoxContainer/HBoxContainer/OptType @onready var btn_add = $VBoxContainer/HBoxContainer/BtnAdd -@export var dictionary: Dictionary : +@export var dictionary: Dictionary: set(new_dictionary): dictionary = new_dictionary refresh() -@export var color_map: Dictionary : +@export var color_map: Dictionary: set(new_color_map): color_map = new_color_map refresh() -@export var remove_button_map: Dictionary : +@export var remove_button_map: Dictionary: set(new_remove_button_map): remove_button_map = new_remove_button_map refresh() -@export var immutable_keys: Array[String] : +@export var immutable_keys: Array[String]: set(new_immutable_keys): immutable_keys = new_immutable_keys refresh() -@export var default_color: Color = Color.WHITE : +@export var default_color: Color = Color.WHITE: set(new_default_color): default_color = new_default_color refresh() @@ -75,7 +75,7 @@ func _on_text_entered(_new_text: String) -> void: func _add_dict_field(name: String, type: int) -> bool: if (name.is_empty() || type < 0 || dictionary.has(name)): return false - dictionary[name] = Verify.create_var(type) + dictionary[name] = _Verify.create_var(type) return true @@ -92,9 +92,9 @@ func refresh() -> void: func _refresh_add_property() -> void: - for type in supported_types: - opt_type.add_item(Verify.type_names[type], type) - opt_type.select(supported_types.find(TYPE_STRING)) + for type in _supported_types: + opt_type.add_item(_Verify.type_names[type], type) + opt_type.select(_supported_types.find(TYPE_STRING)) func _clear() -> void: @@ -122,7 +122,7 @@ func _add_key(key: String, color: Color) -> void: var value = dictionary[key] _add_label(key, color) - _add_label(Verify.type_names[typeof(dictionary[key])], color) + _add_label(_Verify.type_names[typeof(dictionary[key])], color) _add_value_editor(key) _add_remove_button(key) @@ -136,7 +136,7 @@ func _add_label(key: String, color: Color) -> void: func _add_value_editor(key: String) -> void: - var value_editor: Control = ValueEditor.new() + var value_editor: Control = _ValueEditor.new() value_editor.value = dictionary[key] value_editor.size_flags_horizontal = SIZE_EXPAND_FILL value_editor.enabled = (not key in immutable_keys) diff --git a/addons/gloot/editor/common/dict_editor.gd.uid b/addons/gloot/editor/common/dict_editor.gd.uid new file mode 100644 index 0000000..d63c570 --- /dev/null +++ b/addons/gloot/editor/common/dict_editor.gd.uid @@ -0,0 +1 @@ +uid://bj07u7wpynpva diff --git a/addons/gloot/editor/common/dict_editor.tscn b/addons/gloot/editor/common/dict_editor.tscn index f43fc71..c06b05c 100644 --- a/addons/gloot/editor/common/dict_editor.tscn +++ b/addons/gloot/editor/common/dict_editor.tscn @@ -62,8 +62,8 @@ size_flags_horizontal = 3 [node name="OptType" type="OptionButton" parent="VBoxContainer/HBoxContainer"] layout_mode = 2 -item_count = 14 selected = 3 +item_count = 14 popup/item_0/text = "bool" popup/item_0/id = 1 popup/item_1/text = "int" diff --git a/addons/gloot/editor/common/editor_icons.gd.uid b/addons/gloot/editor/common/editor_icons.gd.uid new file mode 100644 index 0000000..d9d9e1a --- /dev/null +++ b/addons/gloot/editor/common/editor_icons.gd.uid @@ -0,0 +1 @@ +uid://bxx5vlfqbqk6u diff --git a/addons/gloot/editor/common/multivalue_editor.gd b/addons/gloot/editor/common/multivalue_editor.gd index cd789ab..9005696 100644 --- a/addons/gloot/editor/common/multivalue_editor.gd +++ b/addons/gloot/editor/common/multivalue_editor.gd @@ -1,14 +1,14 @@ extends GridContainer -signal value_changed(value_index) +signal value_changed(value_index: int) -const Utils = preload("res://addons/gloot/core/utils.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -var values: Array = [] : +var values: Array = []: set(new_values): assert(!is_inside_tree(), "Can't set values once the node is inside a tree") values = new_values -var titles: Array = [] : +var titles: Array = []: set(new_titles): assert(!is_inside_tree(), "Can't set titles once the node is inside a tree") titles = new_titles @@ -45,9 +45,11 @@ func _on_line_edit_value_entered(_text: String, line_edit: LineEdit, idx: int) - func _on_line_edit_focus_exited(line_edit: LineEdit, idx: int) -> void: - var value = Utils.str_to_var(line_edit.text) + var value = _Utils.str_to_var(line_edit.text) if typeof(value) != type: line_edit.text = var_to_str(values[idx]) return + if value == values[idx]: + return values[idx] = value value_changed.emit(idx) diff --git a/addons/gloot/editor/common/multivalue_editor.gd.uid b/addons/gloot/editor/common/multivalue_editor.gd.uid new file mode 100644 index 0000000..fb04325 --- /dev/null +++ b/addons/gloot/editor/common/multivalue_editor.gd.uid @@ -0,0 +1 @@ +uid://chgvb05fxa4ai diff --git a/addons/gloot/editor/common/proto_tree_viewer.gd b/addons/gloot/editor/common/proto_tree_viewer.gd new file mode 100644 index 0000000..e142373 --- /dev/null +++ b/addons/gloot/editor/common/proto_tree_viewer.gd @@ -0,0 +1,69 @@ +@tool +extends Tree + +signal prototype_activated(prototype: Prototype) + +@export var protoset: JSON = null: + set(new_protoset): + if new_protoset == protoset: + return + _disconnect_json_signals() + protoset = new_protoset + _proto_tree.clear() + _connect_json_signals() + _proto_tree.deserialize(protoset) + _queue_refresh() + + +var _proto_tree := ProtoTree.new() +var _refresh_queued := false + + +func _connect_json_signals() -> void: + if !is_instance_valid(protoset): + return + protoset.changed.connect(_queue_refresh) + + +func _disconnect_json_signals() -> void: + if !is_instance_valid(protoset): + return + protoset.changed.disconnect(_queue_refresh) + + +func _queue_refresh() -> void: + _refresh_queued = true + + +func _process(_delta: float) -> void: + if _refresh_queued: + _refresh() + _refresh_queued = false + + +func _refresh() -> void: + clear() + var root_tree_item = create_item(null) + root_tree_item.set_text(0, _proto_tree.get_root().get_id()) + root_tree_item.set_metadata(0, _proto_tree.get_root()) + _traverse(_proto_tree.get_root(), root_tree_item) + + +func _traverse(prototype: Prototype, tree_item: TreeItem) -> void: + for subprototype in prototype.get_derived_prototypes(): + var subitem = create_item(tree_item) + subitem.set_text(0, subprototype.get_id()) + subitem.set_metadata(0, subprototype) + _traverse(subprototype, subitem) + + +func _ready() -> void: + item_activated.connect(func(): + prototype_activated.emit(get_selected().get_metadata(0)) + ) + + +func get_selected_prototype() -> Prototype: + if get_selected() == null: + return null + return get_selected().get_metadata(0) diff --git a/addons/gloot/editor/common/proto_tree_viewer.gd.uid b/addons/gloot/editor/common/proto_tree_viewer.gd.uid new file mode 100644 index 0000000..06b470b --- /dev/null +++ b/addons/gloot/editor/common/proto_tree_viewer.gd.uid @@ -0,0 +1 @@ +uid://kudxphm4j8m7 diff --git a/addons/gloot/editor/common/value_editor.gd b/addons/gloot/editor/common/value_editor.gd index 1fa69c9..5d348e9 100644 --- a/addons/gloot/editor/common/value_editor.gd +++ b/addons/gloot/editor/common/value_editor.gd @@ -2,10 +2,10 @@ extends MarginContainer signal value_changed -const MultivalueEditor = preload("res://addons/gloot/editor/common/multivalue_editor.gd") -const Utils = preload("res://addons/gloot/core/utils.gd") +const _MultivalueEditor = preload("res://addons/gloot/editor/common/multivalue_editor.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -var value : +var value: set(new_value): value = new_value call_deferred("_refresh") @@ -74,10 +74,12 @@ func _on_line_edit_value_entered(_text: String, line_edit: LineEdit) -> void: func _on_line_edit_focus_exited(line_edit: LineEdit) -> void: - var new_value = Utils.str_to_var(line_edit.text) + var new_value = _Utils.str_to_var(line_edit.text) if typeof(new_value) != typeof(value): line_edit.text = var_to_str(value) return + if new_value == value: + return value = new_value value_changed.emit() @@ -92,6 +94,8 @@ func _create_color_picker() -> ColorPickerButton: func _on_color_picked(picker: ColorPickerButton) -> void: + if picker.color == value: + return value = picker.color value_changed.emit() @@ -106,128 +110,124 @@ func _create_checkbox() -> CheckButton: func _on_checkbox(checkbox: CheckButton) -> void: + if checkbox.button_pressed == value: + return value = checkbox.button_pressed value_changed.emit() func _create_v2_editor() -> Control: - var values = [value.x, value.y] - var titles = ["X", "Y"] - var v2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_v2_value_changed) + var values := [value.x, value.y] + var titles := ["X", "Y"] + var value_converter := func(values: Array): + return Vector2(values[0], values[1]) + var v2_editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return v2_editor func _create_v2i_editor() -> Control: - var values = [value.x, value.y] - var titles = ["X", "Y"] - var v2_editor = _create_multiint_editor(2, enabled, values, titles, _on_v2_value_changed) + var values := [value.x, value.y] + var titles := ["X", "Y"] + var value_converter := func(values: Array): + return Vector2i(values[0], values[1]) + var v2_editor = _create_multiint_editor(2, enabled, values, titles, value_converter) return v2_editor -func _on_v2_value_changed(_idx: int, v2_editor: Control) -> void: - value.x = v2_editor.values[0] - value.y = v2_editor.values[1] - value_changed.emit() - - func _create_v3_editor() -> Control: - var values = [value.x, value.y, value.z] - var titles = ["X", "Y", "Z"] - var v3_editor = _create_multifloat_editor(3, enabled, values, titles, _on_v3_value_changed) + var values := [value.x, value.y, value.z] + var titles := ["X", "Y", "Z"] + var value_converter := func(values: Array): + return Vector3(values[0], values[1], values[2]) + var v3_editor = _create_multifloat_editor(3, enabled, values, titles, value_converter) return v3_editor func _create_v3i_editor() -> Control: - var values = [value.x, value.y, value.z] - var titles = ["X", "Y", "Z"] - var v3_editor = _create_multiint_editor(3, enabled, values, titles, _on_v3_value_changed) + var values := [value.x, value.y, value.z] + var titles := ["X", "Y", "Z"] + var value_converter := func(values: Array): + return Vector3i(values[0], values[1], values[2]) + var v3_editor = _create_multiint_editor(3, enabled, values, titles, value_converter) return v3_editor -func _on_v3_value_changed(_idx: int, v3_editor: Control) -> void: - value.x = v3_editor.values[0] - value.y = v3_editor.values[1] - value.z = v3_editor.values[2] - value_changed.emit() - - func _create_r2_editor() -> Control: - var values = [value.position.x, value.position.y, value.size.x, value.size.y] - var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_r2_value_changed) + var values := [value.position.x, value.position.y, value.size.x, value.size.y] + var titles := ["Position X", "Position Y", "Size X", "Size Y"] + var value_converter := func(values: Array): + return Rect2( + values[0], + values[1], + values[2], + values[3]) + var r2_editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return r2_editor func _create_r2i_editor() -> Control: - var values = [value.position.x, value.position.y, value.size.x, value.size.y] - var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multiint_editor(2, enabled, values, titles, _on_r2_value_changed) + var values := [value.position.x, value.position.y, value.size.x, value.size.y] + var titles := ["Position X", "Position Y", "Size X", "Size Y"] + var value_converter := func(values: Array): + return Rect2i( + values[0], + values[1], + values[2], + values[3]) + var r2_editor = _create_multiint_editor(2, enabled, values, titles, value_converter) return r2_editor -func _on_r2_value_changed(_idx: int, r2_editor: Control) -> void: - value.position.x = r2_editor.values[0] - value.position.y = r2_editor.values[1] - value.size.x = r2_editor.values[2] - value.size.y = r2_editor.values[3] - value_changed.emit() - - func _create_plane_editor() -> Control: - var values = [value.x, value.y, value.z, value.d] - var titles = ["X", "Y", "Z", "D"] - var editor = _create_multifloat_editor(2, enabled, values, titles, _on_plane_value_changed) + var values := [value.x, value.y, value.z, value.d] + var titles := ["A", "B", "C", "D"] + var value_converter := func(values: Array): + return Plane( + values[0], + values[1], + values[2], + values[3]) + var editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return editor -func _on_plane_value_changed(_idx: int, plane_editor: Control) -> void: - value.x = plane_editor.values[0] - value.y = plane_editor.values[1] - value.z = plane_editor.values[2] - value.d = plane_editor.values[3] - value_changed.emit() - - func _create_quat_editor() -> Control: - var values = [value.x, value.y, value.z, value.w] - var titles = ["X", "Y", "Z", "W"] - var editor = _create_multifloat_editor(2, enabled, values, titles, _on_quat_value_changed) + var values := [value.x, value.y, value.z, value.w] + var titles := ["X", "Y", "Z", "W"] + var value_converter := func(values: Array): + return Quaternion( + values[0], + values[1], + values[2], + values[3]) + var editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return editor -func _on_quat_value_changed(_idx: int, quat_editor: Control) -> void: - value.x = quat_editor.values[0] - value.y = quat_editor.values[1] - value.z = quat_editor.values[2] - value.d = quat_editor.values[3] - value_changed.emit() - - func _create_aabb_editor() -> Control: - var values = [value.position.x, value.position.y, value.position.z, \ + var values := [value.position.x, value.position.y, value.position.z, \ value.size.x, value.size.y, value.size.z] - var titles = ["Position X", "Position Y", "Position Z", "Size X", "Size Y", "Size Z"] - var editor = _create_multifloat_editor(3, enabled, values, titles, _on_aabb_value_changed) + var titles := ["Position X", "Position Y", "Position Z", "Size X", "Size Y", "Size Z"] + var value_converter := func(values: Array): + var result: AABB + result.position.x = values[0] + result.position.y = values[1] + result.position.z = values[2] + result.size.x = values[3] + result.size.y = values[4] + result.size.z = values[5] + return result + var editor = _create_multifloat_editor(3, enabled, values, titles, value_converter) return editor -func _on_aabb_value_changed(_idx: int, aabb_editor: Control) -> void: - value.position.x = aabb_editor.values[0] - value.position.y = aabb_editor.values[1] - value.position.z = aabb_editor.values[2] - value.size.x = aabb_editor.values[3] - value.size.y = aabb_editor.values[4] - value.size.z = aabb_editor.values[5] - value_changed.emit() - - func _create_multifloat_editor( columns: int, enabled: bool, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - return _create_multivalue_editor(columns, enabled, TYPE_FLOAT, values, titles, value_changed_handler) + value_converter: Callable) -> Control: + return _create_multivalue_editor(columns, enabled, TYPE_FLOAT, values, titles, value_converter) func _create_multiint_editor( @@ -235,8 +235,8 @@ func _create_multiint_editor( enabled: bool, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - return _create_multivalue_editor(columns, enabled, TYPE_INT, values, titles, value_changed_handler) + value_converter: Callable) -> Control: + return _create_multivalue_editor(columns, enabled, TYPE_INT, values, titles, value_converter) func _create_multivalue_editor( @@ -245,15 +245,21 @@ func _create_multivalue_editor( type: int, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - var multivalue_editor = MultivalueEditor.new() + value_converter: Callable) -> Control: + var multivalue_editor = _MultivalueEditor.new() multivalue_editor.columns = columns multivalue_editor.enabled = enabled multivalue_editor.type = type multivalue_editor.values = values multivalue_editor.titles = titles _expand_control(multivalue_editor) - multivalue_editor.value_changed.connect(value_changed_handler.bind(multivalue_editor)) + multivalue_editor.value_changed.connect(func(_idx: int): + var new_value = value_converter.call(multivalue_editor.values) + if new_value == value: + return + value = new_value + value_changed.emit() + ) return multivalue_editor diff --git a/addons/gloot/editor/common/value_editor.gd.uid b/addons/gloot/editor/common/value_editor.gd.uid new file mode 100644 index 0000000..7bd9c14 --- /dev/null +++ b/addons/gloot/editor/common/value_editor.gd.uid @@ -0,0 +1 @@ +uid://b27rj7hee5e7w diff --git a/addons/gloot/editor/gloot_undo_redo.gd b/addons/gloot/editor/gloot_undo_redo.gd deleted file mode 100644 index efe6090..0000000 --- a/addons/gloot/editor/gloot_undo_redo.gd +++ /dev/null @@ -1,296 +0,0 @@ -@tool -extends Object - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") - - -static func _get_undo_redo_manager(): - var gloot = load("res://addons/gloot/gloot.gd") - assert(gloot.instance()) - var undo_redo_manager = gloot.instance().get_undo_redo() - assert(undo_redo_manager) - return undo_redo_manager - - -static func add_inventory_item(inventory: Inventory, prototype_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if inventory.create_and_add_item(prototype_id) == null: - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Add Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func remove_inventory_item(inventory: Inventory, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if !inventory.remove_item(item): - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Remove Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func remove_inventory_items(inventory: Inventory, items: Array[InventoryItem]) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - for item in items: - assert(inventory.remove_item(item)) - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Remove Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func set_item_properties(item: InventoryItem, new_properties: Dictionary) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var inventory: Inventory = item.get_inventory() - if inventory: - undo_redo_manager.create_action("Set item properties") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), new_properties) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), item.properties) - undo_redo_manager.commit_action() - else: - undo_redo_manager.create_action("Set item properties") - undo_redo_manager.add_undo_property(item, "properties", item.properties) - undo_redo_manager.add_do_property(item, "properties", new_properties) - undo_redo_manager.commit_action() - - -static func set_item_prototype_id(item: InventoryItem, new_prototype_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var inventory: Inventory = item.get_inventory() - if inventory: - undo_redo_manager.create_action("Set prototype_id") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), new_prototype_id) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), item.prototype_id) - undo_redo_manager.commit_action() - else: - undo_redo_manager.create_action("Set prototype_id") - undo_redo_manager.add_undo_property(item, "prototype_id", item.prototype_id) - undo_redo_manager.add_do_property(item, "prototype_id", new_prototype_id) - undo_redo_manager.commit_action() - - -static func _set_inventory(inventory: Inventory, inventory_data: Dictionary) -> void: - inventory.deserialize(inventory_data) - - -static func _set_item_prototype_id(inventory: Inventory, item_index: int, new_prototype_id: String): - assert(item_index < inventory.get_item_count()) - inventory.get_items()[item_index].prototype_id = new_prototype_id - - -static func _set_item_properties(inventory: Inventory, item_index: int, new_properties: Dictionary): - assert(item_index < inventory.get_item_count()) - inventory.get_items()[item_index].properties = new_properties.duplicate() - - -static func equip_item_in_item_slot(item_slot: ItemSlotBase, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_slot_state := item_slot.serialize() - if !item_slot.equip(item): - return - var new_slot_state := item_slot.serialize() - - undo_redo_manager.create_action("Equip Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) - undo_redo_manager.commit_action() - - -static func clear_item_slot(item_slot: ItemSlotBase) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_slot_state := item_slot.serialize() - if !item_slot.clear(): - return - var new_slot_state := item_slot.serialize() - - undo_redo_manager.create_action("Clear Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) - undo_redo_manager.commit_action() - - -static func _set_item_slot(item_slot: ItemSlotBase, item_slot_data: Dictionary) -> void: - item_slot.deserialize(item_slot_data) - - -static func move_inventory_item(inventory: InventoryGrid, item: InventoryItem, to: Vector2i) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_position := inventory.get_item_position(item) - if old_position == to: - return - var item_index := inventory.get_item_index(item) - - undo_redo_manager.create_action("Move Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_move_item", inventory, item_index, to) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_move_item", inventory, item_index, old_position) - undo_redo_manager.commit_action() - - -static func swap_inventory_items(item1: InventoryItem, item2: InventoryItem) -> void: - - var undo_redo_manager = _get_undo_redo_manager() - - var inventories: Array[Inventory] = [item1.get_inventory(), item2.get_inventory()] - var old_inv_states: Array[Dictionary] = [{}, {}] - var new_inv_states: Array[Dictionary] = [{}, {}] - old_inv_states[0] = inventories[0].serialize() - old_inv_states[1] = inventories[1].serialize() - if !InventoryItem.swap(item1, item2): - return - new_inv_states[0] = inventories[0].serialize() - new_inv_states[1] = inventories[1].serialize() - - undo_redo_manager.create_action("Swap Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventories", inventories, new_inv_states) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventories", inventories, old_inv_states) - undo_redo_manager.commit_action() - - -static func _set_inventories(inventories: Array[Inventory], inventory_data: Array[Dictionary]) -> void: - assert(inventories.size() == inventory_data.size()) - for i in range(inventories.size()): - inventories[i].deserialize(inventory_data[i]) - - -static func rotate_inventory_item(inventory: InventoryGrid, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - if !inventory.can_rotate_item(item): - return - - var old_rotation := inventory.is_item_rotated(item) - var item_index := inventory.get_item_index(item) - - undo_redo_manager.create_action("Rotate Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_rotation", inventory, item_index, !old_rotation) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_rotation", inventory, item_index, old_rotation) - undo_redo_manager.commit_action() - - -static func _move_item(inventory: InventoryGrid, item_index: int, to: Vector2i) -> void: - assert(item_index >= 0 && item_index < inventory.get_item_count()) - var item = inventory.get_items()[item_index] - inventory.move_item_to(item, to) - - -static func _set_item_rotation(inventory: InventoryGrid, item_index: int, rotation: bool) -> void: - assert(item_index >= 0 && item_index < inventory.get_item_count()) - var item = inventory.get_items()[item_index] - inventory.set_item_rotation(item, rotation) - - -static func join_inventory_items( - inventory: InventoryGridStacked, - item_dst: InventoryItem, - item_src: InventoryItem -) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if !inventory.join(item_dst, item_src): - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Join Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func rename_prototype(protoset: ItemProtoset, id: String, new_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Rename Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "rename_prototype", id, new_id) - undo_redo_manager.commit_action() - - -static func add_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Add Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "add_prototype", id) - undo_redo_manager.commit_action() - - -static func remove_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Remove Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "remove_prototype", id) - undo_redo_manager.commit_action() - - -static func duplicate_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Duplicate Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "duplicate_prototype", id) - undo_redo_manager.commit_action() - - -static func _prototypes_deep_copy(protoset: ItemProtoset) -> Dictionary: - var result = protoset._prototypes.duplicate() - for prototype_id in result.keys(): - result[prototype_id] = protoset._prototypes[prototype_id].duplicate() - return result - - -static func _set_prototypes(protoset: ItemProtoset, prototypes: Dictionary) -> void: - protoset._prototypes = prototypes - - -static func set_prototype_properties(protoset: ItemProtoset, - prototype_id: String, - new_properties: Dictionary) -> void: - var undo_redo_manager = _get_undo_redo_manager() - assert(protoset.has_prototype(prototype_id)) - var old_properties = protoset.get_prototype(prototype_id).duplicate() - - undo_redo_manager.create_action("Set prototype properties") - undo_redo_manager.add_undo_method( - protoset, - "set_prototype_properties", - prototype_id, - old_properties - ) - undo_redo_manager.add_do_method( - protoset, - "set_prototype_properties", - prototype_id, - new_properties - ) - undo_redo_manager.commit_action() - diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.gd b/addons/gloot/editor/inventory_editor/inventory_editor.gd index 0fb7d51..eadba5b 100644 --- a/addons/gloot/editor/inventory_editor/inventory_editor.gd +++ b/addons/gloot/editor/inventory_editor/inventory_editor.gd @@ -1,127 +1,168 @@ @tool extends Control -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var hsplit_container = $HSplitContainer -@onready var prototype_id_filter = $HSplitContainer/ChoiceFilter -@onready var inventory_control_container = $HSplitContainer/VBoxContainer -@onready var btn_edit = $HSplitContainer/VBoxContainer/HBoxContainer/BtnEdit -@onready var btn_remove = $HSplitContainer/VBoxContainer/HBoxContainer/BtnRemove -@onready var scroll_container = $HSplitContainer/VBoxContainer/ScrollContainer -var inventory: Inventory : +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") +const _POPUP_SIZE = Vector2i(800, 300) + +var inventory: Inventory: set(new_inventory): + if inventory == new_inventory: + return disconnect_inventory_signals() inventory = new_inventory connect_inventory_signals() _refresh() var _inventory_control: Control +var _inventory_container: Control +var _properties_editor: Window func connect_inventory_signals(): if !inventory: return - if inventory is InventoryStacked: - inventory.capacity_changed.connect(_refresh) - if inventory is InventoryGrid: - inventory.size_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) inventory.protoset_changed.connect(_refresh) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) - if !inventory.item_protoset: + if !inventory.protoset: return - inventory.item_protoset.changed.connect(_refresh) + inventory.protoset.changed.connect(_refresh) func disconnect_inventory_signals(): if !inventory: return - if inventory is InventoryStacked: - inventory.capacity_changed.disconnect(_refresh) - if inventory is InventoryGrid: - inventory.size_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) - if !inventory.item_protoset: + if !inventory.protoset: return - inventory.item_protoset.changed.disconnect(_refresh) + inventory.protoset.changed.disconnect(_refresh) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _refresh() func _refresh() -> void: - if !is_inside_tree() || inventory == null || inventory.item_protoset == null: + if !is_inside_tree() || inventory == null || inventory.protoset == null: return # Remove the inventory control, if present - if _inventory_control: - scroll_container.remove_child(_inventory_control) - _inventory_control.queue_free() - _inventory_control = null + if _inventory_container: + %ScrollContainer.remove_child(_inventory_container) + _inventory_container.queue_free() + _inventory_container = null # Create the appropriate inventory control and populate it - if inventory is InventoryGrid: + _inventory_container = _create_inventory_container() + %ScrollContainer.add_child(_inventory_container) + + %PrototreeViewer.protoset = inventory.protoset + + +func _create_inventory_container() -> Control: + var vbox_container: Control = VBoxContainer.new() + vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL + vbox_container.size_flags_vertical = SIZE_EXPAND_FILL + var capacity_control: CtrlInventoryCapacity = null + + if inventory.get_constraint(GridConstraint) != null: _inventory_control = CtrlInventoryGrid.new() - _inventory_control.grid_color = Color.GRAY - _inventory_control.draw_selections = true - elif inventory is InventoryStacked: - _inventory_control = CtrlInventoryStacked.new() - elif inventory is Inventory: + else: _inventory_control = CtrlInventory.new() _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL _inventory_control.inventory = inventory _inventory_control.inventory_item_activated.connect(_on_inventory_item_activated) - _inventory_control.inventory_item_context_activated.connect(_on_inventory_item_context_activated) + _inventory_control.inventory_item_clicked.connect(_on_inventory_item_clicked) - scroll_container.add_child(_inventory_control) + if inventory.get_constraint(WeightConstraint) != null: + capacity_control = CtrlInventoryCapacity.new() + capacity_control.inventory = inventory - # Set prototype_id_filter values - prototype_id_filter.set_values(inventory.item_protoset._prototypes.keys()) + if _inventory_control: + vbox_container.add_child(_inventory_control) + if capacity_control: + vbox_container.add_child(capacity_control) + + return vbox_container func _on_inventory_item_activated(item: InventoryItem) -> void: - GlootUndoRedo.remove_inventory_item(inventory, item) + _Undoables.undoable_action(inventory, "Remove Inventory Item", func(): + return inventory.remove_item(item) + ) -func _on_inventory_item_context_activated(item: InventoryItem) -> void: - GlootUndoRedo.rotate_inventory_item(inventory, item) +func _on_inventory_item_clicked(item: InventoryItem, at_position: Vector2, mouse_button_index: int) -> void: + if mouse_button_index != MOUSE_BUTTON_RIGHT: + return + _Undoables.undoable_action(inventory, "Rotate Inventory Item", func(): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return false + var rotated = grid_constraint.is_item_rotated(item) + return grid_constraint.set_item_rotation(item, !rotated) + ) func _ready() -> void: - prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") - prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") - btn_edit.icon = EditorIcons.get_icon("Edit") - btn_remove.icon = EditorIcons.get_icon("Remove") - - prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) - btn_edit.pressed.connect(_on_btn_edit) - btn_remove.pressed.connect(_on_btn_remove) + %BtnAdd.icon = _EditorIcons.get_icon("Add") + %BtnEdit.icon = _EditorIcons.get_icon("Edit") + %BtnRemove.icon = _EditorIcons.get_icon("Remove") + + %PrototreeViewer.prototype_activated.connect(_on_prototype_activated) + %BtnAdd.pressed.connect(_on_btn_add) + %BtnEdit.pressed.connect(_on_btn_edit) + %BtnRemove.pressed.connect(_on_btn_remove) _refresh() -func _on_prototype_id_picked(index: int) -> void: - var prototype_id = prototype_id_filter.values[index] - GlootUndoRedo.add_inventory_item(inventory, prototype_id) +func _on_prototype_activated(prototype: Prototype) -> void: + _Undoables.undoable_action(inventory, "Add Inventory Item", func(): + return (inventory.create_and_add_item(str(prototype.get_prototype_id())) != null) + ) + + +func _on_btn_add() -> void: + var prototype: Prototype = %PrototreeViewer.get_selected_prototype() + if prototype == null: + return + _Undoables.undoable_action(inventory, "Add Inventory Item", func(): + return (inventory.create_and_add_item(str(prototype.get_prototype_id())) != null) + ) func _on_btn_edit() -> void: var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() - if selected_item != null: - # Call it deferred, so that the control can clean up - call_deferred("_select_node", selected_item) + if selected_item == null: + return + if _properties_editor == null: + _properties_editor = _PropertiesEditor.instantiate() + add_child(_properties_editor) + _properties_editor.item = selected_item + _properties_editor.popup_centered(_POPUP_SIZE) func _on_btn_remove() -> void: var selected_items: Array[InventoryItem] = _inventory_control.get_selected_inventory_items() for selected_item in selected_items: if selected_item != null: - GlootUndoRedo.remove_inventory_item(inventory, selected_item) + _Undoables.undoable_action(inventory, "Remove Inventory Item", func(): + return inventory.remove_item(selected_item) + ) static func _select_node(node: Node) -> void: EditorInterface.get_selection().clear() EditorInterface.get_selection().add_node(node) EditorInterface.edit_node(node) - diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid b/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid new file mode 100644 index 0000000..5ff777c --- /dev/null +++ b/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid @@ -0,0 +1 @@ +uid://clm312t8h4uxq diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.tscn b/addons/gloot/editor/inventory_editor/inventory_editor.tscn index f67fa23..ed3dfbd 100644 --- a/addons/gloot/editor/inventory_editor/inventory_editor.tscn +++ b/addons/gloot/editor/inventory_editor/inventory_editor.tscn @@ -1,7 +1,43 @@ -[gd_scene load_steps=3 format=3 uid="uid://c6e4cxvjdxhdo"] +[gd_scene load_steps=9 format=3 uid="uid://c6e4cxvjdxhdo"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] [ext_resource type="Script" path="res://addons/gloot/editor/inventory_editor/inventory_editor.gd" id="2"] +[ext_resource type="Script" path="res://addons/gloot/editor/common/proto_tree_viewer.gd" id="2_sflgi"] + +[sub_resource type="Image" id="Image_317m2"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_fm4sg"] +image = SubResource("Image_317m2") + +[sub_resource type="Image" id="Image_3bkis"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_gpbyr"] +image = SubResource("Image_3bkis") + +[sub_resource type="Image" id="Image_1y8m2"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_wo0ku"] +image = SubResource("Image_1y8m2") [node name="InventoryEditor" type="Control"] layout_mode = 3 @@ -19,10 +55,23 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="ChoiceFilter" parent="HSplitContainer" instance=ExtResource("1")] +[node name="VBoxContainer2" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PrototreeViewer" type="Tree" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_root = true +script = ExtResource("2_sflgi") + +[node name="BtnAdd" type="Button" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true layout_mode = 2 -pick_text = "Add" -filter_text = "Filter Prototypes:" +text = "Add" +icon = SubResource("ImageTexture_fm4sg") [node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 @@ -30,6 +79,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -38,11 +88,15 @@ size_flags_vertical = 3 layout_mode = 2 [node name="BtnEdit" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Edit" +icon = SubResource("ImageTexture_gpbyr") [node name="BtnRemove" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Remove" +icon = SubResource("ImageTexture_wo0ku") diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.gd b/addons/gloot/editor/inventory_editor/inventory_inspector.gd index 8ffcea7..d405ab3 100644 --- a/addons/gloot/editor/inventory_editor/inventory_inspector.gd +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.gd @@ -1,14 +1,14 @@ @tool extends Control -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var inventory_editor: Control = $HBoxContainer/InventoryEditor @onready var btn_expand: Button = $HBoxContainer/BtnExpand @onready var _window_dialog: Window = $Window @onready var _inventory_editor: Control = $Window/MarginContainer/InventoryEditor -var inventory: Inventory : +var inventory: Inventory: set(new_inventory): inventory = new_inventory if inventory_editor: @@ -23,7 +23,7 @@ func _ready() -> void: if inventory_editor: inventory_editor.inventory = inventory _apply_editor_settings() - btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.icon = _EditorIcons.get_icon("DistractionFree") btn_expand.pressed.connect(on_btn_expand) _window_dialog.close_requested.connect(func(): _window_dialog.hide()) diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid b/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid new file mode 100644 index 0000000..441f88d --- /dev/null +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid @@ -0,0 +1 @@ +uid://cg4p1lf3cmckg diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.tscn b/addons/gloot/editor/inventory_editor/inventory_inspector.tscn index db8edf2..fb7113b 100644 --- a/addons/gloot/editor/inventory_editor/inventory_inspector.tscn +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.tscn @@ -1,10 +1,22 @@ -[gd_scene load_steps=3 format=3 uid="uid://bef418tvtf7h6"] +[gd_scene load_steps=5 format=3 uid="uid://bef418tvtf7h6"] [ext_resource type="PackedScene" uid="uid://c6e4cxvjdxhdo" path="res://addons/gloot/editor/inventory_editor/inventory_editor.tscn" id="1"] [ext_resource type="Script" path="res://addons/gloot/editor/inventory_editor/inventory_inspector.gd" id="2"] +[sub_resource type="Image" id="Image_1eklb"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 135, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 140, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 136, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 138, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 126, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 107, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 105, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 224, 224, 224, 129, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 140, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 142, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 138, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_jr7hk"] +image = SubResource("Image_1eklb") + [node name="InventoryInspector" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -29,6 +41,7 @@ size_flags_vertical = 3 [node name="BtnExpand" type="Button" parent="HBoxContainer"] layout_mode = 2 +icon = SubResource("ImageTexture_jr7hk") [node name="Window" type="Window" parent="."] title = "Edit Inventory" diff --git a/addons/gloot/editor/inventory_inspector_plugin.gd b/addons/gloot/editor/inventory_inspector_plugin.gd index fa09e9f..e461ee3 100644 --- a/addons/gloot/editor/inventory_inspector_plugin.gd +++ b/addons/gloot/editor/inventory_inspector_plugin.gd @@ -1,51 +1,25 @@ extends EditorInspectorPlugin -const EditProtosetButton = preload("res://addons/gloot/editor/protoset_editor/edit_protoset_button.tscn") -const InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") -const ItemSlotInspector = preload("res://addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn") -const ItemRefSlotButton = preload("res://addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd") -const EditPropertiesButton = preload("res://addons/gloot/editor/item_editor/edit_properties_button.gd") -const EditPrototypeIdButton = preload("res://addons/gloot/editor/item_editor/edit_prototype_id_button.gd") +const _InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") +const _ItemSlotInspector = preload("res://addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn") func _can_handle(object: Object) -> bool: - return (object is Inventory) || \ - (object is InventoryItem) || \ - (object is ItemSlot) || \ - (object is ItemRefSlot) || \ - (object is ItemProtoset) + return (object is Inventory) || (object is ItemSlot) func _parse_begin(object: Object) -> void: + if Engine.is_editor_hint() && object.get_class() == "EditorDebuggerRemoteObject": + # _parse_begin is called for a EditorDebuggerRemoteObject when inspecting + # a remote node and causes errors when trying to access Inventory/ItemSlot + # properties. + return + if object is Inventory: - var inventory_inspector := InventoryInspector.instantiate() + var inventory_inspector := _InventoryInspector.instantiate() inventory_inspector.init(object as Inventory) add_custom_control(inventory_inspector) if object is ItemSlot: - var item_slot_inspector := ItemSlotInspector.instantiate() + var item_slot_inspector := _ItemSlotInspector.instantiate() item_slot_inspector.init(object as ItemSlot) add_custom_control(item_slot_inspector) - if object is ItemProtoset: - var edit_protoset_button := EditProtosetButton.instantiate() - edit_protoset_button.init(object as ItemProtoset) - add_custom_control(edit_protoset_button) - - -func _parse_property(object: Object, - type: Variant.Type, - name: String, - hint: PropertyHint, - hint_string: String, - usage: int, - wide: bool) -> bool: - if (object is InventoryItem) && name == "properties": - add_property_editor(name, EditPropertiesButton.new()) - return true - if (object is InventoryItem) && name == "prototype_id": - add_property_editor(name, EditPrototypeIdButton.new()) - return true - if (object is ItemRefSlot) && name == "_equipped_item": - add_property_editor(name, ItemRefSlotButton.new()) - return true - return false - diff --git a/addons/gloot/editor/inventory_inspector_plugin.gd.uid b/addons/gloot/editor/inventory_inspector_plugin.gd.uid new file mode 100644 index 0000000..29c4aed --- /dev/null +++ b/addons/gloot/editor/inventory_inspector_plugin.gd.uid @@ -0,0 +1 @@ +uid://bfn7j0n1qo2ym diff --git a/addons/gloot/editor/item_editor/edit_properties_button.gd b/addons/gloot/editor/item_editor/edit_properties_button.gd deleted file mode 100644 index e0d5342..0000000 --- a/addons/gloot/editor/item_editor/edit_properties_button.gd +++ /dev/null @@ -1,61 +0,0 @@ -extends EditorProperty - -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") -const POPUP_SIZE = Vector2i(800, 300) - -var current_value: Dictionary -var updating: bool = false -var _btn_prototype_id: Button -var _properties_editor: Window - - -func _init(): - _properties_editor = PropertiesEditor.instantiate() - add_child(_properties_editor) - - _btn_prototype_id = Button.new() - _btn_prototype_id.text = "Edit Properties" - _btn_prototype_id.pressed.connect(_on_btn_edit) - _btn_prototype_id.icon = EditorIcons.get_icon("Edit") - add_child(_btn_prototype_id) - - -func _ready() -> void: - var item: InventoryItem = get_edited_object() - if !item: - return - _properties_editor.item = item - item.properties_changed.connect(update_property) - - if !item.protoset: - return - item.protoset.changed.connect(_on_protoset_changed) - - _refresh_button() - - -func _on_btn_edit() -> void: - _properties_editor.popup_centered(POPUP_SIZE) - - -func update_property() -> void: - var new_value = get_edited_object()[get_edited_property()] - if new_value == current_value: - return - - updating = true - current_value = new_value - updating = false - - -func _on_protoset_changed() -> void: - _refresh_button() - - -func _refresh_button() -> void: - var item: InventoryItem = get_edited_object() - if !item || !item.protoset: - return - _btn_prototype_id.disabled = !item.protoset.has_prototype(item.prototype_id) - diff --git a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd b/addons/gloot/editor/item_editor/edit_prototype_id_button.gd deleted file mode 100644 index 1e3b6a3..0000000 --- a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd +++ /dev/null @@ -1,79 +0,0 @@ -extends EditorProperty - - -const PrototypeIdEditor = preload("res://addons/gloot/editor/item_editor/prototype_id_editor.tscn") -const POPUP_SIZE = Vector2i(300, 300) -const COLOR_INVALID = Color.RED -var current_value: String -var updating: bool = false -var _prototype_id_editor: Window -var _btn_prototype_id: Button - - -func _init(): - _prototype_id_editor = PrototypeIdEditor.instantiate() - add_child(_prototype_id_editor) - - _btn_prototype_id = Button.new() - _btn_prototype_id.text = "Prototype ID" - _btn_prototype_id.pressed.connect(_on_btn_prototype_id) - add_child(_btn_prototype_id) - - -func _ready() -> void: - var item: InventoryItem = get_edited_object() - _prototype_id_editor.item = item - item.prototype_id_changed.connect(_refresh_button) - if item.protoset: - item.protoset.changed.connect(_refresh_button) - _refresh_button() - - -func _on_btn_prototype_id() -> void: - # TODO: Figure out how to show a popup at mouse position - # _window_dialog.popup(Rect2i(_get_popup_at_mouse_position(POPUP_SIZE), POPUP_SIZE)) - _prototype_id_editor.popup_centered(POPUP_SIZE) - - -func _get_popup_at_mouse_position(size: Vector2i) -> Vector2i: - var global_mouse_pos: Vector2i = Vector2i(get_global_mouse_position()) - var local_mouse_pos: Vector2i = global_mouse_pos + \ - DisplayServer.window_get_position(DisplayServer.MAIN_WINDOW_ID) - - # Prevent the popup from positioning partially out of screen - var screen_size: Vector2i = DisplayServer.screen_get_size(DisplayServer.SCREEN_OF_MAIN_WINDOW) - var popup_pos: Vector2i - popup_pos.x = clamp(local_mouse_pos.x, 0, screen_size.x - size.x) - popup_pos.y = clamp(local_mouse_pos.y, 0, screen_size.y - size.y) - - return popup_pos - - -func update_property() -> void: - var new_value = get_edited_object()[get_edited_property()] - if new_value == current_value: - return - - updating = true - current_value = new_value - _refresh_button() - updating = false - - -func _refresh_button() -> void: - var item: InventoryItem = get_edited_object() - _btn_prototype_id.text = item.prototype_id - _btn_prototype_id.disabled = false - if item.protoset == null: - _btn_prototype_id.disabled = true - return - - if !item.protoset.has_prototype(item.prototype_id): - _btn_prototype_id.add_theme_color_override("font_color", COLOR_INVALID) - _btn_prototype_id.add_theme_color_override("font_color_hover", COLOR_INVALID) - _btn_prototype_id.tooltip_text = "Invalid prototype ID!" - else: - _btn_prototype_id.remove_theme_color_override("font_color") - _btn_prototype_id.remove_theme_color_override("font_color_hover") - _btn_prototype_id.tooltip_text = "" - diff --git a/addons/gloot/editor/item_editor/properties_editor.gd b/addons/gloot/editor/item_editor/properties_editor.gd index 0ccee74..79fe8e4 100644 --- a/addons/gloot/editor/item_editor/properties_editor.gd +++ b/addons/gloot/editor/item_editor/properties_editor.gd @@ -1,24 +1,19 @@ @tool extends Window -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") -const DictEditor = preload("res://addons/gloot/editor/common/dict_editor.tscn") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const COLOR_OVERRIDDEN = Color.GREEN -const COLOR_INVALID = Color.RED -var IMMUTABLE_KEYS: Array[String] = [ItemProtoset.KEY_ID, GridConstraint.KEY_GRID_POSITION] +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _DictEditor = preload("res://addons/gloot/editor/common/dict_editor.tscn") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _COLOR_OVERRIDDEN = Color.GREEN +const _COLOR_INVALID = Color.RED @onready var _margin_container: MarginContainer = $"MarginContainer" @onready var _dict_editor: Control = $"MarginContainer/DictEditor" -var item: InventoryItem = null : +var item: InventoryItem = null: set(new_item): if new_item == null: return - assert(item == null, "Item already set!") item = new_item - if item.protoset: - item.protoset.changed.connect(_refresh) _refresh() @@ -31,38 +26,28 @@ func _ready() -> void: func _on_value_changed(key: String, new_value) -> void: - var new_properties = item.properties.duplicate() - new_properties[key] = new_value - - var item_prototype: Dictionary = item.protoset.get_prototype(item.prototype_id) - if item_prototype.has(key) && (item_prototype[key] == new_value): - new_properties.erase(key) - - if new_properties.hash() == item.properties.hash(): - return - - GlootUndoRedo.set_item_properties(item, new_properties) - _refresh() + _Undoables.undoable_action(item, "Set Item Property", func(): + item.set_property(key, new_value) + return true + ) + # TODO: Figure out why this is needed + _refresh.call_deferred() func _on_value_removed(key: String) -> void: - var new_properties = item.properties.duplicate() - new_properties.erase(key) - - if new_properties.hash() == item.properties.hash(): - return - - GlootUndoRedo.set_item_properties(item, new_properties) + _Undoables.undoable_action(item, "Clear Item Property", func(): + item.clear_property(key) + return true + ) _refresh() func _refresh() -> void: if _dict_editor.btn_add: - _dict_editor.btn_add.icon = EditorIcons.get_icon("Add") + _dict_editor.btn_add.icon = _EditorIcons.get_icon("Add") _dict_editor.dictionary = _get_dictionary() _dict_editor.color_map = _get_color_map() _dict_editor.remove_button_map = _get_remove_button_map() - _dict_editor.immutable_keys = IMMUTABLE_KEYS _dict_editor.refresh() @@ -70,15 +55,15 @@ func _get_dictionary() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} - if !item.protoset.has_prototype(item.prototype_id): + if !item.get_prototree().has_prototype(item.get_prototype().get_prototype_id()): return {} - var result: Dictionary = item.protoset.get_prototype(item.prototype_id).duplicate() - for key in item.properties.keys(): - result[key] = item.properties[key] + var result: Dictionary = item.get_prototype().get_properties() + for key in item.get_properties(): + result[key] = item.get_property(key) return result @@ -86,16 +71,14 @@ func _get_color_map() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} var result: Dictionary = {} var dictionary: Dictionary = _get_dictionary() for key in dictionary.keys(): - if item.properties.has(key): - result[key] = COLOR_OVERRIDDEN - if key == ItemProtoset.KEY_ID && !item.protoset.has_prototype(dictionary[key]): - result[key] = COLOR_INVALID + if item.is_property_overridden(key): + result[key] = _COLOR_OVERRIDDEN return result @@ -104,20 +87,19 @@ func _get_remove_button_map() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} var result: Dictionary = {} var dictionary: Dictionary = _get_dictionary() for key in dictionary.keys(): result[key] = {} - if item.protoset.get_prototype(item.prototype_id).has(key): + if item.has_property(key): result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon("Reload") + result[key]["icon"] = _EditorIcons.get_icon("Reload") else: result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon("Remove") + result[key]["icon"] = _EditorIcons.get_icon("Remove") - result[key]["disabled"] = (not key in item.properties) or (key in IMMUTABLE_KEYS) + result[key]["disabled"] = not item.is_property_overridden(key) return result - diff --git a/addons/gloot/editor/item_editor/properties_editor.gd.uid b/addons/gloot/editor/item_editor/properties_editor.gd.uid new file mode 100644 index 0000000..55fd0e9 --- /dev/null +++ b/addons/gloot/editor/item_editor/properties_editor.gd.uid @@ -0,0 +1 @@ +uid://1taagfx52uw5 diff --git a/addons/gloot/editor/item_editor/prototype_id_editor.gd b/addons/gloot/editor/item_editor/prototype_id_editor.gd deleted file mode 100644 index ed7f6a8..0000000 --- a/addons/gloot/editor/item_editor/prototype_id_editor.gd +++ /dev/null @@ -1,49 +0,0 @@ -@tool -extends Window - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const ChoiceFilter = preload("res://addons/gloot/editor/common/choice_filter.tscn") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const POPUP_MARGIN = 10 - -@onready var _margin_container: MarginContainer = $"MarginContainer" -@onready var _choice_filter: Control = $"MarginContainer/ChoiceFilter" -var item: InventoryItem = null : - set(new_item): - if new_item == null: - return - assert(item == null, "Item already set!") - item = new_item - if item.protoset: - item.protoset.changed.connect(_refresh) - _refresh() - - -func _ready() -> void: - _choice_filter.filter_icon = EditorIcons.get_icon("Search") - about_to_popup.connect(func(): _refresh()) - close_requested.connect(func(): hide()) - _choice_filter.choice_picked.connect(func(value_index: int): _on_choice_picked(value_index)) - hide() - - -func _on_choice_picked(value_index: int) -> void: - assert(item, "Item not set!") - var new_prototype_id = _choice_filter.values[value_index] - if new_prototype_id != item.prototype_id: - GlootUndoRedo.set_item_prototype_id(item, new_prototype_id) - hide() - - -func _refresh() -> void: - _choice_filter.values.clear() - _choice_filter.values.append_array(_get_prototype_ids()) - _choice_filter.refresh() - - -func _get_prototype_ids() -> Array: - if item == null || !item.protoset: - return [] - - return item.protoset._prototypes.keys() - diff --git a/addons/gloot/editor/item_editor/prototype_id_editor.tscn b/addons/gloot/editor/item_editor/prototype_id_editor.tscn deleted file mode 100644 index c73b651..0000000 --- a/addons/gloot/editor/item_editor/prototype_id_editor.tscn +++ /dev/null @@ -1,27 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://bb341bh2pdb6u"] - -[ext_resource type="Script" path="res://addons/gloot/editor/item_editor/prototype_id_editor.gd" id="1_a8scy"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1_prwl8"] - -[node name="PrototypeIdEditor" type="Window"] -title = "Select Prototype ID" -size = Vector2i(300, 300) -visible = false -exclusive = true -script = ExtResource("1_a8scy") - -[node name="MarginContainer" type="MarginContainer" parent="."] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 10 -theme_override_constants/margin_top = 10 -theme_override_constants/margin_right = 10 -theme_override_constants/margin_bottom = 10 - -[node name="ChoiceFilter" parent="MarginContainer" instance=ExtResource("1_prwl8")] -layout_mode = 2 -pick_text = "Select" -filter_text = "Filter Prototypes:" diff --git a/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd b/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd deleted file mode 100644 index 0e1abfe..0000000 --- a/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd +++ /dev/null @@ -1,67 +0,0 @@ -extends EditorProperty - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") - -var updating: bool = false -var _option_button: OptionButton - - -func _init(): - _option_button = OptionButton.new() - add_child(_option_button) - add_focusable(_option_button) - _option_button.item_selected.connect(_on_item_selected) - - -func _ready() -> void: - var item_ref_slot: ItemRefSlot = get_edited_object() - item_ref_slot.inventory_changed.connect(_refresh_option_button) - item_ref_slot.item_equipped.connect(_refresh_option_button) - item_ref_slot.cleared.connect(_refresh_option_button) - _refresh_option_button() - - -func _refresh_option_button() -> void: - _clear_option_button() - _populate_option_button() - - -func _clear_option_button() -> void: - _option_button.clear() - _option_button.add_item("None") - _option_button.set_item_metadata(0, null) - _option_button.select(0) - - -func _populate_option_button() -> void: - if !get_edited_object(): - return - - var item_ref_slot: ItemRefSlot = get_edited_object() - if !item_ref_slot.inventory: - return - - var equipped_item_index := 0 - for item in item_ref_slot.inventory.get_items(): - _option_button.add_icon_item(item.get_texture(), item.get_title()) - var option_item_index = _option_button.get_item_count() - 1 - _option_button.set_item_metadata(option_item_index, item) - if item == item_ref_slot.get_item(): - equipped_item_index = option_item_index - - _option_button.select(equipped_item_index) - - -func _on_item_selected(item_index: int) -> void: - if !get_edited_object() || updating: - return - - updating = true - var item_ref_slot: ItemRefSlot = get_edited_object() - var selected_item: InventoryItem = _option_button.get_item_metadata(item_index) - if item_ref_slot.get_item() != selected_item: - if selected_item == null: - GlootUndoRedo.clear_item_slot(item_ref_slot) - else: - GlootUndoRedo.equip_item_in_item_slot(item_ref_slot, selected_item) - updating = false diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd index a162103..e531c31 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd @@ -1,24 +1,22 @@ @tool extends Control -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") +const _POPUP_SIZE = Vector2i(800, 300) -@onready var hsplit_container = $HSplitContainer -@onready var prototype_id_filter = $HSplitContainer/ChoiceFilter -@onready var btn_edit = $HSplitContainer/VBoxContainer/HBoxContainer/BtnEdit -@onready var btn_clear = $HSplitContainer/VBoxContainer/HBoxContainer/BtnClear -@onready var ctrl_item_slot = $HSplitContainer/VBoxContainer/CtrlItemSlot - -var item_slot: ItemSlot : +var item_slot: ItemSlot: set(new_item_slot): disconnect_item_slot_signals() item_slot = new_item_slot - ctrl_item_slot.item_slot = item_slot + %CtrlItemSlot.item_slot = item_slot connect_item_slot_signals() _refresh() +var _properties_editor: Window + func connect_item_slot_signals(): if !item_slot: @@ -27,9 +25,9 @@ func connect_item_slot_signals(): item_slot.item_equipped.connect(_refresh) item_slot.cleared.connect(_refresh) - if !item_slot.item_protoset: + if !item_slot.protoset: return - item_slot.item_protoset.changed.connect(_refresh) + item_slot.protoset.changed.connect(_refresh) item_slot.protoset_changed.connect(_refresh) @@ -40,9 +38,9 @@ func disconnect_item_slot_signals(): item_slot.item_equipped.disconnect(_refresh) item_slot.cleared.disconnect(_refresh) - if !item_slot.item_protoset: + if !item_slot.protoset: return - item_slot.item_protoset.changed.disconnect(_refresh) + item_slot.protoset.changed.disconnect(_refresh) item_slot.protoset_changed.disconnect(_refresh) @@ -51,25 +49,24 @@ func init(item_slot_: ItemSlot) -> void: func _refresh() -> void: - if !is_inside_tree() || item_slot == null || item_slot.item_protoset == null: + if !is_inside_tree() || item_slot == null || item_slot.protoset == null: return - prototype_id_filter.set_values(item_slot.item_protoset._prototypes.keys()) + %PrototreeViewer.protoset = item_slot.protoset func _ready() -> void: _apply_editor_settings() - prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") - prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") - btn_edit.icon = EditorIcons.get_icon("Edit") - btn_clear.icon = EditorIcons.get_icon("Remove") + %BtnAdd.icon = _EditorIcons.get_icon("Add") + %BtnEdit.icon = _EditorIcons.get_icon("Edit") + %BtnClear.icon = _EditorIcons.get_icon("Remove") - prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) - btn_edit.pressed.connect(_on_btn_edit) - btn_clear.pressed.connect(_on_btn_clear) + %PrototreeViewer.prototype_activated.connect(_on_prototype_activated) + %BtnAdd.pressed.connect(_on_btn_add) + %BtnEdit.pressed.connect(_on_btn_edit) + %BtnClear.pressed.connect(_on_btn_clear) - ctrl_item_slot.item_slot = item_slot - _refresh() + %CtrlItemSlot.item_slot = item_slot func _apply_editor_settings() -> void: @@ -77,30 +74,41 @@ func _apply_editor_settings() -> void: custom_minimum_size.y = control_height -func _on_prototype_id_picked(index: int) -> void: - var prototype_id = prototype_id_filter.values[index] - var item := InventoryItem.new() - if item_slot.get_item() != null: - item_slot.get_item().queue_free() - item.protoset = item_slot.item_protoset - item.prototype_id = prototype_id - GlootUndoRedo.equip_item_in_item_slot(item_slot, item) +func _on_prototype_activated(prototype: Prototype) -> void: + var item := InventoryItem.new(item_slot.protoset, prototype.get_prototype_id()) + _Undoables.undoable_action(item_slot, "Equip item", func(): + return item_slot.equip(item) + ) + + +func _on_btn_add() -> void: + var prototype: Prototype = %PrototreeViewer.get_selected_prototype() + if prototype == null: + return + var item := InventoryItem.new(item_slot.protoset, prototype.get_prototype_id()) + _Undoables.undoable_action(item_slot, "Equip item", func(): + return item_slot.equip(item) + ) func _on_btn_edit() -> void: - if item_slot.get_item() != null: - # Call it deferred, so that the control can clean up - call_deferred("_select_node", item_slot.get_item()) + if item_slot.get_item() == null: + return + if _properties_editor == null: + _properties_editor = _PropertiesEditor.instantiate() + add_child(_properties_editor) + _properties_editor.item = item_slot.get_item() + _properties_editor.popup_centered(_POPUP_SIZE) func _on_btn_clear() -> void: if item_slot.get_item() != null: - item_slot.get_item().queue_free() - GlootUndoRedo.clear_item_slot(item_slot) + _Undoables.undoable_action(item_slot, "Clear slot", func(): + return item_slot.clear() + ) static func _select_node(node: Node) -> void: EditorInterface.get_selection().clear() EditorInterface.get_selection().add_node(node) EditorInterface.edit_node(node) - diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid new file mode 100644 index 0000000..d59ba41 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid @@ -0,0 +1 @@ +uid://uepjmhric6qw diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn index 67a00ff..ed09180 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://bgs0xwufm4k6k"] +[gd_scene load_steps=10 format=3 uid="uid://bgs0xwufm4k6k"] [ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.gd" id="1_d7a2m"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="2_lcnj8"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="3_421wi"] +[ext_resource type="Script" path="res://addons/gloot/editor/common/proto_tree_viewer.gd" id="2_ilkw0"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="3_6ewrx"] -[sub_resource type="Image" id="Image_ktvjb"] +[sub_resource type="Image" id="Image_jy8n2"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -13,22 +13,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_t45ni"] -image = SubResource("Image_ktvjb") +[sub_resource type="ImageTexture" id="ImageTexture_d7qa0"] +image = SubResource("Image_jy8n2") -[sub_resource type="Image" id="Image_rhg3a"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 122, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_3hnnf"] -image = SubResource("Image_rhg3a") - -[sub_resource type="Image" id="Image_8ww1c"] +[sub_resource type="Image" id="Image_scp5p"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -37,10 +25,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_yqex5"] -image = SubResource("Image_8ww1c") +[sub_resource type="ImageTexture" id="ImageTexture_pue5h"] +image = SubResource("Image_scp5p") -[sub_resource type="Image" id="Image_240jw"] +[sub_resource type="Image" id="Image_v1pv7"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -49,11 +37,11 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_ip6wh"] -image = SubResource("Image_240jw") +[sub_resource type="ImageTexture" id="ImageTexture_srjiv"] +image = SubResource("Image_v1pv7") [node name="ItemSlotEditor" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -69,12 +57,23 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="ChoiceFilter" parent="HSplitContainer" instance=ExtResource("2_lcnj8")] +[node name="VBoxContainer2" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PrototreeViewer" type="Tree" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_root = true +script = ExtResource("2_ilkw0") + +[node name="BtnAdd" type="Button" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true layout_mode = 2 -pick_text = "Equip" -pick_icon = SubResource("ImageTexture_t45ni") -filter_text = "Filter Prototypes:" -filter_icon = SubResource("ImageTexture_3hnnf") +text = "Add" +icon = SubResource("ImageTexture_d7qa0") [node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 @@ -82,22 +81,25 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="CtrlItemSlot" type="Control" parent="HSplitContainer/VBoxContainer"] -custom_minimum_size = Vector2(32, 32) +unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 3 -script = ExtResource("3_421wi") +script = ExtResource("3_6ewrx") +icon_stretch_mode = 5 [node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"] layout_mode = 2 [node name="BtnEdit" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Edit" -icon = SubResource("ImageTexture_yqex5") +icon = SubResource("ImageTexture_pue5h") [node name="BtnClear" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Clear" -icon = SubResource("ImageTexture_ip6wh") +icon = SubResource("ImageTexture_srjiv") diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd index ed0d07b..d1d990d 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd @@ -1,14 +1,14 @@ @tool extends Control -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var item_slot_editor: Control = $HBoxContainer/ItemSlotEditor @onready var btn_expand: Button = $HBoxContainer/BtnExpand @onready var _window_dialog: Window = $Window @onready var _item_slot_editor: Control = $Window/MarginContainer/ItemSlotEditor -var item_slot: ItemSlot : +var item_slot: ItemSlot: set(new_item_slot): item_slot = new_item_slot if item_slot_editor: @@ -23,7 +23,7 @@ func _ready() -> void: if item_slot_editor: item_slot_editor.item_slot = item_slot _apply_editor_settings() - btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.icon = _EditorIcons.get_icon("DistractionFree") btn_expand.pressed.connect(on_btn_expand) _window_dialog.close_requested.connect(func(): _window_dialog.hide()) diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid new file mode 100644 index 0000000..817eb2f --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid @@ -0,0 +1 @@ +uid://taqvou1w60nm diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn index d5fcc8f..a085090 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_inspector.gd" id="1_4gsgr"] [ext_resource type="PackedScene" uid="uid://bgs0xwufm4k6k" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.tscn" id="2_ysqy6"] -[sub_resource type="Image" id="Image_ump51"] +[sub_resource type="Image" id="Image_1eklb"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 135, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 140, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 136, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 138, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 126, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 107, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 105, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 224, 224, 224, 129, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 140, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 142, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 138, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -12,11 +12,11 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_eojh7"] -image = SubResource("Image_ump51") +[sub_resource type="ImageTexture" id="ImageTexture_jr7hk"] +image = SubResource("Image_1eklb") [node name="ItemSlotInspector" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -40,7 +40,7 @@ size_flags_horizontal = 3 [node name="BtnExpand" type="Button" parent="HBoxContainer"] layout_mode = 2 -icon = SubResource("ImageTexture_eojh7") +icon = SubResource("ImageTexture_jr7hk") [node name="Window" type="Window" parent="."] title = "Edit Item Slot" diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd b/addons/gloot/editor/protoset_editor/edit_protoset_button.gd deleted file mode 100644 index 408ff63..0000000 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd +++ /dev/null @@ -1,25 +0,0 @@ -@tool -extends Button - -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var window_dialog: Window = $"%Window" -@onready var protoset_editor: Control = $"%ProtosetEditor" - -var protoset: ItemProtoset : - set(new_protoset): - protoset = new_protoset - if protoset_editor: - protoset_editor.protoset = protoset - - -func init(protoset_: ItemProtoset) -> void: - protoset = protoset_ - - -func _ready() -> void: - icon = EditorIcons.get_icon("Edit") - window_dialog.close_requested.connect(func(): protoset.notify_property_list_changed()) - protoset_editor.protoset = protoset - pressed.connect(func(): window_dialog.popup_centered(window_dialog.size)) - diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn b/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn deleted file mode 100644 index 57d03d3..0000000 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn +++ /dev/null @@ -1,37 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://bjme7iuv3j6yb"] - -[ext_resource type="PackedScene" uid="uid://cyj0avrwjowl" path="res://addons/gloot/editor/protoset_editor/protoset_editor.tscn" id="1"] -[ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/edit_protoset_button.gd" id="2"] - -[sub_resource type="Image" id="Image_tnk37"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_18gso"] -image = SubResource("Image_tnk37") - -[node name="EditProtosetButton" type="Button"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "Edit Protoset" -icon = SubResource("ImageTexture_18gso") -script = ExtResource("2") - -[node name="Window" type="Window" parent="."] -unique_name_in_owner = true -title = "Edit Protoset" -size = Vector2i(1000, 600) -visible = false -exclusive = true -min_size = Vector2i(800, 200) - -[node name="ProtosetEditor" parent="Window" instance=ExtResource("1")] -unique_name_in_owner = true diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.gd b/addons/gloot/editor/protoset_editor/protoset_editor.gd deleted file mode 100644 index f880efc..0000000 --- a/addons/gloot/editor/protoset_editor/protoset_editor.gd +++ /dev/null @@ -1,174 +0,0 @@ -@tool -extends Control - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var prototype_filter = $"%PrototypeFilter" -@onready var property_editor = $"%PropertyEditor" -@onready var txt_prototype_id = $"%TxtPrototypeName" -@onready var btn_add_prototype = $"%BtnAddPrototype" -@onready var btn_duplicate_prototype = $"%BtnDuplicatePrototype" -@onready var btn_remove_prototype = $"%BtnRemovePrototype" -@onready var btn_rename_prototype = $"%BtnRenamePrototype" - -var protoset: ItemProtoset : - set(new_protoset): - protoset = new_protoset - if protoset: - protoset.changed.connect(_on_protoset_changed) - _refresh() -var selected_prototype_id: String = "" - - -func _ready() -> void: - prototype_filter.choice_selected.connect(_on_prototype_selected) - property_editor.value_changed.connect(_on_property_changed) - property_editor.value_removed.connect(_on_property_removed) - txt_prototype_id.text_changed.connect(_on_prototype_id_changed) - txt_prototype_id.text_submitted.connect(_on_prototype_id_entered) - btn_add_prototype.pressed.connect(_on_btn_add_prototype) - btn_duplicate_prototype.pressed.connect(_on_btn_duplicate_prototype) - btn_rename_prototype.pressed.connect(_on_btn_rename_prototype) - btn_remove_prototype.pressed.connect(_on_btn_remove_prototype) - - btn_add_prototype.icon = EditorIcons.get_icon("Add") - btn_duplicate_prototype.icon = EditorIcons.get_icon("Duplicate") - btn_rename_prototype.icon = EditorIcons.get_icon("Edit") - btn_remove_prototype.icon = EditorIcons.get_icon("Remove") - prototype_filter.filter_icon = EditorIcons.get_icon("Search") - _refresh() - - -func _refresh() -> void: - if !visible: - return - - _clear() - _populate() - _refresh_btn_add_prototype() - _refresh_btn_rename_prototype() - _refresh_btn_remove_prototype() - _refresh_btn_duplicate_prototype() - _inspect_prototype_id(selected_prototype_id) - - -func _clear() -> void: - prototype_filter.values.clear() - property_editor.dictionary.clear() - property_editor.refresh() - - -func _populate() -> void: - if protoset: - # TODO: Avoid accessing "private" members (_prototypes) - prototype_filter.set_values(protoset._prototypes.keys().duplicate()) - - -func _refresh_btn_add_prototype() -> void: - btn_add_prototype.disabled = txt_prototype_id.text.is_empty() ||\ - protoset.has_prototype(txt_prototype_id.text) - - -func _refresh_btn_rename_prototype() -> void: - btn_rename_prototype.disabled = txt_prototype_id.text.is_empty() ||\ - protoset.has_prototype(txt_prototype_id.text) - - -func _refresh_btn_remove_prototype() -> void: - btn_remove_prototype.disabled = prototype_filter.get_selected_text().is_empty() - - -func _refresh_btn_duplicate_prototype() -> void: - btn_duplicate_prototype.disabled = prototype_filter.get_selected_text().is_empty() - - -func _on_protoset_changed() -> void: - _refresh() - - -func _on_prototype_selected(index: int) -> void: - selected_prototype_id = prototype_filter.values[index] - _inspect_prototype_id(selected_prototype_id) - _refresh_btn_remove_prototype() - _refresh_btn_duplicate_prototype() - - -func _inspect_prototype_id(prototype_id: String) -> void: - if !protoset || !protoset.has_prototype(prototype_id): - return - - var prototype: Dictionary = protoset.get_prototype(prototype_id).duplicate() - - property_editor.dictionary = prototype - property_editor.immutable_keys = [ItemProtoset.KEY_ID] as Array[String] - property_editor.remove_button_map = {} - - for property_name in prototype.keys(): - property_editor.set_remove_button_config(property_name, { - "text": "", - "disabled": property_name == ItemProtoset.KEY_ID, - "icon": EditorIcons.get_icon("Remove"), - }) - - -func _on_property_changed(property_name: String, new_value) -> void: - if selected_prototype_id.is_empty(): - return - var new_properties = protoset.get_prototype(selected_prototype_id).duplicate() - new_properties[property_name] = new_value - - if new_properties.hash() == protoset.get_prototype(selected_prototype_id).hash(): - return - - GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) - - -func _on_property_removed(property_name: String) -> void: - if selected_prototype_id.is_empty(): - return - var new_properties = protoset.get_prototype(selected_prototype_id).duplicate() - new_properties.erase(property_name) - - GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) - - -func _on_prototype_id_changed(_prototype_id: String) -> void: - _refresh_btn_add_prototype() - _refresh_btn_rename_prototype() - - -func _on_prototype_id_entered(prototype_id: String) -> void: - _add_prototype_id(prototype_id) - - -func _on_btn_add_prototype() -> void: - _add_prototype_id(txt_prototype_id.text) - - -func _on_btn_duplicate_prototype() -> void: - GlootUndoRedo.duplicate_prototype(protoset, selected_prototype_id) - - -func _on_btn_rename_prototype() -> void: - if selected_prototype_id.is_empty(): - return - - GlootUndoRedo.rename_prototype(protoset, - selected_prototype_id, - txt_prototype_id.text) - txt_prototype_id.text = "" - - -func _add_prototype_id(prototype_id: String) -> void: - GlootUndoRedo.add_prototype(protoset, prototype_id) - txt_prototype_id.text = "" - - -func _on_btn_remove_prototype() -> void: - if selected_prototype_id.is_empty(): - return - - var prototype_id = selected_prototype_id - if !prototype_id.is_empty(): - GlootUndoRedo.remove_prototype(protoset, prototype_id) diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.tscn b/addons/gloot/editor/protoset_editor/protoset_editor.tscn deleted file mode 100644 index 77aca4e..0000000 --- a/addons/gloot/editor/protoset_editor/protoset_editor.tscn +++ /dev/null @@ -1,155 +0,0 @@ -[gd_scene load_steps=14 format=3 uid="uid://cyj0avrwjowl"] - -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] -[ext_resource type="PackedScene" uid="uid://digtudobrw3xb" path="res://addons/gloot/editor/common/dict_editor.tscn" id="2"] -[ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/protoset_editor.gd" id="3"] - -[sub_resource type="Image" id="Image_3d3lf"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 122, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_ooqbn"] -image = SubResource("Image_3d3lf") - -[sub_resource type="Image" id="Image_7dqyh"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_dehry"] -image = SubResource("Image_7dqyh") - -[sub_resource type="Image" id="Image_nsl4i"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cfl22"] -image = SubResource("Image_nsl4i") - -[sub_resource type="Image" id="Image_o82dw"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_qoier"] -image = SubResource("Image_o82dw") - -[sub_resource type="Image" id="Image_ey4cw"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_i8glk"] -image = SubResource("Image_ey4cw") - -[node name="ProtosetEditor" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("3") - -[node name="Gui" type="HSplitContainer" parent="."] -layout_mode = 0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 5.0 -offset_top = 5.0 -offset_right = -5.0 -offset_bottom = -5.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="Gui"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Label" type="Label" parent="Gui/VBoxContainer"] -layout_mode = 2 -text = "Prototypes" - -[node name="PrototypeFilter" parent="Gui/VBoxContainer" instance=ExtResource("1")] -unique_name_in_owner = true -layout_mode = 2 -pick_button_visible = false -filter_text = "Prototype Filter:" -filter_icon = SubResource("ImageTexture_ooqbn") - -[node name="HBoxContainer2" type="HBoxContainer" parent="Gui/VBoxContainer"] -layout_mode = 2 - -[node name="TxtPrototypeName" type="LineEdit" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Prototype ID" - -[node name="BtnAddPrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add a new prototype with the entered ID" -disabled = true -text = "Add" -icon = SubResource("ImageTexture_dehry") - -[node name="BtnDuplicatePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Duplicate the selected prototype" -disabled = true -text = "Duplicate" -icon = SubResource("ImageTexture_cfl22") - -[node name="BtnRenamePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Rename the selected prototype" -disabled = true -text = "Rename" -icon = SubResource("ImageTexture_qoier") - -[node name="BtnRemovePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Remove the selected prototype" -disabled = true -text = "Remove" -icon = SubResource("ImageTexture_i8glk") - -[node name="VBoxContainer2" type="VBoxContainer" parent="Gui"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Label" type="Label" parent="Gui/VBoxContainer2"] -layout_mode = 2 -text = "Properties" - -[node name="PropertyEditor" parent="Gui/VBoxContainer2" instance=ExtResource("2")] -unique_name_in_owner = true -layout_mode = 2 -dictionary = {} diff --git a/addons/gloot/editor/undoables.gd b/addons/gloot/editor/undoables.gd new file mode 100644 index 0000000..4dd7835 --- /dev/null +++ b/addons/gloot/editor/undoables.gd @@ -0,0 +1,54 @@ +extends Object + +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") + + +static func _get_undo_redo_manager() -> EditorUndoRedoManager: + if Engine.is_editor_hint(): + var Gloot = load("res://addons/gloot/gloot.gd") + if Gloot.instance() == null: + return null + var undo_redo_manager = Gloot.instance().get_undo_redo() + if undo_redo_manager == null: + return null + return undo_redo_manager + else: + return null + + +static func _undoable_action_impl(objects: Array, action_name: String, callable: Callable) -> bool: + var undo_redo_manager = _get_undo_redo_manager() + if undo_redo_manager == null: + return callable.call() + + var old_states := _serialize_objects(objects) + var result: bool = callable.call() + if !result: + return false + var new_states := _serialize_objects(objects) + + undo_redo_manager.create_action(action_name) + undo_redo_manager.add_do_method(_Undoables, "_deserialize_objects", objects, new_states) + undo_redo_manager.add_undo_method(_Undoables, "_deserialize_objects", objects, old_states) + undo_redo_manager.commit_action() + + return true + + +static func _deserialize_objects(objects: Array, object_data: Array[Dictionary]) -> void: + assert(objects.size() == object_data.size()) + for i in range(objects.size()): + objects[i].deserialize(object_data[i]) + + +static func _serialize_objects(objects: Array) -> Array[Dictionary]: + var result: Array[Dictionary] + for object in objects: + result.push_back(object.serialize()) + return result + + +static func undoable_action(object: Variant, action_name: String, callable: Callable) -> bool: + if typeof(object) == TYPE_ARRAY: + return _undoable_action_impl(object, action_name, callable) + return _undoable_action_impl([object], action_name, callable) diff --git a/addons/gloot/editor/undoables.gd.uid b/addons/gloot/editor/undoables.gd.uid new file mode 100644 index 0000000..274aef9 --- /dev/null +++ b/addons/gloot/editor/undoables.gd.uid @@ -0,0 +1 @@ +uid://ckefa71x887kb diff --git a/addons/gloot/gloot.gd b/addons/gloot/gloot.gd index dde288b..0ebe74d 100644 --- a/addons/gloot/gloot.gd +++ b/addons/gloot/gloot.gd @@ -24,12 +24,7 @@ func _exit_tree() -> void: remove_inspector_plugin(inspector_plugin) func _add_settings() -> void: - _add_setting("gloot/inspector_control_height", TYPE_INT, 200) - _add_setting("gloot/item_dragging_deadzone_radius", TYPE_FLOAT, 8.0) - _add_setting("gloot/JSON_serialization/indent_using_spaces", TYPE_BOOL, true) - _add_setting("gloot/JSON_serialization/indent_size", TYPE_INT, 4) - _add_setting("gloot/JSON_serialization/sort_keys", TYPE_BOOL, true) - _add_setting("gloot/JSON_serialization/full_precision", TYPE_BOOL, false) + _add_setting("gloot/inspector_control_height", TYPE_INT, 300) func _add_setting(name: String, type: int, value) -> void: diff --git a/addons/gloot/gloot.gd.uid b/addons/gloot/gloot.gd.uid new file mode 100644 index 0000000..962d16c --- /dev/null +++ b/addons/gloot/gloot.gd.uid @@ -0,0 +1 @@ +uid://c3xsv6ylc1vpg diff --git a/addons/gloot/images/icon_ctrl_capacity.svg b/addons/gloot/images/icon_ctrl_capacity.svg new file mode 100644 index 0000000..68c0a86 --- /dev/null +++ b/addons/gloot/images/icon_ctrl_capacity.svg @@ -0,0 +1,71 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/gloot/images/icon_ctrl_capacity.svg.import b/addons/gloot/images/icon_ctrl_capacity.svg.import new file mode 100644 index 0000000..09265db --- /dev/null +++ b/addons/gloot/images/icon_ctrl_capacity.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vbaob50r5jx8" +path="res://.godot/imported/icon_ctrl_capacity.svg-164a0ccaaa67843fd69711b8f7cc5a8f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_ctrl_capacity.svg" +dest_files=["res://.godot/imported/icon_ctrl_capacity.svg-164a0ccaaa67843fd69711b8f7cc5a8f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_ctrl_inventory_item.svg b/addons/gloot/images/icon_ctrl_inventory_item.svg new file mode 100644 index 0000000..4f84a1b --- /dev/null +++ b/addons/gloot/images/icon_ctrl_inventory_item.svg @@ -0,0 +1,83 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/gloot/images/icon_ctrl_inventory_item.svg.import b/addons/gloot/images/icon_ctrl_inventory_item.svg.import new file mode 100644 index 0000000..89a7158 --- /dev/null +++ b/addons/gloot/images/icon_ctrl_inventory_item.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gypy8asicowf" +path="res://.godot/imported/icon_ctrl_inventory_item.svg-4ddfc5bdcdf5d97ce81d110d6f8c27ff.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_ctrl_inventory_item.svg" +dest_files=["res://.godot/imported/icon_ctrl_inventory_item.svg-4ddfc5bdcdf5d97ce81d110d6f8c27ff.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_ctrl_inventory_stacked.svg b/addons/gloot/images/icon_ctrl_inventory_stacked.svg deleted file mode 100644 index 4f28b24..0000000 --- a/addons/gloot/images/icon_ctrl_inventory_stacked.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_ctrl_inventory_stacked.svg.import b/addons/gloot/images/icon_ctrl_inventory_stacked.svg.import deleted file mode 100644 index e222e86..0000000 --- a/addons/gloot/images/icon_ctrl_inventory_stacked.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://t7dislu7ps55" -path="res://.godot/imported/icon_ctrl_inventory_stacked.svg-dae2677f1073d9d3b7050efd77843e49.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_ctrl_inventory_stacked.svg" -dest_files=["res://.godot/imported/icon_ctrl_inventory_stacked.svg-dae2677f1073d9d3b7050efd77843e49.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_grid_constraint.svg b/addons/gloot/images/icon_grid_constraint.svg new file mode 100644 index 0000000..d485dca --- /dev/null +++ b/addons/gloot/images/icon_grid_constraint.svg @@ -0,0 +1,72 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/addons/gloot/images/icon_grid_constraint.svg.import b/addons/gloot/images/icon_grid_constraint.svg.import new file mode 100644 index 0000000..81a1aa8 --- /dev/null +++ b/addons/gloot/images/icon_grid_constraint.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cialwsw8quwo1" +path="res://.godot/imported/icon_grid_constraint.svg-31bb15f33a36c5e8b232c725fef3f0ae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_grid_constraint.svg" +dest_files=["res://.godot/imported/icon_grid_constraint.svg-31bb15f33a36c5e8b232c725fef3f0ae.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_inventory_grid.svg b/addons/gloot/images/icon_inventory_grid.svg deleted file mode 100644 index 38e05f7..0000000 --- a/addons/gloot/images/icon_inventory_grid.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/addons/gloot/images/icon_inventory_grid.svg.import b/addons/gloot/images/icon_inventory_grid.svg.import deleted file mode 100644 index 0508e6f..0000000 --- a/addons/gloot/images/icon_inventory_grid.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://kd75uhabf1gk" -path="res://.godot/imported/icon_inventory_grid.svg-aa0d41ee8a4783e96656b0c95fc25600.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_inventory_grid.svg" -dest_files=["res://.godot/imported/icon_inventory_grid.svg-aa0d41ee8a4783e96656b0c95fc25600.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_inventory_grid_stacked.svg b/addons/gloot/images/icon_inventory_grid_stacked.svg deleted file mode 100644 index 75e6b60..0000000 --- a/addons/gloot/images/icon_inventory_grid_stacked.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_inventory_grid_stacked.svg.import b/addons/gloot/images/icon_inventory_grid_stacked.svg.import deleted file mode 100644 index 3c371fe..0000000 --- a/addons/gloot/images/icon_inventory_grid_stacked.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bo38cy4myqvpu" -path="res://.godot/imported/icon_inventory_grid_stacked.svg-33302053cec4b39ebb5b7a7b1bea5293.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_inventory_grid_stacked.svg" -dest_files=["res://.godot/imported/icon_inventory_grid_stacked.svg-33302053cec4b39ebb5b7a7b1bea5293.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_inventory_stacked.svg b/addons/gloot/images/icon_inventory_stacked.svg deleted file mode 100644 index c5f3471..0000000 --- a/addons/gloot/images/icon_inventory_stacked.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_inventory_stacked.svg.import b/addons/gloot/images/icon_inventory_stacked.svg.import deleted file mode 100644 index 67a4717..0000000 --- a/addons/gloot/images/icon_inventory_stacked.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ch1f50xu37dvo" -path="res://.godot/imported/icon_inventory_stacked.svg-e621060af73c305939da691316b0c966.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_inventory_stacked.svg" -dest_files=["res://.godot/imported/icon_inventory_stacked.svg-e621060af73c305939da691316b0c966.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_item.svg b/addons/gloot/images/icon_item.svg deleted file mode 100644 index dc265c1..0000000 --- a/addons/gloot/images/icon_item.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item.svg.import b/addons/gloot/images/icon_item.svg.import deleted file mode 100644 index 87f2f07..0000000 --- a/addons/gloot/images/icon_item.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://qlt0i7muj2tj" -path="res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_item.svg" -dest_files=["res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_item_count_constraint.svg b/addons/gloot/images/icon_item_count_constraint.svg new file mode 100644 index 0000000..9d4de18 --- /dev/null +++ b/addons/gloot/images/icon_item_count_constraint.svg @@ -0,0 +1,72 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/addons/gloot/images/icon_item_count_constraint.svg.import b/addons/gloot/images/icon_item_count_constraint.svg.import new file mode 100644 index 0000000..f2baa56 --- /dev/null +++ b/addons/gloot/images/icon_item_count_constraint.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cic8j2p02o0cn" +path="res://.godot/imported/icon_item_count_constraint.svg-6ba65dc6693bf362d833b589d299e1ff.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_item_count_constraint.svg" +dest_files=["res://.godot/imported/icon_item_count_constraint.svg-6ba65dc6693bf362d833b589d299e1ff.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_item_protoset.svg b/addons/gloot/images/icon_item_protoset.svg deleted file mode 100644 index 159b4ac..0000000 --- a/addons/gloot/images/icon_item_protoset.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item_protoset.svg.import b/addons/gloot/images/icon_item_protoset.svg.import deleted file mode 100644 index 816fddd..0000000 --- a/addons/gloot/images/icon_item_protoset.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dbepw1v0gp80y" -path="res://.godot/imported/icon_item_protoset.svg-3584e3e1df3de7b231a248b80bd83194.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_item_protoset.svg" -dest_files=["res://.godot/imported/icon_item_protoset.svg-3584e3e1df3de7b231a248b80bd83194.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_item_ref_slot.svg b/addons/gloot/images/icon_item_ref_slot.svg deleted file mode 100644 index c5da49e..0000000 --- a/addons/gloot/images/icon_item_ref_slot.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item_ref_slot.svg.import b/addons/gloot/images/icon_item_ref_slot.svg.import deleted file mode 100644 index ceb9a0d..0000000 --- a/addons/gloot/images/icon_item_ref_slot.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dagqmcoxvm3m6" -path="res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_item_ref_slot.svg" -dest_files=["res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_weight_constraint.svg b/addons/gloot/images/icon_weight_constraint.svg new file mode 100644 index 0000000..08c005d --- /dev/null +++ b/addons/gloot/images/icon_weight_constraint.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/gloot/images/icon_weight_constraint.svg.import b/addons/gloot/images/icon_weight_constraint.svg.import new file mode 100644 index 0000000..2383ef2 --- /dev/null +++ b/addons/gloot/images/icon_weight_constraint.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wkf6siqakc38" +path="res://.godot/imported/icon_weight_constraint.svg-4c78f8924ceb8ed32de7cdd9d5bc492c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_weight_constraint.svg" +dest_files=["res://.godot/imported/icon_weight_constraint.svg-4c78f8924ceb8ed32de7cdd9d5bc492c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/plugin.cfg b/addons/gloot/plugin.cfg index 0ba1162..73c639e 100644 --- a/addons/gloot/plugin.cfg +++ b/addons/gloot/plugin.cfg @@ -3,5 +3,5 @@ name="GLoot" description="A universal inventory system for the Godot game engine" author="Peter Kish" -version="2.4.8" +version="3.0.0" script="gloot.gd" diff --git a/addons/gloot/ui/README.md b/addons/gloot/ui/README.md new file mode 100644 index 0000000..b6cd226 --- /dev/null +++ b/addons/gloot/ui/README.md @@ -0,0 +1,20 @@ +# UI Directory Contents + +## Files + +| Directory | Description | +| --------------------------------------------- | ----------- | +| `ctrl_draggable_inventory_item.gd` | Implements draggable inventory items. | +| `ctrl_draggable.gd` | Implements draggable UI controls. | +| `ctrl_drop_zone.gd` | Implements UI controls that can receive dragged controls | +| `ctrl_inventory_capacity.gd` | `CtrlItemCapacity` implementation. | +| `ctrl_inventory_grid_basic.gd` | Helper script for displaying inventory items on a grid. | +| `ctrl_inventory_grid.gd` | `CtrlInventoryGrid` implementation. | +| `ctrl_inventory_item_base.gd` | `CtrlInventoryItemBase` implementation. | +| `ctrl_inventory_item.gd` | `CtrlInventoryItem` implementation. | +| `ctrl_inventory_universal.gd` | Implements a UI control that can display any inventory. | +| `ctrl_inventory.gd` | `CtrlInventory` implementation. | +| `ctrl_item_slot.gd` | `CtrlItemSlot` implementation. | +| `ctrl_inventory_grid_field_style_normal.tres` | The default grid field background style for `CtrlInventoryGrid`. | +| `ctrl_inventory_grid_style_background.tres` | The default style used for the inventory background in `CtrlInventoryGrid`. | +| `ctrl_inventory_grid_style_selection.tres` | The default style used for displaying item selections in `CtrlInventoryGrid`. | diff --git a/addons/gloot/ui/ctrl_dragable.gd b/addons/gloot/ui/ctrl_dragable.gd deleted file mode 100644 index a6acee1..0000000 --- a/addons/gloot/ui/ctrl_dragable.gd +++ /dev/null @@ -1,81 +0,0 @@ -@tool -extends Control - -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") - -# Somewhat hacky way to do static signals: -# https://stackoverflow.com/questions/77026156/how-to-write-a-static-event-emitter-in-gdscript/77026952#77026952 - -static var dragable_grabbed: Signal = (func(): - if (CtrlDragable as Object).has_user_signal("dragable_grabbed"): - return (CtrlDragable as Object).dragable_grabbed - (CtrlDragable as Object).add_user_signal("dragable_grabbed") - return Signal(CtrlDragable, "dragable_grabbed") -).call() - -static var dragable_dropped: Signal = (func(): - if (CtrlDragable as Object).has_user_signal("dragable_dropped"): - return (CtrlDragable as Object).dragable_dropped - (CtrlDragable as Object).add_user_signal("dragable_dropped") - return Signal(CtrlDragable, "dragable_dropped") -).call() - -signal grabbed(position) -signal dropped(zone, position) - -static var _grabbed_dragable: CtrlDragable = null -static var _grab_offset: Vector2 - -var _enabled: bool = true - - -static func get_grabbed_dragable() -> CtrlDragable: - if !is_instance_valid(_grabbed_dragable): - return null - return _grabbed_dragable - - -static func get_grab_offset() -> Vector2: - return _grab_offset - - -static func get_grab_offset_local_to(control: Control) -> Vector2: - return CtrlDragable.get_grab_offset() / control.get_global_transform().get_scale() - - -func _get_drag_data(at_position: Vector2): - if !_enabled: - return null - - _grabbed_dragable = self - _grab_offset = at_position * get_global_transform().get_scale() - dragable_grabbed.emit(_grabbed_dragable, _grab_offset) - grabbed.emit(_grab_offset) - - var preview = Control.new() - var sub_preview = create_preview() - sub_preview.position = -get_grab_offset() - preview.add_child(sub_preview) - set_drag_preview(preview) - return self - - -func create_preview() -> Control: - return null - - -func activate() -> void: - _enabled = true - - -func deactivate() -> void: - _enabled = false - - -func is_active() -> bool: - return _enabled - - -func is_dragged() -> bool: - return _grabbed_dragable == self diff --git a/addons/gloot/ui/ctrl_draggable_inventory_item.gd b/addons/gloot/ui/ctrl_draggable_inventory_item.gd new file mode 100644 index 0000000..0c7b50d --- /dev/null +++ b/addons/gloot/ui/ctrl_draggable_inventory_item.gd @@ -0,0 +1,86 @@ +@tool +extends Control + +signal activated +signal clicked(at_position: Vector2, mouse_button_index: int) + +var item: InventoryItem: + set(new_item): + if item == new_item: + return + + item = new_item + if is_instance_valid(_ctrl_inventory_item): + _ctrl_inventory_item.item = item +var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE: + set(new_stretch_mode): + if icon_stretch_mode == new_stretch_mode: + return + icon_stretch_mode = new_stretch_mode + if is_instance_valid(_ctrl_inventory_item): + _ctrl_inventory_item.icon_stretch_mode = icon_stretch_mode +var ctrl_inventory_item_scene: PackedScene = null +var _ctrl_inventory_item: CtrlInventoryItemBase +static var _grab_offset: Vector2 + + +func _ready() -> void: + if ctrl_inventory_item_scene == null: + _ctrl_inventory_item = CtrlInventoryItem.new() + else: + _ctrl_inventory_item = ctrl_inventory_item_scene.instantiate() + _ctrl_inventory_item.name = "CtrlInventoryItemBase" + _ctrl_inventory_item.size = size + _ctrl_inventory_item.item = item + _ctrl_inventory_item.icon_stretch_mode = icon_stretch_mode + _ctrl_inventory_item.mouse_filter = Control.MOUSE_FILTER_IGNORE + + add_child(_ctrl_inventory_item) + + resized.connect(func(): + _ctrl_inventory_item.size = size + ) + + +func _get_drag_data(at_position: Vector2) -> Variant: + _grab_offset = at_position * get_global_transform().get_scale() + + var sub_preview: Control = null + sub_preview = _create_preview() + if sub_preview == null: + return null + var preview = Control.new() + sub_preview.position = -_grab_offset + preview.add_child(sub_preview) + set_drag_preview(preview) + + return item + + +static func get_grab_offset_local_to(control: Control) -> Vector2: + return _grab_offset / control.get_global_transform().get_scale() + + +func _create_preview() -> Control: + var preview: CtrlInventoryItemBase + if ctrl_inventory_item_scene == null: + preview = CtrlInventoryItem.new() + else: + preview = ctrl_inventory_item_scene.instantiate() + preview.item = item + preview.size = size + preview.icon_stretch_mode = icon_stretch_mode + return preview + + +func _gui_input(event: InputEvent) -> void: + if !(event is InputEventMouseButton): + return + + var mb_event: InputEventMouseButton = event + if !mb_event.pressed: + return + if mb_event.button_index == MOUSE_BUTTON_LEFT: + if mb_event.double_click: + activated.emit() + clicked.emit(mb_event.position, mb_event.button_index) diff --git a/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid b/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid new file mode 100644 index 0000000..c5333c9 --- /dev/null +++ b/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid @@ -0,0 +1 @@ +uid://bn6806v4hesei diff --git a/addons/gloot/ui/ctrl_drop_zone.gd b/addons/gloot/ui/ctrl_drop_zone.gd deleted file mode 100644 index ec8579a..0000000 --- a/addons/gloot/ui/ctrl_drop_zone.gd +++ /dev/null @@ -1,30 +0,0 @@ -@tool -extends Control - -signal dragable_dropped(dragable, position) - -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") - - -func activate() -> void: - mouse_filter = Control.MOUSE_FILTER_PASS - - -func deactivate() -> void: - mouse_filter = Control.MOUSE_FILTER_IGNORE - - -func is_active() -> bool: - return (mouse_filter != Control.MOUSE_FILTER_IGNORE) - - -func _can_drop_data(at_position: Vector2, data) -> bool: - return data is CtrlDragable - - -func _drop_data(at_position: Vector2, data) -> void: - var local_offset := CtrlDragable.get_grab_offset_local_to(self) - dragable_dropped.emit(data, at_position - local_offset) - CtrlDragable.dragable_dropped.emit(data, self, at_position - local_offset) - - diff --git a/addons/gloot/ui/ctrl_inventory.gd b/addons/gloot/ui/ctrl_inventory.gd index c306bfa..a7d6bc9 100644 --- a/addons/gloot/ui/ctrl_inventory.gd +++ b/addons/gloot/ui/ctrl_inventory.gd @@ -1,196 +1,158 @@ @tool @icon("res://addons/gloot/images/icon_ctrl_inventory.svg") class_name CtrlInventory -extends Control - -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) - -enum SelectMode {SELECT_SINGLE = ItemList.SELECT_SINGLE, SELECT_MULTI = ItemList.SELECT_MULTI} - -@export var inventory_path: NodePath : - set(new_inv_path): - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is Inventory) - - inventory = node - update_configuration_warnings() - - -@export var default_item_icon: Texture2D -@export_enum("Single", "Multi") var select_mode: int = SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_item_list): - _item_list.deselect_all(); - _item_list.select_mode = select_mode -var inventory: Inventory = null : - set(new_inventory): - if new_inventory == inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - _queue_refresh() -var _vbox_container: VBoxContainer -var _item_list: ItemList -var _refresh_queued: bool = false +extends ItemList +## Control node for displaying inventories. +## +## Displays inventories as an `ItemList`. +signal inventory_item_activated(item: InventoryItem) ## Emitted when an inventory item has been double-clicked. +signal inventory_item_clicked(item: InventoryItem, at_position: Vector2, mouse_button_index: int) ## Emitted when an inventory item has been clicked. +signal inventory_item_selected(item: InventoryItem) ## Emitted when an inventory item has been selected. -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory, so it can't display any content.\n" + \ - "Set the inventory_path property to point to an Inventory node."]) - return PackedStringArray() - +const _Utils = preload("res://addons/gloot/core/utils.gd") -func _ready(): - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_vbox_container): - _vbox_container.queue_free() +## Reference to the inventory that is being displayed. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return - _vbox_container = VBoxContainer.new() - _vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL - _vbox_container.size_flags_vertical = SIZE_EXPAND_FILL - _vbox_container.anchor_right = 1.0 - _vbox_container.anchor_bottom = 1.0 - add_child(_vbox_container) + if new_inventory == null: + _disconnect_inventory_signals() + inventory = null + _clear() + update_configuration_warnings() + return - _item_list = ItemList.new() - _item_list.size_flags_horizontal = SIZE_EXPAND_FILL - _item_list.size_flags_vertical = SIZE_EXPAND_FILL - _item_list.item_activated.connect(_on_list_item_activated) - _item_list.item_clicked.connect(_on_list_item_clicked) - _item_list.select_mode = select_mode - _vbox_container.add_child(_item_list) + inventory = new_inventory + if inventory.is_node_ready(): + _refresh() + _connect_inventory_signals() + update_configuration_warnings() - if has_node(inventory_path): - inventory = get_node(inventory_path) - _queue_refresh() +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventory node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + return PackedStringArray() func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.connect(_on_item_property_changed) + if !inventory.is_node_ready(): + _Utils.safe_connect(inventory.ready, _refresh) + inventory.protoset_changed.connect(_refresh) + inventory.item_property_changed.connect(_on_item_property_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) + inventory.item_moved.connect(_on_item_manipulated) func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return + _Utils.safe_disconnect(inventory.ready, _refresh) + inventory.protoset_changed.disconnect(_refresh) + inventory.item_property_changed.disconnect(_on_item_property_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) + inventory.item_moved.disconnect(_on_item_manipulated) - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.disconnect(_on_item_property_changed) +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == InventoryItem._KEY_NAME || property == Inventory._KEY_STACK_SIZE: + set_item_text(inventory.get_item_index(item), _get_item_title(item)) + if property == InventoryItem._KEY_IMAGE: + set_item_icon(inventory.get_item_index(item), item.get_texture()) -func _on_list_item_activated(index: int) -> void: - inventory_item_activated.emit(_get_inventory_item(index)) +func _on_item_manipulated(item: InventoryItem) -> void: + _refresh() -func _on_list_item_clicked(index: int, at_position: Vector2, mouse_button_index: int) -> void: - if mouse_button_index == MOUSE_BUTTON_RIGHT: - inventory_item_context_activated.emit(_get_inventory_item(index)) +func _ready() -> void: + item_activated.connect(_on_list_item_activated) + item_clicked.connect(_on_list_item_clicked) + item_selected.connect(_on_list_item_selected) + _refresh() -func _on_item_property_changed(_item: InventoryItem, property_name: String) -> void: - if property_name in [InventoryItem.KEY_NAME, InventoryItem.KEY_IMAGE]: - _queue_refresh() +func _on_list_item_activated(index: int) -> void: + inventory_item_activated.emit(_get_inventory_item(index)) -func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false +func _on_list_item_clicked(index: int, at_position: Vector2, mouse_button_index: int) -> void: + inventory_item_clicked.emit(_get_inventory_item(index), at_position, mouse_button_index) -func _queue_refresh() -> void: - _refresh_queued = true +func _on_list_item_selected(index: int) -> void: + inventory_item_selected.emit(_get_inventory_item(index)) -func _refresh() -> void: - if is_inside_tree(): - _clear_list() - _populate_list() +## Returns the selected inventory item. If multiple items are selected, it returns the first one. +func get_selected_inventory_item() -> InventoryItem: + if get_selected_items().is_empty(): + return null -func _clear_list() -> void: - if is_instance_valid(_item_list): - _item_list.clear() + return _get_inventory_item(get_selected_items()[0]) -func _populate_list() -> void: - if !is_instance_valid(inventory): - return +## Returns an array of selected inventory items. +func get_selected_inventory_items() -> Array[InventoryItem]: + var result: Array[InventoryItem] + var indexes = get_selected_items() + for i in indexes: + result.append(_get_inventory_item(i)) + return result - for item in inventory.get_items(): - var texture := item.get_texture() - if !texture: - texture = default_item_icon - _item_list.add_item(_get_item_title(item), texture) - _item_list.set_item_metadata(_item_list.get_item_count() - 1, item) +func _get_inventory_item(index: int) -> InventoryItem: + assert(index >= 0) + assert(index < get_item_count()) + return get_item_metadata(index) -func _get_item_title(item: InventoryItem) -> String: - if item == null: - return "" - var title = item.get_title() - var stack_size: int = InventoryStacked.get_item_stack_size(item) - if stack_size > 1: - title = "%s (x%d)" % [title, stack_size] +func _refresh() -> void: + _clear() + _populate() - return title +func _clear() -> void: + clear() -func get_selected_inventory_item() -> InventoryItem: - if _item_list.get_selected_items().is_empty(): - return null - return _get_inventory_item(_item_list.get_selected_items()[0]) +func _populate() -> void: + if inventory == null: + return + for item in inventory.get_items(): + var texture := item.get_texture() + add_item(_get_item_title(item), texture) + set_item_metadata(get_item_count() - 1, item) -func get_selected_inventory_items() -> Array[InventoryItem]: - var result: Array[InventoryItem] - var indexes = _item_list.get_selected_items() - for i in indexes: - result.append(_get_inventory_item(i)) - return result +func _get_item_title(item: InventoryItem) -> String: + if item == null: + return "" -func _get_inventory_item(index: int) -> InventoryItem: - assert(index >= 0) - assert(index < _item_list.get_item_count()) + var title = item.get_title() + var stack_size := item.get_stack_size() + if stack_size > 1: + title = "%s (x%d)" % [title, stack_size] - return _item_list.get_item_metadata(index) + return title -func deselect_inventory_item() -> void: - _item_list.deselect_all() +## Deselects all selected inventory items. +func deselect_inventory_items() -> void: + deselect_all() +## Selects the given inventory item. func select_inventory_item(item: InventoryItem) -> void: - _item_list.deselect_all() - for index in _item_list.item_count: - if _item_list.get_item_metadata(index) != item: - continue - _item_list.select(index) - return + deselect_all() + for index in item_count: + if get_item_metadata(index) != item: + continue + select(index) + return diff --git a/addons/gloot/ui/ctrl_inventory.gd.uid b/addons/gloot/ui/ctrl_inventory.gd.uid new file mode 100644 index 0000000..f7863f4 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory.gd.uid @@ -0,0 +1 @@ +uid://dkbsp26xx24nl diff --git a/addons/gloot/ui/ctrl_inventory_capacity.gd b/addons/gloot/ui/ctrl_inventory_capacity.gd new file mode 100644 index 0000000..0bbc7dc --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_capacity.gd @@ -0,0 +1,135 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_capacity.svg") +class_name CtrlInventoryCapacity +extends Control +## Control node for displaying inventory capacity. +## +## Displays the inventory capacity as a progress bar. + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +## Includes a label displaying inventory capacity if enabled. +@export var show_label = true: + set(new_show_label): + if new_show_label == show_label: + return + show_label = new_show_label + if _label != null: + _label.visible = show_label + +## Reference to an inventory with a WeightConstraint or an ItemCountConstraint. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + + if inventory != null: + _disconnect_inventory_signals() + inventory = new_inventory + if inventory != null: + _connect_inventory_signals() + _refresh() + update_configuration_warnings() + +var _progress_bar: ProgressBar +var _label: Label + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryCapacity node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its capacity."]) + if inventory.get_constraint(WeightConstraint) == null && inventory.get_constraint(ItemCountConstraint) == null: + return PackedStringArray([ + "The inventory has no WeightConstraint or ItemCountConstraint child node. Add a WeightConstraint or" \ + + "an ItemCountConstraint to the inventory to be able to display its capacity."]) + return PackedStringArray() + + +func _connect_inventory_signals() -> void: + if !inventory.is_node_ready(): + _Utils.safe_connect(inventory.ready, _refresh) + inventory.protoset_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) + inventory.item_property_changed.connect(_on_item_property_changed) + + +func _disconnect_inventory_signals() -> void: + _Utils.safe_disconnect(inventory.ready, _refresh) + inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) + inventory.item_property_changed.disconnect(_on_item_property_changed) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + if (constraint is WeightConstraint) or (constraint is ItemCountConstraint): + _refresh() + + +func _on_item_manipulated(item: InventoryItem) -> void: + _refresh() + + +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property in [Inventory._KEY_STACK_SIZE, WeightConstraint._KEY_WEIGHT]: + _refresh() + + +func _refresh() -> void: + if !is_instance_valid(_label) || !is_instance_valid(_progress_bar): + return + + _label.text = "" + _progress_bar.min_value = 0 + _progress_bar.max_value = 1 + if inventory == null || !inventory.is_node_ready(): + return + + var weight_constraint := inventory.get_constraint(WeightConstraint) + if weight_constraint != null: + _progress_bar.max_value = weight_constraint.capacity + _label.text = "%s/%s" % [str(weight_constraint.get_occupied_space()), str(weight_constraint.capacity)] + _progress_bar.value = weight_constraint.get_occupied_space() + return + + var item_count_constraint := inventory.get_constraint(ItemCountConstraint) + if item_count_constraint != null: + _progress_bar.max_value = item_count_constraint.capacity + _label.text = "%s/%s" % [str(inventory.get_item_count()), str(item_count_constraint.capacity)] + _progress_bar.value = inventory.get_item_count() + return + + +func _ready() -> void: + _progress_bar = ProgressBar.new() + _progress_bar.show_percentage = false + add_child(_progress_bar) + + _label = Label.new() + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.visible = show_label + add_child(_label) + + custom_minimum_size.y = _label.size.y + size.y = _label.size.y + _label.size.x = size.x + _progress_bar.size = size + _label.resized.connect(func(): + custom_minimum_size.y = _label.size.y + size.y = _label.size.y + ) + resized.connect(func(): + _progress_bar.size = size + _label.size.x = size.x + ) + + _refresh() diff --git a/addons/gloot/ui/ctrl_inventory_capacity.gd.uid b/addons/gloot/ui/ctrl_inventory_capacity.gd.uid new file mode 100644 index 0000000..6c7cbce --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_capacity.gd.uid @@ -0,0 +1 @@ +uid://7mojm1gbttyw diff --git a/addons/gloot/ui/ctrl_inventory_grid.gd b/addons/gloot/ui/ctrl_inventory_grid.gd index 09e6372..eade4c3 100644 --- a/addons/gloot/ui/ctrl_inventory_grid.gd +++ b/addons/gloot/ui/ctrl_inventory_grid.gd @@ -2,292 +2,517 @@ @icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") class_name CtrlInventoryGrid extends Control - -signal item_dropped(item, offset) -signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) - -const CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") - -class GridControl extends Control: - var color: Color = Color.BLACK : - set(new_color): - if new_color == color: - return - color = new_color - queue_redraw() - var dimensions: Vector2i = Vector2i.ZERO : - set(new_dimensions): - if new_dimensions == dimensions: - return - dimensions = new_dimensions - queue_redraw() - - func _init(color_: Color, dimensions_: Vector2i) -> void: - color = color_ - dimensions = dimensions_ - - func _draw() -> void: - var rect = Rect2(Vector2.ZERO, size) - draw_rect(rect, color, false) - - if dimensions.x < 1 || dimensions.y < 1: - return - - for i in range(1, dimensions.x): - var from: Vector2 = Vector2(i * size.x / dimensions.x, 0) - var to: Vector2 = Vector2(i * size.x / dimensions.x, size.y) - draw_line(from, to, color) - for j in range(1, dimensions.y): - var from: Vector2 = Vector2(0, j * size.y / dimensions.y) - var to: Vector2 = Vector2(size.x, j * size.y / dimensions.y) - draw_line(from, to, color) - - -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.default_item_texture = new_default_item_texture - default_item_texture = new_default_item_texture -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.stretch_item_sprites = new_stretch_item_sprites - stretch_item_sprites = new_stretch_item_sprites -@export var field_dimensions: Vector2 = Vector2(32, 32) : - set(new_field_dimensions): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions - field_dimensions = new_field_dimensions -@export var item_spacing: int = 0 : - set(new_item_spacing): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.item_spacing = new_item_spacing - item_spacing = new_item_spacing -@export var draw_grid: bool = true : - set(new_draw_grid): - if new_draw_grid == draw_grid: - return - draw_grid = new_draw_grid - _queue_refresh() -@export var grid_color: Color = Color.BLACK : - set(new_grid_color): - if(new_grid_color == grid_color): - return - grid_color = new_grid_color - _queue_refresh() -@export var draw_selections: bool = false : - set(new_draw_selections): - if new_draw_selections == draw_selections: - return - draw_selections = new_draw_selections - _queue_refresh() -@export var selection_color: Color = Color.GRAY : - set(new_selection_color): - if(new_selection_color == selection_color): - return - selection_color = new_selection_color - _queue_refresh() -@export_enum("Single", "Multi") var select_mode: int = CtrlInventoryGridBasic.SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.select_mode = select_mode - -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.inventory = inventory - _queue_refresh() - -var _ctrl_grid: GridControl = null -var _ctrl_selection: Control = null -var _ctrl_inventory_grid_basic: CtrlInventoryGridBasic = null +## Control node for displaying inventories with a GridConstraint. +## +## Displays the inventory contents on a 2D grid. The grid style, size and item icons are customizable. + +signal item_dropped(item: InventoryItem, offset: Vector2) ## Emitted when an item has been dropped onto the 2D grid. +signal selection_changed ## Emitted when the item selection has changed. +signal inventory_item_activated(item: InventoryItem) ## Emitted when an inventory item has been double-clicked. +signal inventory_item_clicked(item: InventoryItem) ## Emitted when an inventory item has been right-clicked. +signal inventory_item_selected(item: InventoryItem) ## Emitted when an inventory item has been selected. +signal item_mouse_entered(item: InventoryItem) ## Emitted when the mouse cursor has entered the visible area of an item. +signal item_mouse_exited(item: InventoryItem) ## Emitted when the mouse cursor has exited the visible area of an item. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") + + +class PriorityPanel extends Panel: + enum StylePriority {HIGH = 0, MEDIUM = 1, LOW = 2} + + var regular_style: StyleBox + var hover_style: StyleBox + var _styles: Array[StyleBox] = [null, null, null] + + + func _init(regular_style_: StyleBox = null, hover_style_: StyleBox = null) -> void: + regular_style = regular_style_ + hover_style = hover_style_ + + + func _ready() -> void: + set_style(regular_style) + mouse_entered.connect(func(): + set_style(hover_style) + ) + mouse_exited.connect(func(): + set_style(regular_style) + ) + + + func set_style(style: StyleBox, priority: int = StylePriority.LOW) -> void: + if priority > 2 || priority < 0: + return + if _styles[priority] == style: + return + + _styles[priority] = style + + for i in range(0, 3): + if _styles[i] != null: + _set_panel_style(_styles[i]) + return + + + func _set_panel_style(style: StyleBox) -> void: + remove_theme_stylebox_override("panel") + if style != null: + add_theme_stylebox_override("panel", style) + + +class CustomizablePanel extends Panel: + func set_style(style: StyleBox) -> void: + remove_theme_stylebox_override("panel") + if style != null: + add_theme_stylebox_override("panel", style) + +## Reference to an inventory with a GridConstraint that is being displayed. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() + + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.inventory = inventory + _queue_refresh() + update_configuration_warnings() +## If enabled, stretches the icons based on `field_dimensions`. +@export var stretch_item_icons: bool = true: + set(new_stretch_item_icons): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.stretch_item_icons = new_stretch_item_icons + stretch_item_icons = new_stretch_item_icons +## Size of individual fields in the grid. +@export var field_dimensions: Vector2 = Vector2(32, 32): + set(new_field_dimensions): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions + field_dimensions = new_field_dimensions + _queue_refresh() +## Spacing between grid fields. +@export var item_spacing: int = 0: + set(new_item_spacing): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.item_spacing = new_item_spacing + item_spacing = new_item_spacing + _queue_refresh() +## Item selection mode. Set to SelectMode.SELECT_MULTI to enable selecting multiple items by holding down CTRL. See the +## `ItemList.SelectMode` constants for details. +@export_enum("Single", "Multi") var select_mode: int = ItemList.SelectMode.SELECT_SINGLE: + set(new_select_mode): + if select_mode == new_select_mode: + return + select_mode = new_select_mode + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.select_mode = select_mode +## Custom control scene representing an `InventoryItem` (must inherit `CtrlInventoryItemBase`). If set to `null`, +## `CtrlInventoryItem` will be used to represent the item. +@export var custom_item_control_scene: PackedScene = null: + set(new_custom_item_control_scene): + if new_custom_item_control_scene == custom_item_control_scene: + return + if !_valid_custom_item_control_scene(new_custom_item_control_scene): + push_error("Invalid scene! Make sure the custom item control scene inherits from CtrlInventoryItemBase!") + return + custom_item_control_scene = new_custom_item_control_scene + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.custom_item_control_scene = custom_item_control_scene + +@export_group("Custom Styles") +## The default grid field background style. Unlike `background_style`, this style is used when displaying each +## individual field in the 2D grid. +@export var field_style: StyleBox = null: + set(new_field_style): + field_style = new_field_style + _queue_refresh() +## The grid field style used when hovering over it with the mouse. +@export var field_highlighted_style: StyleBox: + set(new_field_highlighted_style): + field_highlighted_style = new_field_highlighted_style + _queue_refresh() +## The grid field style used for selected items. Unlike `selection_style`, this style is used as field background behind +## selected items. +@export var field_selected_style: StyleBox: + set(new_field_selected_style): + field_selected_style = new_field_selected_style + _queue_refresh() +## The style used for displaying item selections. Unlike `field_selected_style`, this style is used when displaying +## rectangles over the selected items. +@export var selection_style: StyleBox = null: + set(new_selection_style): + selection_style = new_selection_style + _queue_refresh() +## The style used for the inventory background. Unlike `field_style`, this style is used when displaying a rectangle +## behind the 2D grid. +@export var background_style: StyleBox = null: + set(new_background_style): + background_style = new_background_style + _queue_refresh() + +var _ctrl_inventory_grid_basic: _CtrlInventoryGridBasic = null +var _field_background_grid: Control = null +var _field_backgrounds: Array = [] +var _selection_panels: Control = null var _refresh_queued: bool = false +var _background: CustomizablePanel = null + + +func _valid_custom_item_control_scene(scene: PackedScene) -> bool: + if scene == null: + return true + if !scene.can_instantiate(): + return false + var temp_instance := scene.instantiate() + if !temp_instance is CtrlInventoryItemBase: + temp_instance.free() + return false + temp_instance.free() + return true + + +func _get_field_style() -> StyleBox: + if field_style: + return field_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres") + + +func _get_selection_style() -> StyleBox: + if selection_style: + return selection_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_style_selection.tres") + + +func _get_background_style() -> StyleBox: + if background_style: + return background_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_style_background.tres") + + +func _get_field_highlighted_style() -> StyleBox: + return field_highlighted_style + + +func _get_field_selected_style() -> StyleBox: + return field_selected_style + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryGrid node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + if inventory.get_constraint(GridConstraint) == null: + return PackedStringArray([ + "The inventory has no GridConstraint child node. Add a GridConstraint to the inventory to be able" \ + + " to display its contents on a grid."]) + return PackedStringArray() func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) + if !is_instance_valid(inventory): + return + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + inventory.item_property_changed.connect(_on_item_property_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) + if !is_instance_valid(inventory): + return + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + inventory.item_property_changed.disconnect(_on_item_property_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) -func _on_inventory_resized() -> void: - _queue_refresh() +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + if constraint is GridConstraint: + _queue_refresh() -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory and can't display any content.\n" + \ - "Set the inventory_path property to point to an InventoryGrid node."]) - return PackedStringArray() +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + var relevant_properties := [ + GridConstraint._KEY_SIZE, + GridConstraint._KEY_ROTATED, + ] + if property in relevant_properties: + _queue_refresh() -func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.queue_free() - _ctrl_grid.queue_free() - _ctrl_selection.queue_free() - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - - _ctrl_inventory_grid_basic = CtrlInventoryGridBasic.new() - _ctrl_inventory_grid_basic.inventory = inventory - _ctrl_inventory_grid_basic.field_dimensions = field_dimensions - _ctrl_inventory_grid_basic.item_spacing = item_spacing - _ctrl_inventory_grid_basic.default_item_texture = default_item_texture - _ctrl_inventory_grid_basic.stretch_item_sprites = stretch_item_sprites - _ctrl_inventory_grid_basic.name = "CtrlInventoryGridBasic" - _ctrl_inventory_grid_basic.resized.connect(_update_size) - _ctrl_inventory_grid_basic.select_mode = select_mode - - _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): - item_dropped.emit(item, drop_position) - ) - _ctrl_inventory_grid_basic.selection_changed.connect(func(): - _queue_refresh() - selection_changed.emit() - ) - _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): - inventory_item_activated.emit(item) - ) - _ctrl_inventory_grid_basic.inventory_item_context_activated.connect(func(item: InventoryItem): - inventory_item_context_activated.emit(item) - ) - _ctrl_inventory_grid_basic.item_mouse_entered.connect(func(item: InventoryItem): item_mouse_entered.emit(item)) - _ctrl_inventory_grid_basic.item_mouse_exited.connect(func(item: InventoryItem): item_mouse_exited.emit(item)) - - _ctrl_grid = GridControl.new(grid_color, _get_inventory_dimensions()) - _ctrl_grid.color = grid_color - _ctrl_grid.dimensions = _get_inventory_dimensions() - _ctrl_grid.name = "CtrlGrid" - - _ctrl_selection = Control.new() - _ctrl_selection.visible = draw_selections - - add_child(_ctrl_grid) - add_child(_ctrl_selection) - add_child(_ctrl_inventory_grid_basic) - - _update_size() - _queue_refresh() +func _on_item_manipulated(item: InventoryItem) -> void: + _queue_refresh() func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false + if _refresh_queued: + _refresh() + _refresh_queued = false func _refresh() -> void: - if is_instance_valid(_ctrl_grid): - _ctrl_grid.dimensions = _get_inventory_dimensions() - _ctrl_grid.color = grid_color - _ctrl_grid.visible = draw_grid - else: - _ctrl_grid.hide() - - if is_instance_valid(_ctrl_selection) && is_instance_valid(_ctrl_inventory_grid_basic): - for child in _ctrl_selection.get_children(): - child.queue_free() - for selected_inventory_item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): - var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_inventory_item) - var selection_rect := ColorRect.new() - selection_rect.color = selection_color - selection_rect.position = rect.position - selection_rect.size = rect.size - _ctrl_selection.add_child(selection_rect) - _ctrl_selection.visible = draw_selections + _refresh_field_background_grid() + _refresh_selection_panel() func _queue_refresh() -> void: - _refresh_queued = true + _refresh_queued = true + + +func _refresh_selection_panel() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + if !is_instance_valid(_selection_panels): + return + + for child in _selection_panels.get_children(): + child.queue_free() + + var selected_items := _ctrl_inventory_grid_basic.get_selected_inventory_items() + _selection_panels.visible = (!selected_items.is_empty()) && (_get_selection_style() != null) + if selected_items.is_empty(): + return + + for selected_item in selected_items: + var selection_panel := CustomizablePanel.new() + var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_item) + selection_panel.position = rect.position + selection_panel.size = rect.size + selection_panel.set_style(_get_selection_style()) + selection_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _selection_panels.add_child(selection_panel) + + +func _refresh_field_background_grid() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + if is_instance_valid(_field_background_grid): + while _field_background_grid.get_child_count() > 0: + _field_background_grid.get_children()[0].queue_free() + _field_background_grid.remove_child(_field_background_grid.get_children()[0]) + _field_backgrounds = [] + + if !is_instance_valid(inventory): + return + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return + + var inv_size := grid_constraint.size + for i in range(inv_size.x): + _field_backgrounds.append([]) + for j in range(inv_size.y): + var field_panel: PriorityPanel = PriorityPanel.new(_get_field_style(), _get_field_highlighted_style()) + field_panel.size = field_dimensions + field_panel.position = _ctrl_inventory_grid_basic._get_field_position(Vector2i(i, j)) + _field_background_grid.add_child(field_panel) + _field_backgrounds[i].append(field_panel) -func _get_inventory_dimensions() -> Vector2i: - var inventory_grid = _get_inventory() - if !is_instance_valid(inventory_grid): - return Vector2i.ZERO - return _ctrl_inventory_grid_basic.inventory.size +func _ready() -> void: + _background = CustomizablePanel.new() + _background.name = "Background" + _background.set_style(_get_background_style()) + add_child(_background) + + _field_background_grid = Control.new() + _field_background_grid.name = "FieldBackgrounds" + add_child(_field_background_grid) + + _ctrl_inventory_grid_basic = _CtrlInventoryGridBasic.new() + _ctrl_inventory_grid_basic.custom_item_control_scene = custom_item_control_scene + _ctrl_inventory_grid_basic.inventory = inventory + _ctrl_inventory_grid_basic.field_dimensions = field_dimensions + _ctrl_inventory_grid_basic.item_spacing = item_spacing + _ctrl_inventory_grid_basic.stretch_item_icons = stretch_item_icons + _ctrl_inventory_grid_basic.name = "_CtrlInventoryGridBasic" + _ctrl_inventory_grid_basic.resized.connect(_update_size) + _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): + item_dropped.emit(item, drop_position) + ) + _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): + inventory_item_activated.emit(item) + ) + _ctrl_inventory_grid_basic.inventory_item_clicked.connect(func(item: InventoryItem, at_position: Vector2, mouse_button_index: int): + inventory_item_clicked.emit(item, at_position, mouse_button_index) + ) + _ctrl_inventory_grid_basic.inventory_item_selected.connect(func(item: InventoryItem): + inventory_item_selected.emit(item) + ) + _ctrl_inventory_grid_basic.item_mouse_entered.connect(_on_item_mouse_entered) + _ctrl_inventory_grid_basic.item_mouse_exited.connect(_on_item_mouse_exited) + _ctrl_inventory_grid_basic.selection_changed.connect(_on_selection_changed) + _ctrl_inventory_grid_basic.select_mode = select_mode + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(_ctrl_inventory_grid_basic) + + _selection_panels = Control.new() + _selection_panels.mouse_filter = Control.MOUSE_FILTER_IGNORE + _selection_panels.name = "SelectionPanels" + add_child(_selection_panels) + + _update_size() + _queue_refresh() + + +func _notification(what: int) -> void: + if what == NOTIFICATION_DRAG_BEGIN: + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_PASS + if what == NOTIFICATION_DRAG_END: + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_IGNORE + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) func _update_size() -> void: - custom_minimum_size = _ctrl_inventory_grid_basic.size - size = _ctrl_inventory_grid_basic.size - _ctrl_grid.custom_minimum_size = _ctrl_inventory_grid_basic.size - _ctrl_grid.size = _ctrl_inventory_grid_basic.size + custom_minimum_size = _ctrl_inventory_grid_basic.size + size = _ctrl_inventory_grid_basic.size + _background.size = _ctrl_inventory_grid_basic.size + + +func _on_item_mouse_entered(item: InventoryItem) -> void: + _set_item_background(item, _get_field_highlighted_style(), PriorityPanel.StylePriority.MEDIUM) + item_mouse_entered.emit(item) + + +func _on_item_mouse_exited(item: InventoryItem) -> void: + _set_item_background(item, null, PriorityPanel.StylePriority.MEDIUM) + item_mouse_exited.emit(item) + + +func _on_selection_changed() -> void: + _handle_selection_change() + selection_changed.emit() + + +func _handle_selection_change() -> void: + if !is_instance_valid(inventory): + return + _refresh_selection_panel() + + if !_get_field_selected_style(): + return + for item in inventory.get_items(): + if item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): + _set_item_background(item, _get_field_selected_style(), PriorityPanel.StylePriority.HIGH) + else: + _set_item_background(item, null, PriorityPanel.StylePriority.HIGH) + + +func _on_inventory_resized() -> void: + _refresh_field_background_grid() + + +func _input(event) -> void: + if !(event is InputEventMouseMotion): + return + if !is_instance_valid(inventory): + return + + if !_get_field_highlighted_style(): + return + _highlight_grabbed_item(_get_field_highlighted_style()) + + +func _highlight_grabbed_item(style: StyleBox): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return + var grabbed_item: InventoryItem = _get_global_grabbed_item() + if !grabbed_item: + return + + var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_local_pos() + if !_is_hovering(global_grabbed_item_pos): + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) + return + + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) + + var grabbed_item_coords := _ctrl_inventory_grid_basic.get_field_coords(global_grabbed_item_pos + (field_dimensions / 2)) + var item_size := grid_constraint.get_item_size(grabbed_item) + var rect := Rect2i(grabbed_item_coords, item_size) + if !Rect2i(Vector2i.ZERO, grid_constraint.size).encloses(rect): + return + _set_rect_background(rect, style, PriorityPanel.StylePriority.LOW) + + +func _is_hovering(local_pos: Vector2) -> bool: + return get_rect().has_point(local_pos) + + +func _set_item_background(item: InventoryItem, style: StyleBox, priority: int) -> bool: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !item || grid_constraint == null: + return false + + _set_rect_background(grid_constraint.get_item_rect(item), style, priority) + return true + + +func _set_rect_background(rect: Rect2i, style: StyleBox, priority: int) -> void: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var inv_size = grid_constraint.size + var h_range = min(rect.size.x + rect.position.x, inv_size.x) + for i in range(rect.position.x, h_range): + var v_range = min(rect.size.y + rect.position.y, inv_size.y) + for j in range(rect.position.y, v_range): + _field_backgrounds[i][j].set_style(style, priority) + + +func _fill_background(style: StyleBox, priority: int) -> void: + for panel in _field_background_grid.get_children(): + panel.set_style(style, priority) + + +func _get_global_grabbed_item() -> InventoryItem: + var drag_data := get_viewport().gui_get_drag_data() + if !is_instance_valid(drag_data): + return null + if !(drag_data is InventoryItem): + return null + return drag_data as InventoryItem -func _get_inventory() -> InventoryGrid: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - if !is_instance_valid(_ctrl_inventory_grid_basic.inventory): - return null - return _ctrl_inventory_grid_basic.inventory +func _get_global_grabbed_item_local_pos() -> Vector2: + if _get_global_grabbed_item() != null: + return get_local_mouse_position() - _CtrlDraggableInventoryItem.get_grab_offset_local_to(self) + return Vector2(-1, -1) -func deselect_inventory_item() -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.deselect_inventory_item() +## Deselects all selected inventory items. +func deselect_inventory_items() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + _ctrl_inventory_grid_basic.deselect_inventory_items() +## Selects the given inventory item. func select_inventory_item(item: InventoryItem) -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.select_inventory_item(item) + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + _ctrl_inventory_grid_basic.select_inventory_item(item) +## Returns the selected inventory item. If multiple items are selected, it returns the first one. func get_selected_inventory_item() -> InventoryItem: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - return _ctrl_inventory_grid_basic.get_selected_inventory_item() + if !is_instance_valid(_ctrl_inventory_grid_basic): + return null + return _ctrl_inventory_grid_basic.get_selected_inventory_item() +## Returns an array of selected inventory items. func get_selected_inventory_items() -> Array[InventoryItem]: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return [] - return _ctrl_inventory_grid_basic.get_selected_inventory_items() + if !is_instance_valid(_ctrl_inventory_grid_basic): + return [] + return _ctrl_inventory_grid_basic.get_selected_inventory_items() diff --git a/addons/gloot/ui/ctrl_inventory_grid.gd.uid b/addons/gloot/ui/ctrl_inventory_grid.gd.uid new file mode 100644 index 0000000..d2ad2c8 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid.gd.uid @@ -0,0 +1 @@ +uid://bd75talwyq73v diff --git a/addons/gloot/ui/ctrl_inventory_grid_basic.gd b/addons/gloot/ui/ctrl_inventory_grid_basic.gd index 3e6af5c..c3fec1a 100644 --- a/addons/gloot/ui/ctrl_inventory_grid_basic.gd +++ b/addons/gloot/ui/ctrl_inventory_grid_basic.gd @@ -1,165 +1,108 @@ @tool extends Control -signal item_dropped(item, offset) +signal item_dropped(item: InventoryItem, offset: Vector2) signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) +signal inventory_item_activated(item: InventoryItem) +signal inventory_item_clicked(item: InventoryItem) +signal inventory_item_selected(item: InventoryItem) +signal item_mouse_entered(item: InventoryItem) +signal item_mouse_exited(item: InventoryItem) + +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") + +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") + _clear_selection() -enum SelectMode {SELECT_SINGLE = 0, SELECT_MULTI = 1} + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() -@export var field_dimensions: Vector2 = Vector2(32, 32) : + _queue_refresh() +@export var field_dimensions: Vector2 = Vector2(32, 32): set(new_field_dimensions): if new_field_dimensions == field_dimensions: return field_dimensions = new_field_dimensions _queue_refresh() -@export var item_spacing: int = 0 : +@export var item_spacing: int = 0: set(new_item_spacing): if new_item_spacing == item_spacing: return item_spacing = new_item_spacing _queue_refresh() -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if new_default_item_texture == default_item_texture: - return - default_item_texture = new_default_item_texture - _queue_refresh() -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - stretch_item_sprites = new_stretch_item_sprites +@export var stretch_item_icons: bool = true: + set(new_stretch_item_icons): + stretch_item_icons = new_stretch_item_icons _queue_refresh() -@export_enum("Single", "Multi") var select_mode: int = SelectMode.SELECT_SINGLE : +@export_enum("Single", "Multi") var select_mode: int = ItemList.SelectMode.SELECT_SINGLE: set(new_select_mode): if select_mode == new_select_mode: return select_mode = new_select_mode _clear_selection() -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: +@export var custom_item_control_scene: PackedScene = null: + set(new_custom_item_control_scene): + if new_custom_item_control_scene == custom_item_control_scene: return - - _clear_selection() - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - + custom_item_control_scene = new_custom_item_control_scene _queue_refresh() + var _ctrl_item_container: Control = null -var _ctrl_drop_zone: CtrlDropZone = null var _selected_items: Array[InventoryItem] = [] var _refresh_queued: bool = false -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory and it can't display any content.\n" + \ - "Set the inventory_path property to point to an InventoryGrid node."]) - return PackedStringArray() - - func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_item_container): - _ctrl_item_container.queue_free() - - mouse_filter = Control.MOUSE_FILTER_IGNORE - _ctrl_item_container = Control.new() _ctrl_item_container.size = size _ctrl_item_container.mouse_filter = Control.MOUSE_FILTER_IGNORE resized.connect(func(): _ctrl_item_container.size = size) add_child(_ctrl_item_container) - _ctrl_drop_zone = CtrlDropZone.new() - _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) - _ctrl_drop_zone.size = size - resized.connect(func(): _ctrl_drop_zone.size = size) - CtrlDragable.dragable_grabbed.connect(func(dragable: CtrlDragable, grab_position: Vector2): - _ctrl_drop_zone.activate() - ) - CtrlDragable.dragable_dropped.connect(func(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): - _ctrl_drop_zone.deactivate() - ) - add_child(_ctrl_drop_zone) - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - _queue_refresh() -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _ctrl_drop_zone.deactivate() - - func _connect_inventory_signals() -> void: if !is_instance_valid(inventory): return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.connect(_on_item_property_changed) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) - if !inventory.item_removed.is_connected(_on_item_removed): - inventory.item_removed.connect(_on_item_removed) + _Utils.safe_connect(inventory.item_property_changed, _on_item_property_changed) + _Utils.safe_connect(inventory.constraint_changed, _on_constraint_changed) + _Utils.safe_connect(inventory.item_added, _on_item_added) + _Utils.safe_connect(inventory.item_removed, _on_item_removed) func _disconnect_inventory_signals() -> void: if !is_instance_valid(inventory): return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.disconnect(_on_item_property_changed) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) - if inventory.item_removed.is_connected(_on_item_removed): - inventory.item_removed.disconnect(_on_item_removed) - - -func _on_item_property_changed(_item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - GridConstraint.KEY_WIDTH, - GridConstraint.KEY_HEIGHT, - GridConstraint.KEY_SIZE, - GridConstraint.KEY_ROTATED, - GridConstraint.KEY_GRID_POSITION, - InventoryItem.KEY_IMAGE, + _Utils.safe_disconnect(inventory.item_property_changed, _on_item_property_changed) + _Utils.safe_disconnect(inventory.constraint_changed, _on_constraint_changed) + _Utils.safe_disconnect(inventory.item_added, _on_item_added) + _Utils.safe_disconnect(inventory.item_removed, _on_item_removed) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _queue_refresh() + + +func _on_item_property_changed(_item: InventoryItem, property: String) -> void: + var relevant_properties := [ + GridConstraint._KEY_SIZE, + GridConstraint._KEY_ROTATED, + GridConstraint._KEY_POSITIVE_ROTATION, + Inventory._KEY_STACK_SIZE, + InventoryItem._KEY_IMAGE, ] - if property_name in relevant_properties: + if property in relevant_properties: _queue_refresh() @@ -167,8 +110,13 @@ func _on_inventory_resized() -> void: _queue_refresh() +func _on_item_added(item: InventoryItem) -> void: + _queue_refresh() + + func _on_item_removed(item: InventoryItem) -> void: _deselect(item) + _queue_refresh() func _process(_delta) -> void: @@ -182,23 +130,25 @@ func _queue_refresh() -> void: func _refresh() -> void: - _ctrl_drop_zone.deactivate() + _clear_list() + if !is_instance_valid(inventory): + return + custom_minimum_size = _get_inventory_size_px() size = custom_minimum_size - - _clear_list() _populate_list() func _get_inventory_size_px() -> Vector2: - if !is_instance_valid(inventory): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !is_instance_valid(inventory) || grid_constraint == null: return Vector2.ZERO - var result := Vector2(inventory.size.x * field_dimensions.x, \ - inventory.size.y * field_dimensions.y) + var inv_size := grid_constraint.size + var result := Vector2(inv_size.x * field_dimensions.x, inv_size.y * field_dimensions.y) # Also take item spacing into consideration - result += Vector2(inventory.size - Vector2i.ONE) * item_spacing + result += Vector2(inv_size - Vector2i.ONE) * item_spacing return result @@ -207,89 +157,75 @@ func _clear_list() -> void: if !is_instance_valid(_ctrl_item_container): return - for ctrl_inventory_item in _ctrl_item_container.get_children(): - _ctrl_item_container.remove_child(ctrl_inventory_item) - ctrl_inventory_item.queue_free() + for ctrl_draggable_inventory_item in _ctrl_item_container.get_children(): + _ctrl_item_container.remove_child(ctrl_draggable_inventory_item) + ctrl_draggable_inventory_item.queue_free() func _populate_list() -> void: - if !is_instance_valid(inventory) || !is_instance_valid(_ctrl_item_container): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !is_instance_valid(inventory) || (!is_instance_valid(grid_constraint)) || !is_instance_valid(_ctrl_item_container): return for item in inventory.get_items(): - var ctrl_inventory_item = CtrlInventoryItemRect.new() - ctrl_inventory_item.texture = default_item_texture - ctrl_inventory_item.item = item - ctrl_inventory_item.grabbed.connect(_on_item_grab.bind(ctrl_inventory_item)) - ctrl_inventory_item.dropped.connect(_on_item_drop.bind(ctrl_inventory_item)) - ctrl_inventory_item.activated.connect(_on_item_activated.bind(ctrl_inventory_item)) - ctrl_inventory_item.context_activated.connect(_on_item_context_activated.bind(ctrl_inventory_item)) - ctrl_inventory_item.mouse_entered.connect(_on_item_mouse_entered.bind(ctrl_inventory_item)) - ctrl_inventory_item.mouse_exited.connect(_on_item_mouse_exited.bind(ctrl_inventory_item)) - ctrl_inventory_item.clicked.connect(_on_item_clicked.bind(ctrl_inventory_item)) - ctrl_inventory_item.size = _get_item_sprite_size(item) - - ctrl_inventory_item.position = _get_field_position(inventory.get_item_position(item)) - ctrl_inventory_item.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED - if stretch_item_sprites: - ctrl_inventory_item.stretch_mode = TextureRect.STRETCH_SCALE - - _ctrl_item_container.add_child(ctrl_inventory_item) - - -func _on_item_grab(offset: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: - _clear_selection() + var ctrl_draggable_inventory_item = _CtrlDraggableInventoryItem.new() + ctrl_draggable_inventory_item.item = item + ctrl_draggable_inventory_item.ctrl_inventory_item_scene = custom_item_control_scene + ctrl_draggable_inventory_item.activated.connect(_on_inventory_item_activated.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.clicked.connect(_on_inventory_item_clicked.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.mouse_entered.connect(_on_item_mouse_entered.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.mouse_exited.connect(_on_item_mouse_exited.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.size = _get_item_sprite_size(item) + ctrl_draggable_inventory_item.position = _get_field_position(grid_constraint.get_item_position(item)) + ctrl_draggable_inventory_item.icon_stretch_mode = TextureRect.STRETCH_KEEP_CENTERED + if stretch_item_icons: + ctrl_draggable_inventory_item.icon_stretch_mode = TextureRect.STRETCH_SCALE -func _on_item_drop(zone: CtrlDropZone, drop_position: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item: InventoryItem = ctrl_inventory_item.item - # The item might have been freed in case the item stack has been moved and merged with another - # stack. - if is_instance_valid(item) and inventory.has_item(item): - if zone == null: - item_dropped.emit(item, drop_position + ctrl_inventory_item.position) + _ctrl_item_container.add_child(ctrl_draggable_inventory_item) -func _get_item_sprite_size(item: InventoryItem) -> Vector2: - var item_size := inventory.get_item_size(item) - var sprite_size := Vector2(item_size) * field_dimensions - - # Also take item spacing into consideration - sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing - - return sprite_size +func _notification(what): + if what == NOTIFICATION_DRAG_BEGIN: + _clear_selection() + for c in _ctrl_item_container.get_children(): + c.mouse_filter = Control.MOUSE_FILTER_IGNORE + elif what == NOTIFICATION_DRAG_END: + for c in _ctrl_item_container.get_children(): + c.mouse_filter = Control.MOUSE_FILTER_PASS -func _on_item_activated(ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item = ctrl_inventory_item.item - if !item: - return +func _can_drop_data(at_position: Vector2, data) -> bool: + return data is InventoryItem - inventory_item_activated.emit(item) - -func _on_item_context_activated(ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item = ctrl_inventory_item.item - if !item: - return - - inventory_item_context_activated.emit(item) +func _drop_data(at_position: Vector2, data) -> void: + var local_offset := _CtrlDraggableInventoryItem.get_grab_offset_local_to(self) + at_position -= local_offset + var item := (data as InventoryItem) + if is_instance_valid(item): + _on_item_dropped(item, at_position) -func _on_item_mouse_entered(ctrl_inventory_item) -> void: - item_mouse_entered.emit(ctrl_inventory_item.item) +func _get_item_sprite_size(item: InventoryItem) -> Vector2: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var item_size := grid_constraint.get_item_size(item) + var sprite_size := Vector2(item_size) * field_dimensions + # Also take item spacing into consideration + sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing -func _on_item_mouse_exited(ctrl_inventory_item) -> void: - item_mouse_exited.emit(ctrl_inventory_item.item) + return sprite_size -func _on_item_clicked(ctrl_inventory_item) -> void: - var item = ctrl_inventory_item.item +func _on_inventory_item_clicked(at_position: Vector2, + button_index: int, + ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem) -> void: + var item = ctrl_draggable_inventory_item.item if !is_instance_valid(item): return - if select_mode == SelectMode.SELECT_MULTI && Input.is_key_pressed(KEY_CTRL): + if select_mode == ItemList.SelectMode.SELECT_MULTI && Input.is_key_pressed(KEY_CTRL): if !_is_item_selected(item): _select(item) else: @@ -298,6 +234,24 @@ func _on_item_clicked(ctrl_inventory_item) -> void: _clear_selection() _select(item) + inventory_item_clicked.emit(item, at_position, button_index) + + +func _on_inventory_item_activated(ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem) -> void: + var item = ctrl_draggable_inventory_item.item + if !item: + return + + inventory_item_activated.emit(item) + + +func _on_item_mouse_entered(ctrl_draggable_inventory_item) -> void: + item_mouse_entered.emit(ctrl_draggable_inventory_item.item) + + +func _on_item_mouse_exited(ctrl_draggable_inventory_item) -> void: + item_mouse_exited.emit(ctrl_draggable_inventory_item.item) + func _select(item: InventoryItem) -> void: if item in _selected_items: @@ -307,6 +261,7 @@ func _select(item: InventoryItem) -> void: return _selected_items.append(item) + inventory_item_selected.emit(item) selection_changed.emit() @@ -331,8 +286,7 @@ func _clear_selection() -> void: selection_changed.emit() -func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: - var item: InventoryItem = dragable.item +func _on_item_dropped(item: InventoryItem, drop_position: Vector2) -> void: if item == null: return @@ -355,14 +309,19 @@ func _handle_item_move(item: InventoryItem, drop_position: Vector2) -> void: func _handle_item_transfer(item: InventoryItem, drop_position: Vector2) -> void: - var source_inventory: InventoryGrid = item.get_inventory() + var source_inventory: Inventory = item.get_inventory() + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) var field_coords = get_field_coords(drop_position + (field_dimensions / 2)) if source_inventory != null: - if source_inventory.item_protoset != inventory.item_protoset: + if source_inventory.protoset != inventory.protoset: return - source_inventory.transfer_to(item, inventory, field_coords) - elif !inventory.add_item_at(item, field_coords): + if grid_constraint.add_item_at(item, field_coords): + return + if _merge_item(item, field_coords): + return + _swap_items(item, field_coords) + elif !grid_constraint.add_item_at(item, field_coords): _swap_items(item, field_coords) @@ -391,39 +350,60 @@ func get_selected_inventory_items() -> Array[InventoryItem]: func _move_item(item: InventoryItem, move_position: Vector2i) -> bool: - if !inventory.rect_free(Rect2i(move_position, inventory.get_item_size(item)), item): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !grid_constraint.rect_free(Rect2i(move_position, grid_constraint.get_item_size(item)), item): return false if Engine.is_editor_hint(): - GlootUndoRedo.move_inventory_item(inventory, item, move_position) + _Undoables.undoable_action(inventory, "Move Inventory Item", func(): + return grid_constraint.move_item_to(item, move_position) + ) return true - inventory.move_item_to(item, move_position) + grid_constraint.move_item_to(item, move_position) return true func _merge_item(item_src: InventoryItem, position: Vector2i) -> bool: - if !(inventory is InventoryGridStacked): - return false - - var item_dst = (inventory as InventoryGridStacked)._get_mergable_item_at(item_src, position) + var item_dst = _get_mergable_item_at(item_src, position) if item_dst == null: return false if Engine.is_editor_hint(): - GlootUndoRedo.join_inventory_items(inventory, item_dst, item_src) + _Undoables.undoable_action(inventory, "Merge Inventory Items", func(): + return inventory.merge_stacks(item_dst, item_src, true) + ) else: - (inventory as InventoryGridStacked).join(item_dst, item_src) + inventory.merge_stacks(item_dst, item_src, true) return true +func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var target_item := grid_constraint.get_item_at(position) + if target_item != null && item.can_merge_into(target_item, true): + return target_item + return null + + func _swap_items(item: InventoryItem, position: Vector2i) -> bool: - var item2 = inventory.get_item_at(position) + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var item2 := grid_constraint.get_item_at(position) if item2 == null: return false if Engine.is_editor_hint(): - GlootUndoRedo.swap_inventory_items(item, item2) + var inventories: Array[Inventory] + if is_instance_valid(item.get_inventory()): + inventories.append(item.get_inventory()) + if is_instance_valid(item2.get_inventory()): + inventories.append(item2.get_inventory()) + _Undoables.undoable_action(inventories, "Swap Inventory Items", func(): + if !_StackManager.stacks_compatible(item, item2): + InventoryItem.swap(item, item2) + return true + ) else: - InventoryItem.swap(item, item2) + if !_StackManager.stacks_compatible(item, item2): + InventoryItem.swap(item, item2) return true @@ -434,7 +414,7 @@ func _get_field_position(field_coords: Vector2i) -> Vector2: return field_position -func deselect_inventory_item() -> void: +func deselect_inventory_items() -> void: _clear_selection() @@ -446,7 +426,6 @@ func get_item_rect(item: InventoryItem) -> Rect2: if !is_instance_valid(item): return Rect2() return Rect2( - _get_field_position(inventory.get_item_position(item)), + _get_field_position(inventory.get_constraint(GridConstraint).get_item_position(item)), _get_item_sprite_size(item) ) - diff --git a/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid b/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid new file mode 100644 index 0000000..a598ac5 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid @@ -0,0 +1 @@ +uid://bwg12d5wf7h5t diff --git a/addons/gloot/ui/ctrl_inventory_grid_ex.gd b/addons/gloot/ui/ctrl_inventory_grid_ex.gd deleted file mode 100644 index 69c544f..0000000 --- a/addons/gloot/ui/ctrl_inventory_grid_ex.gd +++ /dev/null @@ -1,408 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") -class_name CtrlInventoryGridEx -extends Control - -signal item_dropped(item, offset) -signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) - -const Verify = preload("res://addons/gloot/core/verify.gd") -const CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") - - -class PriorityPanel extends Panel: - enum StylePriority {HIGH = 0, MEDIUM = 1, LOW = 2} - - var regular_style: StyleBox - var hover_style: StyleBox - var _styles: Array[StyleBox] = [null, null, null] - - - func _init(regular_style_: StyleBox, hover_style_: StyleBox) -> void: - regular_style = regular_style_ - hover_style = hover_style_ - - - func _ready() -> void: - set_style(regular_style) - mouse_entered.connect(func(): - set_style(hover_style) - ) - mouse_exited.connect(func(): - set_style(regular_style) - ) - - - func set_style(style: StyleBox, priority: int = StylePriority.LOW) -> void: - if priority > 2 || priority < 0: - return - if _styles[priority] == style: - return - - _styles[priority] = style - - for i in range(0, 3): - if _styles[i] != null: - _set_panel_style(_styles[i]) - return - - - func _set_panel_style(style: StyleBox) -> void: - remove_theme_stylebox_override("panel") - if style != null: - add_theme_stylebox_override("panel", style) - - -class SelectionPanel extends Panel: - func set_style(style: StyleBox) -> void: - remove_theme_stylebox_override("panel") - if style != null: - add_theme_stylebox_override("panel", style) - - -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.default_item_texture = new_default_item_texture - default_item_texture = new_default_item_texture -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.stretch_item_sprites = new_stretch_item_sprites - stretch_item_sprites = new_stretch_item_sprites -@export var field_dimensions: Vector2 = Vector2(32, 32) : - set(new_field_dimensions): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions - field_dimensions = new_field_dimensions -@export var item_spacing: int = 0 : - set(new_item_spacing): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.item_spacing = new_item_spacing - item_spacing = new_item_spacing -@export_enum("Single", "Multi") var select_mode: int = CtrlInventoryGridBasic.SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.select_mode = select_mode - -@export_group("Custom Styles") -@export var field_style: StyleBox : - set(new_field_style): - field_style = new_field_style - _queue_refresh() -@export var field_highlighted_style: StyleBox : - set(new_field_highlighted_style): - field_highlighted_style = new_field_highlighted_style - _queue_refresh() -@export var field_selected_style: StyleBox : - set(new_field_selected_style): - field_selected_style = new_field_selected_style - _queue_refresh() -@export var selection_style: StyleBox : - set(new_selection_style): - selection_style = new_selection_style - _queue_refresh() - -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.inventory = inventory - _queue_refresh() -var _ctrl_inventory_grid_basic: CtrlInventoryGridBasic = null -var _field_background_grid: Control = null -var _field_backgrounds: Array = [] -var _selection_panels: Control = null -var _refresh_queued: bool = false - - -func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) - - -func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) - - -func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false - - -func _refresh() -> void: - _refresh_field_background_grid() - _refresh_selection_panel() - - -func _queue_refresh() -> void: - _refresh_queued = true - - -func _refresh_selection_panel() -> void: - if !is_instance_valid(_selection_panels): - return - - for child in _selection_panels.get_children(): - child.queue_free() - - var selected_items := _ctrl_inventory_grid_basic.get_selected_inventory_items() - _selection_panels.visible = (!selected_items.is_empty()) && (selection_style != null) - if selected_items.is_empty(): - return - - for selected_item in selected_items: - var selection_panel := SelectionPanel.new() - var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_item) - selection_panel.position = rect.position - selection_panel.size = rect.size - selection_panel.set_style(selection_style) - selection_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE - _selection_panels.add_child(selection_panel) - - -func _refresh_field_background_grid() -> void: - if is_instance_valid(_field_background_grid): - while _field_background_grid.get_child_count() > 0: - _field_background_grid.get_children()[0].queue_free() - _field_background_grid.remove_child(_field_background_grid.get_children()[0]) - _field_backgrounds = [] - - if !is_instance_valid(inventory): - return - - for i in range(inventory.size.x): - _field_backgrounds.append([]) - for j in range(inventory.size.y): - var field_panel: PriorityPanel = PriorityPanel.new(field_style, field_highlighted_style) - field_panel.visible = (field_style != null) - field_panel.size = field_dimensions - field_panel.position = _ctrl_inventory_grid_basic._get_field_position(Vector2i(i, j)) - _field_background_grid.add_child(field_panel) - _field_backgrounds[i].append(field_panel) - - -func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.queue_free() - _field_background_grid.queue_free() - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - - _field_background_grid = Control.new() - _field_background_grid.name = "FieldBackgrounds" - add_child(_field_background_grid) - - _ctrl_inventory_grid_basic = CtrlInventoryGridBasic.new() - _ctrl_inventory_grid_basic.inventory = inventory - _ctrl_inventory_grid_basic.field_dimensions = field_dimensions - _ctrl_inventory_grid_basic.item_spacing = item_spacing - _ctrl_inventory_grid_basic.default_item_texture = default_item_texture - _ctrl_inventory_grid_basic.stretch_item_sprites = stretch_item_sprites - _ctrl_inventory_grid_basic.name = "CtrlInventoryGridBasic" - _ctrl_inventory_grid_basic.resized.connect(_update_size) - _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): - item_dropped.emit(item, drop_position) - ) - _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): - inventory_item_activated.emit(item) - ) - _ctrl_inventory_grid_basic.inventory_item_context_activated.connect(func(item: InventoryItem): - inventory_item_context_activated.emit(item) - ) - _ctrl_inventory_grid_basic.item_mouse_entered.connect(_on_item_mouse_entered) - _ctrl_inventory_grid_basic.item_mouse_exited.connect(_on_item_mouse_exited) - _ctrl_inventory_grid_basic.selection_changed.connect(_on_selection_changed) - _ctrl_inventory_grid_basic.select_mode = select_mode - add_child(_ctrl_inventory_grid_basic) - - _selection_panels = Control.new() - _selection_panels.mouse_filter = Control.MOUSE_FILTER_IGNORE - _selection_panels.name = "SelectionPanels" - add_child(_selection_panels) - - CtrlDragable.dragable_dropped.connect(func(_grabbed_dragable, _zone, _local_drop_position): - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - ) - - _update_size() - _queue_refresh() - - -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - - -func _update_size() -> void: - custom_minimum_size = _ctrl_inventory_grid_basic.size - size = _ctrl_inventory_grid_basic.size - - -func _on_item_mouse_entered(item: InventoryItem) -> void: - _set_item_background(item, field_highlighted_style, PriorityPanel.StylePriority.MEDIUM) - item_mouse_entered.emit(item) - - -func _on_item_mouse_exited(item: InventoryItem) -> void: - _set_item_background(item, null, PriorityPanel.StylePriority.MEDIUM) - item_mouse_exited.emit(item) - - -func _on_selection_changed() -> void: - _handle_selection_change() - selection_changed.emit() - - -func _handle_selection_change() -> void: - if !is_instance_valid(inventory): - return - _refresh_selection_panel() - - if !field_selected_style: - return - for item in inventory.get_items(): - if item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): - _set_item_background(item, field_selected_style, PriorityPanel.StylePriority.HIGH) - else: - _set_item_background(item, null, PriorityPanel.StylePriority.HIGH) - - -func _on_inventory_resized() -> void: - _refresh_field_background_grid() - - -func _input(event) -> void: - if !(event is InputEventMouseMotion): - return - if !is_instance_valid(inventory): - return - - if !field_highlighted_style: - return - _highlight_grabbed_item(field_highlighted_style) - - -func _highlight_grabbed_item(style: StyleBox): - var grabbed_item: InventoryItem = _get_global_grabbed_item() - if !grabbed_item: - return - - var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_local_pos() - if !_is_hovering(global_grabbed_item_pos): - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - return - - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - - var grabbed_item_coords := _ctrl_inventory_grid_basic.get_field_coords(global_grabbed_item_pos + (field_dimensions / 2)) - var item_size := inventory.get_item_size(grabbed_item) - var rect := Rect2i(grabbed_item_coords, item_size) - if !Rect2i(Vector2i.ZERO, inventory.size).encloses(rect): - return - _set_rect_background(rect, style, PriorityPanel.StylePriority.LOW) - - -func _is_hovering(local_pos: Vector2) -> bool: - return get_rect().has_point(local_pos) - - -func _set_item_background(item: InventoryItem, style: StyleBox, priority: int) -> bool: - if !item: - return false - - _set_rect_background(inventory.get_item_rect(item), style, priority) - return true - - -func _set_rect_background(rect: Rect2i, style: StyleBox, priority: int) -> void: - var h_range = min(rect.size.x + rect.position.x, inventory.size.x) - for i in range(rect.position.x, h_range): - var v_range = min(rect.size.y + rect.position.y, inventory.size.y) - for j in range(rect.position.y, v_range): - _field_backgrounds[i][j].set_style(style, priority) - - -func _fill_background(style: StyleBox, priority: int) -> void: - for panel in _field_background_grid.get_children(): - panel.set_style(style, priority) - - -func _get_global_grabbed_item() -> InventoryItem: - if CtrlDragable.get_grabbed_dragable() == null: - return null - return (CtrlDragable.get_grabbed_dragable() as CtrlInventoryItemRect).item - - -func _get_global_grabbed_item_local_pos() -> Vector2: - if CtrlDragable.get_grabbed_dragable(): - return get_local_mouse_position() - CtrlDragable.get_grab_offset_local_to(self) - return Vector2(-1, -1) - - -func deselect_inventory_item() -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.deselect_inventory_item() - - -func select_inventory_item(item: InventoryItem) -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.select_inventory_item(item) - - -func get_selected_inventory_item() -> InventoryItem: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - return _ctrl_inventory_grid_basic.get_selected_inventory_item() - - -func get_selected_inventory_items() -> Array[InventoryItem]: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return [] - return _ctrl_inventory_grid_basic.get_selected_inventory_items() - diff --git a/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres b/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres new file mode 100644 index 0000000..108e501 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres @@ -0,0 +1,6 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://bab5l46oddme5"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_right = 1 +border_width_bottom = 1 diff --git a/addons/gloot/ui/ctrl_inventory_grid_style_background.tres b/addons/gloot/ui/ctrl_inventory_grid_style_background.tres new file mode 100644 index 0000000..74d4cd2 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_style_background.tres @@ -0,0 +1,6 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://dnk4u11b38rr6"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 1 +border_width_top = 1 diff --git a/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres b/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres new file mode 100644 index 0000000..e725815 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://c2h2ygy48r1cr"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(1, 1, 1, 1) diff --git a/addons/gloot/ui/ctrl_inventory_item.gd b/addons/gloot/ui/ctrl_inventory_item.gd new file mode 100644 index 0000000..d7ddd9e --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item.gd @@ -0,0 +1,117 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_item.svg") +class_name CtrlInventoryItem +extends CtrlInventoryItemBase +## Control node for displaying inventory items. +## +## Displays an `InventoryItem` icon and its stack size. Consists of a `TextureRect` (the icon) a `Label` (the stack +## size). + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +var _texture_rect: TextureRect +var _stack_size_label: Label +var _old_item: InventoryItem = null + + +func _connect_item_signals(new_item: InventoryItem) -> void: + if !is_instance_valid(new_item): + return + _Utils.safe_connect(new_item.property_changed, _on_item_property_changed) + + +func _disconnect_item_signals(old_item: InventoryItem) -> void: + if !is_instance_valid(old_item): + return + _Utils.safe_disconnect(old_item.property_changed, _on_item_property_changed) + + +func _on_item_property_changed(_property: String) -> void: + _refresh() + + +func _get_item_position() -> Vector2: + if is_instance_valid(item) && item.get_inventory(): + return item.get_inventory().get_item_position(item) + return Vector2(0, 0) + + +func _ready() -> void: + item_changed.connect(_on_item_changed) + icon_stretch_mode_changed.connect(_on_icon_stretch_mode_changed) + + _texture_rect = TextureRect.new() + _texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + _texture_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + _texture_rect.stretch_mode = icon_stretch_mode + + _stack_size_label = Label.new() + _stack_size_label.mouse_filter = Control.MOUSE_FILTER_IGNORE + _stack_size_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + _stack_size_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM + + add_child(_texture_rect) + add_child(_stack_size_label) + + resized.connect(func(): + _texture_rect.size = size + _stack_size_label.size = size + ) + + _refresh() + + +func _on_item_changed() -> void: + _disconnect_item_signals(_old_item) + _old_item = item + _connect_item_signals(item) + _refresh() + + +func _on_icon_stretch_mode_changed() -> void: + if is_instance_valid(_texture_rect): + _texture_rect.stretch_mode = icon_stretch_mode + + +func _update_texture() -> void: + if !is_instance_valid(_texture_rect): + return + + if is_instance_valid(item): + _texture_rect.texture = item.get_texture() + else: + _texture_rect.texture = null + return + + if is_instance_valid(item) && GridConstraint.is_item_rotated(item): + _texture_rect.size = Vector2(size.y, size.x) + if GridConstraint.is_item_rotation_positive(item): + _texture_rect.position = Vector2(_texture_rect.size.y, 0) + _texture_rect.rotation = PI / 2 + else: + _texture_rect.position = Vector2(0, _texture_rect.size.x) + _texture_rect.rotation = -PI / 2 + + else: + _texture_rect.size = size + _texture_rect.position = Vector2.ZERO + _texture_rect.rotation = 0 + + +func _update_stack_size() -> void: + if !is_instance_valid(_stack_size_label): + return + if !is_instance_valid(item): + _stack_size_label.text = "" + return + var stack_size: int = item.get_stack_size() + if stack_size <= 1: + _stack_size_label.text = "" + else: + _stack_size_label.text = "%d" % stack_size + _stack_size_label.size = size + + +func _refresh() -> void: + _update_texture() + _update_stack_size() diff --git a/addons/gloot/ui/ctrl_inventory_item.gd.uid b/addons/gloot/ui/ctrl_inventory_item.gd.uid new file mode 100644 index 0000000..1500a3b --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item.gd.uid @@ -0,0 +1 @@ +uid://dyd1r31bdgjgu diff --git a/addons/gloot/ui/ctrl_inventory_item_base.gd b/addons/gloot/ui/ctrl_inventory_item_base.gd new file mode 100644 index 0000000..92e2be5 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item_base.gd @@ -0,0 +1,32 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_item.svg") +class_name CtrlInventoryItemBase +extends Control +## Base class for `CtrlInventoryItem`. +## +## `CtrlInventoryItemBase` defines some signals and members used for displaying an `InventoryItem`. Must be inherited +## when defining a custom class for representing inventory items. + +## Emitted when the `item` property has been changed. +signal item_changed + +## Emitted when the `icon_stretch_mode` property has been changed. +signal icon_stretch_mode_changed + +## Reference to the `InventoryItem` that is being displayed. +var item: InventoryItem = null: + set(new_item): + if item == new_item: + return + item = new_item + item_changed.emit() + +@export_group("Icon Behavior", "icon_") +## Controls the item icon behavior when resizing the node's bounding rectangle. See the `TextureRect.StretchMode` +## constants for details. +@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE: + set(new_icon_stretch_mode): + if new_icon_stretch_mode == icon_stretch_mode: + return + icon_stretch_mode = new_icon_stretch_mode + icon_stretch_mode_changed.emit() diff --git a/addons/gloot/ui/ctrl_inventory_item_base.gd.uid b/addons/gloot/ui/ctrl_inventory_item_base.gd.uid new file mode 100644 index 0000000..37243de --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item_base.gd.uid @@ -0,0 +1 @@ +uid://dydpqmpsplkbg diff --git a/addons/gloot/ui/ctrl_inventory_item_rect.gd b/addons/gloot/ui/ctrl_inventory_item_rect.gd deleted file mode 100644 index 0a77b89..0000000 --- a/addons/gloot/ui/ctrl_inventory_item_rect.gd +++ /dev/null @@ -1,167 +0,0 @@ -extends "res://addons/gloot/ui/ctrl_dragable.gd" - -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -signal activated -signal clicked -signal context_activated - -var item: InventoryItem : - set(new_item): - if item == new_item: - return - - _disconnect_item_signals() - _connect_item_signals(new_item) - - item = new_item - if item: - texture = item.get_texture() - activate() - else: - texture = null - deactivate() - _update_stack_size() -var texture: Texture2D : - set(new_texture): - if new_texture == texture: - return - texture = new_texture - _update_texture() -var stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE : - set(new_stretch_mode): - if stretch_mode == new_stretch_mode: - return - stretch_mode = new_stretch_mode - if is_instance_valid(_texture_rect): - _texture_rect.stretch_mode = stretch_mode -var item_slot: ItemSlot -var _texture_rect: TextureRect -var _stack_size_label: Label -static var _stored_preview_size: Vector2 -static var _stored_preview_offset: Vector2 - - -func _connect_item_signals(new_item: InventoryItem) -> void: - if new_item == null: - return - - if !new_item.protoset_changed.is_connected(_refresh): - new_item.protoset_changed.connect(_refresh) - if !new_item.prototype_id_changed.is_connected(_refresh): - new_item.prototype_id_changed.connect(_refresh) - if !new_item.property_changed.is_connected(_on_item_property_changed): - new_item.property_changed.connect(_on_item_property_changed) - - -func _disconnect_item_signals() -> void: - if !is_instance_valid(item): - return - - if item.protoset_changed.is_connected(_refresh): - item.protoset_changed.disconnect(_refresh) - if item.prototype_id_changed.is_connected(_refresh): - item.prototype_id_changed.disconnect(_refresh) - if item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.disconnect(_on_item_property_changed) - - -func _on_item_property_changed(property_name: String) -> void: - var relevant_properties = [ - StacksConstraint.KEY_STACK_SIZE, - GridConstraint.KEY_WIDTH, - GridConstraint.KEY_HEIGHT, - GridConstraint.KEY_SIZE, - GridConstraint.KEY_ROTATED, - GridConstraint.KEY_GRID_POSITION, - InventoryItem.KEY_IMAGE, - ] - if property_name in relevant_properties: - _refresh() - - -func _ready() -> void: - _texture_rect = TextureRect.new() - _texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE - _texture_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - _texture_rect.stretch_mode = stretch_mode - _stack_size_label = Label.new() - _stack_size_label.mouse_filter = Control.MOUSE_FILTER_IGNORE - _stack_size_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT - _stack_size_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM - add_child(_texture_rect) - add_child(_stack_size_label) - - resized.connect(func(): - _texture_rect.size = size - _stack_size_label.size = size - ) - - if item == null: - deactivate() - - _refresh() - - -func _update_texture() -> void: - if !is_instance_valid(_texture_rect): - return - _texture_rect.texture = texture - if is_instance_valid(item) && GridConstraint.is_item_rotated(item): - _texture_rect.size = Vector2(size.y, size.x) - if GridConstraint.is_item_rotation_positive(item): - _texture_rect.position = Vector2(_texture_rect.size.y, 0) - _texture_rect.rotation = PI/2 - else: - _texture_rect.position = Vector2(0, _texture_rect.size.x) - _texture_rect.rotation = -PI/2 - - else: - _texture_rect.size = size - _texture_rect.position = Vector2.ZERO - _texture_rect.rotation = 0 - - -func _update_stack_size() -> void: - if !is_instance_valid(_stack_size_label): - return - if !is_instance_valid(item): - _stack_size_label.text = "" - return - var stack_size: int = StacksConstraint.get_item_stack_size(item) - if stack_size <= 1: - _stack_size_label.text = "" - else: - _stack_size_label.text = "%d" % stack_size - _stack_size_label.size = size - - -func _refresh() -> void: - _update_texture() - _update_stack_size() - - -func create_preview() -> Control: - var preview = CtrlInventoryItemRect.new() - preview.item = item - preview.texture = texture - preview.size = size - preview.stretch_mode = stretch_mode - return preview - - -func _gui_input(event: InputEvent) -> void: - if !(event is InputEventMouseButton): - return - - var mb_event: InputEventMouseButton = event - if mb_event.button_index == MOUSE_BUTTON_LEFT: - if mb_event.double_click: - activated.emit() - else: - clicked.emit() - elif mb_event.button_index == MOUSE_BUTTON_MASK_RIGHT: - context_activated.emit() - diff --git a/addons/gloot/ui/ctrl_inventory_stacked.gd b/addons/gloot/ui/ctrl_inventory_stacked.gd deleted file mode 100644 index 56f5b58..0000000 --- a/addons/gloot/ui/ctrl_inventory_stacked.gd +++ /dev/null @@ -1,74 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_inventory_stacked.svg") -class_name CtrlInventoryStacked -extends CtrlInventory - -@export var progress_bar_visible: bool = true : - set(new_progress_bar_visible): - progress_bar_visible = new_progress_bar_visible - if _progress_bar: - _progress_bar.visible = progress_bar_visible -@export var label_visible: bool = true : - set(new_label_visible): - label_visible = new_label_visible - if _label: - _label.visible = label_visible -var _progress_bar: ProgressBar -var _label: Label - - -func _ready(): - super._ready() - - _progress_bar = ProgressBar.new() - _progress_bar.size_flags_horizontal = SIZE_EXPAND_FILL - _progress_bar.show_percentage = false - _progress_bar.visible = progress_bar_visible - _progress_bar.custom_minimum_size.y = 20 - _vbox_container.add_child(_progress_bar) - - _label = Label.new() - _label.anchor_right = 1.0 - _label.anchor_bottom = 1.0 - _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - _progress_bar.add_child(_label) - - _queue_refresh() - - -func _connect_inventory_signals() -> void: - if !inventory: - return - - super._connect_inventory_signals() - - if !inventory.capacity_changed.is_connected(_queue_refresh): - inventory.capacity_changed.connect(_queue_refresh) - if !inventory.occupied_space_changed.is_connected(_queue_refresh): - inventory.occupied_space_changed.connect(_queue_refresh) - - -func _disconnect_inventory_signals() -> void: - if !inventory: - return - - super._disconnect_inventory_signals() - - if !inventory.capacity_changed.is_connected(_queue_refresh): - inventory.capacity_changed.disconnect(_queue_refresh) - if !inventory.occupied_space_changed.is_connected(_queue_refresh): - inventory.occupied_space_changed.disconnect(_queue_refresh) - - -func _refresh(): - super._refresh() - if is_instance_valid(_label): - _label.visible = label_visible - _label.text = "%d/%d" % [inventory.occupied_space, inventory.capacity] - if is_instance_valid(_progress_bar): - _progress_bar.visible = progress_bar_visible - _progress_bar.min_value = 0 - _progress_bar.max_value = inventory.capacity - _progress_bar.value = inventory.occupied_space - diff --git a/addons/gloot/ui/ctrl_inventory_universal.gd b/addons/gloot/ui/ctrl_inventory_universal.gd new file mode 100644 index 0000000..8644615 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_universal.gd @@ -0,0 +1,111 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory.svg") +extends VBoxContainer + +signal inventory_item_activated(item: InventoryItem) +signal inventory_item_clicked(item: InventoryItem) +signal inventory_item_selected(item: InventoryItem) + +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + disconnect_inventory_signals() + inventory = new_inventory + connect_inventory_signals() + _refresh() + update_configuration_warnings() + +var _inventory_control: Control = null +var _capacity_control: CtrlInventoryCapacity = null + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryUniversal node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + return PackedStringArray() + + +func connect_inventory_signals(): + if !inventory: + return + + inventory.protoset_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + + if !inventory.protoset: + return + inventory.protoset.changed.connect(_refresh) + + +func disconnect_inventory_signals(): + if !inventory: + return + + inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + + if !inventory.protoset: + return + inventory.protoset.changed.disconnect(_refresh) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _refresh() + + +func _ready() -> void: + _refresh() + + +func _refresh() -> void: + if is_instance_valid(_inventory_control): + _inventory_control.queue_free() + _inventory_control = null + if is_instance_valid(_capacity_control): + _capacity_control.queue_free() + _capacity_control = null + + if !is_instance_valid(inventory): + return + + if inventory.get_constraint(GridConstraint) != null: + _inventory_control = CtrlInventoryGrid.new() + else: + _inventory_control = CtrlInventory.new() + _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL + _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL + _inventory_control.inventory = inventory + _inventory_control.inventory_item_activated.connect(func(item: InventoryItem): + inventory_item_activated.emit(item) + ) + _inventory_control.inventory_item_clicked.connect(func(item: InventoryItem, at_position: Vector2, mouse_button_index: int): + inventory_item_clicked.emit(item, at_position, mouse_button_index) + ) + _inventory_control.inventory_item_selected.connect(func(item: InventoryItem): + inventory_item_selected.emit(item) + ) + if inventory.get_constraint(WeightConstraint) != null: + _capacity_control = CtrlInventoryCapacity.new() + _capacity_control.inventory = inventory + + if is_instance_valid(_inventory_control): + add_child(_inventory_control) + if is_instance_valid(_capacity_control): + add_child(_capacity_control) + + +func get_selected_inventory_item() -> InventoryItem: + assert(is_instance_valid(_inventory_control)) + return _inventory_control.get_selected_inventory_item() + + +func get_selected_inventory_items() -> Array[InventoryItem]: + assert(is_instance_valid(_inventory_control)) + return _inventory_control.get_selected_inventory_items() diff --git a/addons/gloot/ui/ctrl_inventory_universal.gd.uid b/addons/gloot/ui/ctrl_inventory_universal.gd.uid new file mode 100644 index 0000000..a6a8155 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_universal.gd.uid @@ -0,0 +1 @@ +uid://bgmdl33rmga3l diff --git a/addons/gloot/ui/ctrl_item_slot.gd b/addons/gloot/ui/ctrl_item_slot.gd index 95a9888..dcb19e8 100644 --- a/addons/gloot/ui/ctrl_item_slot.gd +++ b/addons/gloot/ui/ctrl_item_slot.gd @@ -2,190 +2,111 @@ @icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") class_name CtrlItemSlot extends Control +## A control node representing an inventory slot (`ItemSlot`). +## +## A control node representing an inventory slot (`ItemSlot`). -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -signal item_mouse_entered -signal item_mouse_exited +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -@export var item_slot_path: NodePath : - set(new_item_slot_path): - if item_slot_path == new_item_slot_path: - return - item_slot_path = new_item_slot_path - var node: Node = get_node_or_null(item_slot_path) - - if node == null: - _clear() +## Reference to the item slot that is being displayed. +@export var item_slot: ItemSlot: + set(new_item_slot): + if new_item_slot == item_slot: return - if is_inside_tree(): - assert(node is ItemSlotBase) - - item_slot = node - _refresh() - update_configuration_warnings() -@export var default_item_icon: Texture2D : - set(new_default_item_icon): - if default_item_icon == new_default_item_icon: - return - default_item_icon = new_default_item_icon + _disconnect_item_slot_signals() + item_slot = new_item_slot + _connect_item_slot_signals() + _refresh() -@export var item_texture_visible: bool = true : - set(new_item_texture_visible): - if item_texture_visible == new_item_texture_visible: - return - item_texture_visible = new_item_texture_visible - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.visible = item_texture_visible -@export var label_visible: bool = true : - set(new_label_visible): - if label_visible == new_label_visible: - return - label_visible = new_label_visible - if is_instance_valid(_label): - _label.visible = label_visible + @export_group("Icon Behavior", "icon_") -@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_KEEP_CENTERED : +## Controls the item icon behavior when resizing the node's bounding rectangle. See the `TextureRect.StretchMode` +## constants for details. +@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_KEEP_CENTERED: set(new_icon_stretch_mode): if icon_stretch_mode == new_icon_stretch_mode: return icon_stretch_mode = new_icon_stretch_mode - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.stretch_mode = icon_stretch_mode -@export_group("Text Behavior", "label_") -@export var label_horizontal_alignment: HorizontalAlignment = HORIZONTAL_ALIGNMENT_CENTER : - set(new_label_horizontal_alignment): - if label_horizontal_alignment == new_label_horizontal_alignment: - return - label_horizontal_alignment = new_label_horizontal_alignment - if is_instance_valid(_label): - _label.horizontal_alignment = label_horizontal_alignment -@export var label_vertical_alignment: VerticalAlignment = VERTICAL_ALIGNMENT_CENTER : - set(new_label_vertical_alignment): - if label_vertical_alignment == new_label_vertical_alignment: - return - label_vertical_alignment = new_label_vertical_alignment - if is_instance_valid(_label): - _label.vertical_alignment = label_vertical_alignment -@export var label_text_overrun_behavior: TextServer.OverrunBehavior : - set(new_label_text_overrun_behavior): - if label_text_overrun_behavior == new_label_text_overrun_behavior: + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.icon_stretch_mode = icon_stretch_mode + +@export_group("Custom Styles") +## The slot background style. +@export var slot_style: StyleBox: + set(new_slot_style): + if slot_style == new_slot_style: return - label_text_overrun_behavior = new_label_text_overrun_behavior - if is_instance_valid(_label): - _label.text_overrun_behavior = label_text_overrun_behavior -@export var label_clip_text: bool : - set(new_label_clip_text): - if label_clip_text == new_label_clip_text: - return - label_clip_text = new_label_clip_text - if is_instance_valid(_label): - _label.clip_text = label_clip_text -var item_slot: ItemSlotBase : - set(new_item_slot): - if new_item_slot == item_slot: + slot_style = new_slot_style + _refresh() +## The slot background style when the mouse cursor hovers over the slot. +@export var slot_highlighted_style: StyleBox: + set(new_slot_highlighted_style): + if slot_highlighted_style == new_slot_highlighted_style: return - - _disconnect_item_slot_signals() - item_slot = new_item_slot - _connect_item_slot_signals() - + slot_highlighted_style = new_slot_highlighted_style _refresh() -var _hbox_container: HBoxContainer -var _ctrl_inventory_item_rect: CtrlInventoryItemRect -var _label: Label -var _ctrl_drop_zone: CtrlDropZone - -func _get_configuration_warnings() -> PackedStringArray: - if item_slot_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an item slot, so it can't display any content.\n" + \ - "Set the item_slot_path property to point to an ItemSlotBase node."]) - return PackedStringArray() +var _background_panel: Panel +var _ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem func _connect_item_slot_signals() -> void: if !is_instance_valid(item_slot): return - - if !item_slot.item_equipped.is_connected(_refresh): - item_slot.item_equipped.connect(_refresh) - if !item_slot.cleared.is_connected(_refresh): - item_slot.cleared.connect(_refresh) + _Utils.safe_connect(item_slot.item_equipped, _refresh) + _Utils.safe_connect(item_slot.cleared, _refresh) func _disconnect_item_slot_signals() -> void: if !is_instance_valid(item_slot): return - - if item_slot.item_equipped.is_connected(_refresh): - item_slot.item_equipped.disconnect(_refresh) - if item_slot.cleared.is_connected(_refresh): - item_slot.cleared.disconnect(_refresh) + _Utils.safe_disconnect(item_slot.item_equipped, _refresh) + _Utils.safe_disconnect(item_slot.cleared, _refresh) func _ready(): - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_hbox_container): - _hbox_container.queue_free() - - var node: Node = get_node_or_null(item_slot_path) - if is_inside_tree() && node: - assert(node is ItemSlotBase) - item_slot = node - - _hbox_container = HBoxContainer.new() - _hbox_container.size_flags_horizontal = SIZE_EXPAND_FILL - _hbox_container.size_flags_vertical = SIZE_EXPAND_FILL - add_child(_hbox_container) - _hbox_container.resized.connect(func(): size = _hbox_container.size) - - _ctrl_inventory_item_rect = CtrlInventoryItemRect.new() - _ctrl_inventory_item_rect.visible = item_texture_visible - _ctrl_inventory_item_rect.size_flags_horizontal = SIZE_EXPAND_FILL - _ctrl_inventory_item_rect.size_flags_vertical = SIZE_EXPAND_FILL - _ctrl_inventory_item_rect.item_slot = item_slot - _ctrl_inventory_item_rect.stretch_mode = icon_stretch_mode - _ctrl_inventory_item_rect.mouse_entered.connect(_on_mouse_entered) - _ctrl_inventory_item_rect.mouse_exited.connect(_on_mouse_exited) - _hbox_container.add_child(_ctrl_inventory_item_rect) - - _ctrl_drop_zone = CtrlDropZone.new() - _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) - _ctrl_drop_zone.size = size - resized.connect(func(): _ctrl_drop_zone.size = size) - CtrlDragable.dragable_grabbed.connect(_on_any_dragable_grabbed) - CtrlDragable.dragable_dropped.connect(_on_any_dragable_dropped) - add_child(_ctrl_drop_zone) - _ctrl_drop_zone.deactivate() - - _label = Label.new() - _label.visible = label_visible - _label.size_flags_horizontal = SIZE_EXPAND_FILL - _label.size_flags_vertical = SIZE_EXPAND_FILL - _label.horizontal_alignment = label_horizontal_alignment - _label.vertical_alignment = label_vertical_alignment - _label.text_overrun_behavior = label_text_overrun_behavior - _label.clip_text = label_clip_text - _hbox_container.add_child(_label) - - _hbox_container.size = size + _background_panel = Panel.new() + _background_panel.size = size + _background_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _set_panel_style(_background_panel, slot_style) + add_child(_background_panel) + + _ctrl_draggable_inventory_item = _CtrlDraggableInventoryItem.new() + _ctrl_draggable_inventory_item.icon_stretch_mode = icon_stretch_mode + _ctrl_draggable_inventory_item.size = size + add_child(_ctrl_draggable_inventory_item) + resized.connect(func(): - _hbox_container.size = size + if is_instance_valid(_background_panel): + _background_panel.size = size + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.size = size ) _refresh() -func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: - var item = (dragable as CtrlInventoryItemRect).item +func _can_drop_data(at_position: Vector2, data) -> bool: + return data is InventoryItem + +func _drop_data(at_position: Vector2, data) -> void: + var item := (data as InventoryItem) + if is_instance_valid(item): + _on_item_dropped(item, at_position) + + +func _notification(what): + if what == NOTIFICATION_DRAG_BEGIN: + _ctrl_draggable_inventory_item.mouse_filter = Control.MOUSE_FILTER_IGNORE + elif what == NOTIFICATION_DRAG_END: + _ctrl_draggable_inventory_item.mouse_filter = Control.MOUSE_FILTER_PASS + + +func _on_item_dropped(item: InventoryItem, drop_position: Vector2) -> void: if !item: return if !is_instance_valid(item_slot): @@ -203,7 +124,8 @@ func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> voi if _swap_items(item_slot.get_item(), item): return - item_slot.equip(item) + if item_slot.get_item() == null: + item_slot.equip(item) func _join_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: @@ -211,66 +133,51 @@ func _join_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: return false if !is_instance_valid(item_dst.get_inventory()): return false - if item_dst.get_inventory()._constraint_manager.get_stacks_constraint() == null: - return false - return StacksConstraint.join_stacks(item_dst, item_src) + return item_src.merge_into(item_dst) func _swap_items(item1: InventoryItem, item2: InventoryItem) -> bool: if item_slot.get_item() == null: return false - if item_slot is ItemRefSlot: - # No support for swapping (planning to deprecate ItemRefSlot) - return false return InventoryItem.swap(item1, item2) -func _on_any_dragable_grabbed(dragable: CtrlDragable, grab_position: Vector2): - _ctrl_drop_zone.activate() - - -func _on_any_dragable_dropped(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): - _ctrl_drop_zone.deactivate() - - -func _on_mouse_entered(): - var item = item_slot.get_item() - emit_signal("item_mouse_entered", item) - - -func _on_mouse_exited(): - var item = item_slot.get_item() - emit_signal("item_mouse_exited", item) - - -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _ctrl_drop_zone.deactivate() - - func _refresh() -> void: _clear() if !is_instance_valid(item_slot): return - - if item_slot.get_item() == null: - return var item = item_slot.get_item() - if is_instance_valid(_label): - _label.text = item.get_property(InventoryItem.KEY_NAME, item.prototype_id) - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.item = item - if item.get_texture(): - _ctrl_inventory_item_rect.texture = item.get_texture() + if !is_instance_valid(item): + return + + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.item = item func _clear() -> void: - if is_instance_valid(_label): - _label.text = "" - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.item = null - _ctrl_inventory_item_rect.texture = default_item_icon + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.item = null + +func _set_panel_style(panel: Panel, style: StyleBox) -> void: + panel.remove_theme_stylebox_override("panel") + if style != null: + panel.add_theme_stylebox_override("panel", style) + + +func _input(event) -> void: + if event is InputEventMouseMotion: + if !is_instance_valid(_background_panel): + return + + if get_global_rect().has_point(get_global_mouse_position()) && slot_highlighted_style: + _set_panel_style(_background_panel, slot_highlighted_style) + return + + if slot_style: + _set_panel_style(_background_panel, slot_style) + else: + _background_panel.hide() diff --git a/addons/gloot/ui/ctrl_item_slot.gd.uid b/addons/gloot/ui/ctrl_item_slot.gd.uid new file mode 100644 index 0000000..5a9809a --- /dev/null +++ b/addons/gloot/ui/ctrl_item_slot.gd.uid @@ -0,0 +1 @@ +uid://lbyveer3y70s diff --git a/addons/gloot/ui/ctrl_item_slot_ex.gd b/addons/gloot/ui/ctrl_item_slot_ex.gd deleted file mode 100644 index 69b508d..0000000 --- a/addons/gloot/ui/ctrl_item_slot_ex.gd +++ /dev/null @@ -1,61 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") -class_name CtrlItemSlotEx -extends CtrlItemSlot - -@export var slot_style: StyleBox : - set(new_slot_style): - slot_style = new_slot_style - _refresh() -@export var slot_highlighted_style: StyleBox : - set(new_slot_highlighted_style): - slot_highlighted_style = new_slot_highlighted_style - _refresh() -var _background_panel: Panel - - -func _ready(): - super._ready() - resized.connect(func(): - if is_instance_valid(_background_panel): - _background_panel.size = size - ) - - -func _refresh() -> void: - super._refresh() - _update_background() - - -func _update_background() -> void: - if !is_instance_valid(_background_panel): - _background_panel = Panel.new() - add_child(_background_panel) - move_child(_background_panel, 0) - - _background_panel.size = size - _background_panel.show() - if slot_style: - _set_panel_style(_background_panel, slot_style) - else: - _background_panel.hide() - - -func _set_panel_style(panel: Panel, style: StyleBox) -> void: - panel.remove_theme_stylebox_override("panel") - if style != null: - panel.add_theme_stylebox_override("panel", style) - - -func _on_mouse_entered(): - if slot_highlighted_style: - _set_panel_style(_background_panel, slot_highlighted_style) - super._on_mouse_entered() - - -func _on_mouse_exited(): - if slot_style: - _set_panel_style(_background_panel, slot_style) - else: - _background_panel.hide() - super._on_mouse_exited() diff --git a/addons/label_font_auto_sizer/label_auto_sizer.gd.uid b/addons/label_font_auto_sizer/label_auto_sizer.gd.uid new file mode 100644 index 0000000..7ca07af --- /dev/null +++ b/addons/label_font_auto_sizer/label_auto_sizer.gd.uid @@ -0,0 +1 @@ +uid://bxml0kyjdhbw5 diff --git a/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid b/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid new file mode 100644 index 0000000..97d12ad --- /dev/null +++ b/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid @@ -0,0 +1 @@ +uid://b0ixau067ehwl diff --git a/addons/label_font_auto_sizer/plugin.gd.uid b/addons/label_font_auto_sizer/plugin.gd.uid new file mode 100644 index 0000000..226df51 --- /dev/null +++ b/addons/label_font_auto_sizer/plugin.gd.uid @@ -0,0 +1 @@ +uid://hqbq2lltkx1n diff --git a/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid b/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid new file mode 100644 index 0000000..9370f4d --- /dev/null +++ b/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid @@ -0,0 +1 @@ +uid://fv3m33cjuae8 diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn index 5234e31..e1119a8 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn @@ -1,572 +1,173 @@ -[gd_scene load_steps=12 format=3 uid="uid://ohwjxojqcj63"] +[gd_scene load_steps=12 format=4 uid="uid://ohwjxojqcj63"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_foq54"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_kmt5y"] [ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_1cmgi"] [ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_4dx73"] -[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_w68mw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_gcww2"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_i3g4f"] [ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_j2i8l"] [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_ytjsp"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_o4c4h"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yx3lp"] texture = ExtResource("1_foq54") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_nawqc"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_yx3lp") -[node name="ExampleScene2D2" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -576,20 +177,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_nawqc") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_nawqc") [node name="UI" type="CanvasLayer" parent="."] @@ -612,18 +215,23 @@ text = "[WASD] to move [Space] to jump" [node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 position = Vector2(227, -28) zoom = Vector2(1.5, 1.5) +process_callback = 0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] -script = ExtResource("5_w68mw") +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_gcww2") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true process_priority = -1 +top_level = true position = Vector2(227, -28) script = ExtResource("6_i3g4f") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn index df284df..48f31c7 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://dg1tuoxd3b4tw"] +[gd_scene load_steps=12 format=4 uid="uid://dg1tuoxd3b4tw"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_nf5bo"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_5oggv"] @@ -10,563 +10,164 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_i4m1d"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_m3lnd"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dpuou"] texture = ExtResource("1_nf5bo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_kxirl"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_dpuou") -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -576,20 +177,22 @@ offset_right = 947.0 offset_bottom = 578.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_kxirl") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_kxirl") [node name="UI" type="CanvasLayer" parent="."] @@ -602,17 +205,22 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(282, -29) +physics_interpolation_mode = 1 +position = Vector2(215, -73) zoom = Vector2(2, 2) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_j3ux0") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(282, -29) +top_level = true +position = Vector2(215, -73) script = ExtResource("5_uwr6r") priority = 5 follow_mode = 5 @@ -620,9 +228,10 @@ follow_target = NodePath("../CharacterBody2D") zoom = Vector2(2, 2) tween_resource = ExtResource("6_4l0c3") tween_on_load = false +follow_offset = Vector2(0, -45) follow_damping = true -dead_zone_width = 0.416 -dead_zone_height = 0.63 +dead_zone_width = 0.25 +dead_zone_height = 0.8 show_viewfinder_in_play = true draw_limits = true @@ -637,5 +246,5 @@ text = "[WASD] to move [Space] to jump" [node name="CharacterBody2D" parent="Player" instance=ExtResource("8_i4m1d")] -position = Vector2(282, -29) +position = Vector2(215, -28) script = ExtResource("9_m3lnd") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn index 143e8d6..6519323 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://bio6mao7gtru2"] +[gd_scene load_steps=14 format=4 uid="uid://bio6mao7gtru2"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_8rflf"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_tafwr"] @@ -11,556 +11,156 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="9_witv0"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="10_aivri"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_3qxnm"] texture = ExtResource("1_8rflf") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_14yng"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_3qxnm") [sub_resource type="Resource" id="Resource_spy00"] script = ExtResource("7_awenl") @@ -568,12 +168,13 @@ duration = 0.3 transition = 4 ease = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -583,20 +184,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_14yng") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_14yng") [node name="UI" type="CanvasLayer" parent="."] @@ -609,10 +212,15 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(107, -172.5) +physics_interpolation_mode = 1 +position = Vector2(186, -172.5) +zoom = Vector2(1.5, 1.5) +process_callback = 0 position_smoothing_speed = 8.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_dxiro") [node name="Label" type="Label" parent="."] @@ -626,15 +234,19 @@ text = "[WASD] to move [Space] to jump" [node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")] -position = Vector2(107, -172.5) +top_level = true +position = Vector2(186, -172.5) script = ExtResource("6_ojk83") priority = 10 follow_mode = 3 -follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D")] +follow_targets = [NodePath("../CharacterBody2D"), NodePath("../GroupNPCSprite")] +zoom = Vector2(1.5, 1.5) tween_resource = SubResource("Resource_spy00") tween_on_load = false follow_damping = true auto_zoom = true +auto_zoom_min = 0.5 +auto_zoom_max = 1.5 auto_zoom_margin = Vector4(200, 0, 200, 0) draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn index 260aa31..b5d2775 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://b75giavcvh1mv"] +[gd_scene load_steps=13 format=4 uid="uid://b75giavcvh1mv"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_t003o"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_4ncqd"] @@ -10,569 +10,170 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_fy81j"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_u6ygl"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_nivvc"] texture = ExtResource("1_t003o") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_eyojy"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_nivvc") [sub_resource type="Curve2D" id="Curve2D_usrhf"] _data = { -"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1550, 0) +"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1580.53, 0) } point_count = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -582,20 +183,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -65509, 720896, 3, -65510, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196569, 720896, 4, -131033, 720896, 5, -65497, 720896, 5, 39, 720896, 5, 65575, 720896, 5, 131111, 720896, 5, 196647, 720896, 5, 262183, 720896, 5, 327719, 720896, 5, 393255, 720896, 5, 458791, 720896, 5, 524327, 720896, 5, 589863, 720896, 5, 655399, 720896, 6, -262104, 917504, 6, -196568, 786432, 4, -131032, 786432, 5, -65496, 655360, 6, 40, 786432, 5, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, 524328, 655360, 6, 589864, 786432, 5, 655400, 786432, 6, -262103, 983040, 5, -196567, 786432, 4, -131031, 786432, 5, -65495, 786432, 5, 41, 589824, 6, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, 524329, 786432, 5, 589865, 786432, 5, 655401, 786432, 6, -262102, 720896, 3, -196566, 786432, 4, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 655360, 6, 327722, 786432, 5, 393258, 786432, 5, 458794, 786432, 5, 524330, 786432, 5, 589866, 786432, 5, 655402, 786432, 6, -262101, 1048576, 6, -196565, 786432, 4, -131029, 786432, 5, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, 393259, 655360, 6, 458795, 655360, 6, 524331, 786432, 5, 589867, 786432, 5, 655403, 786432, 6, -262100, 720896, 3, -196564, 786432, 4, -131028, 786432, 5, -65492, 786432, 5, 44, 786432, 5, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, 524332, 786432, 5, 589868, 786432, 5, 655404, 786432, 6, -262099, 983040, 6, -196563, 786432, 4, -131027, 786432, 5, -65491, 786432, 5, 45, 589824, 6, 65581, 655360, 6, 131117, 655360, 6, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, 524333, 786432, 5, 589869, 655360, 6, 655405, 786432, 6, -196562, 786432, 4, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 786432, 5, 524334, 786432, 5, 589870, 786432, 5, 655406, 786432, 6, -196561, 851968, 4, -131025, 851968, 5, -65489, 851968, 5, 47, 851968, 5, 65583, 851968, 5, 131119, 851968, 5, 196655, 851968, 5, 262191, 851968, 5, 327727, 851968, 5, 393263, 851968, 5, 458799, 851968, 5, 524335, 851968, 5, 589871, 851968, 5, 655407, 851968, 6, -131042, 720896, 4, -65506, 720896, 5, 30, 720896, 5, 65566, 720896, 5, 131102, 720896, 5, 196638, 720896, 5, 262174, 720896, 5, 327710, 720896, 5, 393246, 720896, 5, 458782, 720896, 5, 524318, 720896, 5, -196577, 917504, 6, -131041, 786432, 4, -65505, 786432, 5, 31, 655360, 6, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 786432, 5, 458783, 786432, 5, 524319, 786432, 5, -196576, 983040, 5, -131040, 786432, 4, -65504, 786432, 5, 32, 786432, 5, 65568, 589824, 6, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 524320, 786432, 5, -196575, 720896, 3, -131039, 786432, 4, -65503, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 655360, 6, 393249, 786432, 5, 458785, 786432, 5, 524321, 786432, 5, -196574, 1048576, 6, -131038, 786432, 4, -65502, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 393250, 786432, 5, 458786, 655360, 6, 524322, 655360, 6, -196573, 720896, 3, -131037, 786432, 4, -65501, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 524323, 786432, 5, -196572, 983040, 6, -131036, 786432, 4, -65500, 786432, 5, 36, 786432, 5, 65572, 589824, 6, 131108, 655360, 6, 196644, 655360, 6, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 786432, 5, 524324, 786432, 5, -131035, 786432, 4, -65499, 786432, 5, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524325, 786432, 5, -131034, 851968, 4, -65498, 851968, 5, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 524326, 851968, 5, 589854, 720896, 5, 655390, 720896, 5, 720926, 720896, 6, 589855, 655360, 6, 655391, 786432, 5, 720927, 786432, 6, 589856, 786432, 5, 655392, 786432, 5, 720928, 786432, 6, 589857, 786432, 5, 655393, 786432, 5, 720929, 786432, 6, 589858, 786432, 5, 655394, 786432, 5, 720930, 786432, 6, 589859, 786432, 5, 655395, 786432, 5, 720931, 786432, 6, 589860, 786432, 5, 655396, 655360, 6, 720932, 786432, 6, 589861, 786432, 5, 655397, 786432, 5, 720933, 786432, 6, 589862, 851968, 5, 655398, 851968, 5, 720934, 851968, 6, -458704, 720896, 4, -393168, 720896, 5, -327632, 720896, 5, -262096, 720896, 5, -196560, 720896, 5, -131024, 720896, 5, -65488, 720896, 5, 48, 720896, 5, 65584, 720896, 5, 131120, 720896, 5, 196656, 720896, 5, 262192, 720896, 5, 327728, 720896, 5, 393264, 720896, 6, -524239, 917504, 6, -458703, 786432, 4, -393167, 786432, 5, -327631, 655360, 6, -262095, 786432, 5, -196559, 786432, 5, -131023, 786432, 5, -65487, 786432, 5, 49, 786432, 5, 65585, 786432, 5, 131121, 786432, 5, 196657, 786432, 5, 262193, 655360, 6, 327729, 786432, 5, 393265, 786432, 6, -524238, 983040, 5, -458702, 786432, 4, -393166, 786432, 5, -327630, 786432, 5, -262094, 589824, 6, -196558, 786432, 5, -131022, 786432, 5, -65486, 786432, 5, 50, 786432, 5, 65586, 786432, 5, 131122, 786432, 5, 196658, 786432, 5, 262194, 786432, 5, 327730, 786432, 5, 393266, 786432, 6, -524237, 720896, 3, -458701, 786432, 4, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 655360, 6, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, 393267, 786432, 6, -524236, 1048576, 6, -458700, 786432, 4, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 655360, 6, 196660, 655360, 6, 262196, 786432, 5, 327732, 786432, 5, 393268, 786432, 6, -524235, 720896, 3, -458699, 786432, 4, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, 393269, 786432, 6, -524234, 983040, 6, -458698, 786432, 4, -393162, 786432, 5, -327626, 786432, 5, -262090, 589824, 6, -196554, 655360, 6, -131018, 655360, 6, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 655360, 6, 393270, 786432, 6, -458697, 786432, 4, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, 393271, 786432, 6, -458696, 851968, 4, -393160, 851968, 5, -327624, 851968, 5, -262088, 851968, 5, -196552, 851968, 5, -131016, 851968, 5, -65480, 851968, 5, 56, 851968, 5, 65592, 851968, 5, 131128, 851968, 5, 196664, 851968, 5, 262200, 851968, 5, 327736, 851968, 5, 393272, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_eyojy") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAAeAP//AAALAAQAAAAeAAAAAAALAAUAAAAeAAEAAAALAAUAAAAeAAIAAAALAAUAAAAeAAMAAAALAAUAAAAeAAQAAAALAAUAAAAeAAUAAAALAAUAAAAeAAYAAAALAAUAAAAeAAcAAAALAAUAAAAeAAgAAAALAAUAAAAeAAkAAAALAAUAAAAeAAoAAAALAAUAAAAeAAsAAAALAAUAAAAeAAwAAAALAAYAAAAfAP//AAAMAAQAAAAfAAAAAAAMAAUAAAAfAAEAAAAKAAYAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAMAAUAAAAfAAcAAAAMAAUAAAAfAAgAAAAMAAUAAAAfAAkAAAAMAAUAAAAfAAoAAAAKAAYAAAAfAAsAAAAMAAUAAAAfAAwAAAAMAAYAAAAgAP//AAAMAAQAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAJAAYAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAgAAgAAAAMAAUAAAAgAAkAAAAMAAUAAAAgAAoAAAAMAAUAAAAgAAsAAAAMAAUAAAAgAAwAAAAMAAYAAAAhAP//AAAMAAQAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAMAAUAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAKAAYAAAAhAAcAAAAMAAUAAAAhAAgAAAAMAAUAAAAhAAkAAAAMAAUAAAAhAAoAAAAMAAUAAAAhAAsAAAAMAAUAAAAhAAwAAAAMAAYAAAAiAP//AAAMAAQAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAMAAUAAAAiAAUAAAAMAAUAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAiAAgAAAAKAAYAAAAiAAkAAAAKAAYAAAAiAAoAAAAMAAUAAAAiAAsAAAAMAAUAAAAiAAwAAAAMAAYAAAAjAP//AAAMAAQAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAjAAgAAAAMAAUAAAAjAAkAAAAMAAUAAAAjAAoAAAAMAAUAAAAjAAsAAAAMAAUAAAAjAAwAAAAMAAYAAAAkAP//AAAMAAQAAAAkAAAAAAAMAAUAAAAkAAEAAAAMAAUAAAAkAAIAAAAJAAYAAAAkAAMAAAAKAAYAAAAkAAQAAAAKAAYAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAMAAUAAAAkAAgAAAAMAAUAAAAkAAkAAAAMAAUAAAAkAAoAAAAMAAUAAAAkAAsAAAAKAAYAAAAkAAwAAAAMAAYAAAAlAP//AAAMAAQAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAAlAAgAAAAMAAUAAAAlAAkAAAAMAAUAAAAlAAoAAAAMAAUAAAAlAAsAAAAMAAUAAAAlAAwAAAAMAAYAAAAmAP//AAANAAQAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAmAAgAAAANAAUAAAAmAAkAAAANAAUAAAAmAAoAAAANAAUAAAAmAAsAAAANAAUAAAAmAAwAAAANAAYAAAAnAP7/AAALAAQAAAAnAP//AAALAAUAAAAnAAAAAAALAAUAAAAnAAEAAAALAAUAAAAnAAIAAAALAAUAAAAnAAMAAAALAAUAAAAnAAQAAAALAAUAAAAnAAUAAAALAAUAAAAnAAYAAAALAAUAAAAnAAcAAAALAAUAAAAnAAgAAAALAAUAAAAnAAkAAAALAAUAAAAnAAoAAAALAAUAAAAnAAsAAAALAAYAAAAoAP7/AAAMAAQAAAAoAP//AAAMAAUAAAAoAAAAAAAKAAYAAAAoAAEAAAAMAAUAAAAoAAIAAAAMAAUAAAAoAAMAAAAMAAUAAAAoAAQAAAAMAAUAAAAoAAUAAAAMAAUAAAAoAAYAAAAMAAUAAAAoAAcAAAAMAAUAAAAoAAgAAAAMAAUAAAAoAAkAAAAKAAYAAAAoAAoAAAAMAAUAAAAoAAsAAAAMAAYAAAApAP7/AAAMAAQAAAApAP//AAAMAAUAAAApAAAAAAAMAAUAAAApAAEAAAAMAAUAAAApAAIAAAAMAAUAAAApAAMAAAAMAAUAAAApAAQAAAAMAAUAAAApAAUAAAAMAAUAAAApAAYAAAAMAAUAAAApAAcAAAAMAAUAAAApAAgAAAAMAAUAAAApAAkAAAAMAAUAAAApAAoAAAAMAAUAAAApAAsAAAAMAAYAAAAqAP7/AAAMAAQAAAAqAP//AAAMAAUAAAAqAAAAAAAMAAUAAAAqAAEAAAAJAAYAAAAqAAIAAAAKAAYAAAAqAAMAAAAKAAYAAAAqAAQAAAAMAAUAAAAqAAUAAAAMAAUAAAAqAAYAAAAMAAUAAAAqAAcAAAAMAAUAAAAqAAgAAAAMAAUAAAAqAAkAAAAMAAUAAAAqAAoAAAAKAAYAAAAqAAsAAAAMAAYAAAArAPb/AAALAAQAAAArAPf/AAALAAUAAAArAPj/AAALAAUAAAArAPn/AAALAAUAAAArAPr/AAALAAUAAAArAPv/AAALAAUAAAArAPz/AAALAAUAAAArAP3/AAALAAYAAAAsAPb/AAAMAAQAAAAsAPf/AAAMAAUAAAAsAPj/AAAKAAYAAAAsAPn/AAAMAAUAAAAsAPr/AAAMAAUAAAAsAPv/AAAMAAUAAAAsAPz/AAAMAAUAAAAsAP3/AAAMAAYAAAAtAPb/AAAMAAQAAAAtAPf/AAAMAAUAAAAtAPj/AAAMAAUAAAAtAPn/AAAJAAYAAAAtAPr/AAAMAAUAAAAtAPv/AAAMAAUAAAAtAPz/AAAMAAUAAAAtAP3/AAAMAAYAAAAuAPb/AAAMAAQAAAAuAPf/AAAMAAUAAAAuAPj/AAAMAAUAAAAuAPn/AAAMAAUAAAAuAPr/AAAMAAUAAAAuAPv/AAAMAAUAAAAuAPz/AAAMAAUAAAAuAP3/AAAMAAYAAAAvAPb/AAAMAAQAAAAvAPf/AAAMAAUAAAAvAPj/AAAMAAUAAAAvAPn/AAAMAAUAAAAvAPr/AAAMAAUAAAAvAPv/AAAMAAUAAAAvAPz/AAAMAAUAAAAvAP3/AAAMAAYAAAAwAPb/AAAMAAQAAAAwAPf/AAAMAAUAAAAwAPj/AAAMAAUAAAAwAPn/AAAMAAUAAAAwAPr/AAAMAAUAAAAwAPv/AAAMAAUAAAAwAPz/AAAMAAUAAAAwAP3/AAAMAAYAAAAxAPb/AAAMAAQAAAAxAPf/AAAMAAUAAAAxAPj/AAAMAAUAAAAxAPn/AAAMAAUAAAAxAPr/AAAMAAUAAAAxAPv/AAAMAAUAAAAxAPz/AAAMAAUAAAAxAP3/AAAMAAYAAAAyAPb/AAAMAAQAAAAyAPf/AAAMAAUAAAAyAPj/AAAMAAUAAAAyAPn/AAAMAAUAAAAyAPr/AAAMAAUAAAAyAPv/AAAMAAUAAAAyAPz/AAAMAAUAAAAyAP3/AAAMAAUAAAArAP7/AAANAAQAAAArAP//AAANAAUAAAArAAAAAAANAAUAAAArAAEAAAANAAUAAAArAAIAAAANAAUAAAArAAMAAAANAAUAAAArAAQAAAANAAUAAAArAAUAAAANAAUAAAArAAYAAAANAAUAAAArAAcAAAANAAUAAAArAAgAAAANAAUAAAArAAkAAAANAAUAAAArAAoAAAANAAUAAAArAAsAAAANAAYAAAA=") +tile_set = SubResource("TileSet_eyojy") [node name="UI" type="CanvasLayer" parent="."] @@ -608,10 +211,14 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(374, -216) +physics_interpolation_mode = 1 +position = Vector2(374, -190) zoom = Vector2(1.5, 1.5) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_w0rat") [node name="Label" type="Label" parent="."] @@ -639,7 +246,8 @@ text = "[WASD] to move [node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")] unique_name_in_owner = true -position = Vector2(374, -216) +top_level = true +position = Vector2(374, -190) script = ExtResource("6_y6hoa") priority = 10 follow_mode = 4 @@ -648,10 +256,11 @@ follow_path = NodePath("../Path2D") zoom = Vector2(1.5, 1.5) tween_resource = ExtResource("7_wd55r") tween_on_load = false +follow_damping = true draw_limits = true [node name="Path2D" type="Path2D" parent="."] -position = Vector2(152, -216) +position = Vector2(152, -190) curve = SubResource("Curve2D_usrhf") [node name="CharacterBody2D" parent="." instance=ExtResource("8_fy81j")] diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn index d34057f..9eb1d61 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://0ox7hgdpwpqp"] +[gd_scene load_steps=17 format=4 uid="uid://0ox7hgdpwpqp"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd" id="1_bwr3f"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="2_f03of"] @@ -13,545 +13,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("2_f03of") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -589,6 +189,7 @@ script = ExtResource("1_bwr3f") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -598,32 +199,24 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) metadata/_edit_lock_ = true -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="StartingTerrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true position = Vector2(-97, 0) scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAD9/wAAAAALAAAAAAD+/wAAAAALAAAAAAD//wAAAAALAAAAAAAAAAAAAAALAAAAAAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAD8/wAAAAALAAAAAAD7/wAAAAAKAAAAAAD7/wEAAAAKAAEAAAD7/wIAAAAKAAEAAAD7/wMAAAAKAAEAAAD7/wQAAAAKAAEAAAD7/wUAAAAKAAEAAAD8/wEAAAALAAEAAAD8/wIAAAALAAEAAAD8/wMAAAALAAEAAAD8/wQAAAALAAEAAAD8/wUAAAALAAEAAAD9/wEAAAALAAEAAAD9/wIAAAALAAEAAAD9/wMAAAALAAEAAAD9/wQAAAALAAEAAAD9/wUAAAALAAEAAAD+/wEAAAALAAEAAAD+/wIAAAALAAEAAAD+/wMAAAALAAEAAAD+/wQAAAALAAEAAAD+/wUAAAALAAEAAAD//wEAAAALAAEAAAD//wIAAAALAAEAAAD//wMAAAALAAEAAAD//wQAAAALAAEAAAD//wUAAAALAAEAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAALAAEAAAABAAUAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAAEAAEAAAALAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAALAAEAAAAFAAUAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAALAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAD7//n/AAALAAYAAAD7//j/AAALAAUAAAD7//f/AAALAAUAAAD7//b/AAALAAUAAAD7//X/AAALAAQAAAD8//n/AAAMAAYAAAD9//n/AAAMAAYAAAD+//n/AAAMAAYAAAD///n/AAAMAAYAAAAAAPn/AAAMAAYAAAABAPn/AAAMAAYAAAACAPn/AAAMAAYAAAADAPn/AAAMAAYAAAAEAPn/AAAMAAYAAAAFAPn/AAAMAAYAAAAGAPn/AAAMAAYAAAAHAPn/AAAMAAYAAAAIAPn/AAAMAAYAAAD8//X/AAAMAAQAAAD9//X/AAAMAAQAAAD+//X/AAAMAAQAAAD///X/AAAMAAQAAAAAAPX/AAAMAAQAAAABAPX/AAAMAAQAAAACAPX/AAAMAAQAAAADAPX/AAAMAAQAAAAEAPX/AAAMAAQAAAAFAPX/AAAMAAQAAAAGAPX/AAAMAAQAAAAHAPX/AAAMAAQAAAAIAPX/AAAMAAQAAAAJAPX/AAANAAQAAAAJAPb/AAANAAUAAAAJAPf/AAANAAUAAAAJAPj/AAANAAUAAAAJAPn/AAANAAYAAAD8//b/AAAMAAUAAAD8//f/AAAMAAUAAAD8//j/AAAMAAUAAAD9//b/AAAMAAUAAAD9//f/AAAMAAUAAAD9//j/AAAMAAUAAAD+//b/AAAMAAUAAAD+//f/AAAMAAUAAAD+//j/AAAMAAUAAAD///b/AAAMAAUAAAD///f/AAAMAAUAAAD///j/AAAMAAUAAAAAAPb/AAAMAAUAAAAAAPf/AAAMAAUAAAAAAPj/AAAMAAUAAAABAPb/AAAMAAUAAAABAPf/AAAMAAUAAAABAPj/AAAMAAUAAAACAPb/AAAMAAUAAAACAPf/AAAMAAUAAAACAPj/AAAMAAUAAAADAPb/AAAMAAUAAAADAPf/AAAMAAUAAAADAPj/AAAMAAUAAAAEAPb/AAAMAAUAAAAEAPf/AAAMAAUAAAAEAPj/AAAMAAUAAAAFAPb/AAAMAAUAAAAFAPf/AAAMAAUAAAAFAPj/AAAMAAUAAAAGAPb/AAAMAAUAAAAGAPf/AAAMAAUAAAAGAPj/AAAMAAUAAAAHAPb/AAAMAAUAAAAHAPf/AAAMAAUAAAAHAPj/AAAMAAUAAAAIAPb/AAAMAAUAAAAIAPf/AAAMAAUAAAAIAPj/AAAMAAUAAAA=") tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-458743, 851968, 6, -458744, 786432, 6, -458745, 786432, 6, -458746, 786432, 6, -458747, 786432, 6, -458748, 786432, 6, -458749, 786432, 6, -458750, 786432, 6, -458751, 786432, 6, -393218, 786432, 6, -393219, 786432, 6, -393220, 786432, 6, -393221, 720896, 6, -458752, 786432, 6, -393217, 786432, 6, -524279, 851968, 5, -589815, 851968, 5, -655351, 851968, 5, -720887, 851968, 4, -720888, 786432, 4, -720889, 786432, 4, -720890, 786432, 4, -720891, 786432, 4, -720892, 786432, 4, -720893, 786432, 4, -720894, 786432, 4, -720895, 786432, 4, -720896, 786432, 4, -655361, 786432, 4, -655362, 786432, 4, -655363, 786432, 4, -655364, 786432, 4, -655365, 720896, 4, -589829, 720896, 5, -524293, 720896, 5, -458757, 720896, 5, -589828, 786432, 5, -524292, 786432, 5, -458756, 786432, 5, -589827, 786432, 5, -524291, 786432, 5, -458755, 786432, 5, -589826, 786432, 5, -524290, 786432, 5, -458754, 786432, 5, -589825, 786432, 5, -524289, 786432, 5, -458753, 786432, 5, -655360, 786432, 5, -589824, 786432, 5, -524288, 786432, 5, -655359, 786432, 5, -589823, 786432, 5, -524287, 786432, 5, -655358, 786432, 5, -589822, 786432, 5, -524286, 786432, 5, -655357, 786432, 5, -589821, 786432, 5, -524285, 786432, 5, -655356, 786432, 5, -589820, 786432, 5, -524284, 786432, 5, -655355, 786432, 5, -589819, 786432, 5, -524283, 786432, 5, -655354, 786432, 5, -589818, 786432, 5, -524282, 786432, 5, -655353, 786432, 5, -589817, 786432, 5, -524281, 786432, 5, -655352, 786432, 5, -589816, 786432, 5, -524280, 786432, 5) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(65533, 720896, 0, 65534, 720896, 0, 65535, 720896, 0, 0, 720896, 0, 1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65532, 720896, 0, 65531, 655360, 0, 131067, 655360, 1, 196603, 655360, 1, 262139, 655360, 1, 327675, 655360, 1, 393211, 655360, 1, 131068, 720896, 1, 196604, 720896, 1, 262140, 720896, 1, 327676, 720896, 1, 393212, 720896, 1, 131069, 720896, 1, 196605, 720896, 1, 262141, 720896, 1, 327677, 720896, 1, 393213, 720896, 1, 131070, 720896, 1, 196606, 720896, 1, 262142, 720896, 1, 327678, 720896, 1, 393214, 720896, 1, 131071, 720896, 1, 196607, 720896, 1, 262143, 720896, 1, 327679, 720896, 1, 393215, 720896, 1, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 720896, 1, 327681, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 65540, 720896, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 720896, 1, 327685, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 720896, 1, 262152, 720896, 1, 327688, 720896, 1, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1) -[node name="TileMap2" type="TileMap" parent="."] -z_index = -1 +[node name="OtherTerrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAIAAAAAAAMAAQAAAAJAAAAAAAMAAQAAAAKAAAAAAAMAAQAAAALAAAAAAAMAAQAAAAMAAAAAAAMAAQAAAANAAAAAAAMAAQAAAAOAAAAAAAMAAQAAAD4/wAAAAANAAUAAAD3/wAAAAAMAAUAAAD2/wAAAAAMAAUAAAD1/wAAAAAMAAUAAAD0/wAAAAAMAAUAAADz/wAAAAAMAAUAAAAIAAEAAAAMAAUAAAAIAAIAAAAMAAUAAAAIAAMAAAAMAAUAAAAIAAQAAAAMAAUAAAAJAAEAAAAMAAUAAAAJAAIAAAAMAAUAAAAJAAMAAAAMAAUAAAAJAAQAAAAMAAUAAAAKAAEAAAAMAAUAAAAKAAIAAAAMAAUAAAAKAAMAAAAMAAUAAAAKAAQAAAAMAAUAAAALAAEAAAAMAAUAAAALAAIAAAAMAAUAAAALAAMAAAAMAAUAAAALAAQAAAAMAAUAAAAMAAEAAAAMAAUAAAAMAAIAAAAMAAUAAAAMAAMAAAAMAAUAAAAMAAQAAAAMAAUAAAANAAEAAAAMAAUAAAANAAIAAAAMAAUAAAANAAMAAAAMAAUAAAANAAQAAAAMAAUAAAAOAAEAAAAMAAUAAAAOAAIAAAAMAAUAAAAOAAMAAAAMAAUAAAAOAAQAAAAMAAUAAAAOAAUAAAAMAAUAAAANAAUAAAAMAAUAAAAMAAUAAAAMAAUAAAALAAUAAAAMAAUAAAAKAAUAAAAMAAUAAAAJAAUAAAAMAAUAAAAIAAUAAAAMAAUAAADv//3/AAALAAUAAADv//7/AAALAAUAAADv////AAALAAUAAADv/wAAAAALAAYAAADw//3/AAAMAAUAAADw//7/AAAMAAUAAADw////AAAMAAUAAADw/wAAAAAMAAUAAADx//3/AAAMAAUAAADx//7/AAAMAAUAAADx////AAAMAAUAAADx/wAAAAAMAAUAAADy//3/AAAMAAUAAADy//7/AAAMAAUAAADy////AAAMAAUAAADy/wAAAAAMAAUAAADz//3/AAAMAAUAAADz//7/AAAMAAUAAADz////AAAMAAUAAAD0//3/AAAMAAUAAAD0//7/AAAMAAUAAAD0////AAAMAAUAAAD1//3/AAAMAAUAAAD1//7/AAAMAAUAAAD1////AAAMAAUAAAD2//3/AAAMAAUAAAD2//7/AAAMAAUAAAD2////AAAMAAUAAAD3//3/AAAMAAUAAAD3//7/AAAMAAUAAAD3////AAAMAAUAAAD4//3/AAANAAUAAAD4//7/AAANAAUAAAD4////AAANAAUAAAD4/wEAAAANAAUAAAD4/wIAAAANAAUAAAD4/wMAAAANAAUAAAD4/wQAAAANAAUAAAD4/wUAAAANAAUAAADw/wEAAAAMAAUAAADw/wIAAAAMAAUAAADw/wMAAAAMAAUAAADw/wQAAAAMAAUAAADw/wUAAAAMAAUAAADx/wEAAAAMAAUAAADx/wIAAAAMAAUAAADx/wMAAAAMAAUAAADx/wQAAAAMAAUAAADx/wUAAAAMAAUAAADy/wEAAAAMAAUAAADy/wIAAAAMAAUAAADy/wMAAAAMAAUAAADy/wQAAAAMAAUAAADy/wUAAAAMAAUAAADz/wEAAAAMAAUAAADz/wIAAAAMAAUAAADz/wMAAAAMAAUAAADz/wQAAAAMAAUAAADz/wUAAAAMAAUAAAD0/wEAAAAMAAUAAAD0/wIAAAAMAAUAAAD0/wMAAAAMAAUAAAD0/wQAAAAMAAUAAAD0/wUAAAAMAAUAAAD1/wEAAAAMAAUAAAD1/wIAAAAMAAUAAAD1/wMAAAAMAAUAAAD1/wQAAAAMAAUAAAD1/wUAAAAMAAUAAAD2/wEAAAAMAAUAAAD2/wIAAAAMAAUAAAD2/wMAAAAMAAUAAAD2/wQAAAAMAAUAAAD2/wUAAAAMAAUAAAD3/wEAAAAMAAUAAAD3/wIAAAAMAAUAAAD3/wMAAAAMAAUAAAD3/wQAAAAMAAUAAAD3/wUAAAAMAAUAAAARAAAAAAAMAAQAAAARAAEAAAAMAAUAAAARAAIAAAAMAAUAAAARAAMAAAAMAAUAAAARAAQAAAAMAAUAAAARAAUAAAAMAAUAAAASAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAASAAUAAAAMAAUAAAAPAAAAAAAMAAQAAAAPAAEAAAAMAAUAAAAPAAIAAAAMAAUAAAAPAAMAAAAMAAUAAAAPAAQAAAAMAAUAAAAPAAUAAAAMAAUAAAAQAAAAAAAMAAQAAAAQAAEAAAAMAAUAAAAQAAIAAAAMAAUAAAAQAAMAAAAMAAUAAAAQAAQAAAAMAAUAAAAQAAUAAAAMAAUAAAATAAAAAAAMAAQAAAATAAEAAAAMAAUAAAATAAIAAAAMAAUAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAATAAUAAAAMAAUAAADv//j/AAALAAUAAADv//n/AAALAAUAAADw//j/AAAMAAUAAADw//n/AAAMAAUAAADx//j/AAAMAAUAAADx//n/AAAMAAUAAADy//j/AAAMAAUAAADy//n/AAAMAAUAAADz//j/AAAMAAUAAADz//n/AAAMAAUAAAD0//j/AAAMAAUAAAD0//n/AAAMAAUAAAD1//j/AAAMAAUAAAD1//n/AAAMAAUAAAD2//j/AAAMAAUAAAD2//n/AAAMAAUAAAD3//j/AAAMAAUAAAD3//n/AAAMAAUAAAD4//j/AAANAAUAAAD4//n/AAANAAUAAADv//X/AAALAAQAAADv//b/AAALAAUAAADv//f/AAALAAUAAADw//X/AAAMAAQAAADw//b/AAAMAAUAAADw//f/AAAMAAUAAADx//X/AAAMAAQAAADx//b/AAAMAAUAAADx//f/AAAMAAUAAADy//X/AAAMAAQAAADy//b/AAAMAAUAAADy//f/AAAMAAUAAADz//X/AAAMAAQAAADz//b/AAAMAAUAAADz//f/AAAMAAUAAAD0//X/AAAMAAQAAAD0//b/AAAMAAUAAAD0//f/AAAMAAUAAAD1//X/AAAMAAQAAAD1//b/AAAMAAUAAAD1//f/AAAMAAUAAAD2//X/AAAMAAQAAAD2//b/AAAMAAUAAAD2//f/AAAMAAUAAAD3//X/AAAMAAQAAAD3//b/AAAMAAUAAAD3//f/AAAMAAUAAAD4//X/AAANAAQAAAD4//b/AAANAAUAAAD4//f/AAANAAUAAADv//r/AAALAAUAAADw//r/AAAMAAUAAADx//r/AAAMAAUAAADy//r/AAAMAAUAAADz//r/AAAMAAUAAAD0//r/AAAMAAUAAAD1//r/AAAMAAUAAAD2//r/AAAMAAUAAAD3//r/AAAMAAUAAAD4//r/AAANAAUAAADv//v/AAALAAUAAADw//v/AAAMAAUAAADx//v/AAAMAAUAAADy//v/AAAMAAUAAADz//v/AAAMAAUAAAD0//v/AAAMAAUAAAD1//v/AAAMAAUAAAD2//v/AAAMAAUAAAD3//v/AAAMAAUAAAD4//v/AAANAAUAAADv//z/AAALAAUAAADw//z/AAAMAAUAAADx//z/AAAMAAUAAADy//z/AAAMAAUAAADz//z/AAAMAAUAAAD0//z/AAAMAAUAAAD1//z/AAAMAAUAAAD2//z/AAAMAAUAAAD3//z/AAAMAAUAAAD4//z/AAANAAUAAAAUAAAAAAAMAAQAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAUAAUAAAAMAAUAAAAVAAAAAAAMAAQAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAVAAUAAAAMAAUAAAAWAAAAAAAMAAQAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAMAAUAAAAWAAUAAAAMAAUAAAAXAAAAAAAMAAQAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAAXAAUAAAAMAAUAAAAYAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAZAAAAAAAMAAQAAAAZAAEAAAAMAAUAAAAZAAIAAAAMAAUAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAaAAAAAAAMAAQAAAAaAAEAAAAMAAUAAAAaAAIAAAAMAAUAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAbAAAAAAAMAAQAAAAbAAEAAAAMAAUAAAAbAAIAAAAMAAUAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAmAAAAAAAMAAQAAAAmAAEAAAAMAAUAAAAmAAIAAAAMAAUAAAAmAAMAAAAMAAUAAAAmAAQAAAAMAAUAAAAmAAUAAAAMAAUAAAAnAAAAAAAMAAQAAAAnAAEAAAAMAAUAAAAnAAIAAAAMAAUAAAAnAAMAAAAMAAUAAAAnAAQAAAAMAAUAAAAnAAUAAAAMAAUAAAAoAAAAAAAMAAQAAAAoAAEAAAAMAAUAAAAoAAIAAAAMAAUAAAAoAAMAAAAMAAUAAAAoAAQAAAAMAAUAAAAoAAUAAAAMAAUAAAApAAAAAAAMAAQAAAApAAEAAAAMAAUAAAApAAIAAAAMAAUAAAApAAMAAAAMAAUAAAApAAQAAAAMAAUAAAApAAUAAAAMAAUAAAAqAAAAAAAMAAQAAAAqAAEAAAAMAAUAAAAqAAIAAAAMAAUAAAAqAAMAAAAMAAUAAAAqAAQAAAAMAAUAAAAqAAUAAAAMAAUAAAArAAAAAAAMAAQAAAArAAEAAAAMAAUAAAArAAIAAAAMAAUAAAArAAMAAAAMAAUAAAArAAQAAAAMAAUAAAArAAUAAAAMAAUAAAAsAAAAAAAMAAQAAAAsAAEAAAAMAAUAAAAsAAIAAAAMAAUAAAAsAAMAAAAMAAUAAAAsAAQAAAAMAAUAAAAsAAUAAAAMAAUAAAAtAAAAAAAMAAQAAAAtAAEAAAAMAAUAAAAtAAIAAAAMAAUAAAAtAAMAAAAMAAUAAAAtAAQAAAAMAAUAAAAtAAUAAAAMAAUAAAAuAAAAAAAMAAQAAAAuAAEAAAAMAAUAAAAuAAIAAAAMAAUAAAAuAAMAAAAMAAUAAAAuAAQAAAAMAAUAAAAuAAUAAAAMAAUAAAAvAAAAAAAMAAQAAAAvAAEAAAAMAAUAAAAvAAIAAAAMAAUAAAAvAAMAAAAMAAUAAAAvAAQAAAAMAAUAAAAvAAUAAAAMAAUAAAAwAAAAAAAMAAQAAAAwAAEAAAAMAAUAAAAwAAIAAAAMAAUAAAAwAAMAAAAMAAUAAAAwAAQAAAAMAAUAAAAwAAUAAAAMAAUAAAAxAAAAAAANAAQAAAAxAAEAAAANAAUAAAAxAAIAAAANAAUAAAAxAAMAAAANAAUAAAAxAAQAAAANAAUAAAAxAAUAAAANAAUAAAAyAPf/AAALAAQAAAAyAPj/AAALAAUAAAAyAPn/AAALAAUAAAAyAPr/AAALAAUAAAAyAPv/AAALAAUAAAAyAPz/AAALAAUAAAAyAP3/AAALAAUAAAAyAP7/AAALAAUAAAAyAP//AAALAAUAAAAyAAAAAAALAAUAAAAyAAEAAAALAAUAAAAyAAIAAAALAAUAAAAyAAMAAAALAAUAAAAyAAQAAAALAAUAAAAyAAUAAAALAAUAAAAzAPf/AAAMAAQAAAAzAPj/AAAMAAUAAAAzAPn/AAAMAAUAAAAzAPr/AAAMAAUAAAAzAPv/AAAMAAUAAAAzAPz/AAAMAAUAAAAzAP3/AAAMAAUAAAAzAP7/AAAMAAUAAAAzAP//AAAMAAUAAAAzAAAAAAAMAAUAAAAzAAEAAAAMAAUAAAAzAAIAAAAMAAUAAAAzAAMAAAAMAAUAAAAzAAQAAAAMAAUAAAAzAAUAAAAMAAUAAAA0APf/AAAMAAQAAAA0APj/AAAMAAUAAAA0APn/AAAMAAUAAAA0APr/AAAMAAUAAAA0APv/AAAMAAUAAAA0APz/AAAMAAUAAAA0AP3/AAAMAAUAAAA0AP7/AAAMAAUAAAA0AP//AAAMAAUAAAA0AAAAAAAMAAUAAAA0AAEAAAAMAAUAAAA0AAIAAAAMAAUAAAA0AAMAAAAMAAUAAAA0AAQAAAAMAAUAAAA0AAUAAAAMAAUAAAA1APf/AAAMAAQAAAA1APj/AAAMAAUAAAA1APn/AAAMAAUAAAA1APr/AAAMAAUAAAA1APv/AAAMAAUAAAA1APz/AAAMAAUAAAA1AP3/AAAMAAUAAAA1AP7/AAAMAAUAAAA1AP//AAAMAAUAAAA1AAAAAAAMAAUAAAA1AAEAAAAMAAUAAAA1AAIAAAAMAAUAAAA1AAMAAAAMAAUAAAA1AAQAAAAMAAUAAAA1AAUAAAAMAAUAAAA2APf/AAAMAAQAAAA2APj/AAAMAAUAAAA2APn/AAAMAAUAAAA2APr/AAAMAAUAAAA2APv/AAAMAAUAAAA2APz/AAAMAAUAAAA2AP3/AAAMAAUAAAA2AP7/AAAMAAUAAAA2AP//AAAMAAUAAAA2AAAAAAAMAAUAAAA2AAEAAAAMAAUAAAA2AAIAAAAMAAUAAAA2AAMAAAAMAAUAAAA2AAQAAAAMAAUAAAA2AAUAAAAMAAUAAAA3APf/AAAMAAQAAAA3APj/AAAMAAUAAAA3APn/AAAMAAUAAAA3APr/AAAMAAUAAAA3APv/AAAMAAUAAAA3APz/AAAMAAUAAAA3AP3/AAAMAAUAAAA3AP7/AAAMAAUAAAA3AP//AAAMAAUAAAA3AAAAAAAMAAUAAAA3AAEAAAAMAAUAAAA3AAIAAAAMAAUAAAA3AAMAAAAMAAUAAAA3AAQAAAAMAAUAAAA3AAUAAAAMAAUAAAA4APf/AAAMAAQAAAA4APj/AAAMAAUAAAA4APn/AAAMAAUAAAA4APr/AAAMAAUAAAA4APv/AAAMAAUAAAA4APz/AAAMAAUAAAA4AP3/AAAMAAUAAAA4AP7/AAAMAAUAAAA4AP//AAAMAAUAAAA4AAAAAAAMAAUAAAA4AAEAAAAMAAUAAAA4AAIAAAAMAAUAAAA4AAMAAAAMAAUAAAA4AAQAAAAMAAUAAAA4AAUAAAAMAAUAAAA5APf/AAAMAAQAAAA5APj/AAAMAAUAAAA5APn/AAAMAAUAAAA5APr/AAAMAAUAAAA5APv/AAAMAAUAAAA5APz/AAAMAAUAAAA5AP3/AAAMAAUAAAA5AP7/AAAMAAUAAAA5AP//AAAMAAUAAAA5AAAAAAAMAAUAAAA5AAEAAAAMAAUAAAA5AAIAAAAMAAUAAAA5AAMAAAAMAAUAAAA5AAQAAAAMAAUAAAA5AAUAAAAMAAUAAAA6APf/AAAMAAQAAAA6APj/AAAMAAUAAAA6APn/AAAMAAUAAAA6APr/AAAMAAUAAAA6APv/AAAMAAUAAAA6APz/AAAMAAUAAAA6AP3/AAAMAAUAAAA6AP7/AAAMAAUAAAA6AP//AAAMAAUAAAA6AAAAAAAMAAUAAAA6AAEAAAAMAAUAAAA6AAIAAAAMAAUAAAA6AAMAAAAMAAUAAAA6AAQAAAAMAAUAAAA6AAUAAAAMAAUAAAA7APf/AAANAAQAAAA7APj/AAANAAUAAAA7APn/AAANAAUAAAA7APr/AAANAAUAAAA7APv/AAANAAUAAAA7APz/AAANAAUAAAA7AP3/AAANAAUAAAA7AP7/AAANAAUAAAA7AP//AAANAAUAAAA7AAAAAAANAAUAAAA7AAEAAAANAAUAAAA7AAIAAAANAAUAAAA7AAMAAAANAAUAAAA7AAQAAAANAAUAAAA7AAUAAAANAAUAAAAcAAAAAAAMAAQAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAMAAUAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAdAAAAAAAMAAQAAAAdAAEAAAAMAAUAAAAdAAIAAAAMAAUAAAAdAAMAAAAMAAUAAAAdAAQAAAAMAAUAAAAdAAUAAAAMAAUAAAAeAAAAAAAMAAQAAAAeAAEAAAAMAAUAAAAeAAIAAAAMAAUAAAAeAAMAAAAMAAUAAAAeAAQAAAAMAAUAAAAeAAUAAAAMAAUAAAAfAAAAAAAMAAQAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAgAAAAAAAMAAQAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAhAAAAAAAMAAQAAAAhAAEAAAAMAAUAAAAhAAIAAAAMAAUAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAiAAAAAAAMAAQAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAMAAUAAAAiAAUAAAAMAAUAAAAjAAAAAAAMAAQAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAkAAAAAAAMAAQAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAlAAAAAAAMAAQAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAmAP//AAAOAAMAAAAnAP//AAAPAAMAAAAoAP//AAAPAAMAAAApAP//AAAPAAMAAAAqAP//AAAPAAMAAAArAP//AAAPAAMAAAAsAP//AAAPAAMAAAAtAP//AAAPAAMAAAAuAP//AAAPAAMAAAAvAP//AAAPAAMAAAAwAP//AAAQAAMAAAAxAPf/AAAHAAQAAAAxAPj/AAAHAAUAAAAxAPn/AAAHAAUAAAAxAPr/AAAHAAUAAAAxAPv/AAAHAAUAAAAxAPz/AAAHAAUAAAAxAP3/AAAHAAUAAAAxAP7/AAAHAAUAAAAxAP//AAAHAAYAAAA=") tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(8, 786432, 4, 9, 786432, 4, 10, 786432, 4, 11, 786432, 4, 12, 786432, 4, 13, 786432, 4, 14, 786432, 4, 65528, 851968, 5, 65527, 786432, 5, 65526, 786432, 5, 65525, 786432, 5, 65524, 786432, 5, 65523, 786432, 5, 65544, 786432, 5, 131080, 786432, 5, 196616, 786432, 5, 262152, 786432, 5, 65545, 786432, 5, 131081, 786432, 5, 196617, 786432, 5, 262153, 786432, 5, 65546, 786432, 5, 131082, 786432, 5, 196618, 786432, 5, 262154, 786432, 5, 65547, 786432, 5, 131083, 786432, 5, 196619, 786432, 5, 262155, 786432, 5, 65548, 786432, 5, 131084, 786432, 5, 196620, 786432, 5, 262156, 786432, 5, 65549, 786432, 5, 131085, 786432, 5, 196621, 786432, 5, 262157, 786432, 5, 65550, 786432, 5, 131086, 786432, 5, 196622, 786432, 5, 262158, 786432, 5, 327694, 786432, 5, 327693, 786432, 5, 327692, 786432, 5, 327691, 786432, 5, 327690, 786432, 5, 327689, 786432, 5, 327688, 786432, 5, -131089, 720896, 5, -65553, 720896, 5, -17, 720896, 5, 65519, 720896, 6, -131088, 786432, 5, -65552, 786432, 5, -16, 786432, 5, 65520, 786432, 5, -131087, 786432, 5, -65551, 786432, 5, -15, 786432, 5, 65521, 786432, 5, -131086, 786432, 5, -65550, 786432, 5, -14, 786432, 5, 65522, 786432, 5, -131085, 786432, 5, -65549, 786432, 5, -13, 786432, 5, -131084, 786432, 5, -65548, 786432, 5, -12, 786432, 5, -131083, 786432, 5, -65547, 786432, 5, -11, 786432, 5, -131082, 786432, 5, -65546, 786432, 5, -10, 786432, 5, -131081, 786432, 5, -65545, 786432, 5, -9, 786432, 5, -131080, 851968, 5, -65544, 851968, 5, -8, 851968, 5, 131064, 851968, 5, 196600, 851968, 5, 262136, 851968, 5, 327672, 851968, 5, 393208, 851968, 5, 131056, 786432, 5, 196592, 786432, 5, 262128, 786432, 5, 327664, 786432, 5, 393200, 786432, 5, 131057, 786432, 5, 196593, 786432, 5, 262129, 786432, 5, 327665, 786432, 5, 393201, 786432, 5, 131058, 786432, 5, 196594, 786432, 5, 262130, 786432, 5, 327666, 786432, 5, 393202, 786432, 5, 131059, 786432, 5, 196595, 786432, 5, 262131, 786432, 5, 327667, 786432, 5, 393203, 786432, 5, 131060, 786432, 5, 196596, 786432, 5, 262132, 786432, 5, 327668, 786432, 5, 393204, 786432, 5, 131061, 786432, 5, 196597, 786432, 5, 262133, 786432, 5, 327669, 786432, 5, 393205, 786432, 5, 131062, 786432, 5, 196598, 786432, 5, 262134, 786432, 5, 327670, 786432, 5, 393206, 786432, 5, 131063, 786432, 5, 196599, 786432, 5, 262135, 786432, 5, 327671, 786432, 5, 393207, 786432, 5, 17, 786432, 4, 65553, 786432, 5, 131089, 786432, 5, 196625, 786432, 5, 262161, 786432, 5, 327697, 786432, 5, 18, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 327698, 786432, 5, 15, 786432, 4, 65551, 786432, 5, 131087, 786432, 5, 196623, 786432, 5, 262159, 786432, 5, 327695, 786432, 5, 16, 786432, 4, 65552, 786432, 5, 131088, 786432, 5, 196624, 786432, 5, 262160, 786432, 5, 327696, 786432, 5, 19, 786432, 4, 65555, 786432, 5, 131091, 786432, 5, 196627, 786432, 5, 262163, 786432, 5, 327699, 786432, 5, -458769, 720896, 5, -393233, 720896, 5, -458768, 786432, 5, -393232, 786432, 5, -458767, 786432, 5, -393231, 786432, 5, -458766, 786432, 5, -393230, 786432, 5, -458765, 786432, 5, -393229, 786432, 5, -458764, 786432, 5, -393228, 786432, 5, -458763, 786432, 5, -393227, 786432, 5, -458762, 786432, 5, -393226, 786432, 5, -458761, 786432, 5, -393225, 786432, 5, -458760, 851968, 5, -393224, 851968, 5, -655377, 720896, 4, -589841, 720896, 5, -524305, 720896, 5, -655376, 786432, 4, -589840, 786432, 5, -524304, 786432, 5, -655375, 786432, 4, -589839, 786432, 5, -524303, 786432, 5, -655374, 786432, 4, -589838, 786432, 5, -524302, 786432, 5, -655373, 786432, 4, -589837, 786432, 5, -524301, 786432, 5, -655372, 786432, 4, -589836, 786432, 5, -524300, 786432, 5, -655371, 786432, 4, -589835, 786432, 5, -524299, 786432, 5, -655370, 786432, 4, -589834, 786432, 5, -524298, 786432, 5, -655369, 786432, 4, -589833, 786432, 5, -524297, 786432, 5, -655368, 851968, 4, -589832, 851968, 5, -524296, 851968, 5, -327697, 720896, 5, -327696, 786432, 5, -327695, 786432, 5, -327694, 786432, 5, -327693, 786432, 5, -327692, 786432, 5, -327691, 786432, 5, -327690, 786432, 5, -327689, 786432, 5, -327688, 851968, 5, -262161, 720896, 5, -262160, 786432, 5, -262159, 786432, 5, -262158, 786432, 5, -262157, 786432, 5, -262156, 786432, 5, -262155, 786432, 5, -262154, 786432, 5, -262153, 786432, 5, -262152, 851968, 5, -196625, 720896, 5, -196624, 786432, 5, -196623, 786432, 5, -196622, 786432, 5, -196621, 786432, 5, -196620, 786432, 5, -196619, 786432, 5, -196618, 786432, 5, -196617, 786432, 5, -196616, 851968, 5, 20, 786432, 4, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 327700, 786432, 5, 21, 786432, 4, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 327701, 786432, 5, 22, 786432, 4, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 786432, 5, 327702, 786432, 5, 23, 786432, 4, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327703, 786432, 5, 24, 786432, 4, 65560, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 25, 786432, 4, 65561, 786432, 5, 131097, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 26, 786432, 4, 65562, 786432, 5, 131098, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 27, 786432, 4, 65563, 786432, 5, 131099, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, -65498, 917504, 3, 38, 786432, 4, 65574, 786432, 5, 131110, 786432, 5, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 39, 786432, 4, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, -65496, 983040, 3, 40, 786432, 4, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, -65495, 983040, 3, 41, 786432, 4, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, -65494, 983040, 3, 42, 786432, 4, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, -65493, 983040, 3, 43, 786432, 4, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, -65492, 983040, 3, 44, 786432, 4, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, -65491, 983040, 3, 45, 786432, 4, 65581, 786432, 5, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, -65490, 983040, 3, 46, 786432, 4, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, -65489, 983040, 3, 47, 786432, 4, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, -65488, 1048576, 3, 48, 786432, 4, 65584, 786432, 5, 131120, 786432, 5, 196656, 786432, 5, 262192, 786432, 5, 327728, 786432, 5, 49, 851968, 4, 65585, 851968, 5, 131121, 851968, 5, 196657, 851968, 5, 262193, 851968, 5, 327729, 851968, 5, -65497, 983040, 3, -589774, 720896, 4, -524238, 720896, 5, -458702, 720896, 5, -393166, 720896, 5, -327630, 720896, 5, -262094, 720896, 5, -196558, 720896, 5, -131022, 720896, 5, -65486, 720896, 5, 50, 720896, 5, 65586, 720896, 5, 131122, 720896, 5, 196658, 720896, 5, 262194, 720896, 5, 327730, 720896, 5, -589773, 786432, 4, -524237, 786432, 5, -458701, 786432, 5, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 786432, 5, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, -589772, 786432, 4, -524236, 786432, 5, -458700, 786432, 5, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 786432, 5, 196660, 786432, 5, 262196, 786432, 5, 327732, 786432, 5, -589771, 786432, 4, -524235, 786432, 5, -458699, 786432, 5, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, -589770, 786432, 4, -524234, 786432, 5, -458698, 786432, 5, -393162, 786432, 5, -327626, 786432, 5, -262090, 786432, 5, -196554, 786432, 5, -131018, 786432, 5, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 786432, 5, -589769, 786432, 4, -524233, 786432, 5, -458697, 786432, 5, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, -589768, 786432, 4, -524232, 786432, 5, -458696, 786432, 5, -393160, 786432, 5, -327624, 786432, 5, -262088, 786432, 5, -196552, 786432, 5, -131016, 786432, 5, -65480, 786432, 5, 56, 786432, 5, 65592, 786432, 5, 131128, 786432, 5, 196664, 786432, 5, 262200, 786432, 5, 327736, 786432, 5, -589767, 786432, 4, -524231, 786432, 5, -458695, 786432, 5, -393159, 786432, 5, -327623, 786432, 5, -262087, 786432, 5, -196551, 786432, 5, -131015, 786432, 5, -65479, 786432, 5, 57, 786432, 5, 65593, 786432, 5, 131129, 786432, 5, 196665, 786432, 5, 262201, 786432, 5, 327737, 786432, 5, -589766, 786432, 4, -524230, 786432, 5, -458694, 786432, 5, -393158, 786432, 5, -327622, 786432, 5, -262086, 786432, 5, -196550, 786432, 5, -131014, 786432, 5, -65478, 786432, 5, 58, 786432, 5, 65594, 786432, 5, 131130, 786432, 5, 196666, 786432, 5, 262202, 786432, 5, 327738, 786432, 5, -589765, 851968, 4, -524229, 851968, 5, -458693, 851968, 5, -393157, 851968, 5, -327621, 851968, 5, -262085, 851968, 5, -196549, 851968, 5, -131013, 851968, 5, -65477, 851968, 5, 59, 851968, 5, 65595, 851968, 5, 131131, 851968, 5, 196667, 851968, 5, 262203, 851968, 5, 327739, 851968, 5, 28, 786432, 4, 65564, 786432, 5, 131100, 786432, 5, 196636, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 29, 786432, 4, 65565, 786432, 5, 131101, 786432, 5, 196637, 786432, 5, 262173, 786432, 5, 327709, 786432, 5, 30, 786432, 4, 65566, 786432, 5, 131102, 786432, 5, 196638, 786432, 5, 262174, 786432, 5, 327710, 786432, 5, 31, 786432, 4, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 32, 786432, 4, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 33, 786432, 4, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 34, 786432, 4, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 35, 786432, 4, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 36, 786432, 4, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 37, 786432, 4, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, -65487, 458752, 6, -131023, 458752, 5, -196559, 458752, 5, -262095, 458752, 5, -327631, 458752, 5, -393167, 458752, 5, -458703, 458752, 5, -524239, 458752, 5, -589775, 458752, 4) [node name="UI" type="CanvasLayer" parent="."] @@ -637,12 +230,14 @@ visible = false [node name="CharacterBody2D" parent="." instance=ExtResource("5_yv8tn")] unique_name_in_owner = true -position = Vector2(66, -50) +z_index = 1 +position = Vector2(66, -28) script = ExtResource("6_68ewj") [node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(66, -113.205) +top_level = true +position = Vector2(66, -91.205) script = ExtResource("6_2n5r1") priority = 5 follow_mode = 2 @@ -652,7 +247,7 @@ tween_resource = SubResource("Resource_ct1eh") follow_offset = Vector2(0, -63.205) follow_damping = true draw_limits = true -limit_target = NodePath("../TileMap") +limit_target = NodePath("../StartingTerrain") limit_margin = Vector4i(-50, 0, -50, 0) [node name="RoomLeftArea2D" type="Area2D" parent="."] @@ -666,7 +261,8 @@ debug_color = Color(0, 0.6, 0.701961, 0.0313726) [node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true -position = Vector2(1474, -149) +top_level = true +position = Vector2(1218, -217) script = ExtResource("6_2n5r1") follow_mode = 2 zoom = Vector2(1.5, 1.5) @@ -695,6 +291,7 @@ debug_color = Color(0, 0.6, 0.701961, 0) [node name="RoomRightPhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(2347, -156) scale = Vector2(1.0024, 1) script = ExtResource("6_2n5r1") @@ -705,8 +302,10 @@ follow_damping = true draw_limits = true [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(66, -113.205) +physics_interpolation_mode = 1 +position = Vector2(66, -91.205) zoom = Vector2(2, 2) +process_callback = 0 limit_left = -387 limit_top = -528 limit_right = 433 @@ -715,4 +314,6 @@ position_smoothing_speed = 10.0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("8_hulu3") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn new file mode 100644 index 0000000..029444b --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn @@ -0,0 +1,289 @@ +[gd_scene load_steps=16 format=4 uid="uid://chw6g32u86uve"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_2m0x8"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_4bfy0"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_vdqsb"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_w2gh7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_d6fcf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_bdmii"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_dpnkg"] +[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_u5o87"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_suxld"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd" id="10_p43w0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd" id="11_d6abr"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_lvmak"] +texture = ExtResource("1_2m0x8") +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +4:0/0 = 0 +5:0/0 = 0 +6:0/0 = 0 +7:0/0 = 0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +0:1/0 = 0 +1:1/0 = 0 +2:1/0 = 0 +3:1/0 = 0 +4:1/0 = 0 +5:1/0 = 0 +7:1/0 = 0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +2:2/0 = 0 +3:2/0 = 0 +4:2/0 = 0 +7:2/0 = 0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:3/0 = 0 +4:3/0 = 0 +5:3/0 = 0 +7:3/0 = 0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:4/0 = 0 +4:4/0 = 0 +5:4/0 = 0 +7:4/0 = 0 +3:5/0 = 0 +4:5/0 = 0 +7:5/0 = 0 +3:6/0 = 0 +4:6/0 = 0 +7:6/0 = 0 +2:7/0 = 0 +3:7/0 = 0 +4:7/0 = 0 +5:7/0 = 0 +8:0/0 = 0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0 = 0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0 = 0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0 = 0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0 = 0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0 = 0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:0/0 = 0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +16:0/0 = 0 +8:1/0 = 0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0 = 0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0 = 0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0 = 0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0 = 0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0 = 0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:1/0 = 0 +15:1/0 = 0 +16:1/0 = 0 +8:2/0 = 0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0 = 0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0 = 0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0 = 0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0 = 0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0 = 0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:2/0 = 0 +15:2/0 = 0 +16:2/0 = 0 +8:3/0 = 0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0 = 0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0 = 0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:3/0 = 0 +12:3/0 = 0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0 = 0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:3/0 = 0 +15:3/0 = 0 +16:3/0 = 0 +8:4/0 = 0 +9:4/0 = 0 +10:4/0 = 0 +11:4/0 = 0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +12:4/0 = 0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:4/0 = 0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +14:4/0 = 0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +16:4/0 = 0 +8:5/0 = 0 +9:5/0 = 0 +10:5/0 = 0 +11:5/0 = 0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0 = 0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0 = 0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:5/0 = 0 +15:5/0 = 0 +16:5/0 = 0 +8:6/0 = 0 +9:6/0 = 0 +10:6/0 = 0 +11:6/0 = 0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +12:6/0 = 0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:6/0 = 0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +14:6/0 = 0 +15:6/0 = 0 +16:6/0 = 0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_lvmak") + +[sub_resource type="Resource" id="Resource_87ddr"] +script = ExtResource("11_d6abr") +amplitude = 30.0 +frequency = 0.5 +randomize_noise_seed = 1 +noise_seed = 0 +positional_noise = true +rotational_noise = false +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +rotational_multiplier = 1.0 + +[sub_resource type="Resource" id="Resource_rmnw1"] +script = ExtResource("11_d6abr") +amplitude = 20.0 +frequency = 10.0 +randomize_noise_seed = 1 +noise_seed = 96 +positional_noise = true +rotational_noise = false +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +rotational_multiplier = 1.0 + +[node name="Root" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_kf7eg") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_kf7eg") + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_4bfy0")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_vdqsb")] +unique_name_in_owner = true +visible = false + +[node name="Controls" type="Label" parent="."] +offset_left = 167.0 +offset_top = -145.0 +offset_right = 332.0 +offset_bottom = -81.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("4_w2gh7") +text = "[WASD] to move +[Space] to jump +[Q] to trigger noise" + +[node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 +position = Vector2(227, -28) +offset = Vector2(-0.0537988, 2.87179) +ignore_rotation = false +zoom = Vector2(1.5, 1.5) +process_callback = 0 +editor_draw_limits = true + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_d6fcf") + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +process_priority = -1 +top_level = true +position = Vector2(227, -28) +script = ExtResource("6_bdmii") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../CharacterBody2D") +zoom = Vector2(1.5, 1.5) +frame_preview = false +tween_resource = ExtResource("7_dpnkg") +tween_on_load = false +follow_damping = true +draw_limits = true +noise = SubResource("Resource_87ddr") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +script = ExtResource("10_p43w0") +noise = SubResource("Resource_rmnw1") +duration = 0.1 +decay_time = 0.1 + +[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_u5o87")] +z_index = 2 +position = Vector2(227, -28) +script = ExtResource("9_suxld") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn index 4831baf..74db5c1 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://bvpp5na5054jd"] +[gd_scene load_steps=20 format=4 uid="uid://bvpp5na5054jd"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_h1rbo"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_1f2t2"] @@ -12,556 +12,156 @@ [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_5jy5e"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="10_guf2v"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_cvmao"] texture = ExtResource("1_h1rbo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_na7gm"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_cvmao") [sub_resource type="RectangleShape2D" id="RectangleShape2D_tgk1y"] size = Vector2(140, 160) @@ -590,12 +190,13 @@ duration = 1.2 transition = 10 ease = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -605,20 +206,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_na7gm") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 655360, 6, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 655360, 6, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524281, 720896, 5, 524285, 786432, 5, 524284, 786432, 5, 524283, 786432, 5, 524282, 786432, 5, 589818, 786432, 5, 589819, 786432, 5, 589820, 786432, 5, 655356, 786432, 5, 655357, 786432, 5, 589821, 786432, 5, 655355, 786432, 5, 655354, 786432, 5, 720890, 786432, 5, 720891, 786432, 5, 720892, 786432, 5, 720893, 786432, 5, 720894, 851968, 5, 786429, 786432, 5, 786428, 786432, 5, 786427, 786432, 5, 786426, 786432, 5, 851962, 786432, 5, 917498, 786432, 5, 917499, 786432, 5, 851964, 786432, 5, 851965, 786432, 5, 917501, 786432, 5, 917500, 786432, 5, 851963, 786432, 5, 589817, 720896, 5, 655353, 720896, 5, 720889, 720896, 5, 786425, 720896, 5, 851961, 720896, 5, 917497, 720896, 5, 524286, 851968, 5, 589822, 851968, 5, 655358, 851968, 5, 786430, 851968, 5, 851966, 851968, 5, 917502, 851968, 5, 589824, 720896, 1, 655360, 720896, 1, 720896, 720896, 1, 786432, 720896, 1, 851968, 720896, 1, 589825, 720896, 1, 655361, 720896, 1, 720897, 720896, 1, 786433, 720896, 1, 851969, 720896, 1, 589826, 720896, 1, 655362, 720896, 1, 720898, 720896, 1, 786434, 720896, 1, 851970, 720896, 1, 589827, 720896, 1, 655363, 720896, 1, 720899, 720896, 1, 786435, 720896, 1, 851971, 720896, 1, 589828, 720896, 1, 655364, 720896, 1, 720900, 720896, 1, 786436, 720896, 1, 851972, 720896, 1, 589829, 720896, 1, 655365, 720896, 1, 720901, 720896, 1, 786437, 720896, 1, 851973, 720896, 1, 589830, 720896, 1, 655366, 720896, 1, 720902, 720896, 1, 786438, 720896, 1, 851974, 720896, 1, 589831, 720896, 1, 655367, 720896, 1, 720903, 720896, 1, 786439, 720896, 1, 851975, 720896, 1, 589832, 720896, 1, 655368, 720896, 1, 720904, 720896, 1, 786440, 720896, 1, 851976, 720896, 1, 589833, 786432, 1, 655369, 786432, 1, 720905, 786432, 1, 786441, 786432, 1, 851977, 786432, 1, 655359, 655360, 1, 720895, 655360, 1, 786431, 655360, 1, 851967, 655360, 1, 917503, 655360, 1, 589834, 720896, 1, 655370, 720896, 1, 720906, 720896, 1, 786442, 720896, 1, 851978, 720896, 1, 589835, 720896, 1, 655371, 720896, 1, 720907, 720896, 1, 786443, 720896, 1, 851979, 720896, 1, 589836, 720896, 1, 655372, 720896, 1, 720908, 720896, 1, 786444, 720896, 1, 851980, 720896, 1, 589837, 720896, 1, 655373, 720896, 1, 720909, 720896, 1, 786445, 720896, 1, 851981, 720896, 1, 589838, 720896, 1, 655374, 720896, 1, 720910, 720896, 1, 786446, 720896, 1, 851982, 720896, 1, 589839, 720896, 1, 655375, 720896, 1, 720911, 720896, 1, 786447, 720896, 1, 851983, 720896, 1, 589840, 720896, 1, 655376, 720896, 1, 720912, 720896, 1, 786448, 720896, 1, 851984, 720896, 1, 851985, 720896, 6, 851986, 786432, 6, 851987, 786432, 6, 851988, 786432, 6, 851989, 786432, 6, 851990, 786432, 6, 851991, 786432, 6, 851992, 786432, 6, 851993, 786432, 6, 851994, 786432, 6, 851995, 786432, 6, 851996, 786432, 6, 851997, 851968, 6, 524306, 786432, 5, 589842, 786432, 5, 655378, 786432, 5, 720914, 786432, 5, 786450, 786432, 5, 524307, 786432, 5, 589843, 786432, 5, 655379, 786432, 5, 720915, 786432, 5, 786451, 786432, 5, 524308, 786432, 5, 589844, 786432, 5, 655380, 786432, 5, 720916, 786432, 5, 786452, 786432, 5, 524309, 786432, 5, 589845, 786432, 5, 655381, 786432, 5, 720917, 786432, 5, 786453, 786432, 5, 524310, 786432, 5, 589846, 786432, 5, 655382, 786432, 5, 720918, 786432, 5, 786454, 786432, 5, 524311, 786432, 5, 589847, 786432, 5, 655383, 786432, 5, 720919, 786432, 5, 786455, 786432, 5, 524312, 786432, 5, 589848, 786432, 5, 655384, 786432, 5, 720920, 786432, 5, 786456, 786432, 5, 524313, 786432, 5, 589849, 786432, 5, 655385, 786432, 5, 720921, 786432, 5, 786457, 786432, 5, 524314, 786432, 5, 589850, 786432, 5, 655386, 786432, 5, 720922, 786432, 5, 786458, 786432, 5, 524315, 786432, 5, 589851, 786432, 5, 655387, 786432, 5, 720923, 786432, 5, 786459, 786432, 5, 524316, 786432, 5, 589852, 786432, 5, 655388, 786432, 5, 720924, 786432, 5, 786460, 786432, 5, 524305, 720896, 5, 589841, 720896, 5, 655377, 720896, 5, 720913, 720896, 5, 786449, 720896, 5, 524317, 851968, 5, 589853, 851968, 5, 655389, 851968, 5, 720925, 851968, 5, 786461, 851968, 5, -262106, 786432, 5, -196570, 786432, 5, -131034, 786432, 5, -65498, 786432, 5, 38, 786432, 5, 65574, 786432, 5, 131110, 655360, 6, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 393254, 786432, 5, 458790, 786432, 5, -262105, 786432, 5, -196569, 786432, 5, -131033, 786432, 5, -65497, 786432, 5, 39, 786432, 5, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, 393255, 655360, 6, 458791, 786432, 5, -262104, 786432, 5, -196568, 786432, 5, -131032, 786432, 5, -65496, 786432, 5, 40, 655360, 6, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 655360, 6, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, -262103, 786432, 5, -196567, 655360, 6, -131031, 786432, 5, -65495, 786432, 5, 41, 786432, 5, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, -262102, 786432, 5, -196566, 786432, 5, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 655360, 6, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, 393258, 786432, 5, 458794, 655360, 6, 524326, 786432, 6, 524327, 786432, 6, 524328, 786432, 6, 524329, 786432, 6, 524330, 786432, 6, -327642, 786432, 4, -327641, 786432, 4, -327640, 786432, 4, -327639, 786432, 4, -327638, 786432, 4, -327632, 851968, 4, -262096, 851968, 5, -196560, 851968, 5, -131024, 851968, 5, -65488, 851968, 5, 48, 851968, 5, 65584, 851968, 5, 131120, 851968, 5, 196656, 851968, 5, 262192, 851968, 5, 327728, 851968, 5, 393264, 851968, 5, 458800, 851968, 5, 524336, 851968, 6, -327637, 786432, 4, -327636, 786432, 4, -327635, 786432, 4, -327634, 786432, 4, -327633, 786432, 4, -262101, 786432, 5, -196565, 786432, 5, -131029, 655360, 6, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 655360, 6, 393259, 786432, 5, 458795, 786432, 5, -262100, 786432, 5, -196564, 786432, 5, -131028, 786432, 5, -65492, 786432, 5, 44, 655360, 6, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, -262099, 786432, 5, -196563, 786432, 5, -131027, 786432, 5, -65491, 786432, 5, 45, 786432, 5, 65581, 655360, 6, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, -262098, 655360, 6, -196562, 786432, 5, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 655360, 6, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 655360, 6, -262097, 786432, 5, -196561, 786432, 5, -131025, 786432, 5, -65489, 786432, 5, 47, 786432, 5, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, 393263, 786432, 5, 458799, 786432, 5, 524331, 786432, 6, 524332, 786432, 6, 524333, 786432, 6, 524334, 786432, 6, 524335, 786432, 6) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_na7gm") [node name="UI" type="CanvasLayer" parent="."] @@ -631,21 +234,26 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 position = Vector2(227, -28) +process_callback = 0 position_smoothing_speed = 10.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_j7670") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(227, -28) script = ExtResource("5_gvv7r") priority = 5 follow_mode = 2 -follow_target = NodePath("../CharacterBody2D/PlayerVisuals") +follow_target = NodePath("../CharacterBody2D") tween_resource = ExtResource("6_rwobr") tween_on_load = false follow_damping = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn index 46d40be..40aa4aa 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_1utlo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -566,6 +166,7 @@ sources/0 = SubResource("TileSetAtlasSource_easgx") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -575,7 +176,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -588,7 +188,7 @@ layer_0/name = "Background" layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) layer_1/name = "Terrain" layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196596, 917504, 0) [node name="UI" type="CanvasLayer" parent="."] @@ -613,9 +213,12 @@ text = "[WASD] to move [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(227, -28) zoom = Vector2(1.5, 1.5) +process_callback = 0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_54fc4") [node name="Player" type="Node" parent="."] @@ -623,6 +226,7 @@ script = ExtResource("4_54fc4") [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true process_priority = -1 +top_level = true position = Vector2(227, -28) script = ExtResource("2_mgsut") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn index 69d1d70..74cac59 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_27o77") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -566,6 +166,7 @@ sources/0 = SubResource("TileSetAtlasSource_easgx") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -575,7 +176,6 @@ offset_right = 947.0 offset_bottom = 578.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -603,14 +203,18 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(282, -29) zoom = Vector2(2, 2) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_mylkx") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(282, -29) script = ExtResource("5_lwx5e") priority = 5 @@ -620,8 +224,8 @@ zoom = Vector2(2, 2) tween_resource = ExtResource("6_tju6r") tween_on_load = false follow_damping = true -dead_zone_width = 0.416 -dead_zone_height = 0.63 +dead_zone_width = 0.4 +dead_zone_height = 0.8 show_viewfinder_in_play = true draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn index c07f5c1..103729b 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn @@ -13,545 +13,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_5kqbp") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -573,6 +173,7 @@ ease = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -582,7 +183,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -608,10 +208,13 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(107, -172.5) +position = Vector2(186, -172.5) +zoom = Vector2(1.5, 1.5) position_smoothing_speed = 8.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_2efwt") [node name="Label" type="Label" parent="."] @@ -625,15 +228,19 @@ text = "[WASD] to move [Space] to jump" [node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")] -position = Vector2(107, -172.5) +top_level = true +position = Vector2(186, -172.5) script = ExtResource("6_diuy4") priority = 10 follow_mode = 3 follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D/PlayerVisuals")] +zoom = Vector2(1.5, 1.5) tween_resource = SubResource("Resource_spy00") tween_on_load = false follow_damping = true auto_zoom = true +auto_zoom_min = 0.5 +auto_zoom_max = 1.5 auto_zoom_margin = Vector4(200, 0, 200, 0) draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn index 9fb9454..247a15b 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_17ngo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -572,6 +172,7 @@ point_count = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -581,7 +182,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -609,8 +209,11 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(374, -216) zoom = Vector2(1.5, 1.5) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_yddet") [node name="Label" type="Label" parent="."] @@ -638,6 +241,7 @@ text = "[WASD] to move [node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")] unique_name_in_owner = true +top_level = true position = Vector2(374, -216) script = ExtResource("5_x25dj") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn index fdfb571..f1f7e7f 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_wmhqb") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -588,6 +188,7 @@ script = ExtResource("1_ijqyv") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -597,7 +198,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) metadata/_edit_lock_ = true @@ -636,11 +236,12 @@ visible = false [node name="CharacterBody2D" parent="." instance=ExtResource("5_pr2x5")] unique_name_in_owner = true -position = Vector2(66, -50) +position = Vector2(66, -28) [node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(66, -113.205) +top_level = true +position = Vector2(66, -91.205) script = ExtResource("4_4b648") priority = 5 follow_mode = 2 @@ -664,6 +265,7 @@ debug_color = Color(0, 0.6, 0.701961, 0.0313726) [node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(1474, -149) script = ExtResource("4_4b648") follow_mode = 2 @@ -693,6 +295,7 @@ debug_color = Color(0, 0.6, 0.701961, 0) [node name="RoomRightPhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(2347, -156) scale = Vector2(1.0024, 1) script = ExtResource("4_4b648") @@ -703,8 +306,9 @@ follow_damping = true draw_limits = true [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(66, -113.205) +position = Vector2(66, -91.205) zoom = Vector2(2, 2) +process_callback = 0 limit_left = -387 limit_top = -528 limit_right = 433 @@ -713,6 +317,8 @@ position_smoothing_speed = 10.0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("9_w5e16") [editable path="CharacterBody2D"] diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn index 24d9a1a..4a72e81 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn @@ -14,545 +14,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_oo2bo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -595,6 +195,7 @@ ease = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -604,7 +205,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -631,15 +231,19 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(227, -28) +process_callback = 0 position_smoothing_speed = 10.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_bb7en") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(227, -28) script = ExtResource("5_kikl5") priority = 5 diff --git a/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn b/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn index 7d2ec5c..2ff6075 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd" id="1_jnc14"] [ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_62b2n"] -[ext_resource type="Texture2D" uid="uid://ci76plsequlrq" path="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg" id="2_yr8cm"] +[ext_resource type="Texture2D" uid="uid://cscjjt55iw2cu" path="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg" id="2_yr8cm"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="4_rloon"] [ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres" id="5_4iyk1"] [ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres" id="6_2h6fv"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn new file mode 100644 index 0000000..c3c90f4 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn @@ -0,0 +1,407 @@ +[gd_scene load_steps=41 format=3 uid="uid://cypbptekk8etg"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_u86qq"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_jl1he"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_an0dt"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="3_yfuq5"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="4_iy6qn"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="5_0ku52"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="6_prr6u"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/npc.gd" id="7_nl3ax"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="8_xvqcg"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="9_hqgwi"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="10_cd0kn"] + +[sub_resource type="Resource" id="Resource_jtk1d"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_o161n"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxMesh" id="BoxMesh_7tjw4"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hpllm"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="BoxShape3D" id="BoxShape3D_65o6h"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_tpc7d"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_g0eml"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v5iy7"] +albedo_color = Color(0.988235, 0.478431, 0.905882, 1) + +[sub_resource type="Resource" id="Resource_tpvee"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_bxbnv"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"] +size = Vector3(6.8, 0.1, 5.4) + +[sub_resource type="Resource" id="Resource_7ih0k"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_4iyps"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"] +size = Vector3(7.4, 0.1, 3.6) + +[sub_resource type="Resource" id="Resource_x5y0u"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_pgiyx"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ua072"] +size = Vector3(6.8, 0.1, 3.6) + +[sub_resource type="BoxMesh" id="BoxMesh_ugc3s"] +size = Vector3(1, 1, 2) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_68thd"] +albedo_color = Color(0.34902, 0.862745, 0.854902, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_wphly"] +size = Vector3(1, 0.5, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_gyp5s"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxShape3D" id="BoxShape3D_lfaqs"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxMesh" id="BoxMesh_n70lt"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_jxmqm"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxMesh" id="BoxMesh_x0tgm"] +size = Vector3(8, 40, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_t67ef"] +size = Vector3(50, 40, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_rmslh"] +size = Vector3(0.5, 6, 13.5) + +[sub_resource type="BoxMesh" id="BoxMesh_242ij"] +size = Vector3(2, 3, 3) + +[sub_resource type="BoxMesh" id="BoxMesh_niuda"] +size = Vector3(8, 6, 0.5) + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.948876, 0.315649, 0, -0.315649, 0.948876, -2.53871, 2, 9.76232) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_u86qq") + +[node name="PlayerGroup" type="Node" parent="."] + +[node name="PlayerCharacterBody3D" parent="PlayerGroup" instance=ExtResource("2_jl1he")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.53871, 0.5, 7.26232) +script = ExtResource("3_yfuq5") + +[node name="MovementInstructionsLabel" type="Label3D" parent="PlayerGroup"] +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -2.47682, -0.0708016, 7.93048) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("3_an0dt") +font_size = 48 + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +top_level = true +script = ExtResource("4_iy6qn") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = ExtResource("5_0ku52") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jtk1d") +follow_offset = Vector3(0, 1.5, 2.5) +follow_damping = true + +[node name="NPCGroup" type="Node" parent="."] + +[node name="NPCPhantomCamera3D" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(0.616596, -0.109786, 0.779587, -2.23517e-08, 0.990229, 0.13945, -0.78728, -0.0859841, 0.610571, -2.98802, 1.50739, 1.19719) +script = ExtResource("4_iy6qn") +tween_resource = ExtResource("5_0ku52") +camera_3d_resource = SubResource("Resource_o161n") + +[node name="NPCDescriptionLabel" type="Label3D" parent="NPCGroup"] +transform = Transform3D(1, 0, 0, 0, 0.866026, 0.5, 0, -0.5, 0.866025, -3.04693, 0.367287, 0.953757) +text = "Input Example" +font = ExtResource("3_an0dt") + +[node name="NPCDialogueExampleLabel" type="Label3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 4.54671e-10, 1.65487e-10, 4.25644e-10, 0.939693, 0.34202, 0, -0.34202, 0.939693, -4.46738, 1.58641, -0.253679) +modulate = Color(1, 0.603922, 0.254902, 1) +text = "Press [ F ] to change camera" +font = ExtResource("3_an0dt") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="NPCGroup"] +transform = Transform3D(0.819152, 4.83851e-10, -0.573576, -3.92481e-09, 1, -6.3473e-09, 0.573576, 7.45058e-09, 0.819152, -3.46138, -0.4, 0.875321) +mesh = SubResource("BoxMesh_7tjw4") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_hpllm") +metadata/_edit_group_ = true + +[node name="NPCInteractionArea3D" type="Area3D" parent="NPCGroup/NPCInteractionZoneMesh"] +unique_name_in_owner = true +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +monitorable = false + +[node name="NPCInterationCollisionShape3D" type="CollisionShape3D" parent="NPCGroup/NPCInteractionZoneMesh/NPCInteractionArea3D"] +shape = SubResource("BoxShape3D_65o6h") + +[node name="NPC" type="StaticBody3D" parent="NPCGroup"] +transform = Transform3D(1, 4.83851e-10, 0, 4.25644e-10, 1, -7.45058e-09, 0, 7.45058e-09, 1, -4.56338, 0.5, -0.272679) +script = ExtResource("7_nl3ax") + +[node name="PlayerCollisionShape3D2" type="CollisionShape3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +shape = SubResource("CapsuleShape3D_tpc7d") + +[node name="NPCMesh" type="MeshInstance3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_g0eml") +skeleton = NodePath("../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_v5iy7") + +[node name="MoveToLocation" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.70084, 0.5, 0.962891) + +[node name="FixedCameraTriggerZone" type="Node" parent="."] + +[node name="FixedCameraLabel" type="Label3D" parent="FixedCameraTriggerZone"] +unique_name_in_owner = true +transform = Transform3D(0.939693, 0.280167, -0.196175, 1.49012e-08, 0.573577, 0.819152, 0.34202, -0.769751, 0.538986, -0.538716, -0.247626, 3.13456) +text = "Fixed Camera +Example" +font = ExtResource("3_an0dt") + +[node name="NorthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.38357, -0.555836, 0.737507, -0.105898, 0.766851, 0.633027, -0.917417, -0.320912, 0.235279, 6.89638, 4.73986, 0.115512) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_tpvee") +camera_3d_resource = SubResource("Resource_bxbnv") + +[node name="NorthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, -0.9) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../NorthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/NorthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, -0.4) +shape = SubResource("BoxShape3D_wcrbb") + +[node name="EntryRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.258818, -0.482963, 0.836515, 1.3027e-15, 0.866025, 0.499999, -0.965924, -0.129409, 0.224143, 6.69741, 4.73364, 4.02374) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_7ih0k") +camera_3d_resource = SubResource("Resource_4iyps") + +[node name="EntryRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.00003, -0.454982, 3.00572) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../EntryRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/EntryRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 0, 0.2) +shape = SubResource("BoxShape3D_ctyr8") + +[node name="SouthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(-0.766043, -0.492403, 0.413175, 0, 0.642787, 0.766043, -0.642786, 0.586825, -0.492403, 6.89741, 4.73364, 5.62374) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_x5y0u") +camera_3d_resource = SubResource("Resource_pgiyx") + +[node name="SouthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, 6.7) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../SouthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/SouthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0.1) +shape = SubResource("BoxShape3D_ua072") + +[node name="CSGMesh3D" type="CSGMesh3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.14238, 1.82571, 2.88655) +mesh = SubResource("BoxMesh_ugc3s") +material = SubResource("StandardMaterial3D_68thd") + +[node name="CSGMesh3D2" type="CSGMesh3D" parent="FixedCameraTriggerZone/CSGMesh3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00192642, -0.0120339, 0.00494432) +operation = 2 +mesh = SubResource("BoxMesh_wphly") +material = SubResource("StandardMaterial3D_68thd") + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Environment" type="Node3D" parent="Environment"] + +[node name="Floor" parent="Environment/Environment" instance=ExtResource("10_cd0kn")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="West Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16, 0.5, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/West Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/West Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="East Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.999, 0.502, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/East Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/East Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="North Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -6.90828) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/North Wall"] +mesh = SubResource("BoxMesh_n70lt") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/North Wall"] +shape = SubResource("BoxShape3D_jxmqm") + +[node name="South Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 0.5, 9.087) +metadata/_edit_group_ = true + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="Environment/Environment/South Wall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) +mesh = SubResource("BoxMesh_x0tgm") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/South Wall"] +shape = SubResource("BoxShape3D_t67ef") + +[node name="FixedCamOuterWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 2) +use_collision = true +mesh = SubResource("BoxMesh_rmslh") + +[node name="FixedCamOuterDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamOuterWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamNorthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamNorthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamNorthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 0) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamSouthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 5.1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamSouthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamSouthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.50541, 1.19209e-07) +operation = 2 +mesh = SubResource("BoxMesh_242ij") diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn new file mode 100644 index 0000000..427c6cc --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn @@ -0,0 +1,155 @@ +[gd_scene load_steps=11 format=3 uid="uid://cx7x48cpi8gcd"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_6uslv"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_5cpe8"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_422w7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_4qurp"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_uw36d"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_fcomr"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_i060b"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_iyghi"] + +[sub_resource type="Resource" id="Resource_wg1pr"] +script = ExtResource("4_4qurp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_iyghi") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.793353, 0.608762, 0, -0.608762, 0.793353, 0.083587, 2.94168, 5.22787) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_6uslv") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +top_level = true +script = ExtResource("2_5cpe8") +follow_mode = 5 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("3_422w7") +tween_on_load = false +camera_3d_resource = SubResource("Resource_wg1pr") +follow_damping = true +follow_distance = 4.0 +dead_zone_width = 0.139 +dead_zone_height = 0.14 +show_viewfinder_in_play = true +spring_length = 4.0 + +[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("5_uw36d")] +script = ExtResource("6_fcomr") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_i060b")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.636134, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.54597, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.64877, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.4732, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.40027, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.13768, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.7976, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.84078, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.88916, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.83837, -0.241718, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.34377, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.9834, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.38147, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn new file mode 100644 index 0000000..302db04 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn @@ -0,0 +1,209 @@ +[gd_scene load_steps=15 format=3 uid="uid://d2lx45noxq685"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_7a3wq"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_158c0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_ganw1"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_kig2n"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_caky3"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_b6ic4"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_kkbaa"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_i1dbs"] + +[sub_resource type="Resource" id="Resource_ucp3e"] +script = ExtResource("3_ganw1") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ab013"] +script = ExtResource("4_kig2n") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_i1dbs") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.638767, 0.7694, 0, -0.7694, 0.638768, 0, 6.39, 7) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_7a3wq") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, 0, 6.39, 7) +top_level = true +script = ExtResource("2_158c0") +priority = 5 +follow_mode = 1 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_ucp3e") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ab013") +follow_damping = true +follow_damping_value = Vector3(0.3, 0.3, 0.3) + +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_caky3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.39, 7) +script = ExtResource("6_b6ic4") +enable_gravity = false + +[node name="PlayerVisual" parent="Player/PlayerCharacterBody3D" index="2"] +visible = false + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.04486, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.51494, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_kkbaa")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.62737, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.9378, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.58617, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.774, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.40488, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.20971, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9771, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.555532, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.0611, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.21187, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.9283, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.49828, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.15267, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.3427, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.08027, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.7748, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.1473, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) + +[editable path="Player/PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn new file mode 100644 index 0000000..01be18f --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=14 format=3 uid="uid://cqy81q5p0tsda"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_3iw7y"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_vcfky"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="3_2idlr"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_65wck"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_b0eay"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_i3ale"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_5hq8j"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_7lab4"] + +[sub_resource type="Resource" id="Resource_1iman"] +script = ExtResource("5_i3ale") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_7lab4") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -7.26116, 5.72974, 12.279) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_3iw7y") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("2_vcfky")] +script = ExtResource("3_2idlr") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_targets")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +top_level = true +script = ExtResource("3_65wck") +priority = 5 +follow_mode = 3 +follow_targets = [NodePath("../PlayerCharacterBody3D2"), NodePath("../../NPCs/PlayerMeshInstance3D"), NodePath("../../NPCs/PlayerMeshInstance3D2")] +tween_resource = ExtResource("4_b0eay") +tween_on_load = false +camera_3d_resource = SubResource("Resource_1iman") +follow_damping = true +follow_distance = 5.0 +auto_follow_distance = true +auto_follow_distance_min = 5.0 +auto_follow_distance_max = 15.0 +auto_follow_distance_divisor = 20.0 +spring_length = 5.0 + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, 0.128472) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 0.249913) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_5hq8j")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn new file mode 100644 index 0000000..fb8d086 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn @@ -0,0 +1,241 @@ +[gd_scene load_steps=25 format=3 uid="uid://oo1y1sjdmr6k"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_p8ccw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_8itog"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_xqpq0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_akuuo"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_0nadx"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_7h7mx"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_mkxip"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/path_follow.gd" id="7_g1m51"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="8_a1h2k"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="9_rk5lh"] + +[sub_resource type="Resource" id="Resource_ofv2c"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_01tho"] +script = ExtResource("6_mkxip") +duration = 1.2 +transition = 3 +ease = 2 + +[sub_resource type="Resource" id="Resource_syh5m"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Curve3D" id="Curve3D_b33df"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_aovgi"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="BoxMesh" id="BoxMesh_0hdeh"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fsm1b"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Resource" id="Resource_xci4c"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Curve3D" id="Curve3D_8uw2x"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctnqu"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_f6dp8"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gwnkj"] +transparency = 1 +albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961) + +[sub_resource type="BoxMesh" id="BoxMesh_7l3dh"] + +[sub_resource type="BoxMesh" id="BoxMesh_as6ok"] + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999996, -0.00216283, 0.00184472, 0, 0.648938, 0.760841, -0.00284268, -0.760838, 0.648936, 0, 2.507, 1.5) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_p8ccw") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +top_level = true +script = ExtResource("2_8itog") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("3_xqpq0") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ofv2c") +follow_offset = Vector3(0, 2, 1.5) +follow_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("5_0nadx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0) +script = ExtResource("6_7h7mx") + +[node name="Paths" type="Node" parent="."] + +[node name="PathPhantomCamera3D" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] +transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, -0.31028, 7.9199, -1.60976) +top_level = true +script = ExtResource("2_8itog") +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D2") +follow_path = NodePath("../FollowPath") +tween_resource = SubResource("Resource_01tho") +camera_3d_resource = SubResource("Resource_syh5m") +follow_damping = true + +[node name="FollowPath" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.31028, 7.9199, -1.60976) +curve = SubResource("Curve3D_b33df") + +[node name="StraightPathFollowTrigger" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, -0.45, -6.73666) +priority = 5 +script = ExtResource("7_g1m51") +path_pcam = NodePath("../PathPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger"] +shape = SubResource("BoxShape3D_aovgi") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger/CollisionShape3D"] +mesh = SubResource("BoxMesh_0hdeh") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_fsm1b") +metadata/_edit_group_ = true + +[node name="PathPhantomCamera3D2" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7.9199, -13.4572) +top_level = true +visible = false +script = ExtResource("2_8itog") +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D2") +follow_path = NodePath("../FollowPath2") +tween_resource = SubResource("Resource_01tho") +camera_3d_resource = SubResource("Resource_xci4c") +follow_damping = true +follow_damping_value = Vector3(0.6, 0.1, 0.1) + +[node name="FollowPath2" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.97141, 7.9199, -13.4572) +curve = SubResource("Curve3D_8uw2x") + +[node name="StraightPathFollowTrigger2" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, 0, -13.7367) +priority = 5 +script = ExtResource("7_g1m51") +path_pcam = NodePath("../PathPhantomCamera3D2") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger2"] +shape = SubResource("BoxShape3D_ctnqu") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger2/CollisionShape3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.45, 0) +mesh = SubResource("BoxMesh_f6dp8") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_gwnkj") +metadata/_edit_group_ = true + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("8_a1h2k")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Floor3" parent="Environment" instance=ExtResource("8_a1h2k")] +transform = Transform3D(6, 0, 0, 0, 1, 0, 0, 0, 1, -0.44204, 0, 1.76334) + +[node name="Floor2" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, -0.516667, 1, -6.5) + +[node name="Floor5" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, 0.65, 1, -6.5) + +[node name="Floor4" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(2, 0, 0, 0, 3, 0, 0, 0, 1, 0.0666667, 1, -18) + +[node name="Floor6" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, -0.766667, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="Floor8" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, -1.01667, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor9" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, 1.15, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor7" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, 0.9, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="NPCDescriptionLabel" type="Label3D" parent="Environment"] +transform = Transform3D(5.21541e-08, -1, -7.7486e-07, -1.10675e-15, 2.23517e-07, 0.999999, -0.999999, -7.45058e-08, -5.68829e-14, -3.47306, 2.59595, -5.51755) +text = "Camera follows player while confined to a Path3D" +font = ExtResource("9_rk5lh") +font_size = 64 + +[node name="MovementInstructionsLabel" type="Label3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.02174, -0.455369, 0.570585) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("9_rk5lh") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn new file mode 100644 index 0000000..49ab893 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn @@ -0,0 +1,162 @@ +[gd_scene load_steps=12 format=3 uid="uid://c7uyfhhnrmkbx"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_gt67h"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_4ltlo"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_hldrt"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_pqibl"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_o4k7v"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_8yuc5"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_m6ich"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_pagh0"] + +[sub_resource type="Resource" id="Resource_28vpp"] +script = ExtResource("3_hldrt") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_axopo"] +script = ExtResource("4_pqibl") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_pagh0") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D2" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -13.2122, 2.5, 10.4016) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_gt67h") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.2122, 2.5, 10.4016) +top_level = true +script = ExtResource("2_4ltlo") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_28vpp") +tween_on_load = false +camera_3d_resource = SubResource("Resource_axopo") +follow_offset = Vector3(0, 2, 2) +follow_damping = true + +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_o4k7v")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.2122, 0.5, 8.40162) +script = ExtResource("6_8yuc5") + +[node name="NPCs" type="Node" parent="."] + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_m6ich")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.8332, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.936, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.6875, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.14955, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.44645, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.1256, 0.335247, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.30382, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn new file mode 100644 index 0000000..1a86f2e --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn @@ -0,0 +1,218 @@ +[gd_scene load_steps=22 format=3 uid="uid://bklrp02eywxsx"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="1_s26cy"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_m2d6w"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="3_l7kg8"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="4_qcyfd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_8von1"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd" id="5_tarnu"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_o1fj6"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_amcmx"] +[ext_resource type="Texture2D" uid="uid://c3mskbmvnpwux" path="res://addons/phantom_camera/examples/textures/3D/target.png" id="8_rjcgw"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_m2d6w") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_i42vj"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_m2d6w") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_fvhx5"] +dof_blur_far_enabled = true +dof_blur_far_distance = 31.1 +dof_blur_near_enabled = true +dof_blur_near_distance = 1.79 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_5mfg2"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_m2d6w") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_unpfd"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CylinderMesh" id="CylinderMesh_sm466"] +top_radius = 1.51 +height = 0.2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hp48l"] +transparency = 1 +albedo_texture = ExtResource("8_rjcgw") +uv1_scale = Vector3(1.91, 1.91, 1.91) +uv1_offset = Vector3(0.025, -0.927, 0) + +[node name="Root" type="Node3D"] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 9.63713) +script = ExtResource("1_s26cy") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +attributes = SubResource("CameraAttributesPractical_i42vj") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0418501, 0.297778, 0, 0.990266, 0.139173, -0.300705, -0.132731, 0.944432, 0.427258, 1.68564, 7.6237) +script = ExtResource("1_s26cy") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +attributes = SubResource("CameraAttributesPractical_fvhx5") +follow_offset = Vector3(0, 0.97, -0.399) +follow_damping_value = Vector3(0, 0, 0) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("4_qcyfd")] +unique_name_in_owner = true +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, 6.60605) +script = ExtResource("5_tarnu") + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25688, 9.63713) +attributes = SubResource("CameraAttributesPractical_5mfg2") + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_8von1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("1_s26cy") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_unpfd") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.260217, 1.60477, -9.07797) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="."] +transform = Transform3D(-1, -8.74228e-08, 3.82137e-15, 0, -4.37114e-08, -1, 8.74228e-08, -1, 4.37114e-08, 0.0525861, 1.60477, 9.98156) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[editable path="PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn new file mode 100644 index 0000000..2df24a9 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn @@ -0,0 +1,185 @@ +[gd_scene load_steps=17 format=3 uid="uid://ceelq6qrb41uf"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_47xf2"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd" id="2_uhq7m"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_whx47"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_lii5s"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_jt2lp"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_oc4q1"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_kg7u1"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="7_kut0u"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_47xf2") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_47xf2") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="BoxMesh" id="BoxMesh_bj3re"] +size = Vector3(1, 7, 7) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_47xf2") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_ioijp"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[node name="Root" type="Node3D"] + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] +unique_name_in_owner = true +script = ExtResource("2_uhq7m") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866023, 0.499997, 0, -0.499999, 0.866021, -0.0194088, 2.25687, 3.01475) +script = ExtResource("2_whx47") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.01438) +script = ExtResource("2_whx47") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +follow_offset = Vector3(0, 0.8, -0.399) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25687, 3.01475) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_oc4q1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall5" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.133, 3, -6.5) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall6" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall7" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("2_whx47") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_ioijp") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_kg7u1") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn new file mode 100644 index 0000000..c85deb1 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn @@ -0,0 +1,197 @@ +[gd_scene load_steps=15 format=3 uid="uid://dsfixtpa5xwqt"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_jbmnd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_t3gk2"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_b2lea"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_mqo2b"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_pxkua"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_3rtu0"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_uuxs3"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_0dyt0"] + +[sub_resource type="Resource" id="Resource_pwcgo"] +script = ExtResource("3_b2lea") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ft2w3"] +script = ExtResource("4_mqo2b") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_0dyt0") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773412, -0.137901, 4.03222, 6.36446) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_jbmnd") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target")] +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) +script = ExtResource("2_t3gk2") +priority = 10 +look_at_mode = 2 +look_at_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = SubResource("Resource_pwcgo") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ft2w3") +look_at_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("5_pxkua")] +script = ExtResource("6_3rtu0") + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.96028, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.59952, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_uuxs3")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.00548, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25.5597, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.96428, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.3959, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.02677, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.8316, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.5989, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.17742, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.4392, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.58998, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.5502, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.1202, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.53078, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9646, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.70216, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.1529, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.7692, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn new file mode 100644 index 0000000..1c7a8b7 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn @@ -0,0 +1,192 @@ +[gd_scene load_steps=21 format=3 uid="uid://d0fyuvesb472p"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_25rmy"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd" id="2_7nd2u"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd" id="3_t4fhv"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="4_tnm2f"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="5_4webr"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="6_dmm4a"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd" id="7_2vtho"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="8_bw5oq"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="9_jpkpr"] +[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="10_8pr3k"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_vp57v"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_yvgu3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vc6km"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_lsrh7"] +radius = 0.269454 + +[sub_resource type="Resource" id="Resource_lhgur"] +script = ExtResource("5_4webr") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ghjuj"] +script = ExtResource("6_dmm4a") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_2l4w0"] +script = ExtResource("3_t4fhv") +amplitude = 40.0 +frequency = 0.2 +randomize_noise_seed = 0 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.1 +positional_multiplier_y = 0.1 +positional_multiplier_z = 0.1 + +[sub_resource type="Resource" id="Resource_6tnhy"] +script = ExtResource("3_t4fhv") +amplitude = 10.0 +frequency = 20.0 +randomize_noise_seed = 0 +noise_seed = 928 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.1 +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +positional_multiplier_z = 1.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qi01t"] +albedo_texture = ExtResource("9_jpkpr") +uv1_triplanar = true +uv1_world_triplanar = true + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ey47a"] +bg_color = Color(0.0784314, 0.109804, 0.129412, 1) +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_radius_bottom_right = 20 +expand_margin_bottom = 6.0 + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-0.0642313, 0.122871, 0.990342, 0, 0.992391, -0.123126, -0.997935, -0.00790852, -0.0637426, -16.46, 0.503767, 4.249) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_25rmy") + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -16.46, 0.503767, 4.249) +script = ExtResource("2_7nd2u") + +[node name="PlayerVisual" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +unique_name_in_owner = true +mesh = SubResource("CapsuleMesh_yvgu3") +surface_material_override/0 = SubResource("StandardMaterial3D_vc6km") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.00441533, 0, 0.999915, 0, 0.999995, 0, -0.999923, 0, 0.00441529, -16.46, 0.503767, 4.249) +top_level = true +script = ExtResource("4_tnm2f") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_lhgur") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ghjuj") +noise = SubResource("Resource_2l4w0") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37085e-08, 0, 0.999925, 0, 0.999995, 0, -0.999933, 0, -4.37081e-08, -16.46, 0.503767, 4.249) +script = ExtResource("7_2vtho") +noise = SubResource("Resource_6tnhy") +duration = 0.1 +decay_time = 0.1 + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("8_bw5oq")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 2.5) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 8.83707, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -38.9392, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 6) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="EmitterTip" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +anchors_preset = -1 +anchor_right = 0.3 +anchor_bottom = 0.1 +theme_override_styles/panel = SubResource("StyleBoxFlat_ey47a") + +[node name="Guidance" type="RichTextLabel" parent="EmitterTip"] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 8 +theme_override_fonts/normal_font = ExtResource("10_8pr3k") +theme_override_fonts/bold_font = ExtResource("11_vp57v") +theme_override_font_sizes/normal_font_size = 18 +theme_override_font_sizes/bold_font_size = 24 +bbcode_enabled = true +text = "[center]Press [b]Q[/b] to trigger Noise Emitter" +fit_content = true diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn new file mode 100644 index 0000000..76ee9a4 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn @@ -0,0 +1,286 @@ +[gd_scene load_steps=23 format=3 uid="uid://cvnbgtbaxwj5p"] + +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="1_d55xf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="2_d1opf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_4whss"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_8ap1e"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_1sgnu"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="6_lr46m"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="7_istoq"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="7_x1jex"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="8_qepee"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="9_ptb3h"] + +[sub_resource type="Resource" id="Resource_0dtvs"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_xg4en"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2dct5"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Resource" id="Resource_v8ndi"] +script = ExtResource("8_qepee") +duration = 0.6 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_kmep1"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_uxg44"] +script = ExtResource("8_qepee") +duration = 0.3 +transition = 1 +ease = 2 + +[sub_resource type="Resource" id="Resource_eu3bc"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_0nci0"] +script = ExtResource("8_qepee") +duration = 0.3 +transition = 8 +ease = 2 + +[sub_resource type="Resource" id="Resource_u0lff"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_50m5g"] +script = ExtResource("8_qepee") +duration = 1.2 +transition = 10 +ease = 2 + +[sub_resource type="Resource" id="Resource_rexf8"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[node name="Root" type="Node3D"] + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Floor" parent="Environment" instance=ExtResource("1_d55xf")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0.083587, 2.507, 4.05493) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("2_d1opf") + +[node name="------------------" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +top_level = true +script = ExtResource("3_4whss") +priority = 3 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("4_8ap1e") +tween_on_load = false +camera_3d_resource = SubResource("Resource_0dtvs") +follow_offset = Vector3(0, 2, 2) +follow_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("6_lr46m")] +script = ExtResource("7_x1jex") + +[node name="-------------------" type="Node" parent="."] + +[node name="Tweening Example" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.97) + +[node name="Linear" type="Node3D" parent="Tweening Example"] + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Linear" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_v8ndi") +camera_3d_resource = SubResource("Resource_kmep1") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Linear + +Duration: +0.6s" +font = ExtResource("9_ptb3h") +font_size = 48 + +[node name="Sine" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.4) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Sine" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_uxg44") +camera_3d_resource = SubResource("Resource_eu3bc") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Sine + +Duration: +0.3s" +font = ExtResource("9_ptb3h") +font_size = 72 + +[node name="Circ" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -14.1) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Circ" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_0nci0") +camera_3d_resource = SubResource("Resource_u0lff") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Circ + +Duration: +0.3s" +font = ExtResource("9_ptb3h") +font_size = 72 + +[node name="Back" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -21) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Back" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Back/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Back/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, -0.8, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_50m5g") +camera_3d_resource = SubResource("Resource_rexf8") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Back + +Duration: +1.2s" +font = ExtResource("9_ptb3h") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn new file mode 100644 index 0000000..03bfcae --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=5 format=3 uid="uid://cb83in8f0tbb1"] + +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="1_tm04f"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_8efyg"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2cfaw"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r3ldp"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.083587, 0.507, 2.05493) +script = ExtResource("1_tm04f") +metadata/_edit_group_ = true + +[node name="PlayerArea3D" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"] +shape = SubResource("CapsuleShape3D_8efyg") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_8efyg") + +[node name="PlayerVisual" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="PlayerModel" type="MeshInstance3D" parent="PlayerVisual"] +mesh = SubResource("CapsuleMesh_2cfaw") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_r3ldp") diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn new file mode 100644 index 0000000..17bb808 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=6 format=3 uid="uid://bhd1kwv2fwj1y"] + +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd" id="1_5s24o"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s61dn"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_47f0o"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mv4do"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="PrismMesh" id="PrismMesh_wg1x3"] +size = Vector3(0.5, 0.5, 0.3) + +[node name="PlayerCharacterBody3D" type="CharacterBody3D"] +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, -0.0163251) +collision_layer = 2 +script = ExtResource("1_5s24o") +metadata/_edit_group_ = true + +[node name="PlayerArea3D" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerVisual" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerVisual"] +transform = Transform3D(1, 0, 0, 0, 1, 4.65661e-10, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_47f0o") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") + +[node name="PlayerDirection" type="MeshInstance3D" parent="PlayerVisual"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, -9.31323e-10, 1, 4.65661e-10, 2.98023e-08, 0, 1, -0.0156226, 1.08631, 0) +mesh = SubResource("PrismMesh_wg1x3") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn index 553ddeb..19c1c13 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn @@ -16,14 +16,24 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_o161n"] script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxMesh" id="BoxMesh_7tjw4"] size = Vector3(2, 0.5, 4) @@ -53,7 +63,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"] size = Vector3(6.8, 0.1, 5.4) @@ -69,7 +84,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"] size = Vector3(7.4, 0.1, 3.6) @@ -85,7 +105,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_ua072"] size = Vector3(6.8, 0.1, 3.6) @@ -130,9 +155,11 @@ size = Vector3(8, 6, 0.5) [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +transform = Transform3D(1, 0, 0, 0, 0.948876, 0.315649, 0, -0.315649, 0.948876, -2.53871, 2, 9.76232) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_wn7ww") [node name="PlayerGroup" type="Node" parent="."] @@ -151,6 +178,7 @@ font_size = 48 [node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +top_level = true script = ExtResource("2_y3dy8") priority = 10 follow_mode = 2 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn index b17abcf..a14363a 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn @@ -13,7 +13,12 @@ script = ExtResource("4_oqbub") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] albedo_texture = ExtResource("5_c0upu") @@ -24,9 +29,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +transform = Transform3D(1, 0, 0, 0, 0.793353, 0.608762, 0, -0.608762, 0.793353, 0.083587, 2.94168, 5.22787) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_7824u") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -38,6 +45,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +top_level = true script = ExtResource("2_g1bv4") follow_mode = 5 follow_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual") @@ -46,8 +54,8 @@ tween_on_load = false camera_3d_resource = SubResource("Resource_wg1pr") follow_damping = true follow_distance = 4.0 -dead_zone_width = 0.384 -dead_zone_height = 0.669 +dead_zone_width = 0.161 +dead_zone_height = 0.386 show_viewfinder_in_play = true spring_length = 4.0 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn index 0d7b543..10acd87 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn @@ -19,7 +19,12 @@ script = ExtResource("4_evdoo") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -38,9 +43,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7) +transform = Transform3D(1, 0, 0, 0, 0.638767, 0.7694, 0, -0.7694, 0.638768, 0, 6.39, 7) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_pmeux") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -51,7 +58,8 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7) +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, 0, 6.39, 7) +top_level = true script = ExtResource("2_q1ygp") priority = 5 follow_mode = 1 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn index 9ef95a5..2c927d4 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn @@ -13,7 +13,12 @@ script = ExtResource("5_70gws") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -32,9 +37,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -7.26116, 5.72974, 12.279) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("3_wr1tj") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -48,6 +55,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_targets")] unique_name_in_owner = true transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +top_level = true script = ExtResource("2_pi7mp") priority = 5 follow_mode = 3 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn index 4228afd..9de651d 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn @@ -15,7 +15,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_01tho"] script = ExtResource("4_lfwkm") @@ -28,7 +33,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Curve3D" id="Curve3D_b33df"] _data = { @@ -52,7 +62,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Curve3D" id="Curve3D_8uw2x"] _data = { @@ -79,9 +94,11 @@ albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961) [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +transform = Transform3D(0.999996, -0.00216283, 0.00184472, 0, 0.648938, 0.760841, -0.00284268, -0.760838, 0.648936, 0, 2.507, 1.5) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_lm5n8") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -91,6 +108,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +top_level = true script = ExtResource("3_bd7x3") priority = 10 follow_mode = 2 @@ -108,6 +126,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0) [node name="PathPhantomCamera3D" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, -0.31028, 7.9199, -1.60976) +top_level = true script = ExtResource("3_bd7x3") priority = 2 follow_mode = 4 @@ -139,6 +158,7 @@ metadata/_edit_group_ = true [node name="PathPhantomCamera3D2" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7.9199, -13.4572) +top_level = true visible = false script = ExtResource("3_bd7x3") priority = 2 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn index f81396f..59247c9 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn @@ -1,12 +1,12 @@ -[gd_scene load_steps=14 format=3 uid="uid://buglvjwpn85ny"] +[gd_scene load_steps=11 format=3 uid="uid://buglvjwpn85ny"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_3tok8"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_grjck"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_j3f4l"] -[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_uymu2"] [ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_4u2y6"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_sielv"] [ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_1tybo"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_7ywxt"] [sub_resource type="Resource" id="Resource_28vpp"] script = ExtResource("3_j3f4l") @@ -19,14 +19,12 @@ script = ExtResource("4_sielv") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 - -[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] -albedo_color = Color(0.988235, 0.498039, 0.498039, 1) - -[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] albedo_texture = ExtResource("5_1tybo") @@ -37,9 +35,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -13.2122, 2.5, 10.4016) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_3tok8") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -50,35 +50,21 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.2122, 2.5, 10.4016) +top_level = true script = ExtResource("2_grjck") priority = 10 follow_mode = 2 -follow_target = NodePath("../PlayerCharacterBody3D2") +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_28vpp") tween_on_load = false camera_3d_resource = SubResource("Resource_axopo") follow_offset = Vector3(0, 2, 2) follow_damping = true -[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] -unique_name_in_owner = true -transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -13.1946, 0.344147, 8.40857) -script = ExtResource("3_uymu2") -metadata/_edit_group_ = true - -[node name="PlayerModel" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_7ywxt")] unique_name_in_owner = true -mesh = SubResource("CapsuleMesh_pda7a") -surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") - -[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] - -[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] -shape = SubResource("CapsuleShape3D_3xplc") - -[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] -shape = SubResource("CapsuleShape3D_3xplc") +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.2122, 0.5, 8.40162) [node name="NPCs" type="Node" parent="."] @@ -172,3 +158,5 @@ size = Vector3(4.03502, 1.27695, 5.2198) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617) use_collision = true size = Vector3(4.57784, 1.08809, 3.11285) + +[editable path="Player/PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn new file mode 100644 index 0000000..019328f --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=21 format=3 uid="uid://5pjtxclcnx4f"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="1_s26cy"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_m2d6w"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="3_l7kg8"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="4_qcyfd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_8von1"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_o1fj6"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_amcmx"] +[ext_resource type="Texture2D" uid="uid://c3mskbmvnpwux" path="res://addons/phantom_camera/examples/textures/3D/target.png" id="8_rjcgw"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_m2d6w") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_i42vj"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_m2d6w") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_fvhx5"] +dof_blur_far_enabled = true +dof_blur_far_distance = 31.1 +dof_blur_near_enabled = true +dof_blur_near_distance = 1.79 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_724n8"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_m2d6w") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_unpfd"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CylinderMesh" id="CylinderMesh_sm466"] +top_radius = 1.51 +height = 0.2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hp48l"] +transparency = 1 +albedo_texture = ExtResource("8_rjcgw") +uv1_scale = Vector3(1.91, 1.91, 1.91) +uv1_offset = Vector3(0.025, -0.927, 0) + +[node name="Root" type="Node3D"] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 9.63713) +script = ExtResource("1_s26cy") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +attributes = SubResource("CameraAttributesPractical_i42vj") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0418501, 0.297778, 0, 0.990266, 0.139173, -0.300705, -0.132731, 0.944432, 0.427258, 1.68564, 7.6237) +script = ExtResource("1_s26cy") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +attributes = SubResource("CameraAttributesPractical_fvhx5") +follow_offset = Vector3(0, 0.97, -0.399) +follow_damping_value = Vector3(0, 0, 0) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("4_qcyfd")] +unique_name_in_owner = true +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, 6.60605) + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25688, 9.63713) +attributes = SubResource("CameraAttributesPractical_724n8") + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_8von1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("1_s26cy") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_unpfd") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.260217, 1.60477, -9.07797) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="."] +transform = Transform3D(-1, -8.74228e-08, 3.82137e-15, 0, -4.37114e-08, -1, 8.74228e-08, -1, 4.37114e-08, 0.0525861, 1.60477, 9.98156) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[editable path="PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn index 5c1f34c..d7fae5e 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn @@ -11,7 +11,7 @@ [sub_resource type="Resource" id="Resource_8fhct"] script = ExtResource("2_47xf2") duration = 0.3 -transition = 3 +transition = 2 ease = 1 [sub_resource type="Resource" id="Resource_7m0fv"] @@ -19,7 +19,12 @@ script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_e7t18"] script = ExtResource("2_47xf2") @@ -32,7 +37,12 @@ script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 1.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxMesh" id="BoxMesh_wsigl"] size = Vector3(1, 10, 20) @@ -46,24 +56,32 @@ duration = 0.6 transition = 3 ease = 1 -[sub_resource type="Resource" id="Resource_y5dqe"] +[sub_resource type="Resource" id="Resource_ioijp"] script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [node name="Root" type="Node3D"] +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] +unique_name_in_owner = true + [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) +transform = Transform3D(1, 0, 0, 0, 0.866023, 0.499997, 0, -0.499999, 0.866021, -0.0194088, 2.25687, 3.01475) script = ExtResource("2_whx47") priority = 10 follow_mode = 6 follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_8fhct") -tween_on_load = null +tween_on_load = false camera_3d_resource = SubResource("Resource_7m0fv") follow_damping = true follow_distance = 3.5 @@ -71,27 +89,24 @@ spring_length = 3.5 [node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.41338) +transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.01438) script = ExtResource("2_whx47") follow_mode = 6 follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_e7t18") -tween_on_load = null +tween_on_load = false camera_3d_resource = SubResource("Resource_jogxh") -follow_offset = Vector3(0, 0.8, 0) -follow_damping = true +follow_offset = Vector3(0, 0.8, -0.399) follow_distance = 1.5 spring_length = 1.5 -[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] -unique_name_in_owner = true - [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) -current = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25687, 3.01475) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("5_oc4q1") [node name="Environment" type="Node" parent="."] @@ -144,8 +159,7 @@ unique_name_in_owner = true transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) script = ExtResource("2_whx47") tween_resource = SubResource("Resource_afrr1") -tween_on_load = null -camera_3d_resource = SubResource("Resource_y5dqe") +camera_3d_resource = SubResource("Resource_ioijp") [node name="MovementInstructionsLabel" type="Label3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn index d6fa268..cc5c045 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn @@ -19,7 +19,12 @@ script = ExtResource("4_m3qpq") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -34,32 +39,31 @@ albedo_texture = ExtResource("5_u5qhp") uv1_triplanar = true uv1_world_triplanar = true -[node name="Node3D" type="Node3D"] +[node name="Root" type="Node3D"] [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773412, -0.137901, 4.03222, 6.36446) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] -process_priority = 100 +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_lldvu") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) metadata/_edit_lock_ = true -[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target", "look_at_targets")] +[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target")] transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) script = ExtResource("2_8md3q") priority = 10 look_at_mode = 2 look_at_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual") -look_at_targets = [null, NodePath("../NPCs/PlayerMeshInstance3D")] tween_resource = SubResource("Resource_pwcgo") tween_on_load = false camera_3d_resource = SubResource("Resource_ft2w3") look_at_damping = true -look_at_damping_value = 0.1 [node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("1_i2pjc")] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn new file mode 100644 index 0000000..8a76989 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn @@ -0,0 +1,209 @@ +[gd_scene load_steps=22 format=3 uid="uid://p7s5t3tthmo"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_ggfbg"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_dreow"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_f8fcw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_mjtut"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd" id="4_poyyk"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="5_d6uqs"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd" id="6_fbad7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd" id="6_n8u0x"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="6_vpla5"] +[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="10_0thai"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_i8r8q"] + +[sub_resource type="Resource" id="Resource_t3bgw"] +script = ExtResource("4_poyyk") +amplitude = 30.0 +frequency = 2.0 +randomize_noise_seed = 1 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 0.1 +rotational_multiplier_y = 0.1 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.0 +positional_multiplier_y = 0.0 +positional_multiplier_z = 0.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_yvgu3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vc6km"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_lsrh7"] +radius = 0.269454 + +[sub_resource type="Resource" id="Resource_lhgur"] +script = ExtResource("3_f8fcw") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ghjuj"] +script = ExtResource("4_mjtut") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_2l4w0"] +script = ExtResource("4_poyyk") +amplitude = 40.0 +frequency = 0.2 +randomize_noise_seed = 0 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.1 +positional_multiplier_y = 0.1 +positional_multiplier_z = 0.1 + +[sub_resource type="Resource" id="Resource_6tnhy"] +script = ExtResource("4_poyyk") +amplitude = 10.0 +frequency = 4.2 +randomize_noise_seed = 0 +noise_seed = 928 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.1 +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +positional_multiplier_z = 1.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qi01t"] +albedo_texture = ExtResource("6_vpla5") +uv1_triplanar = true +uv1_world_triplanar = true + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ey47a"] +bg_color = Color(0.0784314, 0.109804, 0.129412, 1) +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_radius_bottom_right = 20 +expand_margin_bottom = 6.0 + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-0.0348243, 0.0245683, 0.999091, 0, 0.999698, -0.0245832, -0.999393, -0.000856094, -0.0348138, -16.46, 0.503767, 4.249) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_ggfbg") + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -16.46, 0.503767, 4.249) +script = ExtResource("6_fbad7") +run_noise = SubResource("Resource_t3bgw") + +[node name="PlayerVisual" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +unique_name_in_owner = true +visible = false +mesh = SubResource("CapsuleMesh_yvgu3") +surface_material_override/0 = SubResource("StandardMaterial3D_vc6km") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.00441533, 0, 0.999915, 0, 0.999995, 0, -0.999923, 0, 0.00441529, -16.46, 0.503767, 4.249) +top_level = true +script = ExtResource("2_dreow") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_lhgur") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ghjuj") +noise = SubResource("Resource_2l4w0") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37085e-08, 0, 0.999925, 0, 0.999995, 0, -0.999933, 0, -4.37081e-08, -16.46, 0.503767, 4.249) +script = ExtResource("6_n8u0x") +noise = SubResource("Resource_6tnhy") +duration = 0.1 +decay_time = 0.1 + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("5_d6uqs")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 2.5) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 8.83707, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -38.9392, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 6) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="EmitterTip" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +anchors_preset = -1 +anchor_right = 0.3 +anchor_bottom = 0.1 +theme_override_styles/panel = SubResource("StyleBoxFlat_ey47a") + +[node name="Guidance" type="RichTextLabel" parent="EmitterTip"] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 8 +theme_override_fonts/normal_font = ExtResource("10_0thai") +theme_override_fonts/bold_font = ExtResource("11_i8r8q") +theme_override_font_sizes/normal_font_size = 18 +theme_override_font_sizes/bold_font_size = 24 +bbcode_enabled = true +text = "[center]Press [b]Q[/b] to trigger Noise Emitter" +fit_content = true diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn index eeba110..44ac8b8 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn @@ -15,7 +15,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"] size = Vector3(5, 0.1, 4) @@ -38,7 +43,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_uxg44"] script = ExtResource("6_wup4d") @@ -51,7 +61,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_0nci0"] script = ExtResource("6_wup4d") @@ -64,7 +79,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_50m5g"] script = ExtResource("6_wup4d") @@ -77,7 +97,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [node name="Root" type="Node3D"] @@ -93,9 +118,11 @@ metadata/_edit_lock_ = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0.083587, 2.507, 4.05493) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("2_b2yrt") [node name="------------------" type="Node" parent="."] @@ -103,6 +130,7 @@ script = ExtResource("2_b2yrt") [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +top_level = true script = ExtResource("3_m2w30") priority = 3 follow_mode = 2 diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid new file mode 100644 index 0000000..df09cbd --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid @@ -0,0 +1 @@ +uid://d4insihf88cqw diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid new file mode 100644 index 0000000..f853dae --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid @@ -0,0 +1 @@ +uid://cupi3if7b3l2e diff --git a/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid new file mode 100644 index 0000000..6f6b213 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid @@ -0,0 +1 @@ +uid://b3oiv82uroykv diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd index c7fd488..8003bb3 100644 --- a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd @@ -47,8 +47,8 @@ var InputMovementDic: Dictionary = { func _ready() -> void: - _player_area2d.connect("body_shape_entered", _show_prompt) - _player_area2d.connect("body_shape_exited", _hide_prompt) + _player_area2d.body_shape_entered.connect(_show_prompt) + _player_area2d.body_shape_exited.connect(_hide_prompt) _ui_sign = owner.get_node("%UISign") @@ -187,4 +187,3 @@ func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap _interactive_UI = null _interactive_object = InteractiveType.NONE _active_pcam = null - diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid new file mode 100644 index 0000000..798760d --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid @@ -0,0 +1 @@ +uid://7mcexsmtdhmj diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd index 590b5ae..41ab5e2 100644 --- a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd @@ -6,6 +6,7 @@ extends CharacterBody2D @onready var _interaction_prompt: Panel = %InteractionPrompt @onready var _ui_sign: Control @onready var _dark_overlay: ColorRect = %DarkOverlay +@onready var _noise_emitter: PhantomCameraNoiseEmitter2D const KEY_STRINGNAME: StringName = "Key" const ACTION_STRINGNAME: StringName = "Action" @@ -44,8 +45,8 @@ var InputMovementDic: Dictionary = { func _ready() -> void: - _player_area2d.connect("body_shape_entered", _show_prompt) - _player_area2d.connect("body_shape_exited", _hide_prompt) + _player_area2d.body_shape_entered.connect(_show_prompt) + _player_area2d.body_shape_exited.connect(_hide_prompt) _ui_sign = owner.get_node("%UISign") @@ -88,6 +89,10 @@ func _unhandled_input(event: InputEvent) -> void: _hide_interactive_node(_interactive_UI) _interactive_node_logic() + if Input.is_physical_key_pressed(KEY_Q): + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter2D"): + %PlayerPhantomCameraNoiseEmitter2D.emit() + func _show_interactive_node(UI: Control) -> void: UI.modulate.a = 0 @@ -137,11 +142,10 @@ func _physics_process(delta: float) -> void: func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: - if body is TileMap: - var tile_map: TileMap = body - + if body.is_class("TileMapLayer"): # TODO - Using string reference to support Godot 4.2 + var tile_map := body var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) - var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + var cell_data: TileData = tile_map.get_cell_tile_data(tile_coords) if cell_data: var cell_data_type: StringName = cell_data.get_custom_data("Type") @@ -161,11 +165,11 @@ func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: - if body is TileMap: - var tile_map: TileMap = body + if body.is_class("TileMapLayer"): # TODO - Using string reference to support Godot 4.2 + var tile_map := body var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) - var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + var cell_data: TileData = tile_map.get_cell_tile_data(tile_coords) if cell_data: _interaction_prompt.set_visible(false) @@ -173,4 +177,3 @@ func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap _interactive_UI = null _interactive_object = InteractiveType.NONE _active_pcam = null - diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid new file mode 100644 index 0000000..717c71a --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid @@ -0,0 +1 @@ +uid://c0hw1qepj2ii0 diff --git a/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid b/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid new file mode 100644 index 0000000..81d37c7 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid @@ -0,0 +1 @@ +uid://dre5kicdywurd diff --git a/addons/phantom_camera/examples/scripts/3D/npc.gd.uid b/addons/phantom_camera/examples/scripts/3D/npc.gd.uid new file mode 100644 index 0000000..4b27b2b --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/npc.gd.uid @@ -0,0 +1 @@ +uid://70uuot7hvdop diff --git a/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid b/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid new file mode 100644 index 0000000..9b40b8e --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid @@ -0,0 +1 @@ +uid://c17en7rr4yjwf diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid new file mode 100644 index 0000000..85e5d54 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid @@ -0,0 +1 @@ +uid://cqpmld6a0i40c diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd new file mode 100644 index 0000000..b1e6c61 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd @@ -0,0 +1,84 @@ +extends CharacterBody3D + +@export var SPEED: float = 5.0 +@export var JUMP_VELOCITY: float = 4.5 +@export var enable_gravity = true + +@onready var _camera: Camera3D + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity: float = 9.8 + +var movement_enabled: bool = true + +const KEY_STRINGNAME: StringName = "Key" +const ACTION_STRINGNAME: StringName = "Action" + +const INPUT_MOVE_UP_STRINGNAME: StringName = "move_up" +const INPUT_MOVE_DOWM_STRINGNAME: StringName = "move_down" +const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left" +const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right" + +var InputMovementDic: Dictionary = { + INPUT_MOVE_UP_STRINGNAME: { + KEY_STRINGNAME: KEY_W, + ACTION_STRINGNAME: INPUT_MOVE_UP_STRINGNAME + }, + INPUT_MOVE_DOWM_STRINGNAME: { + KEY_STRINGNAME: KEY_S, + ACTION_STRINGNAME: INPUT_MOVE_DOWM_STRINGNAME + }, + INPUT_MOVE_LEFT_STRINGNAME: { + KEY_STRINGNAME: KEY_A, + ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME + }, + INPUT_MOVE_RIGHT_STRINGNAME: { + KEY_STRINGNAME: KEY_D, + ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME + }, +} + + +func _ready() -> void: + for input in InputMovementDic: + var key_val = InputMovementDic[input].get(KEY_STRINGNAME) + var action_val = InputMovementDic[input].get(ACTION_STRINGNAME) + + _camera = owner.get_node("%MainCamera3D") + + var movement_input = InputEventKey.new() + movement_input.physical_keycode = key_val + InputMap.add_action(action_val) + InputMap.action_add_event(action_val, movement_input) + + +func _physics_process(delta: float) -> void: + # Add the gravity. + if enable_gravity and not is_on_floor(): + velocity.y -= gravity * delta + + if not movement_enabled: return + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir: Vector2 = Input.get_vector( + INPUT_MOVE_LEFT_STRINGNAME, + INPUT_MOVE_RIGHT_STRINGNAME, + INPUT_MOVE_UP_STRINGNAME, + INPUT_MOVE_DOWM_STRINGNAME + ) + + var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + var move_dir: Vector3 = Vector3.ZERO + move_dir.x = direction.x + move_dir.z = direction.z + + move_dir = move_dir.rotated(Vector3.UP, _camera.rotation.y).normalized() + velocity.x = move_dir.x * SPEED + velocity.z = move_dir.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + move_and_slide() \ No newline at end of file diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid new file mode 100644 index 0000000..489a883 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid @@ -0,0 +1 @@ +uid://dwhk1i10b32ei diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd new file mode 100644 index 0000000..7e2da3f --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd @@ -0,0 +1,54 @@ +extends "player_controller.gd" + +@onready var _player_pcam: PhantomCamera3D = %PlayerPhantomCamera3D + +@onready var _player_character: CharacterBody3D = %PlayerCharacterBody3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + +@export var run_noise: PhantomCameraNoise3D + +func _ready() -> void: + super() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + %EmitterTip.visible = true + + +func _physics_process(delta: float) -> void: + super(delta) + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + if event.keycode == KEY_Q and event.is_pressed(): + %PlayerPhantomCameraNoiseEmitter3D.emit() + + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = _player_pcam.rotation_degrees + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + _player_pcam.rotation_degrees = pcam_rotation_degrees diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid new file mode 100644 index 0000000..c0f8bee --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid @@ -0,0 +1 @@ +uid://1xkmomho8uqo diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd new file mode 100644 index 0000000..33e4601 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd @@ -0,0 +1,54 @@ +extends "player_controller_4.4.gd" + +@onready var _player_pcam: PhantomCamera3D = %PlayerPhantomCamera3D + +@onready var _player_character: CharacterBody3D = %PlayerCharacterBody3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + +@export var run_noise: PhantomCameraNoise3D + +func _ready() -> void: + super() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + %EmitterTip.visible = true + + +func _physics_process(delta: float) -> void: + super(delta) + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + if event.keycode == KEY_Q and event.is_pressed(): + %PlayerPhantomCameraNoiseEmitter3D.emit() + + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = _player_pcam.rotation_degrees + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + _player_pcam.rotation_degrees = pcam_rotation_degrees diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid new file mode 100644 index 0000000..a3ac4a1 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid @@ -0,0 +1 @@ +uid://6epjre2axgsh diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd index 9bd3a76..f5d5579 100644 --- a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd @@ -17,11 +17,11 @@ extends "player_controller.gd" func _ready() -> void: super() - + _player_pcam = owner.get_node("%PlayerPhantomCamera3D") _aim_pcam = owner.get_node("%PlayerAimPhantomCamera3D") _ceiling_pcam = owner.get_node("%CeilingPhantomCamera3D") - + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) @@ -38,13 +38,12 @@ func _unhandled_input(event: InputEvent) -> void: if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: var active_pcam: PhantomCamera3D - if is_instance_valid(_aim_pcam): - _set_pcam_rotation(_player_pcam, event) - _set_pcam_rotation(_aim_pcam, event) - if _player_pcam.get_priority() > _aim_pcam.get_priority(): - _toggle_aim_pcam(event) - else: - _toggle_aim_pcam(event) + _set_pcam_rotation(_player_pcam, event) + _set_pcam_rotation(_aim_pcam, event) + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _toggle_aim_pcam(event) + else: + _toggle_aim_pcam(event) if event is InputEventKey and event.pressed: if event.keycode == KEY_SPACE: diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid new file mode 100644 index 0000000..4377e00 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid @@ -0,0 +1 @@ +uid://tru1srjkculj diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd new file mode 100644 index 0000000..7c81185 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd @@ -0,0 +1,85 @@ +extends "player_controller_4.4.gd" + +@onready var _player_pcam: PhantomCamera3D +@onready var _aim_pcam: PhantomCamera3D +@onready var _player_direction: Node3D = %PlayerDirection +@onready var _ceiling_pcam: PhantomCamera3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + + +func _ready() -> void: + super() + + _player_pcam = owner.get_node("%PlayerPhantomCamera3D") + _aim_pcam = owner.get_node("%PlayerAimPhantomCamera3D") + _ceiling_pcam = owner.get_node("%CeilingPhantomCamera3D") + + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + +func _physics_process(delta: float) -> void: + super(delta) + + if velocity.length() > 0.2: + var look_direction: Vector2 = Vector2(velocity.z, velocity.x) + _player_direction.rotation.y = look_direction.angle() + + +func _unhandled_input(event: InputEvent) -> void: + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: + var active_pcam: PhantomCamera3D + + _set_pcam_rotation(_player_pcam, event) + _set_pcam_rotation(_aim_pcam, event) + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _toggle_aim_pcam(event) + else: + _toggle_aim_pcam(event) + + if event is InputEventKey and event.pressed: + if event.keycode == KEY_SPACE: + if _ceiling_pcam.get_priority() < 30 and _player_pcam.is_active(): + _ceiling_pcam.set_priority(30) + else: + _ceiling_pcam.set_priority(1) + + +func _set_pcam_rotation(pcam: PhantomCamera3D, event: InputEvent) -> void: + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = pcam.get_third_person_rotation_degrees() + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + pcam.set_third_person_rotation_degrees(pcam_rotation_degrees) + + +func _toggle_aim_pcam(event: InputEvent) -> void: + if event is InputEventMouseButton \ + and event.is_pressed() \ + and event.button_index == 2 \ + and (_player_pcam.is_active() or _aim_pcam.is_active()): + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _aim_pcam.set_priority(30) + else: + _aim_pcam.set_priority(0) diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid new file mode 100644 index 0000000..0293f12 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid @@ -0,0 +1 @@ +uid://b6luh4c44tv75 diff --git a/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import b/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import index 41dc9dc..84c750b 100644 --- a/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import +++ b/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ci76plsequlrq" +uid="uid://cscjjt55iw2cu" path="res://.godot/imported/player_sprite.svg-8862ecb19e12152eb892607676f3831f.ctex" metadata={ "vram_texture": false diff --git a/addons/phantom_camera/examples/textures/3D/target.png b/addons/phantom_camera/examples/textures/3D/target.png new file mode 100644 index 0000000..96fed65 Binary files /dev/null and b/addons/phantom_camera/examples/textures/3D/target.png differ diff --git a/addons/phantom_camera/examples/textures/3D/target.png.import b/addons/phantom_camera/examples/textures/3D/target.png.import new file mode 100644 index 0000000..6de0861 --- /dev/null +++ b/addons/phantom_camera/examples/textures/3D/target.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3mskbmvnpwux" +path.s3tc="res://.godot/imported/target.png-878c5e8d057c8a9a4c2322d4ab88e9ef.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/3D/target.png" +dest_files=["res://.godot/imported/target.png-878c5e8d057c8a9a4c2322d4ab88e9ef.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf.import b/addons/phantom_camera/fonts/Nunito-Black.ttf.import index ac96a49..8e68c5f 100644 --- a/addons/phantom_camera/fonts/Nunito-Black.ttf.import +++ b/addons/phantom_camera/fonts/Nunito-Black.ttf.import @@ -23,6 +23,7 @@ allow_system_fallback=true force_autohinter=false hinting=1 subpixel_positioning=1 +keep_rounding_remainders=true oversampling=0.0 Fallbacks=null fallbacks=[] diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import index 393153f..11c0c62 100644 --- a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import +++ b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import @@ -23,6 +23,7 @@ allow_system_fallback=true force_autohinter=false hinting=1 subpixel_positioning=1 +keep_rounding_remainders=true oversampling=0.0 Fallbacks=null fallbacks=[] diff --git a/addons/phantom_camera/gizmos/custom_gizmo.gd b/addons/phantom_camera/gizmos/custom_gizmo.gd index f094f7b..08d7275 100644 --- a/addons/phantom_camera/gizmos/custom_gizmo.gd +++ b/addons/phantom_camera/gizmos/custom_gizmo.gd @@ -39,7 +39,7 @@ func _init() -> void: func _draw_frustum() -> PackedVector3Array: var lines = PackedVector3Array() - + var dis: float = 0.25 var width: float = dis * 1.25 var len: float = dis * 1.5 @@ -48,38 +48,36 @@ func _draw_frustum() -> PackedVector3Array: # lines.push_back(Vector3(0, 0, 0)) # lines.push_back(Vector3(0, 0, -len)) - # Trapezoid lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(-width, dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(width, dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(-width, -dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(width, -dis, -len)) - - + # Square ## Left lines.push_back(Vector3(-width, dis, -len)) lines.push_back(Vector3(-width, -dis, -len)) - + ## Bottom lines.push_back(Vector3(-width, -dis, -len)) lines.push_back(Vector3(width, -dis, -len)) - + ## Right lines.push_back(Vector3(width, -dis, -len)) lines.push_back(Vector3(width, dis, -len)) - + ## Top lines.push_back(Vector3(width, dis, -len)) lines.push_back(Vector3(-width, dis, -len)) - + return lines @@ -88,6 +86,6 @@ func _redraw(gizmo: EditorNode3DGizmo): var icon: Material = get_material(_gizmo_name, gizmo) gizmo.add_unscaled_billboard(icon, _gizmo_scale) - + var material = get_material("main", gizmo) gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/gizmos/custom_gizmo.gd.uid b/addons/phantom_camera/gizmos/custom_gizmo.gd.uid new file mode 100644 index 0000000..6362d1f --- /dev/null +++ b/addons/phantom_camera/gizmos/custom_gizmo.gd.uid @@ -0,0 +1 @@ +uid://cl0ecseb1s6ur diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd index bef8180..c992320 100644 --- a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd +++ b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd @@ -8,4 +8,5 @@ func _init() -> void: set_gizmo_name("PhantomCamera") set_gizmo_spatial_script(_spatial_script) set_gizmo_icon(_icon) + super() diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid new file mode 100644 index 0000000..523e477 --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid @@ -0,0 +1 @@ +uid://cwxlqgwnno141 diff --git a/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd new file mode 100644 index 0000000..3dd4d3e --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd @@ -0,0 +1,29 @@ +extends EditorNode3DGizmoPlugin + +var _spatial_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd") +var _gizmo_icon: Texture2D = preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg") + +var _gizmo_name: StringName = "PhantomCameraNoiseEmitter" + +func _init() -> void: + create_material("main", Color8(252, 127, 127, 255)) + create_handle_material("handles") + create_icon_material(_gizmo_name, _gizmo_icon, false, Color.WHITE) + + +func _has_gizmo(node: Node3D): + return node.get_script() == _spatial_script + + +func _get_gizmo_name() -> String: + return _gizmo_name + + +func _redraw(gizmo: EditorNode3DGizmo): + gizmo.clear() + + var icon: Material = get_material(_gizmo_name, gizmo) + gizmo.add_unscaled_billboard(icon, 0.035) + + #var material = get_material("main", gizmo) + #gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid new file mode 100644 index 0000000..4d1c56e --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid @@ -0,0 +1 @@ +uid://cdj6uju71x3d3 diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_2d.svg.import index b10d490..724069f 100644 --- a/addons/phantom_camera/icons/phantom_camera_2d.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_2d.svg.import @@ -2,10 +2,9 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cmcvv0edbbpv4" +uid="uid://dchkkx4v3ikpw" path="res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.ctex" metadata={ -"has_editor_variant": true, "vram_texture": false } @@ -35,4 +34,4 @@ process/size_limit=0 detect_3d/compress_to=1 svg/scale=1.0 editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_3d.svg.import index 6542a24..eedbd2f 100644 --- a/addons/phantom_camera/icons/phantom_camera_3d.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_3d.svg.import @@ -2,10 +2,9 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bf8bxgxx71qki" +uid="uid://c71drpb8o4prn" path="res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.ctex" metadata={ -"has_editor_variant": true, "vram_texture": false } @@ -35,4 +34,4 @@ process/size_limit=0 detect_3d/compress_to=1 svg/scale=1.0 editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import index d880530..4b0e8bc 100644 --- a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dkpwb4k1bkbvn" +uid="uid://dnaykbu6ue5lo" path="res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.ctex" metadata={ "vram_texture": false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg new file mode 100644 index 0000000..f6fbad3 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import new file mode 100644 index 0000000..c24e060 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2r7mhd780y8d" +path="res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg new file mode 100644 index 0000000..c567f6a --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import new file mode 100644 index 0000000..de23002 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cby76y7m6xn4f" +path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg new file mode 100644 index 0000000..9b9bcb2 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import new file mode 100644 index 0000000..4dd736b --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw4iy855s0atm" +path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg new file mode 100644 index 0000000..d3c6deb --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import new file mode 100644 index 0000000..8cefc36 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fudwitkewe70" +path="res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid new file mode 100644 index 0000000..d69b9a0 --- /dev/null +++ b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid @@ -0,0 +1 @@ +uid://5jmqowgdbq3x diff --git a/addons/phantom_camera/panel/editor.gd.uid b/addons/phantom_camera/panel/editor.gd.uid new file mode 100644 index 0000000..75b97cf --- /dev/null +++ b/addons/phantom_camera/panel/editor.gd.uid @@ -0,0 +1 @@ +uid://cjcpn5ujqpnir diff --git a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn index 5d26888..c4769e6 100644 --- a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn +++ b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn @@ -45,7 +45,9 @@ corner_radius_bottom_left = 10 [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_obaj6"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 @@ -55,47 +57,47 @@ border_width_left = 4 border_width_top = 4 border_width_right = 4 border_width_bottom = 4 -border_color = Color(0.227451, 0.72549, 0.603922, 1) +border_color = Color(0.552941, 0.647059, 0.952941, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 content_margin_bottom = 10.0 -bg_color = Color(0.129412, 0.407843, 0.337255, 1) -border_width_left = 4 -border_width_top = 4 -border_width_right = 4 -border_width_bottom = 4 -border_color = Color(0.552941, 0.647059, 0.952941, 1) +bg_color = Color(0.180392, 0.576471, 0.482353, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 content_margin_bottom = 10.0 -bg_color = Color(0.180392, 0.576471, 0.482353, 1) +bg_color = Color(0.129412, 0.407843, 0.337255, 1) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] - [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5wua"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x4bx8"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] -bg_color = Color(0.72549, 0.227451, 0.34902, 1) +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] +bg_color = Color(0.53, 0.1643, 0.255725, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -106,8 +108,8 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] -bg_color = Color(0.53, 0.1643, 0.255725, 1) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] +bg_color = Color(0.43, 0.1333, 0.207475, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -118,8 +120,8 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] -bg_color = Color(0.43, 0.1333, 0.207475, 1) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] +bg_color = Color(0.72549, 0.227451, 0.34902, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -130,8 +132,6 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] - [node name="ViewfinderPanel" type="Control"] clip_contents = true custom_minimum_size = Vector2(0, 300) @@ -154,6 +154,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 metadata/_edit_lock_ = true [node name="SubViewportContainer" type="SubViewportContainer" parent="FramedViewfinder"] @@ -164,11 +165,13 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 stretch = true [node name="SubViewport" type="SubViewport" parent="FramedViewfinder/SubViewportContainer"] unique_name_in_owner = true handle_input_locally = false +canvas_item_default_texture_filter = 0 gui_disable_input = true size = Vector2i(1152, 648) size_2d_override_stretch = true @@ -187,27 +190,32 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneLeftHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] clip_contents = true layout_mode = 2 size_flags_horizontal = 3 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneLeftTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneLeftCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneLeftBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneCenterHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] @@ -215,43 +223,51 @@ unique_name_in_owner = true clip_contents = true layout_mode = 2 size_flags_horizontal = 4 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneCenterTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneCenterCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 4 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_fle8t") [node name="DeadZoneCenterBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] clip_contents = true layout_mode = 2 size_flags_horizontal = 3 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneRightTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="AspectRatioContainer" type="AspectRatioContainer" parent="FramedViewfinder"] @@ -263,10 +279,12 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 ratio = 1.77778 [node name="CameraViewportPanel" type="Panel" parent="FramedViewfinder/AspectRatioContainer"] layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_xmo1t") [node name="TargetPoint" type="Panel" parent="FramedViewfinder/AspectRatioContainer/CameraViewportPanel"] @@ -283,6 +301,7 @@ offset_right = 3.0 offset_bottom = 3.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_q7vs4") [node name="NoSupportMsg" type="Label" parent="."] @@ -369,10 +388,10 @@ focus_mode = 0 theme_override_colors/font_color = Color(1, 1, 1, 1) theme_override_fonts/font = ExtResource("3_li3i3") theme_override_font_sizes/font_size = 24 -theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") +theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") theme_override_styles/hover = SubResource("StyleBoxFlat_yh38y") theme_override_styles/pressed = SubResource("StyleBoxFlat_gci88") -theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") +theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") [node name="AddNodeTypeText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer/AddNodeButton"] unique_name_in_owner = true @@ -405,10 +424,10 @@ offset_top = 5.0 offset_right = 165.0 offset_bottom = 57.0 mouse_default_cursor_shape = 2 -theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") +theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") theme_override_styles/hover = SubResource("StyleBoxFlat_ja3vm") theme_override_styles/pressed = SubResource("StyleBoxFlat_mk273") -theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") +theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") [node name="PriorityOverrideIcon" type="TextureRect" parent="PriorityOverrideButton"] layout_mode = 1 diff --git a/addons/phantom_camera/plugin.cfg b/addons/phantom_camera/plugin.cfg index dd90728..af3255b 100644 --- a/addons/phantom_camera/plugin.cfg +++ b/addons/phantom_camera/plugin.cfg @@ -3,5 +3,5 @@ name="Phantom Camera" description="Control the movement and dynamically tween 2D & 3D cameras positions. Built for Godot 4. Inspired by Cinemachine." author="Marcus Skov" -version="0.7.2.1" +version="0.8.2.3" script="plugin.gd" diff --git a/addons/phantom_camera/plugin.gd b/addons/phantom_camera/plugin.gd index e4759de..deb6eef 100644 --- a/addons/phantom_camera/plugin.gd +++ b/addons/phantom_camera/plugin.gd @@ -6,13 +6,13 @@ extends EditorPlugin const PCAM_HOST: String = "PhantomCameraHost" const PCAM_2D: String = "PhantomCamera2D" const PCAM_3D: String = "PhantomCamera3D" +const PCAM_NOISE_EMITTER_2D: String = "PhantomCameraNoiseEmitter2D" +const PCAM_NOISE_EMITTER_3D: String = "PhantomCameraNoiseEmitter3D" -const Pcam3DPlugin = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd") - -const EditorPanel = preload("res://addons/phantom_camera/panel/editor.tscn") - -const updater_constants := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") - +const PCam3DPlugin: Script = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd") +const PCam3DNoiseEmitterPlugin: Script = preload("res://addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd") +const EditorPanel: PackedScene = preload("res://addons/phantom_camera/panel/editor.tscn") +const updater_constants: Script = preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager" #endregion @@ -20,7 +20,8 @@ const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager" #region Variables -var pcam_3D_gizmo_plugin = Pcam3DPlugin.new() +var pcam_3d_gizmo_plugin = PCam3DPlugin.new() +var pcam_3d_noise_emitter_gizmo_plugin = PCam3DNoiseEmitterPlugin.new() var editor_panel_instance: Control var panel_button: Button @@ -32,16 +33,19 @@ var panel_button: Button #region Private Functions func _enter_tree() -> void: - add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") + if not get_tree().root.get_node_or_null(String(PHANTOM_CAMERA_MANAGER)): + add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") # Phantom Camera Nodes add_custom_type(PCAM_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) add_custom_type(PCAM_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) add_custom_type(PCAM_HOST, "Node", preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) - + add_custom_type(PCAM_NOISE_EMITTER_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg")) + add_custom_type(PCAM_NOISE_EMITTER_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg")) # Phantom Camera 3D Gizmo - add_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + add_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) + add_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) # TODO - Should be disabled unless in editor # Viewfinder @@ -82,25 +86,24 @@ func _btn_toggled(toggled_on: bool): func _exit_tree() -> void: - remove_custom_type(PCAM_2D) - remove_custom_type(PCAM_3D) - remove_custom_type(PCAM_HOST) - - remove_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + panel_button.toggled.disconnect(_btn_toggled) + scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed) + scene_changed.disconnect(_scene_changed) remove_control_from_bottom_panel(editor_panel_instance) editor_panel_instance.queue_free() -# if framed_viewfinder_panel_instance: - scene_changed.disconnect(_scene_changed) - remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) + remove_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) + remove_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) - panel_button.toggled.disconnect(_btn_toggled) - scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed) - scene_changed.disconnect(_scene_changed) + remove_custom_type(PCAM_2D) + remove_custom_type(PCAM_3D) + remove_custom_type(PCAM_HOST) + remove_custom_type(PCAM_NOISE_EMITTER_2D) + remove_custom_type(PCAM_NOISE_EMITTER_3D) -#func _has_main_screen(): -# return true; + if get_tree().root.get_node_or_null(String(PHANTOM_CAMERA_MANAGER)): + remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) func _make_visible(visible): diff --git a/addons/phantom_camera/plugin.gd.uid b/addons/phantom_camera/plugin.gd.uid new file mode 100644 index 0000000..e5a2550 --- /dev/null +++ b/addons/phantom_camera/plugin.gd.uid @@ -0,0 +1 @@ +uid://cmn6d5bco4fh4 diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd index 8a53e05..a7ed80f 100644 --- a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd +++ b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd @@ -3,6 +3,11 @@ extends Node const PHANTOM_CAMERA_CONSTS = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +signal noise_2d_emitted(noise_output: Transform2D, emitter_layer: int) +signal noise_3d_emitted(noise_output: Transform3D, emitter_layer: int) + + var phantom_camera_hosts: Array[PhantomCameraHost]: get: return _phantom_camera_host_list @@ -13,10 +18,10 @@ var phantom_camera_2ds: Array[PhantomCamera2D]: return _phantom_camera_2d_list var _phantom_camera_2d_list: Array[PhantomCamera2D] -var phantom_camera_3ds: Array: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var phantom_camera_3ds: Array[Node]: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. get: return _phantom_camera_3d_list -var _phantom_camera_3d_list: Array ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var _phantom_camera_3d_list: Array[Node] ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. func _enter_tree(): @@ -39,10 +44,8 @@ func pcam_host_removed(caller: Node) -> void: func pcam_added(caller, host_slot: int = 0) -> void: if is_instance_of(caller, PhantomCamera2D): _phantom_camera_2d_list.append(caller) - #print("Added PCam2D to PCamManager") elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. _phantom_camera_3d_list.append(caller) - #print("Added PCam3D to PCamManager") if not _phantom_camera_host_list.is_empty(): _phantom_camera_host_list[host_slot].pcam_added_to_scene(caller) diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid new file mode 100644 index 0000000..5127ed0 --- /dev/null +++ b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid @@ -0,0 +1 @@ +uid://bkupm4nr1ijkq diff --git a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid new file mode 100644 index 0000000..911f6f4 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid @@ -0,0 +1 @@ +uid://bugf1s8cx3jjv diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd b/addons/phantom_camera/scripts/panel/updater/update_button.gd index 965e394..f3a67c5 100644 --- a/addons/phantom_camera/scripts/panel/updater/update_button.gd +++ b/addons/phantom_camera/scripts/panel/updater/update_button.gd @@ -160,6 +160,10 @@ func _on_timer_timeout() -> void: # Convert a version number to an actually comparable number func version_to_number(version: String) -> int: + var regex = RegEx.new() + regex.compile("[a-zA-Z]+") + if regex.search(str(version)): return 0 + var bits = version.split(".") var version_bit: int var multiplier: int = 10000 diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid b/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid new file mode 100644 index 0000000..0e31ed6 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid @@ -0,0 +1 @@ +uid://daratdxrl2scr diff --git a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid new file mode 100644 index 0000000..082954a --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid @@ -0,0 +1 @@ +uid://c20k2jx7tvwt7 diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd index c183876..045d41d 100644 --- a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd +++ b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd @@ -162,6 +162,10 @@ func _settings_changed() -> void: var ratio: float = viewport_width / viewport_height aspect_ratio_container.set_ratio(ratio) camera_viewport_panel.size.x = viewport_width / (viewport_height / sub_viewport.size.y) + + ## Applies Project Settings to Viewport + sub_viewport.canvas_item_default_texture_filter = ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter") + # TODO - Add resizer for Framed Viewfinder @@ -194,11 +198,11 @@ func visibility_check() -> void: _check_camera(root, camera_2d, true) elif root is Node3D: var camera_3d: Camera3D - if has_camera: camera_3d = phantom_camera_host.camera_3d - else: - camera_3d = root.get_viewport().get_camera_3d() + elif root.get_viewport() != null: + if root.get_viewport().get_camera_3d() != null: + camera_3d = root.get_viewport().get_camera_3d() _is_2d = false is_scene = true @@ -215,12 +219,23 @@ func visibility_check() -> void: func _get_camera_2d() -> Camera2D: - var camerasGroupName = "__cameras_%d" % EditorInterface.get_edited_scene_root().get_viewport().get_viewport_rid().get_id() + var edited_scene_root = EditorInterface.get_edited_scene_root() + + if edited_scene_root == null: return null + + var viewport = edited_scene_root.get_viewport() + if viewport == null: return null + + var viewport_rid = viewport.get_viewport_rid() + if viewport_rid == null: return null + + var camerasGroupName = "__cameras_%d" % viewport_rid.get_id() var cameras = get_tree().get_nodes_in_group(camerasGroupName) for camera in cameras: if camera is Camera2D and camera.is_current: return camera + return null diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid new file mode 100644 index 0000000..9853b83 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid @@ -0,0 +1 @@ +uid://o4atxn3g6ivl diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd index 85081b0..dc60930 100644 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd @@ -16,11 +16,11 @@ const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/ #endregion - #region Signals ## Emitted when the [param PhantomCamera2D] becomes active. signal became_active + ## Emitted when the [param PhantomCamera2D] becomes inactive. signal became_inactive @@ -31,23 +31,34 @@ signal follow_target_changed ## [b]Note:[/b] Only applicable in [param Framed] [enum FollowMode]. signal dead_zone_changed +## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. +signal dead_zone_reached(side: Vector2) + ## Emitted when the [param Camera2D] starts to tween to another [param PhantomCamera2D]. signal tween_started + ## Emitted when the [param Camera2D] is to tweening towards another [param PhantomCamera2D]. signal is_tweening + ## Emitted when the tween is interrupted due to another [param PhantomCamera2D] ## becoming active. The argument is the [param PhantomCamera2D] that interrupted ## the tween. signal tween_interrupted(pcam_2d: PhantomCamera2D) + ## Emitted when the [param Camera2D] completes its tween to the ## [param PhantomCamera2D]. signal tween_completed +## Emitted when Noise should be applied to the Camera2D. +signal noise_emitted(noise_output: Transform2D) + +signal physics_target_changed + #endregion #region Enums -## Determines the positional logic for a given [param PCamPhantomCamera2D] +## Determines the positional logic for a given [param PhantomCamera2D] ## [br][br] ## The different modes have different functionalities and purposes, so choosing ## the correct one depends on what each [param PhantomCamera2D] is meant to do. @@ -70,16 +81,16 @@ enum InactiveUpdateMode { # EXPONENTIALLY, } -#endregion - -#region Variables +enum FollowLockAxis { + NONE = 0, + X = 1, + Y = 2, + XY = 3, +} -var _is_active: bool = false +#endregion -## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. -var pcam_host_owner: PhantomCameraHost = null: - set = set_pcam_host_owner, - get = get_pcam_host_owner +#region Exported Properties ## To quickly preview a [param PhantomCamera2D] without adjusting its ## [member priority], this property allows the selected PCam to ignore the @@ -120,7 +131,23 @@ var pcam_host_owner: PhantomCameraHost = null: set(value): follow_mode = value - if value == FollowMode.FRAMED: + if follow_mode == FollowMode.NONE: + _should_follow = false + top_level = false + _is_parents_physics() + notify_property_list_changed() + return + + match follow_mode: + FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow_checker() + FollowMode.GROUP: + _follow_targets_size_check() + _: + _should_follow_checker() + + if follow_mode == FollowMode.FRAMED: if _follow_framed_initial_set and follow_target: _follow_framed_initial_set = false dead_zone_changed.connect(_on_dead_zone_changed) @@ -128,32 +155,22 @@ var pcam_host_owner: PhantomCameraHost = null: if dead_zone_changed.is_connected(_on_dead_zone_changed): dead_zone_changed.disconnect(_on_dead_zone_changed) - if follow_mode == FollowMode.NONE: - _should_follow = false - elif follow_mode == FollowMode.GROUP and follow_targets or follow_target: - _should_follow = true + top_level = true notify_property_list_changed() get: return follow_mode - ## Determines which target should be followed. ## The [param Camera2D] will follow the position of the Follow Target ## based on the [member follow_mode] type and its parameters. @export var follow_target: Node2D = null: set = set_follow_target, get = get_follow_target -var _should_follow: bool = false -var _follow_framed_offset: Vector2 = Vector2.ZERO -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved ### Defines the targets that the [param PhantomCamera2D] should be following. @export var follow_targets: Array[Node2D] = []: set = set_follow_targets, get = get_follow_targets -var _has_multiple_follow_targets: bool = false - ## Determines the [Path2D] the [param PhantomCamera2D] ## should be bound to. @@ -162,7 +179,6 @@ var _has_multiple_follow_targets: bool = false @export var follow_path: Path2D = null: set = set_follow_path, get = get_follow_path -var _has_follow_path: bool = false ## Applies a zoom level to the [param PhantomCamera2D], which effectively ## overrides the [param zoom] property of the [param Camera2D] node. @@ -201,11 +217,10 @@ var _has_follow_path: bool = false @export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): set = set_tween_resource, get = get_tween_resource -var _has_tweened: bool = false -## If enabled, the moment a [param PhantomCamera3D] is instantiated into +## If enabled, the moment a [param PhantomCamera2D] is instantiated into ## a scene, and has the highest priority, it will perform its tween transition. -## This is most obvious if a [param PhantomCamera3D] has a long duration and +## This is most obvious if a [param PhantomCamera2D] has a long duration and ## is attached to a playable character that can be moved the moment a scene ## is loaded. Disabling the [param tween_on_load] property will ## disable this behaviour and skip the tweening entirely when instantiated. @@ -239,7 +254,16 @@ var _has_tweened: bool = false @export var follow_damping_value: Vector2 = Vector2(0.1, 0.1): set = set_follow_damping_value, get = get_follow_damping_value -var _velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the movement + + +## Prevents the [param PhantomCamera2D] from moving in a designated axis. +## This can be enabled or disabled at runtime or from the editor directly. +@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: + set = set_lock_axis, + get = get_lock_axis +var _follow_axis_is_locked: bool = false +var _follow_axis_lock_value: Vector2 = Vector2.ZERO + @export_subgroup("Follow Group") ## Enables the [param PhantomCamera2D] to dynamically zoom in and out based on @@ -305,11 +329,6 @@ var _velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of t ## [param dead zones] will never be visible in build exports. @export var show_viewfinder_in_play: bool = false -## Defines the position of the [member follow_target] within the viewport.[br] -## This is only used for when [member follow_mode] is set to [param Framed]. -var viewport_position: Vector2 -var _follow_framed_initial_set: bool = false - @export_group("Limit") ## Shows the [param Camera2D]'s built-in limit border.[br] @@ -322,10 +341,6 @@ var _follow_framed_initial_set: bool = false get: return _draw_limits -static var _draw_limits: bool - -var _limit_sides: Vector4i -var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000) ## Defines the left side of the [param Camera2D] limit. ## The camera will not be able to move past this point. @export var limit_left: int = -10000000: @@ -347,22 +362,22 @@ var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10 set = set_limit_bottom, get = get_limit_bottom -## Allows for setting either a [TileMap] or [CollisionShape2D] node to +## Allows for setting either a [TileMap], [TileMapLayer] or [CollisionShape2D] node to ## automatically apply a limit size instead of manually adjusting the Left, ## Top, Right and Left properties.[br][br] -## [b]TileMap[/b][br] -## The Limit will update after the [TileSet] of the [TileMap] has changed.[br] +## [b]TileMap / TileMapLayer[/b][br] +## The Limit will update after the [TileSet] of the [TileMap] / [TileMapLayer] has changed.[br] ## [b]Note:[/b] The limit size will only update after closing the TileMap editor ## bottom panel. ## [br][br] ## [b]CollisionShape2D[/b][br] ## The limit will update in realtime as the Shape2D changes its size. ## Note: For performance reasons, resizing the [Shape2D] during runtime will not change the Limits sides. -@export_node_path("TileMap", "CollisionShape2D") var limit_target = NodePath(""): +@export_node_path("TileMap", "Node2D", "CollisionShape2D") var limit_target: NodePath = NodePath(""): set = set_limit_target, get = get_limit_target -var _limit_node: Node2D -## Applies an offset to the [TileMap] Limit or [Shape2D] Limit. + +## Applies an offset to the [TileMap]/[TileMapLayer] Limit or [Shape2D] Limit. ## The values goes from [param Left], [param Top], [param Right] ## and [param Bottom]. @export var limit_margin: Vector4i: @@ -371,13 +386,94 @@ var _limit_node: Node2D #@export var limit_smoothed: bool = false: # TODO - Needs proper support #set = set_limit_smoothing, #get = get_limit_smoothing + +@export_group("Noise") +## Applies a noise, or shake, to a [Camera2D].[br] +## Once set, the noise will run continuously after the tween to the [PhantomCamera2D] is complete. +@export var noise: PhantomCameraNoise2D: + set = set_noise, + get = get_noise + +## If true, will trigger the noise while in the editor.[br] +## Useful in cases where you want to temporarily disable the noise in the editor without removing +## the resource.[br][br] +## [b]Note:[/b] This property has no effect on runtime behaviour. +@export var _preview_noise: bool = true: + set(value): + _preview_noise = value + if not value: + _transform_noise = Transform2D() + +## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter2D.noise_emitter_layer] +## to make this [PhantomCamera2D] be affect by it. +@export_flags_2d_render var noise_emitter_layer: int: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#region Private Variables + +var _is_active: bool = false + +## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. +var pcam_host_owner: PhantomCameraHost = null: + set = set_pcam_host_owner, + get = get_pcam_host_owner + +var _should_follow: bool = false +var _follow_framed_offset: Vector2 = Vector2.ZERO +var _follow_target_physics_based: bool = false +var _physics_interpolation_enabled: bool = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved + +var _has_multiple_follow_targets: bool = false +var _follow_targets_single_target_index: int = 0 +var _follow_targets: Array[Node2D] + +var _follow_velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the movement + +var _has_follow_path: bool = false + +var _tween_skip: bool = false + +## Defines the position of the [member follow_target] within the viewport.[br] +## This is only used for when [member follow_mode] is set to [param Framed]. +var _follow_framed_initial_set: bool = false + +static var _draw_limits: bool + +var _limit_sides: Vector4i +var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000) + +var _limit_node: Node2D + var _limit_inactive_pcam: bool -#endregion +var _transform_output: Transform2D +var _transform_noise: Transform2D + +var _has_noise_resource: bool = false # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#endregion + +#region Public Variables + +var tween_duration: float: + set = set_tween_duration, + get = get_tween_duration +var tween_transition: PhantomCameraTween.TransitionType: + set = set_tween_transition, + get = get_tween_transition +var tween_ease: PhantomCameraTween.EaseType: + set = set_tween_ease, + get = get_tween_ease + +var viewport_position: Vector2 + +#endregion + +#region Property Validator func _validate_property(property: Dictionary) -> void: ################ @@ -396,8 +492,6 @@ func _validate_property(property: Dictionary) -> void: #################### ## Follow Parameters #################### - - if follow_mode == FollowMode.NONE: match property.name: "follow_offset", \ @@ -422,12 +516,12 @@ func _validate_property(property: Dictionary) -> void: "auto_zoom": property.usage = PROPERTY_USAGE_NO_EDITOR - if not auto_zoom: - match property.name: - "auto_zoom_min", \ - "auto_zoom_max", \ - "auto_zoom_margin": - property.usage = PROPERTY_USAGE_NO_EDITOR + if not auto_zoom or follow_mode != FollowMode.GROUP: + match property.name: + "auto_zoom_min", \ + "auto_zoom_max", \ + "auto_zoom_margin": + property.usage = PROPERTY_USAGE_NO_EDITOR ################ ## Follow Framed @@ -442,7 +536,7 @@ func _validate_property(property: Dictionary) -> void: ####### ## Zoom ####### - if property.name == "zoom" and auto_zoom: + if property.name == "zoom" and follow_mode == FollowMode.GROUP and auto_zoom: property.usage = PROPERTY_USAGE_NO_EDITOR ######## @@ -465,11 +559,18 @@ func _validate_property(property: Dictionary) -> void: if property.name == "frame_preview" and _is_active: property.usage |= PROPERTY_USAGE_READ_ONLY - notify_property_list_changed() - #region Private Functions func _enter_tree() -> void: + _should_follow_checker() + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + elif follow_mode == FollowMode.NONE: + _is_parents_physics() + + if not visibility_changed.is_connected(_check_visibility): + visibility_changed.connect(_check_visibility) + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) _phantom_camera_manager.pcam_added(self) update_limit_all_sides() @@ -479,137 +580,185 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_removed(self) + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_removed(self) if _has_valid_pcam_owner(): get_pcam_host_owner().pcam_removed_from_scene(self) + if not follow_mode == FollowMode.GROUP: + follow_targets = [] + + +func _ready() -> void: + _transform_output = global_transform + _phantom_camera_manager.noise_2d_emitted.connect(_noise_emitted) + + if not Engine.is_editor_hint(): + _preview_noise = true + + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + func _process(delta: float) -> void: - if _follow_target_physics_based: return - _process_logic(delta) + if _follow_target_physics_based or _is_active: return + process_logic(delta) -func _physics_process(delta: float): - if not _follow_target_physics_based: return - _process_logic(delta) +func _physics_process(delta: float) -> void: + if not _follow_target_physics_based or _is_active: return + process_logic(delta) -func _process_logic(delta: float) -> void: - if not _is_active: +func process_logic(delta: float) -> void: + if _is_active: + if _has_noise_resource and _preview_noise: + _transform_noise = noise.get_noise_transform(delta) + if _transform_noise.get_rotation() != 0: + push_warning(pcam_host_owner.camera_2d.name, " has ignore_rotation enabled.") + else: match inactive_update_mode: InactiveUpdateMode.NEVER: return InactiveUpdateMode.ALWAYS: # Only triggers if limit isn't default if _limit_inactive_pcam: global_position = _set_limit_clamp_position(global_position) -# InactiveUpdateMode.EXPONENTIALLY: -# TODO - Trigger positional updates less frequently as more Pcams gets added + # InactiveUpdateMode.EXPONENTIALLY: + # TODO - Trigger positional updates less frequently as more PCams gets added + _limit_checker() +# if not Engine.is_editor_hint(): print(_should_follow) if _should_follow: _follow(delta) + else: + _transform_output = global_transform + + if _follow_axis_is_locked: + match follow_axis_lock: + FollowLockAxis.X: + _transform_output.origin.x = _follow_axis_lock_value.x + FollowLockAxis.Y: + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.XY: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y func _limit_checker() -> void: ## TODO - Needs to see if this can be triggerd only from CollisionShape2D Transform changes - if Engine.is_editor_hint(): - if draw_limits: - update_limit_all_sides() + if not Engine.is_editor_hint(): return + if draw_limits: + update_limit_all_sides() func _follow(delta: float) -> void: var follow_position: Vector2 - match follow_mode: FollowMode.GLUED: - if follow_target: - follow_position = follow_target.global_position + follow_position = follow_target.global_position + FollowMode.SIMPLE: - if follow_target: - follow_position = _target_position_with_offset() + follow_position = _target_position_with_offset() + FollowMode.GROUP: - if follow_targets.size() == 1: - follow_position = follow_targets[0].global_position - elif _has_multiple_follow_targets and follow_targets.size() > 1: - var rect: Rect2 = Rect2(follow_targets[0].global_position, Vector2.ZERO) - for node in follow_targets: - rect = rect.expand(node.global_position) - if auto_zoom: - rect = rect.grow_individual( - auto_zoom_margin.x, - auto_zoom_margin.y, - auto_zoom_margin.z, - auto_zoom_margin.w - ) -# else: -# rect = rect.grow_individual(-80, 0, 0, 0) + if _has_multiple_follow_targets: + var rect: Rect2 = Rect2(_follow_targets[0].global_position, Vector2.ZERO) + for target in _follow_targets: + rect = rect.expand(target.global_position) if auto_zoom: + rect = rect.grow_individual( + auto_zoom_margin.x, + auto_zoom_margin.y, + auto_zoom_margin.z, + auto_zoom_margin.w + ) + var screen_size: Vector2 = get_viewport_rect().size if rect.size.x > rect.size.y * screen_size.aspect(): zoom = clamp(screen_size.x / rect.size.x, auto_zoom_min, auto_zoom_max) * Vector2.ONE else: zoom = clamp(screen_size.y / rect.size.y, auto_zoom_min, auto_zoom_max) * Vector2.ONE follow_position = rect.get_center() + else: + follow_position = follow_targets[_follow_targets_single_target_index].global_position + FollowMode.PATH: - if follow_target and follow_path: - var path_position: Vector2 = follow_path.global_position + var path_position: Vector2 = follow_path.global_position - follow_position = \ - follow_path.curve.get_closest_point( - _target_position_with_offset() - path_position - ) + path_position + follow_position = \ + follow_path.curve.get_closest_point( + _target_position_with_offset() - path_position + ) + path_position FollowMode.FRAMED: - if follow_target: - if not Engine.is_editor_hint(): - viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size - - if _get_framed_side_offset() != Vector2.ZERO: - var glo_pos: Vector2 - var target_position: Vector2 = _target_position_with_offset() + _follow_framed_offset - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - follow_position = _target_position_with_offset() - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _target_position_with_offset() - glo_pos.x += target_position.x - global_position.x - follow_position = glo_pos - else: - follow_position = _target_position_with_offset() + if not Engine.is_editor_hint(): + viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size + var framed_side_offset: Vector2 = _get_framed_side_offset() + + if framed_side_offset != Vector2.ZERO: + var glo_pos: Vector2 + var target_position: Vector2 = _target_position_with_offset() + _follow_framed_offset + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + follow_position = _target_position_with_offset() + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _target_position_with_offset() + glo_pos.x += target_position.x - global_position.x + follow_position = glo_pos else: - follow_position = target_position + follow_position = _target_position_with_offset() + + # If a horizontal dead zone is reached + if framed_side_offset.x != 0 and framed_side_offset.y == 0: + follow_position.y = _transform_output.origin.y + follow_position.x = target_position.x + _follow_framed_offset.y = global_position.y - _target_position_with_offset().y + dead_zone_reached.emit(Vector2(framed_side_offset.x, 0)) + # If a vertical dead zone is reached + elif framed_side_offset.x == 0 and framed_side_offset.y != 0: + follow_position.x = _transform_output.origin.x + follow_position.y = target_position.y + _follow_framed_offset.x = global_position.x - _target_position_with_offset().x + dead_zone_reached.emit(Vector2(0, framed_side_offset.y)) + # If a deadzone corner is reached else: - _follow_framed_offset = global_position - _target_position_with_offset() - return + follow_position = target_position + dead_zone_reached.emit(Vector2(framed_side_offset.x, framed_side_offset.y)) else: - follow_position = _target_position_with_offset() + _follow_framed_offset = _transform_output.origin - _target_position_with_offset() + return + else: + follow_position = _target_position_with_offset() _interpolate_position(follow_position, delta) -func _set_velocity(index: int, value: float): - _velocity_ref[index] = value +func _set_follow_velocity(index: int, value: float): + _follow_velocity_ref[index] = value func _interpolate_position(target_position: Vector2, delta: float) -> void: - if _limit_inactive_pcam and not _has_tweened: + if _limit_inactive_pcam and not _tween_skip: target_position = _set_limit_clamp_position(target_position) + global_position = target_position if follow_damping: - for index in 2: - global_position[index] = \ - _smooth_damp( - target_position[index], - global_position[index], - index, - _velocity_ref[index], - _set_velocity, - follow_damping_value[index], - delta - ) + var output_position: Vector2 + for i in 2: + output_position[i] = _smooth_damp( + global_position[i], + _transform_output.origin[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + _transform_output = Transform2D(global_rotation, output_position) else: - global_position = target_position + _transform_output = Transform2D(global_rotation, target_position) func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: @@ -643,7 +792,7 @@ func _set_limit_clamp_position(value: Vector2) -> Vector2: return value -func _draw(): +func _draw() -> void: if not Engine.is_editor_hint(): return if frame_preview and not _is_active: @@ -718,6 +867,109 @@ func _set_camera_2d_limit(side: int, limit: int) -> void: if not _is_active: return get_pcam_host_owner().camera_2d.set_limit(side, limit) + +func _check_visibility() -> void: + if not is_instance_valid(pcam_host_owner): return + pcam_host_owner.refresh_pcam_list_priorty() + + +func _follow_target_tree_exiting(target: Node) -> void: + if target == follow_target: + _should_follow = false + if _follow_targets.has(target): + _follow_targets.erase(target) + + +func _should_follow_checker() -> void: + if follow_mode == FollowMode.NONE: + _should_follow = false + return + + if not follow_mode == FollowMode.GROUP: + if is_instance_valid(follow_target): + _should_follow = true + else: + _should_follow = false + + +func _follow_targets_size_check() -> void: + var targets_size: int = 0 + _follow_target_physics_based = false + _follow_targets = [] + for i in follow_targets.size(): + if follow_targets[i] == null: continue + if follow_targets[i].is_inside_tree(): + _follow_targets.append(follow_targets[i]) + targets_size += 1 + _follow_targets_single_target_index = i + _check_physics_body(follow_targets[i]) + if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): + follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) + + match targets_size: + 0: + _should_follow = false + _has_multiple_follow_targets = false + 1: + _should_follow = true + _has_multiple_follow_targets = false + _: + _should_follow = true + _has_multiple_follow_targets = true + + +func _noise_emitted(emitter_noise_output: Transform2D, emitter_layer: int) -> void: + if noise_emitter_layer & emitter_layer != 0: + noise_emitted.emit(emitter_noise_output) + + if not pcam_host_owner.camera_2d.ignore_rotation: return + if emitter_noise_output.get_rotation() != 0: + push_warning(pcam_host_owner.camera_2d.name, " has ignore_rotation enabled.") + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Render layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + + +func _check_physics_body(target: Node2D) -> void: + if target is PhysicsBody2D: + ## NOTE - Feature Toggle + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor < 3: + if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.") + print_rich("If possible, will recommend upgrading to Godot 4.3, as it has built-in support for 2D Physics Interpolation, which will mitigate this issue.") + print_rich("Otherwise, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + return + ## NOTE - Only supported in Godot 4.3 or above + elif not ProjectSettings.get_setting("physics/common/physics_interpolation") and ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + _follow_target_physics_based = true + else: + _is_parents_physics(target) + physics_target_changed.emit() + + +func _is_parents_physics(target: Node = self) -> void: + var current_node: Node = target + while current_node: + current_node = current_node.get_parent() + if not current_node is PhysicsBody2D: continue + _follow_target_physics_based = true + #endregion @@ -733,8 +985,11 @@ func update_limit_all_sides() -> void: _limit_sides.y = limit_top _limit_sides.z = limit_right _limit_sides.w = limit_bottom - elif _limit_node is TileMap: - var tile_map: TileMap = _limit_node as TileMap + elif _limit_node is TileMap or _limit_node.is_class("TileMapLayer"): + var tile_map := _limit_node + + if not tile_map.tile_set: return # TODO: This should be removed once https://github.com/godotengine/godot/issues/96898 is resolved + var tile_map_size: Vector2 = Vector2(tile_map.get_used_rect().size) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() var tile_map_position: Vector2 = tile_map.global_position + Vector2(tile_map.get_used_rect().position) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() @@ -753,7 +1008,7 @@ func update_limit_all_sides() -> void: # Bottom _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y) elif _limit_node is CollisionShape2D: - var collision_shape_2d = _limit_node as CollisionShape2D + var collision_shape_2d: CollisionShape2D = _limit_node as CollisionShape2D if not collision_shape_2d.get_shape(): return @@ -800,14 +1055,29 @@ func reset_limit() -> void: ## Assigns the value of the [param has_tweened] property. ## [b][color=yellow]Important:[/color][/b] This value can only be changed ## from the [PhantomCameraHost] script. -func set_has_tweened(caller: Node, value: bool) -> void: +func set_tween_skip(caller: Node, value: bool) -> void: if is_instance_of(caller, PhantomCameraHost): - _has_tweened = value + _tween_skip = value else: printerr("Can only be called PhantomCameraHost class") ## Returns the current [param has_tweened] value. -func get_has_tweened() -> bool: - return _has_tweened +func get_tween_skip() -> bool: + return _tween_skip + +## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. +func get_transform_output() -> Transform2D: + return _transform_output + + +## Returns the noise [Transform3D] value. +func get_noise_transform() -> Transform2D: + return _transform_noise + + +## Emits a noise based on a custom [Transform2D] value.[br] +## Use this function if you wish to make use of external noise patterns from, for example, other addons. +func emit_noise(value: Transform2D) -> void: + noise_emitted.emit(value) #endregion @@ -904,6 +1174,8 @@ func get_tween_ease() -> int: func set_is_active(node, value) -> void: if node is PhantomCameraHost: _is_active = value + if value: + _should_follow_checker() else: printerr("PCams can only be set from the PhantomCameraHost") @@ -932,12 +1204,21 @@ func get_follow_mode() -> int: ## Assigns a new [Node2D] as the [member follow_target]. func set_follow_target(value: Node2D) -> void: + if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return if follow_target == value: return follow_target = value _follow_target_physics_based = false if is_instance_valid(value): - _should_follow = true + if follow_mode == FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow = true + else: + _should_follow = false + else: + _should_follow = true _check_physics_body(value) + if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): + follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) else: _should_follow = false follow_target_changed.emit() @@ -959,6 +1240,10 @@ func get_follow_target() -> Node2D: ## Assigns a new [Path2D] to the [member follow_path]. func set_follow_path(value: Path2D) -> void: follow_path = value + if is_instance_valid(follow_path): + _should_follow_checker() + else: + _should_follow = false ## Erases the current [Path2D] from the [member follow_path] property. func erase_follow_path() -> void: @@ -971,37 +1256,20 @@ func get_follow_path() -> Path2D: ## Assigns a new [param follow_targets] array value. func set_follow_targets(value: Array[Node2D]) -> void: + if follow_mode != FollowMode.GROUP: return if follow_targets == value: return - follow_targets = value - - if follow_targets.is_empty(): - _should_follow = false - _has_multiple_follow_targets = false - return - - _follow_target_physics_based = false - var valid_instances: int = 0 - for target in follow_targets: - if is_instance_valid(target): - _should_follow = true - valid_instances += 1 - - _check_physics_body(target) - - if valid_instances > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() ## Appends a single [Node2D] to [member follow_targets]. func append_follow_targets(value: Node2D) -> void: if not is_instance_valid(value): - printerr(value, " is not a valid Node2D instance.") + printerr(value, " is not a valid Node2D instance") return + if not follow_targets.has(value): follow_targets.append(value) - _should_follow = true - _has_multiple_follow_targets = true - _check_physics_body(value) + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") @@ -1011,47 +1279,20 @@ func append_follow_targets_array(value: Array[Node2D]) -> void: if not is_instance_valid(target): continue if not follow_targets.has(target): follow_targets.append(target) - _should_follow = true - _check_physics_body(target) - if follow_targets.size() > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") ## Removes a [Node2D] from [member follow_targets] array. func erase_follow_targets(value: Node2D) -> void: follow_targets.erase(value) - _follow_target_physics_based = false - for target in follow_targets: - _check_physics_body(target) - if follow_targets.size() < 2: - _has_multiple_follow_targets = false - if follow_targets.size() < 1: - _should_follow = false + _follow_targets_size_check() ## Gets all [Node2D] from [member follow_targets] array. func get_follow_targets() -> Array[Node2D]: return follow_targets -func _check_physics_body(target: Node2D) -> void: - if target is PhysicsBody2D: - ## NOTE - Feature Toggle - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor < 3: - if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("Once Godot 4.3 is released, will strongly recommend upgrading to that as it has built-in support for 2D Physics Interpolation.") - print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## NOTE - Only supported in Godot 4.3 or above - elif not ProjectSettings.get_setting("physics/common/physics_interpolation") and ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - _follow_target_physics_based = true - - ## Assigns a new Vector2 for the Follow Target Offset property. func set_follow_offset(value: Vector2) -> void: follow_offset = value @@ -1083,6 +1324,30 @@ func get_follow_damping_value() -> Vector2: return follow_damping_value +func set_lock_axis(value: FollowLockAxis) -> void: + follow_axis_lock = value + + # Wait for the node to be ready before setting lock + if not is_node_ready(): await ready + + # Prevent axis lock from working in the editor + if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): + _follow_axis_is_locked = true + match value: + FollowLockAxis.X: + _follow_axis_lock_value.x = _transform_output.origin.x + FollowLockAxis.Y: + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.XY: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + else: + _follow_axis_is_locked = false + +func get_lock_axis() -> FollowLockAxis: + return follow_axis_lock + + ## Enables or disables [member snap_to_pixel]. func set_snap_to_pixel(value: bool) -> void: snap_to_pixel = value @@ -1092,12 +1357,6 @@ func get_snap_to_pixel() -> bool: return snap_to_pixel -## Returns true if the [param PhantomCamera2D] has more than one member in the -## [follow_targets] array. -func get_has_multiple_follow_targets() -> bool: - return _has_multiple_follow_targets - - ## Enables or disables Auto zoom when using Group Follow. func set_auto_zoom(value: bool) -> void: auto_zoom = value @@ -1218,11 +1477,12 @@ func set_limit_target(value: NodePath) -> void: var prev_limit_node: Node2D = _limit_node var new_limit_node: Node2D = get_node(value) - if prev_limit_node is TileMap: - if prev_limit_node.changed.is_connected(_on_tile_map_changed): - prev_limit_node.changed.disconnect(_on_tile_map_changed) + if prev_limit_node: + if prev_limit_node is TileMap or prev_limit_node.is_class("TileMapLayer"): + if prev_limit_node.changed.is_connected(_on_tile_map_changed): + prev_limit_node.changed.disconnect(_on_tile_map_changed) - if new_limit_node is TileMap: + if new_limit_node is TileMap or new_limit_node.is_class("TileMapLayer"): if not new_limit_node.changed.is_connected(_on_tile_map_changed): new_limit_node.changed.connect(_on_tile_map_changed) elif new_limit_node is CollisionShape2D: @@ -1231,15 +1491,15 @@ func set_limit_target(value: NodePath) -> void: if col_shape.shape == null: printerr("No Shape2D in: ", col_shape.name) reset_limit() - limit_target = null + limit_target = "" return else: - printerr("Limit Target is not a TileMap or CollisionShape2D node") + printerr("Limit Target is not a TileMap, TileMapLayer or CollisionShape2D node") return elif value == NodePath(""): reset_limit() - limit_target = null + limit_target = "" else: printerr("Limit Target cannot be found") return @@ -1276,6 +1536,34 @@ func get_limit_margin() -> Vector4i: #return limit_smoothed +## Sets a [PhantomCameraNoise2D] resource. +func set_noise(value: PhantomCameraNoise2D) -> void: + noise = value + if value != null: + _has_noise_resource = true + noise.set_trauma(1) + else: + _has_noise_resource = false + _transform_noise = Transform2D() + +## Returns the [PhantomCameraNoise2D] resource. +func get_noise() -> PhantomCameraNoise2D: + return noise + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + ## Sets [member inactive_update_mode] property. func set_inactive_update_mode(value: int) -> void: inactive_update_mode = value @@ -1285,11 +1573,6 @@ func get_inactive_update_mode() -> int: return inactive_update_mode -func set_follow_target_physics_based(value: bool, caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _follow_target_physics_based = value - else: - printerr("set_follow_target_physics_based() is for internal use only.") func get_follow_target_physics_based() -> bool: return _follow_target_physics_based diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid new file mode 100644 index 0000000..6da6031 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid @@ -0,0 +1 @@ +uid://k62o6vxt4go4 diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd index 2342157..c244681 100644 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd @@ -5,7 +5,7 @@ extends Node3D ## Controls a scene's [Camera3D] and applies logic to it. ## -## The scene's [param Camera3D] will follow the position of the +## The scene's [Camera3D] will follow the position of the ## [param PhantomCamera3D] with the highest priority. ## Each instance can have different positional and rotational logic applied ## to them. @@ -21,6 +21,7 @@ const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/p ## Emitted when the [param PhantomCamera3D] becomes active. signal became_active + ## Emitted when the [param PhantomCamera3D] becomes inactive. signal became_inactive @@ -34,20 +35,31 @@ signal look_at_target_changed ## [b]Note:[/b] Only applicable in [param Framed] [member FollowMode]. signal dead_zone_changed +## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. +signal dead_zone_reached + ## Emitted when the [param Camera3D] starts to tween to another ## [param PhantomCamera3D]. signal tween_started + ## Emitted when the [param Camera3D] is to tweening towards another ## [param PhantomCamera3D]. signal is_tweening + ## Emitted when the tween is interrupted due to another [param PhantomCamera3D] ## becoming active. The argument is the [param PhantomCamera3D] that ## interrupted the tween. signal tween_interrupted(pcam_3d: PhantomCamera3D) + ## Emitted when the [param Camera3D] completes its tween to the ## [param PhantomCamera3D]. signal tween_completed +## Emitted when Noise should be applied to the [param Camera3D]. +signal noise_emitted(noise_output: Transform3D) + +signal physics_target_changed + #endregion @@ -88,17 +100,21 @@ enum InactiveUpdateMode { # EXPONENTIALLY, } -#endregion - +enum FollowLockAxis { + NONE = 0, + X = 1, + Y = 2, + Z = 3, + XY = 4, + XZ = 5, + YZ = 6, + XYZ = 7, +} -#region Variables +#endregion -## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. -var pcam_host_owner: PhantomCameraHost = null: - set = set_pcam_host_owner, - get = get_pcam_host_owner -var _is_active: bool = false +#region Exported Properties ## To quickly preview a [param PhantomCamera3D] without adjusting its ## [member Priority], this property allows the selected [param PhantomCamera3D] @@ -140,7 +156,23 @@ var _is_active: bool = false set(value): follow_mode = value - if value == FollowMode.FRAMED: + if follow_mode == FollowMode.NONE: + _should_follow = false + top_level = false + _is_parents_physics() + notify_property_list_changed() + return + + match follow_mode: + FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow_checker() + FollowMode.GROUP: + _follow_targets_size_check() + _: + _should_follow_checker() + + if follow_mode == FollowMode.FRAMED: if _follow_framed_initial_set and follow_target: _follow_framed_initial_set = false dead_zone_changed.connect(_on_dead_zone_changed) @@ -148,32 +180,26 @@ var _is_active: bool = false if dead_zone_changed.is_connected(_on_dead_zone_changed): dead_zone_changed.disconnect(_on_dead_zone_changed) - if follow_mode == FollowMode.NONE: - _should_follow = false - elif follow_mode == FollowMode.GROUP and follow_targets or follow_target: - _should_follow = true + if follow_mode == FollowMode.THIRD_PERSON: + top_level = false + else: + top_level = true notify_property_list_changed() get: return follow_mode - ## Determines which target should be followed. ## The [param Camera3D] will follow the position of the Follow Target based on ## the [member follow_mode] type and its parameters. @export var follow_target: Node3D = null: set = set_follow_target, get = get_follow_target -var _should_follow: bool = false -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled = false ## TOOD - Should be anbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D ## Defines the targets that the [param PhantomCamera3D] should be following. @export var follow_targets: Array[Node3D] = []: set = set_follow_targets, get = get_follow_targets -var _has_multiple_follow_targets: bool = false - ## Determines the [Path3D] node the [param PhantomCamera3D] ## should be bound to. @@ -183,7 +209,6 @@ var _has_multiple_follow_targets: bool = false set = set_follow_path, get = get_follow_path - ## Determines the rotational logic for a given [param PhantomCamera3D]. ## The different modes has different functionalities and purposes, ## so choosing the correct mode depends on what each @@ -191,19 +216,20 @@ var _has_multiple_follow_targets: bool = false @export var look_at_mode: LookAtMode = LookAtMode.NONE: set(value): look_at_mode = value - if look_at_target is Node3D: - _should_look_at = true if look_at_mode == LookAtMode.NONE: _should_look_at = false - elif look_at_mode == LookAtMode.GROUP and look_at_targets or look_at_target: - _should_look_at = true + notify_property_list_changed() + return + if not look_at_mode == LookAtMode.GROUP: + if look_at_target is Node3D: + _should_look_at = true + else: # If Look At Group + _look_at_targets_size_check() notify_property_list_changed() get: return look_at_mode -var _should_look_at: bool = false -var _multiple_look_at_targets: bool = false ## Determines which target should be looked at. ## The [param PhantomCamera3D] will update its rotational value as the @@ -217,7 +243,6 @@ var _multiple_look_at_targets: bool = false @export var look_at_targets: Array[Node3D] = []: set = set_look_at_targets, get = get_look_at_targets -var _valid_look_at_targets: Array[Node3D] = [] ## Defines how [param ]PhantomCamera3Ds] transition between one another. ## Changing the tween values for a given [param PhantomCamera3D] @@ -229,7 +254,6 @@ var _valid_look_at_targets: Array[Node3D] = [] @export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): set = set_tween_resource, get = get_tween_resource -var _has_tweened: bool = false ## If enabled, the moment a [param PhantomCamera3D] is instantiated into ## a scene, and has the highest priority, it will perform its tween transition. @@ -252,10 +276,20 @@ var _has_tweened: bool = false ## A resource type that allows for overriding the [param Camera3D] node's ## properties. -@export var camera_3d_resource: Camera3DResource = Camera3DResource.new(): +@export var camera_3d_resource: Camera3DResource: # = Camera3DResource.new(): set = set_camera_3d_resource, get = get_camera_3d_resource +## Overrides the [member Camera3D.attribuets] resource property. +@export var attributes: CameraAttributes = null: + set = set_attributes, + get = get_attributes + +## Overrides the [member Camera3D.environment] resource property. +@export var environment: Environment = null: + set = set_environment, + get = get_environment + @export_group("Follow Parameters") ## Offsets the [member follow_target] position. @export var follow_offset: Vector3 = Vector3.ZERO: @@ -276,7 +310,16 @@ var _has_tweened: bool = false @export var follow_damping_value: Vector3 = Vector3(0.1, 0.1, 0.1): set = set_follow_damping_value, get = get_follow_damping_value -var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement + + +## Prevents the [param PhantomCamera2D] from moving in a designated axis. +## This can be enabled or disabled at runtime or from the editor directly. +@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: + set = set_follow_axis_lock, + get = get_follow_axis_lock +var _follow_axis_is_locked: bool = false +var _follow_axis_lock_value: Vector3 = Vector3.ZERO + ## Sets a distance offset from the centre of the target's position. ## The distance is applied to the [param PhantomCamera3D]'s local z axis. @@ -352,12 +395,8 @@ var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the veloci ## Defines the position of the [member follow_target] within the viewport.[br] ## This is only used for when [member follow_mode] is set to [param Framed]. -var viewport_position: Vector2 -var _follow_framed_initial_set: bool = false -var _follow_framed_offset: Vector3 @export_subgroup("Spring Arm") -var _follow_spring_arm: SpringArm3D ## Defines the [member SpringArm3D.spring_length]. @export var spring_length: float = 1: @@ -393,7 +432,7 @@ var _follow_spring_arm: SpringArm3D set = set_look_at_damping, get = get_look_at_damping -## Defines the Rotational damping amount. The ideal range is typicall somewhere between 0-1.[br][br] +## Defines the Rotational damping amount. The ideal range is typically somewhere between 0-1.[br][br] ## The damping amount can be specified in the individual axis.[br][br] ## [b]Lower value[/b] = faster / sharper camera rotation.[br] ## [b]Higher value[/b] = slower / heavier camera rotation. @@ -401,13 +440,123 @@ var _follow_spring_arm: SpringArm3D set = set_look_at_damping_value, get = get_look_at_damping_value -var _current_rotation: Vector3 + +@export_group("Noise") +## Applies a noise, or shake, to a [Camera3D].[br] +## Once set, the noise will run continuously after the tween to the [PhantomCamera3D] instance is complete. +@export var noise: PhantomCameraNoise3D: + set = set_noise, + get = get_noise + +## If true, will trigger the noise while in the editor.[br] +## Useful in cases where you want to temporarily disalbe the noise in the editor without removing +## the resource.[br][br] +## [b]Note:[/b] This property has no effect on runtime behaviour. +@export var _preview_noise: bool = true: + set(value): + _preview_noise = value + if not value: + _transform_noise = Transform3D() + +## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter3D.noise_emitter_layer] +## to make this [PhantomCamera3D] be affect by it. +@export_flags_3d_render var noise_emitter_layer: int: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer #endregion +#region Private Variables + +var _is_active: bool = false + +var _is_third_person_follow: bool = false + +var _should_follow: bool = false +var _follow_target_physics_based: bool = false +var _physics_interpolation_enabled: bool = false ## TOOD - Should be enbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D + +var _has_multiple_follow_targets: bool = false +var _follow_targets_single_target_index: int = 0 +var _follow_targets: Array[Node3D] + +var _should_look_at: bool = false +var _look_at_target_physics_based: bool = false + +var _has_multiple_look_at_targets: bool = false +var _look_at_targets_single_target_index: int = 0 + +var _tween_skip: bool = false + +var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement + +var _follow_framed_initial_set: bool = false +var _follow_framed_offset: Vector3 + +var _follow_spring_arm: SpringArm3D +var _has_follow_spring_arm: bool = false + +var _current_rotation: Vector3 + +var _has_noise_resource: bool = false + +var _transform_output: Transform3D +var _transform_noise: Transform3D + # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#endregion + +#region Public Variables + +## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. +var pcam_host_owner: PhantomCameraHost = null: + set = set_pcam_host_owner, + get = get_pcam_host_owner + +var tween_duration: float: + set = set_tween_duration, + get = get_tween_duration +var tween_transition: PhantomCameraTween.TransitionType: + set = set_tween_transition, + get = get_tween_transition +var tween_ease: PhantomCameraTween.EaseType: + set = set_tween_ease, + get = get_tween_ease + +var cull_mask: int: + set = set_cull_mask, + get = get_cull_mask +var h_offset: float: + set = set_h_offset, + get = get_h_offset +var v_offset: float: + set = set_v_offset, + get = get_v_offset +var projection: Camera3DResource.ProjectionType: + set = set_projection, + get = get_projection +var fov: float: + set = set_fov, + get = get_fov +var size: float: + set = set_size, + get = get_size +var frustum_offset: Vector2: + set = set_frustum_offset, + get = get_frustum_offset +var far: float: + set = set_far, + get = get_far +var near: float: + set = set_near, + get = get_near + +var viewport_position: Vector2 + +#endregion + #region Property Validator @@ -427,7 +576,6 @@ func _validate_property(property: Dictionary) -> void: #################### ## Follow Parameters #################### - if follow_mode == FollowMode.NONE: match property.name: "follow_offset", \ @@ -443,6 +591,10 @@ func _validate_property(property: Dictionary) -> void: if property.name == "follow_damping_value" and not follow_damping: property.usage = PROPERTY_USAGE_NO_EDITOR + if property.name == "follow_offset": + if follow_mode == FollowMode.PATH: + property.usage = PROPERTY_USAGE_NO_EDITOR + if property.name == "follow_distance": if not follow_mode == FollowMode.FRAMED: if not follow_mode == FollowMode.GROUP or \ @@ -460,7 +612,7 @@ func _validate_property(property: Dictionary) -> void: not follow_mode == FollowMode.GROUP: property.usage = PROPERTY_USAGE_NO_EDITOR - if not auto_follow_distance: + if not auto_follow_distance or not follow_mode == FollowMode.GROUP: match property.name: "auto_follow_distance_min", \ "auto_follow_distance_max", \ @@ -516,7 +668,6 @@ func _validate_property(property: Dictionary) -> void: not look_at_damping: property.usage = PROPERTY_USAGE_NO_EDITOR - notify_property_list_changed() #endregion #region Private Functions @@ -529,6 +680,14 @@ func _enter_tree() -> void: if not _phantom_camera_manager.get_phantom_camera_hosts().is_empty(): set_pcam_host_owner(_phantom_camera_manager.get_phantom_camera_hosts()[0]) + if not visibility_changed.is_connected(_check_visibility): + visibility_changed.connect(_check_visibility) + + _should_follow_checker() + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + elif follow_mode == FollowMode.NONE: + _is_parents_physics() #if not get_parent() is SpringArm3D: #if look_at_target: #_look_at_target_node = look_at_target @@ -542,195 +701,262 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_removed(self) + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_removed(self) if _has_valid_pcam_owner(): get_pcam_host_owner().pcam_removed_from_scene(self) + if not follow_mode == FollowMode.GROUP: + follow_targets = [] func _ready(): - if follow_mode == FollowMode.THIRD_PERSON: - if not Engine.is_editor_hint(): - if not is_instance_valid(_follow_spring_arm): - _follow_spring_arm = SpringArm3D.new() - _follow_spring_arm.top_level = true - _follow_spring_arm.rotation = global_rotation - _follow_spring_arm.position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position - _follow_spring_arm.spring_length = spring_length - _follow_spring_arm.collision_mask = collision_mask - _follow_spring_arm.shape = shape - _follow_spring_arm.margin = margin - get_parent().add_child.call_deferred(_follow_spring_arm) - reparent.call_deferred(_follow_spring_arm) - if follow_mode == FollowMode.FRAMED: - if not Engine.is_editor_hint(): - _follow_framed_offset = global_position - _get_target_position_offset() - _current_rotation = global_rotation + match follow_mode: + FollowMode.THIRD_PERSON: + _is_third_person_follow = true + if not Engine.is_editor_hint(): + if not is_instance_valid(_follow_spring_arm): + _follow_spring_arm = SpringArm3D.new() + _follow_spring_arm.top_level = true + _follow_spring_arm.rotation = global_rotation + _follow_spring_arm.spring_length = spring_length + _follow_spring_arm.collision_mask = collision_mask + if shape: + _follow_spring_arm.shape = shape + else: + _follow_spring_arm.shape = _get_camera_shape() + _follow_spring_arm.margin = margin + _follow_spring_arm.add_excluded_object(follow_target) + get_parent().add_child.call_deferred(_follow_spring_arm) + reparent.call_deferred(_follow_spring_arm) + + # Waits for the SpringArm3D to be ready and then apply rotation + # Resolves an issue most prominent in Godot 4.4 + await _follow_spring_arm.ready + _follow_spring_arm.position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position + _follow_spring_arm.global_rotation = global_rotation + _has_follow_spring_arm = true + FollowMode.FRAMED: + if not Engine.is_editor_hint(): + _follow_framed_offset = global_position - _get_target_position_offset() + _current_rotation = global_rotation + FollowMode.GROUP: + _follow_targets_size_check() + + if not Engine.is_editor_hint(): + _preview_noise = true + + ## NOTE - Only here to set position for Framed View on startup. + ## Should be removed once https://github.com/ramokz/phantom-camera/issues/161 is complete + _transform_output = global_transform + + _phantom_camera_manager.noise_3d_emitted.connect(_noise_emitted) func _process(delta: float) -> void: - if not _follow_target_physics_based: - _process_logic(delta) + if _follow_target_physics_based or _is_active: return + process_logic(delta) -func _physics_process(delta: float): - if _follow_target_physics_based: - _process_logic(delta) +func _physics_process(delta: float) -> void: + if not _follow_target_physics_based or _is_active: return + process_logic(delta) -func _process_logic(delta: float) -> void: - if not _is_active: +func process_logic(delta: float) -> void: + if _is_active: + if _has_noise_resource and _preview_noise: + _transform_noise = noise.get_noise_transform(delta) + else: match inactive_update_mode: - InactiveUpdateMode.NEVER: return + InactiveUpdateMode.NEVER: return # InactiveUpdateMode.EXPONENTIALLY: - # TODO - Trigger positional updates less frequently as more Pcams gets added + # TODO - Trigger positional updates less frequently as more PCams gets added + if _should_follow: _follow(delta) + else: + _transform_output.origin = global_transform.origin + if _should_look_at: - _look_at() # TODO - Delta needs to be applied, pending Godot's 3D Physics Interpolation to be implemented + _look_at(delta) + else: + _transform_output.basis = global_basis + + if _follow_axis_is_locked: + match follow_axis_lock: + FollowLockAxis.X: + _transform_output.origin.x = _follow_axis_lock_value.x + FollowLockAxis.Y: + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.Z: + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.XY: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.XZ: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.YZ: + _transform_output.origin.y = _follow_axis_lock_value.y + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.XYZ: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y + _transform_output.origin.z = _follow_axis_lock_value.z func _follow(delta: float) -> void: var follow_position: Vector3 - var follow_target_node: Node3D = self + var follow_target_node: Node3D = self # TODO - Think this can be removed match follow_mode: FollowMode.GLUED: - if follow_target: - follow_position = follow_target.global_position + follow_position = follow_target.global_position + FollowMode.SIMPLE: - if follow_target: - follow_position = _get_target_position_offset() + follow_position = _get_target_position_offset() + FollowMode.GROUP: - if follow_targets: - if follow_targets.size() == 1: - follow_position = \ - follow_targets[0].global_position + \ - follow_offset + \ - get_transform().basis.z * \ - Vector3(follow_distance, follow_distance, follow_distance) - - elif follow_targets.size() > 1: - var bounds: AABB = AABB(follow_targets[0].global_position, Vector3.ZERO) - for node in follow_targets: - if is_instance_valid(node): - bounds = bounds.expand(node.global_position) - - var distance: float - if auto_follow_distance: - distance = lerp(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor) - distance = clamp(distance, auto_follow_distance_min, auto_follow_distance_max) - else: - distance = follow_distance + if _has_multiple_follow_targets: + var bounds: AABB = AABB(_follow_targets[0].global_position, Vector3.ZERO) + for target in _follow_targets: + bounds = bounds.expand(target.global_position) + var distance: float + if auto_follow_distance: + distance = lerpf(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor) + distance = clampf(distance, auto_follow_distance_min, auto_follow_distance_max) + else: + distance = follow_distance - follow_position = \ - bounds.get_center() + \ - follow_offset + \ - get_transform().basis.z * \ - Vector3(distance, distance, distance) - FollowMode.PATH: - if follow_target and follow_path: - var path_position: Vector3 = follow_path.global_position follow_position = \ - follow_path.curve.get_closest_point( - follow_target.global_position - path_position - ) + path_position + bounds.get_center() + \ + follow_offset + \ + get_transform().basis.z * \ + Vector3(distance, distance, distance) + else: + follow_position = \ + follow_targets[_follow_targets_single_target_index].global_position + \ + follow_offset + \ + get_transform().basis.z * \ + Vector3(follow_distance, follow_distance, follow_distance) + + FollowMode.PATH: + var path_position: Vector3 = follow_path.global_position + follow_position = \ + follow_path.curve.get_closest_point( + follow_target.global_position - path_position + ) + path_position + FollowMode.FRAMED: - if follow_target: - if not Engine.is_editor_hint(): - if not _is_active || get_pcam_host_owner().get_trigger_pcam_tween(): - follow_position = _get_position_offset_distance() - _interpolate_position(follow_position, delta) - return - - viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) - var visible_rect_size: Vector2 = get_viewport().get_viewport().size - viewport_position = viewport_position / visible_rect_size - _current_rotation = global_rotation + if not Engine.is_editor_hint(): + if not _is_active || get_pcam_host_owner().get_trigger_pcam_tween(): + follow_position = _get_position_offset_distance() + _interpolate_position(follow_position, delta) + return + + viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) + var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size + viewport_position = viewport_position / visible_rect_size + _current_rotation = global_rotation - if _current_rotation != global_rotation: - follow_position = _get_position_offset_distance() - - if _get_framed_side_offset() != Vector2.ZERO: - var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset - var glo_pos: Vector3 - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - glo_pos = _get_position_offset_distance() - glo_pos.z = target_position.z - follow_position = glo_pos - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _get_position_offset_distance() - glo_pos.x = target_position.x - follow_position = glo_pos - else: - follow_position = _get_position_offset_distance() + if _current_rotation != global_rotation: + follow_position = _get_position_offset_distance() + + if _get_framed_side_offset() != Vector2.ZERO: + var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset + var glo_pos: Vector3 + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + glo_pos = _get_position_offset_distance() + glo_pos.z = target_position.z + follow_position = glo_pos + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _get_position_offset_distance() + glo_pos.x = target_position.x + follow_position = glo_pos else: - if _current_rotation != global_rotation: - var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y - glo_pos.y = _get_target_position_offset().y + opposite - glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z - glo_pos.x = global_position.x - - follow_position = glo_pos - _current_rotation = global_rotation - else: - follow_position = target_position + follow_position = _get_position_offset_distance() else: - _follow_framed_offset = global_position - _get_target_position_offset() - _current_rotation = global_rotation - return + if _current_rotation != global_rotation: + var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y + glo_pos.y = _get_target_position_offset().y + opposite + glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z + glo_pos.x = global_position.x + + follow_position = glo_pos + _current_rotation = global_rotation + else: + dead_zone_reached.emit() + follow_position = target_position else: - follow_position = _get_position_offset_distance() - var unprojected_position: Vector2 = _get_raw_unprojected_position() - var viewport_width: float = get_viewport().size.x - var viewport_height: float = get_viewport().size.y - var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect - var visible_rect_size: Vector2 = get_viewport().get_viewport().size - - unprojected_position = unprojected_position - visible_rect_size / 2 - if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: -# Landscape View - var aspect_ratio_scale: float = viewport_width / viewport_height - unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 - unprojected_position.y = (unprojected_position.y + 1) / 2 - else: -# Portrait View - var aspect_ratio_scale: float = viewport_height / viewport_width - unprojected_position.x = (unprojected_position.x + 1) / 2 - unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + _follow_framed_offset = global_position - _get_target_position_offset() + _current_rotation = global_rotation + return + else: + follow_position = _get_position_offset_distance() + var unprojected_position: Vector2 = _get_raw_unprojected_position() + var viewport_width: float = get_viewport().size.x + var viewport_height: float = get_viewport().size.y + var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect + var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size + + unprojected_position = unprojected_position - visible_rect_size / 2 + if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: + # Landscape View + var aspect_ratio_scale: float = viewport_width / viewport_height + unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 + unprojected_position.y = (unprojected_position.y + 1) / 2 + else: + # Portrait View + var aspect_ratio_scale: float = viewport_height / viewport_width + unprojected_position.x = (unprojected_position.x + 1) / 2 + unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + + viewport_position = unprojected_position - viewport_position = unprojected_position FollowMode.THIRD_PERSON: - if follow_target: - if not Engine.is_editor_hint(): - if is_instance_valid(follow_target) and is_instance_valid(_follow_spring_arm): - follow_position = _get_target_position_offset() - follow_target_node = _follow_spring_arm - else: - follow_position = _get_position_offset_distance() + if not Engine.is_editor_hint(): + if not _has_follow_spring_arm: return + follow_position = _get_target_position_offset() + follow_target_node = _follow_spring_arm + else: + follow_position = _get_position_offset_distance() _interpolate_position(follow_position, delta, follow_target_node) -func _look_at() -> void: +func _look_at(delta: float) -> void: match look_at_mode: LookAtMode.MIMIC: - global_rotation = look_at_target.global_rotation + _interpolate_rotation( + global_position - look_at_target.basis.z, + delta + ) + LookAtMode.SIMPLE: - _interpolate_rotation(look_at_target.global_position) + _interpolate_rotation( + look_at_target.global_position, + delta + ) + LookAtMode.GROUP: - if not _multiple_look_at_targets: - if look_at_targets.size() == 0: return - _interpolate_rotation(look_at_targets[0].global_position) + if not _has_multiple_look_at_targets: + _interpolate_rotation( + look_at_targets[_look_at_targets_single_target_index].global_position, + delta + ) else: var bounds: AABB = AABB(look_at_targets[0].global_position, Vector3.ZERO) for node in look_at_targets: bounds = bounds.expand(node.global_position) - _interpolate_rotation(bounds.get_center()) + _interpolate_rotation( + bounds.get_center(), + delta + ) func _get_target_position_offset() -> Vector3: @@ -739,35 +965,54 @@ func _get_target_position_offset() -> Vector3: func _get_position_offset_distance() -> Vector3: return _get_target_position_offset() + \ - get_transform().basis.z * Vector3(follow_distance, follow_distance, follow_distance) + transform.basis.z * Vector3(follow_distance, follow_distance, follow_distance) func _set_follow_velocity(index: int, value: float) -> void: _follow_velocity_ref[index] = value + + func _interpolate_position(target_position: Vector3, delta: float, camera_target: Node3D = self) -> void: if follow_damping: - for index in 3: - camera_target.global_position[index] = _smooth_damp( - target_position[index], - camera_target.global_position[index], - index, - _follow_velocity_ref[index], - _set_follow_velocity, - follow_damping_value[index] - ) + if not _is_third_person_follow: + global_position = target_position + for i in 3: + _transform_output.origin[i] = _smooth_damp( + global_position[i], + _transform_output.origin[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + else: + for i in 3: + if _is_third_person_follow: + camera_target.global_position[i] = _smooth_damp( + target_position[i], + camera_target.global_position[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + _transform_output.origin = global_position + _transform_output.basis = global_basis else: camera_target.global_position = target_position + _transform_output.origin = global_position -func _interpolate_rotation(target_trans: Vector3) -> void: +func _interpolate_rotation(target_trans: Vector3, delta: float) -> void: var direction: Vector3 = (target_trans - global_position + look_at_offset).normalized() var target_basis: Basis = Basis().looking_at(direction) var target_quat: Quaternion = target_basis.get_rotation_quaternion().normalized() if look_at_damping: var current_quat: Quaternion = quaternion.normalized() - var damping_time: float = max(0.0001, look_at_damping_value) - var t: float = min(1.0, get_process_delta_time() / damping_time) + var t: float = min(1.0, delta / damping_time) var dot: float = current_quat.dot(target_quat) @@ -787,16 +1032,18 @@ func _interpolate_rotation(target_trans: Vector3) -> void: var ratio_a: float = cos(theta) - dot * sin_theta / sin_theta_total var ratio_b: float = sin_theta / sin_theta_total + var output: Quaternion = current_quat * ratio_a + target_quat * ratio_b - quaternion = current_quat * ratio_a + target_quat * ratio_b + _transform_output.basis = Basis(output) + quaternion = output else: + _transform_output.basis = Basis(target_quat) quaternion = target_quat -func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, rot: bool = false) -> float: +func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: damping_time = maxf(0.0001, damping_time) var omega: float = 2 / damping_time - var delta: float = get_process_delta_time() var x: float = omega * delta var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x) var diff: float = self_axis - target_axis @@ -847,6 +1094,7 @@ func _get_framed_side_offset() -> Vector2: return frame_out_bounds + func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: var mask: int = current_layers @@ -861,13 +1109,143 @@ func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: return mask + func _has_valid_pcam_owner() -> bool: if not is_instance_valid(get_pcam_host_owner()): return false if not is_instance_valid(get_pcam_host_owner().camera_3d): return false return true + +func _check_visibility() -> void: + if not is_instance_valid(pcam_host_owner): return + pcam_host_owner.refresh_pcam_list_priorty() + + +func _follow_target_tree_exiting(target: Node) -> void: + if target == follow_target: + _should_follow = false + if _follow_targets.has(target): + _follow_targets.erase(target) + + +func _should_follow_checker() -> void: + if follow_mode == FollowMode.NONE: + _should_follow = false + return + + if not follow_mode == FollowMode.GROUP: + if is_instance_valid(follow_target): + _should_follow = true + else: + _should_follow = false + + +func _follow_targets_size_check() -> void: + var targets_size: int = 0 + _follow_target_physics_based = false + _follow_targets = [] + for i in follow_targets.size(): + if follow_targets[i] == null: continue + if follow_targets[i].is_inside_tree(): + _follow_targets.append(follow_targets[i]) + targets_size += 1 + _follow_targets_single_target_index = i + _check_physics_body(follow_targets[i]) + if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): + follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) + + match targets_size: + 0: + _should_follow = false + _has_multiple_follow_targets = false + 1: + _should_follow = true + _has_multiple_follow_targets = false + _: + _should_follow = true + _has_multiple_follow_targets = true + + +func _get_camera_shape() -> Shape3D: + if not _has_valid_pcam_owner(): return + + var pyramid_shape_data = PhysicsServer3D.shape_get_data( + get_pcam_host_owner().camera_3d.get_pyramid_shape_rid() + ) + + var shape = ConvexPolygonShape3D.new() + shape.points = pyramid_shape_data + + return shape + + +func _look_at_target_tree_exiting(target: Node) -> void: + if target == look_at_target: + _should_look_at = false + if look_at_targets.has(target): + erase_look_at_targets(target) + + +func _look_at_targets_size_check() -> void: + var targets_size: int = 0 + _look_at_target_physics_based = false + + for i in look_at_targets.size(): + if is_instance_valid(look_at_targets[i]): + targets_size += 1 + _look_at_targets_single_target_index = i + _check_physics_body(look_at_targets[i]) + if not look_at_targets[i].tree_exiting.is_connected(_look_at_target_tree_exiting): + look_at_targets[i].tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_targets[i])) + + match targets_size: + 0: + _should_look_at = false + _has_multiple_look_at_targets = false + 1: + _should_look_at = true + _has_multiple_look_at_targets = false + _: + _should_look_at = true + _has_multiple_look_at_targets = true + + +func _noise_emitted(emitter_noise_output: Transform3D, emitter_layer: int) -> void: + if noise_emitter_layer & emitter_layer != 0: + noise_emitted.emit(emitter_noise_output) + + +func _check_physics_body(target: Node3D) -> void: + if target is PhysicsBody3D: + ## NOTE - Feature Toggle + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor < 4: + if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.") + print_rich("If possible, will recommend upgrading to Godot 4.4, as it has built-in support for 3D Physics Interpolation, which will mitigate this issue.") + print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + return + ## NOTE - Only supported in Godot 4.4 or above + elif not ProjectSettings.get_setting("physics/common/physics_interpolation"): + printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + _follow_target_physics_based = true + else: + _is_parents_physics(target) + physics_target_changed.emit() + + +func _is_parents_physics(target: Node = self) -> void: + var current_node: Node = target + while current_node: + current_node = current_node.get_parent() + if not current_node is PhysicsBody3D: continue + _follow_target_physics_based = true + #endregion + # TBD #func get_unprojected_position() -> Vector2: #var unprojected_position: Vector2 = _get_raw_unprojected_position() @@ -891,19 +1269,34 @@ func _has_valid_pcam_owner() -> bool: #return unprojected_position +## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. +func get_transform_output() -> Transform3D: + return _transform_output + + +## Returns the noise [Transform3D] value. +func get_noise_transform() -> Transform3D: + return _transform_noise + + +## Emits a noise based on a custom [Transform3D] value.[br] +## Use this function if you wish to make use of external noise patterns from, for example, other addons. +func emit_noise(value: Transform3D) -> void: + noise_emitted.emit(value) + #region Setter & Getter Functions ## Assigns the value of the [param has_tweened] property.[br] ## [b][color=yellow]Important:[/color][/b] This value can only be changed ## from the [PhantomCameraHost] script. -func set_has_tweened(caller: Node, value: bool) -> void: +func set_tween_skip(caller: Node, value: bool) -> void: if is_instance_of(caller, PhantomCameraHost): - _has_tweened = value + _tween_skip = value else: printerr("Can only be called PhantomCameraHost class") ## Returns the current [param has_tweened] value. -func get_has_tweened() -> bool: - return _has_tweened +func get_tween_skip() -> bool: + return _tween_skip ## Assigns the [param PhantomCamera3D] to a new [PhantomCameraHost].[br] @@ -980,6 +1373,8 @@ func get_tween_ease() -> int: func set_is_active(node: Node, value: bool) -> void: if node is PhantomCameraHost: _is_active = value + if value: + _should_follow_checker() else: printerr("PCams can only be set from the PhantomCameraHost") ## Gets current active state of the [param PhantomCamera3D]. @@ -1006,24 +1401,29 @@ func get_follow_mode() -> int: ## Assigns a new [Node3D] as the [member follow_target]. func set_follow_target(value: Node3D) -> void: + if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return if follow_target == value: return follow_target = value - _follow_target_physics_based = false if is_instance_valid(value): - _should_follow = true + if follow_mode == FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow = true + else: + _should_follow = false + else: + _should_follow = true _check_physics_body(value) + if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): + follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) else: - _should_follow = false + if not follow_mode == FollowMode.GROUP: + _should_follow = false follow_target_changed.emit() notify_property_list_changed() ## Removes the current [Node3D] [member follow_target]. func erase_follow_target() -> void: - if follow_target == null: return - _follow_target_physics_based = false - _should_follow = false follow_target = null - follow_target_changed.emit() ## Gets the current Node3D target. func get_follow_target() -> Node3D: return follow_target @@ -1032,9 +1432,15 @@ func get_follow_target() -> Node3D: ## Assigns a new [Path3D] to the [member follow_path] property. func set_follow_path(value: Path3D) -> void: follow_path = value + if is_instance_valid(follow_path): + _should_follow_checker() + else: + _should_follow = false + ## Erases the current [Path3D] from [member follow_path] property. func erase_follow_path() -> void: follow_path = null + ## Gets the current [Path3D] from the [member follow_path] property. func get_follow_path() -> Path3D: return follow_path @@ -1042,88 +1448,44 @@ func get_follow_path() -> Path3D: ## Assigns a new [param follow_targets] array value. func set_follow_targets(value: Array[Node3D]) -> void: + if not follow_mode == FollowMode.GROUP: return if follow_targets == value: return - follow_targets = value + _follow_targets_size_check() - if follow_targets.is_empty(): - _should_follow = false - _has_multiple_follow_targets = false - _follow_target_physics_based = false - return - - var valid_instances: int - _follow_target_physics_based = false - for target in follow_targets: - if is_instance_valid(target): - _should_follow = true - valid_instances += 1 - - _check_physics_body(target) - if valid_instances > 1: - _has_multiple_follow_targets = true ## Adds a single [Node3D] to [member follow_targets] array. func append_follow_targets(value: Node3D) -> void: if not is_instance_valid(value): - printerr(value, " is not a valid instance") + printerr(value, " is not a valid Node3D instance") return if not follow_targets.has(value): follow_targets.append(value) - _should_follow = true - _has_multiple_follow_targets = true - _check_physics_body(value) + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") + ## Adds an Array of type [Node3D] to [member follow_targets] array. func append_follow_targets_array(value: Array[Node3D]) -> void: for target in value: if not is_instance_valid(target): continue if not follow_targets.has(target): follow_targets.append(target) - _should_follow = true - _check_physics_body(target) - if follow_targets.size() > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") + ## Removes [Node3D] from [member follow_targets]. func erase_follow_targets(value: Node3D) -> void: follow_targets.erase(value) - _follow_target_physics_based = false - for target in follow_targets: - _check_physics_body(target) + _follow_targets_size_check() + - if follow_targets.size() < 2: - _has_multiple_follow_targets = false - if follow_targets.size() < 1: - _should_follow = false ## Gets all [Node3D] from [follow_targets]. func get_follow_targets() -> Array[Node3D]: return follow_targets -## Returns true if the [param PhantomCamera3D] has more than one member in the -## [member follow_targets] array. -func get_has_multiple_follow_targets() -> bool: - return _has_multiple_follow_targets - -func _check_physics_body(target: Node3D) -> void: - if target is PhysicsBody3D: - ## NOTE - Feature Toggle - #if Engine.get_version_info().major == 4 and \ - #Engine.get_version_info().minor < XX: - if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("Will have proper support once 3D Physics Interpolation becomes part of the core Godot engine.") - print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## TODO - Enable once Godot supports 3D Physics Interpolation - #elif not ProjectSettings.get_setting("physics/common/physics_interpolation"): - #printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - #_follow_target_physics_based = true - ## Assigns a new [param Vector3] for the [param follow_offset] property. func set_follow_offset(value: Vector3) -> void: @@ -1272,7 +1634,10 @@ func get_collision_mask() -> int: func set_shape(value: Shape3D) -> void: shape = value if is_instance_valid(_follow_spring_arm): - _follow_spring_arm.shape = shape + if shape: + _follow_spring_arm.shape = shape + else: + _follow_spring_arm.shape = _get_camera_shape() ## Gets [param ThirdPerson] [member SpringArm3D.shape] value. func get_shape() -> Shape3D: @@ -1294,86 +1659,81 @@ func get_margin() -> float: ## Gets the current [member look_at_mode]. Value is based on [enum LookAtMode] ## enum.[br] -## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should -## be used. +## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should be used. func get_look_at_mode() -> int: return look_at_mode ## Assigns new [Node3D] as [member look_at_target]. func set_look_at_target(value: Node3D) -> void: + if look_at_mode == LookAtMode.NONE: return + if look_at_target == value: return look_at_target = value - _check_physics_body(value) - #_look_at_target_node = get_node_or_null(value) - look_at_target_changed - if is_instance_valid(look_at_target): - _should_look_at = true - else: + if not look_at_mode == LookAtMode.GROUP: + if is_instance_valid(look_at_target): + _should_look_at = true + _check_physics_body(value) + if not look_at_target.tree_exiting.is_connected(_look_at_target_tree_exiting): + look_at_target.tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_target)) + else: + _should_look_at = false + elif look_at_targets.size() == 0: _should_look_at = false + + look_at_target_changed.emit() notify_property_list_changed() ## Gets current [Node3D] from [member look_at_target] property. -func get_look_at_target(): +func get_look_at_target() -> Node3D: return look_at_target ## Sets an array of type [Node3D] to [member set_look_at_targets]. func set_look_at_targets(value: Array[Node3D]) -> void: + if not look_at_mode == LookAtMode.GROUP: return if look_at_targets == value: return look_at_targets = value - if look_at_mode != LookAtMode.GROUP: return - - if look_at_targets.is_empty(): - _should_look_at = false - _multiple_look_at_targets = false - else: - var valid_instances: int = 0 - for target in look_at_targets: - if is_instance_valid(target): - valid_instances += 1 - _should_look_at = true - _valid_look_at_targets.append(target) - _check_physics_body(target) - - if valid_instances > 1: - _multiple_look_at_targets = true - elif valid_instances == 0: - _should_look_at = false - _multiple_look_at_targets = false + _look_at_targets_size_check() notify_property_list_changed() ## Appends a [Node3D] to [member look_at_targets] array. func append_look_at_target(value: Node3D) -> void: + if not is_instance_valid(value): + printerr(value, "is an invalid Node3D instance") + return + if not look_at_targets.has(value): look_at_targets.append(value) - _valid_look_at_targets.append(value) - _check_physics_body(value) - if look_at_targets.size() > 1: - _multiple_look_at_targets = true + _look_at_targets_size_check() else: printerr(value, " is already part of Look At Group") + ## Appends an array of type [Node3D] to [member look_at_targets] array. -func append_look_at_targets_array(value: Array[NodePath]) -> void: +func append_look_at_targets_array(value: Array[Node3D]) -> void: for val in value: - if not look_at_targets.has(get_node(val)): - var node: Node3D = get_node(val) - look_at_targets.append(node) - _valid_look_at_targets.append(node) - _check_physics_body(node) - if look_at_targets.size() > 1: - _multiple_look_at_targets = true + if not is_instance_valid(val): continue + if not look_at_targets.has(val): + look_at_targets.append(val) + _look_at_targets_size_check() else: printerr(val, " is already part of Look At Group") ## Removes [Node3D] from [member look_at_targets] array. +func erase_look_at_targets(value: Node3D) -> void: + if look_at_targets.has(value): + look_at_targets.erase(value) + _look_at_targets_size_check() + else: + printerr(value, " is not part of Look At Group") + + +## Removes [Node3D] from [member look_at_targets] array. [br] +## @deprecated: Use [member erase_look_at_targets] instead. func erase_look_at_targets_member(value: Node3D) -> void: - look_at_targets.erase(value) - _valid_look_at_targets.erase(value) - _check_physics_body(value) - if look_at_targets.size() < 1: - _multiple_look_at_targets = false + printerr("erase_look_at_targets_member is deprecated, use erase_look_at_targets instead") + erase_look_at_targets(value) ## Gets all the [Node3D] instances in [member look_at_targets]. func get_look_at_targets() -> Array[Node3D]: @@ -1408,6 +1768,69 @@ func get_look_at_damping_value() -> float: return look_at_damping_value +func set_follow_axis_lock(value: FollowLockAxis) -> void: + follow_axis_lock = value + + # Wait for the node to be ready before setting lock + if not is_node_ready(): await ready + + # Prevent axis lock from working in the editor + if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): + _follow_axis_is_locked = true + match value: + FollowLockAxis.X: + _follow_axis_lock_value.x = _transform_output.origin.x + FollowLockAxis.Y: + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.Z: + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.XY: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.XZ: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.YZ: + _follow_axis_lock_value.y = _transform_output.origin.y + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.XYZ: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + _follow_axis_lock_value.z = _transform_output.origin.z + else: + _follow_axis_is_locked = false + +func get_follow_axis_lock() -> FollowLockAxis: + return follow_axis_lock + + +## Sets a [PhantomCameraNoise3D] resource +func set_noise(value: PhantomCameraNoise3D) -> void: + noise = value + if value != null: + _has_noise_resource = true + noise.set_trauma(1) + else: + _has_noise_resource = false + _transform_noise = Transform3D() + +func get_noise() -> PhantomCameraNoise3D: + return noise + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + ## Sets [member inactive_update_mode] property. func set_inactive_update_mode(value: int) -> void: inactive_update_mode = value @@ -1446,6 +1869,24 @@ func get_cull_mask() -> int: return camera_3d_resource.cull_mask +## Assigns a new [Environment] resource to the [Camera3DResource]. +func set_environment(value: Environment): + environment = value + +## Gets the [Camera3D.environment] value assigned to the [Camera3DResource]. +func get_environment() -> Environment: + return environment + + +## Assigns a new [CameraAttributes] resource to the [Camera3DResource]. +func set_attributes(value: CameraAttributes): + attributes = value + +## Gets the [Camera3D.attributes] value assigned to the [Camera3DResource]. +func get_attributes() -> CameraAttributes: + return attributes + + ## Assigns a new [member Camera3D.h_offset] value.[br] ## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to ## this [param PhantomCamera3D]. @@ -1542,12 +1983,6 @@ func get_far() -> float: return camera_3d_resource.far -func set_follow_target_physics_based(value: bool, caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _follow_target_physics_based = value - else: - printerr("set_follow_target_physics_based is for internal use only.") - func get_follow_target_physics_based() -> bool: return _follow_target_physics_based diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid new file mode 100644 index 0000000..7f71a40 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid @@ -0,0 +1 @@ +uid://dx2xjqphsq8th diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid new file mode 100644 index 0000000..52f2d43 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid @@ -0,0 +1 @@ +uid://dr0hukwkwxmdi diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd new file mode 100644 index 0000000..df2a70a --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd @@ -0,0 +1,264 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg") +class_name PhantomCameraNoiseEmitter2D +extends Node2D + +## Emits positional and rotational noise to active [PhantomCamera2D]s and its corresponding [Camera2D]. +## +## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera2D]. +## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a +## bit of slight movement to the camera to make it feel less static. +## The emitter can affect multiple [PhantomCamera2D] in a given scene based on which [member noise_emitter_layer] +## are enabled by calling its [method emit] function. At least one corresponding layer has to be +## set on the [PhantomCamera2D] and the emitter node. + +const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +#region Exported Proerpties + +## The [PhantomCameraNoise2D] resource that defines the noise pattern. +@export var noise: PhantomCameraNoise2D = null: + set = set_noise, + get = get_noise + +## If true, previews the noise in the editor - can be seen in the viewfinder. +@export var preview: bool = false: + set(value): + preview = value + _play = value + get: + return preview + +## If true, repeats the noise indefinitely once started. Otherwise, it will only be triggered once. [br] +@export var continuous: bool = false: + set = set_continuous, + get = get_continuous + +## Determines how long the noise should take to reach full [member intensity] once started.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: + set = set_growth_time, + get = get_growth_time + +## Sets the duration for the camera noise if [member continuous] is set to [b]false[/b].[br][br] +## The value is set in [b]seconds[/b]. +@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: + set = set_duration, + get = get_duration + +## Determines how long the noise should take to come to a full stop.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: + set = set_decay_time, + get = get_decay_time + +## Enabled layers will affect [PhantomCamera2D] nodes with at least one corresponding layer enabled.[br] +## Enabling multiple corresponding layers on the same [PhantomCamera2D] causes no additional effect. +@export_flags_2d_render var noise_emitter_layer: int = 1: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#endregion + + +#region Private Variables + +var _play: bool = false: + set(value): + _play = value + if value: + _elasped_play_time = 0 + _decay_countdown = 0 + _play = true + _should_grow = true + _start_duration_countdown = false + _should_decay = false + else: + _should_decay = true + if noise.randomize_noise_seed: + noise.noise_seed = randi() & 1000 + else: + noise.reset_noise_time() + get: + return _play + +var _start_duration_countdown: bool = false + +var _decay_countdown: float = 0 + +var _should_grow: bool = false + +var _should_decay: bool = false + +var _elasped_play_time: float = 0 + +var _noise_output: Transform2D = Transform2D() + +# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. +var _phantom_camera_manager: Node + +#endregion + +#region Private Functions + +func _get_configuration_warnings() -> PackedStringArray: + if noise == null: + return ["Noise resource is required in order to trigger emitter."] + else: + return [] + + +func _validate_property(property) -> void: + if property.name == "duration" and continuous: + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _enter_tree() -> void: + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) + + +func _process(delta: float) -> void: + if not _play and not _should_decay: return + if noise == null: + printerr("Noise resource missing in ", name) + _play = false + return + + _elasped_play_time += delta + + if _should_grow: + noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) + if _elasped_play_time >= growth_time: + _should_grow = false + _start_duration_countdown = true + noise.set_trauma(1) + else: + noise.set_trauma(1) + + if not continuous: + if _start_duration_countdown: + if _elasped_play_time >= duration + growth_time: + _should_decay = true + _start_duration_countdown = false + + if _should_decay: + _decay_countdown += delta + noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) + if _decay_countdown >= decay_time: + noise.set_trauma(0) + _play = false + preview = false + _should_decay = false + _elasped_play_time = 0 + _decay_countdown = 0 + + _noise_output = noise.get_noise_transform(delta) + _phantom_camera_manager.noise_2d_emitted.emit(_noise_output, noise_emitter_layer) + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + +#endregion + + +#region Public Functions + +## Emits noise to the [PhantomCamera2D]s that has at least one matching layers. +func emit() -> void: + if _play: _play = false + _play = true + +## Returns the state for the emitter. If true, the emitter is currently emitting. +func is_emitting() -> bool: + return _play + +## Stops the emitter from emitting noise. +func stop(should_decay: bool = true) -> void: + if should_decay: + _should_decay = true + else: + _play = false + +## Toggles the emitter on and off. +func toggle() -> void: + _play = !_play + +#endregion + + +#region Setter & Getter Functions + +## Sets the [member noise] resource. +func set_noise(value: PhantomCameraNoise2D) -> void: + noise = value + update_configuration_warnings() + +## Returns the [member noise] resource. +func get_noise() -> PhantomCameraNoise2D: + return noise + + +## Sets the [member continous] value. +func set_continuous(value: bool) -> void: + continuous = value + notify_property_list_changed() + +## Gets the [member continous] value. +func get_continuous() -> bool: + return continuous + + +## Sets the [member growth_time] value. +func set_growth_time(value: float) -> void: + growth_time = value + +## Returns the [member growth_time] value. +func get_growth_time() -> float: + return growth_time + + +## Sets the [member duration] value. +func set_duration(value: float) -> void: + duration = value + if duration == 0: + duration = 0.001 + +## Returns the [member duration] value. +func get_duration() -> float: + return duration + + +## Sets the [member decay_time] value. +func set_decay_time(value: float) -> void: + decay_time = value + +## Returns the [member decay_time] value. +func get_decay_time() -> float: + return decay_time + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] value. +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + +#endregion \ No newline at end of file diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid new file mode 100644 index 0000000..541fe0d --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid @@ -0,0 +1 @@ +uid://bw365gklqyl3d diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd new file mode 100644 index 0000000..8e009ed --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd @@ -0,0 +1,266 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg") +class_name PhantomCameraNoiseEmitter3D +extends Node3D + +## Emits positional and rotational noise to active [PhantomCamera3D]s and its corresponding [Camera3D]. +## +## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera3D]. +## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a +## bit of slight movement to the camera to make it feel less static. +## The emitter can affect multiple [PhantomCamera3D] in a given scene based on which [member noise_emitter_layer] +## are enabled by calling its [method emit] function. At least one corresponding layer has to be +## set on the [PhantomCamera3D] and the emitter node. + +const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +#region Exported Properties + +## The [PhantomCameraNoise3D] resource that defines the noise pattern. +@export var noise: PhantomCameraNoise3D = null: + set = set_noise, + get = get_noise + +## If true, previews the noise in the Viewfinder. +@export var preview: bool = false: + set(value): + preview = value + _play = value + get: + return preview + +## If true, repeats the noise indefinitely once started.Otherwise, it will only be triggered once. [br] +## [b]Note:[/b] This will always be enabled if the resource is assigned the the [PhantomCamera3D]'s +## [member PhantomCamera3D.noise] property. +@export var continuous: bool = false: + set = set_continuous, + get = get_continuous + +## Determines how long the noise should take to reach full [member intensity] once started.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: + set = set_growth_time, + get = get_growth_time + +## Sets the duration for the camera noise if [member loop] is set to false.[br] +## If the duration is [param 0] then [member continous] becomes enabled.[br] +## The value is set in [b]seconds[/b]. +@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: + set = set_duration, + get = get_duration + +## Determines how long the noise should take to come to a full stop.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: + set = set_decay_time, + get = get_decay_time + +## Enabled layers will affect [PhantomCamera3D] nodes with at least one corresponding layer enabled.[br] +## Enabling multiple corresponding layers on the same [PhantomCamera3D] causes no additional effect. +@export_flags_3d_render var noise_emitter_layer: int = 1: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#endregion + +#region Private Variables + +var _play: bool = false: + set(value): + _play = value + if value: + _elasped_play_time = 0 + _decay_countdown = 0 + _play = true + _should_grow = true + _start_duration_countdown = false + _should_decay = false + else: + _should_decay = true + if noise.randomize_noise_seed: + noise.noise_seed = randi() & 1000 + else: + noise.reset_noise_time() + get: + return _play + +var _start_duration_countdown: bool = false + +var _decay_countdown: float = 0 + +var _should_grow: bool = false + +var _should_decay: bool = false + +var _elasped_play_time: float = 0 + +var _noise_output: Transform3D = Transform3D() + +# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. +var _phantom_camera_manager: Node + +#endregion + +#region Private Functions + +func _get_configuration_warnings() -> PackedStringArray: + if noise == null: + return ["Noise resource is required in order to trigger emitter."] + else: + return [] + + +func _validate_property(property) -> void: + if property.name == "duration" and continuous: + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _enter_tree() -> void: + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) + + +func _process(delta: float) -> void: + if not _play and not _should_decay: return + if noise == null: + printerr("Noise resource missing in ", name) + _play = false + return + + _elasped_play_time += delta + + if _should_grow: + noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) + if _elasped_play_time >= growth_time: + _should_grow = false + _start_duration_countdown = true + noise.set_trauma(1) + + if not continuous: + if _start_duration_countdown: + if _elasped_play_time >= duration + growth_time: + _should_decay = true + _start_duration_countdown = false + + if _should_decay: + _decay_countdown += delta + noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) + if _decay_countdown >= decay_time: + noise.set_trauma(0) + _play = false + preview = false + _should_decay = false + _elasped_play_time = 0 + _decay_countdown = 0 + + _noise_output = noise.get_noise_transform(delta) + _phantom_camera_manager.noise_3d_emitted.emit(_noise_output, noise_emitter_layer) + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + +#endregion + +#region Public Functions + +## Emits noise to the [PhantomCamera3D]s that has at least one matching layers. +func emit() -> void: + if _play: _play = false + _play = true + + +## Returns the state for the emitter. If true, the emitter is currently emitting. +func is_emitting() -> bool: + return _play + + +## Stops the emitter from emitting noise. +func stop(should_decay: bool = true) -> void: + if should_decay: + _should_decay = true + else: + _play = false + + +## Toggles the emitter on and off.[br] +func toggle() -> void: + _play = !_play + +#endregion + +#region Setter & Getter Functions + +## Sets the [member noise] resource. +func set_noise(value: PhantomCameraNoise3D) -> void: + noise = value + update_configuration_warnings() + +## Returns the [member noise] resource. +func get_noise() -> PhantomCameraNoise3D: + return noise + + +## Sets the [member continous] value. +func set_continuous(value: bool) -> void: + continuous = value + notify_property_list_changed() + +## Gets the [member continous] value. +func get_continuous() -> bool: + return continuous + + +## Sets the [member growth_time] value. +func set_growth_time(value: float) -> void: + growth_time = value + +## Returns the [member growth_time] value. +func get_growth_time() -> float: + return growth_time + + +## Sets the [member duration] value. +func set_duration(value: float) -> void: + duration = value + if duration == 0: + duration = 0.001 + +## Returns the [member duration] value. +func get_duration() -> float: + return duration + + +## Sets the [member decay_time] value. +func set_decay_time(value: float) -> void: + decay_time = value + +## Returns the [member decay_time] value. +func get_decay_time() -> float: + return decay_time + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] value. +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + #endregion + diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid new file mode 100644 index 0000000..4368d26 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid @@ -0,0 +1 @@ +uid://0qmywjw0komx diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd index 77e8f29..809b156 100644 --- a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd +++ b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd @@ -15,6 +15,14 @@ const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/ #endregion +#region + +## TBD - For when Godot 4.3 becomes the minimum version +#@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO: + #set = set_interpolation_mode, + #get = get_interpolation_mode + +#endregion #region Signals @@ -24,30 +32,22 @@ signal update_editor_viewfinder #endregion - #region Variables enum InterpolationMode { - AUTO = 0, - IDLE = 1, + AUTO = 0, + IDLE = 1, PHYSICS = 2, } -## TBD - For when Godot 4.3 becomes the minimum version -#@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO: - #set = set_interpolation_mode, - #get = get_interpolation_mode - +#endregion -## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls. -var camera_2d: Camera2D = null -## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls. -var camera_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +#region Private Variables var _pcam_list: Array[Node] = [] var _active_pcam_2d: PhantomCamera2D = null -var _active_pcam_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var _active_pcam_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. var _active_pcam_priority: int = -1 var _active_pcam_missing: bool = true var _active_pcam_has_damping: bool = false @@ -59,19 +59,92 @@ var _prev_active_pcam_3d_transform: Transform3D = Transform3D() var _trigger_pcam_tween: bool = false var _tween_elapsed_time: float = 0 var _tween_duration: float = 0 +var _tween_is_instant: bool = false var _multiple_pcam_hosts: bool = false var _is_child_of_camera: bool = false var _is_2D: bool = false - var _viewfinder_node: Control = null var _viewfinder_needed_check: bool = true var _camera_zoom: Vector2 = Vector2.ONE #region Camera3DResource + +var _prev_cam_attributes: CameraAttributes = null +var _cam_attribute_type: int = 0 # 0 = CameraAttributesPractical, 1 = CameraAttributesPhysical +var _cam_attribute_changed: bool = false +var _cam_attribute_assigned: bool = false + +#region CameraAttributes +var _prev_cam_auto_exposure_scale: float = 0.4 +var _cam_auto_exposure_scale_changed: bool = false + +var _prev_cam_auto_exposure_speed: float = 0.5 +var _cam_auto_exposure_speed_changed: bool = false + +var _prev_cam_exposure_multiplier: float = 1.0 +var _cam_exposure_multiplier_changed: bool = false + +var _prev_cam_exposure_sensitivity: float = 100.0 +var _cam_exposure_sensitivity_changed: bool = false + +#region CameraAttributesPractical +var _prev_cam_exposure_min_sensitivity: float = 0.0 +var _cam_exposure_min_sensitivity_changed: bool = false + +var _prev_cam_exposure_max_sensitivity: float = 800.0 +var _cam_exposure_max_sensitivity_changed: bool = false + +var _prev_cam_dof_blur_amount: float = 0.1 +var _cam_dof_blur_amount_changed: bool = false + +var _cam_dof_blur_far_distance_default: float = 10 +var _prev_cam_dof_blur_far_distance: float = _cam_dof_blur_far_distance_default +var _cam_dof_blur_far_distance_changed: bool = false + +var _cam_dof_blur_far_transition_default: float = 5 +var _prev_cam_dof_blur_far_transition: float = _cam_dof_blur_far_transition_default +var _cam_dof_blur_far_transition_changed: bool = false + +var _cam_dof_blur_near_distance_default: float = 2 +var _prev_cam_dof_blur_near_distance: float = _cam_dof_blur_near_distance_default +var _cam_dof_blur_near_distance_changed: bool = false + +var _cam_dof_blur_near_transition_default: float = 1 +var _prev_cam_dof_blur_near_transition: float = _cam_dof_blur_near_transition_default +var _cam_dof_blur_near_transition_changed: bool = false +#endregion + +#region CameraAttributesPhysical +var _prev_cam_exposure_min_exposure_value: float = 10.0 +var _cam_exposure_min_exposure_value_changed: bool = false + +var _prev_cam_exposure_max_exposure_value: float = -8.0 +var _cam_exposure_max_exposure_value_changed: bool = false + +var _prev_cam_exposure_aperture: float = 16.0 +var _cam_exposure_aperture_changed: bool = false + +var _prev_cam_exposure_shutter_speed: float = 100.0 +var _cam_exposure_shutter_speed_changed: bool = false + +var _prev_cam_frustum_far: float = 4000.0 +var _cam_frustum_far_changed: bool = false + +var _prev_cam_frustum_focal_length: float = 35.0 +var _cam_frustum_focal_length_changed: bool = false + +var _prev_cam_frustum_near: float = 0.05 +var _cam_frustum_near_changed: bool = false + +var _prev_cam_frustum_focus_distance: float = 10.0 +var _cam_frustum_focus_distance_changed: bool = false + +#endregion + var _prev_cam_h_offset: float = 0 var _cam_h_offset_changed: bool = false @@ -92,16 +165,30 @@ var _cam_near_changed: bool = false var _prev_cam_far: float = 4000 var _cam_far_changed: bool = false + #endregion var _active_pcam_2d_glob_transform: Transform2D = Transform2D() var _active_pcam_3d_glob_transform: Transform3D = Transform3D() +var _has_noise_emitted: bool = false +var _noise_emitted_output_2d: Transform2D = Transform2D() +var _noise_emitted_output_3d: Transform3D = Transform3D() + #endregion # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#region Public Variables + +## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls. +var camera_2d: Camera2D = null +## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls. +var camera_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. + +#endregion + #region Private Functions ## TBD - For when Godot 4.3 becomes a minimum version @@ -111,7 +198,7 @@ var _phantom_camera_manager: Node func _get_configuration_warnings() -> PackedStringArray: - var parent = get_parent() + var parent: Node = get_parent() if _is_2D: if not parent is Camera2D: @@ -128,7 +215,7 @@ func _get_configuration_warnings() -> PackedStringArray: func _enter_tree() -> void: _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) - var parent = get_parent() + var parent: Node = get_parent() if parent is Camera2D or parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. _is_child_of_camera = true @@ -168,16 +255,22 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_host_removed(self) - _check_camera_host_amount() + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_host_removed(self) + _check_camera_host_amount() func _ready() -> void: - if not is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): return + process_priority = 300 + process_physics_priority = 300 + if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + camera_2d.offset = Vector2.ZERO + if not is_instance_valid(_active_pcam_2d): return + _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() + if not is_instance_valid(_active_pcam_3d): return + _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() func _check_camera_host_amount() -> void: @@ -188,19 +281,82 @@ func _check_camera_host_amount() -> void: func _assign_new_active_pcam(pcam: Node) -> void: + # Only checks if the scene tree is still present. + # Prevents a few errors and checks from happening if the scene is exited. + if not is_inside_tree(): return var no_previous_pcam: bool - if is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): if _is_2D: - _prev_active_pcam_2d_transform = camera_2d.get_global_transform() + _prev_active_pcam_2d_transform = camera_2d.global_transform _active_pcam_2d.queue_redraw() _active_pcam_2d.set_is_active(self, false) _active_pcam_2d.became_inactive.emit() + if _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_2d.physics_target_changed.disconnect(_check_pcam_physics) + + if _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): + _active_pcam_2d.noise_emitted.disconnect(_noise_emitted_2d) + if _trigger_pcam_tween: _active_pcam_2d.tween_interrupted.emit(pcam) else: - _prev_active_pcam_3d_transform = camera_3d.get_global_transform() + _prev_active_pcam_3d_transform = camera_3d.global_transform + _active_pcam_3d.set_is_active(self, false) + _active_pcam_3d.became_inactive.emit() + + if _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_3d.physics_target_changed.disconnect(_check_pcam_physics) + + if _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): + _active_pcam_3d.noise_emitted.disconnect(_noise_emitted_3d) + + if _trigger_pcam_tween: + _active_pcam_3d.tween_interrupted.emit(pcam) + + if camera_3d.attributes != null: + var _attributes: CameraAttributes = camera_3d.attributes + + _prev_cam_exposure_multiplier = _attributes.exposure_multiplier + _prev_cam_auto_exposure_scale = _attributes.auto_exposure_scale + _prev_cam_auto_exposure_speed = _attributes.auto_exposure_speed + + if camera_3d.attributes is CameraAttributesPractical: + _attributes = _attributes as CameraAttributesPractical + + _prev_cam_dof_blur_amount = _attributes.dof_blur_amount + + if _attributes.dof_blur_far_enabled: + _prev_cam_dof_blur_far_distance = _attributes.dof_blur_far_distance + _prev_cam_dof_blur_far_transition = _attributes.dof_blur_far_transition + else: + _prev_cam_dof_blur_far_distance = _cam_dof_blur_far_distance_default + _prev_cam_dof_blur_far_transition = _cam_dof_blur_far_transition_default + + if _attributes.dof_blur_near_enabled: + _prev_cam_dof_blur_near_distance = _attributes.dof_blur_near_distance + _prev_cam_dof_blur_near_transition = _attributes.dof_blur_near_transition + else: + _prev_cam_dof_blur_near_distance = _cam_dof_blur_near_distance_default + _prev_cam_dof_blur_near_transition = _cam_dof_blur_near_transition_default + + if _attributes.auto_exposure_enabled: + _prev_cam_exposure_max_sensitivity = _attributes.auto_exposure_max_sensitivity + _prev_cam_exposure_min_sensitivity = _attributes.auto_exposure_min_sensitivity + + elif camera_3d.attributes is CameraAttributesPhysical: + _attributes = _attributes as CameraAttributesPhysical + + _prev_cam_frustum_focus_distance = _attributes.frustum_focus_distance + _prev_cam_frustum_focal_length = _attributes.frustum_focal_length + _prev_cam_frustum_far = _attributes.frustum_far + _prev_cam_frustum_near = _attributes.frustum_near + _prev_cam_exposure_aperture = _attributes.exposure_aperture + _prev_cam_exposure_shutter_speed = _attributes.exposure_shutter_speed + + if _attributes.auto_exposure_enabled: + _prev_cam_exposure_min_exposure_value = _attributes.auto_exposure_min_exposure_value + _prev_cam_exposure_max_exposure_value = _attributes.auto_exposure_max_exposure_value _prev_cam_h_offset = camera_3d.h_offset _prev_cam_v_offset = camera_3d.v_offset @@ -210,11 +366,6 @@ func _assign_new_active_pcam(pcam: Node) -> void: _prev_cam_near = camera_3d.near _prev_cam_far = camera_3d.far - _active_pcam_3d.set_is_active(self, false) - _active_pcam_3d.became_inactive.emit() - - if _trigger_pcam_tween: - _active_pcam_3d.tween_interrupted.emit(pcam) else: no_previous_pcam = true @@ -223,201 +374,328 @@ func _assign_new_active_pcam(pcam: Node) -> void: _active_pcam_2d = pcam _active_pcam_priority = _active_pcam_2d.priority _active_pcam_has_damping = _active_pcam_2d.follow_damping - _tween_duration = _active_pcam_2d.get_tween_duration() + _tween_duration = _active_pcam_2d.tween_duration + + if not _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_2d.physics_target_changed.connect(_check_pcam_physics) + + if not _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): + _active_pcam_2d.noise_emitted.connect(_noise_emitted_2d) else: _active_pcam_3d = pcam _active_pcam_priority = _active_pcam_3d.priority _active_pcam_has_damping = _active_pcam_3d.follow_damping - _tween_duration = _active_pcam_3d.get_tween_duration() + _tween_duration = _active_pcam_3d.tween_duration + + if not _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_3d.physics_target_changed.connect(_check_pcam_physics) + + if not _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): + _active_pcam_3d.noise_emitted.connect(_noise_emitted_3d) - # Checks if the Camera3DResource has changed from previous Active PCam3D - if _active_pcam_3d.get_camera_3d_resource(): - if _prev_cam_h_offset != _active_pcam_3d.get_h_offset(): + # Checks if the Camera3DResource has changed from the previous active PCam3D + if _active_pcam_3d.camera_3d_resource: + if _prev_cam_h_offset != _active_pcam_3d.h_offset: _cam_h_offset_changed = true - if _prev_cam_v_offset != _active_pcam_3d.get_v_offset(): + if _prev_cam_v_offset != _active_pcam_3d.v_offset: _cam_v_offset_changed = true - if _prev_cam_fov != _active_pcam_3d.get_fov(): + if _prev_cam_fov != _active_pcam_3d.fov: _cam_fov_changed = true - if _prev_cam_size != _active_pcam_3d.get_size(): + if _prev_cam_size != _active_pcam_3d.size: _cam_size_changed = true - if _prev_cam_frustum_offset != _active_pcam_3d.get_frustum_offset(): + if _prev_cam_frustum_offset != _active_pcam_3d.frustum_offset: _cam_frustum_offset_changed = true - if _prev_cam_near != _active_pcam_3d.get_near(): + if _prev_cam_near != _active_pcam_3d.near: _cam_near_changed = true - if _prev_cam_far != _active_pcam_3d.get_far(): + if _prev_cam_far != _active_pcam_3d.far: _cam_far_changed = true + if _active_pcam_3d.attributes == null: + _cam_attribute_changed = false + else: + if _prev_cam_attributes != _active_pcam_3d.attributes: + _prev_cam_attributes = _active_pcam_3d.attributes + _cam_attribute_changed = true + var _attributes: CameraAttributes = _active_pcam_3d.attributes + + if _prev_cam_auto_exposure_scale != _attributes.auto_exposure_scale: + _cam_auto_exposure_scale_changed = true + if _prev_cam_auto_exposure_speed != _attributes.auto_exposure_speed: + _cam_auto_exposure_speed_changed = true + if _prev_cam_exposure_multiplier != _attributes.exposure_multiplier: + _cam_exposure_multiplier_changed = true + if _prev_cam_exposure_sensitivity != _attributes.exposure_sensitivity: + _cam_exposure_sensitivity_changed = true + + if _attributes is CameraAttributesPractical: + _cam_attribute_type = 0 + + if camera_3d.attributes == null: + camera_3d.attributes = CameraAttributesPractical.new() + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + _cam_attribute_assigned = true + + if _prev_cam_exposure_min_sensitivity != _attributes.auto_exposure_min_sensitivity: + _cam_exposure_min_sensitivity_changed = true + if _prev_cam_exposure_max_sensitivity != _attributes.auto_exposure_max_sensitivity: + _cam_exposure_max_sensitivity_changed = true + + if _prev_cam_dof_blur_amount != _attributes.dof_blur_amount: + _cam_dof_blur_amount_changed = true + + if _prev_cam_dof_blur_far_distance != _attributes.dof_blur_far_distance: + _cam_dof_blur_far_distance_changed = true + camera_3d.attributes.dof_blur_far_enabled = true + if _prev_cam_dof_blur_far_transition != _attributes.dof_blur_far_transition: + _cam_dof_blur_far_transition_changed = true + camera_3d.attributes.dof_blur_far_enabled = true + + if _prev_cam_dof_blur_near_distance != _attributes.dof_blur_near_distance: + _cam_dof_blur_near_distance_changed = true + camera_3d.attributes.dof_blur_near_enabled = true + if _prev_cam_dof_blur_near_transition != _attributes.dof_blur_near_transition: + _cam_dof_blur_near_transition_changed = true + camera_3d.attributes.dof_blur_near_enabled = true + elif _attributes is CameraAttributesPhysical: + _cam_attribute_type = 1 + + if camera_3d.attributes == null: + camera_3d.attributes = CameraAttributesPhysical.new() + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + + if _prev_cam_exposure_min_exposure_value != _attributes.auto_exposure_min_exposure_value: + _cam_exposure_min_exposure_value_changed = true + if _prev_cam_exposure_max_exposure_value != _attributes.auto_exposure_max_exposure_value: + _cam_exposure_max_exposure_value_changed = true + + if _prev_cam_exposure_aperture != _attributes.exposure_aperture: + _cam_exposure_aperture_changed = true + if _prev_cam_exposure_shutter_speed != _attributes.exposure_shutter_speed: + _cam_exposure_shutter_speed_changed = true + + if _prev_cam_frustum_far != _attributes.frustum_far: + _cam_frustum_far_changed = true + + if _prev_cam_frustum_focal_length != _attributes.frustum_focal_length: + _cam_frustum_focal_length_changed = true + + if _prev_cam_frustum_focus_distance != _attributes.frustum_focus_distance: + _cam_frustum_focus_distance_changed = true + + if _prev_cam_frustum_near != _attributes.frustum_near: + _cam_frustum_near_changed = true + if _is_2D: if _active_pcam_2d.show_viewfinder_in_play: _viewfinder_needed_check = true _active_pcam_2d.set_is_active(self, true) _active_pcam_2d.became_active.emit() - _camera_zoom = camera_2d.get_zoom() - ## TODO - Needs 3D variant once Godot supports physics_interpolation for 3D scenes. - var _physics_based: bool + _camera_zoom = camera_2d.zoom + else: + if _active_pcam_3d.show_viewfinder_in_play: + _viewfinder_needed_check = true + + _active_pcam_3d.set_is_active(self, true) + _active_pcam_3d.became_active.emit() + if _active_pcam_3d.camera_3d_resource: + camera_3d.cull_mask = _active_pcam_3d.cull_mask + camera_3d.projection = _active_pcam_3d.projection + + if no_previous_pcam: + if _is_2D: + _prev_active_pcam_2d_transform = _active_pcam_2d.get_transform_output() + else: + _prev_active_pcam_3d_transform = _active_pcam_3d.get_transform_output() + + if pcam.get_tween_skip(): + _tween_elapsed_time = pcam.tween_duration + else: + _tween_elapsed_time = 0 + + if pcam.tween_duration == 0: + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor >= 3: + _tween_is_instant = true - ## NOTE - Only supported in Godot 4.3 or above + _check_pcam_physics() + + _trigger_pcam_tween = true + + +func _check_pcam_physics() -> void: + if _is_2D: + ## NOTE - Only supported in Godot 4.3 or later if Engine.get_version_info().major == 4 and \ Engine.get_version_info().minor >= 3: - ## TBD - For when Godot 4.3 becomes the minimum version - #if interpolation_mode == InterpolationMode.IDLE: - #_physics_based = false - #elif interpolation_mode == InterpolationMode.PHYSICS: - #_physics_based = true - #else: - #_physics_based = _active_pcam.follow_target_physics_based - - # TBD - REMOVE this line once Godot 4.3 becomes the minimum version - _physics_based = _active_pcam_2d.get_follow_target_physics_based() - - if _physics_based: + if _active_pcam_2d.get_follow_target_physics_based(): _follow_target_physics_based = true - _active_pcam_2d.set_follow_target_physics_based(true, self) ## TODO - Temporary solution to support Godot 4.2 ## Remove line below and uncomment the following once Godot 4.3 is min verison. camera_2d.call("reset_physics_interpolation") camera_2d.set("physics_interpolation_mode", 1) #camera_2d.reset_physics_interpolation() #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON + if ProjectSettings.get_setting("physics/common/physics_interpolation"): + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning + else: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE else: _follow_target_physics_based = false - _active_pcam_2d.set_follow_target_physics_based(false, self) ## TODO - Temporary solution to support Godot 4.2 ## Remove line below and uncomment the following once Godot 4.3 is min verison. - camera_2d.set("physics_interpolation_mode", 2) - #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_OFF - else: - _follow_target_physics_based = false - if _active_pcam_3d.show_viewfinder_in_play: - _viewfinder_needed_check = true - - _active_pcam_3d.set_is_active(self, true) - _active_pcam_3d.became_active.emit() - if _active_pcam_3d.get_camera_3d_resource(): - camera_3d.cull_mask = _active_pcam_3d.get_cull_mask() - camera_3d.projection = _active_pcam_3d.get_projection() - - if no_previous_pcam: - if _is_2D: - _prev_active_pcam_2d_transform = _active_pcam_2d.get_global_transform() - else: - _prev_active_pcam_3d_transform = _active_pcam_3d.get_global_transform() - - _tween_elapsed_time = 0 - if not pcam.get_has_tweened(): - _trigger_pcam_tween = true + camera_2d.set("physics_interpolation_mode", 0) + #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_INHERIT + if get_tree().physics_interpolation: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning + else: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE else: - _trigger_pcam_tween = false + ## NOTE - Only supported in Godot 4.4 or later + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor >= 4: + if get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based(): + #if get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based(): + _follow_target_physics_based = true + ## TODO - Temporary solution to support Godot 4.2 + ## Remove line below and uncomment the following once Godot 4.3 is min verison. + camera_3d.call("reset_physics_interpolation") + camera_3d.set("physics_interpolation_mode", 1) + #camera_3d.reset_physics_interpolation() + #camera_3d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON + else: + _follow_target_physics_based = false + ## TODO - Temporary solution to support Godot 4.2 + ## Remove line below and uncomment the following once Godot 4.3 is min verison. + camera_3d.set("physics_interpolation_mode", 0) func _find_pcam_with_highest_priority() -> void: for pcam in _pcam_list: + if not pcam.visible: continue # Prevents hidden PCams from becoming active if pcam.get_priority() > _active_pcam_priority: _assign_new_active_pcam(pcam) + pcam.set_tween_skip(self, false) + _active_pcam_missing = false - pcam.set_has_tweened(self, false) - _active_pcam_missing = false +## TODO - For 0.8 release +#func _find_pcam_with_highest_priority() -> void: + #var highest_priority_pcam: Node + #for pcam in _pcam_list: + #if not pcam.visible: continue # Prevents hidden PCams from becoming active + #if pcam.priority > _active_pcam_priority: + #_active_pcam_priority = pcam.priority + #highest_priority_pcam = pcam + #pcam.set_has_tweened(self, false) +# + #_active_pcam_missing = false +# + #if is_instance_valid(highest_priority_pcam): + #_assign_new_active_pcam(highest_priority_pcam) + #else: + #_active_pcam_missing = true -func _process(delta: float): - if _follow_target_physics_based or _active_pcam_missing: return +func _process(delta: float) -> void: + if _active_pcam_missing: return + if not _follow_target_physics_based: _tween_follow_checker(delta) + + if not _has_noise_emitted: return if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + camera_2d.offset += _noise_emitted_output_2d.origin + camera_2d.rotation += _noise_emitted_output_2d.get_rotation() # + _noise_emitted_output_2d.get_rotation() else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() + camera_3d.global_transform *= _noise_emitted_output_3d + _has_noise_emitted = false - if _trigger_pcam_tween: - _pcam_tween(delta) - else: - _pcam_follow(delta) +func _physics_process(delta: float) -> void: + if _active_pcam_missing or not _follow_target_physics_based: return + _tween_follow_checker(delta) -func _physics_process(delta: float): - if not _follow_target_physics_based or _active_pcam_missing: return +func _tween_follow_checker(delta: float) -> void: if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + _active_pcam_2d.process_logic(delta) + _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() + else: + _active_pcam_3d.process_logic(delta) + _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() + + if not _trigger_pcam_tween: + # Rechecks physics target if PCam transitioned with an isntant tween + if _tween_is_instant: + _check_pcam_physics() + _tween_is_instant = false + _pcam_follow(delta) else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() - - if _trigger_pcam_tween: _pcam_tween(delta) + + if _is_2D: + camera_2d.offset = Vector2.ZERO + camera_2d.offset = _active_pcam_2d.get_noise_transform().origin # + _noise_emitted_output_2d.origin + camera_2d.rotation += _active_pcam_2d.get_noise_transform().get_rotation() # + _noise_emitted_output_2d.get_rotation() else: - _pcam_follow(delta) + camera_3d.global_transform *= _active_pcam_3d.get_noise_transform() -func _pcam_follow(delta: float) -> void: +func _pcam_follow(_delta: float) -> void: if _is_2D: if not is_instance_valid(_active_pcam_2d): return else: if not is_instance_valid(_active_pcam_3d): return if _active_pcam_missing or not _is_child_of_camera: return - # When following - _pcam_set_position(delta) - if _viewfinder_needed_check: - _show_viewfinder_in_play() - _viewfinder_needed_check = false - - # TODO - Should be able to find a more efficient way using signals - if Engine.is_editor_hint(): - if not _is_2D: - if _active_pcam_3d.get_camera_3d_resource(): - camera_3d.cull_mask = _active_pcam_3d.get_cull_mask() - camera_3d.h_offset = _active_pcam_3d.get_h_offset() - camera_3d.v_offset = _active_pcam_3d.get_v_offset() - camera_3d.projection = _active_pcam_3d.get_projection() - camera_3d.fov = _active_pcam_3d.get_fov() - camera_3d.size = _active_pcam_3d.get_size() - camera_3d.frustum_offset = _active_pcam_3d.get_frustum_offset() - camera_3d.near = _active_pcam_3d.get_near() - camera_3d.far = _active_pcam_3d.get_far() - - -func _pcam_set_position(delta: float) -> void: if _is_2D: if _active_pcam_2d.snap_to_pixel: var snap_to_pixel_glob_transform: Transform2D = _active_pcam_2d_glob_transform snap_to_pixel_glob_transform.origin = snap_to_pixel_glob_transform.origin.round() camera_2d.global_transform = snap_to_pixel_glob_transform else: - camera_2d.global_transform =_active_pcam_2d_glob_transform + camera_2d.global_transform = _active_pcam_2d_glob_transform camera_2d.zoom = _active_pcam_2d.zoom else: camera_3d.global_transform = _active_pcam_3d_glob_transform + if _viewfinder_needed_check: + _show_viewfinder_in_play() + _viewfinder_needed_check = false -func _pcam_tween(delta: float) -> void: - if _tween_elapsed_time < _tween_duration: - _pcam_tween_properties(delta) - else: # First frame when tweening completes - _tween_elapsed_time = 0 - _trigger_pcam_tween = false - #_show_viewfinder_in_play() # NOTE - Likely not needed - _pcam_follow(delta) + # TODO - Should be able to find a more efficient way using signals + if Engine.is_editor_hint(): + if not _is_2D: + if _active_pcam_3d.camera_3d_resource != null: + camera_3d.cull_mask = _active_pcam_3d.cull_mask + camera_3d.h_offset = _active_pcam_3d.h_offset + camera_3d.v_offset = _active_pcam_3d.v_offset + camera_3d.projection = _active_pcam_3d.projection + camera_3d.fov = _active_pcam_3d.fov + camera_3d.size = _active_pcam_3d.size + camera_3d.frustum_offset = _active_pcam_3d.frustum_offset + camera_3d.near = _active_pcam_3d.near + camera_3d.far = _active_pcam_3d.far + + if _active_pcam_3d.attributes != null: + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + + if _active_pcam_3d.environment != null: + camera_3d.environment = _active_pcam_3d.environment.duplicate() + + +func _noise_emitted_2d(noise_output: Transform2D) -> void: + _noise_emitted_output_2d = noise_output + _has_noise_emitted = true - if _is_2D: - _active_pcam_2d.update_limit_all_sides() - _active_pcam_2d.tween_completed.emit() - if Engine.is_editor_hint(): - _active_pcam_2d.queue_redraw() - else: - _cam_h_offset_changed = false - _cam_v_offset_changed = false - _cam_fov_changed = false - _cam_size_changed = false - _cam_frustum_offset_changed = false - _cam_near_changed = false - _cam_far_changed = false - _active_pcam_3d.tween_completed.emit() +func _noise_emitted_3d(noise_output: Transform3D) -> void: + _noise_emitted_output_3d = noise_output + _has_noise_emitted = true -func _pcam_tween_properties(delta: float) -> void: +func _pcam_tween(delta: float) -> void: # Run at the first tween frame if _tween_elapsed_time == 0: if _is_2D: @@ -426,6 +704,13 @@ func _pcam_tween_properties(delta: float) -> void: else: _active_pcam_3d.tween_started.emit() + # Forcefully disables physics interpolation when tweens are instant + if _tween_is_instant: + if _is_2D: + camera_2d.set("physics_interpolation_mode", 2) + else: + camera_3d.set("physics_interpolation_mode", 2) + _tween_elapsed_time = min(_tween_duration, _tween_elapsed_time + delta) if _is_2D: @@ -433,9 +718,9 @@ func _pcam_tween_properties(delta: float) -> void: var interpolation_destination: Vector2 = _tween_interpolate_value( _prev_active_pcam_2d_transform.origin, _active_pcam_2d_glob_transform.origin, - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) if _active_pcam_2d.snap_to_pixel: @@ -446,25 +731,25 @@ func _pcam_tween_properties(delta: float) -> void: camera_2d.rotation = _tween_interpolate_value( _prev_active_pcam_2d_transform.get_rotation(), _active_pcam_2d_glob_transform.get_rotation(), - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) camera_2d.zoom = _tween_interpolate_value( _camera_zoom, _active_pcam_2d.zoom, - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) else: _active_pcam_3d.is_tweening.emit() camera_3d.global_position = _tween_interpolate_value( _prev_active_pcam_3d_transform.origin, _active_pcam_3d_glob_transform.origin, - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) var prev_active_pcam_3d_quat: Quaternion = Quaternion(_prev_active_pcam_3d_transform.basis.orthonormalized()) @@ -473,81 +758,268 @@ func _pcam_tween_properties(delta: float) -> void: prev_active_pcam_3d_quat, \ prev_active_pcam_3d_quat.inverse() * Quaternion(_active_pcam_3d_glob_transform.basis.orthonormalized()), _tween_elapsed_time, \ - _active_pcam_3d.get_tween_duration(), \ - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.tween_duration, \ + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) + if _cam_attribute_changed: + if _active_pcam_3d.attributes.auto_exposure_enabled: + if _cam_auto_exposure_scale_changed: + camera_3d.attributes.auto_exposure_scale = \ + _tween_interpolate_value( + _prev_cam_auto_exposure_scale, + _active_pcam_3d.attributes.auto_exposure_scale, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_auto_exposure_speed_changed: + camera_3d.attributes.auto_exposure_speed = \ + _tween_interpolate_value( + _prev_cam_auto_exposure_scale, + _active_pcam_3d.attributes.auto_exposure_scale, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_attribute_type == 0: # CameraAttributePractical + if _active_pcam_3d.attributes.auto_exposure_enabled: + if _cam_exposure_min_sensitivity_changed: + camera_3d.attributes.auto_exposure_min_sensitivity = \ + _tween_interpolate_value( + _prev_cam_exposure_min_sensitivity, + _active_pcam_3d.attributes.auto_exposure_min_sensitivity, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_max_sensitivity_changed: + camera_3d.attributes.auto_exposure_max_sensitivity = \ + _tween_interpolate_value( + _prev_cam_exposure_max_sensitivity, + _active_pcam_3d.attributes.auto_exposure_max_sensitivity, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_amount_changed: + camera_3d.attributes.dof_blur_amount = \ + _tween_interpolate_value( + _prev_cam_dof_blur_amount, + _active_pcam_3d.attributes.dof_blur_amount, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_far_distance_changed: + camera_3d.attributes.dof_blur_far_distance = \ + _tween_interpolate_value( + _prev_cam_dof_blur_far_distance, + _active_pcam_3d.attributes.dof_blur_far_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_far_transition_changed: + camera_3d.attributes.dof_blur_far_transition = \ + _tween_interpolate_value( + _prev_cam_dof_blur_far_transition, + _active_pcam_3d.attributes.dof_blur_far_transition, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_near_distance_changed: + camera_3d.attributes.dof_blur_near_distance = \ + _tween_interpolate_value( + _prev_cam_dof_blur_near_distance, + _active_pcam_3d.attributes.dof_blur_near_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_near_transition_changed: + camera_3d.attributes.dof_blur_near_transition = \ + _tween_interpolate_value( + _prev_cam_dof_blur_near_transition, + _active_pcam_3d.attributes.dof_blur_near_transition, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + elif _cam_attribute_type == 1: # CameraAttributePhysical + if _cam_dof_blur_near_transition_changed: + camera_3d.attributes.auto_exposure_max_exposure_value = \ + _tween_interpolate_value( + _prev_cam_exposure_max_exposure_value, + _active_pcam_3d.attributes.auto_exposure_max_exposure_value, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_min_exposure_value_changed: + camera_3d.attributes.auto_exposure_min_exposure_value = \ + _tween_interpolate_value( + _prev_cam_exposure_min_exposure_value, + _active_pcam_3d.attributes.auto_exposure_min_exposure_value, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_aperture_changed: + camera_3d.attributes.exposure_aperture = \ + _tween_interpolate_value( + _prev_cam_exposure_aperture, + _active_pcam_3d.attributes.exposure_aperture, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_shutter_speed_changed: + camera_3d.attributes.exposure_shutter_speed = \ + _tween_interpolate_value( + _prev_cam_exposure_shutter_speed, + _active_pcam_3d.attributes.exposure_shutter_speed, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_far_changed: + camera_3d.attributes.frustum_far = \ + _tween_interpolate_value( + _prev_cam_frustum_far, + _active_pcam_3d.attributes.frustum_far, + _active_pcam_3d.tween_duration(), + _active_pcam_3d.tween_transition(), + _active_pcam_3d.tween_ease + ) + if _cam_frustum_near_changed: + camera_3d.attributes.frustum_near = \ + _tween_interpolate_value( + _prev_cam_frustum_far, + _active_pcam_3d.attributes.frustum_near, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_focal_length_changed: + camera_3d.attributes.frustum_focal_length = \ + _tween_interpolate_value( + _prev_cam_frustum_focal_length, + _active_pcam_3d.attributes.frustum_focal_length, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_focus_distance_changed: + camera_3d.attributes.frustum_focus_distance = \ + _tween_interpolate_value( + _prev_cam_frustum_focus_distance, + _active_pcam_3d.attributes.frustum_focus_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_h_offset_changed: + camera_3d.h_offset = \ + _tween_interpolate_value( + _prev_cam_h_offset, + _active_pcam_3d.h_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_v_offset_changed: + camera_3d.v_offset = \ + _tween_interpolate_value( + _prev_cam_v_offset, + _active_pcam_3d.v_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_fov_changed: camera_3d.fov = \ _tween_interpolate_value( _prev_cam_fov, - _active_pcam_3d.get_fov(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.fov, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_size_changed: camera_3d.size = \ _tween_interpolate_value( _prev_cam_size, - _active_pcam_3d.get_size(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.size, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_frustum_offset_changed: camera_3d.frustum_offset = \ _tween_interpolate_value( _prev_cam_frustum_offset, - _active_pcam_3d.get_frustum_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.frustum_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) - if _cam_h_offset_changed: - camera_3d.h_offset = \ - _tween_interpolate_value( - _prev_cam_h_offset, - _active_pcam_3d.get_h_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() - ) - - if _cam_v_offset_changed: - camera_3d.v_offset = \ - _tween_interpolate_value( - _prev_cam_v_offset, - _active_pcam_3d.get_v_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() - ) if _cam_near_changed: camera_3d.near = \ _tween_interpolate_value( _prev_cam_near, - _active_pcam_3d.get_near(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.near, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_far_changed: camera_3d.far = \ _tween_interpolate_value( _prev_cam_far, - _active_pcam_3d.get_far(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.far, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) + if _tween_elapsed_time < _tween_duration: return + _trigger_pcam_tween = false + _tween_elapsed_time = 0 + if _is_2D: + _active_pcam_2d.update_limit_all_sides() + _active_pcam_2d.tween_completed.emit() + if Engine.is_editor_hint(): + _active_pcam_2d.queue_redraw() + else: + if _active_pcam_3d.attributes != null: + if _cam_attribute_type == 0: + if not _active_pcam_3d.attributes.dof_blur_far_enabled: + camera_3d.attributes.dof_blur_far_enabled = false + if not _active_pcam_3d.attributes.dof_blur_near_enabled: + camera_3d.attributes.dof_blur_near_enabled = false + _cam_h_offset_changed = false + _cam_v_offset_changed = false + _cam_fov_changed = false + _cam_size_changed = false + _cam_frustum_offset_changed = false + _cam_near_changed = false + _cam_far_changed = false + _cam_attribute_changed = false + + _active_pcam_3d.tween_completed.emit() + func _tween_interpolate_value(from: Variant, to: Variant, duration: float, transition_type: int, ease_type: int) -> Variant: return Tween.interpolate_value( @@ -559,11 +1031,6 @@ func _tween_interpolate_value(from: Variant, to: Variant, duration: float, trans ease_type, ) -#endregion - - -#region Public Functions - func _show_viewfinder_in_play() -> void: # Don't show the viewfinder in the actual editor or project builds if Engine.is_editor_hint() or !OS.has_feature("editor"): return @@ -591,6 +1058,9 @@ func _show_viewfinder_in_play() -> void: _viewfinder_node.visible = true _viewfinder_node.update_dead_zone() +#endregion + +#region Public Functions ## Called when a [param PhantomCamera] is added to the scene.[br] ## [b]Note:[/b] This can only be called internally from a @@ -600,7 +1070,8 @@ func pcam_added_to_scene(pcam) -> void: if not _pcam_list.has(pcam): _pcam_list.append(pcam) if not pcam.tween_on_load: - pcam.set_has_tweened(self, true) # Skips its tween if it has the highest priority on load + pcam.set_tween_skip(self, true) # Skips its tween if it has the highest priority on load + if not pcam.is_node_ready(): await pcam.ready _find_pcam_with_highest_priority() else: printerr("This function should only be called from PhantomCamera scripts") @@ -637,7 +1108,7 @@ func pcam_priority_updated(pcam: Node) -> void: if not is_instance_valid(pcam): return - var current_pcam_priority: int = pcam.get_priority() + var current_pcam_priority: int = pcam.priority if current_pcam_priority >= _active_pcam_priority: if _is_2D: @@ -693,6 +1164,14 @@ func get_active_pcam() -> Node: func get_trigger_pcam_tween() -> bool: return _trigger_pcam_tween + +## Refreshes the [param PhantomCamera] list and checks for the highest priority. [br] +## [b]Note:[/b] This should [b]not[/b] be necessary to call manually. +func refresh_pcam_list_priorty() -> void: + _active_pcam_priority = -1 + _find_pcam_with_highest_priority() + + #func set_interpolation_mode(value: int) -> void: #interpolation_mode = value #func get_interpolation_mode() -> int: diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid new file mode 100644 index 0000000..2fb1b15 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid @@ -0,0 +1 @@ +uid://cnchgl1rj5wu3 diff --git a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid new file mode 100644 index 0000000..e53a0fb --- /dev/null +++ b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid @@ -0,0 +1 @@ +uid://dd2v4dcpaj47b diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd new file mode 100644 index 0000000..cc87dba --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd @@ -0,0 +1,228 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") +class_name PhantomCameraNoise2D +extends Resource + +## A resource type used to apply noise, or shake, to [Camera2D]s that have a [PhantomCameraHost] as a child. +## +## Is a resource type that defines, calculates and outputs the noise values to a [Camera2D] through active +## [PhantomCamera3D].[br] +## It can be applied to either [PhantomCameraNoiseEmitter2D] or a [PhantomCamera2D] noise property directly + +#region Exported Properties + +## Defines the size of the noise pattern.[br] +## Higher values will increase the range the noise can reach. +@export_range(0, 1000, 0.001, "or_greater") var amplitude: float = 10: + set = set_amplitude, + get = get_amplitude + +## Sets the density of the noise pattern.[br] +## Higher values will result in more erratic noise. +@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.5: + set = set_frequency, + get = get_frequency + +## If true, randomizes the noise pattern every time the noise is run.[br] +## If disabled, [member seed] can be used to define a fixed noise pattern. +@export var randomize_noise_seed: bool = true: + set = set_randomize_noise_seed, + get = get_randomize_noise_seed + +## Sets a predetermined seed noise value.[br] +## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. +@export var noise_seed: int = 0: + set = set_noise_seed, + get = get_noise_seed + +## Enables noise changes to the [member Camera2D.offset] position. +@export var positional_noise: bool = true: + set = set_positional_noise, + get = get_positional_noise + +## Enables noise changes to the [Camera2D]'s rotation. +@export var rotational_noise: bool = false: + set = set_rotational_noise, + get = get_rotational_noise + +@export_group("Positional Multiplier") +## Multiplies positional noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: + set = set_positional_multiplier_x, + get = get_positional_multiplier_x + +## Multiplies positional noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: + set = set_positional_multiplier_y, + get = get_positional_multiplier_y + +@export_group("Rotational Multiplier") +## Multiplies rotational noise amount. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier: float = 1: + set = set_rotational_multiplier, + get = get_rotational_multiplier + +#endregion + +#region Private Variables + +var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() + +var _noise_positional_multiplier: Vector2 = Vector2( + positional_multiplier_x, + positional_multiplier_y +) + +var _trauma: float = 0.0: + set(value): + _trauma = value + +var _noise_time: float = 0.0 + +#endregion + +#region Private Functions + +func _init(): + _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN + if randomize_noise_seed: _noise_algorithm.seed = randi() + _noise_algorithm.frequency = frequency + + +func _validate_property(property: Dictionary) -> void: + if randomize_noise_seed and property.name == "noise_seed": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not rotational_noise and property.name == "rotational_multiplier": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not positional_noise: + match property.name: + "positional_multiplier_x", \ + "positional_multiplier_y": + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _get_noise_from_seed(noise_seed: int) -> float: + return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude + + +func set_trauma(value: float) -> void: + _trauma = value + +#endregion + +#region Public Functions + +func get_noise_transform(delta: float) -> Transform2D: + var output_position: Vector2 = Vector2.ZERO + var output_rotation: float = 0.0 + _noise_time += delta + _trauma = maxf(_trauma, 0.0) + + if positional_noise: + for i in 2: + output_position[i] = _noise_positional_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + if rotational_noise: + output_rotation = rotational_multiplier / 100 * pow(_trauma, 2) * _get_noise_from_seed(noise_seed) + + return Transform2D(output_rotation, output_position) + + +func reset_noise_time() -> void: + _noise_time = 0 + +#endregion + +#region Setters & Getters + +## Sets the [member amplitude] value. +func set_amplitude(value: float) -> void: + amplitude =value + +## Returns the [member amplitude] value. +func get_amplitude() -> float: + return amplitude + + +## Sets the [member frequency] value. +func set_frequency(value: float) -> void: + frequency = value + _noise_algorithm.frequency = value + +## Returns the [member frequency] value. +func get_frequency() -> float: + return frequency + + +## Sets the [member randomize_seed] value. +func set_randomize_noise_seed(value: int) -> void: + randomize_noise_seed = value + if value: _noise_algorithm.seed = randi() + notify_property_list_changed() + +## Returns the [member randomize_seed] value. +func get_randomize_noise_seed() -> int: + return randomize_noise_seed + + +## Sets the [member randomize_seed] value. +func set_noise_seed(value: int) -> void: + noise_seed = value + +## Returns the [member seed] value. +func get_noise_seed() -> int: + return noise_seed + + +## Sets the [member positional_noise] value. +func set_positional_noise(value: bool) -> void: + positional_noise = value + notify_property_list_changed() + +## Returns the [member positional_noise] value. +func get_positional_noise() -> bool: + return positional_noise + + +## Sets the [member rotational_noise] value. +func set_rotational_noise(value: bool) -> void: + rotational_noise = value + notify_property_list_changed() + +## Returns the [member rotational_noise] value. +func get_rotational_noise() -> bool: + return rotational_noise + + +## Sets the [member positional_multiplier_x] value. +func set_positional_multiplier_x(value: float) -> void: + positional_multiplier_x = value + _noise_positional_multiplier.x = value + +## Returns the [member positional_multiplier_x] value. +func get_positional_multiplier_x() -> float: + return positional_multiplier_x + + +## Sets the [member positional_multiplier_y] value. +func set_positional_multiplier_y(value: float) -> void: + positional_multiplier_y = value + _noise_positional_multiplier.y = value + +## Returns the [member positional_multiplier_y] value. +func get_positional_multiplier_y() -> float: + return positional_multiplier_y + + +## Sets the [member rotational_multiplier] value. +func set_rotational_multiplier(value: float) -> void: + rotational_multiplier = value + +## Returns the [member rotational_multiplier] value. +func get_rotational_multiplier() -> float: + return rotational_multiplier + +#endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid new file mode 100644 index 0000000..444ab23 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid @@ -0,0 +1 @@ +uid://cuqo27utt645a diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd new file mode 100644 index 0000000..6cf840f --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd @@ -0,0 +1,301 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") +class_name PhantomCameraNoise3D +extends Resource + +## A resource type used to apply noise, or shake, to [Camera3D]s that have a [PhantomCameraHost] as a child. +## +## Is a resource type that defines, calculates and outputs the noise values to a [Camera3D] through active +## [PhantomCamera3D].[br] +## It can be applied to either [PhantomCameraNoiseEmitter3D] or a [PhantomCamera3D] noise property directly + +#region Exported Properties + +## Defines the size of the noise pattern.[br] +## Higher values will increase the range the noise can reach. +@export_range(0, 100, 0.001, "or_greater") var amplitude: float = 10: + set = set_amplitude, + get = get_amplitude + +## Sets the density of the noise pattern.[br] +## Higher values will result in more erratic noise. +@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.2: + set = set_frequency, + get = get_frequency + +## If true, randomizes the noise pattern every time the noise is run.[br] +## If disabled, [member seed] can be used to define a fixed noise pattern. +@export var randomize_noise_seed: bool = true: + set = set_randomize_noise_seed, + get = get_randomize_noise_seed + +## Sets a predetermined seed noise value.[br] +## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. +@export var noise_seed: int = 0: + set = set_noise_seed, + get = get_noise_seed + +## Enables noise changes to the [Camera3D]'s rotation. +@export var rotational_noise: bool = true: + set = set_rotational_noise, + get = get_rotational_noise + +## Enables noise changes to the camera's position.[br][br] +## [b]Important[/b][br]This can cause geometry clipping if the camera gets too close while this is active. +@export var positional_noise: bool = false: + set = set_positional_noise, + get = get_positional_noise + +@export_group("Rotational Multiplier") +## Multiplies rotational noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_x: float = 1: + set = set_rotational_multiplier_x, + get = get_rotational_multiplier_x + +## Multiplies rotational noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_y: float = 1: + set = set_rotational_multiplier_y, + get = get_rotational_multiplier_y + +## Multiplies rotational noise amount in the Z-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_z: float = 1: + set = set_rotational_multiplier_z, + get = get_rotational_multiplier_z + +@export_group("Positional Multiplier") +## Multiplies positional noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: + set = set_positional_multiplier_x, + get = get_positional_multiplier_x + +## Multiplies positional noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: + set = set_positional_multiplier_y, + get = get_positional_multiplier_y + +## Multiplies positional noise amount in the Z-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_z: float = 1: + set = set_positional_multiplier_z, + get = get_positional_multiplier_z + +#endregion + +#region Private Variables + +var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() + +var _noise_rotational_multiplier: Vector3 = Vector3( + rotational_multiplier_x, + rotational_multiplier_y, + rotational_multiplier_z, +) + +var _noise_positional_multiplier: Vector3 = Vector3( + positional_multiplier_x, + positional_multiplier_y, + positional_multiplier_z, +) + +var _trauma: float = 0.0: + set(value): + _trauma = value + if _trauma == 0.0: + _noise_time = 0.0 + +var _noise_time: float = 0.0 + +#endregion + +#region Private Functions + +func _init(): + _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN + + if randomize_noise_seed: _noise_algorithm.seed = randi() + _noise_algorithm.frequency = frequency + + +func _validate_property(property: Dictionary) -> void: + if randomize_noise_seed and property.name == "noise_seed": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not rotational_noise: + match property.name: + "rotational_multiplier_x", \ + "rotational_multiplier_y", \ + "rotational_multiplier_z": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not positional_noise: + match property.name: + "positional_multiplier_x", \ + "positional_multiplier_y", \ + "positional_multiplier_z": + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _get_noise_from_seed(noise_seed: int) -> float: + return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude + + +func set_trauma(value: float) -> void: + _trauma = value + +#endregion + +#region Public Functions + +func get_noise_transform(delta: float) -> Transform3D: + var output_rotation: Vector3 = Vector3.ZERO + var output_position: Vector3 = Vector3.ZERO + _noise_time += delta + _trauma = maxf(_trauma, 0.0) + + for i in 3: + if rotational_noise: + output_rotation[i] = deg_to_rad( + _noise_rotational_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + ) + + if positional_noise: + output_position[i] += _noise_positional_multiplier[i] / 10 * \ + pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + + return Transform3D(Quaternion.from_euler(output_rotation), output_position) + + +func reset_noise_time() -> void: + _noise_time = 0 + +#endregion + +#region Setters & Getters + +## Sets the [member amplitude] value. +func set_amplitude(value: float) -> void: + amplitude =value + +## Returns the [member amplitude] value. +func get_amplitude() -> float: + return amplitude + + +## Sets the [member frequency] value. +func set_frequency(value: float) -> void: + frequency = value + _noise_algorithm.frequency = value + +## Returns the [member frequency] value. +func get_frequency() -> float: + return frequency + + +## Sets the [member randomize_seed] value. +func set_randomize_noise_seed(value: int) -> void: + randomize_noise_seed = value + if value: _noise_algorithm.seed = randi() + notify_property_list_changed() + +## Returns the [member randomize_seed] value. +func get_randomize_noise_seed() -> int: + return randomize_noise_seed + + +## Sets the [member randomize_seed] value. +func set_noise_seed(value: int) -> void: + noise_seed = value + +## Returns the [member seed] value. +func get_noise_seed() -> int: + return noise_seed + + +## Sets the [member positional_noise] value. +func set_positional_noise(value: bool) -> void: + positional_noise = value + notify_property_list_changed() + +## Returns the [member positional_noise] value. +func get_positional_noise() -> bool: + return positional_noise + + +## Sets the [member rotational_noise] value. +func set_rotational_noise(value: bool) -> void: + rotational_noise = value + notify_property_list_changed() + +## Returns the [member rotational_noise] value. +func get_rotational_noise() -> bool: + return rotational_noise + + +## Sets the [member positional_multiplier_x] value. +func set_positional_multiplier_x(value: float) -> void: + positional_multiplier_x = value + _noise_positional_multiplier.x = value + +## Returns the [member positional_multiplier_x] value. +func get_positional_multiplier_x() -> float: + return positional_multiplier_x + + +## Sets the [member positional_multiplier_y] value. +func set_positional_multiplier_y(value: float) -> void: + positional_multiplier_y = value + _noise_positional_multiplier.y = value + +## Returns the [member positional_multiplier_y] value. +func get_positional_multiplier_y() -> float: + return positional_multiplier_y + + +## Sets the [member positional_multiplier_z] value. +func set_positional_multiplier_z(value: float) -> void: + positional_multiplier_z = value + _noise_positional_multiplier.z = value + +## Returns the [member positional_multiplier_z] value. +func get_positional_multiplier_z() -> float: + return positional_multiplier_z + + +## Sets the [member rotational_multiplier_x] value. +func set_rotational_multiplier_x(value: float) -> void: + rotational_multiplier_x = value + _noise_rotational_multiplier.x = value + +## Returns the [member rotational_multiplier_x] value. +func get_rotational_multiplier_x() -> float: + return rotational_multiplier_x + + +## Sets the [member rotational_multiplier_y] value. +func set_rotational_multiplier_y(value: float) -> void: + rotational_multiplier_y = value + _noise_rotational_multiplier.y = value + +## Returns the [member rotational_multiplier_y] value. +func get_rotational_multiplier_y() -> float: + return rotational_multiplier_y + + +## Sets the [member rotational_multiplier_z] value. +func set_rotational_multiplier_z(value: float) -> void: + rotational_multiplier_z = value + _noise_rotational_multiplier.z = value + +## Returns the [member rotational_multiplier_z] value. +func get_rotational_multiplier_z() -> float: + return rotational_multiplier_z + + #endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid new file mode 100644 index 0000000..30654b8 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid @@ -0,0 +1 @@ +uid://b2bewtm8tt7ne diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd.uid b/addons/phantom_camera/scripts/resources/tween_resource.gd.uid new file mode 100644 index 0000000..694bce7 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/tween_resource.gd.uid @@ -0,0 +1 @@ +uid://p5nds274fd3w diff --git a/addons/save_system/plugin_save_system.gd.uid b/addons/save_system/plugin_save_system.gd.uid new file mode 100644 index 0000000..bbd354b --- /dev/null +++ b/addons/save_system/plugin_save_system.gd.uid @@ -0,0 +1 @@ +uid://dwek6054ld8kx diff --git a/addons/save_system/save_system.gd.uid b/addons/save_system/save_system.gd.uid new file mode 100644 index 0000000..484c0f4 --- /dev/null +++ b/addons/save_system/save_system.gd.uid @@ -0,0 +1 @@ +uid://cha22mm6xirll diff --git a/addons/save_system/save_system_test/save_system_test.gd.uid b/addons/save_system/save_system_test/save_system_test.gd.uid new file mode 100644 index 0000000..92c0aea --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test.gd.uid @@ -0,0 +1 @@ +uid://m1ru50i8xl3l diff --git a/addons/save_system/save_system_test/save_system_test_resource.gd.uid b/addons/save_system/save_system_test/save_system_test_resource.gd.uid new file mode 100644 index 0000000..2777c48 --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test_resource.gd.uid @@ -0,0 +1 @@ +uid://c3fdpim6xnpfx diff --git a/addons/save_system/save_system_test/save_system_test_subresource.gd.uid b/addons/save_system/save_system_test/save_system_test_subresource.gd.uid new file mode 100644 index 0000000..c58eee3 --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test_subresource.gd.uid @@ -0,0 +1 @@ +uid://wugxwqk5h3yb diff --git a/addons/scene_manager/Dissolve2d.gdshader.uid b/addons/scene_manager/Dissolve2d.gdshader.uid new file mode 100644 index 0000000..32e6076 --- /dev/null +++ b/addons/scene_manager/Dissolve2d.gdshader.uid @@ -0,0 +1 @@ +uid://3a2kr7wshlbh diff --git a/addons/scene_manager/LICENSE b/addons/scene_manager/LICENSE deleted file mode 100644 index 9665923..0000000 --- a/addons/scene_manager/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright © 2021 GlassBrick - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/addons/scene_manager/NodeFlagsInspectorPlugin.gd b/addons/scene_manager/NodeFlagsInspectorPlugin.gd index b848eb2..3313a1f 100644 --- a/addons/scene_manager/NodeFlagsInspectorPlugin.gd +++ b/addons/scene_manager/NodeFlagsInspectorPlugin.gd @@ -4,7 +4,7 @@ var SingletonCheckProperty = load('res://addons/scene_manager/SingletonCheckProp var SingletonNameProperty = load('res://addons/scene_manager/SingletonNameProperty.gd') -func _can_handle(object: Variant): +func _can_handle(object: Object) -> bool: return object is Node diff --git a/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid b/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid new file mode 100644 index 0000000..2b09fa1 --- /dev/null +++ b/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid @@ -0,0 +1 @@ +uid://bhpt3n7somycn diff --git a/addons/scene_manager/README.md b/addons/scene_manager/README.md deleted file mode 100644 index b99e74d..0000000 --- a/addons/scene_manager/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Godot Scene Manager - -![Logo](/logo.png) - -Plugin for managing transitions and Node references between scenes. Expect more features to be added in the future! - -![Demonstration of Shader Fades](/scene_manager_demo.gif) - ---- - -All the README info has been moved to the new wiki! - -- [Wiki](https://github.com/glass-brick/Scene-Manager/wiki) - - [Getting Started](https://github.com/glass-brick/Scene-Manager/wiki/Getting-started) - - [Features](https://github.com/glass-brick/Scene-Manager/wiki/Features) - - [API docs]() diff --git a/addons/scene_manager/SceneManager.gd b/addons/scene_manager/SceneManager.gd index df09009..34dc551 100644 --- a/addons/scene_manager/SceneManager.gd +++ b/addons/scene_manager/SceneManager.gd @@ -98,7 +98,7 @@ func _process(_delta: float) -> void: _previous_scene = _tree.current_scene func change_scene(path: Variant, setted_options: Dictionary = {}) -> void: - assert(path == null or path is String, 'Path must be a string') + assert(path == null or path is String or path is PackedScene, 'Path must be a string or a PackedScene') var options = _get_final_options(setted_options) if not options["skip_fade_out"]: await fade_out(setted_options) @@ -120,13 +120,13 @@ func _reload_scene() -> void: _current_scene = _tree.current_scene func fade_in_place(setted_options: Dictionary = {}) -> void: - setted_options["no_scene_change"] = true + setted_options["skip_scene_change"] = true await change_scene(null, setted_options) -func _replace_scene(path: String, options: Dictionary) -> void: +func _replace_scene(path: Variant, options: Dictionary) -> void: _current_scene.queue_free() scene_unloaded.emit() - var following_scene: PackedScene = ResourceLoader.load(path, "PackedScene", 0) + var following_scene: PackedScene = _load_scene_resource(path) _current_scene = following_scene.instantiate() _current_scene.tree_entered.connect(options["on_tree_enter"].bind(_current_scene)) _current_scene.ready.connect(options["on_ready"].bind(_current_scene)) @@ -134,6 +134,11 @@ func _replace_scene(path: String, options: Dictionary) -> void: _root.add_child(_current_scene) _tree.set_current_scene(_current_scene) +func _load_scene_resource(path: Variant) -> Resource: + if path is PackedScene: + return path + return ResourceLoader.load(path, "PackedScene", 0) + func fade_out(setted_options: Dictionary= {}) -> void: var options = _get_final_options(setted_options) is_transitioning = true diff --git a/addons/scene_manager/SceneManager.gd.uid b/addons/scene_manager/SceneManager.gd.uid new file mode 100644 index 0000000..323e747 --- /dev/null +++ b/addons/scene_manager/SceneManager.gd.uid @@ -0,0 +1 @@ +uid://duwg1qpxqtora diff --git a/addons/scene_manager/SceneManager.tscn b/addons/scene_manager/SceneManager.tscn index 9a96c7b..acb0168 100644 --- a/addons/scene_manager/SceneManager.tscn +++ b/addons/scene_manager/SceneManager.tscn @@ -1,27 +1,35 @@ -[gd_scene load_steps=5 format=3 uid="uid://j20v4cg7v8m1"] +[gd_scene load_steps=6 format=3 uid="uid://j20v4cg7v8m1"] -[ext_resource type="Script" path="res://addons/scene_manager/SceneManager.gd" id="1_22br8"] -[ext_resource type="Shader" path="res://addons/scene_manager/Dissolve2d.gdshader" id="2_853wq"] +[ext_resource type="Script" uid="uid://duwg1qpxqtora" path="res://addons/scene_manager/SceneManager.gd" id="1_22br8"] +[ext_resource type="Shader" uid="uid://3a2kr7wshlbh" path="res://addons/scene_manager/Dissolve2d.gdshader" id="2_853wq"] [ext_resource type="Animation" uid="uid://dxr1r78uxitcq" path="res://addons/scene_manager/ShaderFade.tres" id="5_anecj"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_0imdi"] -shader = ExtResource( "2_853wq" ) +shader = ExtResource("2_853wq") shader_parameter/dissolve_amount = 0.0 shader_parameter/fade_color = Color(0, 0, 0, 1) -shader_parameter/fade = null -shader_parameter/inverted = null +shader_parameter/fade = false +shader_parameter/inverted = false + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_bdiyj"] +_data = { +&"ShaderFade": ExtResource("5_anecj") +} [node name="SceneManager" type="Node2D"] -script = ExtResource( "1_22br8" ) +script = ExtResource("1_22br8") [node name="CanvasLayer" type="CanvasLayer" parent="."] layer = 3 [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] -material = SubResource( "ShaderMaterial_0imdi" ) +material = SubResource("ShaderMaterial_0imdi") +anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -anims/ShaderFade = ExtResource( "5_anecj" ) +libraries = { +&"": SubResource("AnimationLibrary_bdiyj") +} diff --git a/addons/scene_manager/SceneManagerConstants.gd.uid b/addons/scene_manager/SceneManagerConstants.gd.uid new file mode 100644 index 0000000..6861a78 --- /dev/null +++ b/addons/scene_manager/SceneManagerConstants.gd.uid @@ -0,0 +1 @@ +uid://bc22b8bkcvwui diff --git a/addons/scene_manager/SceneManagerPlugin.gd.uid b/addons/scene_manager/SceneManagerPlugin.gd.uid new file mode 100644 index 0000000..bac37f3 --- /dev/null +++ b/addons/scene_manager/SceneManagerPlugin.gd.uid @@ -0,0 +1 @@ +uid://bh0jt2lnuuumc diff --git a/addons/scene_manager/SingletonCheckProperty.gd.uid b/addons/scene_manager/SingletonCheckProperty.gd.uid new file mode 100644 index 0000000..590b870 --- /dev/null +++ b/addons/scene_manager/SingletonCheckProperty.gd.uid @@ -0,0 +1 @@ +uid://2tcteb2i71wj diff --git a/addons/scene_manager/SingletonNameProperty.gd.uid b/addons/scene_manager/SingletonNameProperty.gd.uid new file mode 100644 index 0000000..5dae170 --- /dev/null +++ b/addons/scene_manager/SingletonNameProperty.gd.uid @@ -0,0 +1 @@ +uid://bp0or4a1m7exs diff --git a/addons/scene_manager/plugin.cfg b/addons/scene_manager/plugin.cfg index 28388cc..87afdc2 100644 --- a/addons/scene_manager/plugin.cfg +++ b/addons/scene_manager/plugin.cfg @@ -3,5 +3,5 @@ name="Scene Manager" description="Scene Manager" author="GlassBrick" -version="1.0.1" +version="1.1.1" script="SceneManagerPlugin.gd" diff --git a/addons/script-ide/Popup.gd.uid b/addons/script-ide/Popup.gd.uid new file mode 100644 index 0000000..e443dae --- /dev/null +++ b/addons/script-ide/Popup.gd.uid @@ -0,0 +1 @@ +uid://bc5lev5pxek3p diff --git a/addons/script-ide/plugin.gd.uid b/addons/script-ide/plugin.gd.uid new file mode 100644 index 0000000..4c954c3 --- /dev/null +++ b/addons/script-ide/plugin.gd.uid @@ -0,0 +1 @@ +uid://bt8kmdymyokoe diff --git a/assets/resources/save_resource.gd.uid b/assets/resources/save_resource.gd.uid new file mode 100644 index 0000000..93b1375 --- /dev/null +++ b/assets/resources/save_resource.gd.uid @@ -0,0 +1 @@ +uid://lqen07q05vbw diff --git a/assets/resources/save_resource.tres b/assets/resources/save_resource.tres index 0e4e2d0..f1f9b0c 100644 --- a/assets/resources/save_resource.tres +++ b/assets/resources/save_resource.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="SaveResource" load_steps=2 format=3 uid="uid://ci0v1u7i67vvu"] -[ext_resource type="Script" path="res://assets/resources/save_resource.gd" id="1_ohq41"] +[ext_resource type="Script" uid="uid://lqen07q05vbw" path="res://assets/resources/save_resource.gd" id="1_ohq41"] [resource] script = ExtResource("1_ohq41") diff --git a/assets/shaders/water.gdshader b/assets/shaders/water.gdshader deleted file mode 100644 index 022d090..0000000 --- a/assets/shaders/water.gdshader +++ /dev/null @@ -1,134 +0,0 @@ -// source: https://godotshaders.com/shader/pixel-art-water/ -shader_type canvas_item; - -uniform float aspectRatio = 1.0f; -uniform float pixelization = 2048.0f; - -uniform sampler2D waterDepthGradient : hint_default_black; - -uniform vec4 causticColor = vec4(0.455f, 0.773f, 0.765f, 1.0f); -uniform vec4 causticHighlightColor = vec4(0.741f, 0.894f, 0.898f, 1.0f); -uniform sampler2D causticTexture : hint_default_white, repeat_enable; -uniform sampler2D causticHighlightTexture : hint_default_white, repeat_enable; -uniform sampler2D causticNoiseTexture : hint_default_white, repeat_enable; -uniform sampler2D causticFadeNoiseTexture : hint_default_white, repeat_enable; -uniform float causticScale = 12.0f; -uniform float causticSpeed = 0.005f; -uniform float causticMovementAmount = 0.15f; -uniform float causticFaderMultiplier = 1.45f; - -uniform vec4 specularColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); -uniform sampler2D specularNoiseTexture : hint_default_white, repeat_enable; -uniform sampler2D specularMovementLeftNoiseTexture : hint_default_white, repeat_enable; -uniform sampler2D specularMovementRightNoiseTexture : hint_default_white, repeat_enable; -uniform float specularThreshold = 0.35f; -uniform float specularSpeed = 0.025f; -uniform float specularScale = 15.0f; - -uniform vec4 foamColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); -uniform sampler2D foamTexture : hint_default_white, repeat_enable; -uniform float foamIntensity = 0.2f; -uniform float foamScale = 15.0f; - -uniform vec4 outlineColor = vec4(0.675f, 0.86f, 1.0f, 1.0f); -uniform float generalTransparency = 1.0f; - - -// ------------------------------------------------------------------------------------ -// Helper functions - -// Blends two vec2's by subtracting them. Compare this to Photoshop blend mode "Subtract". -// Source: -// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html -vec2 blendSubtract_vec2(vec2 base, vec2 blend, float opacity) -{ - vec2 result = base - blend; - return mix(base, result, opacity); -} - -// Blends two floats by subtracting them. Compare this to Photoshop blend mode "Subtract". -// Source: -// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html -float blendSubtract_float(float base, float blend, float opacity) -{ - float result = base - blend; - return mix(base, result, opacity); -} - -// Blends two vec2's by overlaying them. Compare this to Photoshop blend mode "Overlay". -// Source: -// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html -float blendOverlay_float(float base, float blend, float opacity) -{ - float result1 = 1.0f - 2.0f * (1.0f - base) * (1.0f - blend); - float result2 = 2.0f * base * blend; - float zeroOrOne = step(0.5f, base); - float res = result2 * zeroOrOne + (1.0 - zeroOrOne) * result1; - return mix(base, res, opacity); -} - -// Pixelizes the given coordinate. -vec2 pixelizeCoordinates(vec2 coordinates) -{ - return floor(coordinates * pixelization) / pixelization; -} - -// Applies the aspect ratio to the coordinates. -vec2 applyAspectRatio(vec2 coordinates) -{ - return vec2(coordinates.x, coordinates.y * aspectRatio); -} - -// ------------------------------------------------------------------------------------ -// Shader layers - -vec4 caustics(vec2 pixelizedCoordinates) -{ - vec4 causticNoise = texture(causticNoiseTexture, TIME * causticSpeed + pixelizedCoordinates); - vec2 noiseCoordinates = blendSubtract_vec2(pixelizedCoordinates * causticScale, causticNoise.rg, causticMovementAmount); - vec4 causticHighlight = texture(causticHighlightTexture, noiseCoordinates) * causticHighlightColor; - vec4 caustic = texture(causticTexture, noiseCoordinates) * causticColor; - vec4 interpolatedCaustics = mix(caustic, causticHighlight, causticHighlight.a); - float fadeNoise = texture(causticFadeNoiseTexture, noiseCoordinates).r * causticFaderMultiplier; - return vec4(interpolatedCaustics.r, interpolatedCaustics.g, interpolatedCaustics.b, clamp(interpolatedCaustics.a - fadeNoise, 0.0, 1.0)); -} - -vec4 specular(vec2 pixelizedCoordinates) -{ - vec2 scaledCoordinates = pixelizedCoordinates * specularScale; - float specularNoise = texture(specularNoiseTexture, scaledCoordinates).r; - float leftScrollingNoise = texture(specularMovementLeftNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed, 0.0f)).r; - float rightScrollingNoise = texture(specularMovementRightNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed * -1.0f, 0.0f)).r; - return step(specularThreshold, blendSubtract_float(blendOverlay_float(leftScrollingNoise, rightScrollingNoise, 1.0f), specularNoise, 1.0f)) * specularColor; -} - -vec4 foam(vec2 pixelizedCoordinates, vec4 mainTexColor) -{ - vec4 colorizedFoam = texture(foamTexture, pixelizedCoordinates * foamScale) * foamColor; - float intensity = clamp(mainTexColor.g * mainTexColor.a - foamIntensity, 0.0f, 1.0f); - return vec4(colorizedFoam.r, colorizedFoam.g, colorizedFoam.b, colorizedFoam.a * intensity); -} - -// ------------------------------------------------------------------------------------ -// Fragment Shader code - -void fragment() -{ - vec2 pixelizedCoordinates = pixelizeCoordinates(applyAspectRatio(UV)); - vec4 mainTex = texture(TEXTURE, UV); - vec4 depthBasedWaterColor = texture(waterDepthGradient, vec2(1.0f - mainTex.b, 1.0f)); - - vec4 finalCaustics = caustics(pixelizedCoordinates); - vec4 finalSpecular = specular(pixelizedCoordinates); - vec4 finalFoam = foam(pixelizedCoordinates, mainTex); - - vec4 waterWithCausticLayer = mix(depthBasedWaterColor, finalCaustics, finalCaustics.a); - vec4 waterWithCausticAndSpecularLayer = mix(waterWithCausticLayer, finalSpecular, ceil(finalCaustics.a) * finalSpecular.a); - vec4 waterWithCausticAndSpecularAndFoamLayer = mix(waterWithCausticAndSpecularLayer, finalFoam, finalFoam.a); - - float outline = mainTex.a * mainTex.r; - vec4 finalOutlineColor = outline * outlineColor; - - vec4 finalRGBColor = mix(waterWithCausticAndSpecularAndFoamLayer, finalOutlineColor, outline); - COLOR = vec4(finalRGBColor.r, finalRGBColor.g, finalRGBColor.b, mainTex.b * generalTransparency); -} \ No newline at end of file diff --git a/i18n/en.po b/i18n/en.po new file mode 100644 index 0000000..e69de29 diff --git a/i18n/es_ES.po b/i18n/es_ES.po new file mode 100644 index 0000000..e69de29 diff --git a/i18n/es_MX.po b/i18n/es_MX.po new file mode 100644 index 0000000..e69de29 diff --git a/objects/item_protoset.json b/objects/item_protoset.json new file mode 100644 index 0000000..02f2db4 --- /dev/null +++ b/objects/item_protoset.json @@ -0,0 +1,21 @@ +{ + "deck_of_cards": { + "stack_size": 52, + "max_stack_size": 52 + }, + + "base_item": { + "description": "An example item used as a base to create other items.", + "_comment": "Stack Based Inventory", + "stack_size": 10, + "weight": 1.0, + }, + + "grid_item": { + "description": "An example item used as a base to create other items.", + "image": "res://assets/textures/book.png", + "_comment": "Grid Based Inventory", + "width": 2, + "height": 2, + }, +} diff --git a/objects/item_protoset.tres b/objects/item_protoset.tres new file mode 100644 index 0000000..2c2fe28 --- /dev/null +++ b/objects/item_protoset.tres @@ -0,0 +1,3 @@ +[gd_resource type="Resource" format=3 uid="uid://djhhxwo6oave4"] + +[resource] diff --git a/project.godot b/project.godot index dcc77e3..3e41063 100644 --- a/project.godot +++ b/project.godot @@ -11,22 +11,27 @@ config_version=5 [application] config/name="RPG template" -run/main_scene="res://scenes/main_level.tscn" -config/features=PackedStringArray("4.3", "Forward Plus") +run/main_scene="res://scenes/level/main_level.tscn" +config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" [autoload] Constants="*res://scripts/constants.gd" SaveSystem="*res://addons/save_system/save_system.gd" -SceneManager="*res://addons/scene_manager/SceneManager.tscn" PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd" +SceneManager="*res://addons/scene_manager/SceneManager.tscn" +Events="*res://scripts/events.gd" Globals="*res://scripts/globals.gd" [editor_plugins] enabled=PackedStringArray("res://addons/gloot/plugin.cfg", "res://addons/label_font_auto_sizer/plugin.cfg", "res://addons/phantom_camera/plugin.cfg", "res://addons/save_system/plugin.cfg", "res://addons/scene_manager/plugin.cfg", "res://addons/script-ide/plugin.cfg") +[gloot] + +inspector_control_height=200 + [input] ui_left={ @@ -74,6 +79,10 @@ ui_inventory={ ] } +[internationalization] + +locale/translations=PackedStringArray("res://i18n/en.po", "res://i18n/es_ES.po", "res://i18n/es_MX.po") + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/scenes/components/item_protoset.json b/scenes/components/item_protoset.json deleted file mode 100644 index 41b2bff..0000000 --- a/scenes/components/item_protoset.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "base_item", - "name": "Base Item", - "description": "An example item used as a base to create other items.", - - "_comment": "Stack Based Inventory", - "stack_size": 10, - "weight": 1.0, - - "_comment": "Grid Based Inventory", - "width": 2, - "height": 2, - } -] diff --git a/scenes/components/item_protoset.tres b/scenes/components/item_protoset.tres deleted file mode 100644 index 5011df7..0000000 --- a/scenes/components/item_protoset.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://djhhxwo6oave4"] - -[ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="1_gt6d6"] - -[resource] -script = ExtResource("1_gt6d6") -json_data = "[ - { - \"_comment\": \"Grid Based Inventory\", - \"description\": \"An example item used as a base to create other items.\", - \"height\": 2, - \"id\": \"base_item\", - \"name\": \"Base Item\", - \"stack_size\": 10, - \"weight\": 1, - \"width\": 2 - } -]" diff --git a/scenes/elements/door_scene_manager.tscn b/scenes/elements/door_scene_manager.tscn index 929c15d..8075e34 100644 --- a/scenes/elements/door_scene_manager.tscn +++ b/scenes/elements/door_scene_manager.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://da1uex028xkv1"] -[ext_resource type="Script" path="res://scripts/door_scene_manager.gd" id="1_ph76m"] +[ext_resource type="Script" uid="uid://b5wo0m62qrv44" path="res://scripts/door_scene_manager.gd" id="1_ph76m"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_sglud"] size = Vector2(14, 20) diff --git a/scenes/elements/player.tscn b/scenes/elements/player.tscn index c83d6c0..d0c164f 100644 --- a/scenes/elements/player.tscn +++ b/scenes/elements/player.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://k76535tjepm3"] -[ext_resource type="Script" path="res://scripts/player.gd" id="1_1webx"] +[ext_resource type="Script" uid="uid://dx15rxub22ius" path="res://scripts/player.gd" id="1_1webx"] [ext_resource type="SpriteFrames" uid="uid://dum0mxk5oajvu" path="res://assets/animations/player_animation.tres" id="1_qf5ok"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_geqid"] diff --git a/scenes/house_template.tscn b/scenes/house_template.tscn deleted file mode 100644 index 099334c..0000000 --- a/scenes/house_template.tscn +++ /dev/null @@ -1,490 +0,0 @@ -[gd_scene load_steps=8 format=4 uid="uid://bk4h1frr4r8tq"] - -[ext_resource type="Script" path="res://scripts/house_template.gd" id="1_1vs50"] -[ext_resource type="Texture2D" uid="uid://d4j4ulftsvn5c" path="res://assets/textures/Inner.png" id="1_w2ggh"] -[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/interfaces/pause_menu.tscn" id="1_yi287"] -[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="2_07rl6"] -[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="3_3eu8f"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_q4fiy"] -texture = ExtResource("1_w2ggh") -0:0/0 = 0 -1:0/0 = 0 -1:0/0/z_index = -1 -2:0/0 = 0 -2:0/0/z_index = -1 -3:0/0 = 0 -3:0/0/z_index = -1 -4:0/0 = 0 -4:0/0/z_index = -1 -5:0/0 = 0 -5:0/0/z_index = -1 -6:0/0 = 0 -6:0/0/z_index = -1 -7:0/0 = 0 -7:0/0/z_index = -1 -8:0/0 = 0 -8:0/0/z_index = -1 -9:0/0 = 0 -10:0/0 = 0 -11:0/0 = 0 -12:0/0 = 0 -12:0/0/z_index = 1 -13:0/0 = 0 -13:0/0/z_index = 1 -14:0/0 = 0 -14:0/0/z_index = 1 -15:0/0 = 0 -15:0/0/z_index = 1 -16:0/0 = 0 -16:0/0/z_index = 1 -17:0/0 = 0 -17:0/0/z_index = 1 -0:1/0 = 0 -0:1/0/z_index = -1 -1:1/0 = 0 -1:1/0/z_index = -1 -2:1/0 = 0 -2:1/0/z_index = -1 -3:1/0 = 0 -3:1/0/z_index = -1 -4:1/0 = 0 -4:1/0/z_index = -1 -5:1/0 = 0 -5:1/0/z_index = -1 -6:1/0 = 0 -6:1/0/z_index = -1 -7:1/0 = 0 -7:1/0/z_index = -1 -8:1/0 = 0 -8:1/0/z_index = -1 -9:1/0 = 0 -16:1/0 = 0 -16:1/0/z_index = 1 -17:1/0 = 0 -17:1/0/z_index = 1 -18:1/0 = 0 -18:1/0/z_index = 1 -19:1/0 = 0 -19:1/0/z_index = 1 -20:1/0 = 0 -20:1/0/z_index = 1 -21:1/0 = 0 -21:1/0/z_index = 1 -0:2/0 = 0 -0:2/0/z_index = -1 -1:2/0 = 0 -1:2/0/z_index = -1 -2:2/0 = 0 -2:2/0/z_index = -1 -3:2/0 = 0 -3:2/0/z_index = -1 -4:2/0 = 0 -5:2/0 = 0 -5:2/0/z_index = -1 -6:2/0 = 0 -6:2/0/z_index = -1 -7:2/0 = 0 -7:2/0/z_index = -1 -8:2/0 = 0 -8:2/0/z_index = -1 -9:2/0 = 0 -9:2/0/z_index = -1 -16:2/0 = 0 -16:2/0/z_index = 1 -17:2/0 = 0 -17:2/0/z_index = 1 -18:2/0 = 0 -18:2/0/z_index = 1 -19:2/0 = 0 -19:2/0/z_index = 1 -20:2/0 = 0 -20:2/0/z_index = 1 -21:2/0 = 0 -21:2/0/z_index = 1 -0:3/0 = 0 -0:3/0/z_index = -1 -1:3/0 = 0 -1:3/0/z_index = -1 -2:3/0 = 0 -2:3/0/z_index = -1 -3:3/0 = 0 -3:3/0/z_index = -1 -4:3/0 = 0 -5:3/0 = 0 -5:3/0/z_index = -1 -6:3/0 = 0 -6:3/0/z_index = -1 -7:3/0 = 0 -7:3/0/z_index = -1 -8:3/0 = 0 -8:3/0/z_index = -1 -9:3/0 = 0 -9:3/0/z_index = -1 -16:3/0 = 0 -16:3/0/z_index = 1 -17:3/0 = 0 -17:3/0/z_index = 1 -18:3/0 = 0 -18:3/0/z_index = 1 -19:3/0 = 0 -19:3/0/z_index = 1 -20:3/0 = 0 -20:3/0/z_index = 1 -21:3/0 = 0 -21:3/0/z_index = 1 -0:4/0 = 0 -0:4/0/z_index = -1 -1:4/0 = 0 -1:4/0/z_index = -1 -2:4/0 = 0 -2:4/0/z_index = -1 -3:4/0 = 0 -3:4/0/z_index = -1 -4:4/0 = 0 -5:4/0 = 0 -5:4/0/z_index = -1 -6:4/0 = 0 -6:4/0/z_index = -1 -7:4/0 = 0 -8:4/0 = 0 -9:4/0 = 0 -9:4/0/z_index = 1 -10:4/0 = 0 -10:4/0/z_index = 1 -11:4/0 = 0 -11:4/0/z_index = 1 -12:4/0 = 0 -12:4/0/z_index = 1 -13:4/0 = 0 -13:4/0/z_index = 1 -14:4/0 = 0 -14:4/0/z_index = 1 -0:5/0 = 0 -0:5/0/z_index = -1 -1:5/0 = 0 -1:5/0/z_index = -1 -2:5/0 = 0 -2:5/0/z_index = -1 -3:5/0 = 0 -3:5/0/z_index = -1 -4:5/0 = 0 -5:5/0 = 0 -5:5/0/z_index = -1 -6:5/0 = 0 -6:5/0/z_index = -1 -7:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -9:5/0/z_index = 1 -10:5/0 = 0 -10:5/0/z_index = 1 -11:5/0 = 0 -11:5/0/z_index = 1 -12:5/0 = 0 -12:5/0/z_index = 1 -13:5/0 = 0 -13:5/0/z_index = 1 -14:5/0 = 0 -14:5/0/z_index = 1 -0:6/0 = 0 -2:6/0 = 0 -3:6/0 = 0 -4:6/0 = 0 -5:6/0 = 0 -6:6/0 = 0 -7:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -10:6/0/z_index = 1 -11:6/0 = 0 -11:6/0/z_index = 1 -12:6/0 = 0 -12:6/0/z_index = 1 -13:6/0 = 0 -13:6/0/z_index = 1 -14:6/0 = 0 -14:6/0/z_index = 1 -0:7/0 = 0 -0:7/0/z_index = 1 -1:7/0 = 0 -1:7/0/z_index = 1 -2:7/0 = 0 -2:7/0/z_index = 1 -3:7/0 = 0 -3:7/0/z_index = 1 -4:7/0 = 0 -4:7/0/z_index = 1 -5:7/0 = 0 -5:7/0/z_index = 1 -6:7/0 = 0 -6:7/0/z_index = 1 -7:7/0 = 0 -7:7/0/z_index = 1 -8:7/0 = 0 -8:7/0/z_index = 1 -9:7/0 = 0 -9:7/0/z_index = 1 -10:7/0 = 0 -10:7/0/z_index = 1 -11:7/0 = 0 -11:7/0/z_index = 1 -12:7/0 = 0 -12:7/0/z_index = 1 -13:7/0 = 0 -13:7/0/z_index = 1 -14:7/0 = 0 -14:7/0/z_index = 1 -15:7/0 = 0 -15:7/0/z_index = 1 -16:7/0 = 0 -16:7/0/z_index = 1 -0:8/0 = 0 -0:8/0/z_index = 1 -1:8/0 = 0 -1:8/0/z_index = 1 -2:8/0 = 0 -2:8/0/z_index = 1 -3:8/0 = 0 -3:8/0/z_index = 1 -4:8/0 = 0 -4:8/0/z_index = 1 -5:8/0 = 0 -5:8/0/z_index = 1 -6:8/0 = 0 -6:8/0/z_index = 1 -7:8/0 = 0 -7:8/0/z_index = 1 -8:8/0 = 0 -8:8/0/z_index = 1 -9:8/0 = 0 -9:8/0/z_index = 1 -10:8/0 = 0 -10:8/0/z_index = 1 -11:8/0 = 0 -11:8/0/z_index = 1 -12:8/0 = 0 -12:8/0/z_index = 1 -13:8/0 = 0 -13:8/0/z_index = 1 -14:8/0 = 0 -14:8/0/z_index = 1 -15:8/0 = 0 -15:8/0/z_index = 1 -16:8/0 = 0 -0:9/0 = 0 -0:9/0/z_index = 1 -1:9/0 = 0 -1:9/0/z_index = 1 -2:9/0 = 0 -2:9/0/z_index = 1 -3:9/0 = 0 -3:9/0/z_index = 1 -4:9/0 = 0 -4:9/0/z_index = 1 -5:9/0 = 0 -5:9/0/z_index = 1 -6:9/0 = 0 -6:9/0/z_index = 1 -7:9/0 = 0 -7:9/0/z_index = 1 -8:9/0 = 0 -8:9/0/z_index = 1 -9:9/0 = 0 -10:9/0 = 0 -10:9/0/z_index = 1 -11:9/0 = 0 -12:9/0 = 0 -12:9/0/z_index = 1 -13:9/0 = 0 -13:9/0/z_index = 1 -14:9/0 = 0 -14:9/0/z_index = 1 -15:9/0 = 0 -15:9/0/z_index = 1 -16:9/0 = 0 -16:9/0/z_index = 1 -0:10/0 = 0 -0:10/0/z_index = 1 -1:10/0 = 0 -1:10/0/z_index = 1 -2:10/0 = 0 -2:10/0/z_index = 1 -3:10/0 = 0 -3:10/0/z_index = 1 -4:10/0 = 0 -4:10/0/z_index = 1 -5:10/0 = 0 -5:10/0/z_index = 1 -6:10/0 = 0 -6:10/0/z_index = 1 -7:10/0 = 0 -7:10/0/z_index = 1 -8:10/0 = 0 -8:10/0/z_index = 1 -9:10/0 = 0 -9:10/0/z_index = 1 -10:10/0 = 0 -10:10/0/z_index = 1 -11:10/0 = 0 -12:10/0 = 0 -12:10/0/z_index = 1 -13:10/0 = 0 -13:10/0/z_index = 1 -0:11/0 = 0 -0:11/0/z_index = 1 -1:11/0 = 0 -1:11/0/z_index = 1 -2:11/0 = 0 -2:11/0/z_index = 1 -3:11/0 = 0 -3:11/0/z_index = 1 -4:11/0 = 0 -4:11/0/z_index = 1 -5:11/0 = 0 -5:11/0/z_index = 1 -6:11/0 = 0 -6:11/0/z_index = 1 -7:11/0 = 0 -7:11/0/z_index = 1 -8:11/0 = 0 -8:11/0/z_index = 1 -9:11/0 = 0 -9:11/0/z_index = 1 -10:11/0 = 0 -10:11/0/z_index = 1 -11:11/0 = 0 -11:11/0/z_index = 1 -12:11/0 = 0 -12:11/0/z_index = 1 -13:11/0 = 0 -13:11/0/z_index = 1 -0:12/0 = 0 -0:12/0/z_index = 1 -1:12/0 = 0 -1:12/0/z_index = 1 -2:12/0 = 0 -2:12/0/z_index = 1 -3:12/0 = 0 -3:12/0/z_index = 1 -4:12/0 = 0 -4:12/0/z_index = 1 -5:12/0 = 0 -5:12/0/z_index = 1 -6:12/0 = 0 -6:12/0/z_index = 1 -7:12/0 = 0 -7:12/0/z_index = 1 -8:12/0 = 0 -8:12/0/z_index = 1 -9:12/0 = 0 -9:12/0/z_index = 1 -10:12/0 = 0 -10:12/0/z_index = 1 -11:12/0 = 0 -11:12/0/z_index = 1 -12:12/0 = 0 -12:12/0/z_index = 1 -13:12/0 = 0 -13:12/0/z_index = 1 -0:13/0 = 0 -0:13/0/z_index = 1 -1:13/0 = 0 -1:13/0/z_index = 1 -2:13/0 = 0 -2:13/0/z_index = 1 -3:13/0 = 0 -3:13/0/z_index = 1 -4:13/0 = 0 -4:13/0/z_index = 1 -5:13/0 = 0 -5:13/0/z_index = 1 -6:13/0 = 0 -6:13/0/z_index = 1 -7:13/0 = 0 -7:13/0/z_index = 1 -8:13/0 = 0 -8:13/0/z_index = 1 -0:14/0 = 0 -0:14/0/z_index = 1 -1:14/0 = 0 -1:14/0/z_index = 1 -2:14/0 = 0 -2:14/0/z_index = 1 -3:14/0 = 0 -3:14/0/z_index = 1 -4:14/0 = 0 -4:14/0/z_index = 1 -6:14/0 = 0 -6:14/0/z_index = 1 -7:14/0 = 0 -7:14/0/z_index = 1 -0:15/0 = 0 -1:15/0 = 0 -1:15/0/z_index = 1 -2:15/0 = 0 -2:15/0/z_index = 1 -3:15/0 = 0 -3:15/0/z_index = 1 -4:15/0 = 0 -4:15/0/z_index = 1 -6:15/0 = 0 -6:15/0/z_index = 1 -7:15/0 = 0 -7:15/0/z_index = 1 -0:16/0 = 0 -0:16/0/z_index = 1 -1:16/0 = 0 -1:16/0/z_index = 1 -2:16/0 = 0 -2:16/0/z_index = 1 -3:16/0 = 0 -3:16/0/z_index = 1 -4:16/0 = 0 -4:16/0/z_index = 1 -2:17/0 = 0 -2:17/0/z_index = 1 -3:17/0 = 0 -3:17/0/z_index = 1 -10:1/size_in_atlas = Vector2i(3, 3) -10:1/0 = 0 -13:1/size_in_atlas = Vector2i(3, 3) -13:1/0 = 0 -16:4/size_in_atlas = Vector2i(1, 3) -16:4/0 = 0 -15:4/size_in_atlas = Vector2i(1, 3) -15:4/0 = 0 -17:4/size_in_atlas = Vector2i(1, 3) -17:4/0 = 0 -18:4/size_in_atlas = Vector2i(1, 3) -18:4/0 = 0 - -[sub_resource type="TileSet" id="TileSet_5bd38"] -physics_layer_0/collision_layer = 1 -navigation_layer_0/layers = 1 -sources/0 = SubResource("TileSetAtlasSource_q4fiy") - -[node name="HouseTemplate" type="Node2D"] -script = ExtResource("1_1vs50") - -[node name="TileMapLayer" type="TileMapLayer" parent="."] -rotation = -0.000322629 -tile_map_data = PackedByteArray("AAAIAAIAAAACAAEAAAAIAAMAAAACAAEAAAAIAAQAAAACAAEAAAAIAAUAAAACAAEAAAAIAAYAAAACAAEAAAAIAAcAAAACAAEAAAAIAAgAAAACAAEAAAAIAAkAAAACAAEAAAAJAAoAAAACAAEAAAAJAAsAAAACAAEAAAAJAAwAAAACAAEAAAAKAA0AAAACAAEAAAALAA4AAAACAAEAAAAMAA8AAAACAAEAAAANAA8AAAACAAEAAAANABAAAAACAAEAAAAOABAAAAACAAEAAAAPABAAAAACAAEAAAAQABAAAAACAAEAAAARABAAAAACAAEAAAASABAAAAACAAEAAAATABAAAAACAAEAAAAUABAAAAACAAEAAAAVABAAAAACAAEAAAAWABAAAAACAAEAAAAWAA8AAAACAAEAAAAWAAwAAAACAAEAAAAWAAsAAAACAAEAAAAVAAoAAAACAAEAAAAUAAoAAAACAAEAAAATAAkAAAACAAEAAAASAAkAAAACAAEAAAARAAgAAAACAAEAAAAQAAgAAAACAAEAAAAPAAgAAAACAAEAAAAOAAgAAAACAAEAAAANAAcAAAACAAEAAAAMAAcAAAACAAEAAAALAAcAAAACAAEAAAAKAAcAAAACAAEAAAAJAAcAAAACAAEAAAAHAAkAAAACAAEAAAAHAAoAAAACAAEAAAAHAAsAAAACAAEAAAAHAAwAAAACAAEAAAAHAA0AAAACAAEAAAAHAA4AAAACAAEAAAAHAA8AAAACAAEAAAAIABAAAAACAAEAAAAJABAAAAACAAEAAAAKABEAAAACAAEAAAALABIAAAACAAEAAAAMABMAAAACAAEAAAANABMAAAACAAEAAAAOABMAAAACAAEAAAAPABMAAAACAAEAAAAQABQAAAACAAEAAAARABQAAAACAAEAAAASABQAAAACAAEAAAATABQAAAACAAEAAAAUABQAAAACAAEAAAAVABQAAAACAAEAAAAWABQAAAACAAEAAAAVAAwAAAACAAEAAAAUAA0AAAACAAEAAAAUAA4AAAACAAEAAAATAA8AAAACAAEAAAATABEAAAACAAEAAAATABIAAAACAAEAAAAUABMAAAACAAEAAAAWABUAAAACAAEAAAAAAAAAAAACAAEAAAAAAAEAAAACAAEAAAAAAAIAAAACAAEAAAAAAAMAAAACAAEAAAAAAAQAAAACAAEAAAAAAAUAAAACAAEAAAAAAAYAAAACAAEAAAAAAAcAAAACAAEAAAAAAAgAAAACAAEAAAAAAAkAAAACAAEAAAAAAAoAAAACAAEAAAAAAAsAAAACAAEAAAAAAAwAAAACAAEAAAAAAA0AAAACAAEAAAAAAA4AAAACAAEAAAAAAA8AAAACAAEAAAAAABAAAAACAAEAAAAAABEAAAACAAEAAAAAABIAAAACAAEAAAAAABMAAAACAAEAAAAAABQAAAACAAEAAAAAABUAAAACAAEAAAAAABYAAAACAAEAAAAAABcAAAACAAEAAAAAABgAAAACAAEAAAAAABkAAAACAAEAAAAAABoAAAACAAEAAAAAABsAAAACAAEAAAAAABwAAAACAAEAAAAAAB0AAAACAAEAAAAAAB4AAAACAAEAAAAAAB8AAAACAAEAAAAAACAAAAACAAEAAAAAACEAAAACAAEAAAAAACIAAAACAAEAAAAAACMAAAACAAEAAAAAACQAAAACAAEAAAAAACUAAAACAAEAAAAAACYAAAACAAEAAAAAACcAAAACAAEAAAAAACgAAAACAAEAAAABAAAAAAACAAEAAAABAAEAAAACAAEAAAABAAIAAAACAAEAAAABAAMAAAACAAEAAAABAAQAAAACAAEAAAABAAUAAAACAAEAAAABAAYAAAACAAEAAAABAAcAAAACAAEAAAABAAgAAAACAAEAAAABAAkAAAACAAEAAAABAAoAAAACAAEAAAABAAsAAAACAAEAAAABAAwAAAACAAEAAAABAA0AAAACAAEAAAABAA4AAAACAAEAAAABAA8AAAACAAEAAAABABAAAAACAAEAAAABABEAAAACAAEAAAABABIAAAACAAEAAAABABMAAAACAAEAAAABABQAAAACAAEAAAABABUAAAACAAEAAAABABYAAAACAAEAAAABABcAAAACAAEAAAABABgAAAACAAEAAAABABkAAAACAAEAAAABABoAAAACAAEAAAABABsAAAACAAEAAAABABwAAAACAAEAAAABAB0AAAACAAEAAAABAB4AAAACAAEAAAABAB8AAAACAAEAAAABACAAAAACAAEAAAABACEAAAACAAEAAAABACIAAAACAAEAAAABACMAAAACAAEAAAABACQAAAACAAEAAAABACUAAAACAAEAAAABACYAAAACAAEAAAABACcAAAACAAEAAAABACgAAAACAAEAAAACAAAAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAAACAAEAAAACAAMAAAACAAEAAAACAAQAAAACAAEAAAACAAUAAAACAAEAAAACAAYAAAACAAEAAAACAAcAAAACAAEAAAACAAgAAAACAAEAAAACAAkAAAACAAEAAAACAAoAAAACAAEAAAACAAsAAAACAAEAAAACAAwAAAACAAEAAAACAA0AAAACAAEAAAACAA4AAAACAAEAAAACAA8AAAACAAEAAAACABAAAAACAAEAAAACABEAAAACAAEAAAACABIAAAACAAEAAAACABMAAAACAAEAAAACABQAAAACAAEAAAACABUAAAACAAEAAAACABYAAAACAAEAAAACABcAAAACAAEAAAACABgAAAACAAEAAAACABkAAAACAAEAAAACABoAAAACAAEAAAACABsAAAACAAEAAAACABwAAAACAAEAAAACAB0AAAACAAEAAAACAB4AAAACAAEAAAACAB8AAAACAAEAAAACACAAAAACAAEAAAACACEAAAACAAEAAAACACIAAAACAAEAAAACACMAAAACAAEAAAACACQAAAACAAEAAAACACUAAAACAAEAAAACACYAAAACAAEAAAACACcAAAACAAEAAAACACgAAAACAAEAAAADAAAAAAACAAEAAAADAAEAAAACAAEAAAADAAIAAAACAAEAAAADAAMAAAACAAEAAAADAAQAAAACAAEAAAADAAUAAAACAAEAAAADAAYAAAACAAEAAAADAAcAAAACAAEAAAADAAgAAAACAAEAAAADAAkAAAACAAEAAAADAAoAAAACAAEAAAADAAsAAAACAAEAAAADAAwAAAACAAEAAAADAA0AAAACAAEAAAADAA4AAAACAAEAAAADAA8AAAACAAEAAAADABAAAAACAAEAAAADABEAAAACAAEAAAADABIAAAACAAEAAAADABMAAAACAAEAAAADABQAAAACAAEAAAADABUAAAACAAEAAAADABYAAAACAAEAAAADABcAAAACAAEAAAADABgAAAACAAEAAAADABkAAAACAAEAAAADABoAAAACAAEAAAADABsAAAACAAEAAAADABwAAAACAAEAAAADAB0AAAACAAEAAAADAB4AAAACAAEAAAADAB8AAAACAAEAAAADACAAAAACAAEAAAADACEAAAACAAEAAAADACIAAAACAAEAAAADACMAAAACAAEAAAADACQAAAACAAEAAAADACUAAAACAAEAAAADACYAAAACAAEAAAADACcAAAACAAEAAAADACgAAAACAAEAAAAEAAAAAAACAAEAAAAEAAEAAAACAAEAAAAEAAIAAAACAAEAAAAEAAMAAAACAAEAAAAEAAQAAAACAAEAAAAEAAUAAAACAAEAAAAEAAYAAAACAAEAAAAEAAcAAAACAAEAAAAEAAgAAAACAAEAAAAEAAkAAAACAAEAAAAEAAoAAAACAAEAAAAEAAsAAAACAAEAAAAEAAwAAAACAAEAAAAEAA0AAAACAAEAAAAEAA4AAAACAAEAAAAEAA8AAAACAAEAAAAEABAAAAACAAEAAAAEABEAAAACAAEAAAAEABIAAAACAAEAAAAEABMAAAACAAEAAAAEABQAAAACAAEAAAAEABUAAAACAAEAAAAEABYAAAACAAEAAAAEABcAAAACAAEAAAAEABgAAAACAAEAAAAEABkAAAACAAEAAAAEABoAAAACAAEAAAAEABsAAAACAAEAAAAEABwAAAACAAEAAAAEAB0AAAACAAEAAAAEAB4AAAACAAEAAAAEAB8AAAACAAEAAAAEACAAAAACAAEAAAAEACEAAAACAAEAAAAEACIAAAACAAEAAAAEACMAAAACAAEAAAAEACQAAAACAAEAAAAEACUAAAACAAEAAAAEACYAAAACAAEAAAAEACcAAAACAAEAAAAEACgAAAACAAEAAAAFAAAAAAACAAEAAAAFAAEAAAACAAEAAAAFAAIAAAACAAEAAAAFAAMAAAACAAEAAAAFAAQAAAACAAEAAAAFAAUAAAACAAEAAAAFAAYAAAACAAEAAAAFAAcAAAACAAEAAAAFAAgAAAACAAEAAAAFAAkAAAACAAEAAAAFAAoAAAACAAEAAAAFAAsAAAACAAEAAAAFAAwAAAACAAEAAAAFAA0AAAACAAEAAAAFAA4AAAACAAEAAAAFAA8AAAACAAEAAAAFABAAAAACAAEAAAAFABEAAAACAAEAAAAFABIAAAACAAEAAAAFABMAAAACAAEAAAAFABQAAAACAAEAAAAFABUAAAACAAEAAAAFABYAAAACAAEAAAAFABcAAAACAAEAAAAFABgAAAACAAEAAAAFABkAAAACAAEAAAAFABoAAAACAAEAAAAFABsAAAACAAEAAAAFABwAAAACAAEAAAAFAB0AAAACAAEAAAAFAB4AAAACAAEAAAAFAB8AAAACAAEAAAAFACAAAAACAAEAAAAFACEAAAACAAEAAAAFACIAAAACAAEAAAAFACMAAAACAAEAAAAFACQAAAACAAEAAAAFACUAAAACAAEAAAAFACYAAAACAAEAAAAFACcAAAACAAEAAAAFACgAAAACAAEAAAAGAAAAAAACAAEAAAAGAAEAAAACAAEAAAAGAAIAAAACAAEAAAAGAAMAAAACAAEAAAAGAAQAAAACAAEAAAAGAAUAAAACAAEAAAAGAAYAAAACAAEAAAAGAAcAAAACAAEAAAAGAAgAAAACAAEAAAAGAAkAAAACAAEAAAAGAAoAAAACAAEAAAAGAAsAAAACAAEAAAAGAAwAAAACAAEAAAAGAA0AAAACAAEAAAAGAA4AAAACAAEAAAAGAA8AAAACAAEAAAAGABAAAAACAAEAAAAGABEAAAACAAEAAAAGABIAAAACAAEAAAAGABMAAAACAAEAAAAGABQAAAACAAEAAAAGABUAAAACAAEAAAAGABYAAAACAAEAAAAGABcAAAACAAEAAAAGABgAAAACAAEAAAAGABkAAAACAAEAAAAGABoAAAACAAEAAAAGABsAAAACAAEAAAAGABwAAAACAAEAAAAGAB0AAAACAAEAAAAGAB4AAAACAAEAAAAGAB8AAAACAAEAAAAGACAAAAACAAEAAAAGACEAAAACAAEAAAAGACIAAAACAAEAAAAGACMAAAACAAEAAAAGACQAAAACAAEAAAAGACUAAAACAAEAAAAGACYAAAACAAEAAAAGACcAAAACAAEAAAAGACgAAAACAAEAAAAHAAAAAAACAAEAAAAHAAEAAAACAAEAAAAHAAIAAAACAAEAAAAHAAMAAAACAAEAAAAHAAQAAAACAAEAAAAHAAUAAAACAAEAAAAHAAYAAAACAAEAAAAHAAcAAAACAAEAAAAHAAgAAAACAAEAAAAHABAAAAACAAEAAAAHABEAAAACAAEAAAAHABIAAAACAAEAAAAHABMAAAACAAEAAAAHABQAAAACAAEAAAAHABUAAAACAAEAAAAHABYAAAACAAEAAAAHABcAAAACAAEAAAAHABgAAAACAAEAAAAHABkAAAACAAEAAAAHABoAAAACAAEAAAAHABsAAAACAAEAAAAHABwAAAACAAEAAAAHAB0AAAACAAEAAAAHAB4AAAACAAEAAAAHAB8AAAACAAEAAAAHACAAAAACAAEAAAAHACEAAAACAAEAAAAHACIAAAACAAEAAAAHACMAAAACAAEAAAAHACQAAAACAAEAAAAHACUAAAACAAEAAAAHACYAAAACAAEAAAAHACcAAAACAAEAAAAHACgAAAACAAEAAAAIAAAAAAACAAEAAAAIAAEAAAACAAEAAAAIAAoAAAACAAEAAAAIAAsAAAACAAEAAAAIAAwAAAACAAEAAAAIAA0AAAACAAEAAAAIAA4AAAACAAEAAAAIAA8AAAACAAEAAAAIABEAAAACAAEAAAAIABIAAAACAAEAAAAIABMAAAACAAEAAAAIABQAAAACAAEAAAAIABUAAAACAAEAAAAIABYAAAACAAEAAAAIABcAAAACAAEAAAAIABgAAAACAAEAAAAIABkAAAACAAEAAAAIABoAAAACAAEAAAAIABsAAAACAAEAAAAIABwAAAACAAEAAAAIAB0AAAACAAEAAAAIAB4AAAACAAEAAAAIAB8AAAACAAEAAAAIACAAAAACAAEAAAAIACEAAAACAAEAAAAIACIAAAACAAEAAAAIACMAAAACAAEAAAAIACQAAAACAAEAAAAIACUAAAACAAEAAAAIACYAAAACAAEAAAAIACcAAAACAAEAAAAIACgAAAACAAEAAAAJAAAAAAACAAEAAAAJAAEAAAACAAEAAAAJAAIAAAACAAEAAAAJAAMAAAACAAEAAAAJAAQAAAACAAEAAAAJAAUAAAACAAEAAAAJAAYAAAACAAEAAAAJAAgAAAACAAEAAAAJAAkAAAACAAEAAAAJAA0AAAACAAEAAAAJAA4AAAACAAEAAAAJAA8AAAACAAEAAAAJABEAAAACAAEAAAAJABIAAAACAAEAAAAJABMAAAACAAEAAAAJABQAAAACAAEAAAAJABUAAAACAAEAAAAJABYAAAACAAEAAAAJABcAAAACAAEAAAAJABgAAAACAAEAAAAJABkAAAACAAEAAAAJABoAAAACAAEAAAAJABsAAAACAAEAAAAJABwAAAACAAEAAAAJAB0AAAACAAEAAAAJAB4AAAACAAEAAAAJAB8AAAACAAEAAAAJACAAAAACAAEAAAAJACEAAAACAAEAAAAJACIAAAACAAEAAAAJACMAAAACAAEAAAAJACQAAAACAAEAAAAJACUAAAACAAEAAAAJACYAAAACAAEAAAAJACcAAAACAAEAAAAJACgAAAACAAEAAAAKAAAAAAACAAEAAAAKAAEAAAACAAEAAAAKAAIAAAACAAEAAAAKAAMAAAACAAEAAAAKAAQAAAACAAEAAAAKAAUAAAACAAEAAAAKAAYAAAACAAEAAAAKAAgAAAACAAEAAAAKAAkAAAACAAEAAAAKAAoAAAACAAEAAAAKAAsAAAACAAEAAAAKAAwAAAACAAEAAAAKAA4AAAACAAEAAAAKAA8AAAACAAEAAAAKABAAAAACAAEAAAAKABIAAAACAAEAAAAKABMAAAACAAEAAAAKABQAAAACAAEAAAAKABUAAAACAAEAAAAKABYAAAACAAEAAAAKABcAAAACAAEAAAAKABgAAAACAAEAAAAKABkAAAACAAEAAAAKABoAAAACAAEAAAAKABsAAAACAAEAAAAKABwAAAACAAEAAAAKAB0AAAACAAEAAAAKAB4AAAACAAEAAAAKAB8AAAACAAEAAAAKACAAAAACAAEAAAAKACEAAAACAAEAAAAKACIAAAACAAEAAAAKACMAAAACAAEAAAAKACQAAAACAAEAAAAKACUAAAACAAEAAAAKACYAAAACAAEAAAAKACcAAAACAAEAAAAKACgAAAACAAEAAAALAAAAAAACAAEAAAALAAEAAAACAAEAAAALAAIAAAACAAEAAAALAAMAAAACAAEAAAALAAQAAAACAAEAAAALAAUAAAACAAEAAAALAAYAAAACAAEAAAALAAgAAAACAAEAAAALAAkAAAACAAEAAAALAAoAAAACAAEAAAALAAsAAAACAAEAAAALAAwAAAACAAEAAAALAA0AAAACAAEAAAALAA8AAAACAAEAAAALABAAAAACAAEAAAALABEAAAACAAEAAAALABMAAAACAAEAAAALABQAAAACAAEAAAALABUAAAACAAEAAAALABYAAAACAAEAAAALABcAAAACAAEAAAALABgAAAACAAEAAAALABkAAAACAAEAAAALABoAAAACAAEAAAALABsAAAACAAEAAAALABwAAAACAAEAAAALAB0AAAACAAEAAAALAB4AAAACAAEAAAALAB8AAAACAAEAAAALACAAAAACAAEAAAALACEAAAACAAEAAAALACIAAAACAAEAAAALACMAAAACAAEAAAALACQAAAACAAEAAAALACUAAAACAAEAAAALACYAAAACAAEAAAALACcAAAACAAEAAAALACgAAAACAAEAAAAMAAAAAAACAAEAAAAMAAEAAAACAAEAAAAMAAIAAAACAAEAAAAMAAMAAAACAAEAAAAMAAQAAAACAAEAAAAMAAUAAAACAAEAAAAMAAYAAAACAAEAAAAMAAgAAAACAAEAAAAMAAkAAAACAAEAAAAMAAoAAAACAAEAAAAMAAsAAAACAAEAAAAMAAwAAAACAAEAAAAMAA0AAAACAAEAAAAMAA4AAAACAAEAAAAMABAAAAACAAEAAAAMABEAAAACAAEAAAAMABIAAAACAAEAAAAMABQAAAACAAEAAAAMABUAAAACAAEAAAAMABYAAAACAAEAAAAMABcAAAACAAEAAAAMABgAAAACAAEAAAAMABkAAAACAAEAAAAMABoAAAACAAEAAAAMABsAAAACAAEAAAAMABwAAAACAAEAAAAMAB0AAAACAAEAAAAMAB4AAAACAAEAAAAMAB8AAAACAAEAAAAMACAAAAACAAEAAAAMACEAAAACAAEAAAAMACIAAAACAAEAAAAMACMAAAACAAEAAAAMACQAAAACAAEAAAAMACUAAAACAAEAAAAMACYAAAACAAEAAAAMACcAAAACAAEAAAAMACgAAAACAAEAAAANAAAAAAACAAEAAAANAAEAAAACAAEAAAANAAIAAAACAAEAAAANAAMAAAACAAEAAAANAAQAAAACAAEAAAANAAUAAAACAAEAAAANAAYAAAACAAEAAAANAAgAAAACAAEAAAANAAkAAAACAAEAAAANAAoAAAACAAEAAAANAAsAAAACAAEAAAANAAwAAAACAAEAAAANAA0AAAACAAEAAAANAA4AAAACAAEAAAANABEAAAACAAEAAAANABIAAAACAAEAAAANABQAAAACAAEAAAANABUAAAACAAEAAAANABYAAAACAAEAAAANABcAAAACAAEAAAANABgAAAACAAEAAAANABkAAAACAAEAAAANABoAAAACAAEAAAANABsAAAACAAEAAAANABwAAAACAAEAAAANAB0AAAACAAEAAAANAB4AAAACAAEAAAANAB8AAAACAAEAAAANACAAAAACAAEAAAANACEAAAACAAEAAAANACIAAAACAAEAAAANACMAAAACAAEAAAANACQAAAACAAEAAAANACUAAAACAAEAAAANACYAAAACAAEAAAANACcAAAACAAEAAAANACgAAAACAAEAAAAOAAAAAAACAAEAAAAOAAEAAAACAAEAAAAOAAIAAAACAAEAAAAOAAMAAAACAAEAAAAOAAQAAAACAAEAAAAOAAUAAAACAAEAAAAOAAYAAAACAAEAAAAOAAcAAAACAAEAAAAOAAkAAAACAAEAAAAOAAoAAAACAAEAAAAOAAsAAAACAAEAAAAOAAwAAAACAAEAAAAOAA0AAAACAAEAAAAOAA4AAAACAAEAAAAOAA8AAAACAAEAAAAOABEAAAACAAEAAAAOABIAAAACAAEAAAAOABQAAAACAAEAAAAOABUAAAACAAEAAAAOABYAAAACAAEAAAAOABcAAAACAAEAAAAOABgAAAACAAEAAAAOABkAAAACAAEAAAAOABoAAAACAAEAAAAOABsAAAACAAEAAAAOABwAAAACAAEAAAAOAB0AAAACAAEAAAAOAB4AAAACAAEAAAAOAB8AAAACAAEAAAAOACAAAAACAAEAAAAOACEAAAACAAEAAAAOACIAAAACAAEAAAAOACMAAAACAAEAAAAOACQAAAACAAEAAAAOACUAAAACAAEAAAAOACYAAAACAAEAAAAOACcAAAACAAEAAAAOACgAAAACAAEAAAAPAAAAAAACAAEAAAAPAAEAAAACAAEAAAAPAAIAAAACAAEAAAAPAAMAAAACAAEAAAAPAAQAAAACAAEAAAAPAAUAAAACAAEAAAAPAAYAAAACAAEAAAAPAAcAAAACAAEAAAAPAAkAAAACAAEAAAAPAAoAAAACAAEAAAAPAAsAAAACAAEAAAAPAAwAAAACAAEAAAAPAA0AAAACAAEAAAAPAA4AAAACAAEAAAAPAA8AAAACAAEAAAAPABEAAAACAAEAAAAPABIAAAACAAEAAAAPABQAAAACAAEAAAAPABUAAAACAAEAAAAPABYAAAACAAEAAAAPABcAAAACAAEAAAAPABgAAAACAAEAAAAPABkAAAACAAEAAAAPABoAAAACAAEAAAAPABsAAAACAAEAAAAPABwAAAACAAEAAAAPAB0AAAACAAEAAAAPAB4AAAACAAEAAAAPAB8AAAACAAEAAAAPACAAAAACAAEAAAAPACEAAAACAAEAAAAPACIAAAACAAEAAAAPACMAAAACAAEAAAAPACQAAAACAAEAAAAPACUAAAACAAEAAAAPACYAAAACAAEAAAAPACcAAAACAAEAAAAPACgAAAACAAEAAAAQAAAAAAACAAEAAAAQAAEAAAACAAEAAAAQAAIAAAACAAEAAAAQAAMAAAACAAEAAAAQAAQAAAACAAEAAAAQAAUAAAACAAEAAAAQAAYAAAACAAEAAAAQAAcAAAACAAEAAAAQAAkAAAACAAEAAAAQAAoAAAACAAEAAAAQAAsAAAACAAEAAAAQAAwAAAACAAEAAAAQAA0AAAACAAEAAAAQAA4AAAACAAEAAAAQAA8AAAACAAEAAAAQABEAAAACAAEAAAAQABIAAAACAAEAAAAQABMAAAACAAEAAAAQABUAAAACAAEAAAAQABYAAAACAAEAAAAQABcAAAACAAEAAAAQABgAAAACAAEAAAAQABkAAAACAAEAAAAQABoAAAACAAEAAAAQABsAAAACAAEAAAAQABwAAAACAAEAAAAQAB0AAAACAAEAAAAQAB4AAAACAAEAAAAQAB8AAAACAAEAAAAQACAAAAACAAEAAAAQACEAAAACAAEAAAAQACIAAAACAAEAAAAQACMAAAACAAEAAAAQACQAAAACAAEAAAAQACUAAAACAAEAAAAQACYAAAACAAEAAAAQACcAAAACAAEAAAAQACgAAAACAAEAAAARAAAAAAACAAEAAAARAAEAAAACAAEAAAARAAIAAAACAAEAAAARAAMAAAACAAEAAAARAAQAAAACAAEAAAARAAUAAAACAAEAAAARAAYAAAACAAEAAAARAAcAAAACAAEAAAARAAkAAAACAAEAAAARAAoAAAACAAEAAAARAAsAAAACAAEAAAARAAwAAAACAAEAAAARAA0AAAACAAEAAAARAA4AAAACAAEAAAARAA8AAAACAAEAAAARABEAAAACAAEAAAARABIAAAACAAEAAAARABMAAAACAAEAAAARABUAAAACAAEAAAARABYAAAACAAEAAAARABcAAAACAAEAAAARABgAAAACAAEAAAARABkAAAACAAEAAAARABoAAAACAAEAAAARABsAAAACAAEAAAARABwAAAACAAEAAAARAB0AAAACAAEAAAARAB4AAAACAAEAAAARAB8AAAACAAEAAAARACAAAAACAAEAAAARACEAAAACAAEAAAARACIAAAACAAEAAAARACMAAAACAAEAAAARACQAAAACAAEAAAARACUAAAACAAEAAAARACYAAAACAAEAAAARACcAAAACAAEAAAARACgAAAACAAEAAAASAAAAAAACAAEAAAASAAEAAAACAAEAAAASAAIAAAACAAEAAAASAAMAAAACAAEAAAASAAQAAAACAAEAAAASAAUAAAACAAEAAAASAAYAAAACAAEAAAASAAcAAAACAAEAAAASAAgAAAACAAEAAAASAAoAAAACAAEAAAASAAsAAAACAAEAAAASAAwAAAACAAEAAAASAA0AAAACAAEAAAASAA4AAAACAAEAAAASAA8AAAACAAEAAAASABEAAAACAAEAAAASABIAAAACAAEAAAASABMAAAACAAEAAAASABUAAAACAAEAAAASABYAAAACAAEAAAASABcAAAACAAEAAAASABgAAAACAAEAAAASABkAAAACAAEAAAASABoAAAACAAEAAAASABsAAAACAAEAAAASABwAAAACAAEAAAASAB0AAAACAAEAAAASAB4AAAACAAEAAAASAB8AAAACAAEAAAASACAAAAACAAEAAAASACEAAAACAAEAAAASACIAAAACAAEAAAASACMAAAACAAEAAAASACQAAAACAAEAAAASACUAAAACAAEAAAASACYAAAACAAEAAAASACcAAAACAAEAAAASACgAAAACAAEAAAATAAAAAAACAAEAAAATAAEAAAACAAEAAAATAAIAAAACAAEAAAATAAMAAAACAAEAAAATAAQAAAACAAEAAAATAAUAAAACAAEAAAATAAYAAAACAAEAAAATAAcAAAACAAEAAAATAAgAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAEAAAATABMAAAACAAEAAAATABUAAAACAAEAAAATABYAAAACAAEAAAATABcAAAACAAEAAAATABgAAAACAAEAAAATABkAAAACAAEAAAATABoAAAACAAEAAAATABsAAAACAAEAAAATABwAAAACAAEAAAATAB0AAAACAAEAAAATAB4AAAACAAEAAAATAB8AAAACAAEAAAATACAAAAACAAEAAAATACEAAAACAAEAAAATACIAAAACAAEAAAATACMAAAACAAEAAAATACQAAAACAAEAAAATACUAAAACAAEAAAATACYAAAACAAEAAAATACcAAAACAAEAAAATACgAAAACAAEAAAAUAAAAAAACAAEAAAAUAAEAAAACAAEAAAAUAAIAAAACAAEAAAAUAAMAAAACAAEAAAAUAAQAAAACAAEAAAAUAAUAAAACAAEAAAAUAAYAAAACAAEAAAAUAAcAAAACAAEAAAAUAAgAAAACAAEAAAAUAAkAAAACAAEAAAAUAAsAAAACAAEAAAAUAAwAAAACAAEAAAAUAA8AAAACAAEAAAAUABEAAAACAAEAAAAUABIAAAACAAEAAAAUABUAAAACAAEAAAAUABYAAAACAAEAAAAUABcAAAACAAEAAAAUABgAAAACAAEAAAAUABkAAAACAAEAAAAUABoAAAACAAEAAAAUABsAAAACAAEAAAAUABwAAAACAAEAAAAUAB0AAAACAAEAAAAUAB4AAAACAAEAAAAUAB8AAAACAAEAAAAUACAAAAACAAEAAAAUACEAAAACAAEAAAAUACIAAAACAAEAAAAUACMAAAACAAEAAAAUACQAAAACAAEAAAAUACUAAAACAAEAAAAUACYAAAACAAEAAAAUACcAAAACAAEAAAAUACgAAAACAAEAAAAVAAAAAAACAAEAAAAVAAEAAAACAAEAAAAVAAIAAAACAAEAAAAVAAMAAAACAAEAAAAVAAQAAAACAAEAAAAVAAUAAAACAAEAAAAVAAYAAAACAAEAAAAVAAcAAAACAAEAAAAVAAgAAAACAAEAAAAVAAkAAAACAAEAAAAVAAsAAAACAAEAAAAVAA0AAAACAAEAAAAVAA4AAAACAAEAAAAVAA8AAAACAAEAAAAVABEAAAACAAEAAAAVABIAAAACAAEAAAAVABMAAAACAAEAAAAVABUAAAACAAEAAAAVABYAAAACAAEAAAAVABcAAAACAAEAAAAVABgAAAACAAEAAAAVABkAAAACAAEAAAAVABoAAAACAAEAAAAVABsAAAACAAEAAAAVABwAAAACAAEAAAAVAB0AAAACAAEAAAAVAB4AAAACAAEAAAAVAB8AAAACAAEAAAAVACAAAAACAAEAAAAVACEAAAACAAEAAAAVACIAAAACAAEAAAAVACMAAAACAAEAAAAVACQAAAACAAEAAAAVACUAAAACAAEAAAAVACYAAAACAAEAAAAVACcAAAACAAEAAAAVACgAAAACAAEAAAAWAAAAAAACAAEAAAAWAAEAAAACAAEAAAAWAAIAAAACAAEAAAAWAAMAAAACAAEAAAAWAAQAAAACAAEAAAAWAAUAAAACAAEAAAAWAAYAAAACAAEAAAAWAAcAAAACAAEAAAAWAAgAAAACAAEAAAAWAAkAAAACAAEAAAAWAAoAAAACAAEAAAAWAA0AAAACAAEAAAAWAA4AAAACAAEAAAAWABEAAAACAAEAAAAWABIAAAACAAEAAAAWABMAAAACAAEAAAAWABYAAAACAAEAAAAWABcAAAACAAEAAAAWABgAAAACAAEAAAAWABkAAAACAAEAAAAWABoAAAACAAEAAAAWABsAAAACAAEAAAAWABwAAAACAAEAAAAWAB0AAAACAAEAAAAWAB4AAAACAAEAAAAWAB8AAAACAAEAAAAWACAAAAACAAEAAAAWACEAAAACAAEAAAAWACIAAAACAAEAAAAWACMAAAACAAEAAAAWACQAAAACAAEAAAAWACUAAAACAAEAAAAWACYAAAACAAEAAAAWACcAAAACAAEAAAAWACgAAAACAAEAAAAXAAAAAAACAAEAAAAXAAEAAAACAAEAAAAXAAIAAAACAAEAAAAXAAMAAAACAAEAAAAXAAQAAAACAAEAAAAXAAUAAAACAAEAAAAXABkAAAACAAEAAAAXABoAAAACAAEAAAAXABsAAAACAAEAAAAXABwAAAACAAEAAAAXAB0AAAACAAEAAAAXAB4AAAACAAEAAAAXAB8AAAACAAEAAAAXACAAAAACAAEAAAAXACEAAAACAAEAAAAXACIAAAACAAEAAAAXACMAAAACAAEAAAAXACQAAAACAAEAAAAXACUAAAACAAEAAAAXACYAAAACAAEAAAAXACcAAAACAAEAAAAXACgAAAACAAEAAAAYAAAAAAACAAEAAAAYAAEAAAACAAEAAAAYAAIAAAACAAEAAAAYAAMAAAACAAEAAAAYAAQAAAACAAEAAAAYAAUAAAACAAEAAAAYABkAAAACAAEAAAAYABoAAAACAAEAAAAYABsAAAACAAEAAAAYABwAAAACAAEAAAAYAB0AAAACAAEAAAAYAB4AAAACAAEAAAAYAB8AAAACAAEAAAAYACAAAAACAAEAAAAYACEAAAACAAEAAAAYACIAAAACAAEAAAAYACMAAAACAAEAAAAYACQAAAACAAEAAAAYACUAAAACAAEAAAAYACYAAAACAAEAAAAYACcAAAACAAEAAAAYACgAAAACAAEAAAAZAAAAAAACAAEAAAAZAAEAAAACAAEAAAAZAAIAAAACAAEAAAAZAAMAAAACAAEAAAAZAAQAAAACAAEAAAAZAAUAAAACAAEAAAAZABkAAAACAAEAAAAZABoAAAACAAEAAAAZABsAAAACAAEAAAAZABwAAAACAAEAAAAZAB0AAAACAAEAAAAZAB4AAAACAAEAAAAZAB8AAAACAAEAAAAZACAAAAACAAEAAAAZACEAAAACAAEAAAAZACIAAAACAAEAAAAZACMAAAACAAEAAAAZACQAAAACAAEAAAAZACUAAAACAAEAAAAZACYAAAACAAEAAAAZACcAAAACAAEAAAAZACgAAAACAAEAAAAaAAAAAAACAAEAAAAaAAEAAAACAAEAAAAaAAIAAAACAAEAAAAaAAMAAAACAAEAAAAaAAQAAAACAAEAAAAaAAUAAAACAAEAAAAaABkAAAACAAEAAAAaABoAAAACAAEAAAAaABsAAAACAAEAAAAaABwAAAACAAEAAAAaAB0AAAACAAEAAAAaAB4AAAACAAEAAAAaAB8AAAACAAEAAAAaACAAAAACAAEAAAAaACEAAAACAAEAAAAaACIAAAACAAEAAAAaACMAAAACAAEAAAAaACQAAAACAAEAAAAaACUAAAACAAEAAAAaACYAAAACAAEAAAAaACcAAAACAAEAAAAaACgAAAACAAEAAAAbAAAAAAACAAEAAAAbAAEAAAACAAEAAAAbAAIAAAACAAEAAAAbAAMAAAACAAEAAAAbAAQAAAACAAEAAAAbAAUAAAACAAEAAAAbABkAAAACAAEAAAAbABoAAAACAAEAAAAbABsAAAACAAEAAAAbABwAAAACAAEAAAAbAB0AAAACAAEAAAAbAB4AAAACAAEAAAAbAB8AAAACAAEAAAAbACAAAAACAAEAAAAbACEAAAACAAEAAAAbACIAAAACAAEAAAAbACMAAAACAAEAAAAbACQAAAACAAEAAAAbACUAAAACAAEAAAAbACYAAAACAAEAAAAbACcAAAACAAEAAAAbACgAAAACAAEAAAAcAAAAAAACAAEAAAAcAAEAAAACAAEAAAAcAAIAAAACAAEAAAAcAAMAAAACAAEAAAAcAAQAAAACAAEAAAAcAAUAAAACAAEAAAAcABkAAAABAAEAAAAcABoAAAABAAEAAAAcABsAAAABAAEAAAAcABwAAAABAAIAAAAcAB0AAAACAAEAAAAcAB4AAAACAAEAAAAcAB8AAAACAAEAAAAcACAAAAACAAEAAAAcACEAAAACAAEAAAAcACIAAAACAAEAAAAcACMAAAACAAEAAAAcACQAAAACAAEAAAAcACUAAAACAAEAAAAcACYAAAACAAEAAAAcACcAAAACAAEAAAAcACgAAAACAAEAAAAdAAAAAAACAAEAAAAdAAEAAAACAAEAAAAdAAIAAAACAAEAAAAdAAMAAAACAAEAAAAdAAQAAAACAAEAAAAdAAUAAAACAAEAAAAdABkAAAAAAAIAAAAdABoAAAAAAAIAAAAdABsAAAAAAAIAAAAdABwAAAACAAIAAAAdAB0AAAACAAEAAAAdAB4AAAACAAEAAAAdAB8AAAACAAEAAAAdACAAAAACAAEAAAAdACEAAAACAAEAAAAdACIAAAACAAEAAAAdACMAAAACAAEAAAAdACQAAAACAAEAAAAdACUAAAACAAEAAAAdACYAAAACAAEAAAAdACcAAAACAAEAAAAdACgAAAACAAEAAAAeAAAAAAACAAEAAAAeAAEAAAACAAEAAAAeAAIAAAACAAEAAAAeAAMAAAACAAEAAAAeAAQAAAACAAEAAAAeAAUAAAACAAEAAAAeABkAAAAAAAIAAAAeABoAAAAAAAIAAAAeABsAAAAAAAIAAAAeABwAAAACAAIAAAAeAB0AAAACAAEAAAAeAB4AAAACAAEAAAAeAB8AAAACAAEAAAAeACAAAAACAAEAAAAeACEAAAACAAEAAAAeACIAAAACAAEAAAAeACMAAAACAAEAAAAeACQAAAACAAEAAAAeACUAAAACAAEAAAAeACYAAAACAAEAAAAeACcAAAACAAEAAAAeACgAAAACAAEAAAAfAAAAAAACAAEAAAAfAAEAAAACAAEAAAAfAAIAAAACAAEAAAAfAAMAAAACAAEAAAAfAAQAAAACAAEAAAAfAAUAAAACAAEAAAAfABkAAAAAAAIAAAAfABoAAAAAAAIAAAAfABsAAAAAAAIAAAAfABwAAAACAAIAAAAfAB0AAAACAAEAAAAfAB4AAAACAAEAAAAfAB8AAAACAAEAAAAfACAAAAACAAEAAAAfACEAAAACAAEAAAAfACIAAAACAAEAAAAfACMAAAACAAEAAAAfACQAAAACAAEAAAAfACUAAAACAAEAAAAfACYAAAACAAEAAAAfACcAAAACAAEAAAAfACgAAAACAAEAAAAgAAAAAAACAAEAAAAgAAEAAAACAAEAAAAgAAIAAAACAAEAAAAgAAMAAAACAAEAAAAgAAQAAAACAAEAAAAgAAUAAAACAAEAAAAgABkAAAAAAAIAAAAgABoAAAAAAAIAAAAgABsAAAAAAAIAAAAgABwAAAACAAIAAAAgAB0AAAACAAEAAAAgAB4AAAACAAEAAAAgAB8AAAACAAEAAAAgACAAAAACAAEAAAAgACEAAAACAAEAAAAgACIAAAACAAEAAAAgACMAAAACAAEAAAAgACQAAAACAAEAAAAgACUAAAACAAEAAAAgACYAAAACAAEAAAAgACcAAAACAAEAAAAgACgAAAACAAEAAAAhAAAAAAACAAEAAAAhAAEAAAACAAEAAAAhAAIAAAACAAEAAAAhAAMAAAACAAEAAAAhAAQAAAACAAEAAAAhAAUAAAACAAEAAAAhABkAAAAAAAIAAAAhABoAAAAAAAIAAAAhABsAAAAAAAIAAAAhABwAAAACAAIAAAAhAB0AAAACAAEAAAAhAB4AAAACAAEAAAAhAB8AAAACAAEAAAAhACAAAAACAAEAAAAhACEAAAACAAEAAAAhACIAAAACAAEAAAAhACMAAAACAAEAAAAhACQAAAACAAEAAAAhACUAAAACAAEAAAAhACYAAAACAAEAAAAhACcAAAACAAEAAAAhACgAAAACAAEAAAAiAAAAAAACAAEAAAAiAAEAAAACAAEAAAAiAAIAAAACAAEAAAAiAAMAAAACAAEAAAAiAAQAAAACAAEAAAAiAAUAAAACAAEAAAAiABkAAAAAAAIAAAAiABoAAAAAAAIAAAAiABsAAAAAAAIAAAAiABwAAAACAAIAAAAiAB0AAAACAAEAAAAiAB4AAAACAAEAAAAiAB8AAAACAAEAAAAiACAAAAACAAEAAAAiACEAAAACAAEAAAAiACIAAAACAAEAAAAiACMAAAACAAEAAAAiACQAAAACAAEAAAAiACUAAAACAAEAAAAiACYAAAACAAEAAAAiACcAAAACAAEAAAAiACgAAAACAAEAAAAjAAAAAAACAAEAAAAjAAEAAAACAAEAAAAjAAIAAAACAAEAAAAjAAMAAAACAAEAAAAjAAQAAAACAAEAAAAjAAUAAAACAAEAAAAjABkAAAAAAAIAAAAjABoAAAAAAAIAAAAjABsAAAAAAAIAAAAjABwAAAAAAAAAAAAjAB0AAAACAAEAAAAjAB4AAAACAAEAAAAjAB8AAAACAAEAAAAjACAAAAACAAEAAAAjACEAAAACAAEAAAAjACIAAAACAAEAAAAjACMAAAACAAEAAAAjACQAAAACAAEAAAAjACUAAAACAAEAAAAjACYAAAACAAEAAAAjACcAAAACAAEAAAAjACgAAAACAAEAAAAkAAAAAAACAAEAAAAkAAEAAAACAAEAAAAkAAIAAAACAAEAAAAkAAMAAAACAAEAAAAkAAQAAAACAAEAAAAkAAUAAAACAAEAAAAkABkAAAAAAAIAAAAkABoAAAAAAAIAAAAkABsAAAAAAAIAAAAkABwAAAAAAAAAAAAkAB0AAAACAAEAAAAkAB4AAAACAAEAAAAkAB8AAAACAAEAAAAkACAAAAACAAEAAAAkACEAAAACAAEAAAAkACIAAAACAAEAAAAkACMAAAACAAEAAAAkACQAAAACAAEAAAAkACUAAAACAAEAAAAkACYAAAACAAEAAAAkACcAAAACAAEAAAAkACgAAAACAAEAAAAlAAAAAAACAAEAAAAlAAEAAAACAAEAAAAlAAIAAAACAAEAAAAlAAMAAAACAAEAAAAlAAQAAAACAAEAAAAlAAUAAAACAAEAAAAlABkAAAAAAAIAAAAlABoAAAAAAAIAAAAlABsAAAAAAAIAAAAlABwAAAAAAAAAAAAlAB0AAAACAAEAAAAlAB4AAAACAAEAAAAlAB8AAAACAAEAAAAlACAAAAACAAEAAAAlACEAAAACAAEAAAAlACIAAAACAAEAAAAlACMAAAACAAEAAAAlACQAAAACAAEAAAAlACUAAAACAAEAAAAlACYAAAACAAEAAAAlACcAAAACAAEAAAAlACgAAAACAAEAAAAmAAAAAAACAAEAAAAmAAEAAAACAAEAAAAmAAIAAAACAAEAAAAmAAMAAAACAAEAAAAmAAQAAAACAAEAAAAmAAUAAAACAAEAAAAmABkAAAAAAAIAAAAmABoAAAAAAAIAAAAmABsAAAAAAAIAAAAmABwAAAACAAIAAAAmAB0AAAACAAEAAAAmAB4AAAACAAEAAAAmAB8AAAACAAEAAAAmACAAAAACAAEAAAAmACEAAAACAAEAAAAmACIAAAACAAEAAAAmACMAAAACAAEAAAAmACQAAAACAAEAAAAmACUAAAACAAEAAAAmACYAAAACAAEAAAAmACcAAAACAAEAAAAmACgAAAACAAEAAAAnAAAAAAACAAEAAAAnAAEAAAACAAEAAAAnAAIAAAACAAEAAAAnAAMAAAACAAEAAAAnAAQAAAACAAEAAAAnAAUAAAACAAEAAAAnABkAAAAAAAIAAAAnABoAAAAAAAIAAAAnABsAAAAAAAIAAAAnABwAAAACAAIAAAAnAB0AAAACAAEAAAAnAB4AAAACAAEAAAAnAB8AAAACAAEAAAAnACAAAAACAAEAAAAnACEAAAACAAEAAAAnACIAAAACAAEAAAAnACMAAAACAAEAAAAnACQAAAACAAEAAAAnACUAAAACAAEAAAAnACYAAAACAAEAAAAnACcAAAACAAEAAAAnACgAAAACAAEAAAAoAAAAAAACAAEAAAAoAAEAAAACAAEAAAAoAAIAAAACAAEAAAAoAAMAAAACAAEAAAAoAAQAAAACAAEAAAAoAAUAAAACAAEAAAAoABkAAAAAAAIAAAAoABoAAAAAAAIAAAAoABsAAAAAAAIAAAAoABwAAAACAAIAAAAoAB0AAAACAAEAAAAoAB4AAAACAAEAAAAoAB8AAAACAAEAAAAoACAAAAACAAEAAAAoACEAAAACAAEAAAAoACIAAAACAAEAAAAoACMAAAACAAEAAAAoACQAAAACAAEAAAAoACUAAAACAAEAAAAoACYAAAACAAEAAAAoACcAAAACAAEAAAAoACgAAAACAAEAAAApAAAAAAACAAEAAAApAAEAAAACAAEAAAApAAIAAAACAAEAAAApAAMAAAACAAEAAAApAAQAAAACAAEAAAApAAUAAAACAAEAAAApABkAAAAAAAIAAAApABoAAAAAAAIAAAApABsAAAAAAAIAAAApABwAAAACAAIAAAApAB0AAAACAAEAAAApAB4AAAACAAEAAAApAB8AAAACAAEAAAApACAAAAACAAEAAAApACEAAAACAAEAAAApACIAAAACAAEAAAApACMAAAACAAEAAAApACQAAAACAAEAAAApACUAAAACAAEAAAApACYAAAACAAEAAAApACcAAAACAAEAAAApACgAAAACAAEAAAAqAAAAAAACAAEAAAAqAAEAAAACAAEAAAAqAAIAAAACAAEAAAAqAAMAAAACAAEAAAAqAAQAAAACAAEAAAAqAAUAAAACAAEAAAAqAAYAAAACAAEAAAAqAAcAAAACAAEAAAAqAAgAAAACAAEAAAAqAAkAAAACAAEAAAAqAAoAAAACAAEAAAAqAAsAAAACAAEAAAAqAAwAAAACAAMAAAAqAA0AAAACAAQAAAAqAA4AAAACAAUAAAAqAA8AAAAAAAIAAAAqABAAAAAAAAIAAAAqABEAAAAAAAIAAAAqABIAAAAAAAIAAAAqABMAAAAAAAIAAAAqABQAAAAAAAIAAAAqABUAAAAAAAIAAAAqABYAAAAAAAIAAAAqABcAAAAAAAIAAAAqABgAAAAAAAIAAAAqABkAAAAAAAIAAAAqABoAAAAAAAIAAAAqABsAAAAAAAIAAAAqABwAAAACAAIAAAAqAB0AAAACAAEAAAAqAB4AAAACAAEAAAAqAB8AAAACAAEAAAAqACAAAAACAAEAAAAqACEAAAACAAEAAAAqACIAAAACAAEAAAAqACMAAAACAAEAAAAqACQAAAACAAEAAAAqACUAAAACAAEAAAAqACYAAAACAAEAAAAqACcAAAACAAEAAAAqACgAAAACAAEAAAArAAAAAAACAAEAAAArAAEAAAACAAEAAAArAAIAAAACAAEAAAArAAMAAAACAAEAAAArAAQAAAACAAEAAAArAAUAAAACAAEAAAArAAYAAAACAAEAAAArAAcAAAACAAEAAAArAAgAAAACAAEAAAArAAkAAAACAAEAAAArAAoAAAACAAEAAAArAAsAAAACAAEAAAArAAwAAAADAAMAAAArAA0AAAADAAQAAAArAA4AAAADAAUAAAArAA8AAAAAAAIAAAArABAAAAAAAAIAAAArABEAAAAAAAIAAAArABIAAAAAAAIAAAArABMAAAAAAAIAAAArABQAAAAAAAIAAAArABYAAAAAAAIAAAArABcAAAAAAAIAAAArABgAAAAAAAIAAAArABkAAAAAAAIAAAArABoAAAAAAAIAAAArABsAAAAAAAIAAAArABwAAAACAAIAAAArAB0AAAACAAEAAAArAB4AAAACAAEAAAArAB8AAAACAAEAAAArACAAAAACAAEAAAArACEAAAACAAEAAAArACIAAAACAAEAAAArACMAAAACAAEAAAArACQAAAACAAEAAAArACUAAAACAAEAAAArACYAAAACAAEAAAArACcAAAACAAEAAAArACgAAAACAAEAAAAsAAAAAAACAAEAAAAsAAEAAAACAAEAAAAsAAIAAAACAAEAAAAsAAMAAAACAAEAAAAsAAQAAAACAAEAAAAsAAUAAAACAAEAAAAsAAYAAAACAAEAAAAsAAcAAAACAAEAAAAsAAgAAAACAAEAAAAsAAkAAAACAAEAAAAsAAoAAAACAAEAAAAsAAsAAAACAAEAAAAsAAwAAAACAAEAAAAsAA0AAAACAAEAAAAsAA4AAAADAAAAAAAsABAAAAADAAEAAAAsABEAAAADAAEAAAAsABIAAAADAAEAAAAsABMAAAADAAEAAAAsABQAAAADAAEAAAAsABUAAAADAAEAAAAsABYAAAADAAEAAAAsABcAAAADAAEAAAAsABgAAAADAAEAAAAsABkAAAADAAEAAAAsABoAAAADAAEAAAAsABsAAAADAAEAAAAsABwAAAADAAIAAAAsAB0AAAACAAEAAAAsAB4AAAACAAEAAAAsAB8AAAACAAEAAAAsACAAAAACAAEAAAAsACEAAAACAAEAAAAsACIAAAACAAEAAAAsACMAAAACAAEAAAAsACQAAAACAAEAAAAsACUAAAACAAEAAAAsACYAAAACAAEAAAAsACcAAAACAAEAAAAsACgAAAACAAEAAAAtAAAAAAACAAEAAAAtAAEAAAACAAEAAAAtAAIAAAACAAEAAAAtAAMAAAACAAEAAAAtAAQAAAACAAEAAAAtAAUAAAACAAEAAAAtAAYAAAACAAEAAAAtAAcAAAACAAEAAAAtAAgAAAACAAEAAAAtAAkAAAACAAEAAAAtAAoAAAACAAEAAAAtAAsAAAACAAEAAAAtAAwAAAACAAEAAAAtAA0AAAACAAEAAAAtAA4AAAACAAEAAAAtAA8AAAACAAEAAAAtABAAAAACAAEAAAAtABEAAAACAAEAAAAtABIAAAACAAEAAAAtABMAAAACAAEAAAAtABQAAAACAAEAAAAtABUAAAACAAEAAAAtABYAAAACAAEAAAAtABcAAAACAAEAAAAtABgAAAACAAEAAAAtABkAAAACAAEAAAAtABoAAAACAAEAAAAtABsAAAACAAEAAAAtABwAAAACAAEAAAAtAB0AAAACAAEAAAAtAB4AAAACAAEAAAAtAB8AAAACAAEAAAAtACAAAAACAAEAAAAtACEAAAACAAEAAAAtACIAAAACAAEAAAAtACMAAAACAAEAAAAtACQAAAACAAEAAAAtACUAAAACAAEAAAAtACYAAAACAAEAAAAtACcAAAACAAEAAAAtACgAAAACAAEAAAAuAAAAAAACAAEAAAAuAAEAAAACAAEAAAAuAAIAAAACAAEAAAAuAAMAAAACAAEAAAAuAAQAAAACAAEAAAAuAAUAAAACAAEAAAAuAAYAAAACAAEAAAAuAAcAAAACAAEAAAAuAAgAAAACAAEAAAAuAAkAAAACAAEAAAAuAAoAAAACAAEAAAAuAAsAAAACAAEAAAAuAAwAAAACAAEAAAAuAA0AAAACAAEAAAAuAA4AAAACAAEAAAAuAA8AAAACAAEAAAAuABAAAAACAAEAAAAuABEAAAACAAEAAAAuABIAAAACAAEAAAAuABMAAAACAAEAAAAuABQAAAACAAEAAAAuABUAAAACAAEAAAAuABYAAAACAAEAAAAuABcAAAACAAEAAAAuABgAAAACAAEAAAAuABkAAAACAAEAAAAuABoAAAACAAEAAAAuABsAAAACAAEAAAAuABwAAAACAAEAAAAuAB0AAAACAAEAAAAuAB4AAAACAAEAAAAuAB8AAAACAAEAAAAuACAAAAACAAEAAAAuACEAAAACAAEAAAAuACIAAAACAAEAAAAuACMAAAACAAEAAAAuACQAAAACAAEAAAAuACUAAAACAAEAAAAuACYAAAACAAEAAAAuACcAAAACAAEAAAAuACgAAAACAAEAAAAvAAAAAAACAAEAAAAvAAEAAAACAAEAAAAvAAIAAAACAAEAAAAvAAMAAAACAAEAAAAvAAQAAAACAAEAAAAvAAUAAAACAAEAAAAvAAYAAAACAAEAAAAvAAcAAAACAAEAAAAvAAgAAAACAAEAAAAvAAkAAAACAAEAAAAvAAoAAAACAAEAAAAvAAsAAAACAAEAAAAvAAwAAAACAAEAAAAvAA0AAAACAAEAAAAvAA4AAAACAAEAAAAvAA8AAAACAAEAAAAvABAAAAACAAEAAAAvABEAAAACAAEAAAAvABIAAAACAAEAAAAvABMAAAACAAEAAAAvABQAAAACAAEAAAAvABUAAAACAAEAAAAvABYAAAACAAEAAAAvABcAAAACAAEAAAAvABgAAAACAAEAAAAvABkAAAACAAEAAAAvABoAAAACAAEAAAAvABsAAAACAAEAAAAvABwAAAACAAEAAAAvAB0AAAACAAEAAAAvAB4AAAACAAEAAAAvAB8AAAACAAEAAAAvACAAAAACAAEAAAAvACEAAAACAAEAAAAvACIAAAACAAEAAAAvACMAAAACAAEAAAAvACQAAAACAAEAAAAvACUAAAACAAEAAAAvACYAAAACAAEAAAAvACcAAAACAAEAAAAvACgAAAACAAEAAAAwAAAAAAACAAEAAAAwAAEAAAACAAEAAAAwAAIAAAACAAEAAAAwAAMAAAACAAEAAAAwAAQAAAACAAEAAAAwAAUAAAACAAEAAAAwAAYAAAACAAEAAAAwAAcAAAACAAEAAAAwAAgAAAACAAEAAAAwAAkAAAACAAEAAAAwAAoAAAACAAEAAAAwAAsAAAACAAEAAAAwAAwAAAACAAEAAAAwAA0AAAACAAEAAAAwAA4AAAACAAEAAAAwAA8AAAACAAEAAAAwABAAAAACAAEAAAAwABEAAAACAAEAAAAwABIAAAACAAEAAAAwABMAAAACAAEAAAAwABQAAAACAAEAAAAwABUAAAACAAEAAAAwABYAAAACAAEAAAAwABcAAAACAAEAAAAwABgAAAACAAEAAAAwABkAAAACAAEAAAAwABoAAAACAAEAAAAwABsAAAACAAEAAAAwABwAAAACAAEAAAAwAB0AAAACAAEAAAAwAB4AAAACAAEAAAAwAB8AAAACAAEAAAAwACAAAAACAAEAAAAwACEAAAACAAEAAAAwACIAAAACAAEAAAAwACMAAAACAAEAAAAwACQAAAACAAEAAAAwACUAAAACAAEAAAAwACYAAAACAAEAAAAwACcAAAACAAEAAAAwACgAAAACAAEAAAAxAAAAAAACAAEAAAAxAAEAAAACAAEAAAAxAAIAAAACAAEAAAAxAAMAAAACAAEAAAAxAAQAAAACAAEAAAAxAAUAAAACAAEAAAAxAAYAAAACAAEAAAAxAAcAAAACAAEAAAAxAAgAAAACAAEAAAAxAAkAAAACAAEAAAAxAAoAAAACAAEAAAAxAAsAAAACAAEAAAAxAAwAAAACAAEAAAAxAA0AAAACAAEAAAAxAA4AAAACAAEAAAAxAA8AAAACAAEAAAAxABAAAAACAAEAAAAxABEAAAACAAEAAAAxABIAAAACAAEAAAAxABMAAAACAAEAAAAxABQAAAACAAEAAAAxABUAAAACAAEAAAAxABYAAAACAAEAAAAxABcAAAACAAEAAAAxABgAAAACAAEAAAAxABkAAAACAAEAAAAxABoAAAACAAEAAAAxABsAAAACAAEAAAAxABwAAAACAAEAAAAxAB0AAAACAAEAAAAxAB4AAAACAAEAAAAxAB8AAAACAAEAAAAxACAAAAACAAEAAAAxACEAAAACAAEAAAAxACIAAAACAAEAAAAxACMAAAACAAEAAAAxACQAAAACAAEAAAAxACUAAAACAAEAAAAxACYAAAACAAEAAAAxACcAAAACAAEAAAAxACgAAAACAAEAAAAyAAAAAAACAAEAAAAyAAEAAAACAAEAAAAyAAIAAAACAAEAAAAyAAMAAAACAAEAAAAyAAQAAAACAAEAAAAyAAUAAAACAAEAAAAyAAYAAAACAAEAAAAyAAcAAAACAAEAAAAyAAgAAAACAAEAAAAyAAkAAAACAAEAAAAyAAoAAAACAAEAAAAyAAsAAAACAAEAAAAyAAwAAAACAAEAAAAyAA0AAAACAAEAAAAyAA4AAAACAAEAAAAyAA8AAAACAAEAAAAyABAAAAACAAEAAAAyABEAAAACAAEAAAAyABIAAAACAAEAAAAyABMAAAACAAEAAAAyABQAAAACAAEAAAAyABUAAAACAAEAAAAyABYAAAACAAEAAAAyABcAAAACAAEAAAAyABgAAAACAAEAAAAyABkAAAACAAEAAAAyABoAAAACAAEAAAAyABsAAAACAAEAAAAyABwAAAACAAEAAAAyAB0AAAACAAEAAAAyAB4AAAACAAEAAAAyAB8AAAACAAEAAAAyACAAAAACAAEAAAAyACEAAAACAAEAAAAyACIAAAACAAEAAAAyACMAAAACAAEAAAAyACQAAAACAAEAAAAyACUAAAACAAEAAAAyACYAAAACAAEAAAAyACcAAAACAAEAAAAyACgAAAACAAEAAAAzAAAAAAACAAEAAAAzAAEAAAACAAEAAAAzAAIAAAACAAEAAAAzAAMAAAACAAEAAAAzAAQAAAACAAEAAAAzAAUAAAACAAEAAAAzAAYAAAACAAEAAAAzAAcAAAACAAEAAAAzAAgAAAACAAEAAAAzAAkAAAACAAEAAAAzAAoAAAACAAEAAAAzAAsAAAACAAEAAAAzAAwAAAACAAEAAAAzAA0AAAACAAEAAAAzAA4AAAACAAEAAAAzAA8AAAACAAEAAAAzABAAAAACAAEAAAAzABEAAAACAAEAAAAzABIAAAACAAEAAAAzABMAAAACAAEAAAAzABQAAAACAAEAAAAzABUAAAACAAEAAAAzABYAAAACAAEAAAAzABcAAAACAAEAAAAzABgAAAACAAEAAAAzABkAAAACAAEAAAAzABoAAAACAAEAAAAzABsAAAACAAEAAAAzABwAAAACAAEAAAAzAB0AAAACAAEAAAAzAB4AAAACAAEAAAAzAB8AAAACAAEAAAAzACAAAAACAAEAAAAzACEAAAACAAEAAAAzACIAAAACAAEAAAAzACMAAAACAAEAAAAzACQAAAACAAEAAAAzACUAAAACAAEAAAAzACYAAAACAAEAAAAzACcAAAACAAEAAAAzACgAAAACAAEAAAA0AAAAAAACAAEAAAA0AAEAAAACAAEAAAA0AAIAAAACAAEAAAA0AAMAAAACAAEAAAA0AAQAAAACAAEAAAA0AAUAAAACAAEAAAA0AAYAAAACAAEAAAA0AAcAAAACAAEAAAA0AAgAAAACAAEAAAA0AAkAAAACAAEAAAA0AAoAAAACAAEAAAA0AAsAAAACAAEAAAA0AAwAAAACAAEAAAA0AA0AAAACAAEAAAA0AA4AAAACAAEAAAA0AA8AAAACAAEAAAA0ABAAAAACAAEAAAA0ABEAAAACAAEAAAA0ABIAAAACAAEAAAA0ABMAAAACAAEAAAA0ABQAAAACAAEAAAA0ABUAAAACAAEAAAA0ABYAAAACAAEAAAA0ABcAAAACAAEAAAA0ABgAAAACAAEAAAA0ABkAAAACAAEAAAA0ABoAAAACAAEAAAA0ABsAAAACAAEAAAA0ABwAAAACAAEAAAA0AB0AAAACAAEAAAA0AB4AAAACAAEAAAA0AB8AAAACAAEAAAA0ACAAAAACAAEAAAA0ACEAAAACAAEAAAA0ACIAAAACAAEAAAA0ACMAAAACAAEAAAA0ACQAAAACAAEAAAA0ACUAAAACAAEAAAA0ACYAAAACAAEAAAA0ACcAAAACAAEAAAA0ACgAAAACAAEAAAA1AAAAAAACAAEAAAA1AAEAAAACAAEAAAA1AAIAAAACAAEAAAA1AAMAAAACAAEAAAA1AAQAAAACAAEAAAA1AAUAAAACAAEAAAA1AAYAAAACAAEAAAA1AAcAAAACAAEAAAA1AAgAAAACAAEAAAA1AAkAAAACAAEAAAA1AAoAAAACAAEAAAA1AAsAAAACAAEAAAA1AAwAAAACAAEAAAA1AA0AAAACAAEAAAA1AA4AAAACAAEAAAA1AA8AAAACAAEAAAA1ABAAAAACAAEAAAA1ABEAAAACAAEAAAA1ABIAAAACAAEAAAA1ABMAAAACAAEAAAA1ABQAAAACAAEAAAA1ABUAAAACAAEAAAA1ABYAAAACAAEAAAA1ABcAAAACAAEAAAA1ABgAAAACAAEAAAA1ABkAAAACAAEAAAA1ABoAAAACAAEAAAA1ABsAAAACAAEAAAA1ABwAAAACAAEAAAA1AB0AAAACAAEAAAA1AB4AAAACAAEAAAA1AB8AAAACAAEAAAA1ACAAAAACAAEAAAA1ACEAAAACAAEAAAA1ACIAAAACAAEAAAA1ACMAAAACAAEAAAA1ACQAAAACAAEAAAA1ACUAAAACAAEAAAA1ACYAAAACAAEAAAA1ACcAAAACAAEAAAA1ACgAAAACAAEAAAA2AAAAAAACAAEAAAA2AAEAAAACAAEAAAA2AAIAAAACAAEAAAA2AAMAAAACAAEAAAA2AAQAAAACAAEAAAA2AAUAAAACAAEAAAA2AAYAAAACAAEAAAA2AAcAAAACAAEAAAA2AAgAAAACAAEAAAA2AAkAAAACAAEAAAA2AAoAAAACAAEAAAA2AAsAAAACAAEAAAA2AAwAAAACAAEAAAA2AA0AAAACAAEAAAA2AA4AAAACAAEAAAA2AA8AAAACAAEAAAA2ABAAAAACAAEAAAA2ABEAAAACAAEAAAA2ABIAAAACAAEAAAA2ABMAAAACAAEAAAA2ABQAAAACAAEAAAA2ABUAAAACAAEAAAA2ABYAAAACAAEAAAA2ABcAAAACAAEAAAA2ABgAAAACAAEAAAA2ABkAAAACAAEAAAA2ABoAAAACAAEAAAA2ABsAAAACAAEAAAA2ABwAAAACAAEAAAA2AB0AAAACAAEAAAA2AB4AAAACAAEAAAA2AB8AAAACAAEAAAA2ACAAAAACAAEAAAA2ACEAAAACAAEAAAA2ACIAAAACAAEAAAA2ACMAAAACAAEAAAA2ACQAAAACAAEAAAA2ACUAAAACAAEAAAA2ACYAAAACAAEAAAA2ACcAAAACAAEAAAA2ACgAAAACAAEAAAA3AAAAAAACAAEAAAA3AAEAAAACAAEAAAA3AAIAAAACAAEAAAA3AAMAAAACAAEAAAA3AAQAAAACAAEAAAA3AAUAAAACAAEAAAA3AAYAAAACAAEAAAA3AAcAAAACAAEAAAA3AAgAAAACAAEAAAA3AAkAAAACAAEAAAA3AAoAAAACAAEAAAA3AAsAAAACAAEAAAA3AAwAAAACAAEAAAA3AA0AAAACAAEAAAA3AA4AAAACAAEAAAA3AA8AAAACAAEAAAA3ABAAAAACAAEAAAA3ABEAAAACAAEAAAA3ABIAAAACAAEAAAA3ABMAAAACAAEAAAA3ABQAAAACAAEAAAA3ABUAAAACAAEAAAA3ABYAAAACAAEAAAA3ABcAAAACAAEAAAA3ABgAAAACAAEAAAA3ABkAAAACAAEAAAA3ABoAAAACAAEAAAA3ABsAAAACAAEAAAA3ABwAAAACAAEAAAA3AB0AAAACAAEAAAA3AB4AAAACAAEAAAA3AB8AAAACAAEAAAA3ACAAAAACAAEAAAA3ACEAAAACAAEAAAA3ACIAAAACAAEAAAA3ACMAAAACAAEAAAA3ACQAAAACAAEAAAA3ACUAAAACAAEAAAA3ACYAAAACAAEAAAA3ACcAAAACAAEAAAA3ACgAAAACAAEAAAA4AAAAAAACAAEAAAA4AAEAAAACAAEAAAA4AAIAAAACAAEAAAA4AAMAAAACAAEAAAA4AAQAAAACAAEAAAA4AAUAAAACAAEAAAA4AAYAAAACAAEAAAA4AAcAAAACAAEAAAA4AAgAAAACAAEAAAA4AAkAAAACAAEAAAA4AAoAAAACAAEAAAA4AAsAAAACAAEAAAA4AAwAAAACAAEAAAA4AA0AAAACAAEAAAA4AA4AAAACAAEAAAA4AA8AAAACAAEAAAA4ABAAAAACAAEAAAA4ABEAAAACAAEAAAA4ABIAAAACAAEAAAA4ABMAAAACAAEAAAA4ABQAAAACAAEAAAA4ABUAAAACAAEAAAA4ABYAAAACAAEAAAA4ABcAAAACAAEAAAA4ABgAAAACAAEAAAA4ABkAAAACAAEAAAA4ABoAAAACAAEAAAA4ABsAAAACAAEAAAA4ABwAAAACAAEAAAA4AB0AAAACAAEAAAA4AB4AAAACAAEAAAA4AB8AAAACAAEAAAA4ACAAAAACAAEAAAA4ACEAAAACAAEAAAA4ACIAAAACAAEAAAA4ACMAAAACAAEAAAA4ACQAAAACAAEAAAA4ACUAAAACAAEAAAA4ACYAAAACAAEAAAA4ACcAAAACAAEAAAA4ACgAAAACAAEAAAA5AAAAAAACAAEAAAA5AAEAAAACAAEAAAA5AAIAAAACAAEAAAA5AAMAAAACAAEAAAA5AAQAAAACAAEAAAA5AAUAAAACAAEAAAA5AAYAAAACAAEAAAA5AAcAAAACAAEAAAA5AAgAAAACAAEAAAA5AAkAAAACAAEAAAA5AAoAAAACAAEAAAA5AAsAAAACAAEAAAA5AAwAAAACAAEAAAA5AA0AAAACAAEAAAA5AA4AAAACAAEAAAA5AA8AAAACAAEAAAA5ABAAAAACAAEAAAA5ABEAAAACAAEAAAA5ABIAAAACAAEAAAA5ABMAAAACAAEAAAA5ABQAAAACAAEAAAA5ABUAAAACAAEAAAA5ABYAAAACAAEAAAA5ABcAAAACAAEAAAA5ABgAAAACAAEAAAA5ABkAAAACAAEAAAA5ABoAAAACAAEAAAA5ABsAAAACAAEAAAA5ABwAAAACAAEAAAA5AB0AAAACAAEAAAA5AB4AAAACAAEAAAA5AB8AAAACAAEAAAA5ACAAAAACAAEAAAA5ACEAAAACAAEAAAA5ACIAAAACAAEAAAA5ACMAAAACAAEAAAA5ACQAAAACAAEAAAA5ACUAAAACAAEAAAA5ACYAAAACAAEAAAA5ACcAAAACAAEAAAA5ACgAAAACAAEAAAA6AAAAAAACAAEAAAA6AAEAAAACAAEAAAA6AAIAAAACAAEAAAA6AAMAAAACAAEAAAA6AAQAAAACAAEAAAA6AAUAAAACAAEAAAA6AAYAAAACAAEAAAA6AAcAAAACAAEAAAA6AAgAAAACAAEAAAA6AAkAAAACAAEAAAA6AAoAAAACAAEAAAA6AAsAAAACAAEAAAA6AAwAAAACAAEAAAA6AA0AAAACAAEAAAA6AA4AAAACAAEAAAA6AA8AAAACAAEAAAA6ABAAAAACAAEAAAA6ABEAAAACAAEAAAA6ABIAAAACAAEAAAA6ABMAAAACAAEAAAA6ABQAAAACAAEAAAA6ABUAAAACAAEAAAA6ABYAAAACAAEAAAA6ABcAAAACAAEAAAA6ABgAAAACAAEAAAA6ABkAAAACAAEAAAA6ABoAAAACAAEAAAA6ABsAAAACAAEAAAA6ABwAAAACAAEAAAA6AB0AAAACAAEAAAA6AB4AAAACAAEAAAA6AB8AAAACAAEAAAA6ACAAAAACAAEAAAA6ACEAAAACAAEAAAA6ACIAAAACAAEAAAA6ACMAAAACAAEAAAA6ACQAAAACAAEAAAA6ACUAAAACAAEAAAA6ACYAAAACAAEAAAA6ACcAAAACAAEAAAA6ACgAAAACAAEAAAA7AAAAAAACAAEAAAA7AAEAAAACAAEAAAA7AAIAAAACAAEAAAA7AAMAAAACAAEAAAA7AAQAAAACAAEAAAA7AAUAAAACAAEAAAA7AAYAAAACAAEAAAA7AAcAAAACAAEAAAA7AAgAAAACAAEAAAA7AAkAAAACAAEAAAA7AAoAAAACAAEAAAA7AAsAAAACAAEAAAA7AAwAAAACAAEAAAA7AA0AAAACAAEAAAA7AA4AAAACAAEAAAA7AA8AAAACAAEAAAA7ABAAAAACAAEAAAA7ABEAAAACAAEAAAA7ABIAAAACAAEAAAA7ABMAAAACAAEAAAA7ABQAAAACAAEAAAA7ABUAAAACAAEAAAA7ABYAAAACAAEAAAA7ABcAAAACAAEAAAA7ABgAAAACAAEAAAA7ABkAAAACAAEAAAA7ABoAAAACAAEAAAA7ABsAAAACAAEAAAA7ABwAAAACAAEAAAA7AB0AAAACAAEAAAA7AB4AAAACAAEAAAA7AB8AAAACAAEAAAA7ACAAAAACAAEAAAA7ACEAAAACAAEAAAA7ACIAAAACAAEAAAA7ACMAAAACAAEAAAA7ACQAAAACAAEAAAA7ACUAAAACAAEAAAA7ACYAAAACAAEAAAA7ACcAAAACAAEAAAA7ACgAAAACAAEAAAA8AAAAAAACAAEAAAA8AAEAAAACAAEAAAA8AAIAAAACAAEAAAA8AAMAAAACAAEAAAA8AAQAAAACAAEAAAA8AAUAAAACAAEAAAA8AAYAAAACAAEAAAA8AAcAAAACAAEAAAA8AAgAAAACAAEAAAA8AAkAAAACAAEAAAA8AAoAAAACAAEAAAA8AAsAAAACAAEAAAA8AAwAAAACAAEAAAA8AA0AAAACAAEAAAA8AA4AAAACAAEAAAA8AA8AAAACAAEAAAA8ABAAAAACAAEAAAA8ABEAAAACAAEAAAA8ABIAAAACAAEAAAA8ABMAAAACAAEAAAA8ABQAAAACAAEAAAA8ABUAAAACAAEAAAA8ABYAAAACAAEAAAA8ABcAAAACAAEAAAA8ABgAAAACAAEAAAA8ABkAAAACAAEAAAA8ABoAAAACAAEAAAA8ABsAAAACAAEAAAA8ABwAAAACAAEAAAA8AB0AAAACAAEAAAA8AB4AAAACAAEAAAA8AB8AAAACAAEAAAA8ACAAAAACAAEAAAA8ACEAAAACAAEAAAA8ACIAAAACAAEAAAA8ACMAAAACAAEAAAA8ACQAAAACAAEAAAA8ACUAAAACAAEAAAA8ACYAAAACAAEAAAA8ACcAAAACAAEAAAA8ACgAAAACAAEAAAA9AAAAAAACAAEAAAA9AAEAAAACAAEAAAA9AAIAAAACAAEAAAA9AAMAAAACAAEAAAA9AAQAAAACAAEAAAA9AAUAAAACAAEAAAA9AAYAAAACAAEAAAA9AAcAAAACAAEAAAA9AAgAAAACAAEAAAA9AAkAAAACAAEAAAA9AAoAAAACAAEAAAA9AAsAAAACAAEAAAA9AAwAAAACAAEAAAA9AA0AAAACAAEAAAA9AA4AAAACAAEAAAA9AA8AAAACAAEAAAA9ABAAAAACAAEAAAA9ABEAAAACAAEAAAA9ABIAAAACAAEAAAA9ABMAAAACAAEAAAA9ABQAAAACAAEAAAA9ABUAAAACAAEAAAA9ABYAAAACAAEAAAA9ABcAAAACAAEAAAA9ABgAAAACAAEAAAA9ABkAAAACAAEAAAA9ABoAAAACAAEAAAA9ABsAAAACAAEAAAA9ABwAAAACAAEAAAA9AB0AAAACAAEAAAA9AB4AAAACAAEAAAA9AB8AAAACAAEAAAA9ACAAAAACAAEAAAA9ACEAAAACAAEAAAA9ACIAAAACAAEAAAA9ACMAAAACAAEAAAA9ACQAAAACAAEAAAA9ACUAAAACAAEAAAA9ACYAAAACAAEAAAA9ACcAAAACAAEAAAA9ACgAAAACAAEAAAA+AAAAAAACAAEAAAA+AAEAAAACAAEAAAA+AAIAAAACAAEAAAA+AAMAAAACAAEAAAA+AAQAAAACAAEAAAA+AAUAAAACAAEAAAA+AAYAAAACAAEAAAA+AAcAAAACAAEAAAA+AAgAAAACAAEAAAA+AAkAAAACAAEAAAA+AAoAAAACAAEAAAA+AAsAAAACAAEAAAA+AAwAAAACAAEAAAA+AA0AAAACAAEAAAA+AA4AAAACAAEAAAA+AA8AAAACAAEAAAA+ABAAAAACAAEAAAA+ABEAAAACAAEAAAA+ABIAAAACAAEAAAA+ABMAAAACAAEAAAA+ABQAAAACAAEAAAA+ABUAAAACAAEAAAA+ABYAAAACAAEAAAA+ABcAAAACAAEAAAA+ABgAAAACAAEAAAA+ABkAAAACAAEAAAA+ABoAAAACAAEAAAA+ABsAAAACAAEAAAA+ABwAAAACAAEAAAA+AB0AAAACAAEAAAA+AB4AAAACAAEAAAA+AB8AAAACAAEAAAA+ACAAAAACAAEAAAA+ACEAAAACAAEAAAA+ACIAAAACAAEAAAA+ACMAAAACAAEAAAA+ACQAAAACAAEAAAA+ACUAAAACAAEAAAA+ACYAAAACAAEAAAA+ACcAAAACAAEAAAA+ACgAAAACAAEAAAA/AAAAAAACAAEAAAA/AAEAAAACAAEAAAA/AAIAAAACAAEAAAA/AAMAAAACAAEAAAA/AAQAAAACAAEAAAA/AAUAAAACAAEAAAA/AAYAAAACAAEAAAA/AAcAAAACAAEAAAA/AAgAAAACAAEAAAA/AAkAAAACAAEAAAA/AAoAAAACAAEAAAA/AAsAAAACAAEAAAA/AAwAAAACAAEAAAA/AA0AAAACAAEAAAA/AA4AAAACAAEAAAA/AA8AAAACAAEAAAA/ABAAAAACAAEAAAA/ABEAAAACAAEAAAA/ABIAAAACAAEAAAA/ABMAAAACAAEAAAA/ABQAAAACAAEAAAA/ABUAAAACAAEAAAA/ABYAAAACAAEAAAA/ABcAAAACAAEAAAA/ABgAAAACAAEAAAA/ABkAAAACAAEAAAA/ABoAAAACAAEAAAA/ABsAAAACAAEAAAA/ABwAAAACAAEAAAA/AB0AAAACAAEAAAA/AB4AAAACAAEAAAA/AB8AAAACAAEAAAA/ACAAAAACAAEAAAA/ACEAAAACAAEAAAA/ACIAAAACAAEAAAA/ACMAAAACAAEAAAA/ACQAAAACAAEAAAA/ACUAAAACAAEAAAA/ACYAAAACAAEAAAA/ACcAAAACAAEAAAA/ACgAAAACAAEAAABAAAAAAAACAAEAAABAAAEAAAACAAEAAABAAAIAAAACAAEAAABAAAMAAAACAAEAAABAAAQAAAACAAEAAABAAAUAAAACAAEAAABAAAYAAAACAAEAAABAAAcAAAACAAEAAABAAAgAAAACAAEAAABAAAkAAAACAAEAAABAAAoAAAACAAEAAABAAAsAAAACAAEAAABAAAwAAAACAAEAAABAAA0AAAACAAEAAABAAA4AAAACAAEAAABAAA8AAAACAAEAAABAABAAAAACAAEAAABAABEAAAACAAEAAABAABIAAAACAAEAAABAABMAAAACAAEAAABAABQAAAACAAEAAABAABUAAAACAAEAAABAABYAAAACAAEAAABAABcAAAACAAEAAABAABgAAAACAAEAAABAABkAAAACAAEAAABAABoAAAACAAEAAABAABsAAAACAAEAAABAABwAAAACAAEAAABAAB0AAAACAAEAAABAAB4AAAACAAEAAABAAB8AAAACAAEAAABAACAAAAACAAEAAABAACEAAAACAAEAAABAACIAAAACAAEAAABAACMAAAACAAEAAABAACQAAAACAAEAAABAACUAAAACAAEAAABAACYAAAACAAEAAABAACcAAAACAAEAAABAACgAAAACAAEAAABBAAAAAAACAAEAAABBAAEAAAACAAEAAABBAAIAAAACAAEAAABBAAMAAAACAAEAAABBAAQAAAACAAEAAABBAAUAAAACAAEAAABBAAYAAAACAAEAAABBAAcAAAACAAEAAABBAAgAAAACAAEAAABBAAkAAAACAAEAAABBAAoAAAACAAEAAABBAAsAAAACAAEAAABBAAwAAAACAAEAAABBAA0AAAACAAEAAABBAA4AAAACAAEAAABBAA8AAAACAAEAAABBABAAAAACAAEAAABBABEAAAACAAEAAABBABIAAAACAAEAAABBABMAAAACAAEAAABBABQAAAACAAEAAABBABUAAAACAAEAAABBABYAAAACAAEAAABBABcAAAACAAEAAABBABgAAAACAAEAAABBABkAAAACAAEAAABBABoAAAACAAEAAABBABsAAAACAAEAAABBABwAAAACAAEAAABBAB0AAAACAAEAAABBAB4AAAACAAEAAABBAB8AAAACAAEAAABBACAAAAACAAEAAABBACEAAAACAAEAAABBACIAAAACAAEAAABBACMAAAACAAEAAABBACQAAAACAAEAAABBACUAAAACAAEAAABBACYAAAACAAEAAABBACcAAAACAAEAAABBACgAAAACAAEAAABCAAAAAAACAAEAAABCAAEAAAACAAEAAABCAAIAAAACAAEAAABCAAMAAAACAAEAAABCAAQAAAACAAEAAABCAAUAAAACAAEAAABCAAYAAAACAAEAAABCAAcAAAACAAEAAABCAAgAAAACAAEAAABCAAkAAAACAAEAAABCAAoAAAACAAEAAABCAAsAAAACAAEAAABCAAwAAAACAAEAAABCAA0AAAACAAEAAABCAA4AAAACAAEAAABCAA8AAAACAAEAAABCABAAAAACAAEAAABCABEAAAACAAEAAABCABIAAAACAAEAAABCABMAAAACAAEAAABCABQAAAACAAEAAABCABUAAAACAAEAAABCABYAAAACAAEAAABCABcAAAACAAEAAABCABgAAAACAAEAAABCABkAAAACAAEAAABCABoAAAACAAEAAABCABsAAAACAAEAAABCABwAAAACAAEAAABCAB0AAAACAAEAAABCAB4AAAACAAEAAABCAB8AAAACAAEAAABCACAAAAACAAEAAABCACEAAAACAAEAAABCACIAAAACAAEAAABCACMAAAACAAEAAABCACQAAAACAAEAAABCACUAAAACAAEAAABCACYAAAACAAEAAABCACcAAAACAAEAAABCACgAAAACAAEAAABDAAAAAAACAAEAAABDAAEAAAACAAEAAABDAAIAAAACAAEAAABDAAMAAAACAAEAAABDAAQAAAACAAEAAABDAAUAAAACAAEAAABDAAYAAAACAAEAAABDAAcAAAACAAEAAABDAAgAAAACAAEAAABDAAkAAAACAAEAAABDAAoAAAACAAEAAABDAAsAAAACAAEAAABDAAwAAAACAAEAAABDAA0AAAACAAEAAABDAA4AAAACAAEAAABDAA8AAAACAAEAAABDABAAAAACAAEAAABDABEAAAACAAEAAABDABIAAAACAAEAAABDABMAAAACAAEAAABDABQAAAACAAEAAABDABUAAAACAAEAAABDABYAAAACAAEAAABDABcAAAACAAEAAABDABgAAAACAAEAAABDABkAAAACAAEAAABDABoAAAACAAEAAABDABsAAAACAAEAAABDABwAAAACAAEAAABDAB0AAAACAAEAAABDAB4AAAACAAEAAABDAB8AAAACAAEAAABDACAAAAACAAEAAABDACEAAAACAAEAAABDACIAAAACAAEAAABDACMAAAACAAEAAABDACQAAAACAAEAAABDACUAAAACAAEAAABDACYAAAACAAEAAABDACcAAAACAAEAAABDACgAAAACAAEAAABEAAAAAAACAAEAAABEAAEAAAACAAEAAABEAAIAAAACAAEAAABEAAMAAAACAAEAAABEAAQAAAACAAEAAABEAAUAAAACAAEAAABEAAYAAAACAAEAAABEAAcAAAACAAEAAABEAAgAAAACAAEAAABEAAkAAAACAAEAAABEAAoAAAACAAEAAABEAAsAAAACAAEAAABEAAwAAAACAAEAAABEAA0AAAACAAEAAABEAA4AAAACAAEAAABEAA8AAAACAAEAAABEABAAAAACAAEAAABEABEAAAACAAEAAABEABIAAAACAAEAAABEABMAAAACAAEAAABEABQAAAACAAEAAABEABUAAAACAAEAAABEABYAAAACAAEAAABEABcAAAACAAEAAABEABgAAAACAAEAAABEABkAAAACAAEAAABEABoAAAACAAEAAABEABsAAAACAAEAAABEABwAAAACAAEAAABEAB0AAAACAAEAAABEAB4AAAACAAEAAABEAB8AAAACAAEAAABEACAAAAACAAEAAABEACEAAAACAAEAAABEACIAAAACAAEAAABEACMAAAACAAEAAABEACQAAAACAAEAAABEACUAAAACAAEAAABEACYAAAACAAEAAABEACcAAAACAAEAAABEACgAAAACAAEAAABFAAAAAAACAAEAAABFAAEAAAACAAEAAABFAAIAAAACAAEAAABFAAMAAAACAAEAAABFAAQAAAACAAEAAABFAAUAAAACAAEAAABFAAYAAAACAAEAAABFAAcAAAACAAEAAABFAAgAAAACAAEAAABFAAkAAAACAAEAAABFAAoAAAACAAEAAABFAAsAAAACAAEAAABFAAwAAAACAAEAAABFAA0AAAACAAEAAABFAA4AAAACAAEAAABFAA8AAAACAAEAAABFABAAAAACAAEAAABFABEAAAACAAEAAABFABIAAAACAAEAAABFABMAAAACAAEAAABFABQAAAACAAEAAABFABUAAAACAAEAAABFABYAAAACAAEAAABFABcAAAACAAEAAABFABgAAAACAAEAAABFABkAAAACAAEAAABFABoAAAACAAEAAABFABsAAAACAAEAAABFABwAAAACAAEAAABFAB0AAAACAAEAAABFAB4AAAACAAEAAABFAB8AAAACAAEAAABFACAAAAACAAEAAABFACEAAAACAAEAAABFACIAAAACAAEAAABFACMAAAACAAEAAABFACQAAAACAAEAAABFACUAAAACAAEAAABFACYAAAACAAEAAABFACcAAAACAAEAAABFACgAAAACAAEAAABGAAAAAAACAAEAAABGAAEAAAACAAEAAABGAAIAAAACAAEAAABGAAMAAAACAAEAAABGAAQAAAACAAEAAABGAAUAAAACAAEAAABGAAYAAAACAAEAAABGAAcAAAACAAEAAABGAAgAAAACAAEAAABGAAkAAAACAAEAAABGAAoAAAACAAEAAABGAAsAAAACAAEAAABGAAwAAAACAAEAAABGAA0AAAACAAEAAABGAA4AAAACAAEAAABGAA8AAAACAAEAAABGABAAAAACAAEAAABGABEAAAACAAEAAABGABIAAAACAAEAAABGABMAAAACAAEAAABGABQAAAACAAEAAABGABUAAAACAAEAAABGABYAAAACAAEAAABGABcAAAACAAEAAABGABgAAAACAAEAAABGABkAAAACAAEAAABGABoAAAACAAEAAABGABsAAAACAAEAAABGABwAAAACAAEAAABGAB0AAAACAAEAAABGAB4AAAACAAEAAABGAB8AAAACAAEAAABGACAAAAACAAEAAABGACEAAAACAAEAAABGACIAAAACAAEAAABGACMAAAACAAEAAABGACQAAAACAAEAAABGACUAAAACAAEAAABGACYAAAACAAEAAABGACcAAAACAAEAAABGACgAAAACAAEAAABHAAAAAAACAAEAAABHAAEAAAACAAEAAABHAAIAAAACAAEAAABHAAMAAAACAAEAAABHAAQAAAACAAEAAABHAAUAAAACAAEAAABHAAYAAAACAAEAAABHAAcAAAACAAEAAABHAAgAAAACAAEAAABHAAkAAAACAAEAAABHAAoAAAACAAEAAABHAAsAAAACAAEAAABHAAwAAAACAAEAAABHAA0AAAACAAEAAABHAA4AAAACAAEAAABHAA8AAAACAAEAAABHABAAAAACAAEAAABHABEAAAACAAEAAABHABIAAAACAAEAAABHABMAAAACAAEAAABHABQAAAACAAEAAABHABUAAAACAAEAAABHABYAAAACAAEAAABHABcAAAACAAEAAABHABgAAAACAAEAAABHABkAAAACAAEAAABHABoAAAACAAEAAABHABsAAAACAAEAAABHABwAAAACAAEAAABHAB0AAAACAAEAAABHAB4AAAACAAEAAABHAB8AAAACAAEAAABHACAAAAACAAEAAABHACEAAAACAAEAAABHACIAAAACAAEAAABHACMAAAACAAEAAABHACQAAAACAAEAAABHACUAAAACAAEAAABHACYAAAACAAEAAABHACcAAAACAAEAAABHACgAAAACAAEAAAAsAA8AAAADAAEAAAArABUAAAAAAAIAAAAbAAsAAAACAAEAAAAbAAwAAAACAAEAAAAbAA0AAAACAAEAAAAbAA4AAAACAAEAAAAbAA8AAAACAAEAAAAbABAAAAACAAEAAAAbABEAAAACAAEAAAAbABIAAAACAAEAAAAbABMAAAACAAEAAAAbABQAAAACAAEAAAAbABUAAAACAAEAAAAbABYAAAACAAEAAAAbABcAAAACAAEAAAAbABgAAAACAAEAAAAcAAsAAAACAAEAAAAcAAwAAAACAAEAAAAcAA0AAAACAAEAAAAcAA4AAAABAAAAAAAcAA8AAAABAAEAAAAcABAAAAABAAEAAAAcABEAAAABAAEAAAAcABIAAAABAAEAAAAcABMAAAABAAEAAAAcABQAAAABAAEAAAAcABUAAAABAAEAAAAcABYAAAABAAEAAAAcABcAAAABAAEAAAAcABgAAAABAAEAAAAdAAsAAAACAAEAAAAdAAwAAAABAAMAAAAdAA0AAAABAAQAAAAdAA4AAAABAAUAAAAdAA8AAAAAAAIAAAAdABAAAAAAAAIAAAAdABEAAAAAAAIAAAAdABIAAAAAAAIAAAAdABMAAAAAAAIAAAAdABQAAAAAAAIAAAAdABUAAAAAAAIAAAAdABYAAAAAAAIAAAAdABcAAAAAAAIAAAAdABgAAAAAAAIAAAAeAAsAAAACAAEAAAAeAAwAAAACAAMAAAAeAA0AAAAMAAAAAAAeAA4AAAACAAUAAAAeAA8AAAAAAAIAAAAeABAAAAAAAAIAAAAeABEAAAAAAAIAAAAeABIAAAAAAAIAAAAeABMAAAAAAAIAAAAeABQAAAAAAAIAAAAeABUAAAAAAAIAAAAeABYAAAAAAAIAAAAeABcAAAAAAAIAAAAeABgAAAAAAAIAAAAfAAsAAAACAAEAAAAfAAwAAAADAAMAAAAfAA0AAAANAAAAAAAfAA4AAAADAAUAAAAfAA8AAAAAAAIAAAAfABAAAAAAAAIAAAAfABEAAAAAAAIAAAAfABIAAAAAAAIAAAAfABMAAAAAAAIAAAAfABQAAAAAAAIAAAAfABUAAAAAAAIAAAAfABYAAAAAAAIAAAAfABcAAAAAAAIAAAAfABgAAAAAAAIAAAAgAAsAAAACAAEAAAAgAAwAAAABAAMAAAAgAA0AAAACAAQAAAAgAA4AAAABAAUAAAAgAA8AAAAAAAIAAAAgABAAAAAAAAIAAAAgABEAAAAAAAIAAAAgABIAAAAAAAIAAAAgABMAAAAAAAIAAAAgABQAAAAAAAIAAAAgABUAAAAAAAIAAAAgABYAAAAAAAIAAAAgABcAAAAAAAIAAAAgABgAAAAAAAIAAAAhAAsAAAACAAEAAAAhAAwAAAACAAMAAAAhAA0AAAACAAQAAAAhAA4AAAACAAUAAAAhAA8AAAAAAAIAAAAhABAAAAAAAAIAAAAhABEAAAAAAAIAAAAhABIAAAAAAAIAAAAhABMAAAAAAAIAAAAhABQAAAAAAAIAAAAhABUAAAAAAAIAAAAhABYAAAAAAAIAAAAhABcAAAAAAAIAAAAhABgAAAAAAAIAAAAiAAsAAAACAAEAAAAiAAwAAAADAAMAAAAiAA0AAAAMAAoAAAAiAA4AAAAMAAsAAAAiAA8AAAAMAAwAAAAiABAAAAAAAAIAAAAiABEAAAAAAAIAAAAiABIAAAAAAAIAAAAiABMAAAAAAAIAAAAiABQAAAAAAAIAAAAiABUAAAAAAAIAAAAiABYAAAAAAAIAAAAiABcAAAAQAAQAAAAiABgAAAAAAAIAAAAjAAsAAAACAAEAAAAjAAwAAAACAAMAAAAjAA0AAAANAAoAAAAjAA4AAAANAAsAAAAjAA8AAAANAAwAAAAjABAAAAAAAAIAAAAjABEAAAAAAAIAAAAjABIAAAAAAAIAAAAjABMAAAAAAAIAAAAjABQAAAAAAAIAAAAjABUAAAAAAAIAAAAjABYAAAAAAAIAAAAjABcAAAAAAAIAAAAjABgAAAAAAAIAAAAkAAsAAAACAAEAAAAkAAwAAAACAAMAAAAkAA0AAAACAAQAAAAkAA4AAAACAAUAAAAkAA8AAAAAAAIAAAAkABAAAAAAAAIAAAAkABEAAAAAAAIAAAAkABIAAAAAAAIAAAAkABMAAAAAAAIAAAAkABQAAAAAAAIAAAAkABUAAAAPAAQAAAAkABYAAAAAAAIAAAAkABcAAAANAAEAAAAkABgAAAARAAQAAAAlAAsAAAACAAEAAAAlAAwAAAADAAMAAAAlAA0AAAADAAQAAAAlAA4AAAADAAUAAAAlAA8AAAAAAAIAAAAlABAAAAAAAAIAAAAlABEAAAAAAAIAAAAlABIAAAAAAAIAAAAlABMAAAAAAAIAAAAlABQAAAAAAAIAAAAlABUAAAAAAAIAAAAlABYAAAAAAAIAAAAlABcAAAAAAAIAAAAlABgAAAAAAAIAAAAmAAsAAAACAAEAAAAmAAwAAAABAAMAAAAmAA0AAAABAAQAAAAmAA4AAAABAAUAAAAmAA8AAAAAAAIAAAAmABAAAAAAAAIAAAAmABEAAAAAAAcAAAAmABIAAAAAAAgAAAAmABMAAAAAAAkAAAAmABQAAAAAAAIAAAAmABUAAAAAAAIAAAAmABYAAAAAAAIAAAAmABcAAAASAAQAAAAmABgAAAAAAAIAAAAnAAsAAAACAAEAAAAnAAwAAAACAAMAAAAnAA0AAAACAAQAAAAnAA4AAAACAAUAAAAnAA8AAAAAAAIAAAAnABAAAAAAAAIAAAAnABEAAAABAAcAAAAnABIAAAABAAgAAAAnABMAAAABAAkAAAAnABQAAAAAAAIAAAAnABUAAAAAAAIAAAAnABYAAAAAAAIAAAAnABcAAAAAAAIAAAAnABgAAAAAAAIAAAAoAAsAAAACAAEAAAAoAAwAAAADAAMAAAAoAA0AAAADAAQAAAAoAA4AAAADAAUAAAAoAA8AAAAAAAIAAAAoABAAAAAAAAIAAAAoABEAAAACAAcAAAAoABIAAAACAAgAAAAoABMAAAACAAkAAAAoABQAAAAAAAIAAAAoABUAAAAAAAIAAAAoABYAAAAAAAIAAAAoABcAAAAAAAIAAAAoABgAAAAAAAIAAAApAAsAAAACAAEAAAApAAwAAAABAAMAAAApAA0AAAABAAQAAAApAA4AAAABAAUAAAApAA8AAAATAAEAAAApABAAAAATAAIAAAApABEAAAATAAMAAAApABIAAAAAAAIAAAApABMAAAAAAAIAAAApABQAAAAAAAIAAAApABUAAAAAAAIAAAApABYAAAAAAAIAAAApABcAAAAAAAIAAAApABgAAAAAAAIAAAAXAAYAAAACAAEAAAAXAAcAAAACAAEAAAAXAAgAAAACAAEAAAAXAAkAAAACAAEAAAAXAAoAAAACAAEAAAAXAAsAAAACAAEAAAAXAAwAAAACAAEAAAAXAA0AAAACAAEAAAAXAA4AAAACAAEAAAAXAA8AAAACAAEAAAAXABAAAAACAAEAAAAXABEAAAACAAEAAAAXABIAAAACAAEAAAAYAAYAAAACAAEAAAAYAAcAAAACAAEAAAAYAAgAAAACAAEAAAAYAAkAAAACAAEAAAAYAAoAAAACAAEAAAAYAAsAAAACAAEAAAAYAAwAAAACAAEAAAAYAA0AAAACAAEAAAAYAA4AAAACAAEAAAAYAA8AAAACAAEAAAAYABAAAAACAAEAAAAYABEAAAACAAEAAAAYABIAAAACAAEAAAAZAAYAAAACAAEAAAAZAAcAAAACAAEAAAAZAAgAAAACAAEAAAAZAAkAAAACAAEAAAAZAAoAAAACAAEAAAAZAAsAAAACAAEAAAAZAAwAAAACAAEAAAAZAA0AAAACAAEAAAAZAA4AAAACAAEAAAAZAA8AAAACAAEAAAAZABAAAAACAAEAAAAZABEAAAACAAEAAAAZABIAAAACAAEAAAAaAAYAAAACAAEAAAAaAAcAAAACAAEAAAAaAAgAAAACAAEAAAAaAAkAAAACAAEAAAAaAAoAAAACAAEAAAAaAAsAAAACAAEAAAAaAAwAAAACAAEAAAAaAA0AAAACAAEAAAAaAA4AAAACAAEAAAAaAA8AAAACAAEAAAAaABAAAAACAAEAAAAaABEAAAACAAEAAAAaABIAAAACAAEAAAAbAAYAAAACAAEAAAAbAAcAAAACAAEAAAAbAAgAAAACAAEAAAAbAAkAAAACAAEAAAAbAAoAAAACAAEAAAAXABMAAAACAAEAAAAXABQAAAACAAEAAAAXABUAAAACAAEAAAAXABYAAAACAAEAAAAXABcAAAACAAEAAAAXABgAAAACAAEAAAAYABMAAAACAAEAAAAYABQAAAACAAEAAAAYABUAAAACAAEAAAAYABYAAAACAAEAAAAYABcAAAACAAEAAAAYABgAAAACAAEAAAAZABMAAAACAAEAAAAZABQAAAACAAEAAAAZABUAAAACAAEAAAAZABYAAAACAAEAAAAZABcAAAACAAEAAAAZABgAAAACAAEAAAAaABMAAAACAAEAAAAaABQAAAACAAEAAAAaABUAAAACAAEAAAAaABYAAAACAAEAAAAaABcAAAACAAEAAAAaABgAAAACAAEAAAAcAAYAAAACAAEAAAAcAAcAAAACAAEAAAAcAAgAAAACAAEAAAAcAAkAAAACAAEAAAAcAAoAAAACAAEAAAAdAAYAAAACAAEAAAAdAAcAAAACAAEAAAAdAAgAAAACAAEAAAAdAAkAAAACAAEAAAAdAAoAAAACAAEAAAAeAAYAAAACAAEAAAAeAAcAAAACAAEAAAAeAAgAAAACAAEAAAAeAAkAAAACAAEAAAAeAAoAAAACAAEAAAAfAAYAAAACAAEAAAAfAAcAAAACAAEAAAAfAAgAAAACAAEAAAAfAAkAAAACAAEAAAAfAAoAAAACAAEAAAAgAAYAAAACAAEAAAAgAAcAAAACAAEAAAAgAAgAAAACAAEAAAAgAAkAAAACAAEAAAAgAAoAAAACAAEAAAAhAAYAAAACAAEAAAAhAAcAAAACAAEAAAAhAAgAAAACAAEAAAAhAAkAAAACAAEAAAAhAAoAAAACAAEAAAAiAAYAAAACAAEAAAAiAAcAAAACAAEAAAAiAAgAAAACAAEAAAAiAAkAAAACAAEAAAAiAAoAAAACAAEAAAAjAAYAAAACAAEAAAAjAAcAAAACAAEAAAAjAAgAAAACAAEAAAAjAAkAAAACAAEAAAAjAAoAAAACAAEAAAAkAAYAAAACAAEAAAAkAAcAAAACAAEAAAAkAAgAAAACAAEAAAAkAAkAAAACAAEAAAAkAAoAAAACAAEAAAAlAAYAAAACAAEAAAAlAAcAAAACAAEAAAAlAAgAAAACAAEAAAAlAAkAAAACAAEAAAAlAAoAAAACAAEAAAAmAAYAAAACAAEAAAAmAAcAAAACAAEAAAAmAAgAAAACAAEAAAAmAAkAAAACAAEAAAAmAAoAAAACAAEAAAAnAAYAAAACAAEAAAAnAAcAAAACAAEAAAAnAAgAAAACAAEAAAAnAAkAAAACAAEAAAAnAAoAAAACAAEAAAAoAAYAAAACAAEAAAAoAAcAAAACAAEAAAAoAAgAAAACAAEAAAAoAAkAAAACAAEAAAAoAAoAAAACAAEAAAApAAYAAAACAAEAAAApAAcAAAACAAEAAAApAAgAAAACAAEAAAApAAkAAAACAAEAAAApAAoAAAACAAEAAAD0////AAACAAEAAAD1////AAACAAEAAAD1/wAAAAACAAEAAAD2/wAAAAACAAEAAAD2/wEAAAACAAEAAAD3/wIAAAACAAEAAAD4/wMAAAACAAEAAAD4/wQAAAACAAEAAAD5/wUAAAACAAEAAAD6/wYAAAACAAEAAAD6/wcAAAACAAEAAAD7/wgAAAACAAEAAAD8/wkAAAACAAEAAAD9/woAAAACAAEAAAD+/wsAAAACAAEAAAD+/wwAAAACAAEAAAD//w0AAAACAAEAAADl//T/AAACAAEAAADl//X/AAACAAEAAADl//b/AAACAAEAAADl//f/AAACAAEAAADl//j/AAACAAEAAADl//n/AAACAAEAAADl//r/AAACAAEAAADl//v/AAACAAEAAADl//z/AAACAAEAAADl//3/AAACAAEAAADl//7/AAACAAEAAADl////AAACAAEAAADl/wAAAAACAAEAAADl/wEAAAACAAEAAADl/wIAAAACAAEAAADl/wMAAAACAAEAAADl/wQAAAACAAEAAADl/wUAAAACAAEAAADl/wYAAAACAAEAAADl/wcAAAACAAEAAADl/wgAAAACAAEAAADl/wkAAAACAAEAAADl/woAAAACAAEAAADl/wsAAAACAAEAAADl/wwAAAACAAEAAADl/w0AAAACAAEAAADl/w4AAAACAAEAAADl/w8AAAACAAEAAADl/xAAAAACAAEAAADl/xEAAAACAAEAAADl/xIAAAACAAEAAADl/xMAAAACAAEAAADl/xQAAAACAAEAAADl/xUAAAACAAEAAADl/xYAAAACAAEAAADl/xcAAAACAAEAAADl/xgAAAACAAEAAADl/xkAAAACAAEAAADl/xoAAAACAAEAAADl/xsAAAACAAEAAADl/xwAAAACAAEAAADl/x0AAAACAAEAAADl/x4AAAACAAEAAADl/x8AAAACAAEAAADl/yAAAAACAAEAAADl/yEAAAACAAEAAADl/yIAAAACAAEAAADl/yMAAAACAAEAAADl/yQAAAACAAEAAADl/yUAAAACAAEAAADl/yYAAAACAAEAAADl/ycAAAACAAEAAADl/ygAAAACAAEAAADl/ykAAAACAAEAAADl/yoAAAACAAEAAADl/ysAAAACAAEAAADl/ywAAAACAAEAAADl/y0AAAACAAEAAADl/y4AAAACAAEAAADl/y8AAAACAAEAAADl/zAAAAACAAEAAADl/zEAAAACAAEAAADl/zIAAAACAAEAAADl/zMAAAACAAEAAADl/zQAAAACAAEAAADl/zUAAAACAAEAAADl/zYAAAACAAEAAADl/zcAAAACAAEAAADl/zgAAAACAAEAAADm//T/AAACAAEAAADm//X/AAACAAEAAADm//b/AAACAAEAAADm//f/AAACAAEAAADm//j/AAACAAEAAADm//n/AAACAAEAAADm//r/AAACAAEAAADm//v/AAACAAEAAADm//z/AAACAAEAAADm//3/AAACAAEAAADm//7/AAACAAEAAADm////AAACAAEAAADm/wAAAAACAAEAAADm/wEAAAACAAEAAADm/wIAAAACAAEAAADm/wMAAAACAAEAAADm/wQAAAACAAEAAADm/wUAAAACAAEAAADm/wYAAAACAAEAAADm/wcAAAACAAEAAADm/wgAAAACAAEAAADm/wkAAAACAAEAAADm/woAAAACAAEAAADm/wsAAAACAAEAAADm/wwAAAACAAEAAADm/w0AAAACAAEAAADm/w4AAAACAAEAAADm/w8AAAACAAEAAADm/xAAAAACAAEAAADm/xEAAAACAAEAAADm/xIAAAACAAEAAADm/xMAAAACAAEAAADm/xQAAAACAAEAAADm/xUAAAACAAEAAADm/xYAAAACAAEAAADm/xcAAAACAAEAAADm/xgAAAACAAEAAADm/xkAAAACAAEAAADm/xoAAAACAAEAAADm/xsAAAACAAEAAADm/xwAAAACAAEAAADm/x0AAAACAAEAAADm/x4AAAACAAEAAADm/x8AAAACAAEAAADm/yAAAAACAAEAAADm/yEAAAACAAEAAADm/yIAAAACAAEAAADm/yMAAAACAAEAAADm/yQAAAACAAEAAADm/yUAAAACAAEAAADm/yYAAAACAAEAAADm/ycAAAACAAEAAADm/ygAAAACAAEAAADm/ykAAAACAAEAAADm/yoAAAACAAEAAADm/ysAAAACAAEAAADm/ywAAAACAAEAAADm/y0AAAACAAEAAADm/y4AAAACAAEAAADm/y8AAAACAAEAAADm/zAAAAACAAEAAADm/zEAAAACAAEAAADm/zIAAAACAAEAAADm/zMAAAACAAEAAADm/zQAAAACAAEAAADm/zUAAAACAAEAAADm/zYAAAACAAEAAADm/zcAAAACAAEAAADm/zgAAAACAAEAAADn//T/AAACAAEAAADn//X/AAACAAEAAADn//b/AAACAAEAAADn//f/AAACAAEAAADn//j/AAACAAEAAADn//n/AAACAAEAAADn//r/AAACAAEAAADn//v/AAACAAEAAADn//z/AAACAAEAAADn//3/AAACAAEAAADn//7/AAACAAEAAADn////AAACAAEAAADn/wAAAAACAAEAAADn/wEAAAACAAEAAADn/wIAAAACAAEAAADn/wMAAAACAAEAAADn/wQAAAACAAEAAADn/wUAAAACAAEAAADn/wYAAAACAAEAAADn/wcAAAACAAEAAADn/wgAAAACAAEAAADn/wkAAAACAAEAAADn/woAAAACAAEAAADn/wsAAAACAAEAAADn/wwAAAACAAEAAADn/w0AAAACAAEAAADn/w4AAAACAAEAAADn/w8AAAACAAEAAADn/xAAAAACAAEAAADn/xEAAAACAAEAAADn/xIAAAACAAEAAADn/xMAAAACAAEAAADn/xQAAAACAAEAAADn/xUAAAACAAEAAADn/xYAAAACAAEAAADn/xcAAAACAAEAAADn/xgAAAACAAEAAADn/xkAAAACAAEAAADn/xoAAAACAAEAAADn/xsAAAACAAEAAADn/xwAAAACAAEAAADn/x0AAAACAAEAAADn/x4AAAACAAEAAADn/x8AAAACAAEAAADn/yAAAAACAAEAAADn/yEAAAACAAEAAADn/yIAAAACAAEAAADn/yMAAAACAAEAAADn/yQAAAACAAEAAADn/yUAAAACAAEAAADn/yYAAAACAAEAAADn/ycAAAACAAEAAADn/ygAAAACAAEAAADn/ykAAAACAAEAAADn/yoAAAACAAEAAADn/ysAAAACAAEAAADn/ywAAAACAAEAAADn/y0AAAACAAEAAADn/y4AAAACAAEAAADn/y8AAAACAAEAAADn/zAAAAACAAEAAADn/zEAAAACAAEAAADn/zIAAAACAAEAAADn/zMAAAACAAEAAADn/zQAAAACAAEAAADn/zUAAAACAAEAAADn/zYAAAACAAEAAADn/zcAAAACAAEAAADn/zgAAAACAAEAAADo//T/AAACAAEAAADo//X/AAACAAEAAADo//b/AAACAAEAAADo//f/AAACAAEAAADo//j/AAACAAEAAADo//n/AAACAAEAAADo//r/AAACAAEAAADo//v/AAACAAEAAADo//z/AAACAAEAAADo//3/AAACAAEAAADo//7/AAACAAEAAADo////AAACAAEAAADo/wAAAAACAAEAAADo/wEAAAACAAEAAADo/wIAAAACAAEAAADo/wMAAAACAAEAAADo/wQAAAACAAEAAADo/wUAAAACAAEAAADo/wYAAAACAAEAAADo/wcAAAACAAEAAADo/wgAAAACAAEAAADo/wkAAAACAAEAAADo/woAAAACAAEAAADo/wsAAAACAAEAAADo/wwAAAACAAEAAADo/w0AAAACAAEAAADo/w4AAAACAAEAAADo/w8AAAACAAEAAADo/xAAAAACAAEAAADo/xEAAAACAAEAAADo/xIAAAACAAEAAADo/xMAAAACAAEAAADo/xQAAAACAAEAAADo/xUAAAACAAEAAADo/xYAAAACAAEAAADo/xcAAAACAAEAAADo/xgAAAACAAEAAADo/xkAAAACAAEAAADo/xoAAAACAAEAAADo/xsAAAACAAEAAADo/xwAAAACAAEAAADo/x0AAAACAAEAAADo/x4AAAACAAEAAADo/x8AAAACAAEAAADo/yAAAAACAAEAAADo/yEAAAACAAEAAADo/yIAAAACAAEAAADo/yMAAAACAAEAAADo/yQAAAACAAEAAADo/yUAAAACAAEAAADo/yYAAAACAAEAAADo/ycAAAACAAEAAADo/ygAAAACAAEAAADo/ykAAAACAAEAAADo/yoAAAACAAEAAADo/ysAAAACAAEAAADo/ywAAAACAAEAAADo/y0AAAACAAEAAADo/y4AAAACAAEAAADo/y8AAAACAAEAAADo/zAAAAACAAEAAADo/zEAAAACAAEAAADo/zIAAAACAAEAAADo/zMAAAACAAEAAADo/zQAAAACAAEAAADo/zUAAAACAAEAAADo/zYAAAACAAEAAADo/zcAAAACAAEAAADo/zgAAAACAAEAAADp//T/AAACAAEAAADp//X/AAACAAEAAADp//b/AAACAAEAAADp//f/AAACAAEAAADp//j/AAACAAEAAADp//n/AAACAAEAAADp//r/AAACAAEAAADp//v/AAACAAEAAADp//z/AAACAAEAAADp//3/AAACAAEAAADp//7/AAACAAEAAADp////AAACAAEAAADp/wAAAAACAAEAAADp/wEAAAACAAEAAADp/wIAAAACAAEAAADp/wMAAAACAAEAAADp/wQAAAACAAEAAADp/wUAAAACAAEAAADp/wYAAAACAAEAAADp/wcAAAACAAEAAADp/wgAAAACAAEAAADp/wkAAAACAAEAAADp/woAAAACAAEAAADp/wsAAAACAAEAAADp/wwAAAACAAEAAADp/w0AAAACAAEAAADp/w4AAAACAAEAAADp/w8AAAACAAEAAADp/xAAAAACAAEAAADp/xEAAAACAAEAAADp/xIAAAACAAEAAADp/xMAAAACAAEAAADp/xQAAAACAAEAAADp/xUAAAACAAEAAADp/xYAAAACAAEAAADp/xcAAAACAAEAAADp/xgAAAACAAEAAADp/xkAAAACAAEAAADp/xoAAAACAAEAAADp/xsAAAACAAEAAADp/xwAAAACAAEAAADp/x0AAAACAAEAAADp/x4AAAACAAEAAADp/x8AAAACAAEAAADp/yAAAAACAAEAAADp/yEAAAACAAEAAADp/yIAAAACAAEAAADp/yMAAAACAAEAAADp/yQAAAACAAEAAADp/yUAAAACAAEAAADp/yYAAAACAAEAAADp/ycAAAACAAEAAADp/ygAAAACAAEAAADp/ykAAAACAAEAAADp/yoAAAACAAEAAADp/ysAAAACAAEAAADp/ywAAAACAAEAAADp/y0AAAACAAEAAADp/y4AAAACAAEAAADp/y8AAAACAAEAAADp/zAAAAACAAEAAADp/zEAAAACAAEAAADp/zIAAAACAAEAAADp/zMAAAACAAEAAADp/zQAAAACAAEAAADp/zUAAAACAAEAAADp/zYAAAACAAEAAADp/zcAAAACAAEAAADp/zgAAAACAAEAAADq//T/AAACAAEAAADq//X/AAACAAEAAADq//b/AAACAAEAAADq//f/AAACAAEAAADq//j/AAACAAEAAADq//n/AAACAAEAAADq//r/AAACAAEAAADq//v/AAACAAEAAADq//z/AAACAAEAAADq//3/AAACAAEAAADq//7/AAACAAEAAADq////AAACAAEAAADq/wAAAAACAAEAAADq/wEAAAACAAEAAADq/wIAAAACAAEAAADq/wMAAAACAAEAAADq/wQAAAACAAEAAADq/wUAAAACAAEAAADq/wYAAAACAAEAAADq/wcAAAACAAEAAADq/wgAAAACAAEAAADq/wkAAAACAAEAAADq/woAAAACAAEAAADq/wsAAAACAAEAAADq/wwAAAACAAEAAADq/w0AAAACAAEAAADq/w4AAAACAAEAAADq/w8AAAACAAEAAADq/xAAAAACAAEAAADq/xEAAAACAAEAAADq/xIAAAACAAEAAADq/xMAAAACAAEAAADq/xQAAAACAAEAAADq/xUAAAACAAEAAADq/xYAAAACAAEAAADq/xcAAAACAAEAAADq/xgAAAACAAEAAADq/xkAAAACAAEAAADq/xoAAAACAAEAAADq/xsAAAACAAEAAADq/xwAAAACAAEAAADq/x0AAAACAAEAAADq/x4AAAACAAEAAADq/x8AAAACAAEAAADq/yAAAAACAAEAAADq/yEAAAACAAEAAADq/yIAAAACAAEAAADq/yMAAAACAAEAAADq/yQAAAACAAEAAADq/yUAAAACAAEAAADq/yYAAAACAAEAAADq/ycAAAACAAEAAADq/ygAAAACAAEAAADq/ykAAAACAAEAAADq/yoAAAACAAEAAADq/ysAAAACAAEAAADq/ywAAAACAAEAAADq/y0AAAACAAEAAADq/y4AAAACAAEAAADq/y8AAAACAAEAAADq/zAAAAACAAEAAADq/zEAAAACAAEAAADq/zIAAAACAAEAAADq/zMAAAACAAEAAADq/zQAAAACAAEAAADq/zUAAAACAAEAAADq/zYAAAACAAEAAADq/zcAAAACAAEAAADq/zgAAAACAAEAAADr//T/AAACAAEAAADr//X/AAACAAEAAADr//b/AAACAAEAAADr//f/AAACAAEAAADr//j/AAACAAEAAADr//n/AAACAAEAAADr//r/AAACAAEAAADr//v/AAACAAEAAADr//z/AAACAAEAAADr//3/AAACAAEAAADr//7/AAACAAEAAADr////AAACAAEAAADr/wAAAAACAAEAAADr/wEAAAACAAEAAADr/wIAAAACAAEAAADr/wMAAAACAAEAAADr/wQAAAACAAEAAADr/wUAAAACAAEAAADr/wYAAAACAAEAAADr/wcAAAACAAEAAADr/wgAAAACAAEAAADr/wkAAAACAAEAAADr/woAAAACAAEAAADr/wsAAAACAAEAAADr/wwAAAACAAEAAADr/w0AAAACAAEAAADr/w4AAAACAAEAAADr/w8AAAACAAEAAADr/xAAAAACAAEAAADr/xEAAAACAAEAAADr/xIAAAACAAEAAADr/xMAAAACAAEAAADr/xQAAAACAAEAAADr/xUAAAACAAEAAADr/xYAAAACAAEAAADr/xcAAAACAAEAAADr/xgAAAACAAEAAADr/xkAAAACAAEAAADr/xoAAAACAAEAAADr/xsAAAACAAEAAADr/xwAAAACAAEAAADr/x0AAAACAAEAAADr/x4AAAACAAEAAADr/x8AAAACAAEAAADr/yAAAAACAAEAAADr/yEAAAACAAEAAADr/yIAAAACAAEAAADr/yMAAAACAAEAAADr/yQAAAACAAEAAADr/yUAAAACAAEAAADr/yYAAAACAAEAAADr/ycAAAACAAEAAADr/ygAAAACAAEAAADr/ykAAAACAAEAAADr/yoAAAACAAEAAADr/ysAAAACAAEAAADr/ywAAAACAAEAAADr/y0AAAACAAEAAADr/y4AAAACAAEAAADr/y8AAAACAAEAAADr/zAAAAACAAEAAADr/zEAAAACAAEAAADr/zIAAAACAAEAAADr/zMAAAACAAEAAADr/zQAAAACAAEAAADr/zUAAAACAAEAAADr/zYAAAACAAEAAADr/zcAAAACAAEAAADr/zgAAAACAAEAAADs//T/AAACAAEAAADs//X/AAACAAEAAADs//b/AAACAAEAAADs//f/AAACAAEAAADs//j/AAACAAEAAADs//n/AAACAAEAAADs//r/AAACAAEAAADs//v/AAACAAEAAADs//z/AAACAAEAAADs//3/AAACAAEAAADs//7/AAACAAEAAADs////AAACAAEAAADs/wAAAAACAAEAAADs/wEAAAACAAEAAADs/wIAAAACAAEAAADs/wMAAAACAAEAAADs/wQAAAACAAEAAADs/wUAAAACAAEAAADs/wYAAAACAAEAAADs/wcAAAACAAEAAADs/wgAAAACAAEAAADs/wkAAAACAAEAAADs/woAAAACAAEAAADs/wsAAAACAAEAAADs/wwAAAACAAEAAADs/w0AAAACAAEAAADs/w4AAAACAAEAAADs/w8AAAACAAEAAADs/xAAAAACAAEAAADs/xEAAAACAAEAAADs/xIAAAACAAEAAADs/xMAAAACAAEAAADs/xQAAAACAAEAAADs/xUAAAACAAEAAADs/xYAAAACAAEAAADs/xcAAAACAAEAAADs/xgAAAACAAEAAADs/xkAAAACAAEAAADs/xoAAAACAAEAAADs/xsAAAACAAEAAADs/xwAAAACAAEAAADs/x0AAAACAAEAAADs/x4AAAACAAEAAADs/x8AAAACAAEAAADs/yAAAAACAAEAAADs/yEAAAACAAEAAADs/yIAAAACAAEAAADs/yMAAAACAAEAAADs/yQAAAACAAEAAADs/yUAAAACAAEAAADs/yYAAAACAAEAAADs/ycAAAACAAEAAADs/ygAAAACAAEAAADs/ykAAAACAAEAAADs/yoAAAACAAEAAADs/ysAAAACAAEAAADs/ywAAAACAAEAAADs/y0AAAACAAEAAADs/y4AAAACAAEAAADs/y8AAAACAAEAAADs/zAAAAACAAEAAADs/zEAAAACAAEAAADs/zIAAAACAAEAAADs/zMAAAACAAEAAADs/zQAAAACAAEAAADs/zUAAAACAAEAAADs/zYAAAACAAEAAADs/zcAAAACAAEAAADs/zgAAAACAAEAAADt//T/AAACAAEAAADt//X/AAACAAEAAADt//b/AAACAAEAAADt//f/AAACAAEAAADt//j/AAACAAEAAADt//n/AAACAAEAAADt//r/AAACAAEAAADt//v/AAACAAEAAADt//z/AAACAAEAAADt//3/AAACAAEAAADt//7/AAACAAEAAADt////AAACAAEAAADt/wAAAAACAAEAAADt/wEAAAACAAEAAADt/wIAAAACAAEAAADt/wMAAAACAAEAAADt/wQAAAACAAEAAADt/wUAAAACAAEAAADt/wYAAAACAAEAAADt/wcAAAACAAEAAADt/wgAAAACAAEAAADt/wkAAAACAAEAAADt/woAAAACAAEAAADt/wsAAAACAAEAAADt/wwAAAACAAEAAADt/w0AAAACAAEAAADt/w4AAAACAAEAAADt/w8AAAACAAEAAADt/xAAAAACAAEAAADt/xEAAAACAAEAAADt/xIAAAACAAEAAADt/xMAAAACAAEAAADt/xQAAAACAAEAAADt/xUAAAACAAEAAADt/xYAAAACAAEAAADt/xcAAAACAAEAAADt/xgAAAACAAEAAADt/xkAAAACAAEAAADt/xoAAAACAAEAAADt/xsAAAACAAEAAADt/xwAAAACAAEAAADt/x0AAAACAAEAAADt/x4AAAACAAEAAADt/x8AAAACAAEAAADt/yAAAAACAAEAAADt/yEAAAACAAEAAADt/yIAAAACAAEAAADt/yMAAAACAAEAAADt/yQAAAACAAEAAADt/yUAAAACAAEAAADt/yYAAAACAAEAAADt/ycAAAACAAEAAADt/ygAAAACAAEAAADt/ykAAAACAAEAAADt/yoAAAACAAEAAADt/ysAAAACAAEAAADt/ywAAAACAAEAAADt/y0AAAACAAEAAADt/y4AAAACAAEAAADt/y8AAAACAAEAAADt/zAAAAACAAEAAADt/zEAAAACAAEAAADt/zIAAAACAAEAAADt/zMAAAACAAEAAADt/zQAAAACAAEAAADt/zUAAAACAAEAAADt/zYAAAACAAEAAADt/zcAAAACAAEAAADt/zgAAAACAAEAAADu//T/AAACAAEAAADu//X/AAACAAEAAADu//b/AAACAAEAAADu//f/AAACAAEAAADu//j/AAACAAEAAADu//n/AAACAAEAAADu//r/AAACAAEAAADu//v/AAACAAEAAADu//z/AAACAAEAAADu//3/AAACAAEAAADu//7/AAACAAEAAADu////AAACAAEAAADu/wAAAAACAAEAAADu/wEAAAACAAEAAADu/wIAAAACAAEAAADu/wMAAAACAAEAAADu/wQAAAACAAEAAADu/wUAAAACAAEAAADu/wYAAAACAAEAAADu/wcAAAACAAEAAADu/wgAAAACAAEAAADu/wkAAAACAAEAAADu/woAAAACAAEAAADu/wsAAAACAAEAAADu/wwAAAACAAEAAADu/w0AAAACAAEAAADu/w4AAAACAAEAAADu/w8AAAACAAEAAADu/xAAAAACAAEAAADu/xEAAAACAAEAAADu/xIAAAACAAEAAADu/xMAAAACAAEAAADu/xQAAAACAAEAAADu/xUAAAACAAEAAADu/xYAAAACAAEAAADu/xcAAAACAAEAAADu/xgAAAACAAEAAADu/xkAAAACAAEAAADu/xoAAAACAAEAAADu/xsAAAACAAEAAADu/xwAAAACAAEAAADu/x0AAAACAAEAAADu/x4AAAACAAEAAADu/x8AAAACAAEAAADu/yAAAAACAAEAAADu/yEAAAACAAEAAADu/yIAAAACAAEAAADu/yMAAAACAAEAAADu/yQAAAACAAEAAADu/yUAAAACAAEAAADu/yYAAAACAAEAAADu/ycAAAACAAEAAADu/ygAAAACAAEAAADu/ykAAAACAAEAAADu/yoAAAACAAEAAADu/ysAAAACAAEAAADu/ywAAAACAAEAAADu/y0AAAACAAEAAADu/y4AAAACAAEAAADu/y8AAAACAAEAAADu/zAAAAACAAEAAADu/zEAAAACAAEAAADu/zIAAAACAAEAAADu/zMAAAACAAEAAADu/zQAAAACAAEAAADu/zUAAAACAAEAAADu/zYAAAACAAEAAADu/zcAAAACAAEAAADu/zgAAAACAAEAAADv//T/AAACAAEAAADv//X/AAACAAEAAADv//b/AAACAAEAAADv//f/AAACAAEAAADv//j/AAACAAEAAADv//n/AAACAAEAAADv//r/AAACAAEAAADv//v/AAACAAEAAADv//z/AAACAAEAAADv//3/AAACAAEAAADv//7/AAACAAEAAADv////AAACAAEAAADv/wAAAAACAAEAAADv/wEAAAACAAEAAADv/wIAAAACAAEAAADv/wMAAAACAAEAAADv/wQAAAACAAEAAADv/wUAAAACAAEAAADv/wYAAAACAAEAAADv/wcAAAACAAEAAADv/wgAAAACAAEAAADv/wkAAAACAAEAAADv/woAAAACAAEAAADv/wsAAAACAAEAAADv/wwAAAACAAEAAADv/w0AAAACAAEAAADv/w4AAAACAAEAAADv/w8AAAACAAEAAADv/xAAAAACAAEAAADv/xEAAAACAAEAAADv/xIAAAACAAEAAADv/xMAAAACAAEAAADv/xQAAAACAAEAAADv/xUAAAACAAEAAADv/xYAAAACAAEAAADv/xcAAAACAAEAAADv/xgAAAACAAEAAADv/xkAAAACAAEAAADv/xoAAAACAAEAAADv/xsAAAACAAEAAADv/xwAAAACAAEAAADv/x0AAAACAAEAAADv/x4AAAACAAEAAADv/x8AAAACAAEAAADv/yAAAAACAAEAAADv/yEAAAACAAEAAADv/yIAAAACAAEAAADv/yMAAAACAAEAAADv/yQAAAACAAEAAADv/yUAAAACAAEAAADv/yYAAAACAAEAAADv/ycAAAACAAEAAADv/ygAAAACAAEAAADv/ykAAAACAAEAAADv/yoAAAACAAEAAADv/ysAAAACAAEAAADv/ywAAAACAAEAAADv/y0AAAACAAEAAADv/y4AAAACAAEAAADv/y8AAAACAAEAAADv/zAAAAACAAEAAADv/zEAAAACAAEAAADv/zIAAAACAAEAAADv/zMAAAACAAEAAADv/zQAAAACAAEAAADv/zUAAAACAAEAAADv/zYAAAACAAEAAADv/zcAAAACAAEAAADv/zgAAAACAAEAAADw//T/AAACAAEAAADw//X/AAACAAEAAADw//b/AAACAAEAAADw//f/AAACAAEAAADw//j/AAACAAEAAADw//n/AAACAAEAAADw//r/AAACAAEAAADw//v/AAACAAEAAADw//z/AAACAAEAAADw//3/AAACAAEAAADw//7/AAACAAEAAADw////AAACAAEAAADw/wAAAAACAAEAAADw/wEAAAACAAEAAADw/wIAAAACAAEAAADw/wMAAAACAAEAAADw/wQAAAACAAEAAADw/wUAAAACAAEAAADw/wYAAAACAAEAAADw/wcAAAACAAEAAADw/wgAAAACAAEAAADw/wkAAAACAAEAAADw/woAAAACAAEAAADw/wsAAAACAAEAAADw/wwAAAACAAEAAADw/w0AAAACAAEAAADw/w4AAAACAAEAAADw/w8AAAACAAEAAADw/xAAAAACAAEAAADw/xEAAAACAAEAAADw/xIAAAACAAEAAADw/xMAAAACAAEAAADw/xQAAAACAAEAAADw/xUAAAACAAEAAADw/xYAAAACAAEAAADw/xcAAAACAAEAAADw/xgAAAACAAEAAADw/xkAAAACAAEAAADw/xoAAAACAAEAAADw/xsAAAACAAEAAADw/xwAAAACAAEAAADw/x0AAAACAAEAAADw/x4AAAACAAEAAADw/x8AAAACAAEAAADw/yAAAAACAAEAAADw/yEAAAACAAEAAADw/yIAAAACAAEAAADw/yMAAAACAAEAAADw/yQAAAACAAEAAADw/yUAAAACAAEAAADw/yYAAAACAAEAAADw/ycAAAACAAEAAADw/ygAAAACAAEAAADw/ykAAAACAAEAAADw/yoAAAACAAEAAADw/ysAAAACAAEAAADw/ywAAAACAAEAAADw/y0AAAACAAEAAADw/y4AAAACAAEAAADw/y8AAAACAAEAAADw/zAAAAACAAEAAADw/zEAAAACAAEAAADw/zIAAAACAAEAAADw/zMAAAACAAEAAADw/zQAAAACAAEAAADw/zUAAAACAAEAAADw/zYAAAACAAEAAADw/zcAAAACAAEAAADw/zgAAAACAAEAAADx//T/AAACAAEAAADx//X/AAACAAEAAADx//b/AAACAAEAAADx//f/AAACAAEAAADx//j/AAACAAEAAADx//n/AAACAAEAAADx//r/AAACAAEAAADx//v/AAACAAEAAADx//z/AAACAAEAAADx//3/AAACAAEAAADx//7/AAACAAEAAADx////AAACAAEAAADx/wAAAAACAAEAAADx/wEAAAACAAEAAADx/wIAAAACAAEAAADx/wMAAAACAAEAAADx/wQAAAACAAEAAADx/wUAAAACAAEAAADx/wYAAAACAAEAAADx/wcAAAACAAEAAADx/wgAAAACAAEAAADx/wkAAAACAAEAAADx/woAAAACAAEAAADx/wsAAAACAAEAAADx/wwAAAACAAEAAADx/w0AAAACAAEAAADx/w4AAAACAAEAAADx/w8AAAACAAEAAADx/xAAAAACAAEAAADx/xEAAAACAAEAAADx/xIAAAACAAEAAADx/xMAAAACAAEAAADx/xQAAAACAAEAAADx/xUAAAACAAEAAADx/xYAAAACAAEAAADx/xcAAAACAAEAAADx/xgAAAACAAEAAADx/xkAAAACAAEAAADx/xoAAAACAAEAAADx/xsAAAACAAEAAADx/xwAAAACAAEAAADx/x0AAAACAAEAAADx/x4AAAACAAEAAADx/x8AAAACAAEAAADx/yAAAAACAAEAAADx/yEAAAACAAEAAADx/yIAAAACAAEAAADx/yMAAAACAAEAAADx/yQAAAACAAEAAADx/yUAAAACAAEAAADx/yYAAAACAAEAAADx/ycAAAACAAEAAADx/ygAAAACAAEAAADx/ykAAAACAAEAAADx/yoAAAACAAEAAADx/ysAAAACAAEAAADx/ywAAAACAAEAAADx/y0AAAACAAEAAADx/y4AAAACAAEAAADx/y8AAAACAAEAAADx/zAAAAACAAEAAADx/zEAAAACAAEAAADx/zIAAAACAAEAAADx/zMAAAACAAEAAADx/zQAAAACAAEAAADx/zUAAAACAAEAAADx/zYAAAACAAEAAADx/zcAAAACAAEAAADx/zgAAAACAAEAAADy//T/AAACAAEAAADy//X/AAACAAEAAADy//b/AAACAAEAAADy//f/AAACAAEAAADy//j/AAACAAEAAADy//n/AAACAAEAAADy//r/AAACAAEAAADy//v/AAACAAEAAADy//z/AAACAAEAAADy//3/AAACAAEAAADy//7/AAACAAEAAADy////AAACAAEAAADy/wAAAAACAAEAAADy/wEAAAACAAEAAADy/wIAAAACAAEAAADy/wMAAAACAAEAAADy/wQAAAACAAEAAADy/wUAAAACAAEAAADy/wYAAAACAAEAAADy/wcAAAACAAEAAADy/wgAAAACAAEAAADy/wkAAAACAAEAAADy/woAAAACAAEAAADy/wsAAAACAAEAAADy/wwAAAACAAEAAADy/w0AAAACAAEAAADy/w4AAAACAAEAAADy/w8AAAACAAEAAADy/xAAAAACAAEAAADy/xEAAAACAAEAAADy/xIAAAACAAEAAADy/xMAAAACAAEAAADy/xQAAAACAAEAAADy/xUAAAACAAEAAADy/xYAAAACAAEAAADy/xcAAAACAAEAAADy/xgAAAACAAEAAADy/xkAAAACAAEAAADy/xoAAAACAAEAAADy/xsAAAACAAEAAADy/xwAAAACAAEAAADy/x0AAAACAAEAAADy/x4AAAACAAEAAADy/x8AAAACAAEAAADy/yAAAAACAAEAAADy/yEAAAACAAEAAADy/yIAAAACAAEAAADy/yMAAAACAAEAAADy/yQAAAACAAEAAADy/yUAAAACAAEAAADy/yYAAAACAAEAAADy/ycAAAACAAEAAADy/ygAAAACAAEAAADy/ykAAAACAAEAAADy/yoAAAACAAEAAADy/ysAAAACAAEAAADy/ywAAAACAAEAAADy/y0AAAACAAEAAADy/y4AAAACAAEAAADy/y8AAAACAAEAAADy/zAAAAACAAEAAADy/zEAAAACAAEAAADy/zIAAAACAAEAAADy/zMAAAACAAEAAADy/zQAAAACAAEAAADy/zUAAAACAAEAAADy/zYAAAACAAEAAADy/zcAAAACAAEAAADy/zgAAAACAAEAAADz//T/AAACAAEAAADz//X/AAACAAEAAADz//b/AAACAAEAAADz//f/AAACAAEAAADz//j/AAACAAEAAADz//n/AAACAAEAAADz//r/AAACAAEAAADz//v/AAACAAEAAADz//z/AAACAAEAAADz//3/AAACAAEAAADz//7/AAACAAEAAADz////AAACAAEAAADz/wAAAAACAAEAAADz/wEAAAACAAEAAADz/wIAAAACAAEAAADz/wMAAAACAAEAAADz/wQAAAACAAEAAADz/wUAAAACAAEAAADz/wYAAAACAAEAAADz/wcAAAACAAEAAADz/wgAAAACAAEAAADz/wkAAAACAAEAAADz/woAAAACAAEAAADz/wsAAAACAAEAAADz/wwAAAACAAEAAADz/w0AAAACAAEAAADz/w4AAAACAAEAAADz/w8AAAACAAEAAADz/xAAAAACAAEAAADz/xEAAAACAAEAAADz/xIAAAACAAEAAADz/xMAAAACAAEAAADz/xQAAAACAAEAAADz/xUAAAACAAEAAADz/xYAAAACAAEAAADz/xcAAAACAAEAAADz/xgAAAACAAEAAADz/xkAAAACAAEAAADz/xoAAAACAAEAAADz/xsAAAACAAEAAADz/xwAAAACAAEAAADz/x0AAAACAAEAAADz/x4AAAACAAEAAADz/x8AAAACAAEAAADz/yAAAAACAAEAAADz/yEAAAACAAEAAADz/yIAAAACAAEAAADz/yMAAAACAAEAAADz/yQAAAACAAEAAADz/yUAAAACAAEAAADz/yYAAAACAAEAAADz/ycAAAACAAEAAADz/ygAAAACAAEAAADz/ykAAAACAAEAAADz/yoAAAACAAEAAADz/ysAAAACAAEAAADz/ywAAAACAAEAAADz/y0AAAACAAEAAADz/y4AAAACAAEAAADz/y8AAAACAAEAAADz/zAAAAACAAEAAADz/zEAAAACAAEAAADz/zIAAAACAAEAAADz/zMAAAACAAEAAADz/zQAAAACAAEAAADz/zUAAAACAAEAAADz/zYAAAACAAEAAADz/zcAAAACAAEAAADz/zgAAAACAAEAAAD0//T/AAACAAEAAAD0//X/AAACAAEAAAD0//b/AAACAAEAAAD0//f/AAACAAEAAAD0//j/AAACAAEAAAD0//n/AAACAAEAAAD0//r/AAACAAEAAAD0//v/AAACAAEAAAD0//z/AAACAAEAAAD0//3/AAACAAEAAAD0//7/AAACAAEAAAD0/wAAAAACAAEAAAD0/wEAAAACAAEAAAD0/wIAAAACAAEAAAD0/wMAAAACAAEAAAD0/wQAAAACAAEAAAD0/wUAAAACAAEAAAD0/wYAAAACAAEAAAD0/wcAAAACAAEAAAD0/wgAAAACAAEAAAD0/wkAAAACAAEAAAD0/woAAAACAAEAAAD0/wsAAAACAAEAAAD0/wwAAAACAAEAAAD0/w0AAAACAAEAAAD0/w4AAAACAAEAAAD0/w8AAAACAAEAAAD0/xAAAAACAAEAAAD0/xEAAAACAAEAAAD0/xIAAAACAAEAAAD0/xMAAAACAAEAAAD0/xQAAAACAAEAAAD0/xUAAAACAAEAAAD0/xYAAAACAAEAAAD0/xcAAAACAAEAAAD0/xgAAAACAAEAAAD0/xkAAAACAAEAAAD0/xoAAAACAAEAAAD0/xsAAAACAAEAAAD0/xwAAAACAAEAAAD0/x0AAAACAAEAAAD0/x4AAAACAAEAAAD0/x8AAAACAAEAAAD0/yAAAAACAAEAAAD0/yEAAAACAAEAAAD0/yIAAAACAAEAAAD0/yMAAAACAAEAAAD0/yQAAAACAAEAAAD0/yUAAAACAAEAAAD0/yYAAAACAAEAAAD0/ycAAAACAAEAAAD0/ygAAAACAAEAAAD0/ykAAAACAAEAAAD0/yoAAAACAAEAAAD0/ysAAAACAAEAAAD0/ywAAAACAAEAAAD0/y0AAAACAAEAAAD0/y4AAAACAAEAAAD0/y8AAAACAAEAAAD0/zAAAAACAAEAAAD0/zEAAAACAAEAAAD0/zIAAAACAAEAAAD0/zMAAAACAAEAAAD0/zQAAAACAAEAAAD0/zUAAAACAAEAAAD0/zYAAAACAAEAAAD0/zcAAAACAAEAAAD0/zgAAAACAAEAAAD1//T/AAACAAEAAAD1//X/AAACAAEAAAD1//b/AAACAAEAAAD1//f/AAACAAEAAAD1//j/AAACAAEAAAD1//n/AAACAAEAAAD1//r/AAACAAEAAAD1//v/AAACAAEAAAD1//z/AAACAAEAAAD1//3/AAACAAEAAAD1//7/AAACAAEAAAD1/wEAAAACAAEAAAD1/wIAAAACAAEAAAD1/wMAAAACAAEAAAD1/wQAAAACAAEAAAD1/wUAAAACAAEAAAD1/wYAAAACAAEAAAD1/wcAAAACAAEAAAD1/wgAAAACAAEAAAD1/wkAAAACAAEAAAD1/woAAAACAAEAAAD1/wsAAAACAAEAAAD1/wwAAAACAAEAAAD1/w0AAAACAAEAAAD1/w4AAAACAAEAAAD1/w8AAAACAAEAAAD1/xAAAAACAAEAAAD1/xEAAAACAAEAAAD1/xIAAAACAAEAAAD1/xMAAAACAAEAAAD1/xQAAAACAAEAAAD1/xUAAAACAAEAAAD1/xYAAAACAAEAAAD1/xcAAAACAAEAAAD1/xgAAAACAAEAAAD1/xkAAAACAAEAAAD1/xoAAAACAAEAAAD1/xsAAAACAAEAAAD1/xwAAAACAAEAAAD1/x0AAAACAAEAAAD1/x4AAAACAAEAAAD1/x8AAAACAAEAAAD1/yAAAAACAAEAAAD1/yEAAAACAAEAAAD1/yIAAAACAAEAAAD1/yMAAAACAAEAAAD1/yQAAAACAAEAAAD1/yUAAAACAAEAAAD1/yYAAAACAAEAAAD1/ycAAAACAAEAAAD1/ygAAAACAAEAAAD1/ykAAAACAAEAAAD1/yoAAAACAAEAAAD1/ysAAAACAAEAAAD1/ywAAAACAAEAAAD1/y0AAAACAAEAAAD1/y4AAAACAAEAAAD1/y8AAAACAAEAAAD1/zAAAAACAAEAAAD1/zEAAAACAAEAAAD1/zIAAAACAAEAAAD1/zMAAAACAAEAAAD1/zQAAAACAAEAAAD1/zUAAAACAAEAAAD1/zYAAAACAAEAAAD1/zcAAAACAAEAAAD1/zgAAAACAAEAAAD2//T/AAACAAEAAAD2//X/AAACAAEAAAD2//b/AAACAAEAAAD2//f/AAACAAEAAAD2//j/AAACAAEAAAD2//n/AAACAAEAAAD2//r/AAACAAEAAAD2//v/AAACAAEAAAD2//z/AAACAAEAAAD2//3/AAACAAEAAAD2//7/AAACAAEAAAD2////AAACAAEAAAD2/wIAAAACAAEAAAD2/wMAAAACAAEAAAD2/wQAAAACAAEAAAD2/wUAAAACAAEAAAD2/wYAAAACAAEAAAD2/wcAAAACAAEAAAD2/wgAAAACAAEAAAD2/wkAAAACAAEAAAD2/woAAAACAAEAAAD2/wsAAAACAAEAAAD2/wwAAAACAAEAAAD2/w0AAAACAAEAAAD2/w4AAAACAAEAAAD2/w8AAAACAAEAAAD2/xAAAAACAAEAAAD2/xEAAAACAAEAAAD2/xIAAAACAAEAAAD2/xMAAAACAAEAAAD2/xQAAAACAAEAAAD2/xUAAAACAAEAAAD2/xYAAAACAAEAAAD2/xcAAAACAAEAAAD2/xgAAAACAAEAAAD2/xkAAAACAAEAAAD2/xoAAAACAAEAAAD2/xsAAAACAAEAAAD2/xwAAAACAAEAAAD2/x0AAAACAAEAAAD2/x4AAAACAAEAAAD2/x8AAAACAAEAAAD2/yAAAAACAAEAAAD2/yEAAAACAAEAAAD2/yIAAAACAAEAAAD2/yMAAAACAAEAAAD2/yQAAAACAAEAAAD2/yUAAAACAAEAAAD2/yYAAAACAAEAAAD2/ycAAAACAAEAAAD2/ygAAAACAAEAAAD2/ykAAAACAAEAAAD2/yoAAAACAAEAAAD2/ysAAAACAAEAAAD2/ywAAAACAAEAAAD2/y0AAAACAAEAAAD2/y4AAAACAAEAAAD2/y8AAAACAAEAAAD2/zAAAAACAAEAAAD2/zEAAAACAAEAAAD2/zIAAAACAAEAAAD2/zMAAAACAAEAAAD2/zQAAAACAAEAAAD2/zUAAAACAAEAAAD2/zYAAAACAAEAAAD2/zcAAAACAAEAAAD2/zgAAAACAAEAAAD3//T/AAACAAEAAAD3//X/AAACAAEAAAD3//b/AAACAAEAAAD3//f/AAACAAEAAAD3//j/AAACAAEAAAD3//n/AAACAAEAAAD3//r/AAACAAEAAAD3//v/AAACAAEAAAD3//z/AAACAAEAAAD3//3/AAACAAEAAAD3//7/AAACAAEAAAD3////AAACAAEAAAD3/wAAAAACAAEAAAD3/wEAAAACAAEAAAD3/wMAAAACAAEAAAD3/wQAAAACAAEAAAD3/wUAAAACAAEAAAD3/wYAAAACAAEAAAD3/wcAAAACAAEAAAD3/wgAAAACAAEAAAD3/wkAAAACAAEAAAD3/woAAAACAAEAAAD3/wsAAAACAAEAAAD3/wwAAAACAAEAAAD3/w0AAAACAAEAAAD3/w4AAAACAAEAAAD3/w8AAAACAAEAAAD3/xAAAAACAAEAAAD3/xEAAAACAAEAAAD3/xIAAAACAAEAAAD3/xMAAAACAAEAAAD3/xQAAAACAAEAAAD3/xUAAAACAAEAAAD3/xYAAAACAAEAAAD3/xcAAAACAAEAAAD3/xgAAAACAAEAAAD3/xkAAAACAAEAAAD3/xoAAAACAAEAAAD3/xsAAAACAAEAAAD3/xwAAAACAAEAAAD3/x0AAAACAAEAAAD3/x4AAAACAAEAAAD3/x8AAAACAAEAAAD3/yAAAAACAAEAAAD3/yEAAAACAAEAAAD3/yIAAAACAAEAAAD3/yMAAAACAAEAAAD3/yQAAAACAAEAAAD3/yUAAAACAAEAAAD3/yYAAAACAAEAAAD3/ycAAAACAAEAAAD3/ygAAAACAAEAAAD3/ykAAAACAAEAAAD3/yoAAAACAAEAAAD3/ysAAAACAAEAAAD3/ywAAAACAAEAAAD3/y0AAAACAAEAAAD3/y4AAAACAAEAAAD3/y8AAAACAAEAAAD3/zAAAAACAAEAAAD3/zEAAAACAAEAAAD3/zIAAAACAAEAAAD3/zMAAAACAAEAAAD3/zQAAAACAAEAAAD3/zUAAAACAAEAAAD3/zYAAAACAAEAAAD3/zcAAAACAAEAAAD3/zgAAAACAAEAAAD4//T/AAACAAEAAAD4//X/AAACAAEAAAD4//b/AAACAAEAAAD4//f/AAACAAEAAAD4//j/AAACAAEAAAD4//n/AAACAAEAAAD4//r/AAACAAEAAAD4//v/AAACAAEAAAD4//z/AAACAAEAAAD4//3/AAACAAEAAAD4//7/AAACAAEAAAD4////AAACAAEAAAD4/wAAAAACAAEAAAD4/wEAAAACAAEAAAD4/wIAAAACAAEAAAD4/wUAAAACAAEAAAD4/wYAAAACAAEAAAD4/wcAAAACAAEAAAD4/wgAAAACAAEAAAD4/wkAAAACAAEAAAD4/woAAAACAAEAAAD4/wsAAAACAAEAAAD4/wwAAAACAAEAAAD4/w0AAAACAAEAAAD4/w4AAAACAAEAAAD4/w8AAAACAAEAAAD4/xAAAAACAAEAAAD4/xEAAAACAAEAAAD4/xIAAAACAAEAAAD4/xMAAAACAAEAAAD4/xQAAAACAAEAAAD4/xUAAAACAAEAAAD4/xYAAAACAAEAAAD4/xcAAAACAAEAAAD4/xgAAAACAAEAAAD4/xkAAAACAAEAAAD4/xoAAAACAAEAAAD4/xsAAAACAAEAAAD4/xwAAAACAAEAAAD4/x0AAAACAAEAAAD4/x4AAAACAAEAAAD4/x8AAAACAAEAAAD4/yAAAAACAAEAAAD4/yEAAAACAAEAAAD4/yIAAAACAAEAAAD4/yMAAAACAAEAAAD4/yQAAAACAAEAAAD4/yUAAAACAAEAAAD4/yYAAAACAAEAAAD4/ycAAAACAAEAAAD4/ygAAAACAAEAAAD4/ykAAAACAAEAAAD4/yoAAAACAAEAAAD4/ysAAAACAAEAAAD4/ywAAAACAAEAAAD4/y0AAAACAAEAAAD4/y4AAAACAAEAAAD4/y8AAAACAAEAAAD4/zAAAAACAAEAAAD4/zEAAAACAAEAAAD4/zIAAAACAAEAAAD4/zMAAAACAAEAAAD4/zQAAAACAAEAAAD4/zUAAAACAAEAAAD4/zYAAAACAAEAAAD4/zcAAAACAAEAAAD4/zgAAAACAAEAAAD5//T/AAACAAEAAAD5//X/AAACAAEAAAD5//b/AAACAAEAAAD5//f/AAACAAEAAAD5//j/AAACAAEAAAD5//n/AAACAAEAAAD5//r/AAACAAEAAAD5//v/AAACAAEAAAD5//z/AAACAAEAAAD5//3/AAACAAEAAAD5//7/AAACAAEAAAD5////AAACAAEAAAD5/wAAAAACAAEAAAD5/wEAAAACAAEAAAD5/wIAAAACAAEAAAD5/wMAAAACAAEAAAD5/wQAAAACAAEAAAD5/wYAAAACAAEAAAD5/wcAAAACAAEAAAD5/wgAAAACAAEAAAD5/wkAAAACAAEAAAD5/woAAAACAAEAAAD5/wsAAAACAAEAAAD5/wwAAAACAAEAAAD5/w0AAAACAAEAAAD5/w4AAAACAAEAAAD5/w8AAAACAAEAAAD5/xAAAAACAAEAAAD5/xEAAAACAAEAAAD5/xIAAAACAAEAAAD5/xMAAAACAAEAAAD5/xQAAAACAAEAAAD5/xUAAAACAAEAAAD5/xYAAAACAAEAAAD5/xcAAAACAAEAAAD5/xgAAAACAAEAAAD5/xkAAAACAAEAAAD5/xoAAAACAAEAAAD5/xsAAAACAAEAAAD5/xwAAAACAAEAAAD5/x0AAAACAAEAAAD5/x4AAAACAAEAAAD5/x8AAAACAAEAAAD5/yAAAAACAAEAAAD5/yEAAAACAAEAAAD5/yIAAAACAAEAAAD5/yMAAAACAAEAAAD5/yQAAAACAAEAAAD5/yUAAAACAAEAAAD5/yYAAAACAAEAAAD5/ycAAAACAAEAAAD5/ygAAAACAAEAAAD5/ykAAAACAAEAAAD5/yoAAAACAAEAAAD5/ysAAAACAAEAAAD5/ywAAAACAAEAAAD5/y0AAAACAAEAAAD5/y4AAAACAAEAAAD5/y8AAAACAAEAAAD5/zAAAAACAAEAAAD5/zEAAAACAAEAAAD5/zIAAAACAAEAAAD5/zMAAAACAAEAAAD5/zQAAAACAAEAAAD5/zUAAAACAAEAAAD5/zYAAAACAAEAAAD5/zcAAAACAAEAAAD5/zgAAAACAAEAAAD6//T/AAACAAEAAAD6//X/AAACAAEAAAD6//b/AAACAAEAAAD6//f/AAACAAEAAAD6//j/AAACAAEAAAD6//n/AAACAAEAAAD6//r/AAACAAEAAAD6//v/AAACAAEAAAD6//z/AAACAAEAAAD6//3/AAACAAEAAAD6//7/AAACAAEAAAD6////AAACAAEAAAD6/wAAAAACAAEAAAD6/wEAAAACAAEAAAD6/wIAAAACAAEAAAD6/wMAAAACAAEAAAD6/wQAAAACAAEAAAD6/wUAAAACAAEAAAD6/wgAAAACAAEAAAD6/wkAAAACAAEAAAD6/woAAAACAAEAAAD6/wsAAAACAAEAAAD6/wwAAAACAAEAAAD6/w0AAAACAAEAAAD6/w4AAAACAAEAAAD6/w8AAAACAAEAAAD6/xAAAAACAAEAAAD6/xEAAAACAAEAAAD6/xIAAAACAAEAAAD6/xMAAAACAAEAAAD6/xQAAAACAAEAAAD6/xUAAAACAAEAAAD6/xYAAAACAAEAAAD6/xcAAAACAAEAAAD6/xgAAAACAAEAAAD6/xkAAAACAAEAAAD6/xoAAAACAAEAAAD6/xsAAAACAAEAAAD6/xwAAAACAAEAAAD6/x0AAAACAAEAAAD6/x4AAAACAAEAAAD6/x8AAAACAAEAAAD6/yAAAAACAAEAAAD6/yEAAAACAAEAAAD6/yIAAAACAAEAAAD6/yMAAAACAAEAAAD6/yQAAAACAAEAAAD6/yUAAAACAAEAAAD6/yYAAAACAAEAAAD6/ycAAAACAAEAAAD6/ygAAAACAAEAAAD6/ykAAAACAAEAAAD6/yoAAAACAAEAAAD6/ysAAAACAAEAAAD6/ywAAAACAAEAAAD6/y0AAAACAAEAAAD6/y4AAAACAAEAAAD6/y8AAAACAAEAAAD6/zAAAAACAAEAAAD6/zEAAAACAAEAAAD6/zIAAAACAAEAAAD6/zMAAAACAAEAAAD6/zQAAAACAAEAAAD6/zUAAAACAAEAAAD6/zYAAAACAAEAAAD6/zcAAAACAAEAAAD6/zgAAAACAAEAAAD7//T/AAACAAEAAAD7//X/AAACAAEAAAD7//b/AAACAAEAAAD7//f/AAACAAEAAAD7//j/AAACAAEAAAD7//n/AAACAAEAAAD7//r/AAACAAEAAAD7//v/AAACAAEAAAD7//z/AAACAAEAAAD7//3/AAACAAEAAAD7//7/AAACAAEAAAD7////AAACAAEAAAD7/wAAAAACAAEAAAD7/wEAAAACAAEAAAD7/wIAAAACAAEAAAD7/wMAAAACAAEAAAD7/wQAAAACAAEAAAD7/wUAAAACAAEAAAD7/wYAAAACAAEAAAD7/wcAAAACAAEAAAD7/wkAAAACAAEAAAD7/woAAAACAAEAAAD7/wsAAAACAAEAAAD7/wwAAAACAAEAAAD7/w0AAAACAAEAAAD7/w4AAAACAAEAAAD7/w8AAAACAAEAAAD7/xAAAAACAAEAAAD7/xEAAAACAAEAAAD7/xIAAAACAAEAAAD7/xMAAAACAAEAAAD7/xQAAAACAAEAAAD7/xUAAAACAAEAAAD7/xYAAAACAAEAAAD7/xcAAAACAAEAAAD7/xgAAAACAAEAAAD7/xkAAAACAAEAAAD7/xoAAAACAAEAAAD7/xsAAAACAAEAAAD7/xwAAAACAAEAAAD7/x0AAAACAAEAAAD7/x4AAAACAAEAAAD7/x8AAAACAAEAAAD7/yAAAAACAAEAAAD7/yEAAAACAAEAAAD7/yIAAAACAAEAAAD7/yMAAAACAAEAAAD7/yQAAAACAAEAAAD7/yUAAAACAAEAAAD7/yYAAAACAAEAAAD7/ycAAAACAAEAAAD7/ygAAAACAAEAAAD7/ykAAAACAAEAAAD7/yoAAAACAAEAAAD7/ysAAAACAAEAAAD7/ywAAAACAAEAAAD7/y0AAAACAAEAAAD7/y4AAAACAAEAAAD7/y8AAAACAAEAAAD7/zAAAAACAAEAAAD7/zEAAAACAAEAAAD7/zIAAAACAAEAAAD7/zMAAAACAAEAAAD7/zQAAAACAAEAAAD7/zUAAAACAAEAAAD7/zYAAAACAAEAAAD7/zcAAAACAAEAAAD7/zgAAAACAAEAAAD8//T/AAACAAEAAAD8//X/AAACAAEAAAD8//b/AAACAAEAAAD8//f/AAACAAEAAAD8//j/AAACAAEAAAD8//n/AAACAAEAAAD8//r/AAACAAEAAAD8//v/AAACAAEAAAD8//z/AAACAAEAAAD8//3/AAACAAEAAAD8//7/AAACAAEAAAD8////AAACAAEAAAD8/wAAAAACAAEAAAD8/wEAAAACAAEAAAD8/wIAAAACAAEAAAD8/wMAAAACAAEAAAD8/wQAAAACAAEAAAD8/wUAAAACAAEAAAD8/wYAAAACAAEAAAD8/wcAAAACAAEAAAD8/wgAAAACAAEAAAD8/woAAAACAAEAAAD8/wsAAAACAAEAAAD8/wwAAAACAAEAAAD8/w0AAAACAAEAAAD8/w4AAAACAAEAAAD8/w8AAAACAAEAAAD8/xAAAAACAAEAAAD8/xEAAAACAAEAAAD8/xIAAAACAAEAAAD8/xMAAAACAAEAAAD8/xQAAAACAAEAAAD8/xUAAAACAAEAAAD8/xYAAAACAAEAAAD8/xcAAAACAAEAAAD8/xgAAAACAAEAAAD8/xkAAAACAAEAAAD8/xoAAAACAAEAAAD8/xsAAAACAAEAAAD8/xwAAAACAAEAAAD8/x0AAAACAAEAAAD8/x4AAAACAAEAAAD8/x8AAAACAAEAAAD8/yAAAAACAAEAAAD8/yEAAAACAAEAAAD8/yIAAAACAAEAAAD8/yMAAAACAAEAAAD8/yQAAAACAAEAAAD8/yUAAAACAAEAAAD8/yYAAAACAAEAAAD8/ycAAAACAAEAAAD8/ygAAAACAAEAAAD8/ykAAAACAAEAAAD8/yoAAAACAAEAAAD8/ysAAAACAAEAAAD8/ywAAAACAAEAAAD8/y0AAAACAAEAAAD8/y4AAAACAAEAAAD8/y8AAAACAAEAAAD8/zAAAAACAAEAAAD8/zEAAAACAAEAAAD8/zIAAAACAAEAAAD8/zMAAAACAAEAAAD8/zQAAAACAAEAAAD8/zUAAAACAAEAAAD8/zYAAAACAAEAAAD8/zcAAAACAAEAAAD8/zgAAAACAAEAAAD9//T/AAACAAEAAAD9//X/AAACAAEAAAD9//b/AAACAAEAAAD9//f/AAACAAEAAAD9//j/AAACAAEAAAD9//n/AAACAAEAAAD9//r/AAACAAEAAAD9//v/AAACAAEAAAD9//z/AAACAAEAAAD9//3/AAACAAEAAAD9//7/AAACAAEAAAD9////AAACAAEAAAD9/wAAAAACAAEAAAD9/wEAAAACAAEAAAD9/wIAAAACAAEAAAD9/wMAAAACAAEAAAD9/wQAAAACAAEAAAD9/wUAAAACAAEAAAD9/wYAAAACAAEAAAD9/wcAAAACAAEAAAD9/wgAAAACAAEAAAD9/wkAAAACAAEAAAD9/wsAAAACAAEAAAD9/wwAAAACAAEAAAD9/w0AAAACAAEAAAD9/w4AAAACAAEAAAD9/w8AAAACAAEAAAD9/xAAAAACAAEAAAD9/xEAAAACAAEAAAD9/xIAAAACAAEAAAD9/xMAAAACAAEAAAD9/xQAAAACAAEAAAD9/xUAAAACAAEAAAD9/xYAAAACAAEAAAD9/xcAAAACAAEAAAD9/xgAAAACAAEAAAD9/xkAAAACAAEAAAD9/xoAAAACAAEAAAD9/xsAAAACAAEAAAD9/xwAAAACAAEAAAD9/x0AAAACAAEAAAD9/x4AAAACAAEAAAD9/x8AAAACAAEAAAD9/yAAAAACAAEAAAD9/yEAAAACAAEAAAD9/yIAAAACAAEAAAD9/yMAAAACAAEAAAD9/yQAAAACAAEAAAD9/yUAAAACAAEAAAD9/yYAAAACAAEAAAD9/ycAAAACAAEAAAD9/ygAAAACAAEAAAD9/ykAAAACAAEAAAD9/yoAAAACAAEAAAD9/ysAAAACAAEAAAD9/ywAAAACAAEAAAD9/y0AAAACAAEAAAD9/y4AAAACAAEAAAD9/y8AAAACAAEAAAD9/zAAAAACAAEAAAD9/zEAAAACAAEAAAD9/zIAAAACAAEAAAD9/zMAAAACAAEAAAD9/zQAAAACAAEAAAD9/zUAAAACAAEAAAD9/zYAAAACAAEAAAD9/zcAAAACAAEAAAD9/zgAAAACAAEAAAD+//T/AAACAAEAAAD+//X/AAACAAEAAAD+//b/AAACAAEAAAD+//f/AAACAAEAAAD+//j/AAACAAEAAAD+//n/AAACAAEAAAD+//r/AAACAAEAAAD+//v/AAACAAEAAAD+//z/AAACAAEAAAD+//3/AAACAAEAAAD+//7/AAACAAEAAAD+////AAACAAEAAAD+/wAAAAACAAEAAAD+/wEAAAACAAEAAAD+/wIAAAACAAEAAAD+/wMAAAACAAEAAAD+/wQAAAACAAEAAAD+/wUAAAACAAEAAAD+/wYAAAACAAEAAAD+/wcAAAACAAEAAAD+/wgAAAACAAEAAAD+/wkAAAACAAEAAAD+/woAAAACAAEAAAD+/w0AAAACAAEAAAD+/w4AAAACAAEAAAD+/w8AAAACAAEAAAD+/xAAAAACAAEAAAD+/xEAAAACAAEAAAD+/xIAAAACAAEAAAD+/xMAAAACAAEAAAD+/xQAAAACAAEAAAD+/xUAAAACAAEAAAD+/xYAAAACAAEAAAD+/xcAAAACAAEAAAD+/xgAAAACAAEAAAD+/xkAAAACAAEAAAD+/xoAAAACAAEAAAD+/xsAAAACAAEAAAD+/xwAAAACAAEAAAD+/x0AAAACAAEAAAD+/x4AAAACAAEAAAD+/x8AAAACAAEAAAD+/yAAAAACAAEAAAD+/yEAAAACAAEAAAD+/yIAAAACAAEAAAD+/yMAAAACAAEAAAD+/yQAAAACAAEAAAD+/yUAAAACAAEAAAD+/yYAAAACAAEAAAD+/ycAAAACAAEAAAD+/ygAAAACAAEAAAD+/ykAAAACAAEAAAD+/yoAAAACAAEAAAD+/ysAAAACAAEAAAD+/ywAAAACAAEAAAD+/y0AAAACAAEAAAD+/y4AAAACAAEAAAD+/y8AAAACAAEAAAD+/zAAAAACAAEAAAD+/zEAAAACAAEAAAD+/zIAAAACAAEAAAD+/zMAAAACAAEAAAD+/zQAAAACAAEAAAD+/zUAAAACAAEAAAD+/zYAAAACAAEAAAD+/zcAAAACAAEAAAD+/zgAAAACAAEAAAD///T/AAACAAEAAAD///X/AAACAAEAAAD///b/AAACAAEAAAD///f/AAACAAEAAAD///j/AAACAAEAAAD///n/AAACAAEAAAD///r/AAACAAEAAAD///v/AAACAAEAAAD///z/AAACAAEAAAD///3/AAACAAEAAAD///7/AAACAAEAAAD/////AAACAAEAAAD//wAAAAACAAEAAAD//wEAAAACAAEAAAD//wIAAAACAAEAAAD//wMAAAACAAEAAAD//wQAAAACAAEAAAD//wUAAAACAAEAAAD//wYAAAACAAEAAAD//wcAAAACAAEAAAD//wgAAAACAAEAAAD//wkAAAACAAEAAAD//woAAAACAAEAAAD//wsAAAACAAEAAAD//wwAAAACAAEAAAD//w4AAAACAAEAAAD//w8AAAACAAEAAAD//xAAAAACAAEAAAD//xEAAAACAAEAAAD//xIAAAACAAEAAAD//xMAAAACAAEAAAD//xQAAAACAAEAAAD//xUAAAACAAEAAAD//xYAAAACAAEAAAD//xcAAAACAAEAAAD//xgAAAACAAEAAAD//xkAAAACAAEAAAD//xoAAAACAAEAAAD//xsAAAACAAEAAAD//xwAAAACAAEAAAD//x0AAAACAAEAAAD//x4AAAACAAEAAAD//x8AAAACAAEAAAD//yAAAAACAAEAAAD//yEAAAACAAEAAAD//yIAAAACAAEAAAD//yMAAAACAAEAAAD//yQAAAACAAEAAAD//yUAAAACAAEAAAD//yYAAAACAAEAAAD//ycAAAACAAEAAAD//ygAAAACAAEAAAD//ykAAAACAAEAAAD//yoAAAACAAEAAAD//ysAAAACAAEAAAD//ywAAAACAAEAAAD//y0AAAACAAEAAAD//y4AAAACAAEAAAD//y8AAAACAAEAAAD//zAAAAACAAEAAAD//zEAAAACAAEAAAD//zIAAAACAAEAAAD//zMAAAACAAEAAAD//zQAAAACAAEAAAD//zUAAAACAAEAAAD//zYAAAACAAEAAAD//zcAAAACAAEAAAD//zgAAAACAAEAAAAAAPT/AAACAAEAAAAAAPX/AAACAAEAAAAAAPb/AAACAAEAAAAAAPf/AAACAAEAAAAAAPj/AAACAAEAAAAAAPn/AAACAAEAAAAAAPr/AAACAAEAAAAAAPv/AAACAAEAAAAAAPz/AAACAAEAAAAAAP3/AAACAAEAAAAAAP7/AAACAAEAAAAAAP//AAACAAEAAAAAACkAAAACAAEAAAAAACoAAAACAAEAAAAAACsAAAACAAEAAAAAACwAAAACAAEAAAAAAC0AAAACAAEAAAAAAC4AAAACAAEAAAAAAC8AAAACAAEAAAAAADAAAAACAAEAAAAAADEAAAACAAEAAAAAADIAAAACAAEAAAAAADMAAAACAAEAAAAAADQAAAACAAEAAAAAADUAAAACAAEAAAAAADYAAAACAAEAAAAAADcAAAACAAEAAAAAADgAAAACAAEAAAABAPT/AAACAAEAAAABAPX/AAACAAEAAAABAPb/AAACAAEAAAABAPf/AAACAAEAAAABAPj/AAACAAEAAAABAPn/AAACAAEAAAABAPr/AAACAAEAAAABAPv/AAACAAEAAAABAPz/AAACAAEAAAABAP3/AAACAAEAAAABAP7/AAACAAEAAAABAP//AAACAAEAAAABACkAAAACAAEAAAABACoAAAACAAEAAAABACsAAAACAAEAAAABACwAAAACAAEAAAABAC0AAAACAAEAAAABAC4AAAACAAEAAAABAC8AAAACAAEAAAABADAAAAACAAEAAAABADEAAAACAAEAAAABADIAAAACAAEAAAABADMAAAACAAEAAAABADQAAAACAAEAAAABADUAAAACAAEAAAABADYAAAACAAEAAAABADcAAAACAAEAAAABADgAAAACAAEAAAACAPT/AAACAAEAAAACAPX/AAACAAEAAAACAPb/AAACAAEAAAACAPf/AAACAAEAAAACAPj/AAACAAEAAAACAPn/AAACAAEAAAACAPr/AAACAAEAAAACAPv/AAACAAEAAAACAPz/AAACAAEAAAACAP3/AAACAAEAAAACAP7/AAACAAEAAAACAP//AAACAAEAAAACACkAAAACAAEAAAACACoAAAACAAEAAAACACsAAAACAAEAAAACACwAAAACAAEAAAACAC0AAAACAAEAAAACAC4AAAACAAEAAAACAC8AAAACAAEAAAACADAAAAACAAEAAAACADEAAAACAAEAAAACADIAAAACAAEAAAACADMAAAACAAEAAAACADQAAAACAAEAAAACADUAAAACAAEAAAACADYAAAACAAEAAAACADcAAAACAAEAAAACADgAAAACAAEAAAADAPT/AAACAAEAAAADAPX/AAACAAEAAAADAPb/AAACAAEAAAADAPf/AAACAAEAAAADAPj/AAACAAEAAAADAPn/AAACAAEAAAADAPr/AAACAAEAAAADAPv/AAACAAEAAAADAPz/AAACAAEAAAADAP3/AAACAAEAAAADAP7/AAACAAEAAAADAP//AAACAAEAAAADACkAAAACAAEAAAADACoAAAACAAEAAAADACsAAAACAAEAAAADACwAAAACAAEAAAADAC0AAAACAAEAAAADAC4AAAACAAEAAAADAC8AAAACAAEAAAADADAAAAACAAEAAAADADEAAAACAAEAAAADADIAAAACAAEAAAADADMAAAACAAEAAAADADQAAAACAAEAAAADADUAAAACAAEAAAADADYAAAACAAEAAAADADcAAAACAAEAAAADADgAAAACAAEAAAAEAPT/AAACAAEAAAAEAPX/AAACAAEAAAAEAPb/AAACAAEAAAAEAPf/AAACAAEAAAAEAPj/AAACAAEAAAAEAPn/AAACAAEAAAAEAPr/AAACAAEAAAAEAPv/AAACAAEAAAAEAPz/AAACAAEAAAAEAP3/AAACAAEAAAAEAP7/AAACAAEAAAAEAP//AAACAAEAAAAEACkAAAACAAEAAAAEACoAAAACAAEAAAAEACsAAAACAAEAAAAEACwAAAACAAEAAAAEAC0AAAACAAEAAAAEAC4AAAACAAEAAAAEAC8AAAACAAEAAAAEADAAAAACAAEAAAAEADEAAAACAAEAAAAEADIAAAACAAEAAAAEADMAAAACAAEAAAAEADQAAAACAAEAAAAEADUAAAACAAEAAAAEADYAAAACAAEAAAAEADcAAAACAAEAAAAEADgAAAACAAEAAAAFAPT/AAACAAEAAAAFAPX/AAACAAEAAAAFAPb/AAACAAEAAAAFAPf/AAACAAEAAAAFAPj/AAACAAEAAAAFAPn/AAACAAEAAAAFAPr/AAACAAEAAAAFAPv/AAACAAEAAAAFAPz/AAACAAEAAAAFAP3/AAACAAEAAAAFAP7/AAACAAEAAAAFAP//AAACAAEAAAAFACkAAAACAAEAAAAFACoAAAACAAEAAAAFACsAAAACAAEAAAAFACwAAAACAAEAAAAFAC0AAAACAAEAAAAFAC4AAAACAAEAAAAFAC8AAAACAAEAAAAFADAAAAACAAEAAAAFADEAAAACAAEAAAAFADIAAAACAAEAAAAFADMAAAACAAEAAAAFADQAAAACAAEAAAAFADUAAAACAAEAAAAFADYAAAACAAEAAAAFADcAAAACAAEAAAAFADgAAAACAAEAAAAGAPT/AAACAAEAAAAGAPX/AAACAAEAAAAGAPb/AAACAAEAAAAGAPf/AAACAAEAAAAGAPj/AAACAAEAAAAGAPn/AAACAAEAAAAGAPr/AAACAAEAAAAGAPv/AAACAAEAAAAGAPz/AAACAAEAAAAGAP3/AAACAAEAAAAGAP7/AAACAAEAAAAGAP//AAACAAEAAAAGACkAAAACAAEAAAAGACoAAAACAAEAAAAGACsAAAACAAEAAAAGACwAAAACAAEAAAAGAC0AAAACAAEAAAAGAC4AAAACAAEAAAAGAC8AAAACAAEAAAAGADAAAAACAAEAAAAGADEAAAACAAEAAAAGADIAAAACAAEAAAAGADMAAAACAAEAAAAGADQAAAACAAEAAAAGADUAAAACAAEAAAAGADYAAAACAAEAAAAGADcAAAACAAEAAAAGADgAAAACAAEAAAAHAPT/AAACAAEAAAAHAPX/AAACAAEAAAAHAPb/AAACAAEAAAAHAPf/AAACAAEAAAAHAPj/AAACAAEAAAAHAPn/AAACAAEAAAAHAPr/AAACAAEAAAAHAPv/AAACAAEAAAAHAPz/AAACAAEAAAAHAP3/AAACAAEAAAAHAP7/AAACAAEAAAAHAP//AAACAAEAAAAHACkAAAACAAEAAAAHACoAAAACAAEAAAAHACsAAAACAAEAAAAHACwAAAACAAEAAAAHAC0AAAACAAEAAAAHAC4AAAACAAEAAAAHAC8AAAACAAEAAAAHADAAAAACAAEAAAAHADEAAAACAAEAAAAHADIAAAACAAEAAAAHADMAAAACAAEAAAAHADQAAAACAAEAAAAHADUAAAACAAEAAAAHADYAAAACAAEAAAAHADcAAAACAAEAAAAHADgAAAACAAEAAAAIACkAAAACAAEAAAAIACoAAAACAAEAAAAIACsAAAACAAEAAAAIACwAAAACAAEAAAAIAC0AAAACAAEAAAAIAC4AAAACAAEAAAAIAC8AAAACAAEAAAAIADAAAAACAAEAAAAIADEAAAACAAEAAAAIADIAAAACAAEAAAAIADMAAAACAAEAAAAIADQAAAACAAEAAAAIADUAAAACAAEAAAAIADYAAAACAAEAAAAIADcAAAACAAEAAAAIADgAAAACAAEAAAAJACkAAAACAAEAAAAJACoAAAACAAEAAAAJACsAAAACAAEAAAAJACwAAAACAAEAAAAJAC0AAAACAAEAAAAJAC4AAAACAAEAAAAJAC8AAAACAAEAAAAJADAAAAACAAEAAAAJADEAAAACAAEAAAAJADIAAAACAAEAAAAJADMAAAACAAEAAAAJADQAAAACAAEAAAAJADUAAAACAAEAAAAJADYAAAACAAEAAAAJADcAAAACAAEAAAAJADgAAAACAAEAAAAKACkAAAACAAEAAAAKACoAAAACAAEAAAAKACsAAAACAAEAAAAKACwAAAACAAEAAAAKAC0AAAACAAEAAAAKAC4AAAACAAEAAAAKAC8AAAACAAEAAAAKADAAAAACAAEAAAAKADEAAAACAAEAAAAKADIAAAACAAEAAAAKADMAAAACAAEAAAAKADQAAAACAAEAAAAKADUAAAACAAEAAAAKADYAAAACAAEAAAAKADcAAAACAAEAAAAKADgAAAACAAEAAAALACkAAAACAAEAAAALACoAAAACAAEAAAALACsAAAACAAEAAAALACwAAAACAAEAAAALAC0AAAACAAEAAAALAC4AAAACAAEAAAALAC8AAAACAAEAAAALADAAAAACAAEAAAALADEAAAACAAEAAAALADIAAAACAAEAAAALADMAAAACAAEAAAALADQAAAACAAEAAAALADUAAAACAAEAAAALADYAAAACAAEAAAALADcAAAACAAEAAAALADgAAAACAAEAAAAMACkAAAACAAEAAAAMACoAAAACAAEAAAAMACsAAAACAAEAAAAMACwAAAACAAEAAAAMAC0AAAACAAEAAAAMAC4AAAACAAEAAAAMAC8AAAACAAEAAAAMADAAAAACAAEAAAAMADEAAAACAAEAAAAMADIAAAACAAEAAAAMADMAAAACAAEAAAAMADQAAAACAAEAAAAMADUAAAACAAEAAAAMADYAAAACAAEAAAAMADcAAAACAAEAAAAMADgAAAACAAEAAAANACkAAAACAAEAAAANACoAAAACAAEAAAANACsAAAACAAEAAAANACwAAAACAAEAAAANAC0AAAACAAEAAAANAC4AAAACAAEAAAANAC8AAAACAAEAAAANADAAAAACAAEAAAANADEAAAACAAEAAAANADIAAAACAAEAAAANADMAAAACAAEAAAANADQAAAACAAEAAAANADUAAAACAAEAAAANADYAAAACAAEAAAANADcAAAACAAEAAAANADgAAAACAAEAAAAOACkAAAACAAEAAAAOACoAAAACAAEAAAAOACsAAAACAAEAAAAOACwAAAACAAEAAAAOAC0AAAACAAEAAAAOAC4AAAACAAEAAAAOAC8AAAACAAEAAAAOADAAAAACAAEAAAAOADEAAAACAAEAAAAOADIAAAACAAEAAAAOADMAAAACAAEAAAAOADQAAAACAAEAAAAOADUAAAACAAEAAAAOADYAAAACAAEAAAAOADcAAAACAAEAAAAOADgAAAACAAEAAAAPACkAAAACAAEAAAAPACoAAAACAAEAAAAPACsAAAACAAEAAAAPACwAAAACAAEAAAAPAC0AAAACAAEAAAAPAC4AAAACAAEAAAAPAC8AAAACAAEAAAAPADAAAAACAAEAAAAPADEAAAACAAEAAAAPADIAAAACAAEAAAAPADMAAAACAAEAAAAPADQAAAACAAEAAAAPADUAAAACAAEAAAAPADYAAAACAAEAAAAPADcAAAACAAEAAAAPADgAAAACAAEAAAAQACkAAAACAAEAAAAQACoAAAACAAEAAAAQACsAAAACAAEAAAAQACwAAAACAAEAAAAQAC0AAAACAAEAAAAQAC4AAAACAAEAAAAQAC8AAAACAAEAAAAQADAAAAACAAEAAAAQADEAAAACAAEAAAAQADIAAAACAAEAAAAQADMAAAACAAEAAAAQADQAAAACAAEAAAAQADUAAAACAAEAAAAQADYAAAACAAEAAAAQADcAAAACAAEAAAAQADgAAAACAAEAAAARACkAAAACAAEAAAARACoAAAACAAEAAAARACsAAAACAAEAAAARACwAAAACAAEAAAARAC0AAAACAAEAAAARAC4AAAACAAEAAAARAC8AAAACAAEAAAARADAAAAACAAEAAAARADEAAAACAAEAAAARADIAAAACAAEAAAARADMAAAACAAEAAAARADQAAAACAAEAAAARADUAAAACAAEAAAARADYAAAACAAEAAAARADcAAAACAAEAAAARADgAAAACAAEAAAASACkAAAACAAEAAAASACoAAAACAAEAAAASACsAAAACAAEAAAASACwAAAACAAEAAAASAC0AAAACAAEAAAASAC4AAAACAAEAAAASAC8AAAACAAEAAAASADAAAAACAAEAAAASADEAAAACAAEAAAASADIAAAACAAEAAAASADMAAAACAAEAAAASADQAAAACAAEAAAASADUAAAACAAEAAAASADYAAAACAAEAAAASADcAAAACAAEAAAASADgAAAACAAEAAAATACkAAAACAAEAAAATACoAAAACAAEAAAATACsAAAACAAEAAAATACwAAAACAAEAAAATAC0AAAACAAEAAAATAC4AAAACAAEAAAATAC8AAAACAAEAAAATADAAAAACAAEAAAATADEAAAACAAEAAAATADIAAAACAAEAAAATADMAAAACAAEAAAATADQAAAACAAEAAAATADUAAAACAAEAAAATADYAAAACAAEAAAATADcAAAACAAEAAAATADgAAAACAAEAAAAUACkAAAACAAEAAAAUACoAAAACAAEAAAAUACsAAAACAAEAAAAUACwAAAACAAEAAAAUAC0AAAACAAEAAAAUAC4AAAACAAEAAAAUAC8AAAACAAEAAAAUADAAAAACAAEAAAAUADEAAAACAAEAAAAUADIAAAACAAEAAAAUADMAAAACAAEAAAAUADQAAAACAAEAAAAUADUAAAACAAEAAAAUADYAAAACAAEAAAAUADcAAAACAAEAAAAUADgAAAACAAEAAAAVACkAAAACAAEAAAAVACoAAAACAAEAAAAVACsAAAACAAEAAAAVACwAAAACAAEAAAAVAC0AAAACAAEAAAAVAC4AAAACAAEAAAAVAC8AAAACAAEAAAAVADAAAAACAAEAAAAVADEAAAACAAEAAAAVADIAAAACAAEAAAAVADMAAAACAAEAAAAVADQAAAACAAEAAAAVADUAAAACAAEAAAAVADYAAAACAAEAAAAVADcAAAACAAEAAAAVADgAAAACAAEAAAAWACkAAAACAAEAAAAWACoAAAACAAEAAAAWACsAAAACAAEAAAAWACwAAAACAAEAAAAWAC0AAAACAAEAAAAWAC4AAAACAAEAAAAWAC8AAAACAAEAAAAWADAAAAACAAEAAAAWADEAAAACAAEAAAAWADIAAAACAAEAAAAWADMAAAACAAEAAAAWADQAAAACAAEAAAAWADUAAAACAAEAAAAWADYAAAACAAEAAAAWADcAAAACAAEAAAAWADgAAAACAAEAAAAXACkAAAACAAEAAAAXACoAAAACAAEAAAAXACsAAAACAAEAAAAXACwAAAACAAEAAAAXAC0AAAACAAEAAAAXAC4AAAACAAEAAAAXAC8AAAACAAEAAAAXADAAAAACAAEAAAAXADEAAAACAAEAAAAXADIAAAACAAEAAAAXADMAAAACAAEAAAAXADQAAAACAAEAAAAXADUAAAACAAEAAAAXADYAAAACAAEAAAAXADcAAAACAAEAAAAXADgAAAACAAEAAAAYACkAAAACAAEAAAAYACoAAAACAAEAAAAYACsAAAACAAEAAAAYACwAAAACAAEAAAAYAC0AAAACAAEAAAAYAC4AAAACAAEAAAAYAC8AAAACAAEAAAAYADAAAAACAAEAAAAYADEAAAACAAEAAAAYADIAAAACAAEAAAAYADMAAAACAAEAAAAYADQAAAACAAEAAAAYADUAAAACAAEAAAAYADYAAAACAAEAAAAYADcAAAACAAEAAAAYADgAAAACAAEAAAAZACkAAAACAAEAAAAZACoAAAACAAEAAAAZACsAAAACAAEAAAAZACwAAAACAAEAAAAZAC0AAAACAAEAAAAZAC4AAAACAAEAAAAZAC8AAAACAAEAAAAZADAAAAACAAEAAAAZADEAAAACAAEAAAAZADIAAAACAAEAAAAZADMAAAACAAEAAAAZADQAAAACAAEAAAAZADUAAAACAAEAAAAZADYAAAACAAEAAAAZADcAAAACAAEAAAAZADgAAAACAAEAAAAaACkAAAACAAEAAAAaACoAAAACAAEAAAAaACsAAAACAAEAAAAaACwAAAACAAEAAAAaAC0AAAACAAEAAAAaAC4AAAACAAEAAAAaAC8AAAACAAEAAAAaADAAAAACAAEAAAAaADEAAAACAAEAAAAaADIAAAACAAEAAAAaADMAAAACAAEAAAAaADQAAAACAAEAAAAaADUAAAACAAEAAAAaADYAAAACAAEAAAAaADcAAAACAAEAAAAaADgAAAACAAEAAAAbACkAAAACAAEAAAAbACoAAAACAAEAAAAbACsAAAACAAEAAAAbACwAAAACAAEAAAAbAC0AAAACAAEAAAAbAC4AAAACAAEAAAAbAC8AAAACAAEAAAAbADAAAAACAAEAAAAbADEAAAACAAEAAAAbADIAAAACAAEAAAAbADMAAAACAAEAAAAbADQAAAACAAEAAAAbADUAAAACAAEAAAAbADYAAAACAAEAAAAbADcAAAACAAEAAAAbADgAAAACAAEAAAAcACkAAAACAAEAAAAcACoAAAACAAEAAAAcACsAAAACAAEAAAAcACwAAAACAAEAAAAcAC0AAAACAAEAAAAcAC4AAAACAAEAAAAcAC8AAAACAAEAAAAcADAAAAACAAEAAAAcADEAAAACAAEAAAAcADIAAAACAAEAAAAcADMAAAACAAEAAAAcADQAAAACAAEAAAAcADUAAAACAAEAAAAcADYAAAACAAEAAAAcADcAAAACAAEAAAAcADgAAAACAAEAAAAdACkAAAACAAEAAAAdACoAAAACAAEAAAAdACsAAAACAAEAAAAdACwAAAACAAEAAAAdAC0AAAACAAEAAAAdAC4AAAACAAEAAAAdAC8AAAACAAEAAAAdADAAAAACAAEAAAAdADEAAAACAAEAAAAdADIAAAACAAEAAAAdADMAAAACAAEAAAAdADQAAAACAAEAAAAdADUAAAACAAEAAAAdADYAAAACAAEAAAAdADcAAAACAAEAAAAdADgAAAACAAEAAAAeACkAAAACAAEAAAAeACoAAAACAAEAAAAeACsAAAACAAEAAAAeACwAAAACAAEAAAAeAC0AAAACAAEAAAAeAC4AAAACAAEAAAAeAC8AAAACAAEAAAAeADAAAAACAAEAAAAeADEAAAACAAEAAAAeADIAAAACAAEAAAAeADMAAAACAAEAAAAeADQAAAACAAEAAAAeADUAAAACAAEAAAAeADYAAAACAAEAAAAeADcAAAACAAEAAAAeADgAAAACAAEAAAAfACkAAAACAAEAAAAfACoAAAACAAEAAAAfACsAAAACAAEAAAAfACwAAAACAAEAAAAfAC0AAAACAAEAAAAfAC4AAAACAAEAAAAfAC8AAAACAAEAAAAfADAAAAACAAEAAAAfADEAAAACAAEAAAAfADIAAAACAAEAAAAfADMAAAACAAEAAAAfADQAAAACAAEAAAAfADUAAAACAAEAAAAfADYAAAACAAEAAAAfADcAAAACAAEAAAAfADgAAAACAAEAAAAgACkAAAACAAEAAAAgACoAAAACAAEAAAAgACsAAAACAAEAAAAgACwAAAACAAEAAAAgAC0AAAACAAEAAAAgAC4AAAACAAEAAAAgAC8AAAACAAEAAAAgADAAAAACAAEAAAAgADEAAAACAAEAAAAgADIAAAACAAEAAAAgADMAAAACAAEAAAAgADQAAAACAAEAAAAgADUAAAACAAEAAAAgADYAAAACAAEAAAAgADcAAAACAAEAAAAgADgAAAACAAEAAAAhACkAAAACAAEAAAAhACoAAAACAAEAAAAhACsAAAACAAEAAAAhACwAAAACAAEAAAAhAC0AAAACAAEAAAAhAC4AAAACAAEAAAAhAC8AAAACAAEAAAAhADAAAAACAAEAAAAhADEAAAACAAEAAAAhADIAAAACAAEAAAAhADMAAAACAAEAAAAhADQAAAACAAEAAAAhADUAAAACAAEAAAAhADYAAAACAAEAAAAhADcAAAACAAEAAAAhADgAAAACAAEAAAAiACkAAAACAAEAAAAiACoAAAACAAEAAAAiACsAAAACAAEAAAAiACwAAAACAAEAAAAiAC0AAAACAAEAAAAiAC4AAAACAAEAAAAiAC8AAAACAAEAAAAiADAAAAACAAEAAAAiADEAAAACAAEAAAAiADIAAAACAAEAAAAiADMAAAACAAEAAAAiADQAAAACAAEAAAAiADUAAAACAAEAAAAiADYAAAACAAEAAAAiADcAAAACAAEAAAAiADgAAAACAAEAAAAjACkAAAACAAEAAAAjACoAAAACAAEAAAAjACsAAAACAAEAAAAjACwAAAACAAEAAAAjAC0AAAACAAEAAAAjAC4AAAACAAEAAAAjAC8AAAACAAEAAAAjADAAAAACAAEAAAAjADEAAAACAAEAAAAjADIAAAACAAEAAAAjADMAAAACAAEAAAAjADQAAAACAAEAAAAjADUAAAACAAEAAAAjADYAAAACAAEAAAAjADcAAAACAAEAAAAjADgAAAACAAEAAAAkACkAAAACAAEAAAAkACoAAAACAAEAAAAkACsAAAACAAEAAAAkACwAAAACAAEAAAAkAC0AAAACAAEAAAAkAC4AAAACAAEAAAAkAC8AAAACAAEAAAAkADAAAAACAAEAAAAkADEAAAACAAEAAAAkADIAAAACAAEAAAAkADMAAAACAAEAAAAkADQAAAACAAEAAAAkADUAAAACAAEAAAAkADYAAAACAAEAAAAkADcAAAACAAEAAAAkADgAAAACAAEAAAAlACkAAAACAAEAAAAlACoAAAACAAEAAAAlACsAAAACAAEAAAAlACwAAAACAAEAAAAlAC0AAAACAAEAAAAlAC4AAAACAAEAAAAlAC8AAAACAAEAAAAlADAAAAACAAEAAAAlADEAAAACAAEAAAAlADIAAAACAAEAAAAlADMAAAACAAEAAAAlADQAAAACAAEAAAAlADUAAAACAAEAAAAlADYAAAACAAEAAAAlADcAAAACAAEAAAAlADgAAAACAAEAAAAmACkAAAACAAEAAAAmACoAAAACAAEAAAAmACsAAAACAAEAAAAmACwAAAACAAEAAAAmAC0AAAACAAEAAAAmAC4AAAACAAEAAAAmAC8AAAACAAEAAAAmADAAAAACAAEAAAAmADEAAAACAAEAAAAmADIAAAACAAEAAAAmADMAAAACAAEAAAAmADQAAAACAAEAAAAmADUAAAACAAEAAAAmADYAAAACAAEAAAAmADcAAAACAAEAAAAmADgAAAACAAEAAAAnACkAAAACAAEAAAAnACoAAAACAAEAAAAnACsAAAACAAEAAAAnACwAAAACAAEAAAAnAC0AAAACAAEAAAAnAC4AAAACAAEAAAAnAC8AAAACAAEAAAAnADAAAAACAAEAAAAnADEAAAACAAEAAAAnADIAAAACAAEAAAAnADMAAAACAAEAAAAnADQAAAACAAEAAAAnADUAAAACAAEAAAAnADYAAAACAAEAAAAnADcAAAACAAEAAAAnADgAAAACAAEAAAAoACkAAAACAAEAAAAoACoAAAACAAEAAAAoACsAAAACAAEAAAAoACwAAAACAAEAAAAoAC0AAAACAAEAAAAoAC4AAAACAAEAAAAoAC8AAAACAAEAAAAoADAAAAACAAEAAAAoADEAAAACAAEAAAAoADIAAAACAAEAAAAoADMAAAACAAEAAAAoADQAAAACAAEAAAAoADUAAAACAAEAAAAoADYAAAACAAEAAAAoADcAAAACAAEAAAAoADgAAAACAAEAAAApACkAAAACAAEAAAApACoAAAACAAEAAAApACsAAAACAAEAAAApACwAAAACAAEAAAApAC0AAAACAAEAAAApAC4AAAACAAEAAAApAC8AAAACAAEAAAApADAAAAACAAEAAAApADEAAAACAAEAAAApADIAAAACAAEAAAApADMAAAACAAEAAAApADQAAAACAAEAAAApADUAAAACAAEAAAApADYAAAACAAEAAAApADcAAAACAAEAAAApADgAAAACAAEAAAAqACkAAAACAAEAAAAqACoAAAACAAEAAAAqACsAAAACAAEAAAAqACwAAAACAAEAAAAqAC0AAAACAAEAAAAqAC4AAAACAAEAAAAqAC8AAAACAAEAAAAqADAAAAACAAEAAAAqADEAAAACAAEAAAAqADIAAAACAAEAAAAqADMAAAACAAEAAAAqADQAAAACAAEAAAAqADUAAAACAAEAAAAqADYAAAACAAEAAAAqADcAAAACAAEAAAAqADgAAAACAAEAAAArACkAAAACAAEAAAArACoAAAACAAEAAAArACsAAAACAAEAAAArACwAAAACAAEAAAArAC0AAAACAAEAAAArAC4AAAACAAEAAAArAC8AAAACAAEAAAArADAAAAACAAEAAAArADEAAAACAAEAAAArADIAAAACAAEAAAArADMAAAACAAEAAAArADQAAAACAAEAAAArADUAAAACAAEAAAArADYAAAACAAEAAAArADcAAAACAAEAAAArADgAAAACAAEAAAAsACkAAAACAAEAAAAsACoAAAACAAEAAAAsACsAAAACAAEAAAAsACwAAAACAAEAAAAsAC0AAAACAAEAAAAsAC4AAAACAAEAAAAsAC8AAAACAAEAAAAsADAAAAACAAEAAAAsADEAAAACAAEAAAAsADIAAAACAAEAAAAsADMAAAACAAEAAAAsADQAAAACAAEAAAAsADUAAAACAAEAAAAsADYAAAACAAEAAAAsADcAAAACAAEAAAAsADgAAAACAAEAAAAtACkAAAACAAEAAAAtACoAAAACAAEAAAAtACsAAAACAAEAAAAtACwAAAACAAEAAAAtAC0AAAACAAEAAAAtAC4AAAACAAEAAAAtAC8AAAACAAEAAAAtADAAAAACAAEAAAAtADEAAAACAAEAAAAtADIAAAACAAEAAAAtADMAAAACAAEAAAAtADQAAAACAAEAAAAtADUAAAACAAEAAAAtADYAAAACAAEAAAAtADcAAAACAAEAAAAtADgAAAACAAEAAAAuACkAAAACAAEAAAAuACoAAAACAAEAAAAuACsAAAACAAEAAAAuACwAAAACAAEAAAAuAC0AAAACAAEAAAAuAC4AAAACAAEAAAAuAC8AAAACAAEAAAAuADAAAAACAAEAAAAuADEAAAACAAEAAAAuADIAAAACAAEAAAAuADMAAAACAAEAAAAuADQAAAACAAEAAAAuADUAAAACAAEAAAAuADYAAAACAAEAAAAuADcAAAACAAEAAAAuADgAAAACAAEAAAAvACkAAAACAAEAAAAvACoAAAACAAEAAAAvACsAAAACAAEAAAAvACwAAAACAAEAAAAvAC0AAAACAAEAAAAvAC4AAAACAAEAAAAvAC8AAAACAAEAAAAvADAAAAACAAEAAAAvADEAAAACAAEAAAAvADIAAAACAAEAAAAvADMAAAACAAEAAAAvADQAAAACAAEAAAAvADUAAAACAAEAAAAvADYAAAACAAEAAAAvADcAAAACAAEAAAAvADgAAAACAAEAAAAwACkAAAACAAEAAAAwACoAAAACAAEAAAAwACsAAAACAAEAAAAwACwAAAACAAEAAAAwAC0AAAACAAEAAAAwAC4AAAACAAEAAAAwAC8AAAACAAEAAAAwADAAAAACAAEAAAAwADEAAAACAAEAAAAwADIAAAACAAEAAAAwADMAAAACAAEAAAAwADQAAAACAAEAAAAwADUAAAACAAEAAAAwADYAAAACAAEAAAAwADcAAAACAAEAAAAwADgAAAACAAEAAAAxACkAAAACAAEAAAAxACoAAAACAAEAAAAxACsAAAACAAEAAAAxACwAAAACAAEAAAAxAC0AAAACAAEAAAAxAC4AAAACAAEAAAAxAC8AAAACAAEAAAAxADAAAAACAAEAAAAxADEAAAACAAEAAAAxADIAAAACAAEAAAAxADMAAAACAAEAAAAxADQAAAACAAEAAAAxADUAAAACAAEAAAAxADYAAAACAAEAAAAxADcAAAACAAEAAAAxADgAAAACAAEAAAAyACkAAAACAAEAAAAyACoAAAACAAEAAAAyACsAAAACAAEAAAAyACwAAAACAAEAAAAyAC0AAAACAAEAAAAyAC4AAAACAAEAAAAyAC8AAAACAAEAAAAyADAAAAACAAEAAAAyADEAAAACAAEAAAAyADIAAAACAAEAAAAyADMAAAACAAEAAAAyADQAAAACAAEAAAAyADUAAAACAAEAAAAyADYAAAACAAEAAAAyADcAAAACAAEAAAAyADgAAAACAAEAAAAzACkAAAACAAEAAAAzACoAAAACAAEAAAAzACsAAAACAAEAAAAzACwAAAACAAEAAAAzAC0AAAACAAEAAAAzAC4AAAACAAEAAAAzAC8AAAACAAEAAAAzADAAAAACAAEAAAAzADEAAAACAAEAAAAzADIAAAACAAEAAAAzADMAAAACAAEAAAAzADQAAAACAAEAAAAzADUAAAACAAEAAAAzADYAAAACAAEAAAAzADcAAAACAAEAAAAzADgAAAACAAEAAAA0ACkAAAACAAEAAAA0ACoAAAACAAEAAAA0ACsAAAACAAEAAAA0ACwAAAACAAEAAAA0AC0AAAACAAEAAAA0AC4AAAACAAEAAAA0AC8AAAACAAEAAAA0ADAAAAACAAEAAAA0ADEAAAACAAEAAAA0ADIAAAACAAEAAAA0ADMAAAACAAEAAAA0ADQAAAACAAEAAAA0ADUAAAACAAEAAAA0ADYAAAACAAEAAAA0ADcAAAACAAEAAAA0ADgAAAACAAEAAAA1ACkAAAACAAEAAAA1ACoAAAACAAEAAAA1ACsAAAACAAEAAAA1ACwAAAACAAEAAAA1AC0AAAACAAEAAAA1AC4AAAACAAEAAAA1AC8AAAACAAEAAAA1ADAAAAACAAEAAAA1ADEAAAACAAEAAAA1ADIAAAACAAEAAAA1ADMAAAACAAEAAAA1ADQAAAACAAEAAAA1ADUAAAACAAEAAAA1ADYAAAACAAEAAAA1ADcAAAACAAEAAAA1ADgAAAACAAEAAAA2ACkAAAACAAEAAAA2ACoAAAACAAEAAAA2ACsAAAACAAEAAAA2ACwAAAACAAEAAAA2AC0AAAACAAEAAAA2AC4AAAACAAEAAAA2AC8AAAACAAEAAAA2ADAAAAACAAEAAAA2ADEAAAACAAEAAAA2ADIAAAACAAEAAAA2ADMAAAACAAEAAAA2ADQAAAACAAEAAAA2ADUAAAACAAEAAAA2ADYAAAACAAEAAAA2ADcAAAACAAEAAAA2ADgAAAACAAEAAAA3ACkAAAACAAEAAAA3ACoAAAACAAEAAAA3ACsAAAACAAEAAAA3ACwAAAACAAEAAAA3AC0AAAACAAEAAAA3AC4AAAACAAEAAAA3AC8AAAACAAEAAAA3ADAAAAACAAEAAAA3ADEAAAACAAEAAAA3ADIAAAACAAEAAAA3ADMAAAACAAEAAAA3ADQAAAACAAEAAAA3ADUAAAACAAEAAAA3ADYAAAACAAEAAAA3ADcAAAACAAEAAAA3ADgAAAACAAEAAAA4ACkAAAACAAEAAAA4ACoAAAACAAEAAAA4ACsAAAACAAEAAAA4ACwAAAACAAEAAAA4AC0AAAACAAEAAAA4AC4AAAACAAEAAAA4AC8AAAACAAEAAAA4ADAAAAACAAEAAAA4ADEAAAACAAEAAAA4ADIAAAACAAEAAAA4ADMAAAACAAEAAAA4ADQAAAACAAEAAAA4ADUAAAACAAEAAAA4ADYAAAACAAEAAAA4ADcAAAACAAEAAAA4ADgAAAACAAEAAAA5ACkAAAACAAEAAAA5ACoAAAACAAEAAAA5ACsAAAACAAEAAAA5ACwAAAACAAEAAAA5AC0AAAACAAEAAAA5AC4AAAACAAEAAAA5AC8AAAACAAEAAAA5ADAAAAACAAEAAAA5ADEAAAACAAEAAAA5ADIAAAACAAEAAAA5ADMAAAACAAEAAAA5ADQAAAACAAEAAAA5ADUAAAACAAEAAAA5ADYAAAACAAEAAAA5ADcAAAACAAEAAAA5ADgAAAACAAEAAAA6ACkAAAACAAEAAAA6ACoAAAACAAEAAAA6ACsAAAACAAEAAAA6ACwAAAACAAEAAAA6AC0AAAACAAEAAAA6AC4AAAACAAEAAAA6AC8AAAACAAEAAAA6ADAAAAACAAEAAAA6ADEAAAACAAEAAAA6ADIAAAACAAEAAAA6ADMAAAACAAEAAAA6ADQAAAACAAEAAAA6ADUAAAACAAEAAAA6ADYAAAACAAEAAAA6ADcAAAACAAEAAAA6ADgAAAACAAEAAAA7ACkAAAACAAEAAAA7ACoAAAACAAEAAAA7ACsAAAACAAEAAAA7ACwAAAACAAEAAAA7AC0AAAACAAEAAAA7AC4AAAACAAEAAAA7AC8AAAACAAEAAAA7ADAAAAACAAEAAAA7ADEAAAACAAEAAAA7ADIAAAACAAEAAAA7ADMAAAACAAEAAAA7ADQAAAACAAEAAAA7ADUAAAACAAEAAAA7ADYAAAACAAEAAAA7ADcAAAACAAEAAAA7ADgAAAACAAEAAAA8ACkAAAACAAEAAAA8ACoAAAACAAEAAAA8ACsAAAACAAEAAAA8ACwAAAACAAEAAAA8AC0AAAACAAEAAAA8AC4AAAACAAEAAAA8AC8AAAACAAEAAAA8ADAAAAACAAEAAAA8ADEAAAACAAEAAAA8ADIAAAACAAEAAAA8ADMAAAACAAEAAAA8ADQAAAACAAEAAAA8ADUAAAACAAEAAAA8ADYAAAACAAEAAAA8ADcAAAACAAEAAAA8ADgAAAACAAEAAAA9ACkAAAACAAEAAAA9ACoAAAACAAEAAAA9ACsAAAACAAEAAAA9ACwAAAACAAEAAAA9AC0AAAACAAEAAAA9AC4AAAACAAEAAAA9AC8AAAACAAEAAAA9ADAAAAACAAEAAAA9ADEAAAACAAEAAAA9ADIAAAACAAEAAAA9ADMAAAACAAEAAAA9ADQAAAACAAEAAAA9ADUAAAACAAEAAAA9ADYAAAACAAEAAAA9ADcAAAACAAEAAAA9ADgAAAACAAEAAAA+ACkAAAACAAEAAAA+ACoAAAACAAEAAAA+ACsAAAACAAEAAAA+ACwAAAACAAEAAAA+AC0AAAACAAEAAAA+AC4AAAACAAEAAAA+AC8AAAACAAEAAAA+ADAAAAACAAEAAAA+ADEAAAACAAEAAAA+ADIAAAACAAEAAAA+ADMAAAACAAEAAAA+ADQAAAACAAEAAAA+ADUAAAACAAEAAAA+ADYAAAACAAEAAAA+ADcAAAACAAEAAAA+ADgAAAACAAEAAAA/ACkAAAACAAEAAAA/ACoAAAACAAEAAAA/ACsAAAACAAEAAAA/ACwAAAACAAEAAAA/AC0AAAACAAEAAAA/AC4AAAACAAEAAAA/AC8AAAACAAEAAAA/ADAAAAACAAEAAAA/ADEAAAACAAEAAAA/ADIAAAACAAEAAAA/ADMAAAACAAEAAAA/ADQAAAACAAEAAAA/ADUAAAACAAEAAAA/ADYAAAACAAEAAAA/ADcAAAACAAEAAAA/ADgAAAACAAEAAABAACkAAAACAAEAAABAACoAAAACAAEAAABAACsAAAACAAEAAABAACwAAAACAAEAAABAAC0AAAACAAEAAABAAC4AAAACAAEAAABAAC8AAAACAAEAAABAADAAAAACAAEAAABAADEAAAACAAEAAABAADIAAAACAAEAAABAADMAAAACAAEAAABAADQAAAACAAEAAABAADUAAAACAAEAAABAADYAAAACAAEAAABAADcAAAACAAEAAABAADgAAAACAAEAAABBACkAAAACAAEAAABBACoAAAACAAEAAABBACsAAAACAAEAAABBACwAAAACAAEAAABBAC0AAAACAAEAAABBAC4AAAACAAEAAABBAC8AAAACAAEAAABBADAAAAACAAEAAABBADEAAAACAAEAAABBADIAAAACAAEAAABBADMAAAACAAEAAABBADQAAAACAAEAAABBADUAAAACAAEAAABBADYAAAACAAEAAABBADcAAAACAAEAAABBADgAAAACAAEAAABCACkAAAACAAEAAABCACoAAAACAAEAAABCACsAAAACAAEAAABCACwAAAACAAEAAABCAC0AAAACAAEAAABCAC4AAAACAAEAAABCAC8AAAACAAEAAABCADAAAAACAAEAAABCADEAAAACAAEAAABCADIAAAACAAEAAABCADMAAAACAAEAAABCADQAAAACAAEAAABCADUAAAACAAEAAABCADYAAAACAAEAAABCADcAAAACAAEAAABCADgAAAACAAEAAABDACkAAAACAAEAAABDACoAAAACAAEAAABDACsAAAACAAEAAABDACwAAAACAAEAAABDAC0AAAACAAEAAABDAC4AAAACAAEAAABDAC8AAAACAAEAAABDADAAAAACAAEAAABDADEAAAACAAEAAABDADIAAAACAAEAAABDADMAAAACAAEAAABDADQAAAACAAEAAABDADUAAAACAAEAAABDADYAAAACAAEAAABDADcAAAACAAEAAABDADgAAAACAAEAAABEACkAAAACAAEAAABEACoAAAACAAEAAABEACsAAAACAAEAAABEACwAAAACAAEAAABEAC0AAAACAAEAAABEAC4AAAACAAEAAABEAC8AAAACAAEAAABEADAAAAACAAEAAABEADEAAAACAAEAAABEADIAAAACAAEAAABEADMAAAACAAEAAABEADQAAAACAAEAAABEADUAAAACAAEAAABEADYAAAACAAEAAABEADcAAAACAAEAAABEADgAAAACAAEAAABFACkAAAACAAEAAABFACoAAAACAAEAAABFACsAAAACAAEAAABFACwAAAACAAEAAABFAC0AAAACAAEAAABFAC4AAAACAAEAAABFAC8AAAACAAEAAABFADAAAAACAAEAAABFADEAAAACAAEAAABFADIAAAACAAEAAABFADMAAAACAAEAAABFADQAAAACAAEAAABFADUAAAACAAEAAABFADYAAAACAAEAAABFADcAAAACAAEAAABFADgAAAACAAEAAABGACkAAAACAAEAAABGACoAAAACAAEAAABGACsAAAACAAEAAABGACwAAAACAAEAAABGAC0AAAACAAEAAABGAC4AAAACAAEAAABGAC8AAAACAAEAAABGADAAAAACAAEAAABGADEAAAACAAEAAABGADIAAAACAAEAAABGADMAAAACAAEAAABGADQAAAACAAEAAABGADUAAAACAAEAAABGADYAAAACAAEAAABGADcAAAACAAEAAABGADgAAAACAAEAAABHACkAAAACAAEAAABHACoAAAACAAEAAABHACsAAAACAAEAAABHACwAAAACAAEAAABHAC0AAAACAAEAAABHAC4AAAACAAEAAABHAC8AAAACAAEAAABHADAAAAACAAEAAABHADEAAAACAAEAAABHADIAAAACAAEAAABHADMAAAACAAEAAABHADQAAAACAAEAAABHADUAAAACAAEAAABHADYAAAACAAEAAABHADcAAAACAAEAAABHADgAAAACAAEAAABIACYAAAACAAEAAABIACcAAAACAAEAAABIACgAAAACAAEAAABIACkAAAACAAEAAABIACoAAAACAAEAAABIACsAAAACAAEAAABIACwAAAACAAEAAABIAC0AAAACAAEAAABIAC4AAAACAAEAAABIAC8AAAACAAEAAABIADAAAAACAAEAAABIADEAAAACAAEAAABIADIAAAACAAEAAABIADMAAAACAAEAAABIADQAAAACAAEAAABIADUAAAACAAEAAABIADYAAAACAAEAAABIADcAAAACAAEAAABIADgAAAACAAEAAABJACYAAAACAAEAAABJACcAAAACAAEAAABJACgAAAACAAEAAABJACkAAAACAAEAAABJACoAAAACAAEAAABJACsAAAACAAEAAABJACwAAAACAAEAAABJAC0AAAACAAEAAABJAC4AAAACAAEAAABJAC8AAAACAAEAAABJADAAAAACAAEAAABJADEAAAACAAEAAABJADIAAAACAAEAAABJADMAAAACAAEAAABJADQAAAACAAEAAABJADUAAAACAAEAAABJADYAAAACAAEAAABJADcAAAACAAEAAABJADgAAAACAAEAAABKACYAAAACAAEAAABKACcAAAACAAEAAABKACgAAAACAAEAAABKACkAAAACAAEAAABKACoAAAACAAEAAABKACsAAAACAAEAAABKACwAAAACAAEAAABKAC0AAAACAAEAAABKAC4AAAACAAEAAABKAC8AAAACAAEAAABKADAAAAACAAEAAABKADEAAAACAAEAAABKADIAAAACAAEAAABKADMAAAACAAEAAABKADQAAAACAAEAAABKADUAAAACAAEAAABKADYAAAACAAEAAABKADcAAAACAAEAAABKADgAAAACAAEAAABLACYAAAACAAEAAABLACcAAAACAAEAAABLACgAAAACAAEAAABLACkAAAACAAEAAABLACoAAAACAAEAAABLACsAAAACAAEAAABLACwAAAACAAEAAABLAC0AAAACAAEAAABLAC4AAAACAAEAAABLAC8AAAACAAEAAABLADAAAAACAAEAAABLADEAAAACAAEAAABLADIAAAACAAEAAABLADMAAAACAAEAAABLADQAAAACAAEAAABLADUAAAACAAEAAABLADYAAAACAAEAAABLADcAAAACAAEAAABLADgAAAACAAEAAABMACYAAAACAAEAAABMACcAAAACAAEAAABMACgAAAACAAEAAABMACkAAAACAAEAAABMACoAAAACAAEAAABMACsAAAACAAEAAABMACwAAAACAAEAAABMAC0AAAACAAEAAABMAC4AAAACAAEAAABMAC8AAAACAAEAAABMADAAAAACAAEAAABMADEAAAACAAEAAABMADIAAAACAAEAAABMADMAAAACAAEAAABMADQAAAACAAEAAABMADUAAAACAAEAAABMADYAAAACAAEAAABMADcAAAACAAEAAABMADgAAAACAAEAAABNACYAAAACAAEAAABNACcAAAACAAEAAABNACgAAAACAAEAAABNACkAAAACAAEAAABNACoAAAACAAEAAABNACsAAAACAAEAAABNACwAAAACAAEAAABNAC0AAAACAAEAAABNAC4AAAACAAEAAABNAC8AAAACAAEAAABNADAAAAACAAEAAABNADEAAAACAAEAAABNADIAAAACAAEAAABNADMAAAACAAEAAABNADQAAAACAAEAAABNADUAAAACAAEAAABNADYAAAACAAEAAABNADcAAAACAAEAAABNADgAAAACAAEAAABOACYAAAACAAEAAABOACcAAAACAAEAAABOACgAAAACAAEAAABOACkAAAACAAEAAABOACoAAAACAAEAAABOACsAAAACAAEAAABOACwAAAACAAEAAABOAC0AAAACAAEAAABOAC4AAAACAAEAAABOAC8AAAACAAEAAABOADAAAAACAAEAAABOADEAAAACAAEAAABOADIAAAACAAEAAABOADMAAAACAAEAAABOADQAAAACAAEAAABOADUAAAACAAEAAABOADYAAAACAAEAAABOADcAAAACAAEAAABOADgAAAACAAEAAABPACYAAAACAAEAAABPACcAAAACAAEAAABPACgAAAACAAEAAABPACkAAAACAAEAAABPACoAAAACAAEAAABPACsAAAACAAEAAABPACwAAAACAAEAAABPAC0AAAACAAEAAABPAC4AAAACAAEAAABPAC8AAAACAAEAAABPADAAAAACAAEAAABPADEAAAACAAEAAABPADIAAAACAAEAAABPADMAAAACAAEAAABPADQAAAACAAEAAABPADUAAAACAAEAAABPADYAAAACAAEAAABPADcAAAACAAEAAABPADgAAAACAAEAAABQACYAAAACAAEAAABQACcAAAACAAEAAABQACgAAAACAAEAAABQACkAAAACAAEAAABQACoAAAACAAEAAABQACsAAAACAAEAAABQACwAAAACAAEAAABQAC0AAAACAAEAAABQAC4AAAACAAEAAABQAC8AAAACAAEAAABQADAAAAACAAEAAABQADEAAAACAAEAAABQADIAAAACAAEAAABQADMAAAACAAEAAABQADQAAAACAAEAAABQADUAAAACAAEAAABQADYAAAACAAEAAABQADcAAAACAAEAAABQADgAAAACAAEAAABRACYAAAACAAEAAABRACcAAAACAAEAAABRACgAAAACAAEAAABRACkAAAACAAEAAABRACoAAAACAAEAAABRACsAAAACAAEAAABRACwAAAACAAEAAABRAC0AAAACAAEAAABRAC4AAAACAAEAAABRAC8AAAACAAEAAABRADAAAAACAAEAAABRADEAAAACAAEAAABRADIAAAACAAEAAABRADMAAAACAAEAAABRADQAAAACAAEAAABRADUAAAACAAEAAABRADYAAAACAAEAAABRADcAAAACAAEAAABRADgAAAACAAEAAABSACYAAAACAAEAAABSACcAAAACAAEAAABSACgAAAACAAEAAABSACkAAAACAAEAAABSACoAAAACAAEAAABSACsAAAACAAEAAABSACwAAAACAAEAAABSAC0AAAACAAEAAABSAC4AAAACAAEAAABSAC8AAAACAAEAAABSADAAAAACAAEAAABSADEAAAACAAEAAABSADIAAAACAAEAAABSADMAAAACAAEAAABSADQAAAACAAEAAABSADUAAAACAAEAAABSADYAAAACAAEAAABSADcAAAACAAEAAABSADgAAAACAAEAAABTACYAAAACAAEAAABTACcAAAACAAEAAABTACgAAAACAAEAAABTACkAAAACAAEAAABTACoAAAACAAEAAABTACsAAAACAAEAAABTACwAAAACAAEAAABTAC0AAAACAAEAAABTAC4AAAACAAEAAABTAC8AAAACAAEAAABTADAAAAACAAEAAABTADEAAAACAAEAAABTADIAAAACAAEAAABTADMAAAACAAEAAABTADQAAAACAAEAAABTADUAAAACAAEAAABTADYAAAACAAEAAABTADcAAAACAAEAAABTADgAAAACAAEAAABUACYAAAACAAEAAABUACcAAAACAAEAAABUACgAAAACAAEAAABUACkAAAACAAEAAABUACoAAAACAAEAAABUACsAAAACAAEAAABUACwAAAACAAEAAABUAC0AAAACAAEAAABUAC4AAAACAAEAAABUAC8AAAACAAEAAABUADAAAAACAAEAAABUADEAAAACAAEAAABUADIAAAACAAEAAABUADMAAAACAAEAAABUADQAAAACAAEAAABUADUAAAACAAEAAABUADYAAAACAAEAAABUADcAAAACAAEAAABUADgAAAACAAEAAABVACYAAAACAAEAAABVACcAAAACAAEAAABVACgAAAACAAEAAABVACkAAAACAAEAAABVACoAAAACAAEAAABVACsAAAACAAEAAABVACwAAAACAAEAAABVAC0AAAACAAEAAABVAC4AAAACAAEAAABVAC8AAAACAAEAAABVADAAAAACAAEAAABVADEAAAACAAEAAABVADIAAAACAAEAAABVADMAAAACAAEAAABVADQAAAACAAEAAABVADUAAAACAAEAAABVADYAAAACAAEAAABVADcAAAACAAEAAABVADgAAAACAAEAAABWACYAAAACAAEAAABWACcAAAACAAEAAABWACgAAAACAAEAAABWACkAAAACAAEAAABWACoAAAACAAEAAABWACsAAAACAAEAAABWACwAAAACAAEAAABWAC0AAAACAAEAAABWAC4AAAACAAEAAABWAC8AAAACAAEAAABWADAAAAACAAEAAABWADEAAAACAAEAAABWADIAAAACAAEAAABWADMAAAACAAEAAABWADQAAAACAAEAAABWADUAAAACAAEAAABWADYAAAACAAEAAABWADcAAAACAAEAAABWADgAAAACAAEAAABXACYAAAACAAEAAABXACcAAAACAAEAAABXACgAAAACAAEAAABXACkAAAACAAEAAABXACoAAAACAAEAAABXACsAAAACAAEAAABXACwAAAACAAEAAABXAC0AAAACAAEAAABXAC4AAAACAAEAAABXAC8AAAACAAEAAABXADAAAAACAAEAAABXADEAAAACAAEAAABXADIAAAACAAEAAABXADMAAAACAAEAAABXADQAAAACAAEAAABXADUAAAACAAEAAABXADYAAAACAAEAAABXADcAAAACAAEAAABXADgAAAACAAEAAABYACYAAAACAAEAAABYACcAAAACAAEAAABYACgAAAACAAEAAABYACkAAAACAAEAAABYACoAAAACAAEAAABYACsAAAACAAEAAABYACwAAAACAAEAAABYAC0AAAACAAEAAABYAC4AAAACAAEAAABYAC8AAAACAAEAAABYADAAAAACAAEAAABYADEAAAACAAEAAABYADIAAAACAAEAAABYADMAAAACAAEAAABYADQAAAACAAEAAABYADUAAAACAAEAAABYADYAAAACAAEAAABYADcAAAACAAEAAABYADgAAAACAAEAAABZACYAAAACAAEAAABZACcAAAACAAEAAABZACgAAAACAAEAAABZACkAAAACAAEAAABZACoAAAACAAEAAABZACsAAAACAAEAAABZACwAAAACAAEAAABZAC0AAAACAAEAAABZAC4AAAACAAEAAABZAC8AAAACAAEAAABZADAAAAACAAEAAABZADEAAAACAAEAAABZADIAAAACAAEAAABZADMAAAACAAEAAABZADQAAAACAAEAAABZADUAAAACAAEAAABZADYAAAACAAEAAABZADcAAAACAAEAAABZADgAAAACAAEAAABaACYAAAACAAEAAABaACcAAAACAAEAAABaACgAAAACAAEAAABaACkAAAACAAEAAABaACoAAAACAAEAAABaACsAAAACAAEAAABaACwAAAACAAEAAABaAC0AAAACAAEAAABaAC4AAAACAAEAAABaAC8AAAACAAEAAABaADAAAAACAAEAAABaADEAAAACAAEAAABaADIAAAACAAEAAABaADMAAAACAAEAAABaADQAAAACAAEAAABaADUAAAACAAEAAABaADYAAAACAAEAAABaADcAAAACAAEAAABaADgAAAACAAEAAABbACYAAAACAAEAAABbACcAAAACAAEAAABbACgAAAACAAEAAABbACkAAAACAAEAAABbACoAAAACAAEAAABbACsAAAACAAEAAABbACwAAAACAAEAAABbAC0AAAACAAEAAABbAC4AAAACAAEAAABbAC8AAAACAAEAAABbADAAAAACAAEAAABbADEAAAACAAEAAABbADIAAAACAAEAAABbADMAAAACAAEAAABbADQAAAACAAEAAABbADUAAAACAAEAAABbADYAAAACAAEAAABbADcAAAACAAEAAABbADgAAAACAAEAAABcACYAAAACAAEAAABcACcAAAACAAEAAABcACgAAAACAAEAAABcACkAAAACAAEAAABcACoAAAACAAEAAABcACsAAAACAAEAAABcACwAAAACAAEAAABcAC0AAAACAAEAAABcAC4AAAACAAEAAABcAC8AAAACAAEAAABcADAAAAACAAEAAABcADEAAAACAAEAAABcADIAAAACAAEAAABcADMAAAACAAEAAABcADQAAAACAAEAAABcADUAAAACAAEAAABcADYAAAACAAEAAABcADcAAAACAAEAAABcADgAAAACAAEAAABdACYAAAACAAEAAABdACcAAAACAAEAAABdACgAAAACAAEAAABdACkAAAACAAEAAABdACoAAAACAAEAAABdACsAAAACAAEAAABdACwAAAACAAEAAABdAC0AAAACAAEAAABdAC4AAAACAAEAAABdAC8AAAACAAEAAABdADAAAAACAAEAAABdADEAAAACAAEAAABdADIAAAACAAEAAABdADMAAAACAAEAAABdADQAAAACAAEAAABdADUAAAACAAEAAABdADYAAAACAAEAAABdADcAAAACAAEAAABdADgAAAACAAEAAABeACYAAAACAAEAAABeACcAAAACAAEAAABeACgAAAACAAEAAABeACkAAAACAAEAAABeACoAAAACAAEAAABeACsAAAACAAEAAABeACwAAAACAAEAAABeAC0AAAACAAEAAABeAC4AAAACAAEAAABeAC8AAAACAAEAAABeADAAAAACAAEAAABeADEAAAACAAEAAABeADIAAAACAAEAAABeADMAAAACAAEAAABeADQAAAACAAEAAABeADUAAAACAAEAAABeADYAAAACAAEAAABeADcAAAACAAEAAABeADgAAAACAAEAAABfACYAAAACAAEAAABfACcAAAACAAEAAABfACgAAAACAAEAAABfACkAAAACAAEAAABfACoAAAACAAEAAABfACsAAAACAAEAAABfACwAAAACAAEAAABfAC0AAAACAAEAAABfAC4AAAACAAEAAABfAC8AAAACAAEAAABfADAAAAACAAEAAABfADEAAAACAAEAAABfADIAAAACAAEAAABfADMAAAACAAEAAABfADQAAAACAAEAAABfADUAAAACAAEAAABfADYAAAACAAEAAABfADcAAAACAAEAAABfADgAAAACAAEAAABgACYAAAACAAEAAABgACcAAAACAAEAAABgACgAAAACAAEAAABgACkAAAACAAEAAABgACoAAAACAAEAAABgACsAAAACAAEAAABgACwAAAACAAEAAABgAC0AAAACAAEAAABgAC4AAAACAAEAAABgAC8AAAACAAEAAABgADAAAAACAAEAAABgADEAAAACAAEAAABgADIAAAACAAEAAABgADMAAAACAAEAAABgADQAAAACAAEAAABgADUAAAACAAEAAABgADYAAAACAAEAAABgADcAAAACAAEAAABgADgAAAACAAEAAABhACYAAAACAAEAAABhACcAAAACAAEAAABhACgAAAACAAEAAABhACkAAAACAAEAAABhACoAAAACAAEAAABhACsAAAACAAEAAABhACwAAAACAAEAAABhAC0AAAACAAEAAABhAC4AAAACAAEAAABhAC8AAAACAAEAAABhADAAAAACAAEAAABhADEAAAACAAEAAABhADIAAAACAAEAAABhADMAAAACAAEAAABhADQAAAACAAEAAABhADUAAAACAAEAAABhADYAAAACAAEAAABhADcAAAACAAEAAABhADgAAAACAAEAAABiACYAAAACAAEAAABiACcAAAACAAEAAABiACgAAAACAAEAAABiACkAAAACAAEAAABiACoAAAACAAEAAABiACsAAAACAAEAAABiACwAAAACAAEAAABiAC0AAAACAAEAAABiAC4AAAACAAEAAABiAC8AAAACAAEAAABiADAAAAACAAEAAABiADEAAAACAAEAAABiADIAAAACAAEAAABiADMAAAACAAEAAABiADQAAAACAAEAAABiADUAAAACAAEAAABiADYAAAACAAEAAABiADcAAAACAAEAAABiADgAAAACAAEAAABjACYAAAACAAEAAABjACcAAAACAAEAAABjACgAAAACAAEAAABjACkAAAACAAEAAABjACoAAAACAAEAAABjACsAAAACAAEAAABjACwAAAACAAEAAABjAC0AAAACAAEAAABjAC4AAAACAAEAAABjAC8AAAACAAEAAABjADAAAAACAAEAAABjADEAAAACAAEAAABjADIAAAACAAEAAABjADMAAAACAAEAAABjADQAAAACAAEAAABjADUAAAACAAEAAABjADYAAAACAAEAAABjADcAAAACAAEAAABjADgAAAACAAEAAABkACYAAAACAAEAAABkACcAAAACAAEAAABkACgAAAACAAEAAABkACkAAAACAAEAAABkACoAAAACAAEAAABkACsAAAACAAEAAABkACwAAAACAAEAAABkAC0AAAACAAEAAABkAC4AAAACAAEAAABkAC8AAAACAAEAAABkADAAAAACAAEAAABkADEAAAACAAEAAABkADIAAAACAAEAAABkADMAAAACAAEAAABkADQAAAACAAEAAABkADUAAAACAAEAAABkADYAAAACAAEAAABkADcAAAACAAEAAABkADgAAAACAAEAAABlACYAAAACAAEAAABlACcAAAACAAEAAABlACgAAAACAAEAAABlACkAAAACAAEAAABlACoAAAACAAEAAABlACsAAAACAAEAAABlACwAAAACAAEAAABlAC0AAAACAAEAAABlAC4AAAACAAEAAABlAC8AAAACAAEAAABlADAAAAACAAEAAABlADEAAAACAAEAAABlADIAAAACAAEAAABlADMAAAACAAEAAABlADQAAAACAAEAAABlADUAAAACAAEAAABlADYAAAACAAEAAABlADcAAAACAAEAAABlADgAAAACAAEAAABmACYAAAACAAEAAABmACcAAAACAAEAAABmACgAAAACAAEAAABmACkAAAACAAEAAABmACoAAAACAAEAAABmACsAAAACAAEAAABmACwAAAACAAEAAABmAC0AAAACAAEAAABmAC4AAAACAAEAAABmAC8AAAACAAEAAABmADAAAAACAAEAAABmADEAAAACAAEAAABmADIAAAACAAEAAABmADMAAAACAAEAAABmADQAAAACAAEAAABmADUAAAACAAEAAABmADYAAAACAAEAAABmADcAAAACAAEAAABmADgAAAACAAEAAABGAPL/AAACAAEAAABGAPP/AAACAAEAAABGAPT/AAACAAEAAABGAPX/AAACAAEAAABGAPb/AAACAAEAAABGAPf/AAACAAEAAABGAPj/AAACAAEAAABGAPn/AAACAAEAAABGAPr/AAACAAEAAABGAPv/AAACAAEAAABGAPz/AAACAAEAAABGAP3/AAACAAEAAABGAP7/AAACAAEAAABGAP//AAACAAEAAABHAPL/AAACAAEAAABHAPP/AAACAAEAAABHAPT/AAACAAEAAABHAPX/AAACAAEAAABHAPb/AAACAAEAAABHAPf/AAACAAEAAABHAPj/AAACAAEAAABHAPn/AAACAAEAAABHAPr/AAACAAEAAABHAPv/AAACAAEAAABHAPz/AAACAAEAAABHAP3/AAACAAEAAABHAP7/AAACAAEAAABHAP//AAACAAEAAABIAPL/AAACAAEAAABIAPP/AAACAAEAAABIAPT/AAACAAEAAABIAPX/AAACAAEAAABIAPb/AAACAAEAAABIAPf/AAACAAEAAABIAPj/AAACAAEAAABIAPn/AAACAAEAAABIAPr/AAACAAEAAABIAPv/AAACAAEAAABIAPz/AAACAAEAAABIAP3/AAACAAEAAABIAP7/AAACAAEAAABIAP//AAACAAEAAABIAAAAAAACAAEAAABIAAEAAAACAAEAAABIAAIAAAACAAEAAABIAAMAAAACAAEAAABIAAQAAAACAAEAAABIAAUAAAACAAEAAABIAAYAAAACAAEAAABIAAcAAAACAAEAAABIAAgAAAACAAEAAABIAAkAAAACAAEAAABIAAoAAAACAAEAAABIAAsAAAACAAEAAABIAAwAAAACAAEAAABIAA0AAAACAAEAAABIAA4AAAACAAEAAABIAA8AAAACAAEAAABIABAAAAACAAEAAABIABEAAAACAAEAAABIABIAAAACAAEAAABIABMAAAACAAEAAABIABQAAAACAAEAAABIABUAAAACAAEAAABIABYAAAACAAEAAABIABcAAAACAAEAAABIABgAAAACAAEAAABIABkAAAACAAEAAABIABoAAAACAAEAAABIABsAAAACAAEAAABIABwAAAACAAEAAABIAB0AAAACAAEAAABIAB4AAAACAAEAAABIAB8AAAACAAEAAABIACAAAAACAAEAAABIACEAAAACAAEAAABIACIAAAACAAEAAABIACMAAAACAAEAAABIACQAAAACAAEAAABIACUAAAACAAEAAABJAPL/AAACAAEAAABJAPP/AAACAAEAAABJAPT/AAACAAEAAABJAPX/AAACAAEAAABJAPb/AAACAAEAAABJAPf/AAACAAEAAABJAPj/AAACAAEAAABJAPn/AAACAAEAAABJAPr/AAACAAEAAABJAPv/AAACAAEAAABJAPz/AAACAAEAAABJAP3/AAACAAEAAABJAP7/AAACAAEAAABJAP//AAACAAEAAABJAAAAAAACAAEAAABJAAEAAAACAAEAAABJAAIAAAACAAEAAABJAAMAAAACAAEAAABJAAQAAAACAAEAAABJAAUAAAACAAEAAABJAAYAAAACAAEAAABJAAcAAAACAAEAAABJAAgAAAACAAEAAABJAAkAAAACAAEAAABJAAoAAAACAAEAAABJAAsAAAACAAEAAABJAAwAAAACAAEAAABJAA0AAAACAAEAAABJAA4AAAACAAEAAABJAA8AAAACAAEAAABJABAAAAACAAEAAABJABEAAAACAAEAAABJABIAAAACAAEAAABJABMAAAACAAEAAABJABQAAAACAAEAAABJABUAAAACAAEAAABJABYAAAACAAEAAABJABcAAAACAAEAAABJABgAAAACAAEAAABJABkAAAACAAEAAABJABoAAAACAAEAAABJABsAAAACAAEAAABJABwAAAACAAEAAABJAB0AAAACAAEAAABJAB4AAAACAAEAAABJAB8AAAACAAEAAABJACAAAAACAAEAAABJACEAAAACAAEAAABJACIAAAACAAEAAABJACMAAAACAAEAAABJACQAAAACAAEAAABJACUAAAACAAEAAABKAPL/AAACAAEAAABKAPP/AAACAAEAAABKAPT/AAACAAEAAABKAPX/AAACAAEAAABKAPb/AAACAAEAAABKAPf/AAACAAEAAABKAPj/AAACAAEAAABKAPn/AAACAAEAAABKAPr/AAACAAEAAABKAPv/AAACAAEAAABKAPz/AAACAAEAAABKAP3/AAACAAEAAABKAP7/AAACAAEAAABKAP//AAACAAEAAABKAAAAAAACAAEAAABKAAEAAAACAAEAAABKAAIAAAACAAEAAABKAAMAAAACAAEAAABKAAQAAAACAAEAAABKAAUAAAACAAEAAABKAAYAAAACAAEAAABKAAcAAAACAAEAAABKAAgAAAACAAEAAABKAAkAAAACAAEAAABKAAoAAAACAAEAAABKAAsAAAACAAEAAABKAAwAAAACAAEAAABKAA0AAAACAAEAAABKAA4AAAACAAEAAABKAA8AAAACAAEAAABKABAAAAACAAEAAABKABEAAAACAAEAAABKABIAAAACAAEAAABKABMAAAACAAEAAABKABQAAAACAAEAAABKABUAAAACAAEAAABKABYAAAACAAEAAABKABcAAAACAAEAAABKABgAAAACAAEAAABKABkAAAACAAEAAABKABoAAAACAAEAAABKABsAAAACAAEAAABKABwAAAACAAEAAABKAB0AAAACAAEAAABKAB4AAAACAAEAAABKAB8AAAACAAEAAABKACAAAAACAAEAAABKACEAAAACAAEAAABKACIAAAACAAEAAABKACMAAAACAAEAAABKACQAAAACAAEAAABKACUAAAACAAEAAABLAPL/AAACAAEAAABLAPP/AAACAAEAAABLAPT/AAACAAEAAABLAPX/AAACAAEAAABLAPb/AAACAAEAAABLAPf/AAACAAEAAABLAPj/AAACAAEAAABLAPn/AAACAAEAAABLAPr/AAACAAEAAABLAPv/AAACAAEAAABLAPz/AAACAAEAAABLAP3/AAACAAEAAABLAP7/AAACAAEAAABLAP//AAACAAEAAABLAAAAAAACAAEAAABLAAEAAAACAAEAAABLAAIAAAACAAEAAABLAAMAAAACAAEAAABLAAQAAAACAAEAAABLAAUAAAACAAEAAABLAAYAAAACAAEAAABLAAcAAAACAAEAAABLAAgAAAACAAEAAABLAAkAAAACAAEAAABLAAoAAAACAAEAAABLAAsAAAACAAEAAABLAAwAAAACAAEAAABLAA0AAAACAAEAAABLAA4AAAACAAEAAABLAA8AAAACAAEAAABLABAAAAACAAEAAABLABEAAAACAAEAAABLABIAAAACAAEAAABLABMAAAACAAEAAABLABQAAAACAAEAAABLABUAAAACAAEAAABLABYAAAACAAEAAABLABcAAAACAAEAAABLABgAAAACAAEAAABLABkAAAACAAEAAABLABoAAAACAAEAAABLABsAAAACAAEAAABLABwAAAACAAEAAABLAB0AAAACAAEAAABLAB4AAAACAAEAAABLAB8AAAACAAEAAABLACAAAAACAAEAAABLACEAAAACAAEAAABLACIAAAACAAEAAABLACMAAAACAAEAAABLACQAAAACAAEAAABLACUAAAACAAEAAABMAPL/AAACAAEAAABMAPP/AAACAAEAAABMAPT/AAACAAEAAABMAPX/AAACAAEAAABMAPb/AAACAAEAAABMAPf/AAACAAEAAABMAPj/AAACAAEAAABMAPn/AAACAAEAAABMAPr/AAACAAEAAABMAPv/AAACAAEAAABMAPz/AAACAAEAAABMAP3/AAACAAEAAABMAP7/AAACAAEAAABMAP//AAACAAEAAABMAAAAAAACAAEAAABMAAEAAAACAAEAAABMAAIAAAACAAEAAABMAAMAAAACAAEAAABMAAQAAAACAAEAAABMAAUAAAACAAEAAABMAAYAAAACAAEAAABMAAcAAAACAAEAAABMAAgAAAACAAEAAABMAAkAAAACAAEAAABMAAoAAAACAAEAAABMAAsAAAACAAEAAABMAAwAAAACAAEAAABMAA0AAAACAAEAAABMAA4AAAACAAEAAABMAA8AAAACAAEAAABMABAAAAACAAEAAABMABEAAAACAAEAAABMABIAAAACAAEAAABMABMAAAACAAEAAABMABQAAAACAAEAAABMABUAAAACAAEAAABMABYAAAACAAEAAABMABcAAAACAAEAAABMABgAAAACAAEAAABMABkAAAACAAEAAABMABoAAAACAAEAAABMABsAAAACAAEAAABMABwAAAACAAEAAABMAB0AAAACAAEAAABMAB4AAAACAAEAAABMAB8AAAACAAEAAABMACAAAAACAAEAAABMACEAAAACAAEAAABMACIAAAACAAEAAABMACMAAAACAAEAAABMACQAAAACAAEAAABMACUAAAACAAEAAABNAPL/AAACAAEAAABNAPP/AAACAAEAAABNAPT/AAACAAEAAABNAPX/AAACAAEAAABNAPb/AAACAAEAAABNAPf/AAACAAEAAABNAPj/AAACAAEAAABNAPn/AAACAAEAAABNAPr/AAACAAEAAABNAPv/AAACAAEAAABNAPz/AAACAAEAAABNAP3/AAACAAEAAABNAP7/AAACAAEAAABNAP//AAACAAEAAABNAAAAAAACAAEAAABNAAEAAAACAAEAAABNAAIAAAACAAEAAABNAAMAAAACAAEAAABNAAQAAAACAAEAAABNAAUAAAACAAEAAABNAAYAAAACAAEAAABNAAcAAAACAAEAAABNAAgAAAACAAEAAABNAAkAAAACAAEAAABNAAoAAAACAAEAAABNAAsAAAACAAEAAABNAAwAAAACAAEAAABNAA0AAAACAAEAAABNAA4AAAACAAEAAABNAA8AAAACAAEAAABNABAAAAACAAEAAABNABEAAAACAAEAAABNABIAAAACAAEAAABNABMAAAACAAEAAABNABQAAAACAAEAAABNABUAAAACAAEAAABNABYAAAACAAEAAABNABcAAAACAAEAAABNABgAAAACAAEAAABNABkAAAACAAEAAABNABoAAAACAAEAAABNABsAAAACAAEAAABNABwAAAACAAEAAABNAB0AAAACAAEAAABNAB4AAAACAAEAAABNAB8AAAACAAEAAABNACAAAAACAAEAAABNACEAAAACAAEAAABNACIAAAACAAEAAABNACMAAAACAAEAAABNACQAAAACAAEAAABNACUAAAACAAEAAABOAPL/AAACAAEAAABOAPP/AAACAAEAAABOAPT/AAACAAEAAABOAPX/AAACAAEAAABOAPb/AAACAAEAAABOAPf/AAACAAEAAABOAPj/AAACAAEAAABOAPn/AAACAAEAAABOAPr/AAACAAEAAABOAPv/AAACAAEAAABOAPz/AAACAAEAAABOAP3/AAACAAEAAABOAP7/AAACAAEAAABOAP//AAACAAEAAABOAAAAAAACAAEAAABOAAEAAAACAAEAAABOAAIAAAACAAEAAABOAAMAAAACAAEAAABOAAQAAAACAAEAAABOAAUAAAACAAEAAABOAAYAAAACAAEAAABOAAcAAAACAAEAAABOAAgAAAACAAEAAABOAAkAAAACAAEAAABOAAoAAAACAAEAAABOAAsAAAACAAEAAABOAAwAAAACAAEAAABOAA0AAAACAAEAAABOAA4AAAACAAEAAABOAA8AAAACAAEAAABOABAAAAACAAEAAABOABEAAAACAAEAAABOABIAAAACAAEAAABOABMAAAACAAEAAABOABQAAAACAAEAAABOABUAAAACAAEAAABOABYAAAACAAEAAABOABcAAAACAAEAAABOABgAAAACAAEAAABOABkAAAACAAEAAABOABoAAAACAAEAAABOABsAAAACAAEAAABOABwAAAACAAEAAABOAB0AAAACAAEAAABOAB4AAAACAAEAAABOAB8AAAACAAEAAABOACAAAAACAAEAAABOACEAAAACAAEAAABOACIAAAACAAEAAABOACMAAAACAAEAAABOACQAAAACAAEAAABOACUAAAACAAEAAABPAPL/AAACAAEAAABPAPP/AAACAAEAAABPAPT/AAACAAEAAABPAPX/AAACAAEAAABPAPb/AAACAAEAAABPAPf/AAACAAEAAABPAPj/AAACAAEAAABPAPn/AAACAAEAAABPAPr/AAACAAEAAABPAPv/AAACAAEAAABPAPz/AAACAAEAAABPAP3/AAACAAEAAABPAP7/AAACAAEAAABPAP//AAACAAEAAABPAAAAAAACAAEAAABPAAEAAAACAAEAAABPAAIAAAACAAEAAABPAAMAAAACAAEAAABPAAQAAAACAAEAAABPAAUAAAACAAEAAABPAAYAAAACAAEAAABPAAcAAAACAAEAAABPAAgAAAACAAEAAABPAAkAAAACAAEAAABPAAoAAAACAAEAAABPAAsAAAACAAEAAABPAAwAAAACAAEAAABPAA0AAAACAAEAAABPAA4AAAACAAEAAABPAA8AAAACAAEAAABPABAAAAACAAEAAABPABEAAAACAAEAAABPABIAAAACAAEAAABPABMAAAACAAEAAABPABQAAAACAAEAAABPABUAAAACAAEAAABPABYAAAACAAEAAABPABcAAAACAAEAAABPABgAAAACAAEAAABPABkAAAACAAEAAABPABoAAAACAAEAAABPABsAAAACAAEAAABPABwAAAACAAEAAABPAB0AAAACAAEAAABPAB4AAAACAAEAAABPAB8AAAACAAEAAABPACAAAAACAAEAAABPACEAAAACAAEAAABPACIAAAACAAEAAABPACMAAAACAAEAAABPACQAAAACAAEAAABPACUAAAACAAEAAABQAPL/AAACAAEAAABQAPP/AAACAAEAAABQAPT/AAACAAEAAABQAPX/AAACAAEAAABQAPb/AAACAAEAAABQAPf/AAACAAEAAABQAPj/AAACAAEAAABQAPn/AAACAAEAAABQAPr/AAACAAEAAABQAPv/AAACAAEAAABQAPz/AAACAAEAAABQAP3/AAACAAEAAABQAP7/AAACAAEAAABQAP//AAACAAEAAABQAAAAAAACAAEAAABQAAEAAAACAAEAAABQAAIAAAACAAEAAABQAAMAAAACAAEAAABQAAQAAAACAAEAAABQAAUAAAACAAEAAABQAAYAAAACAAEAAABQAAcAAAACAAEAAABQAAgAAAACAAEAAABQAAkAAAACAAEAAABQAAoAAAACAAEAAABQAAsAAAACAAEAAABQAAwAAAACAAEAAABQAA0AAAACAAEAAABQAA4AAAACAAEAAABQAA8AAAACAAEAAABQABAAAAACAAEAAABQABEAAAACAAEAAABQABIAAAACAAEAAABQABMAAAACAAEAAABQABQAAAACAAEAAABQABUAAAACAAEAAABQABYAAAACAAEAAABQABcAAAACAAEAAABQABgAAAACAAEAAABQABkAAAACAAEAAABQABoAAAACAAEAAABQABsAAAACAAEAAABQABwAAAACAAEAAABQAB0AAAACAAEAAABQAB4AAAACAAEAAABQAB8AAAACAAEAAABQACAAAAACAAEAAABQACEAAAACAAEAAABQACIAAAACAAEAAABQACMAAAACAAEAAABQACQAAAACAAEAAABQACUAAAACAAEAAABRAPL/AAACAAEAAABRAPP/AAACAAEAAABRAPT/AAACAAEAAABRAPX/AAACAAEAAABRAPb/AAACAAEAAABRAPf/AAACAAEAAABRAPj/AAACAAEAAABRAPn/AAACAAEAAABRAPr/AAACAAEAAABRAPv/AAACAAEAAABRAPz/AAACAAEAAABRAP3/AAACAAEAAABRAP7/AAACAAEAAABRAP//AAACAAEAAABRAAAAAAACAAEAAABRAAEAAAACAAEAAABRAAIAAAACAAEAAABRAAMAAAACAAEAAABRAAQAAAACAAEAAABRAAUAAAACAAEAAABRAAYAAAACAAEAAABRAAcAAAACAAEAAABRAAgAAAACAAEAAABRAAkAAAACAAEAAABRAAoAAAACAAEAAABRAAsAAAACAAEAAABRAAwAAAACAAEAAABRAA0AAAACAAEAAABRAA4AAAACAAEAAABRAA8AAAACAAEAAABRABAAAAACAAEAAABRABEAAAACAAEAAABRABIAAAACAAEAAABRABMAAAACAAEAAABRABQAAAACAAEAAABRABUAAAACAAEAAABRABYAAAACAAEAAABRABcAAAACAAEAAABRABgAAAACAAEAAABRABkAAAACAAEAAABRABoAAAACAAEAAABRABsAAAACAAEAAABRABwAAAACAAEAAABRAB0AAAACAAEAAABRAB4AAAACAAEAAABRAB8AAAACAAEAAABRACAAAAACAAEAAABRACEAAAACAAEAAABRACIAAAACAAEAAABRACMAAAACAAEAAABRACQAAAACAAEAAABRACUAAAACAAEAAABSAPL/AAACAAEAAABSAPP/AAACAAEAAABSAPT/AAACAAEAAABSAPX/AAACAAEAAABSAPb/AAACAAEAAABSAPf/AAACAAEAAABSAPj/AAACAAEAAABSAPn/AAACAAEAAABSAPr/AAACAAEAAABSAPv/AAACAAEAAABSAPz/AAACAAEAAABSAP3/AAACAAEAAABSAP7/AAACAAEAAABSAP//AAACAAEAAABSAAAAAAACAAEAAABSAAEAAAACAAEAAABSAAIAAAACAAEAAABSAAMAAAACAAEAAABSAAQAAAACAAEAAABSAAUAAAACAAEAAABSAAYAAAACAAEAAABSAAcAAAACAAEAAABSAAgAAAACAAEAAABSAAkAAAACAAEAAABSAAoAAAACAAEAAABSAAsAAAACAAEAAABSAAwAAAACAAEAAABSAA0AAAACAAEAAABSAA4AAAACAAEAAABSAA8AAAACAAEAAABSABAAAAACAAEAAABSABEAAAACAAEAAABSABIAAAACAAEAAABSABMAAAACAAEAAABSABQAAAACAAEAAABSABUAAAACAAEAAABSABYAAAACAAEAAABSABcAAAACAAEAAABSABgAAAACAAEAAABSABkAAAACAAEAAABSABoAAAACAAEAAABSABsAAAACAAEAAABSABwAAAACAAEAAABSAB0AAAACAAEAAABSAB4AAAACAAEAAABSAB8AAAACAAEAAABSACAAAAACAAEAAABSACEAAAACAAEAAABSACIAAAACAAEAAABSACMAAAACAAEAAABSACQAAAACAAEAAABSACUAAAACAAEAAABTAPL/AAACAAEAAABTAPP/AAACAAEAAABTAPT/AAACAAEAAABTAPX/AAACAAEAAABTAPb/AAACAAEAAABTAPf/AAACAAEAAABTAPj/AAACAAEAAABTAPn/AAACAAEAAABTAPr/AAACAAEAAABTAPv/AAACAAEAAABTAPz/AAACAAEAAABTAP3/AAACAAEAAABTAP7/AAACAAEAAABTAP//AAACAAEAAABTAAAAAAACAAEAAABTAAEAAAACAAEAAABTAAIAAAACAAEAAABTAAMAAAACAAEAAABTAAQAAAACAAEAAABTAAUAAAACAAEAAABTAAYAAAACAAEAAABTAAcAAAACAAEAAABTAAgAAAACAAEAAABTAAkAAAACAAEAAABTAAoAAAACAAEAAABTAAsAAAACAAEAAABTAAwAAAACAAEAAABTAA0AAAACAAEAAABTAA4AAAACAAEAAABTAA8AAAACAAEAAABTABAAAAACAAEAAABTABEAAAACAAEAAABTABIAAAACAAEAAABTABMAAAACAAEAAABTABQAAAACAAEAAABTABUAAAACAAEAAABTABYAAAACAAEAAABTABcAAAACAAEAAABTABgAAAACAAEAAABTABkAAAACAAEAAABTABoAAAACAAEAAABTABsAAAACAAEAAABTABwAAAACAAEAAABTAB0AAAACAAEAAABTAB4AAAACAAEAAABTAB8AAAACAAEAAABTACAAAAACAAEAAABTACEAAAACAAEAAABTACIAAAACAAEAAABTACMAAAACAAEAAABTACQAAAACAAEAAABTACUAAAACAAEAAABUAPL/AAACAAEAAABUAPP/AAACAAEAAABUAPT/AAACAAEAAABUAPX/AAACAAEAAABUAPb/AAACAAEAAABUAPf/AAACAAEAAABUAPj/AAACAAEAAABUAPn/AAACAAEAAABUAPr/AAACAAEAAABUAPv/AAACAAEAAABUAPz/AAACAAEAAABUAP3/AAACAAEAAABUAP7/AAACAAEAAABUAP//AAACAAEAAABUAAAAAAACAAEAAABUAAEAAAACAAEAAABUAAIAAAACAAEAAABUAAMAAAACAAEAAABUAAQAAAACAAEAAABUAAUAAAACAAEAAABUAAYAAAACAAEAAABUAAcAAAACAAEAAABUAAgAAAACAAEAAABUAAkAAAACAAEAAABUAAoAAAACAAEAAABUAAsAAAACAAEAAABUAAwAAAACAAEAAABUAA0AAAACAAEAAABUAA4AAAACAAEAAABUAA8AAAACAAEAAABUABAAAAACAAEAAABUABEAAAACAAEAAABUABIAAAACAAEAAABUABMAAAACAAEAAABUABQAAAACAAEAAABUABUAAAACAAEAAABUABYAAAACAAEAAABUABcAAAACAAEAAABUABgAAAACAAEAAABUABkAAAACAAEAAABUABoAAAACAAEAAABUABsAAAACAAEAAABUABwAAAACAAEAAABUAB0AAAACAAEAAABUAB4AAAACAAEAAABUAB8AAAACAAEAAABUACAAAAACAAEAAABUACEAAAACAAEAAABUACIAAAACAAEAAABUACMAAAACAAEAAABUACQAAAACAAEAAABUACUAAAACAAEAAABVAPL/AAACAAEAAABVAPP/AAACAAEAAABVAPT/AAACAAEAAABVAPX/AAACAAEAAABVAPb/AAACAAEAAABVAPf/AAACAAEAAABVAPj/AAACAAEAAABVAPn/AAACAAEAAABVAPr/AAACAAEAAABVAPv/AAACAAEAAABVAPz/AAACAAEAAABVAP3/AAACAAEAAABVAP7/AAACAAEAAABVAP//AAACAAEAAABVAAAAAAACAAEAAABVAAEAAAACAAEAAABVAAIAAAACAAEAAABVAAMAAAACAAEAAABVAAQAAAACAAEAAABVAAUAAAACAAEAAABVAAYAAAACAAEAAABVAAcAAAACAAEAAABVAAgAAAACAAEAAABVAAkAAAACAAEAAABVAAoAAAACAAEAAABVAAsAAAACAAEAAABVAAwAAAACAAEAAABVAA0AAAACAAEAAABVAA4AAAACAAEAAABVAA8AAAACAAEAAABVABAAAAACAAEAAABVABEAAAACAAEAAABVABIAAAACAAEAAABVABMAAAACAAEAAABVABQAAAACAAEAAABVABUAAAACAAEAAABVABYAAAACAAEAAABVABcAAAACAAEAAABVABgAAAACAAEAAABVABkAAAACAAEAAABVABoAAAACAAEAAABVABsAAAACAAEAAABVABwAAAACAAEAAABVAB0AAAACAAEAAABVAB4AAAACAAEAAABVAB8AAAACAAEAAABVACAAAAACAAEAAABVACEAAAACAAEAAABVACIAAAACAAEAAABVACMAAAACAAEAAABVACQAAAACAAEAAABVACUAAAACAAEAAABWAPL/AAACAAEAAABWAPP/AAACAAEAAABWAPT/AAACAAEAAABWAPX/AAACAAEAAABWAPb/AAACAAEAAABWAPf/AAACAAEAAABWAPj/AAACAAEAAABWAPn/AAACAAEAAABWAPr/AAACAAEAAABWAPv/AAACAAEAAABWAPz/AAACAAEAAABWAP3/AAACAAEAAABWAP7/AAACAAEAAABWAP//AAACAAEAAABWAAAAAAACAAEAAABWAAEAAAACAAEAAABWAAIAAAACAAEAAABWAAMAAAACAAEAAABWAAQAAAACAAEAAABWAAUAAAACAAEAAABWAAYAAAACAAEAAABWAAcAAAACAAEAAABWAAgAAAACAAEAAABWAAkAAAACAAEAAABWAAoAAAACAAEAAABWAAsAAAACAAEAAABWAAwAAAACAAEAAABWAA0AAAACAAEAAABWAA4AAAACAAEAAABWAA8AAAACAAEAAABWABAAAAACAAEAAABWABEAAAACAAEAAABWABIAAAACAAEAAABWABMAAAACAAEAAABWABQAAAACAAEAAABWABUAAAACAAEAAABWABYAAAACAAEAAABWABcAAAACAAEAAABWABgAAAACAAEAAABWABkAAAACAAEAAABWABoAAAACAAEAAABWABsAAAACAAEAAABWABwAAAACAAEAAABWAB0AAAACAAEAAABWAB4AAAACAAEAAABWAB8AAAACAAEAAABWACAAAAACAAEAAABWACEAAAACAAEAAABWACIAAAACAAEAAABWACMAAAACAAEAAABWACQAAAACAAEAAABWACUAAAACAAEAAABXAPL/AAACAAEAAABXAPP/AAACAAEAAABXAPT/AAACAAEAAABXAPX/AAACAAEAAABXAPb/AAACAAEAAABXAPf/AAACAAEAAABXAPj/AAACAAEAAABXAPn/AAACAAEAAABXAPr/AAACAAEAAABXAPv/AAACAAEAAABXAPz/AAACAAEAAABXAP3/AAACAAEAAABXAP7/AAACAAEAAABXAP//AAACAAEAAABXAAAAAAACAAEAAABXAAEAAAACAAEAAABXAAIAAAACAAEAAABXAAMAAAACAAEAAABXAAQAAAACAAEAAABXAAUAAAACAAEAAABXAAYAAAACAAEAAABXAAcAAAACAAEAAABXAAgAAAACAAEAAABXAAkAAAACAAEAAABXAAoAAAACAAEAAABXAAsAAAACAAEAAABXAAwAAAACAAEAAABXAA0AAAACAAEAAABXAA4AAAACAAEAAABXAA8AAAACAAEAAABXABAAAAACAAEAAABXABEAAAACAAEAAABXABIAAAACAAEAAABXABMAAAACAAEAAABXABQAAAACAAEAAABXABUAAAACAAEAAABXABYAAAACAAEAAABXABcAAAACAAEAAABXABgAAAACAAEAAABXABkAAAACAAEAAABXABoAAAACAAEAAABXABsAAAACAAEAAABXABwAAAACAAEAAABXAB0AAAACAAEAAABXAB4AAAACAAEAAABXAB8AAAACAAEAAABXACAAAAACAAEAAABXACEAAAACAAEAAABXACIAAAACAAEAAABXACMAAAACAAEAAABXACQAAAACAAEAAABXACUAAAACAAEAAABYAPL/AAACAAEAAABYAPP/AAACAAEAAABYAPT/AAACAAEAAABYAPX/AAACAAEAAABYAPb/AAACAAEAAABYAPf/AAACAAEAAABYAPj/AAACAAEAAABYAPn/AAACAAEAAABYAPr/AAACAAEAAABYAPv/AAACAAEAAABYAPz/AAACAAEAAABYAP3/AAACAAEAAABYAP7/AAACAAEAAABYAP//AAACAAEAAABYAAAAAAACAAEAAABYAAEAAAACAAEAAABYAAIAAAACAAEAAABYAAMAAAACAAEAAABYAAQAAAACAAEAAABYAAUAAAACAAEAAABYAAYAAAACAAEAAABYAAcAAAACAAEAAABYAAgAAAACAAEAAABYAAkAAAACAAEAAABYAAoAAAACAAEAAABYAAsAAAACAAEAAABYAAwAAAACAAEAAABYAA0AAAACAAEAAABYAA4AAAACAAEAAABYAA8AAAACAAEAAABYABAAAAACAAEAAABYABEAAAACAAEAAABYABIAAAACAAEAAABYABMAAAACAAEAAABYABQAAAACAAEAAABYABUAAAACAAEAAABYABYAAAACAAEAAABYABcAAAACAAEAAABYABgAAAACAAEAAABYABkAAAACAAEAAABYABoAAAACAAEAAABYABsAAAACAAEAAABYABwAAAACAAEAAABYAB0AAAACAAEAAABYAB4AAAACAAEAAABYAB8AAAACAAEAAABYACAAAAACAAEAAABYACEAAAACAAEAAABYACIAAAACAAEAAABYACMAAAACAAEAAABYACQAAAACAAEAAABYACUAAAACAAEAAABZAPL/AAACAAEAAABZAPP/AAACAAEAAABZAPT/AAACAAEAAABZAPX/AAACAAEAAABZAPb/AAACAAEAAABZAPf/AAACAAEAAABZAPj/AAACAAEAAABZAPn/AAACAAEAAABZAPr/AAACAAEAAABZAPv/AAACAAEAAABZAPz/AAACAAEAAABZAP3/AAACAAEAAABZAP7/AAACAAEAAABZAP//AAACAAEAAABZAAAAAAACAAEAAABZAAEAAAACAAEAAABZAAIAAAACAAEAAABZAAMAAAACAAEAAABZAAQAAAACAAEAAABZAAUAAAACAAEAAABZAAYAAAACAAEAAABZAAcAAAACAAEAAABZAAgAAAACAAEAAABZAAkAAAACAAEAAABZAAoAAAACAAEAAABZAAsAAAACAAEAAABZAAwAAAACAAEAAABZAA0AAAACAAEAAABZAA4AAAACAAEAAABZAA8AAAACAAEAAABZABAAAAACAAEAAABZABEAAAACAAEAAABZABIAAAACAAEAAABZABMAAAACAAEAAABZABQAAAACAAEAAABZABUAAAACAAEAAABZABYAAAACAAEAAABZABcAAAACAAEAAABZABgAAAACAAEAAABZABkAAAACAAEAAABZABoAAAACAAEAAABZABsAAAACAAEAAABZABwAAAACAAEAAABZAB0AAAACAAEAAABZAB4AAAACAAEAAABZAB8AAAACAAEAAABZACAAAAACAAEAAABZACEAAAACAAEAAABZACIAAAACAAEAAABZACMAAAACAAEAAABZACQAAAACAAEAAABZACUAAAACAAEAAABaAPL/AAACAAEAAABaAPP/AAACAAEAAABaAPT/AAACAAEAAABaAPX/AAACAAEAAABaAPb/AAACAAEAAABaAPf/AAACAAEAAABaAPj/AAACAAEAAABaAPn/AAACAAEAAABaAPr/AAACAAEAAABaAPv/AAACAAEAAABaAPz/AAACAAEAAABaAP3/AAACAAEAAABaAP7/AAACAAEAAABaAP//AAACAAEAAABaAAAAAAACAAEAAABaAAEAAAACAAEAAABaAAIAAAACAAEAAABaAAMAAAACAAEAAABaAAQAAAACAAEAAABaAAUAAAACAAEAAABaAAYAAAACAAEAAABaAAcAAAACAAEAAABaAAgAAAACAAEAAABaAAkAAAACAAEAAABaAAoAAAACAAEAAABaAAsAAAACAAEAAABaAAwAAAACAAEAAABaAA0AAAACAAEAAABaAA4AAAACAAEAAABaAA8AAAACAAEAAABaABAAAAACAAEAAABaABEAAAACAAEAAABaABIAAAACAAEAAABaABMAAAACAAEAAABaABQAAAACAAEAAABaABUAAAACAAEAAABaABYAAAACAAEAAABaABcAAAACAAEAAABaABgAAAACAAEAAABaABkAAAACAAEAAABaABoAAAACAAEAAABaABsAAAACAAEAAABaABwAAAACAAEAAABaAB0AAAACAAEAAABaAB4AAAACAAEAAABaAB8AAAACAAEAAABaACAAAAACAAEAAABaACEAAAACAAEAAABaACIAAAACAAEAAABaACMAAAACAAEAAABaACQAAAACAAEAAABaACUAAAACAAEAAABbAPL/AAACAAEAAABbAPP/AAACAAEAAABbAPT/AAACAAEAAABbAPX/AAACAAEAAABbAPb/AAACAAEAAABbAPf/AAACAAEAAABbAPj/AAACAAEAAABbAPn/AAACAAEAAABbAPr/AAACAAEAAABbAPv/AAACAAEAAABbAPz/AAACAAEAAABbAP3/AAACAAEAAABbAP7/AAACAAEAAABbAP//AAACAAEAAABbAAAAAAACAAEAAABbAAEAAAACAAEAAABbAAIAAAACAAEAAABbAAMAAAACAAEAAABbAAQAAAACAAEAAABbAAUAAAACAAEAAABbAAYAAAACAAEAAABbAAcAAAACAAEAAABbAAgAAAACAAEAAABbAAkAAAACAAEAAABbAAoAAAACAAEAAABbAAsAAAACAAEAAABbAAwAAAACAAEAAABbAA0AAAACAAEAAABbAA4AAAACAAEAAABbAA8AAAACAAEAAABbABAAAAACAAEAAABbABEAAAACAAEAAABbABIAAAACAAEAAABbABMAAAACAAEAAABbABQAAAACAAEAAABbABUAAAACAAEAAABbABYAAAACAAEAAABbABcAAAACAAEAAABbABgAAAACAAEAAABbABkAAAACAAEAAABbABoAAAACAAEAAABbABsAAAACAAEAAABbABwAAAACAAEAAABbAB0AAAACAAEAAABbAB4AAAACAAEAAABbAB8AAAACAAEAAABbACAAAAACAAEAAABbACEAAAACAAEAAABbACIAAAACAAEAAABbACMAAAACAAEAAABbACQAAAACAAEAAABbACUAAAACAAEAAABcAPL/AAACAAEAAABcAPP/AAACAAEAAABcAPT/AAACAAEAAABcAPX/AAACAAEAAABcAPb/AAACAAEAAABcAPf/AAACAAEAAABcAPj/AAACAAEAAABcAPn/AAACAAEAAABcAPr/AAACAAEAAABcAPv/AAACAAEAAABcAPz/AAACAAEAAABcAP3/AAACAAEAAABcAP7/AAACAAEAAABcAP//AAACAAEAAABcAAAAAAACAAEAAABcAAEAAAACAAEAAABcAAIAAAACAAEAAABcAAMAAAACAAEAAABcAAQAAAACAAEAAABcAAUAAAACAAEAAABcAAYAAAACAAEAAABcAAcAAAACAAEAAABcAAgAAAACAAEAAABcAAkAAAACAAEAAABcAAoAAAACAAEAAABcAAsAAAACAAEAAABcAAwAAAACAAEAAABcAA0AAAACAAEAAABcAA4AAAACAAEAAABcAA8AAAACAAEAAABcABAAAAACAAEAAABcABEAAAACAAEAAABcABIAAAACAAEAAABcABMAAAACAAEAAABcABQAAAACAAEAAABcABUAAAACAAEAAABcABYAAAACAAEAAABcABcAAAACAAEAAABcABgAAAACAAEAAABcABkAAAACAAEAAABcABoAAAACAAEAAABcABsAAAACAAEAAABcABwAAAACAAEAAABcAB0AAAACAAEAAABcAB4AAAACAAEAAABcAB8AAAACAAEAAABcACAAAAACAAEAAABcACEAAAACAAEAAABcACIAAAACAAEAAABcACMAAAACAAEAAABcACQAAAACAAEAAABcACUAAAACAAEAAABdAPL/AAACAAEAAABdAPP/AAACAAEAAABdAPT/AAACAAEAAABdAPX/AAACAAEAAABdAPb/AAACAAEAAABdAPf/AAACAAEAAABdAPj/AAACAAEAAABdAPn/AAACAAEAAABdAPr/AAACAAEAAABdAPv/AAACAAEAAABdAPz/AAACAAEAAABdAP3/AAACAAEAAABdAP7/AAACAAEAAABdAP//AAACAAEAAABdAAAAAAACAAEAAABdAAEAAAACAAEAAABdAAIAAAACAAEAAABdAAMAAAACAAEAAABdAAQAAAACAAEAAABdAAUAAAACAAEAAABdAAYAAAACAAEAAABdAAcAAAACAAEAAABdAAgAAAACAAEAAABdAAkAAAACAAEAAABdAAoAAAACAAEAAABdAAsAAAACAAEAAABdAAwAAAACAAEAAABdAA0AAAACAAEAAABdAA4AAAACAAEAAABdAA8AAAACAAEAAABdABAAAAACAAEAAABdABEAAAACAAEAAABdABIAAAACAAEAAABdABMAAAACAAEAAABdABQAAAACAAEAAABdABUAAAACAAEAAABdABYAAAACAAEAAABdABcAAAACAAEAAABdABgAAAACAAEAAABdABkAAAACAAEAAABdABoAAAACAAEAAABdABsAAAACAAEAAABdABwAAAACAAEAAABdAB0AAAACAAEAAABdAB4AAAACAAEAAABdAB8AAAACAAEAAABdACAAAAACAAEAAABdACEAAAACAAEAAABdACIAAAACAAEAAABdACMAAAACAAEAAABdACQAAAACAAEAAABdACUAAAACAAEAAABeAPL/AAACAAEAAABeAPP/AAACAAEAAABeAPT/AAACAAEAAABeAPX/AAACAAEAAABeAPb/AAACAAEAAABeAPf/AAACAAEAAABeAPj/AAACAAEAAABeAPn/AAACAAEAAABeAPr/AAACAAEAAABeAPv/AAACAAEAAABeAPz/AAACAAEAAABeAP3/AAACAAEAAABeAP7/AAACAAEAAABeAP//AAACAAEAAABeAAAAAAACAAEAAABeAAEAAAACAAEAAABeAAIAAAACAAEAAABeAAMAAAACAAEAAABeAAQAAAACAAEAAABeAAUAAAACAAEAAABeAAYAAAACAAEAAABeAAcAAAACAAEAAABeAAgAAAACAAEAAABeAAkAAAACAAEAAABeAAoAAAACAAEAAABeAAsAAAACAAEAAABeAAwAAAACAAEAAABeAA0AAAACAAEAAABeAA4AAAACAAEAAABeAA8AAAACAAEAAABeABAAAAACAAEAAABeABEAAAACAAEAAABeABIAAAACAAEAAABeABMAAAACAAEAAABeABQAAAACAAEAAABeABUAAAACAAEAAABeABYAAAACAAEAAABeABcAAAACAAEAAABeABgAAAACAAEAAABeABkAAAACAAEAAABeABoAAAACAAEAAABeABsAAAACAAEAAABeABwAAAACAAEAAABeAB0AAAACAAEAAABeAB4AAAACAAEAAABeAB8AAAACAAEAAABeACAAAAACAAEAAABeACEAAAACAAEAAABeACIAAAACAAEAAABeACMAAAACAAEAAABeACQAAAACAAEAAABeACUAAAACAAEAAABfAPL/AAACAAEAAABfAPP/AAACAAEAAABfAPT/AAACAAEAAABfAPX/AAACAAEAAABfAPb/AAACAAEAAABfAPf/AAACAAEAAABfAPj/AAACAAEAAABfAPn/AAACAAEAAABfAPr/AAACAAEAAABfAPv/AAACAAEAAABfAPz/AAACAAEAAABfAP3/AAACAAEAAABfAP7/AAACAAEAAABfAP//AAACAAEAAABfAAAAAAACAAEAAABfAAEAAAACAAEAAABfAAIAAAACAAEAAABfAAMAAAACAAEAAABfAAQAAAACAAEAAABfAAUAAAACAAEAAABfAAYAAAACAAEAAABfAAcAAAACAAEAAABfAAgAAAACAAEAAABfAAkAAAACAAEAAABfAAoAAAACAAEAAABfAAsAAAACAAEAAABfAAwAAAACAAEAAABfAA0AAAACAAEAAABfAA4AAAACAAEAAABfAA8AAAACAAEAAABfABAAAAACAAEAAABfABEAAAACAAEAAABfABIAAAACAAEAAABfABMAAAACAAEAAABfABQAAAACAAEAAABfABUAAAACAAEAAABfABYAAAACAAEAAABfABcAAAACAAEAAABfABgAAAACAAEAAABfABkAAAACAAEAAABfABoAAAACAAEAAABfABsAAAACAAEAAABfABwAAAACAAEAAABfAB0AAAACAAEAAABfAB4AAAACAAEAAABfAB8AAAACAAEAAABfACAAAAACAAEAAABfACEAAAACAAEAAABfACIAAAACAAEAAABfACMAAAACAAEAAABfACQAAAACAAEAAABfACUAAAACAAEAAABgAPL/AAACAAEAAABgAPP/AAACAAEAAABgAPT/AAACAAEAAABgAPX/AAACAAEAAABgAPb/AAACAAEAAABgAPf/AAACAAEAAABgAPj/AAACAAEAAABgAPn/AAACAAEAAABgAPr/AAACAAEAAABgAPv/AAACAAEAAABgAPz/AAACAAEAAABgAP3/AAACAAEAAABgAP7/AAACAAEAAABgAP//AAACAAEAAABgAAAAAAACAAEAAABgAAEAAAACAAEAAABgAAIAAAACAAEAAABgAAMAAAACAAEAAABgAAQAAAACAAEAAABgAAUAAAACAAEAAABgAAYAAAACAAEAAABgAAcAAAACAAEAAABgAAgAAAACAAEAAABgAAkAAAACAAEAAABgAAoAAAACAAEAAABgAAsAAAACAAEAAABgAAwAAAACAAEAAABgAA0AAAACAAEAAABgAA4AAAACAAEAAABgAA8AAAACAAEAAABgABAAAAACAAEAAABgABEAAAACAAEAAABgABIAAAACAAEAAABgABMAAAACAAEAAABgABQAAAACAAEAAABgABUAAAACAAEAAABgABYAAAACAAEAAABgABcAAAACAAEAAABgABgAAAACAAEAAABgABkAAAACAAEAAABgABoAAAACAAEAAABgABsAAAACAAEAAABgABwAAAACAAEAAABgAB0AAAACAAEAAABgAB4AAAACAAEAAABgAB8AAAACAAEAAABgACAAAAACAAEAAABgACEAAAACAAEAAABgACIAAAACAAEAAABgACMAAAACAAEAAABgACQAAAACAAEAAABgACUAAAACAAEAAABhAPL/AAACAAEAAABhAPP/AAACAAEAAABhAPT/AAACAAEAAABhAPX/AAACAAEAAABhAPb/AAACAAEAAABhAPf/AAACAAEAAABhAPj/AAACAAEAAABhAPn/AAACAAEAAABhAPr/AAACAAEAAABhAPv/AAACAAEAAABhAPz/AAACAAEAAABhAP3/AAACAAEAAABhAP7/AAACAAEAAABhAP//AAACAAEAAABhAAAAAAACAAEAAABhAAEAAAACAAEAAABhAAIAAAACAAEAAABhAAMAAAACAAEAAABhAAQAAAACAAEAAABhAAUAAAACAAEAAABhAAYAAAACAAEAAABhAAcAAAACAAEAAABhAAgAAAACAAEAAABhAAkAAAACAAEAAABhAAoAAAACAAEAAABhAAsAAAACAAEAAABhAAwAAAACAAEAAABhAA0AAAACAAEAAABhAA4AAAACAAEAAABhAA8AAAACAAEAAABhABAAAAACAAEAAABhABEAAAACAAEAAABhABIAAAACAAEAAABhABMAAAACAAEAAABhABQAAAACAAEAAABhABUAAAACAAEAAABhABYAAAACAAEAAABhABcAAAACAAEAAABhABgAAAACAAEAAABhABkAAAACAAEAAABhABoAAAACAAEAAABhABsAAAACAAEAAABhABwAAAACAAEAAABhAB0AAAACAAEAAABhAB4AAAACAAEAAABhAB8AAAACAAEAAABhACAAAAACAAEAAABhACEAAAACAAEAAABhACIAAAACAAEAAABhACMAAAACAAEAAABhACQAAAACAAEAAABhACUAAAACAAEAAABiAPL/AAACAAEAAABiAPP/AAACAAEAAABiAPT/AAACAAEAAABiAPX/AAACAAEAAABiAPb/AAACAAEAAABiAPf/AAACAAEAAABiAPj/AAACAAEAAABiAPn/AAACAAEAAABiAPr/AAACAAEAAABiAPv/AAACAAEAAABiAPz/AAACAAEAAABiAP3/AAACAAEAAABiAP7/AAACAAEAAABiAP//AAACAAEAAABiAAAAAAACAAEAAABiAAEAAAACAAEAAABiAAIAAAACAAEAAABiAAMAAAACAAEAAABiAAQAAAACAAEAAABiAAUAAAACAAEAAABiAAYAAAACAAEAAABiAAcAAAACAAEAAABiAAgAAAACAAEAAABiAAkAAAACAAEAAABiAAoAAAACAAEAAABiAAsAAAACAAEAAABiAAwAAAACAAEAAABiAA0AAAACAAEAAABiAA4AAAACAAEAAABiAA8AAAACAAEAAABiABAAAAACAAEAAABiABEAAAACAAEAAABiABIAAAACAAEAAABiABMAAAACAAEAAABiABQAAAACAAEAAABiABUAAAACAAEAAABiABYAAAACAAEAAABiABcAAAACAAEAAABiABgAAAACAAEAAABiABkAAAACAAEAAABiABoAAAACAAEAAABiABsAAAACAAEAAABiABwAAAACAAEAAABiAB0AAAACAAEAAABiAB4AAAACAAEAAABiAB8AAAACAAEAAABiACAAAAACAAEAAABiACEAAAACAAEAAABiACIAAAACAAEAAABiACMAAAACAAEAAABiACQAAAACAAEAAABiACUAAAACAAEAAABjAPL/AAACAAEAAABjAPP/AAACAAEAAABjAPT/AAACAAEAAABjAPX/AAACAAEAAABjAPb/AAACAAEAAABjAPf/AAACAAEAAABjAPj/AAACAAEAAABjAPn/AAACAAEAAABjAPr/AAACAAEAAABjAPv/AAACAAEAAABjAPz/AAACAAEAAABjAP3/AAACAAEAAABjAP7/AAACAAEAAABjAP//AAACAAEAAABjAAAAAAACAAEAAABjAAEAAAACAAEAAABjAAIAAAACAAEAAABjAAMAAAACAAEAAABjAAQAAAACAAEAAABjAAUAAAACAAEAAABjAAYAAAACAAEAAABjAAcAAAACAAEAAABjAAgAAAACAAEAAABjAAkAAAACAAEAAABjAAoAAAACAAEAAABjAAsAAAACAAEAAABjAAwAAAACAAEAAABjAA0AAAACAAEAAABjAA4AAAACAAEAAABjAA8AAAACAAEAAABjABAAAAACAAEAAABjABEAAAACAAEAAABjABIAAAACAAEAAABjABMAAAACAAEAAABjABQAAAACAAEAAABjABUAAAACAAEAAABjABYAAAACAAEAAABjABcAAAACAAEAAABjABgAAAACAAEAAABjABkAAAACAAEAAABjABoAAAACAAEAAABjABsAAAACAAEAAABjABwAAAACAAEAAABjAB0AAAACAAEAAABjAB4AAAACAAEAAABjAB8AAAACAAEAAABjACAAAAACAAEAAABjACEAAAACAAEAAABjACIAAAACAAEAAABjACMAAAACAAEAAABjACQAAAACAAEAAABjACUAAAACAAEAAABkAPL/AAACAAEAAABkAPP/AAACAAEAAABkAPT/AAACAAEAAABkAPX/AAACAAEAAABkAPb/AAACAAEAAABkAPf/AAACAAEAAABkAPj/AAACAAEAAABkAPn/AAACAAEAAABkAPr/AAACAAEAAABkAPv/AAACAAEAAABkAPz/AAACAAEAAABkAP3/AAACAAEAAABkAP7/AAACAAEAAABkAP//AAACAAEAAABkAAAAAAACAAEAAABkAAEAAAACAAEAAABkAAIAAAACAAEAAABkAAMAAAACAAEAAABkAAQAAAACAAEAAABkAAUAAAACAAEAAABkAAYAAAACAAEAAABkAAcAAAACAAEAAABkAAgAAAACAAEAAABkAAkAAAACAAEAAABkAAoAAAACAAEAAABkAAsAAAACAAEAAABkAAwAAAACAAEAAABkAA0AAAACAAEAAABkAA4AAAACAAEAAABkAA8AAAACAAEAAABkABAAAAACAAEAAABkABEAAAACAAEAAABkABIAAAACAAEAAABkABMAAAACAAEAAABkABQAAAACAAEAAABkABUAAAACAAEAAABkABYAAAACAAEAAABkABcAAAACAAEAAABkABgAAAACAAEAAABkABkAAAACAAEAAABkABoAAAACAAEAAABkABsAAAACAAEAAABkABwAAAACAAEAAABkAB0AAAACAAEAAABkAB4AAAACAAEAAABkAB8AAAACAAEAAABkACAAAAACAAEAAABkACEAAAACAAEAAABkACIAAAACAAEAAABkACMAAAACAAEAAABkACQAAAACAAEAAABkACUAAAACAAEAAABlAPL/AAACAAEAAABlAPP/AAACAAEAAABlAPT/AAACAAEAAABlAPX/AAACAAEAAABlAPb/AAACAAEAAABlAPf/AAACAAEAAABlAPj/AAACAAEAAABlAPn/AAACAAEAAABlAPr/AAACAAEAAABlAPv/AAACAAEAAABlAPz/AAACAAEAAABlAP3/AAACAAEAAABlAP7/AAACAAEAAABlAP//AAACAAEAAABlAAAAAAACAAEAAABlAAEAAAACAAEAAABlAAIAAAACAAEAAABlAAMAAAACAAEAAABlAAQAAAACAAEAAABlAAUAAAACAAEAAABlAAYAAAACAAEAAABlAAcAAAACAAEAAABlAAgAAAACAAEAAABlAAkAAAACAAEAAABlAAoAAAACAAEAAABlAAsAAAACAAEAAABlAAwAAAACAAEAAABlAA0AAAACAAEAAABlAA4AAAACAAEAAABlAA8AAAACAAEAAABlABAAAAACAAEAAABlABEAAAACAAEAAABlABIAAAACAAEAAABlABMAAAACAAEAAABlABQAAAACAAEAAABlABUAAAACAAEAAABlABYAAAACAAEAAABlABcAAAACAAEAAABlABgAAAACAAEAAABlABkAAAACAAEAAABlABoAAAACAAEAAABlABsAAAACAAEAAABlABwAAAACAAEAAABlAB0AAAACAAEAAABlAB4AAAACAAEAAABlAB8AAAACAAEAAABlACAAAAACAAEAAABlACEAAAACAAEAAABlACIAAAACAAEAAABlACMAAAACAAEAAABlACQAAAACAAEAAABlACUAAAACAAEAAABmAPL/AAACAAEAAABmAPP/AAACAAEAAABmAPT/AAACAAEAAABmAPX/AAACAAEAAABmAPb/AAACAAEAAABmAPf/AAACAAEAAABmAPj/AAACAAEAAABmAPn/AAACAAEAAABmAPr/AAACAAEAAABmAPv/AAACAAEAAABmAPz/AAACAAEAAABmAP3/AAACAAEAAABmAP7/AAACAAEAAABmAP//AAACAAEAAABmAAAAAAACAAEAAABmAAEAAAACAAEAAABmAAIAAAACAAEAAABmAAMAAAACAAEAAABmAAQAAAACAAEAAABmAAUAAAACAAEAAABmAAYAAAACAAEAAABmAAcAAAACAAEAAABmAAgAAAACAAEAAABmAAkAAAACAAEAAABmAAoAAAACAAEAAABmAAsAAAACAAEAAABmAAwAAAACAAEAAABmAA0AAAACAAEAAABmAA4AAAACAAEAAABmAA8AAAACAAEAAABmABAAAAACAAEAAABmABEAAAACAAEAAABmABIAAAACAAEAAABmABMAAAACAAEAAABmABQAAAACAAEAAABmABUAAAACAAEAAABmABYAAAACAAEAAABmABcAAAACAAEAAABmABgAAAACAAEAAABmABkAAAACAAEAAABmABoAAAACAAEAAABmABsAAAACAAEAAABmABwAAAACAAEAAABmAB0AAAACAAEAAABmAB4AAAACAAEAAABmAB8AAAACAAEAAABmACAAAAACAAEAAABmACEAAAACAAEAAABmACIAAAACAAEAAABmACMAAAACAAEAAABmACQAAAACAAEAAABmACUAAAACAAEAAADl//L/AAACAAEAAADl//P/AAACAAEAAADm//L/AAACAAEAAADm//P/AAACAAEAAADn//L/AAACAAEAAADn//P/AAACAAEAAADo//L/AAACAAEAAADo//P/AAACAAEAAADp//L/AAACAAEAAADp//P/AAACAAEAAADq//L/AAACAAEAAADq//P/AAACAAEAAADr//L/AAACAAEAAADr//P/AAACAAEAAADs//L/AAACAAEAAADs//P/AAACAAEAAADt//L/AAACAAEAAADt//P/AAACAAEAAADu//L/AAACAAEAAADu//P/AAACAAEAAADv//L/AAACAAEAAADv//P/AAACAAEAAADw//L/AAACAAEAAADw//P/AAACAAEAAADx//L/AAACAAEAAADx//P/AAACAAEAAADy//L/AAACAAEAAADy//P/AAACAAEAAADz//L/AAACAAEAAADz//P/AAACAAEAAAD0//L/AAACAAEAAAD0//P/AAACAAEAAAD1//L/AAACAAEAAAD1//P/AAACAAEAAAD2//L/AAACAAEAAAD2//P/AAACAAEAAAD3//L/AAACAAEAAAD3//P/AAACAAEAAAD4//L/AAACAAEAAAD4//P/AAACAAEAAAD5//L/AAACAAEAAAD5//P/AAACAAEAAAD6//L/AAACAAEAAAD6//P/AAACAAEAAAD7//L/AAACAAEAAAD7//P/AAACAAEAAAD8//L/AAACAAEAAAD8//P/AAACAAEAAAD9//L/AAACAAEAAAD9//P/AAACAAEAAAD+//L/AAACAAEAAAD+//P/AAACAAEAAAD///L/AAACAAEAAAD///P/AAACAAEAAAAAAPL/AAACAAEAAAAAAPP/AAACAAEAAAABAPL/AAACAAEAAAABAPP/AAACAAEAAAACAPL/AAACAAEAAAACAPP/AAACAAEAAAADAPL/AAACAAEAAAADAPP/AAACAAEAAAAEAPL/AAACAAEAAAAEAPP/AAACAAEAAAAFAPL/AAACAAEAAAAFAPP/AAACAAEAAAAGAPL/AAACAAEAAAAGAPP/AAACAAEAAAAHAPL/AAACAAEAAAAHAPP/AAACAAEAAAAIAPL/AAACAAEAAAAIAPP/AAACAAEAAAAIAPT/AAACAAEAAAAIAPX/AAACAAEAAAAIAPb/AAACAAEAAAAIAPf/AAACAAEAAAAIAPj/AAACAAEAAAAIAPn/AAACAAEAAAAIAPr/AAACAAEAAAAIAPv/AAACAAEAAAAIAPz/AAACAAEAAAAIAP3/AAACAAEAAAAIAP7/AAACAAEAAAAIAP//AAACAAEAAAAJAPL/AAACAAEAAAAJAPP/AAACAAEAAAAJAPT/AAACAAEAAAAJAPX/AAACAAEAAAAJAPb/AAACAAEAAAAJAPf/AAACAAEAAAAJAPj/AAACAAEAAAAJAPn/AAACAAEAAAAJAPr/AAACAAEAAAAJAPv/AAACAAEAAAAJAPz/AAACAAEAAAAJAP3/AAACAAEAAAAJAP7/AAACAAEAAAAJAP//AAACAAEAAAAKAPL/AAACAAEAAAAKAPP/AAACAAEAAAAKAPT/AAACAAEAAAAKAPX/AAACAAEAAAAKAPb/AAACAAEAAAAKAPf/AAACAAEAAAAKAPj/AAACAAEAAAAKAPn/AAACAAEAAAAKAPr/AAACAAEAAAAKAPv/AAACAAEAAAAKAPz/AAACAAEAAAAKAP3/AAACAAEAAAAKAP7/AAACAAEAAAAKAP//AAACAAEAAAALAPL/AAACAAEAAAALAPP/AAACAAEAAAALAPT/AAACAAEAAAALAPX/AAACAAEAAAALAPb/AAACAAEAAAALAPf/AAACAAEAAAALAPj/AAACAAEAAAALAPn/AAACAAEAAAALAPr/AAACAAEAAAALAPv/AAACAAEAAAALAPz/AAACAAEAAAALAP3/AAACAAEAAAALAP7/AAACAAEAAAALAP//AAACAAEAAAAMAPL/AAACAAEAAAAMAPP/AAACAAEAAAAMAPT/AAACAAEAAAAMAPX/AAACAAEAAAAMAPb/AAACAAEAAAAMAPf/AAACAAEAAAAMAPj/AAACAAEAAAAMAPn/AAACAAEAAAAMAPr/AAACAAEAAAAMAPv/AAACAAEAAAAMAPz/AAACAAEAAAAMAP3/AAACAAEAAAAMAP7/AAACAAEAAAAMAP//AAACAAEAAAANAPL/AAACAAEAAAANAPP/AAACAAEAAAANAPT/AAACAAEAAAANAPX/AAACAAEAAAANAPb/AAACAAEAAAANAPf/AAACAAEAAAANAPj/AAACAAEAAAANAPn/AAACAAEAAAANAPr/AAACAAEAAAANAPv/AAACAAEAAAANAPz/AAACAAEAAAANAP3/AAACAAEAAAANAP7/AAACAAEAAAANAP//AAACAAEAAAAOAPL/AAACAAEAAAAOAPP/AAACAAEAAAAOAPT/AAACAAEAAAAOAPX/AAACAAEAAAAOAPb/AAACAAEAAAAOAPf/AAACAAEAAAAOAPj/AAACAAEAAAAOAPn/AAACAAEAAAAOAPr/AAACAAEAAAAOAPv/AAACAAEAAAAOAPz/AAACAAEAAAAOAP3/AAACAAEAAAAOAP7/AAACAAEAAAAOAP//AAACAAEAAAAPAPL/AAACAAEAAAAPAPP/AAACAAEAAAAPAPT/AAACAAEAAAAPAPX/AAACAAEAAAAPAPb/AAACAAEAAAAPAPf/AAACAAEAAAAPAPj/AAACAAEAAAAPAPn/AAACAAEAAAAPAPr/AAACAAEAAAAPAPv/AAACAAEAAAAPAPz/AAACAAEAAAAPAP3/AAACAAEAAAAPAP7/AAACAAEAAAAPAP//AAACAAEAAAAQAPL/AAACAAEAAAAQAPP/AAACAAEAAAAQAPT/AAACAAEAAAAQAPX/AAACAAEAAAAQAPb/AAACAAEAAAAQAPf/AAACAAEAAAAQAPj/AAACAAEAAAAQAPn/AAACAAEAAAAQAPr/AAACAAEAAAAQAPv/AAACAAEAAAAQAPz/AAACAAEAAAAQAP3/AAACAAEAAAAQAP7/AAACAAEAAAAQAP//AAACAAEAAAARAPL/AAACAAEAAAARAPP/AAACAAEAAAARAPT/AAACAAEAAAARAPX/AAACAAEAAAARAPb/AAACAAEAAAARAPf/AAACAAEAAAARAPj/AAACAAEAAAARAPn/AAACAAEAAAARAPr/AAACAAEAAAARAPv/AAACAAEAAAARAPz/AAACAAEAAAARAP3/AAACAAEAAAARAP7/AAACAAEAAAARAP//AAACAAEAAAASAPL/AAACAAEAAAASAPP/AAACAAEAAAASAPT/AAACAAEAAAASAPX/AAACAAEAAAASAPb/AAACAAEAAAASAPf/AAACAAEAAAASAPj/AAACAAEAAAASAPn/AAACAAEAAAASAPr/AAACAAEAAAASAPv/AAACAAEAAAASAPz/AAACAAEAAAASAP3/AAACAAEAAAASAP7/AAACAAEAAAASAP//AAACAAEAAAATAPL/AAACAAEAAAATAPP/AAACAAEAAAATAPT/AAACAAEAAAATAPX/AAACAAEAAAATAPb/AAACAAEAAAATAPf/AAACAAEAAAATAPj/AAACAAEAAAATAPn/AAACAAEAAAATAPr/AAACAAEAAAATAPv/AAACAAEAAAATAPz/AAACAAEAAAATAP3/AAACAAEAAAATAP7/AAACAAEAAAATAP//AAACAAEAAAAUAPL/AAACAAEAAAAUAPP/AAACAAEAAAAUAPT/AAACAAEAAAAUAPX/AAACAAEAAAAUAPb/AAACAAEAAAAUAPf/AAACAAEAAAAUAPj/AAACAAEAAAAUAPn/AAACAAEAAAAUAPr/AAACAAEAAAAUAPv/AAACAAEAAAAUAPz/AAACAAEAAAAUAP3/AAACAAEAAAAUAP7/AAACAAEAAAAUAP//AAACAAEAAAAVAPL/AAACAAEAAAAVAPP/AAACAAEAAAAVAPT/AAACAAEAAAAVAPX/AAACAAEAAAAVAPb/AAACAAEAAAAVAPf/AAACAAEAAAAVAPj/AAACAAEAAAAVAPn/AAACAAEAAAAVAPr/AAACAAEAAAAVAPv/AAACAAEAAAAVAPz/AAACAAEAAAAVAP3/AAACAAEAAAAVAP7/AAACAAEAAAAVAP//AAACAAEAAAAWAPL/AAACAAEAAAAWAPP/AAACAAEAAAAWAPT/AAACAAEAAAAWAPX/AAACAAEAAAAWAPb/AAACAAEAAAAWAPf/AAACAAEAAAAWAPj/AAACAAEAAAAWAPn/AAACAAEAAAAWAPr/AAACAAEAAAAWAPv/AAACAAEAAAAWAPz/AAACAAEAAAAWAP3/AAACAAEAAAAWAP7/AAACAAEAAAAWAP//AAACAAEAAAAXAPL/AAACAAEAAAAXAPP/AAACAAEAAAAXAPT/AAACAAEAAAAXAPX/AAACAAEAAAAXAPb/AAACAAEAAAAXAPf/AAACAAEAAAAXAPj/AAACAAEAAAAXAPn/AAACAAEAAAAXAPr/AAACAAEAAAAXAPv/AAACAAEAAAAXAPz/AAACAAEAAAAXAP3/AAACAAEAAAAXAP7/AAACAAEAAAAXAP//AAACAAEAAAAYAPL/AAACAAEAAAAYAPP/AAACAAEAAAAYAPT/AAACAAEAAAAYAPX/AAACAAEAAAAYAPb/AAACAAEAAAAYAPf/AAACAAEAAAAYAPj/AAACAAEAAAAYAPn/AAACAAEAAAAYAPr/AAACAAEAAAAYAPv/AAACAAEAAAAYAPz/AAACAAEAAAAYAP3/AAACAAEAAAAYAP7/AAACAAEAAAAYAP//AAACAAEAAAAZAPL/AAACAAEAAAAZAPP/AAACAAEAAAAZAPT/AAACAAEAAAAZAPX/AAACAAEAAAAZAPb/AAACAAEAAAAZAPf/AAACAAEAAAAZAPj/AAACAAEAAAAZAPn/AAACAAEAAAAZAPr/AAACAAEAAAAZAPv/AAACAAEAAAAZAPz/AAACAAEAAAAZAP3/AAACAAEAAAAZAP7/AAACAAEAAAAZAP//AAACAAEAAAAaAPL/AAACAAEAAAAaAPP/AAACAAEAAAAaAPT/AAACAAEAAAAaAPX/AAACAAEAAAAaAPb/AAACAAEAAAAaAPf/AAACAAEAAAAaAPj/AAACAAEAAAAaAPn/AAACAAEAAAAaAPr/AAACAAEAAAAaAPv/AAACAAEAAAAaAPz/AAACAAEAAAAaAP3/AAACAAEAAAAaAP7/AAACAAEAAAAaAP//AAACAAEAAAAbAPL/AAACAAEAAAAbAPP/AAACAAEAAAAbAPT/AAACAAEAAAAbAPX/AAACAAEAAAAbAPb/AAACAAEAAAAbAPf/AAACAAEAAAAbAPj/AAACAAEAAAAbAPn/AAACAAEAAAAbAPr/AAACAAEAAAAbAPv/AAACAAEAAAAbAPz/AAACAAEAAAAbAP3/AAACAAEAAAAbAP7/AAACAAEAAAAbAP//AAACAAEAAAAcAPL/AAACAAEAAAAcAPP/AAACAAEAAAAcAPT/AAACAAEAAAAcAPX/AAACAAEAAAAcAPb/AAACAAEAAAAcAPf/AAACAAEAAAAcAPj/AAACAAEAAAAcAPn/AAACAAEAAAAcAPr/AAACAAEAAAAcAPv/AAACAAEAAAAcAPz/AAACAAEAAAAcAP3/AAACAAEAAAAcAP7/AAACAAEAAAAcAP//AAACAAEAAAAdAPL/AAACAAEAAAAdAPP/AAACAAEAAAAdAPT/AAACAAEAAAAdAPX/AAACAAEAAAAdAPb/AAACAAEAAAAdAPf/AAACAAEAAAAdAPj/AAACAAEAAAAdAPn/AAACAAEAAAAdAPr/AAACAAEAAAAdAPv/AAACAAEAAAAdAPz/AAACAAEAAAAdAP3/AAACAAEAAAAdAP7/AAACAAEAAAAdAP//AAACAAEAAAAeAPL/AAACAAEAAAAeAPP/AAACAAEAAAAeAPT/AAACAAEAAAAeAPX/AAACAAEAAAAeAPb/AAACAAEAAAAeAPf/AAACAAEAAAAeAPj/AAACAAEAAAAeAPn/AAACAAEAAAAeAPr/AAACAAEAAAAeAPv/AAACAAEAAAAeAPz/AAACAAEAAAAeAP3/AAACAAEAAAAeAP7/AAACAAEAAAAeAP//AAACAAEAAAAfAPL/AAACAAEAAAAfAPP/AAACAAEAAAAfAPT/AAACAAEAAAAfAPX/AAACAAEAAAAfAPb/AAACAAEAAAAfAPf/AAACAAEAAAAfAPj/AAACAAEAAAAfAPn/AAACAAEAAAAfAPr/AAACAAEAAAAfAPv/AAACAAEAAAAfAPz/AAACAAEAAAAfAP3/AAACAAEAAAAfAP7/AAACAAEAAAAfAP//AAACAAEAAAAgAPL/AAACAAEAAAAgAPP/AAACAAEAAAAgAPT/AAACAAEAAAAgAPX/AAACAAEAAAAgAPb/AAACAAEAAAAgAPf/AAACAAEAAAAgAPj/AAACAAEAAAAgAPn/AAACAAEAAAAgAPr/AAACAAEAAAAgAPv/AAACAAEAAAAgAPz/AAACAAEAAAAgAP3/AAACAAEAAAAgAP7/AAACAAEAAAAgAP//AAACAAEAAAAhAPL/AAACAAEAAAAhAPP/AAACAAEAAAAhAPT/AAACAAEAAAAhAPX/AAACAAEAAAAhAPb/AAACAAEAAAAhAPf/AAACAAEAAAAhAPj/AAACAAEAAAAhAPn/AAACAAEAAAAhAPr/AAACAAEAAAAhAPv/AAACAAEAAAAhAPz/AAACAAEAAAAhAP3/AAACAAEAAAAhAP7/AAACAAEAAAAhAP//AAACAAEAAAAiAPL/AAACAAEAAAAiAPP/AAACAAEAAAAiAPT/AAACAAEAAAAiAPX/AAACAAEAAAAiAPb/AAACAAEAAAAiAPf/AAACAAEAAAAiAPj/AAACAAEAAAAiAPn/AAACAAEAAAAiAPr/AAACAAEAAAAiAPv/AAACAAEAAAAiAPz/AAACAAEAAAAiAP3/AAACAAEAAAAiAP7/AAACAAEAAAAiAP//AAACAAEAAAAjAPL/AAACAAEAAAAjAPP/AAACAAEAAAAjAPT/AAACAAEAAAAjAPX/AAACAAEAAAAjAPb/AAACAAEAAAAjAPf/AAACAAEAAAAjAPj/AAACAAEAAAAjAPn/AAACAAEAAAAjAPr/AAACAAEAAAAjAPv/AAACAAEAAAAjAPz/AAACAAEAAAAjAP3/AAACAAEAAAAjAP7/AAACAAEAAAAjAP//AAACAAEAAAAkAPL/AAACAAEAAAAkAPP/AAACAAEAAAAkAPT/AAACAAEAAAAkAPX/AAACAAEAAAAkAPb/AAACAAEAAAAkAPf/AAACAAEAAAAkAPj/AAACAAEAAAAkAPn/AAACAAEAAAAkAPr/AAACAAEAAAAkAPv/AAACAAEAAAAkAPz/AAACAAEAAAAkAP3/AAACAAEAAAAkAP7/AAACAAEAAAAkAP//AAACAAEAAAAlAPL/AAACAAEAAAAlAPP/AAACAAEAAAAlAPT/AAACAAEAAAAlAPX/AAACAAEAAAAlAPb/AAACAAEAAAAlAPf/AAACAAEAAAAlAPj/AAACAAEAAAAlAPn/AAACAAEAAAAlAPr/AAACAAEAAAAlAPv/AAACAAEAAAAlAPz/AAACAAEAAAAlAP3/AAACAAEAAAAlAP7/AAACAAEAAAAlAP//AAACAAEAAAAmAPL/AAACAAEAAAAmAPP/AAACAAEAAAAmAPT/AAACAAEAAAAmAPX/AAACAAEAAAAmAPb/AAACAAEAAAAmAPf/AAACAAEAAAAmAPj/AAACAAEAAAAmAPn/AAACAAEAAAAmAPr/AAACAAEAAAAmAPv/AAACAAEAAAAmAPz/AAACAAEAAAAmAP3/AAACAAEAAAAmAP7/AAACAAEAAAAmAP//AAACAAEAAAAnAPL/AAACAAEAAAAnAPP/AAACAAEAAAAnAPT/AAACAAEAAAAnAPX/AAACAAEAAAAnAPb/AAACAAEAAAAnAPf/AAACAAEAAAAnAPj/AAACAAEAAAAnAPn/AAACAAEAAAAnAPr/AAACAAEAAAAnAPv/AAACAAEAAAAnAPz/AAACAAEAAAAnAP3/AAACAAEAAAAnAP7/AAACAAEAAAAnAP//AAACAAEAAAAoAPL/AAACAAEAAAAoAPP/AAACAAEAAAAoAPT/AAACAAEAAAAoAPX/AAACAAEAAAAoAPb/AAACAAEAAAAoAPf/AAACAAEAAAAoAPj/AAACAAEAAAAoAPn/AAACAAEAAAAoAPr/AAACAAEAAAAoAPv/AAACAAEAAAAoAPz/AAACAAEAAAAoAP3/AAACAAEAAAAoAP7/AAACAAEAAAAoAP//AAACAAEAAAApAPL/AAACAAEAAAApAPP/AAACAAEAAAApAPT/AAACAAEAAAApAPX/AAACAAEAAAApAPb/AAACAAEAAAApAPf/AAACAAEAAAApAPj/AAACAAEAAAApAPn/AAACAAEAAAApAPr/AAACAAEAAAApAPv/AAACAAEAAAApAPz/AAACAAEAAAApAP3/AAACAAEAAAApAP7/AAACAAEAAAApAP//AAACAAEAAAAqAPL/AAACAAEAAAAqAPP/AAACAAEAAAAqAPT/AAACAAEAAAAqAPX/AAACAAEAAAAqAPb/AAACAAEAAAAqAPf/AAACAAEAAAAqAPj/AAACAAEAAAAqAPn/AAACAAEAAAAqAPr/AAACAAEAAAAqAPv/AAACAAEAAAAqAPz/AAACAAEAAAAqAP3/AAACAAEAAAAqAP7/AAACAAEAAAAqAP//AAACAAEAAAArAPL/AAACAAEAAAArAPP/AAACAAEAAAArAPT/AAACAAEAAAArAPX/AAACAAEAAAArAPb/AAACAAEAAAArAPf/AAACAAEAAAArAPj/AAACAAEAAAArAPn/AAACAAEAAAArAPr/AAACAAEAAAArAPv/AAACAAEAAAArAPz/AAACAAEAAAArAP3/AAACAAEAAAArAP7/AAACAAEAAAArAP//AAACAAEAAAAsAPL/AAACAAEAAAAsAPP/AAACAAEAAAAsAPT/AAACAAEAAAAsAPX/AAACAAEAAAAsAPb/AAACAAEAAAAsAPf/AAACAAEAAAAsAPj/AAACAAEAAAAsAPn/AAACAAEAAAAsAPr/AAACAAEAAAAsAPv/AAACAAEAAAAsAPz/AAACAAEAAAAsAP3/AAACAAEAAAAsAP7/AAACAAEAAAAsAP//AAACAAEAAAAtAPL/AAACAAEAAAAtAPP/AAACAAEAAAAtAPT/AAACAAEAAAAtAPX/AAACAAEAAAAtAPb/AAACAAEAAAAtAPf/AAACAAEAAAAtAPj/AAACAAEAAAAtAPn/AAACAAEAAAAtAPr/AAACAAEAAAAtAPv/AAACAAEAAAAtAPz/AAACAAEAAAAtAP3/AAACAAEAAAAtAP7/AAACAAEAAAAtAP//AAACAAEAAAAuAPL/AAACAAEAAAAuAPP/AAACAAEAAAAuAPT/AAACAAEAAAAuAPX/AAACAAEAAAAuAPb/AAACAAEAAAAuAPf/AAACAAEAAAAuAPj/AAACAAEAAAAuAPn/AAACAAEAAAAuAPr/AAACAAEAAAAuAPv/AAACAAEAAAAuAPz/AAACAAEAAAAuAP3/AAACAAEAAAAuAP7/AAACAAEAAAAuAP//AAACAAEAAAAvAPL/AAACAAEAAAAvAPP/AAACAAEAAAAvAPT/AAACAAEAAAAvAPX/AAACAAEAAAAvAPb/AAACAAEAAAAvAPf/AAACAAEAAAAvAPj/AAACAAEAAAAvAPn/AAACAAEAAAAvAPr/AAACAAEAAAAvAPv/AAACAAEAAAAvAPz/AAACAAEAAAAvAP3/AAACAAEAAAAvAP7/AAACAAEAAAAvAP//AAACAAEAAAAwAPL/AAACAAEAAAAwAPP/AAACAAEAAAAwAPT/AAACAAEAAAAwAPX/AAACAAEAAAAwAPb/AAACAAEAAAAwAPf/AAACAAEAAAAwAPj/AAACAAEAAAAwAPn/AAACAAEAAAAwAPr/AAACAAEAAAAwAPv/AAACAAEAAAAwAPz/AAACAAEAAAAwAP3/AAACAAEAAAAwAP7/AAACAAEAAAAwAP//AAACAAEAAAAxAPL/AAACAAEAAAAxAPP/AAACAAEAAAAxAPT/AAACAAEAAAAxAPX/AAACAAEAAAAxAPb/AAACAAEAAAAxAPf/AAACAAEAAAAxAPj/AAACAAEAAAAxAPn/AAACAAEAAAAxAPr/AAACAAEAAAAxAPv/AAACAAEAAAAxAPz/AAACAAEAAAAxAP3/AAACAAEAAAAxAP7/AAACAAEAAAAxAP//AAACAAEAAAAyAPL/AAACAAEAAAAyAPP/AAACAAEAAAAyAPT/AAACAAEAAAAyAPX/AAACAAEAAAAyAPb/AAACAAEAAAAyAPf/AAACAAEAAAAyAPj/AAACAAEAAAAyAPn/AAACAAEAAAAyAPr/AAACAAEAAAAyAPv/AAACAAEAAAAyAPz/AAACAAEAAAAyAP3/AAACAAEAAAAyAP7/AAACAAEAAAAyAP//AAACAAEAAAAzAPL/AAACAAEAAAAzAPP/AAACAAEAAAAzAPT/AAACAAEAAAAzAPX/AAACAAEAAAAzAPb/AAACAAEAAAAzAPf/AAACAAEAAAAzAPj/AAACAAEAAAAzAPn/AAACAAEAAAAzAPr/AAACAAEAAAAzAPv/AAACAAEAAAAzAPz/AAACAAEAAAAzAP3/AAACAAEAAAAzAP7/AAACAAEAAAAzAP//AAACAAEAAAA0APL/AAACAAEAAAA0APP/AAACAAEAAAA0APT/AAACAAEAAAA0APX/AAACAAEAAAA0APb/AAACAAEAAAA0APf/AAACAAEAAAA0APj/AAACAAEAAAA0APn/AAACAAEAAAA0APr/AAACAAEAAAA0APv/AAACAAEAAAA0APz/AAACAAEAAAA0AP3/AAACAAEAAAA0AP7/AAACAAEAAAA0AP//AAACAAEAAAA1APL/AAACAAEAAAA1APP/AAACAAEAAAA1APT/AAACAAEAAAA1APX/AAACAAEAAAA1APb/AAACAAEAAAA1APf/AAACAAEAAAA1APj/AAACAAEAAAA1APn/AAACAAEAAAA1APr/AAACAAEAAAA1APv/AAACAAEAAAA1APz/AAACAAEAAAA1AP3/AAACAAEAAAA1AP7/AAACAAEAAAA1AP//AAACAAEAAAA2APL/AAACAAEAAAA2APP/AAACAAEAAAA2APT/AAACAAEAAAA2APX/AAACAAEAAAA2APb/AAACAAEAAAA2APf/AAACAAEAAAA2APj/AAACAAEAAAA2APn/AAACAAEAAAA2APr/AAACAAEAAAA2APv/AAACAAEAAAA2APz/AAACAAEAAAA2AP3/AAACAAEAAAA2AP7/AAACAAEAAAA2AP//AAACAAEAAAA3APL/AAACAAEAAAA3APP/AAACAAEAAAA3APT/AAACAAEAAAA3APX/AAACAAEAAAA3APb/AAACAAEAAAA3APf/AAACAAEAAAA3APj/AAACAAEAAAA3APn/AAACAAEAAAA3APr/AAACAAEAAAA3APv/AAACAAEAAAA3APz/AAACAAEAAAA3AP3/AAACAAEAAAA3AP7/AAACAAEAAAA3AP//AAACAAEAAAA4APL/AAACAAEAAAA4APP/AAACAAEAAAA4APT/AAACAAEAAAA4APX/AAACAAEAAAA4APb/AAACAAEAAAA4APf/AAACAAEAAAA4APj/AAACAAEAAAA4APn/AAACAAEAAAA4APr/AAACAAEAAAA4APv/AAACAAEAAAA4APz/AAACAAEAAAA4AP3/AAACAAEAAAA4AP7/AAACAAEAAAA4AP//AAACAAEAAAA5APL/AAACAAEAAAA5APP/AAACAAEAAAA5APT/AAACAAEAAAA5APX/AAACAAEAAAA5APb/AAACAAEAAAA5APf/AAACAAEAAAA5APj/AAACAAEAAAA5APn/AAACAAEAAAA5APr/AAACAAEAAAA5APv/AAACAAEAAAA5APz/AAACAAEAAAA5AP3/AAACAAEAAAA5AP7/AAACAAEAAAA5AP//AAACAAEAAAA6APL/AAACAAEAAAA6APP/AAACAAEAAAA6APT/AAACAAEAAAA6APX/AAACAAEAAAA6APb/AAACAAEAAAA6APf/AAACAAEAAAA6APj/AAACAAEAAAA6APn/AAACAAEAAAA6APr/AAACAAEAAAA6APv/AAACAAEAAAA6APz/AAACAAEAAAA6AP3/AAACAAEAAAA6AP7/AAACAAEAAAA6AP//AAACAAEAAAA7APL/AAACAAEAAAA7APP/AAACAAEAAAA7APT/AAACAAEAAAA7APX/AAACAAEAAAA7APb/AAACAAEAAAA7APf/AAACAAEAAAA7APj/AAACAAEAAAA7APn/AAACAAEAAAA7APr/AAACAAEAAAA7APv/AAACAAEAAAA7APz/AAACAAEAAAA7AP3/AAACAAEAAAA7AP7/AAACAAEAAAA7AP//AAACAAEAAAA8APL/AAACAAEAAAA8APP/AAACAAEAAAA8APT/AAACAAEAAAA8APX/AAACAAEAAAA8APb/AAACAAEAAAA8APf/AAACAAEAAAA8APj/AAACAAEAAAA8APn/AAACAAEAAAA8APr/AAACAAEAAAA8APv/AAACAAEAAAA8APz/AAACAAEAAAA8AP3/AAACAAEAAAA8AP7/AAACAAEAAAA8AP//AAACAAEAAAA9APL/AAACAAEAAAA9APP/AAACAAEAAAA9APT/AAACAAEAAAA9APX/AAACAAEAAAA9APb/AAACAAEAAAA9APf/AAACAAEAAAA9APj/AAACAAEAAAA9APn/AAACAAEAAAA9APr/AAACAAEAAAA9APv/AAACAAEAAAA9APz/AAACAAEAAAA9AP3/AAACAAEAAAA9AP7/AAACAAEAAAA9AP//AAACAAEAAAA+APL/AAACAAEAAAA+APP/AAACAAEAAAA+APT/AAACAAEAAAA+APX/AAACAAEAAAA+APb/AAACAAEAAAA+APf/AAACAAEAAAA+APj/AAACAAEAAAA+APn/AAACAAEAAAA+APr/AAACAAEAAAA+APv/AAACAAEAAAA+APz/AAACAAEAAAA+AP3/AAACAAEAAAA+AP7/AAACAAEAAAA+AP//AAACAAEAAAA/APL/AAACAAEAAAA/APP/AAACAAEAAAA/APT/AAACAAEAAAA/APX/AAACAAEAAAA/APb/AAACAAEAAAA/APf/AAACAAEAAAA/APj/AAACAAEAAAA/APn/AAACAAEAAAA/APr/AAACAAEAAAA/APv/AAACAAEAAAA/APz/AAACAAEAAAA/AP3/AAACAAEAAAA/AP7/AAACAAEAAAA/AP//AAACAAEAAABAAPL/AAACAAEAAABAAPP/AAACAAEAAABAAPT/AAACAAEAAABAAPX/AAACAAEAAABAAPb/AAACAAEAAABAAPf/AAACAAEAAABAAPj/AAACAAEAAABAAPn/AAACAAEAAABAAPr/AAACAAEAAABAAPv/AAACAAEAAABAAPz/AAACAAEAAABAAP3/AAACAAEAAABAAP7/AAACAAEAAABAAP//AAACAAEAAABBAPL/AAACAAEAAABBAPP/AAACAAEAAABBAPT/AAACAAEAAABBAPX/AAACAAEAAABBAPb/AAACAAEAAABBAPf/AAACAAEAAABBAPj/AAACAAEAAABBAPn/AAACAAEAAABBAPr/AAACAAEAAABBAPv/AAACAAEAAABBAPz/AAACAAEAAABBAP3/AAACAAEAAABBAP7/AAACAAEAAABBAP//AAACAAEAAABCAPL/AAACAAEAAABCAPP/AAACAAEAAABCAPT/AAACAAEAAABCAPX/AAACAAEAAABCAPb/AAACAAEAAABCAPf/AAACAAEAAABCAPj/AAACAAEAAABCAPn/AAACAAEAAABCAPr/AAACAAEAAABCAPv/AAACAAEAAABCAPz/AAACAAEAAABCAP3/AAACAAEAAABCAP7/AAACAAEAAABCAP//AAACAAEAAABDAPL/AAACAAEAAABDAPP/AAACAAEAAABDAPT/AAACAAEAAABDAPX/AAACAAEAAABDAPb/AAACAAEAAABDAPf/AAACAAEAAABDAPj/AAACAAEAAABDAPn/AAACAAEAAABDAPr/AAACAAEAAABDAPv/AAACAAEAAABDAPz/AAACAAEAAABDAP3/AAACAAEAAABDAP7/AAACAAEAAABDAP//AAACAAEAAABEAPL/AAACAAEAAABEAPP/AAACAAEAAABEAPT/AAACAAEAAABEAPX/AAACAAEAAABEAPb/AAACAAEAAABEAPf/AAACAAEAAABEAPj/AAACAAEAAABEAPn/AAACAAEAAABEAPr/AAACAAEAAABEAPv/AAACAAEAAABEAPz/AAACAAEAAABEAP3/AAACAAEAAABEAP7/AAACAAEAAABEAP//AAACAAEAAABFAPL/AAACAAEAAABFAPP/AAACAAEAAABFAPT/AAACAAEAAABFAPX/AAACAAEAAABFAPb/AAACAAEAAABFAPf/AAACAAEAAABFAPj/AAACAAEAAABFAPn/AAACAAEAAABFAPr/AAACAAEAAABFAPv/AAACAAEAAABFAPz/AAACAAEAAABFAP3/AAACAAEAAABFAP7/AAACAAEAAABFAP//AAACAAEAAAA=") -tile_set = SubResource("TileSet_5bd38") - -[node name="Player" parent="." instance=ExtResource("2_07rl6")] -position = Vector2(584, 442) - -[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_3eu8f")] -position = Vector2(584, 456) -scale = Vector2(3.44061, 0.770942) -player = NodePath("../Player") -push_direction = 2 - -[node name="Camera2D" type="Camera2D" parent="."] -z_index = 4096 -position = Vector2(582, 328) -zoom = Vector2(2, 2) - -[node name="PauseMenu" parent="Camera2D" instance=ExtResource("1_yi287")] diff --git a/scenes/interfaces/inventory.tscn b/scenes/interfaces/inventory.tscn deleted file mode 100644 index 08f856e..0000000 --- a/scenes/interfaces/inventory.tscn +++ /dev/null @@ -1,108 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://cjvtoi20cy8wi"] - -[ext_resource type="Script" path="res://scripts/inventory.gd" id="1_8uk8r"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_yqb3t"] -[ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="3_76oh0"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="4_dbq78"] -[ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="4_pbytw"] -[ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="6_em7re"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid.gd" id="7_v7tk4"] - -[sub_resource type="Resource" id="Resource_g1a6x"] -script = ExtResource("3_76oh0") -json_data = "[ - { - \"_comment\": \"Grid Based Inventory\", - \"description\": \"An example item used as a base to create other items.\", - \"height\": 2, - \"id\": \"base_item\", - \"image\": \"res://assets/textures/book.png\", - \"name\": \"Base Item\", - \"stack_size\": 10, - \"weight\": 1, - \"width\": 2 - } -]" - -[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_cujr1"] -size = Vector2(30, 30) - -[node name="InventoryMenu" type="Control"] -process_mode = 2 -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_8uk8r") - -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("2_yqb3t") -size = Vector2i(5, 5) -item_protoset = SubResource("Resource_g1a6x") - -[node name="_Node_80111" type="Node" parent="InventoryGridStacked"] -script = ExtResource("4_dbq78") -protoset = SubResource("Resource_g1a6x") -prototype_id = "base_item" - -[node name="CenterContainer" type="CenterContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] -layout_mode = 2 - -[node name="NinePatchRect" type="NinePatchRect" parent="CenterContainer/PanelContainer"] -modulate = Color(0.831856, 0.844692, 0.906161, 1) -custom_minimum_size = Vector2(100, 100) -layout_mode = 2 -texture = ExtResource("4_pbytw") -patch_margin_left = 15 -patch_margin_top = 15 -patch_margin_right = 15 -patch_margin_bottom = 25 - -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 50 -theme_override_constants/margin_top = 20 -theme_override_constants/margin_right = 50 -theme_override_constants/margin_bottom = 35 - -[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] -layout_mode = 2 - -[node name="Row1Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -alignment = 1 - -[node name="CtrlInventoryGrid" type="Control" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] -custom_minimum_size = Vector2(100, 100) -layout_mode = 2 -script = ExtResource("7_v7tk4") -inventory_path = NodePath("../../../../../../InventoryGridStacked") -default_item_texture = SubResource("PlaceholderTexture2D_cujr1") - -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_top = 20 - -[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] -layout_mode = 2 -alignment = 2 - -[node name="ReturnButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] -modulate = Color(0.901197, 0.823165, 0.861526, 1) -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("6_em7re") -text = "Return" - -[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/ReturnButton" to="." method="_on_return_button_pressed"] diff --git a/scenes/interfaces/pause_menu.tscn b/scenes/interfaces/pause_menu.tscn deleted file mode 100644 index 0aff408..0000000 --- a/scenes/interfaces/pause_menu.tscn +++ /dev/null @@ -1,76 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://d11oo2pxcah1g"] - -[ext_resource type="Script" path="res://scripts/pause_menu.gd" id="1_aq3as"] -[ext_resource type="Script" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_j81qh"] - -[sub_resource type="LabelSettings" id="LabelSettings_3vmtb"] -font_size = 50 - -[node name="PauseMenu" type="Control"] -process_mode = 3 -z_index = 4096 -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_aq3as") - -[node name="CenterContainer" type="CenterContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] -layout_mode = 2 - -[node name="PauseLabel" type="Label" parent="CenterContainer/VBoxContainer"] -custom_minimum_size = Vector2(250, 100) -layout_mode = 2 -theme_override_font_sizes/font_size = 16 -text = "Pause" -label_settings = SubResource("LabelSettings_3vmtb") -horizontal_alignment = 1 -vertical_alignment = 1 -autowrap_mode = 3 -clip_text = true -script = ExtResource("2_j81qh") -_size_just_modified_by_autosizer = false -_set_defaults = true -_base_font_size = 50 -_current_font_size = 50 -_last_size_state = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/VBoxContainer"] -layout_mode = 2 -alignment = 1 - -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 32 -theme_override_constants/margin_top = 32 -theme_override_constants/margin_right = 32 -theme_override_constants/margin_bottom = 32 - -[node name="SaveButton" type="Button" parent="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer"] -layout_mode = 2 -text = "Save" - -[node name="MarginContainer2" type="MarginContainer" parent="CenterContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 32 -theme_override_constants/margin_top = 32 -theme_override_constants/margin_right = 32 -theme_override_constants/margin_bottom = 32 - -[node name="LoadButton" type="Button" parent="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer2"] -layout_mode = 2 -text = "Load -" - -[connection signal="pressed" from="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer/SaveButton" to="." method="_on_save_button_pressed"] -[connection signal="pressed" from="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer2/LoadButton" to="." method="_on_load_button_pressed"] diff --git a/scenes/interfaces/save_menu.tscn b/scenes/interfaces/save_menu.tscn deleted file mode 100644 index f8ae35b..0000000 --- a/scenes/interfaces/save_menu.tscn +++ /dev/null @@ -1,124 +0,0 @@ -[gd_scene load_steps=6 format=3 uid="uid://bsiy7irf1p5e1"] - -[ext_resource type="Script" path="res://scripts/save_menu.gd" id="1_47jxk"] -[ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="1_ejhmr"] -[ext_resource type="Script" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_mvfow"] -[ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="3_n5hex"] - -[sub_resource type="LabelSettings" id="LabelSettings_q7utc"] -font_size = 32 -font_color = Color(0.900196, 0.84087, 0.882328, 1) -outline_size = 5 -outline_color = Color(0, 0, 0, 1) - -[node name="SaveMenu" type="Control"] -process_mode = 2 -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_47jxk") - -[node name="CenterContainer" type="CenterContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] -layout_mode = 2 - -[node name="NinePatchRect" type="NinePatchRect" parent="CenterContainer/PanelContainer"] -modulate = Color(0.831856, 0.844692, 0.906161, 1) -custom_minimum_size = Vector2(100, 100) -layout_mode = 2 -texture = ExtResource("1_ejhmr") -patch_margin_left = 15 -patch_margin_top = 15 -patch_margin_right = 15 -patch_margin_bottom = 25 - -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 50 -theme_override_constants/margin_top = 20 -theme_override_constants/margin_right = 50 -theme_override_constants/margin_bottom = 35 - -[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] -layout_mode = 2 - -[node name="LabelAutoSizer" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 50) -layout_mode = 2 -theme_override_font_sizes/font_size = 8 -text = "Save" -label_settings = SubResource("LabelSettings_q7utc") -horizontal_alignment = 1 -vertical_alignment = 1 -autowrap_mode = 3 -clip_text = true -script = ExtResource("2_mvfow") -_size_just_modified_by_autosizer = false -_set_defaults = true -_base_font_size = 32 -_current_font_size = 32 -_last_size_state = 1 - -[node name="Row1Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -alignment = 1 - -[node name="Slot1Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("3_n5hex") -text = "Slot 1" - -[node name="Slot2Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("3_n5hex") -text = "Slot 2" - -[node name="Row2Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -alignment = 1 - -[node name="Slot3Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container"] -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("3_n5hex") -text = "Slot 3" - -[node name="Slot4Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container"] -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("3_n5hex") -text = "Slot 4" - -[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_constants/margin_top = 20 - -[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] -layout_mode = 2 -alignment = 2 - -[node name="ReturnButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] -modulate = Color(0.901197, 0.823165, 0.861526, 1) -custom_minimum_size = Vector2(150, 0) -layout_mode = 2 -theme = ExtResource("3_n5hex") -text = "Return" - -[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container/Slot1Button" to="." method="_on_slot1_button_pressed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container/Slot2Button" to="." method="_on_slot2_button_pressed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container/Slot3Button" to="." method="_on_slot3_button_pressed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container/Slot4Button" to="." method="_on_slot4_button_pressed"] -[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/ReturnButton" to="." method="_on_return_button_pressed"] diff --git a/scenes/level/house_template.tscn b/scenes/level/house_template.tscn new file mode 100644 index 0000000..aebf67b --- /dev/null +++ b/scenes/level/house_template.tscn @@ -0,0 +1,490 @@ +[gd_scene load_steps=8 format=4 uid="uid://bk4h1frr4r8tq"] + +[ext_resource type="Script" uid="uid://bv1k68dotk1b0" path="res://scripts/house_template.gd" id="1_877m4"] +[ext_resource type="Texture2D" uid="uid://d4j4ulftsvn5c" path="res://assets/textures/Inner.png" id="2_wq277"] +[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="3_3sswl"] +[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="4_3t3gn"] +[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/menu/pause_menu.tscn" id="5_gl2jq"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_q4fiy"] +texture = ExtResource("2_wq277") +0:0/0 = 0 +1:0/0 = 0 +1:0/0/z_index = -1 +2:0/0 = 0 +2:0/0/z_index = -1 +3:0/0 = 0 +3:0/0/z_index = -1 +4:0/0 = 0 +4:0/0/z_index = -1 +5:0/0 = 0 +5:0/0/z_index = -1 +6:0/0 = 0 +6:0/0/z_index = -1 +7:0/0 = 0 +7:0/0/z_index = -1 +8:0/0 = 0 +8:0/0/z_index = -1 +9:0/0 = 0 +10:0/0 = 0 +11:0/0 = 0 +12:0/0 = 0 +12:0/0/z_index = 1 +13:0/0 = 0 +13:0/0/z_index = 1 +14:0/0 = 0 +14:0/0/z_index = 1 +15:0/0 = 0 +15:0/0/z_index = 1 +16:0/0 = 0 +16:0/0/z_index = 1 +17:0/0 = 0 +17:0/0/z_index = 1 +0:1/0 = 0 +0:1/0/z_index = -1 +1:1/0 = 0 +1:1/0/z_index = -1 +2:1/0 = 0 +2:1/0/z_index = -1 +3:1/0 = 0 +3:1/0/z_index = -1 +4:1/0 = 0 +4:1/0/z_index = -1 +5:1/0 = 0 +5:1/0/z_index = -1 +6:1/0 = 0 +6:1/0/z_index = -1 +7:1/0 = 0 +7:1/0/z_index = -1 +8:1/0 = 0 +8:1/0/z_index = -1 +9:1/0 = 0 +16:1/0 = 0 +16:1/0/z_index = 1 +17:1/0 = 0 +17:1/0/z_index = 1 +18:1/0 = 0 +18:1/0/z_index = 1 +19:1/0 = 0 +19:1/0/z_index = 1 +20:1/0 = 0 +20:1/0/z_index = 1 +21:1/0 = 0 +21:1/0/z_index = 1 +0:2/0 = 0 +0:2/0/z_index = -1 +1:2/0 = 0 +1:2/0/z_index = -1 +2:2/0 = 0 +2:2/0/z_index = -1 +3:2/0 = 0 +3:2/0/z_index = -1 +4:2/0 = 0 +5:2/0 = 0 +5:2/0/z_index = -1 +6:2/0 = 0 +6:2/0/z_index = -1 +7:2/0 = 0 +7:2/0/z_index = -1 +8:2/0 = 0 +8:2/0/z_index = -1 +9:2/0 = 0 +9:2/0/z_index = -1 +16:2/0 = 0 +16:2/0/z_index = 1 +17:2/0 = 0 +17:2/0/z_index = 1 +18:2/0 = 0 +18:2/0/z_index = 1 +19:2/0 = 0 +19:2/0/z_index = 1 +20:2/0 = 0 +20:2/0/z_index = 1 +21:2/0 = 0 +21:2/0/z_index = 1 +0:3/0 = 0 +0:3/0/z_index = -1 +1:3/0 = 0 +1:3/0/z_index = -1 +2:3/0 = 0 +2:3/0/z_index = -1 +3:3/0 = 0 +3:3/0/z_index = -1 +4:3/0 = 0 +5:3/0 = 0 +5:3/0/z_index = -1 +6:3/0 = 0 +6:3/0/z_index = -1 +7:3/0 = 0 +7:3/0/z_index = -1 +8:3/0 = 0 +8:3/0/z_index = -1 +9:3/0 = 0 +9:3/0/z_index = -1 +16:3/0 = 0 +16:3/0/z_index = 1 +17:3/0 = 0 +17:3/0/z_index = 1 +18:3/0 = 0 +18:3/0/z_index = 1 +19:3/0 = 0 +19:3/0/z_index = 1 +20:3/0 = 0 +20:3/0/z_index = 1 +21:3/0 = 0 +21:3/0/z_index = 1 +0:4/0 = 0 +0:4/0/z_index = -1 +1:4/0 = 0 +1:4/0/z_index = -1 +2:4/0 = 0 +2:4/0/z_index = -1 +3:4/0 = 0 +3:4/0/z_index = -1 +4:4/0 = 0 +5:4/0 = 0 +5:4/0/z_index = -1 +6:4/0 = 0 +6:4/0/z_index = -1 +7:4/0 = 0 +8:4/0 = 0 +9:4/0 = 0 +9:4/0/z_index = 1 +10:4/0 = 0 +10:4/0/z_index = 1 +11:4/0 = 0 +11:4/0/z_index = 1 +12:4/0 = 0 +12:4/0/z_index = 1 +13:4/0 = 0 +13:4/0/z_index = 1 +14:4/0 = 0 +14:4/0/z_index = 1 +0:5/0 = 0 +0:5/0/z_index = -1 +1:5/0 = 0 +1:5/0/z_index = -1 +2:5/0 = 0 +2:5/0/z_index = -1 +3:5/0 = 0 +3:5/0/z_index = -1 +4:5/0 = 0 +5:5/0 = 0 +5:5/0/z_index = -1 +6:5/0 = 0 +6:5/0/z_index = -1 +7:5/0 = 0 +8:5/0 = 0 +9:5/0 = 0 +9:5/0/z_index = 1 +10:5/0 = 0 +10:5/0/z_index = 1 +11:5/0 = 0 +11:5/0/z_index = 1 +12:5/0 = 0 +12:5/0/z_index = 1 +13:5/0 = 0 +13:5/0/z_index = 1 +14:5/0 = 0 +14:5/0/z_index = 1 +0:6/0 = 0 +2:6/0 = 0 +3:6/0 = 0 +4:6/0 = 0 +5:6/0 = 0 +6:6/0 = 0 +7:6/0 = 0 +8:6/0 = 0 +9:6/0 = 0 +10:6/0 = 0 +10:6/0/z_index = 1 +11:6/0 = 0 +11:6/0/z_index = 1 +12:6/0 = 0 +12:6/0/z_index = 1 +13:6/0 = 0 +13:6/0/z_index = 1 +14:6/0 = 0 +14:6/0/z_index = 1 +0:7/0 = 0 +0:7/0/z_index = 1 +1:7/0 = 0 +1:7/0/z_index = 1 +2:7/0 = 0 +2:7/0/z_index = 1 +3:7/0 = 0 +3:7/0/z_index = 1 +4:7/0 = 0 +4:7/0/z_index = 1 +5:7/0 = 0 +5:7/0/z_index = 1 +6:7/0 = 0 +6:7/0/z_index = 1 +7:7/0 = 0 +7:7/0/z_index = 1 +8:7/0 = 0 +8:7/0/z_index = 1 +9:7/0 = 0 +9:7/0/z_index = 1 +10:7/0 = 0 +10:7/0/z_index = 1 +11:7/0 = 0 +11:7/0/z_index = 1 +12:7/0 = 0 +12:7/0/z_index = 1 +13:7/0 = 0 +13:7/0/z_index = 1 +14:7/0 = 0 +14:7/0/z_index = 1 +15:7/0 = 0 +15:7/0/z_index = 1 +16:7/0 = 0 +16:7/0/z_index = 1 +0:8/0 = 0 +0:8/0/z_index = 1 +1:8/0 = 0 +1:8/0/z_index = 1 +2:8/0 = 0 +2:8/0/z_index = 1 +3:8/0 = 0 +3:8/0/z_index = 1 +4:8/0 = 0 +4:8/0/z_index = 1 +5:8/0 = 0 +5:8/0/z_index = 1 +6:8/0 = 0 +6:8/0/z_index = 1 +7:8/0 = 0 +7:8/0/z_index = 1 +8:8/0 = 0 +8:8/0/z_index = 1 +9:8/0 = 0 +9:8/0/z_index = 1 +10:8/0 = 0 +10:8/0/z_index = 1 +11:8/0 = 0 +11:8/0/z_index = 1 +12:8/0 = 0 +12:8/0/z_index = 1 +13:8/0 = 0 +13:8/0/z_index = 1 +14:8/0 = 0 +14:8/0/z_index = 1 +15:8/0 = 0 +15:8/0/z_index = 1 +16:8/0 = 0 +0:9/0 = 0 +0:9/0/z_index = 1 +1:9/0 = 0 +1:9/0/z_index = 1 +2:9/0 = 0 +2:9/0/z_index = 1 +3:9/0 = 0 +3:9/0/z_index = 1 +4:9/0 = 0 +4:9/0/z_index = 1 +5:9/0 = 0 +5:9/0/z_index = 1 +6:9/0 = 0 +6:9/0/z_index = 1 +7:9/0 = 0 +7:9/0/z_index = 1 +8:9/0 = 0 +8:9/0/z_index = 1 +9:9/0 = 0 +10:9/0 = 0 +10:9/0/z_index = 1 +11:9/0 = 0 +12:9/0 = 0 +12:9/0/z_index = 1 +13:9/0 = 0 +13:9/0/z_index = 1 +14:9/0 = 0 +14:9/0/z_index = 1 +15:9/0 = 0 +15:9/0/z_index = 1 +16:9/0 = 0 +16:9/0/z_index = 1 +0:10/0 = 0 +0:10/0/z_index = 1 +1:10/0 = 0 +1:10/0/z_index = 1 +2:10/0 = 0 +2:10/0/z_index = 1 +3:10/0 = 0 +3:10/0/z_index = 1 +4:10/0 = 0 +4:10/0/z_index = 1 +5:10/0 = 0 +5:10/0/z_index = 1 +6:10/0 = 0 +6:10/0/z_index = 1 +7:10/0 = 0 +7:10/0/z_index = 1 +8:10/0 = 0 +8:10/0/z_index = 1 +9:10/0 = 0 +9:10/0/z_index = 1 +10:10/0 = 0 +10:10/0/z_index = 1 +11:10/0 = 0 +12:10/0 = 0 +12:10/0/z_index = 1 +13:10/0 = 0 +13:10/0/z_index = 1 +0:11/0 = 0 +0:11/0/z_index = 1 +1:11/0 = 0 +1:11/0/z_index = 1 +2:11/0 = 0 +2:11/0/z_index = 1 +3:11/0 = 0 +3:11/0/z_index = 1 +4:11/0 = 0 +4:11/0/z_index = 1 +5:11/0 = 0 +5:11/0/z_index = 1 +6:11/0 = 0 +6:11/0/z_index = 1 +7:11/0 = 0 +7:11/0/z_index = 1 +8:11/0 = 0 +8:11/0/z_index = 1 +9:11/0 = 0 +9:11/0/z_index = 1 +10:11/0 = 0 +10:11/0/z_index = 1 +11:11/0 = 0 +11:11/0/z_index = 1 +12:11/0 = 0 +12:11/0/z_index = 1 +13:11/0 = 0 +13:11/0/z_index = 1 +0:12/0 = 0 +0:12/0/z_index = 1 +1:12/0 = 0 +1:12/0/z_index = 1 +2:12/0 = 0 +2:12/0/z_index = 1 +3:12/0 = 0 +3:12/0/z_index = 1 +4:12/0 = 0 +4:12/0/z_index = 1 +5:12/0 = 0 +5:12/0/z_index = 1 +6:12/0 = 0 +6:12/0/z_index = 1 +7:12/0 = 0 +7:12/0/z_index = 1 +8:12/0 = 0 +8:12/0/z_index = 1 +9:12/0 = 0 +9:12/0/z_index = 1 +10:12/0 = 0 +10:12/0/z_index = 1 +11:12/0 = 0 +11:12/0/z_index = 1 +12:12/0 = 0 +12:12/0/z_index = 1 +13:12/0 = 0 +13:12/0/z_index = 1 +0:13/0 = 0 +0:13/0/z_index = 1 +1:13/0 = 0 +1:13/0/z_index = 1 +2:13/0 = 0 +2:13/0/z_index = 1 +3:13/0 = 0 +3:13/0/z_index = 1 +4:13/0 = 0 +4:13/0/z_index = 1 +5:13/0 = 0 +5:13/0/z_index = 1 +6:13/0 = 0 +6:13/0/z_index = 1 +7:13/0 = 0 +7:13/0/z_index = 1 +8:13/0 = 0 +8:13/0/z_index = 1 +0:14/0 = 0 +0:14/0/z_index = 1 +1:14/0 = 0 +1:14/0/z_index = 1 +2:14/0 = 0 +2:14/0/z_index = 1 +3:14/0 = 0 +3:14/0/z_index = 1 +4:14/0 = 0 +4:14/0/z_index = 1 +6:14/0 = 0 +6:14/0/z_index = 1 +7:14/0 = 0 +7:14/0/z_index = 1 +0:15/0 = 0 +1:15/0 = 0 +1:15/0/z_index = 1 +2:15/0 = 0 +2:15/0/z_index = 1 +3:15/0 = 0 +3:15/0/z_index = 1 +4:15/0 = 0 +4:15/0/z_index = 1 +6:15/0 = 0 +6:15/0/z_index = 1 +7:15/0 = 0 +7:15/0/z_index = 1 +0:16/0 = 0 +0:16/0/z_index = 1 +1:16/0 = 0 +1:16/0/z_index = 1 +2:16/0 = 0 +2:16/0/z_index = 1 +3:16/0 = 0 +3:16/0/z_index = 1 +4:16/0 = 0 +4:16/0/z_index = 1 +2:17/0 = 0 +2:17/0/z_index = 1 +3:17/0 = 0 +3:17/0/z_index = 1 +10:1/size_in_atlas = Vector2i(3, 3) +10:1/0 = 0 +13:1/size_in_atlas = Vector2i(3, 3) +13:1/0 = 0 +16:4/size_in_atlas = Vector2i(1, 3) +16:4/0 = 0 +15:4/size_in_atlas = Vector2i(1, 3) +15:4/0 = 0 +17:4/size_in_atlas = Vector2i(1, 3) +17:4/0 = 0 +18:4/size_in_atlas = Vector2i(1, 3) +18:4/0 = 0 + +[sub_resource type="TileSet" id="TileSet_5bd38"] +physics_layer_0/collision_layer = 1 +navigation_layer_0/layers = 1 +sources/0 = SubResource("TileSetAtlasSource_q4fiy") + +[node name="HouseTemplate" type="Node2D"] +script = ExtResource("1_877m4") + +[node name="TileMapLayer" type="TileMapLayer" parent="."] +rotation = -0.000322629 +tile_map_data = PackedByteArray("AAAIAAIAAAACAAEAAAAIAAMAAAACAAEAAAAIAAQAAAACAAEAAAAIAAUAAAACAAEAAAAIAAYAAAACAAEAAAAIAAcAAAACAAEAAAAIAAgAAAACAAEAAAAIAAkAAAACAAEAAAAJAAoAAAACAAEAAAAJAAsAAAACAAEAAAAJAAwAAAACAAEAAAAKAA0AAAACAAEAAAALAA4AAAACAAEAAAAMAA8AAAACAAEAAAANAA8AAAACAAEAAAANABAAAAACAAEAAAAOABAAAAACAAEAAAAPABAAAAACAAEAAAAQABAAAAACAAEAAAARABAAAAACAAEAAAASABAAAAACAAEAAAATABAAAAACAAEAAAAUABAAAAACAAEAAAAVABAAAAACAAEAAAAWABAAAAACAAEAAAAWAA8AAAACAAEAAAAWAAwAAAACAAEAAAAWAAsAAAACAAEAAAAVAAoAAAACAAEAAAAUAAoAAAACAAEAAAATAAkAAAACAAEAAAASAAkAAAACAAEAAAARAAgAAAACAAEAAAAQAAgAAAACAAEAAAAPAAgAAAACAAEAAAAOAAgAAAACAAEAAAANAAcAAAACAAEAAAAMAAcAAAACAAEAAAALAAcAAAACAAEAAAAKAAcAAAACAAEAAAAJAAcAAAACAAEAAAAHAAkAAAACAAEAAAAHAAoAAAACAAEAAAAHAAsAAAACAAEAAAAHAAwAAAACAAEAAAAHAA0AAAACAAEAAAAHAA4AAAACAAEAAAAHAA8AAAACAAEAAAAIABAAAAACAAEAAAAJABAAAAACAAEAAAAKABEAAAACAAEAAAALABIAAAACAAEAAAAMABMAAAACAAEAAAANABMAAAACAAEAAAAOABMAAAACAAEAAAAPABMAAAACAAEAAAAQABQAAAACAAEAAAARABQAAAACAAEAAAASABQAAAACAAEAAAATABQAAAACAAEAAAAUABQAAAACAAEAAAAVABQAAAACAAEAAAAWABQAAAACAAEAAAAVAAwAAAACAAEAAAAUAA0AAAACAAEAAAAUAA4AAAACAAEAAAATAA8AAAACAAEAAAATABEAAAACAAEAAAATABIAAAACAAEAAAAUABMAAAACAAEAAAAWABUAAAACAAEAAAAAAAAAAAACAAEAAAAAAAEAAAACAAEAAAAAAAIAAAACAAEAAAAAAAMAAAACAAEAAAAAAAQAAAACAAEAAAAAAAUAAAACAAEAAAAAAAYAAAACAAEAAAAAAAcAAAACAAEAAAAAAAgAAAACAAEAAAAAAAkAAAACAAEAAAAAAAoAAAACAAEAAAAAAAsAAAACAAEAAAAAAAwAAAACAAEAAAAAAA0AAAACAAEAAAAAAA4AAAACAAEAAAAAAA8AAAACAAEAAAAAABAAAAACAAEAAAAAABEAAAACAAEAAAAAABIAAAACAAEAAAAAABMAAAACAAEAAAAAABQAAAACAAEAAAAAABUAAAACAAEAAAAAABYAAAACAAEAAAAAABcAAAACAAEAAAAAABgAAAACAAEAAAAAABkAAAACAAEAAAAAABoAAAACAAEAAAAAABsAAAACAAEAAAAAABwAAAACAAEAAAAAAB0AAAACAAEAAAAAAB4AAAACAAEAAAAAAB8AAAACAAEAAAAAACAAAAACAAEAAAAAACEAAAACAAEAAAAAACIAAAACAAEAAAAAACMAAAACAAEAAAAAACQAAAACAAEAAAAAACUAAAACAAEAAAAAACYAAAACAAEAAAAAACcAAAACAAEAAAAAACgAAAACAAEAAAABAAAAAAACAAEAAAABAAEAAAACAAEAAAABAAIAAAACAAEAAAABAAMAAAACAAEAAAABAAQAAAACAAEAAAABAAUAAAACAAEAAAABAAYAAAACAAEAAAABAAcAAAACAAEAAAABAAgAAAACAAEAAAABAAkAAAACAAEAAAABAAoAAAACAAEAAAABAAsAAAACAAEAAAABAAwAAAACAAEAAAABAA0AAAACAAEAAAABAA4AAAACAAEAAAABAA8AAAACAAEAAAABABAAAAACAAEAAAABABEAAAACAAEAAAABABIAAAACAAEAAAABABMAAAACAAEAAAABABQAAAACAAEAAAABABUAAAACAAEAAAABABYAAAACAAEAAAABABcAAAACAAEAAAABABgAAAACAAEAAAABABkAAAACAAEAAAABABoAAAACAAEAAAABABsAAAACAAEAAAABABwAAAACAAEAAAABAB0AAAACAAEAAAABAB4AAAACAAEAAAABAB8AAAACAAEAAAABACAAAAACAAEAAAABACEAAAACAAEAAAABACIAAAACAAEAAAABACMAAAACAAEAAAABACQAAAACAAEAAAABACUAAAACAAEAAAABACYAAAACAAEAAAABACcAAAACAAEAAAABACgAAAACAAEAAAACAAAAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAAACAAEAAAACAAMAAAACAAEAAAACAAQAAAACAAEAAAACAAUAAAACAAEAAAACAAYAAAACAAEAAAACAAcAAAACAAEAAAACAAgAAAACAAEAAAACAAkAAAACAAEAAAACAAoAAAACAAEAAAACAAsAAAACAAEAAAACAAwAAAACAAEAAAACAA0AAAACAAEAAAACAA4AAAACAAEAAAACAA8AAAACAAEAAAACABAAAAACAAEAAAACABEAAAACAAEAAAACABIAAAACAAEAAAACABMAAAACAAEAAAACABQAAAACAAEAAAACABUAAAACAAEAAAACABYAAAACAAEAAAACABcAAAACAAEAAAACABgAAAACAAEAAAACABkAAAACAAEAAAACABoAAAACAAEAAAACABsAAAACAAEAAAACABwAAAACAAEAAAACAB0AAAACAAEAAAACAB4AAAACAAEAAAACAB8AAAACAAEAAAACACAAAAACAAEAAAACACEAAAACAAEAAAACACIAAAACAAEAAAACACMAAAACAAEAAAACACQAAAACAAEAAAACACUAAAACAAEAAAACACYAAAACAAEAAAACACcAAAACAAEAAAACACgAAAACAAEAAAADAAAAAAACAAEAAAADAAEAAAACAAEAAAADAAIAAAACAAEAAAADAAMAAAACAAEAAAADAAQAAAACAAEAAAADAAUAAAACAAEAAAADAAYAAAACAAEAAAADAAcAAAACAAEAAAADAAgAAAACAAEAAAADAAkAAAACAAEAAAADAAoAAAACAAEAAAADAAsAAAACAAEAAAADAAwAAAACAAEAAAADAA0AAAACAAEAAAADAA4AAAACAAEAAAADAA8AAAACAAEAAAADABAAAAACAAEAAAADABEAAAACAAEAAAADABIAAAACAAEAAAADABMAAAACAAEAAAADABQAAAACAAEAAAADABUAAAACAAEAAAADABYAAAACAAEAAAADABcAAAACAAEAAAADABgAAAACAAEAAAADABkAAAACAAEAAAADABoAAAACAAEAAAADABsAAAACAAEAAAADABwAAAACAAEAAAADAB0AAAACAAEAAAADAB4AAAACAAEAAAADAB8AAAACAAEAAAADACAAAAACAAEAAAADACEAAAACAAEAAAADACIAAAACAAEAAAADACMAAAACAAEAAAADACQAAAACAAEAAAADACUAAAACAAEAAAADACYAAAACAAEAAAADACcAAAACAAEAAAADACgAAAACAAEAAAAEAAAAAAACAAEAAAAEAAEAAAACAAEAAAAEAAIAAAACAAEAAAAEAAMAAAACAAEAAAAEAAQAAAACAAEAAAAEAAUAAAACAAEAAAAEAAYAAAACAAEAAAAEAAcAAAACAAEAAAAEAAgAAAACAAEAAAAEAAkAAAACAAEAAAAEAAoAAAACAAEAAAAEAAsAAAACAAEAAAAEAAwAAAACAAEAAAAEAA0AAAACAAEAAAAEAA4AAAACAAEAAAAEAA8AAAACAAEAAAAEABAAAAACAAEAAAAEABEAAAACAAEAAAAEABIAAAACAAEAAAAEABMAAAACAAEAAAAEABQAAAACAAEAAAAEABUAAAACAAEAAAAEABYAAAACAAEAAAAEABcAAAACAAEAAAAEABgAAAACAAEAAAAEABkAAAACAAEAAAAEABoAAAACAAEAAAAEABsAAAACAAEAAAAEABwAAAACAAEAAAAEAB0AAAACAAEAAAAEAB4AAAACAAEAAAAEAB8AAAACAAEAAAAEACAAAAACAAEAAAAEACEAAAACAAEAAAAEACIAAAACAAEAAAAEACMAAAACAAEAAAAEACQAAAACAAEAAAAEACUAAAACAAEAAAAEACYAAAACAAEAAAAEACcAAAACAAEAAAAEACgAAAACAAEAAAAFAAAAAAACAAEAAAAFAAEAAAACAAEAAAAFAAIAAAACAAEAAAAFAAMAAAACAAEAAAAFAAQAAAACAAEAAAAFAAUAAAACAAEAAAAFAAYAAAACAAEAAAAFAAcAAAACAAEAAAAFAAgAAAACAAEAAAAFAAkAAAACAAEAAAAFAAoAAAACAAEAAAAFAAsAAAACAAEAAAAFAAwAAAACAAEAAAAFAA0AAAACAAEAAAAFAA4AAAACAAEAAAAFAA8AAAACAAEAAAAFABAAAAACAAEAAAAFABEAAAACAAEAAAAFABIAAAACAAEAAAAFABMAAAACAAEAAAAFABQAAAACAAEAAAAFABUAAAACAAEAAAAFABYAAAACAAEAAAAFABcAAAACAAEAAAAFABgAAAACAAEAAAAFABkAAAACAAEAAAAFABoAAAACAAEAAAAFABsAAAACAAEAAAAFABwAAAACAAEAAAAFAB0AAAACAAEAAAAFAB4AAAACAAEAAAAFAB8AAAACAAEAAAAFACAAAAACAAEAAAAFACEAAAACAAEAAAAFACIAAAACAAEAAAAFACMAAAACAAEAAAAFACQAAAACAAEAAAAFACUAAAACAAEAAAAFACYAAAACAAEAAAAFACcAAAACAAEAAAAFACgAAAACAAEAAAAGAAAAAAACAAEAAAAGAAEAAAACAAEAAAAGAAIAAAACAAEAAAAGAAMAAAACAAEAAAAGAAQAAAACAAEAAAAGAAUAAAACAAEAAAAGAAYAAAACAAEAAAAGAAcAAAACAAEAAAAGAAgAAAACAAEAAAAGAAkAAAACAAEAAAAGAAoAAAACAAEAAAAGAAsAAAACAAEAAAAGAAwAAAACAAEAAAAGAA0AAAACAAEAAAAGAA4AAAACAAEAAAAGAA8AAAACAAEAAAAGABAAAAACAAEAAAAGABEAAAACAAEAAAAGABIAAAACAAEAAAAGABMAAAACAAEAAAAGABQAAAACAAEAAAAGABUAAAACAAEAAAAGABYAAAACAAEAAAAGABcAAAACAAEAAAAGABgAAAACAAEAAAAGABkAAAACAAEAAAAGABoAAAACAAEAAAAGABsAAAACAAEAAAAGABwAAAACAAEAAAAGAB0AAAACAAEAAAAGAB4AAAACAAEAAAAGAB8AAAACAAEAAAAGACAAAAACAAEAAAAGACEAAAACAAEAAAAGACIAAAACAAEAAAAGACMAAAACAAEAAAAGACQAAAACAAEAAAAGACUAAAACAAEAAAAGACYAAAACAAEAAAAGACcAAAACAAEAAAAGACgAAAACAAEAAAAHAAAAAAACAAEAAAAHAAEAAAACAAEAAAAHAAIAAAACAAEAAAAHAAMAAAACAAEAAAAHAAQAAAACAAEAAAAHAAUAAAACAAEAAAAHAAYAAAACAAEAAAAHAAcAAAACAAEAAAAHAAgAAAACAAEAAAAHABAAAAACAAEAAAAHABEAAAACAAEAAAAHABIAAAACAAEAAAAHABMAAAACAAEAAAAHABQAAAACAAEAAAAHABUAAAACAAEAAAAHABYAAAACAAEAAAAHABcAAAACAAEAAAAHABgAAAACAAEAAAAHABkAAAACAAEAAAAHABoAAAACAAEAAAAHABsAAAACAAEAAAAHABwAAAACAAEAAAAHAB0AAAACAAEAAAAHAB4AAAACAAEAAAAHAB8AAAACAAEAAAAHACAAAAACAAEAAAAHACEAAAACAAEAAAAHACIAAAACAAEAAAAHACMAAAACAAEAAAAHACQAAAACAAEAAAAHACUAAAACAAEAAAAHACYAAAACAAEAAAAHACcAAAACAAEAAAAHACgAAAACAAEAAAAIAAAAAAACAAEAAAAIAAEAAAACAAEAAAAIAAoAAAACAAEAAAAIAAsAAAACAAEAAAAIAAwAAAACAAEAAAAIAA0AAAACAAEAAAAIAA4AAAACAAEAAAAIAA8AAAACAAEAAAAIABEAAAACAAEAAAAIABIAAAACAAEAAAAIABMAAAACAAEAAAAIABQAAAACAAEAAAAIABUAAAACAAEAAAAIABYAAAACAAEAAAAIABcAAAACAAEAAAAIABgAAAACAAEAAAAIABkAAAACAAEAAAAIABoAAAACAAEAAAAIABsAAAACAAEAAAAIABwAAAACAAEAAAAIAB0AAAACAAEAAAAIAB4AAAACAAEAAAAIAB8AAAACAAEAAAAIACAAAAACAAEAAAAIACEAAAACAAEAAAAIACIAAAACAAEAAAAIACMAAAACAAEAAAAIACQAAAACAAEAAAAIACUAAAACAAEAAAAIACYAAAACAAEAAAAIACcAAAACAAEAAAAIACgAAAACAAEAAAAJAAAAAAACAAEAAAAJAAEAAAACAAEAAAAJAAIAAAACAAEAAAAJAAMAAAACAAEAAAAJAAQAAAACAAEAAAAJAAUAAAACAAEAAAAJAAYAAAACAAEAAAAJAAgAAAACAAEAAAAJAAkAAAACAAEAAAAJAA0AAAACAAEAAAAJAA4AAAACAAEAAAAJAA8AAAACAAEAAAAJABEAAAACAAEAAAAJABIAAAACAAEAAAAJABMAAAACAAEAAAAJABQAAAACAAEAAAAJABUAAAACAAEAAAAJABYAAAACAAEAAAAJABcAAAACAAEAAAAJABgAAAACAAEAAAAJABkAAAACAAEAAAAJABoAAAACAAEAAAAJABsAAAACAAEAAAAJABwAAAACAAEAAAAJAB0AAAACAAEAAAAJAB4AAAACAAEAAAAJAB8AAAACAAEAAAAJACAAAAACAAEAAAAJACEAAAACAAEAAAAJACIAAAACAAEAAAAJACMAAAACAAEAAAAJACQAAAACAAEAAAAJACUAAAACAAEAAAAJACYAAAACAAEAAAAJACcAAAACAAEAAAAJACgAAAACAAEAAAAKAAAAAAACAAEAAAAKAAEAAAACAAEAAAAKAAIAAAACAAEAAAAKAAMAAAACAAEAAAAKAAQAAAACAAEAAAAKAAUAAAACAAEAAAAKAAYAAAACAAEAAAAKAAgAAAACAAEAAAAKAAkAAAACAAEAAAAKAAoAAAACAAEAAAAKAAsAAAACAAEAAAAKAAwAAAACAAEAAAAKAA4AAAACAAEAAAAKAA8AAAACAAEAAAAKABAAAAACAAEAAAAKABIAAAACAAEAAAAKABMAAAACAAEAAAAKABQAAAACAAEAAAAKABUAAAACAAEAAAAKABYAAAACAAEAAAAKABcAAAACAAEAAAAKABgAAAACAAEAAAAKABkAAAACAAEAAAAKABoAAAACAAEAAAAKABsAAAACAAEAAAAKABwAAAACAAEAAAAKAB0AAAACAAEAAAAKAB4AAAACAAEAAAAKAB8AAAACAAEAAAAKACAAAAACAAEAAAAKACEAAAACAAEAAAAKACIAAAACAAEAAAAKACMAAAACAAEAAAAKACQAAAACAAEAAAAKACUAAAACAAEAAAAKACYAAAACAAEAAAAKACcAAAACAAEAAAAKACgAAAACAAEAAAALAAAAAAACAAEAAAALAAEAAAACAAEAAAALAAIAAAACAAEAAAALAAMAAAACAAEAAAALAAQAAAACAAEAAAALAAUAAAACAAEAAAALAAYAAAACAAEAAAALAAgAAAACAAEAAAALAAkAAAACAAEAAAALAAoAAAACAAEAAAALAAsAAAACAAEAAAALAAwAAAACAAEAAAALAA0AAAACAAEAAAALAA8AAAACAAEAAAALABAAAAACAAEAAAALABEAAAACAAEAAAALABMAAAACAAEAAAALABQAAAACAAEAAAALABUAAAACAAEAAAALABYAAAACAAEAAAALABcAAAACAAEAAAALABgAAAACAAEAAAALABkAAAACAAEAAAALABoAAAACAAEAAAALABsAAAACAAEAAAALABwAAAACAAEAAAALAB0AAAACAAEAAAALAB4AAAACAAEAAAALAB8AAAACAAEAAAALACAAAAACAAEAAAALACEAAAACAAEAAAALACIAAAACAAEAAAALACMAAAACAAEAAAALACQAAAACAAEAAAALACUAAAACAAEAAAALACYAAAACAAEAAAALACcAAAACAAEAAAALACgAAAACAAEAAAAMAAAAAAACAAEAAAAMAAEAAAACAAEAAAAMAAIAAAACAAEAAAAMAAMAAAACAAEAAAAMAAQAAAACAAEAAAAMAAUAAAACAAEAAAAMAAYAAAACAAEAAAAMAAgAAAACAAEAAAAMAAkAAAACAAEAAAAMAAoAAAACAAEAAAAMAAsAAAACAAEAAAAMAAwAAAACAAEAAAAMAA0AAAACAAEAAAAMAA4AAAACAAEAAAAMABAAAAACAAEAAAAMABEAAAACAAEAAAAMABIAAAACAAEAAAAMABQAAAACAAEAAAAMABUAAAACAAEAAAAMABYAAAACAAEAAAAMABcAAAACAAEAAAAMABgAAAACAAEAAAAMABkAAAACAAEAAAAMABoAAAACAAEAAAAMABsAAAACAAEAAAAMABwAAAACAAEAAAAMAB0AAAACAAEAAAAMAB4AAAACAAEAAAAMAB8AAAACAAEAAAAMACAAAAACAAEAAAAMACEAAAACAAEAAAAMACIAAAACAAEAAAAMACMAAAACAAEAAAAMACQAAAACAAEAAAAMACUAAAACAAEAAAAMACYAAAACAAEAAAAMACcAAAACAAEAAAAMACgAAAACAAEAAAANAAAAAAACAAEAAAANAAEAAAACAAEAAAANAAIAAAACAAEAAAANAAMAAAACAAEAAAANAAQAAAACAAEAAAANAAUAAAACAAEAAAANAAYAAAACAAEAAAANAAgAAAACAAEAAAANAAkAAAACAAEAAAANAAoAAAACAAEAAAANAAsAAAACAAEAAAANAAwAAAACAAEAAAANAA0AAAACAAEAAAANAA4AAAACAAEAAAANABEAAAACAAEAAAANABIAAAACAAEAAAANABQAAAACAAEAAAANABUAAAACAAEAAAANABYAAAACAAEAAAANABcAAAACAAEAAAANABgAAAACAAEAAAANABkAAAACAAEAAAANABoAAAACAAEAAAANABsAAAACAAEAAAANABwAAAACAAEAAAANAB0AAAACAAEAAAANAB4AAAACAAEAAAANAB8AAAACAAEAAAANACAAAAACAAEAAAANACEAAAACAAEAAAANACIAAAACAAEAAAANACMAAAACAAEAAAANACQAAAACAAEAAAANACUAAAACAAEAAAANACYAAAACAAEAAAANACcAAAACAAEAAAANACgAAAACAAEAAAAOAAAAAAACAAEAAAAOAAEAAAACAAEAAAAOAAIAAAACAAEAAAAOAAMAAAACAAEAAAAOAAQAAAACAAEAAAAOAAUAAAACAAEAAAAOAAYAAAACAAEAAAAOAAcAAAACAAEAAAAOAAkAAAACAAEAAAAOAAoAAAACAAEAAAAOAAsAAAACAAEAAAAOAAwAAAACAAEAAAAOAA0AAAACAAEAAAAOAA4AAAACAAEAAAAOAA8AAAACAAEAAAAOABEAAAACAAEAAAAOABIAAAACAAEAAAAOABQAAAACAAEAAAAOABUAAAACAAEAAAAOABYAAAACAAEAAAAOABcAAAACAAEAAAAOABgAAAACAAEAAAAOABkAAAACAAEAAAAOABoAAAACAAEAAAAOABsAAAACAAEAAAAOABwAAAACAAEAAAAOAB0AAAACAAEAAAAOAB4AAAACAAEAAAAOAB8AAAACAAEAAAAOACAAAAACAAEAAAAOACEAAAACAAEAAAAOACIAAAACAAEAAAAOACMAAAACAAEAAAAOACQAAAACAAEAAAAOACUAAAACAAEAAAAOACYAAAACAAEAAAAOACcAAAACAAEAAAAOACgAAAACAAEAAAAPAAAAAAACAAEAAAAPAAEAAAACAAEAAAAPAAIAAAACAAEAAAAPAAMAAAACAAEAAAAPAAQAAAACAAEAAAAPAAUAAAACAAEAAAAPAAYAAAACAAEAAAAPAAcAAAACAAEAAAAPAAkAAAACAAEAAAAPAAoAAAACAAEAAAAPAAsAAAACAAEAAAAPAAwAAAACAAEAAAAPAA0AAAACAAEAAAAPAA4AAAACAAEAAAAPAA8AAAACAAEAAAAPABEAAAACAAEAAAAPABIAAAACAAEAAAAPABQAAAACAAEAAAAPABUAAAACAAEAAAAPABYAAAACAAEAAAAPABcAAAACAAEAAAAPABgAAAACAAEAAAAPABkAAAACAAEAAAAPABoAAAACAAEAAAAPABsAAAACAAEAAAAPABwAAAACAAEAAAAPAB0AAAACAAEAAAAPAB4AAAACAAEAAAAPAB8AAAACAAEAAAAPACAAAAACAAEAAAAPACEAAAACAAEAAAAPACIAAAACAAEAAAAPACMAAAACAAEAAAAPACQAAAACAAEAAAAPACUAAAACAAEAAAAPACYAAAACAAEAAAAPACcAAAACAAEAAAAPACgAAAACAAEAAAAQAAAAAAACAAEAAAAQAAEAAAACAAEAAAAQAAIAAAACAAEAAAAQAAMAAAACAAEAAAAQAAQAAAACAAEAAAAQAAUAAAACAAEAAAAQAAYAAAACAAEAAAAQAAcAAAACAAEAAAAQAAkAAAACAAEAAAAQAAoAAAACAAEAAAAQAAsAAAACAAEAAAAQAAwAAAACAAEAAAAQAA0AAAACAAEAAAAQAA4AAAACAAEAAAAQAA8AAAACAAEAAAAQABEAAAACAAEAAAAQABIAAAACAAEAAAAQABMAAAACAAEAAAAQABUAAAACAAEAAAAQABYAAAACAAEAAAAQABcAAAACAAEAAAAQABgAAAACAAEAAAAQABkAAAACAAEAAAAQABoAAAACAAEAAAAQABsAAAACAAEAAAAQABwAAAACAAEAAAAQAB0AAAACAAEAAAAQAB4AAAACAAEAAAAQAB8AAAACAAEAAAAQACAAAAACAAEAAAAQACEAAAACAAEAAAAQACIAAAACAAEAAAAQACMAAAACAAEAAAAQACQAAAACAAEAAAAQACUAAAACAAEAAAAQACYAAAACAAEAAAAQACcAAAACAAEAAAAQACgAAAACAAEAAAARAAAAAAACAAEAAAARAAEAAAACAAEAAAARAAIAAAACAAEAAAARAAMAAAACAAEAAAARAAQAAAACAAEAAAARAAUAAAACAAEAAAARAAYAAAACAAEAAAARAAcAAAACAAEAAAARAAkAAAACAAEAAAARAAoAAAACAAEAAAARAAsAAAACAAEAAAARAAwAAAACAAEAAAARAA0AAAACAAEAAAARAA4AAAACAAEAAAARAA8AAAACAAEAAAARABEAAAACAAEAAAARABIAAAACAAEAAAARABMAAAACAAEAAAARABUAAAACAAEAAAARABYAAAACAAEAAAARABcAAAACAAEAAAARABgAAAACAAEAAAARABkAAAACAAEAAAARABoAAAACAAEAAAARABsAAAACAAEAAAARABwAAAACAAEAAAARAB0AAAACAAEAAAARAB4AAAACAAEAAAARAB8AAAACAAEAAAARACAAAAACAAEAAAARACEAAAACAAEAAAARACIAAAACAAEAAAARACMAAAACAAEAAAARACQAAAACAAEAAAARACUAAAACAAEAAAARACYAAAACAAEAAAARACcAAAACAAEAAAARACgAAAACAAEAAAASAAAAAAACAAEAAAASAAEAAAACAAEAAAASAAIAAAACAAEAAAASAAMAAAACAAEAAAASAAQAAAACAAEAAAASAAUAAAACAAEAAAASAAYAAAACAAEAAAASAAcAAAACAAEAAAASAAgAAAACAAEAAAASAAoAAAACAAEAAAASAAsAAAACAAEAAAASAAwAAAACAAEAAAASAA0AAAACAAEAAAASAA4AAAACAAEAAAASAA8AAAACAAEAAAASABEAAAACAAEAAAASABIAAAACAAEAAAASABMAAAACAAEAAAASABUAAAACAAEAAAASABYAAAACAAEAAAASABcAAAACAAEAAAASABgAAAACAAEAAAASABkAAAACAAEAAAASABoAAAACAAEAAAASABsAAAACAAEAAAASABwAAAACAAEAAAASAB0AAAACAAEAAAASAB4AAAACAAEAAAASAB8AAAACAAEAAAASACAAAAACAAEAAAASACEAAAACAAEAAAASACIAAAACAAEAAAASACMAAAACAAEAAAASACQAAAACAAEAAAASACUAAAACAAEAAAASACYAAAACAAEAAAASACcAAAACAAEAAAASACgAAAACAAEAAAATAAAAAAACAAEAAAATAAEAAAACAAEAAAATAAIAAAACAAEAAAATAAMAAAACAAEAAAATAAQAAAACAAEAAAATAAUAAAACAAEAAAATAAYAAAACAAEAAAATAAcAAAACAAEAAAATAAgAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAEAAAATABMAAAACAAEAAAATABUAAAACAAEAAAATABYAAAACAAEAAAATABcAAAACAAEAAAATABgAAAACAAEAAAATABkAAAACAAEAAAATABoAAAACAAEAAAATABsAAAACAAEAAAATABwAAAACAAEAAAATAB0AAAACAAEAAAATAB4AAAACAAEAAAATAB8AAAACAAEAAAATACAAAAACAAEAAAATACEAAAACAAEAAAATACIAAAACAAEAAAATACMAAAACAAEAAAATACQAAAACAAEAAAATACUAAAACAAEAAAATACYAAAACAAEAAAATACcAAAACAAEAAAATACgAAAACAAEAAAAUAAAAAAACAAEAAAAUAAEAAAACAAEAAAAUAAIAAAACAAEAAAAUAAMAAAACAAEAAAAUAAQAAAACAAEAAAAUAAUAAAACAAEAAAAUAAYAAAACAAEAAAAUAAcAAAACAAEAAAAUAAgAAAACAAEAAAAUAAkAAAACAAEAAAAUAAsAAAACAAEAAAAUAAwAAAACAAEAAAAUAA8AAAACAAEAAAAUABEAAAACAAEAAAAUABIAAAACAAEAAAAUABUAAAACAAEAAAAUABYAAAACAAEAAAAUABcAAAACAAEAAAAUABgAAAACAAEAAAAUABkAAAACAAEAAAAUABoAAAACAAEAAAAUABsAAAACAAEAAAAUABwAAAACAAEAAAAUAB0AAAACAAEAAAAUAB4AAAACAAEAAAAUAB8AAAACAAEAAAAUACAAAAACAAEAAAAUACEAAAACAAEAAAAUACIAAAACAAEAAAAUACMAAAACAAEAAAAUACQAAAACAAEAAAAUACUAAAACAAEAAAAUACYAAAACAAEAAAAUACcAAAACAAEAAAAUACgAAAACAAEAAAAVAAAAAAACAAEAAAAVAAEAAAACAAEAAAAVAAIAAAACAAEAAAAVAAMAAAACAAEAAAAVAAQAAAACAAEAAAAVAAUAAAACAAEAAAAVAAYAAAACAAEAAAAVAAcAAAACAAEAAAAVAAgAAAACAAEAAAAVAAkAAAACAAEAAAAVAAsAAAACAAEAAAAVAA0AAAACAAEAAAAVAA4AAAACAAEAAAAVAA8AAAACAAEAAAAVABEAAAACAAEAAAAVABIAAAACAAEAAAAVABMAAAACAAEAAAAVABUAAAACAAEAAAAVABYAAAACAAEAAAAVABcAAAACAAEAAAAVABgAAAACAAEAAAAVABkAAAACAAEAAAAVABoAAAACAAEAAAAVABsAAAACAAEAAAAVABwAAAACAAEAAAAVAB0AAAACAAEAAAAVAB4AAAACAAEAAAAVAB8AAAACAAEAAAAVACAAAAACAAEAAAAVACEAAAACAAEAAAAVACIAAAACAAEAAAAVACMAAAACAAEAAAAVACQAAAACAAEAAAAVACUAAAACAAEAAAAVACYAAAACAAEAAAAVACcAAAACAAEAAAAVACgAAAACAAEAAAAWAAAAAAACAAEAAAAWAAEAAAACAAEAAAAWAAIAAAACAAEAAAAWAAMAAAACAAEAAAAWAAQAAAACAAEAAAAWAAUAAAACAAEAAAAWAAYAAAACAAEAAAAWAAcAAAACAAEAAAAWAAgAAAACAAEAAAAWAAkAAAACAAEAAAAWAAoAAAACAAEAAAAWAA0AAAACAAEAAAAWAA4AAAACAAEAAAAWABEAAAACAAEAAAAWABIAAAACAAEAAAAWABMAAAACAAEAAAAWABYAAAACAAEAAAAWABcAAAACAAEAAAAWABgAAAACAAEAAAAWABkAAAACAAEAAAAWABoAAAACAAEAAAAWABsAAAACAAEAAAAWABwAAAACAAEAAAAWAB0AAAACAAEAAAAWAB4AAAACAAEAAAAWAB8AAAACAAEAAAAWACAAAAACAAEAAAAWACEAAAACAAEAAAAWACIAAAACAAEAAAAWACMAAAACAAEAAAAWACQAAAACAAEAAAAWACUAAAACAAEAAAAWACYAAAACAAEAAAAWACcAAAACAAEAAAAWACgAAAACAAEAAAAXAAAAAAACAAEAAAAXAAEAAAACAAEAAAAXAAIAAAACAAEAAAAXAAMAAAACAAEAAAAXAAQAAAACAAEAAAAXAAUAAAACAAEAAAAXABkAAAACAAEAAAAXABoAAAACAAEAAAAXABsAAAACAAEAAAAXABwAAAACAAEAAAAXAB0AAAACAAEAAAAXAB4AAAACAAEAAAAXAB8AAAACAAEAAAAXACAAAAACAAEAAAAXACEAAAACAAEAAAAXACIAAAACAAEAAAAXACMAAAACAAEAAAAXACQAAAACAAEAAAAXACUAAAACAAEAAAAXACYAAAACAAEAAAAXACcAAAACAAEAAAAXACgAAAACAAEAAAAYAAAAAAACAAEAAAAYAAEAAAACAAEAAAAYAAIAAAACAAEAAAAYAAMAAAACAAEAAAAYAAQAAAACAAEAAAAYAAUAAAACAAEAAAAYABkAAAACAAEAAAAYABoAAAACAAEAAAAYABsAAAACAAEAAAAYABwAAAACAAEAAAAYAB0AAAACAAEAAAAYAB4AAAACAAEAAAAYAB8AAAACAAEAAAAYACAAAAACAAEAAAAYACEAAAACAAEAAAAYACIAAAACAAEAAAAYACMAAAACAAEAAAAYACQAAAACAAEAAAAYACUAAAACAAEAAAAYACYAAAACAAEAAAAYACcAAAACAAEAAAAYACgAAAACAAEAAAAZAAAAAAACAAEAAAAZAAEAAAACAAEAAAAZAAIAAAACAAEAAAAZAAMAAAACAAEAAAAZAAQAAAACAAEAAAAZAAUAAAACAAEAAAAZABkAAAACAAEAAAAZABoAAAACAAEAAAAZABsAAAACAAEAAAAZABwAAAACAAEAAAAZAB0AAAACAAEAAAAZAB4AAAACAAEAAAAZAB8AAAACAAEAAAAZACAAAAACAAEAAAAZACEAAAACAAEAAAAZACIAAAACAAEAAAAZACMAAAACAAEAAAAZACQAAAACAAEAAAAZACUAAAACAAEAAAAZACYAAAACAAEAAAAZACcAAAACAAEAAAAZACgAAAACAAEAAAAaAAAAAAACAAEAAAAaAAEAAAACAAEAAAAaAAIAAAACAAEAAAAaAAMAAAACAAEAAAAaAAQAAAACAAEAAAAaAAUAAAACAAEAAAAaABkAAAACAAEAAAAaABoAAAACAAEAAAAaABsAAAACAAEAAAAaABwAAAACAAEAAAAaAB0AAAACAAEAAAAaAB4AAAACAAEAAAAaAB8AAAACAAEAAAAaACAAAAACAAEAAAAaACEAAAACAAEAAAAaACIAAAACAAEAAAAaACMAAAACAAEAAAAaACQAAAACAAEAAAAaACUAAAACAAEAAAAaACYAAAACAAEAAAAaACcAAAACAAEAAAAaACgAAAACAAEAAAAbAAAAAAACAAEAAAAbAAEAAAACAAEAAAAbAAIAAAACAAEAAAAbAAMAAAACAAEAAAAbAAQAAAACAAEAAAAbAAUAAAACAAEAAAAbABkAAAACAAEAAAAbABoAAAACAAEAAAAbABsAAAACAAEAAAAbABwAAAACAAEAAAAbAB0AAAACAAEAAAAbAB4AAAACAAEAAAAbAB8AAAACAAEAAAAbACAAAAACAAEAAAAbACEAAAACAAEAAAAbACIAAAACAAEAAAAbACMAAAACAAEAAAAbACQAAAACAAEAAAAbACUAAAACAAEAAAAbACYAAAACAAEAAAAbACcAAAACAAEAAAAbACgAAAACAAEAAAAcAAAAAAACAAEAAAAcAAEAAAACAAEAAAAcAAIAAAACAAEAAAAcAAMAAAACAAEAAAAcAAQAAAACAAEAAAAcAAUAAAACAAEAAAAcABkAAAABAAEAAAAcABoAAAABAAEAAAAcABsAAAABAAEAAAAcABwAAAABAAIAAAAcAB0AAAACAAEAAAAcAB4AAAACAAEAAAAcAB8AAAACAAEAAAAcACAAAAACAAEAAAAcACEAAAACAAEAAAAcACIAAAACAAEAAAAcACMAAAACAAEAAAAcACQAAAACAAEAAAAcACUAAAACAAEAAAAcACYAAAACAAEAAAAcACcAAAACAAEAAAAcACgAAAACAAEAAAAdAAAAAAACAAEAAAAdAAEAAAACAAEAAAAdAAIAAAACAAEAAAAdAAMAAAACAAEAAAAdAAQAAAACAAEAAAAdAAUAAAACAAEAAAAdABkAAAAAAAIAAAAdABoAAAAAAAIAAAAdABsAAAAAAAIAAAAdABwAAAACAAIAAAAdAB0AAAACAAEAAAAdAB4AAAACAAEAAAAdAB8AAAACAAEAAAAdACAAAAACAAEAAAAdACEAAAACAAEAAAAdACIAAAACAAEAAAAdACMAAAACAAEAAAAdACQAAAACAAEAAAAdACUAAAACAAEAAAAdACYAAAACAAEAAAAdACcAAAACAAEAAAAdACgAAAACAAEAAAAeAAAAAAACAAEAAAAeAAEAAAACAAEAAAAeAAIAAAACAAEAAAAeAAMAAAACAAEAAAAeAAQAAAACAAEAAAAeAAUAAAACAAEAAAAeABkAAAAAAAIAAAAeABoAAAAAAAIAAAAeABsAAAAAAAIAAAAeABwAAAACAAIAAAAeAB0AAAACAAEAAAAeAB4AAAACAAEAAAAeAB8AAAACAAEAAAAeACAAAAACAAEAAAAeACEAAAACAAEAAAAeACIAAAACAAEAAAAeACMAAAACAAEAAAAeACQAAAACAAEAAAAeACUAAAACAAEAAAAeACYAAAACAAEAAAAeACcAAAACAAEAAAAeACgAAAACAAEAAAAfAAAAAAACAAEAAAAfAAEAAAACAAEAAAAfAAIAAAACAAEAAAAfAAMAAAACAAEAAAAfAAQAAAACAAEAAAAfAAUAAAACAAEAAAAfABkAAAAAAAIAAAAfABoAAAAAAAIAAAAfABsAAAAAAAIAAAAfABwAAAACAAIAAAAfAB0AAAACAAEAAAAfAB4AAAACAAEAAAAfAB8AAAACAAEAAAAfACAAAAACAAEAAAAfACEAAAACAAEAAAAfACIAAAACAAEAAAAfACMAAAACAAEAAAAfACQAAAACAAEAAAAfACUAAAACAAEAAAAfACYAAAACAAEAAAAfACcAAAACAAEAAAAfACgAAAACAAEAAAAgAAAAAAACAAEAAAAgAAEAAAACAAEAAAAgAAIAAAACAAEAAAAgAAMAAAACAAEAAAAgAAQAAAACAAEAAAAgAAUAAAACAAEAAAAgABkAAAAAAAIAAAAgABoAAAAAAAIAAAAgABsAAAAAAAIAAAAgABwAAAACAAIAAAAgAB0AAAACAAEAAAAgAB4AAAACAAEAAAAgAB8AAAACAAEAAAAgACAAAAACAAEAAAAgACEAAAACAAEAAAAgACIAAAACAAEAAAAgACMAAAACAAEAAAAgACQAAAACAAEAAAAgACUAAAACAAEAAAAgACYAAAACAAEAAAAgACcAAAACAAEAAAAgACgAAAACAAEAAAAhAAAAAAACAAEAAAAhAAEAAAACAAEAAAAhAAIAAAACAAEAAAAhAAMAAAACAAEAAAAhAAQAAAACAAEAAAAhAAUAAAACAAEAAAAhABkAAAAAAAIAAAAhABoAAAAAAAIAAAAhABsAAAAAAAIAAAAhABwAAAACAAIAAAAhAB0AAAACAAEAAAAhAB4AAAACAAEAAAAhAB8AAAACAAEAAAAhACAAAAACAAEAAAAhACEAAAACAAEAAAAhACIAAAACAAEAAAAhACMAAAACAAEAAAAhACQAAAACAAEAAAAhACUAAAACAAEAAAAhACYAAAACAAEAAAAhACcAAAACAAEAAAAhACgAAAACAAEAAAAiAAAAAAACAAEAAAAiAAEAAAACAAEAAAAiAAIAAAACAAEAAAAiAAMAAAACAAEAAAAiAAQAAAACAAEAAAAiAAUAAAACAAEAAAAiABkAAAAAAAIAAAAiABoAAAAAAAIAAAAiABsAAAAAAAIAAAAiABwAAAACAAIAAAAiAB0AAAACAAEAAAAiAB4AAAACAAEAAAAiAB8AAAACAAEAAAAiACAAAAACAAEAAAAiACEAAAACAAEAAAAiACIAAAACAAEAAAAiACMAAAACAAEAAAAiACQAAAACAAEAAAAiACUAAAACAAEAAAAiACYAAAACAAEAAAAiACcAAAACAAEAAAAiACgAAAACAAEAAAAjAAAAAAACAAEAAAAjAAEAAAACAAEAAAAjAAIAAAACAAEAAAAjAAMAAAACAAEAAAAjAAQAAAACAAEAAAAjAAUAAAACAAEAAAAjABkAAAAAAAIAAAAjABoAAAAAAAIAAAAjABsAAAAAAAIAAAAjABwAAAAAAAAAAAAjAB0AAAACAAEAAAAjAB4AAAACAAEAAAAjAB8AAAACAAEAAAAjACAAAAACAAEAAAAjACEAAAACAAEAAAAjACIAAAACAAEAAAAjACMAAAACAAEAAAAjACQAAAACAAEAAAAjACUAAAACAAEAAAAjACYAAAACAAEAAAAjACcAAAACAAEAAAAjACgAAAACAAEAAAAkAAAAAAACAAEAAAAkAAEAAAACAAEAAAAkAAIAAAACAAEAAAAkAAMAAAACAAEAAAAkAAQAAAACAAEAAAAkAAUAAAACAAEAAAAkABkAAAAAAAIAAAAkABoAAAAAAAIAAAAkABsAAAAAAAIAAAAkABwAAAAAAAAAAAAkAB0AAAACAAEAAAAkAB4AAAACAAEAAAAkAB8AAAACAAEAAAAkACAAAAACAAEAAAAkACEAAAACAAEAAAAkACIAAAACAAEAAAAkACMAAAACAAEAAAAkACQAAAACAAEAAAAkACUAAAACAAEAAAAkACYAAAACAAEAAAAkACcAAAACAAEAAAAkACgAAAACAAEAAAAlAAAAAAACAAEAAAAlAAEAAAACAAEAAAAlAAIAAAACAAEAAAAlAAMAAAACAAEAAAAlAAQAAAACAAEAAAAlAAUAAAACAAEAAAAlABkAAAAAAAIAAAAlABoAAAAAAAIAAAAlABsAAAAAAAIAAAAlABwAAAAAAAAAAAAlAB0AAAACAAEAAAAlAB4AAAACAAEAAAAlAB8AAAACAAEAAAAlACAAAAACAAEAAAAlACEAAAACAAEAAAAlACIAAAACAAEAAAAlACMAAAACAAEAAAAlACQAAAACAAEAAAAlACUAAAACAAEAAAAlACYAAAACAAEAAAAlACcAAAACAAEAAAAlACgAAAACAAEAAAAmAAAAAAACAAEAAAAmAAEAAAACAAEAAAAmAAIAAAACAAEAAAAmAAMAAAACAAEAAAAmAAQAAAACAAEAAAAmAAUAAAACAAEAAAAmABkAAAAAAAIAAAAmABoAAAAAAAIAAAAmABsAAAAAAAIAAAAmABwAAAACAAIAAAAmAB0AAAACAAEAAAAmAB4AAAACAAEAAAAmAB8AAAACAAEAAAAmACAAAAACAAEAAAAmACEAAAACAAEAAAAmACIAAAACAAEAAAAmACMAAAACAAEAAAAmACQAAAACAAEAAAAmACUAAAACAAEAAAAmACYAAAACAAEAAAAmACcAAAACAAEAAAAmACgAAAACAAEAAAAnAAAAAAACAAEAAAAnAAEAAAACAAEAAAAnAAIAAAACAAEAAAAnAAMAAAACAAEAAAAnAAQAAAACAAEAAAAnAAUAAAACAAEAAAAnABkAAAAAAAIAAAAnABoAAAAAAAIAAAAnABsAAAAAAAIAAAAnABwAAAACAAIAAAAnAB0AAAACAAEAAAAnAB4AAAACAAEAAAAnAB8AAAACAAEAAAAnACAAAAACAAEAAAAnACEAAAACAAEAAAAnACIAAAACAAEAAAAnACMAAAACAAEAAAAnACQAAAACAAEAAAAnACUAAAACAAEAAAAnACYAAAACAAEAAAAnACcAAAACAAEAAAAnACgAAAACAAEAAAAoAAAAAAACAAEAAAAoAAEAAAACAAEAAAAoAAIAAAACAAEAAAAoAAMAAAACAAEAAAAoAAQAAAACAAEAAAAoAAUAAAACAAEAAAAoABkAAAAAAAIAAAAoABoAAAAAAAIAAAAoABsAAAAAAAIAAAAoABwAAAACAAIAAAAoAB0AAAACAAEAAAAoAB4AAAACAAEAAAAoAB8AAAACAAEAAAAoACAAAAACAAEAAAAoACEAAAACAAEAAAAoACIAAAACAAEAAAAoACMAAAACAAEAAAAoACQAAAACAAEAAAAoACUAAAACAAEAAAAoACYAAAACAAEAAAAoACcAAAACAAEAAAAoACgAAAACAAEAAAApAAAAAAACAAEAAAApAAEAAAACAAEAAAApAAIAAAACAAEAAAApAAMAAAACAAEAAAApAAQAAAACAAEAAAApAAUAAAACAAEAAAApABkAAAAAAAIAAAApABoAAAAAAAIAAAApABsAAAAAAAIAAAApABwAAAACAAIAAAApAB0AAAACAAEAAAApAB4AAAACAAEAAAApAB8AAAACAAEAAAApACAAAAACAAEAAAApACEAAAACAAEAAAApACIAAAACAAEAAAApACMAAAACAAEAAAApACQAAAACAAEAAAApACUAAAACAAEAAAApACYAAAACAAEAAAApACcAAAACAAEAAAApACgAAAACAAEAAAAqAAAAAAACAAEAAAAqAAEAAAACAAEAAAAqAAIAAAACAAEAAAAqAAMAAAACAAEAAAAqAAQAAAACAAEAAAAqAAUAAAACAAEAAAAqAAYAAAACAAEAAAAqAAcAAAACAAEAAAAqAAgAAAACAAEAAAAqAAkAAAACAAEAAAAqAAoAAAACAAEAAAAqAAsAAAACAAEAAAAqAAwAAAACAAMAAAAqAA0AAAACAAQAAAAqAA4AAAACAAUAAAAqAA8AAAAAAAIAAAAqABAAAAAAAAIAAAAqABEAAAAAAAIAAAAqABIAAAAAAAIAAAAqABMAAAAAAAIAAAAqABQAAAAAAAIAAAAqABUAAAAAAAIAAAAqABYAAAAAAAIAAAAqABcAAAAAAAIAAAAqABgAAAAAAAIAAAAqABkAAAAAAAIAAAAqABoAAAAAAAIAAAAqABsAAAAAAAIAAAAqABwAAAACAAIAAAAqAB0AAAACAAEAAAAqAB4AAAACAAEAAAAqAB8AAAACAAEAAAAqACAAAAACAAEAAAAqACEAAAACAAEAAAAqACIAAAACAAEAAAAqACMAAAACAAEAAAAqACQAAAACAAEAAAAqACUAAAACAAEAAAAqACYAAAACAAEAAAAqACcAAAACAAEAAAAqACgAAAACAAEAAAArAAAAAAACAAEAAAArAAEAAAACAAEAAAArAAIAAAACAAEAAAArAAMAAAACAAEAAAArAAQAAAACAAEAAAArAAUAAAACAAEAAAArAAYAAAACAAEAAAArAAcAAAACAAEAAAArAAgAAAACAAEAAAArAAkAAAACAAEAAAArAAoAAAACAAEAAAArAAsAAAACAAEAAAArAAwAAAADAAMAAAArAA0AAAADAAQAAAArAA4AAAADAAUAAAArAA8AAAAAAAIAAAArABAAAAAAAAIAAAArABEAAAAAAAIAAAArABIAAAAAAAIAAAArABMAAAAAAAIAAAArABQAAAAAAAIAAAArABYAAAAAAAIAAAArABcAAAAAAAIAAAArABgAAAAAAAIAAAArABkAAAAAAAIAAAArABoAAAAAAAIAAAArABsAAAAAAAIAAAArABwAAAACAAIAAAArAB0AAAACAAEAAAArAB4AAAACAAEAAAArAB8AAAACAAEAAAArACAAAAACAAEAAAArACEAAAACAAEAAAArACIAAAACAAEAAAArACMAAAACAAEAAAArACQAAAACAAEAAAArACUAAAACAAEAAAArACYAAAACAAEAAAArACcAAAACAAEAAAArACgAAAACAAEAAAAsAAAAAAACAAEAAAAsAAEAAAACAAEAAAAsAAIAAAACAAEAAAAsAAMAAAACAAEAAAAsAAQAAAACAAEAAAAsAAUAAAACAAEAAAAsAAYAAAACAAEAAAAsAAcAAAACAAEAAAAsAAgAAAACAAEAAAAsAAkAAAACAAEAAAAsAAoAAAACAAEAAAAsAAsAAAACAAEAAAAsAAwAAAACAAEAAAAsAA0AAAACAAEAAAAsAA4AAAADAAAAAAAsABAAAAADAAEAAAAsABEAAAADAAEAAAAsABIAAAADAAEAAAAsABMAAAADAAEAAAAsABQAAAADAAEAAAAsABUAAAADAAEAAAAsABYAAAADAAEAAAAsABcAAAADAAEAAAAsABgAAAADAAEAAAAsABkAAAADAAEAAAAsABoAAAADAAEAAAAsABsAAAADAAEAAAAsABwAAAADAAIAAAAsAB0AAAACAAEAAAAsAB4AAAACAAEAAAAsAB8AAAACAAEAAAAsACAAAAACAAEAAAAsACEAAAACAAEAAAAsACIAAAACAAEAAAAsACMAAAACAAEAAAAsACQAAAACAAEAAAAsACUAAAACAAEAAAAsACYAAAACAAEAAAAsACcAAAACAAEAAAAsACgAAAACAAEAAAAtAAAAAAACAAEAAAAtAAEAAAACAAEAAAAtAAIAAAACAAEAAAAtAAMAAAACAAEAAAAtAAQAAAACAAEAAAAtAAUAAAACAAEAAAAtAAYAAAACAAEAAAAtAAcAAAACAAEAAAAtAAgAAAACAAEAAAAtAAkAAAACAAEAAAAtAAoAAAACAAEAAAAtAAsAAAACAAEAAAAtAAwAAAACAAEAAAAtAA0AAAACAAEAAAAtAA4AAAACAAEAAAAtAA8AAAACAAEAAAAtABAAAAACAAEAAAAtABEAAAACAAEAAAAtABIAAAACAAEAAAAtABMAAAACAAEAAAAtABQAAAACAAEAAAAtABUAAAACAAEAAAAtABYAAAACAAEAAAAtABcAAAACAAEAAAAtABgAAAACAAEAAAAtABkAAAACAAEAAAAtABoAAAACAAEAAAAtABsAAAACAAEAAAAtABwAAAACAAEAAAAtAB0AAAACAAEAAAAtAB4AAAACAAEAAAAtAB8AAAACAAEAAAAtACAAAAACAAEAAAAtACEAAAACAAEAAAAtACIAAAACAAEAAAAtACMAAAACAAEAAAAtACQAAAACAAEAAAAtACUAAAACAAEAAAAtACYAAAACAAEAAAAtACcAAAACAAEAAAAtACgAAAACAAEAAAAuAAAAAAACAAEAAAAuAAEAAAACAAEAAAAuAAIAAAACAAEAAAAuAAMAAAACAAEAAAAuAAQAAAACAAEAAAAuAAUAAAACAAEAAAAuAAYAAAACAAEAAAAuAAcAAAACAAEAAAAuAAgAAAACAAEAAAAuAAkAAAACAAEAAAAuAAoAAAACAAEAAAAuAAsAAAACAAEAAAAuAAwAAAACAAEAAAAuAA0AAAACAAEAAAAuAA4AAAACAAEAAAAuAA8AAAACAAEAAAAuABAAAAACAAEAAAAuABEAAAACAAEAAAAuABIAAAACAAEAAAAuABMAAAACAAEAAAAuABQAAAACAAEAAAAuABUAAAACAAEAAAAuABYAAAACAAEAAAAuABcAAAACAAEAAAAuABgAAAACAAEAAAAuABkAAAACAAEAAAAuABoAAAACAAEAAAAuABsAAAACAAEAAAAuABwAAAACAAEAAAAuAB0AAAACAAEAAAAuAB4AAAACAAEAAAAuAB8AAAACAAEAAAAuACAAAAACAAEAAAAuACEAAAACAAEAAAAuACIAAAACAAEAAAAuACMAAAACAAEAAAAuACQAAAACAAEAAAAuACUAAAACAAEAAAAuACYAAAACAAEAAAAuACcAAAACAAEAAAAuACgAAAACAAEAAAAvAAAAAAACAAEAAAAvAAEAAAACAAEAAAAvAAIAAAACAAEAAAAvAAMAAAACAAEAAAAvAAQAAAACAAEAAAAvAAUAAAACAAEAAAAvAAYAAAACAAEAAAAvAAcAAAACAAEAAAAvAAgAAAACAAEAAAAvAAkAAAACAAEAAAAvAAoAAAACAAEAAAAvAAsAAAACAAEAAAAvAAwAAAACAAEAAAAvAA0AAAACAAEAAAAvAA4AAAACAAEAAAAvAA8AAAACAAEAAAAvABAAAAACAAEAAAAvABEAAAACAAEAAAAvABIAAAACAAEAAAAvABMAAAACAAEAAAAvABQAAAACAAEAAAAvABUAAAACAAEAAAAvABYAAAACAAEAAAAvABcAAAACAAEAAAAvABgAAAACAAEAAAAvABkAAAACAAEAAAAvABoAAAACAAEAAAAvABsAAAACAAEAAAAvABwAAAACAAEAAAAvAB0AAAACAAEAAAAvAB4AAAACAAEAAAAvAB8AAAACAAEAAAAvACAAAAACAAEAAAAvACEAAAACAAEAAAAvACIAAAACAAEAAAAvACMAAAACAAEAAAAvACQAAAACAAEAAAAvACUAAAACAAEAAAAvACYAAAACAAEAAAAvACcAAAACAAEAAAAvACgAAAACAAEAAAAwAAAAAAACAAEAAAAwAAEAAAACAAEAAAAwAAIAAAACAAEAAAAwAAMAAAACAAEAAAAwAAQAAAACAAEAAAAwAAUAAAACAAEAAAAwAAYAAAACAAEAAAAwAAcAAAACAAEAAAAwAAgAAAACAAEAAAAwAAkAAAACAAEAAAAwAAoAAAACAAEAAAAwAAsAAAACAAEAAAAwAAwAAAACAAEAAAAwAA0AAAACAAEAAAAwAA4AAAACAAEAAAAwAA8AAAACAAEAAAAwABAAAAACAAEAAAAwABEAAAACAAEAAAAwABIAAAACAAEAAAAwABMAAAACAAEAAAAwABQAAAACAAEAAAAwABUAAAACAAEAAAAwABYAAAACAAEAAAAwABcAAAACAAEAAAAwABgAAAACAAEAAAAwABkAAAACAAEAAAAwABoAAAACAAEAAAAwABsAAAACAAEAAAAwABwAAAACAAEAAAAwAB0AAAACAAEAAAAwAB4AAAACAAEAAAAwAB8AAAACAAEAAAAwACAAAAACAAEAAAAwACEAAAACAAEAAAAwACIAAAACAAEAAAAwACMAAAACAAEAAAAwACQAAAACAAEAAAAwACUAAAACAAEAAAAwACYAAAACAAEAAAAwACcAAAACAAEAAAAwACgAAAACAAEAAAAxAAAAAAACAAEAAAAxAAEAAAACAAEAAAAxAAIAAAACAAEAAAAxAAMAAAACAAEAAAAxAAQAAAACAAEAAAAxAAUAAAACAAEAAAAxAAYAAAACAAEAAAAxAAcAAAACAAEAAAAxAAgAAAACAAEAAAAxAAkAAAACAAEAAAAxAAoAAAACAAEAAAAxAAsAAAACAAEAAAAxAAwAAAACAAEAAAAxAA0AAAACAAEAAAAxAA4AAAACAAEAAAAxAA8AAAACAAEAAAAxABAAAAACAAEAAAAxABEAAAACAAEAAAAxABIAAAACAAEAAAAxABMAAAACAAEAAAAxABQAAAACAAEAAAAxABUAAAACAAEAAAAxABYAAAACAAEAAAAxABcAAAACAAEAAAAxABgAAAACAAEAAAAxABkAAAACAAEAAAAxABoAAAACAAEAAAAxABsAAAACAAEAAAAxABwAAAACAAEAAAAxAB0AAAACAAEAAAAxAB4AAAACAAEAAAAxAB8AAAACAAEAAAAxACAAAAACAAEAAAAxACEAAAACAAEAAAAxACIAAAACAAEAAAAxACMAAAACAAEAAAAxACQAAAACAAEAAAAxACUAAAACAAEAAAAxACYAAAACAAEAAAAxACcAAAACAAEAAAAxACgAAAACAAEAAAAyAAAAAAACAAEAAAAyAAEAAAACAAEAAAAyAAIAAAACAAEAAAAyAAMAAAACAAEAAAAyAAQAAAACAAEAAAAyAAUAAAACAAEAAAAyAAYAAAACAAEAAAAyAAcAAAACAAEAAAAyAAgAAAACAAEAAAAyAAkAAAACAAEAAAAyAAoAAAACAAEAAAAyAAsAAAACAAEAAAAyAAwAAAACAAEAAAAyAA0AAAACAAEAAAAyAA4AAAACAAEAAAAyAA8AAAACAAEAAAAyABAAAAACAAEAAAAyABEAAAACAAEAAAAyABIAAAACAAEAAAAyABMAAAACAAEAAAAyABQAAAACAAEAAAAyABUAAAACAAEAAAAyABYAAAACAAEAAAAyABcAAAACAAEAAAAyABgAAAACAAEAAAAyABkAAAACAAEAAAAyABoAAAACAAEAAAAyABsAAAACAAEAAAAyABwAAAACAAEAAAAyAB0AAAACAAEAAAAyAB4AAAACAAEAAAAyAB8AAAACAAEAAAAyACAAAAACAAEAAAAyACEAAAACAAEAAAAyACIAAAACAAEAAAAyACMAAAACAAEAAAAyACQAAAACAAEAAAAyACUAAAACAAEAAAAyACYAAAACAAEAAAAyACcAAAACAAEAAAAyACgAAAACAAEAAAAzAAAAAAACAAEAAAAzAAEAAAACAAEAAAAzAAIAAAACAAEAAAAzAAMAAAACAAEAAAAzAAQAAAACAAEAAAAzAAUAAAACAAEAAAAzAAYAAAACAAEAAAAzAAcAAAACAAEAAAAzAAgAAAACAAEAAAAzAAkAAAACAAEAAAAzAAoAAAACAAEAAAAzAAsAAAACAAEAAAAzAAwAAAACAAEAAAAzAA0AAAACAAEAAAAzAA4AAAACAAEAAAAzAA8AAAACAAEAAAAzABAAAAACAAEAAAAzABEAAAACAAEAAAAzABIAAAACAAEAAAAzABMAAAACAAEAAAAzABQAAAACAAEAAAAzABUAAAACAAEAAAAzABYAAAACAAEAAAAzABcAAAACAAEAAAAzABgAAAACAAEAAAAzABkAAAACAAEAAAAzABoAAAACAAEAAAAzABsAAAACAAEAAAAzABwAAAACAAEAAAAzAB0AAAACAAEAAAAzAB4AAAACAAEAAAAzAB8AAAACAAEAAAAzACAAAAACAAEAAAAzACEAAAACAAEAAAAzACIAAAACAAEAAAAzACMAAAACAAEAAAAzACQAAAACAAEAAAAzACUAAAACAAEAAAAzACYAAAACAAEAAAAzACcAAAACAAEAAAAzACgAAAACAAEAAAA0AAAAAAACAAEAAAA0AAEAAAACAAEAAAA0AAIAAAACAAEAAAA0AAMAAAACAAEAAAA0AAQAAAACAAEAAAA0AAUAAAACAAEAAAA0AAYAAAACAAEAAAA0AAcAAAACAAEAAAA0AAgAAAACAAEAAAA0AAkAAAACAAEAAAA0AAoAAAACAAEAAAA0AAsAAAACAAEAAAA0AAwAAAACAAEAAAA0AA0AAAACAAEAAAA0AA4AAAACAAEAAAA0AA8AAAACAAEAAAA0ABAAAAACAAEAAAA0ABEAAAACAAEAAAA0ABIAAAACAAEAAAA0ABMAAAACAAEAAAA0ABQAAAACAAEAAAA0ABUAAAACAAEAAAA0ABYAAAACAAEAAAA0ABcAAAACAAEAAAA0ABgAAAACAAEAAAA0ABkAAAACAAEAAAA0ABoAAAACAAEAAAA0ABsAAAACAAEAAAA0ABwAAAACAAEAAAA0AB0AAAACAAEAAAA0AB4AAAACAAEAAAA0AB8AAAACAAEAAAA0ACAAAAACAAEAAAA0ACEAAAACAAEAAAA0ACIAAAACAAEAAAA0ACMAAAACAAEAAAA0ACQAAAACAAEAAAA0ACUAAAACAAEAAAA0ACYAAAACAAEAAAA0ACcAAAACAAEAAAA0ACgAAAACAAEAAAA1AAAAAAACAAEAAAA1AAEAAAACAAEAAAA1AAIAAAACAAEAAAA1AAMAAAACAAEAAAA1AAQAAAACAAEAAAA1AAUAAAACAAEAAAA1AAYAAAACAAEAAAA1AAcAAAACAAEAAAA1AAgAAAACAAEAAAA1AAkAAAACAAEAAAA1AAoAAAACAAEAAAA1AAsAAAACAAEAAAA1AAwAAAACAAEAAAA1AA0AAAACAAEAAAA1AA4AAAACAAEAAAA1AA8AAAACAAEAAAA1ABAAAAACAAEAAAA1ABEAAAACAAEAAAA1ABIAAAACAAEAAAA1ABMAAAACAAEAAAA1ABQAAAACAAEAAAA1ABUAAAACAAEAAAA1ABYAAAACAAEAAAA1ABcAAAACAAEAAAA1ABgAAAACAAEAAAA1ABkAAAACAAEAAAA1ABoAAAACAAEAAAA1ABsAAAACAAEAAAA1ABwAAAACAAEAAAA1AB0AAAACAAEAAAA1AB4AAAACAAEAAAA1AB8AAAACAAEAAAA1ACAAAAACAAEAAAA1ACEAAAACAAEAAAA1ACIAAAACAAEAAAA1ACMAAAACAAEAAAA1ACQAAAACAAEAAAA1ACUAAAACAAEAAAA1ACYAAAACAAEAAAA1ACcAAAACAAEAAAA1ACgAAAACAAEAAAA2AAAAAAACAAEAAAA2AAEAAAACAAEAAAA2AAIAAAACAAEAAAA2AAMAAAACAAEAAAA2AAQAAAACAAEAAAA2AAUAAAACAAEAAAA2AAYAAAACAAEAAAA2AAcAAAACAAEAAAA2AAgAAAACAAEAAAA2AAkAAAACAAEAAAA2AAoAAAACAAEAAAA2AAsAAAACAAEAAAA2AAwAAAACAAEAAAA2AA0AAAACAAEAAAA2AA4AAAACAAEAAAA2AA8AAAACAAEAAAA2ABAAAAACAAEAAAA2ABEAAAACAAEAAAA2ABIAAAACAAEAAAA2ABMAAAACAAEAAAA2ABQAAAACAAEAAAA2ABUAAAACAAEAAAA2ABYAAAACAAEAAAA2ABcAAAACAAEAAAA2ABgAAAACAAEAAAA2ABkAAAACAAEAAAA2ABoAAAACAAEAAAA2ABsAAAACAAEAAAA2ABwAAAACAAEAAAA2AB0AAAACAAEAAAA2AB4AAAACAAEAAAA2AB8AAAACAAEAAAA2ACAAAAACAAEAAAA2ACEAAAACAAEAAAA2ACIAAAACAAEAAAA2ACMAAAACAAEAAAA2ACQAAAACAAEAAAA2ACUAAAACAAEAAAA2ACYAAAACAAEAAAA2ACcAAAACAAEAAAA2ACgAAAACAAEAAAA3AAAAAAACAAEAAAA3AAEAAAACAAEAAAA3AAIAAAACAAEAAAA3AAMAAAACAAEAAAA3AAQAAAACAAEAAAA3AAUAAAACAAEAAAA3AAYAAAACAAEAAAA3AAcAAAACAAEAAAA3AAgAAAACAAEAAAA3AAkAAAACAAEAAAA3AAoAAAACAAEAAAA3AAsAAAACAAEAAAA3AAwAAAACAAEAAAA3AA0AAAACAAEAAAA3AA4AAAACAAEAAAA3AA8AAAACAAEAAAA3ABAAAAACAAEAAAA3ABEAAAACAAEAAAA3ABIAAAACAAEAAAA3ABMAAAACAAEAAAA3ABQAAAACAAEAAAA3ABUAAAACAAEAAAA3ABYAAAACAAEAAAA3ABcAAAACAAEAAAA3ABgAAAACAAEAAAA3ABkAAAACAAEAAAA3ABoAAAACAAEAAAA3ABsAAAACAAEAAAA3ABwAAAACAAEAAAA3AB0AAAACAAEAAAA3AB4AAAACAAEAAAA3AB8AAAACAAEAAAA3ACAAAAACAAEAAAA3ACEAAAACAAEAAAA3ACIAAAACAAEAAAA3ACMAAAACAAEAAAA3ACQAAAACAAEAAAA3ACUAAAACAAEAAAA3ACYAAAACAAEAAAA3ACcAAAACAAEAAAA3ACgAAAACAAEAAAA4AAAAAAACAAEAAAA4AAEAAAACAAEAAAA4AAIAAAACAAEAAAA4AAMAAAACAAEAAAA4AAQAAAACAAEAAAA4AAUAAAACAAEAAAA4AAYAAAACAAEAAAA4AAcAAAACAAEAAAA4AAgAAAACAAEAAAA4AAkAAAACAAEAAAA4AAoAAAACAAEAAAA4AAsAAAACAAEAAAA4AAwAAAACAAEAAAA4AA0AAAACAAEAAAA4AA4AAAACAAEAAAA4AA8AAAACAAEAAAA4ABAAAAACAAEAAAA4ABEAAAACAAEAAAA4ABIAAAACAAEAAAA4ABMAAAACAAEAAAA4ABQAAAACAAEAAAA4ABUAAAACAAEAAAA4ABYAAAACAAEAAAA4ABcAAAACAAEAAAA4ABgAAAACAAEAAAA4ABkAAAACAAEAAAA4ABoAAAACAAEAAAA4ABsAAAACAAEAAAA4ABwAAAACAAEAAAA4AB0AAAACAAEAAAA4AB4AAAACAAEAAAA4AB8AAAACAAEAAAA4ACAAAAACAAEAAAA4ACEAAAACAAEAAAA4ACIAAAACAAEAAAA4ACMAAAACAAEAAAA4ACQAAAACAAEAAAA4ACUAAAACAAEAAAA4ACYAAAACAAEAAAA4ACcAAAACAAEAAAA4ACgAAAACAAEAAAA5AAAAAAACAAEAAAA5AAEAAAACAAEAAAA5AAIAAAACAAEAAAA5AAMAAAACAAEAAAA5AAQAAAACAAEAAAA5AAUAAAACAAEAAAA5AAYAAAACAAEAAAA5AAcAAAACAAEAAAA5AAgAAAACAAEAAAA5AAkAAAACAAEAAAA5AAoAAAACAAEAAAA5AAsAAAACAAEAAAA5AAwAAAACAAEAAAA5AA0AAAACAAEAAAA5AA4AAAACAAEAAAA5AA8AAAACAAEAAAA5ABAAAAACAAEAAAA5ABEAAAACAAEAAAA5ABIAAAACAAEAAAA5ABMAAAACAAEAAAA5ABQAAAACAAEAAAA5ABUAAAACAAEAAAA5ABYAAAACAAEAAAA5ABcAAAACAAEAAAA5ABgAAAACAAEAAAA5ABkAAAACAAEAAAA5ABoAAAACAAEAAAA5ABsAAAACAAEAAAA5ABwAAAACAAEAAAA5AB0AAAACAAEAAAA5AB4AAAACAAEAAAA5AB8AAAACAAEAAAA5ACAAAAACAAEAAAA5ACEAAAACAAEAAAA5ACIAAAACAAEAAAA5ACMAAAACAAEAAAA5ACQAAAACAAEAAAA5ACUAAAACAAEAAAA5ACYAAAACAAEAAAA5ACcAAAACAAEAAAA5ACgAAAACAAEAAAA6AAAAAAACAAEAAAA6AAEAAAACAAEAAAA6AAIAAAACAAEAAAA6AAMAAAACAAEAAAA6AAQAAAACAAEAAAA6AAUAAAACAAEAAAA6AAYAAAACAAEAAAA6AAcAAAACAAEAAAA6AAgAAAACAAEAAAA6AAkAAAACAAEAAAA6AAoAAAACAAEAAAA6AAsAAAACAAEAAAA6AAwAAAACAAEAAAA6AA0AAAACAAEAAAA6AA4AAAACAAEAAAA6AA8AAAACAAEAAAA6ABAAAAACAAEAAAA6ABEAAAACAAEAAAA6ABIAAAACAAEAAAA6ABMAAAACAAEAAAA6ABQAAAACAAEAAAA6ABUAAAACAAEAAAA6ABYAAAACAAEAAAA6ABcAAAACAAEAAAA6ABgAAAACAAEAAAA6ABkAAAACAAEAAAA6ABoAAAACAAEAAAA6ABsAAAACAAEAAAA6ABwAAAACAAEAAAA6AB0AAAACAAEAAAA6AB4AAAACAAEAAAA6AB8AAAACAAEAAAA6ACAAAAACAAEAAAA6ACEAAAACAAEAAAA6ACIAAAACAAEAAAA6ACMAAAACAAEAAAA6ACQAAAACAAEAAAA6ACUAAAACAAEAAAA6ACYAAAACAAEAAAA6ACcAAAACAAEAAAA6ACgAAAACAAEAAAA7AAAAAAACAAEAAAA7AAEAAAACAAEAAAA7AAIAAAACAAEAAAA7AAMAAAACAAEAAAA7AAQAAAACAAEAAAA7AAUAAAACAAEAAAA7AAYAAAACAAEAAAA7AAcAAAACAAEAAAA7AAgAAAACAAEAAAA7AAkAAAACAAEAAAA7AAoAAAACAAEAAAA7AAsAAAACAAEAAAA7AAwAAAACAAEAAAA7AA0AAAACAAEAAAA7AA4AAAACAAEAAAA7AA8AAAACAAEAAAA7ABAAAAACAAEAAAA7ABEAAAACAAEAAAA7ABIAAAACAAEAAAA7ABMAAAACAAEAAAA7ABQAAAACAAEAAAA7ABUAAAACAAEAAAA7ABYAAAACAAEAAAA7ABcAAAACAAEAAAA7ABgAAAACAAEAAAA7ABkAAAACAAEAAAA7ABoAAAACAAEAAAA7ABsAAAACAAEAAAA7ABwAAAACAAEAAAA7AB0AAAACAAEAAAA7AB4AAAACAAEAAAA7AB8AAAACAAEAAAA7ACAAAAACAAEAAAA7ACEAAAACAAEAAAA7ACIAAAACAAEAAAA7ACMAAAACAAEAAAA7ACQAAAACAAEAAAA7ACUAAAACAAEAAAA7ACYAAAACAAEAAAA7ACcAAAACAAEAAAA7ACgAAAACAAEAAAA8AAAAAAACAAEAAAA8AAEAAAACAAEAAAA8AAIAAAACAAEAAAA8AAMAAAACAAEAAAA8AAQAAAACAAEAAAA8AAUAAAACAAEAAAA8AAYAAAACAAEAAAA8AAcAAAACAAEAAAA8AAgAAAACAAEAAAA8AAkAAAACAAEAAAA8AAoAAAACAAEAAAA8AAsAAAACAAEAAAA8AAwAAAACAAEAAAA8AA0AAAACAAEAAAA8AA4AAAACAAEAAAA8AA8AAAACAAEAAAA8ABAAAAACAAEAAAA8ABEAAAACAAEAAAA8ABIAAAACAAEAAAA8ABMAAAACAAEAAAA8ABQAAAACAAEAAAA8ABUAAAACAAEAAAA8ABYAAAACAAEAAAA8ABcAAAACAAEAAAA8ABgAAAACAAEAAAA8ABkAAAACAAEAAAA8ABoAAAACAAEAAAA8ABsAAAACAAEAAAA8ABwAAAACAAEAAAA8AB0AAAACAAEAAAA8AB4AAAACAAEAAAA8AB8AAAACAAEAAAA8ACAAAAACAAEAAAA8ACEAAAACAAEAAAA8ACIAAAACAAEAAAA8ACMAAAACAAEAAAA8ACQAAAACAAEAAAA8ACUAAAACAAEAAAA8ACYAAAACAAEAAAA8ACcAAAACAAEAAAA8ACgAAAACAAEAAAA9AAAAAAACAAEAAAA9AAEAAAACAAEAAAA9AAIAAAACAAEAAAA9AAMAAAACAAEAAAA9AAQAAAACAAEAAAA9AAUAAAACAAEAAAA9AAYAAAACAAEAAAA9AAcAAAACAAEAAAA9AAgAAAACAAEAAAA9AAkAAAACAAEAAAA9AAoAAAACAAEAAAA9AAsAAAACAAEAAAA9AAwAAAACAAEAAAA9AA0AAAACAAEAAAA9AA4AAAACAAEAAAA9AA8AAAACAAEAAAA9ABAAAAACAAEAAAA9ABEAAAACAAEAAAA9ABIAAAACAAEAAAA9ABMAAAACAAEAAAA9ABQAAAACAAEAAAA9ABUAAAACAAEAAAA9ABYAAAACAAEAAAA9ABcAAAACAAEAAAA9ABgAAAACAAEAAAA9ABkAAAACAAEAAAA9ABoAAAACAAEAAAA9ABsAAAACAAEAAAA9ABwAAAACAAEAAAA9AB0AAAACAAEAAAA9AB4AAAACAAEAAAA9AB8AAAACAAEAAAA9ACAAAAACAAEAAAA9ACEAAAACAAEAAAA9ACIAAAACAAEAAAA9ACMAAAACAAEAAAA9ACQAAAACAAEAAAA9ACUAAAACAAEAAAA9ACYAAAACAAEAAAA9ACcAAAACAAEAAAA9ACgAAAACAAEAAAA+AAAAAAACAAEAAAA+AAEAAAACAAEAAAA+AAIAAAACAAEAAAA+AAMAAAACAAEAAAA+AAQAAAACAAEAAAA+AAUAAAACAAEAAAA+AAYAAAACAAEAAAA+AAcAAAACAAEAAAA+AAgAAAACAAEAAAA+AAkAAAACAAEAAAA+AAoAAAACAAEAAAA+AAsAAAACAAEAAAA+AAwAAAACAAEAAAA+AA0AAAACAAEAAAA+AA4AAAACAAEAAAA+AA8AAAACAAEAAAA+ABAAAAACAAEAAAA+ABEAAAACAAEAAAA+ABIAAAACAAEAAAA+ABMAAAACAAEAAAA+ABQAAAACAAEAAAA+ABUAAAACAAEAAAA+ABYAAAACAAEAAAA+ABcAAAACAAEAAAA+ABgAAAACAAEAAAA+ABkAAAACAAEAAAA+ABoAAAACAAEAAAA+ABsAAAACAAEAAAA+ABwAAAACAAEAAAA+AB0AAAACAAEAAAA+AB4AAAACAAEAAAA+AB8AAAACAAEAAAA+ACAAAAACAAEAAAA+ACEAAAACAAEAAAA+ACIAAAACAAEAAAA+ACMAAAACAAEAAAA+ACQAAAACAAEAAAA+ACUAAAACAAEAAAA+ACYAAAACAAEAAAA+ACcAAAACAAEAAAA+ACgAAAACAAEAAAA/AAAAAAACAAEAAAA/AAEAAAACAAEAAAA/AAIAAAACAAEAAAA/AAMAAAACAAEAAAA/AAQAAAACAAEAAAA/AAUAAAACAAEAAAA/AAYAAAACAAEAAAA/AAcAAAACAAEAAAA/AAgAAAACAAEAAAA/AAkAAAACAAEAAAA/AAoAAAACAAEAAAA/AAsAAAACAAEAAAA/AAwAAAACAAEAAAA/AA0AAAACAAEAAAA/AA4AAAACAAEAAAA/AA8AAAACAAEAAAA/ABAAAAACAAEAAAA/ABEAAAACAAEAAAA/ABIAAAACAAEAAAA/ABMAAAACAAEAAAA/ABQAAAACAAEAAAA/ABUAAAACAAEAAAA/ABYAAAACAAEAAAA/ABcAAAACAAEAAAA/ABgAAAACAAEAAAA/ABkAAAACAAEAAAA/ABoAAAACAAEAAAA/ABsAAAACAAEAAAA/ABwAAAACAAEAAAA/AB0AAAACAAEAAAA/AB4AAAACAAEAAAA/AB8AAAACAAEAAAA/ACAAAAACAAEAAAA/ACEAAAACAAEAAAA/ACIAAAACAAEAAAA/ACMAAAACAAEAAAA/ACQAAAACAAEAAAA/ACUAAAACAAEAAAA/ACYAAAACAAEAAAA/ACcAAAACAAEAAAA/ACgAAAACAAEAAABAAAAAAAACAAEAAABAAAEAAAACAAEAAABAAAIAAAACAAEAAABAAAMAAAACAAEAAABAAAQAAAACAAEAAABAAAUAAAACAAEAAABAAAYAAAACAAEAAABAAAcAAAACAAEAAABAAAgAAAACAAEAAABAAAkAAAACAAEAAABAAAoAAAACAAEAAABAAAsAAAACAAEAAABAAAwAAAACAAEAAABAAA0AAAACAAEAAABAAA4AAAACAAEAAABAAA8AAAACAAEAAABAABAAAAACAAEAAABAABEAAAACAAEAAABAABIAAAACAAEAAABAABMAAAACAAEAAABAABQAAAACAAEAAABAABUAAAACAAEAAABAABYAAAACAAEAAABAABcAAAACAAEAAABAABgAAAACAAEAAABAABkAAAACAAEAAABAABoAAAACAAEAAABAABsAAAACAAEAAABAABwAAAACAAEAAABAAB0AAAACAAEAAABAAB4AAAACAAEAAABAAB8AAAACAAEAAABAACAAAAACAAEAAABAACEAAAACAAEAAABAACIAAAACAAEAAABAACMAAAACAAEAAABAACQAAAACAAEAAABAACUAAAACAAEAAABAACYAAAACAAEAAABAACcAAAACAAEAAABAACgAAAACAAEAAABBAAAAAAACAAEAAABBAAEAAAACAAEAAABBAAIAAAACAAEAAABBAAMAAAACAAEAAABBAAQAAAACAAEAAABBAAUAAAACAAEAAABBAAYAAAACAAEAAABBAAcAAAACAAEAAABBAAgAAAACAAEAAABBAAkAAAACAAEAAABBAAoAAAACAAEAAABBAAsAAAACAAEAAABBAAwAAAACAAEAAABBAA0AAAACAAEAAABBAA4AAAACAAEAAABBAA8AAAACAAEAAABBABAAAAACAAEAAABBABEAAAACAAEAAABBABIAAAACAAEAAABBABMAAAACAAEAAABBABQAAAACAAEAAABBABUAAAACAAEAAABBABYAAAACAAEAAABBABcAAAACAAEAAABBABgAAAACAAEAAABBABkAAAACAAEAAABBABoAAAACAAEAAABBABsAAAACAAEAAABBABwAAAACAAEAAABBAB0AAAACAAEAAABBAB4AAAACAAEAAABBAB8AAAACAAEAAABBACAAAAACAAEAAABBACEAAAACAAEAAABBACIAAAACAAEAAABBACMAAAACAAEAAABBACQAAAACAAEAAABBACUAAAACAAEAAABBACYAAAACAAEAAABBACcAAAACAAEAAABBACgAAAACAAEAAABCAAAAAAACAAEAAABCAAEAAAACAAEAAABCAAIAAAACAAEAAABCAAMAAAACAAEAAABCAAQAAAACAAEAAABCAAUAAAACAAEAAABCAAYAAAACAAEAAABCAAcAAAACAAEAAABCAAgAAAACAAEAAABCAAkAAAACAAEAAABCAAoAAAACAAEAAABCAAsAAAACAAEAAABCAAwAAAACAAEAAABCAA0AAAACAAEAAABCAA4AAAACAAEAAABCAA8AAAACAAEAAABCABAAAAACAAEAAABCABEAAAACAAEAAABCABIAAAACAAEAAABCABMAAAACAAEAAABCABQAAAACAAEAAABCABUAAAACAAEAAABCABYAAAACAAEAAABCABcAAAACAAEAAABCABgAAAACAAEAAABCABkAAAACAAEAAABCABoAAAACAAEAAABCABsAAAACAAEAAABCABwAAAACAAEAAABCAB0AAAACAAEAAABCAB4AAAACAAEAAABCAB8AAAACAAEAAABCACAAAAACAAEAAABCACEAAAACAAEAAABCACIAAAACAAEAAABCACMAAAACAAEAAABCACQAAAACAAEAAABCACUAAAACAAEAAABCACYAAAACAAEAAABCACcAAAACAAEAAABCACgAAAACAAEAAABDAAAAAAACAAEAAABDAAEAAAACAAEAAABDAAIAAAACAAEAAABDAAMAAAACAAEAAABDAAQAAAACAAEAAABDAAUAAAACAAEAAABDAAYAAAACAAEAAABDAAcAAAACAAEAAABDAAgAAAACAAEAAABDAAkAAAACAAEAAABDAAoAAAACAAEAAABDAAsAAAACAAEAAABDAAwAAAACAAEAAABDAA0AAAACAAEAAABDAA4AAAACAAEAAABDAA8AAAACAAEAAABDABAAAAACAAEAAABDABEAAAACAAEAAABDABIAAAACAAEAAABDABMAAAACAAEAAABDABQAAAACAAEAAABDABUAAAACAAEAAABDABYAAAACAAEAAABDABcAAAACAAEAAABDABgAAAACAAEAAABDABkAAAACAAEAAABDABoAAAACAAEAAABDABsAAAACAAEAAABDABwAAAACAAEAAABDAB0AAAACAAEAAABDAB4AAAACAAEAAABDAB8AAAACAAEAAABDACAAAAACAAEAAABDACEAAAACAAEAAABDACIAAAACAAEAAABDACMAAAACAAEAAABDACQAAAACAAEAAABDACUAAAACAAEAAABDACYAAAACAAEAAABDACcAAAACAAEAAABDACgAAAACAAEAAABEAAAAAAACAAEAAABEAAEAAAACAAEAAABEAAIAAAACAAEAAABEAAMAAAACAAEAAABEAAQAAAACAAEAAABEAAUAAAACAAEAAABEAAYAAAACAAEAAABEAAcAAAACAAEAAABEAAgAAAACAAEAAABEAAkAAAACAAEAAABEAAoAAAACAAEAAABEAAsAAAACAAEAAABEAAwAAAACAAEAAABEAA0AAAACAAEAAABEAA4AAAACAAEAAABEAA8AAAACAAEAAABEABAAAAACAAEAAABEABEAAAACAAEAAABEABIAAAACAAEAAABEABMAAAACAAEAAABEABQAAAACAAEAAABEABUAAAACAAEAAABEABYAAAACAAEAAABEABcAAAACAAEAAABEABgAAAACAAEAAABEABkAAAACAAEAAABEABoAAAACAAEAAABEABsAAAACAAEAAABEABwAAAACAAEAAABEAB0AAAACAAEAAABEAB4AAAACAAEAAABEAB8AAAACAAEAAABEACAAAAACAAEAAABEACEAAAACAAEAAABEACIAAAACAAEAAABEACMAAAACAAEAAABEACQAAAACAAEAAABEACUAAAACAAEAAABEACYAAAACAAEAAABEACcAAAACAAEAAABEACgAAAACAAEAAABFAAAAAAACAAEAAABFAAEAAAACAAEAAABFAAIAAAACAAEAAABFAAMAAAACAAEAAABFAAQAAAACAAEAAABFAAUAAAACAAEAAABFAAYAAAACAAEAAABFAAcAAAACAAEAAABFAAgAAAACAAEAAABFAAkAAAACAAEAAABFAAoAAAACAAEAAABFAAsAAAACAAEAAABFAAwAAAACAAEAAABFAA0AAAACAAEAAABFAA4AAAACAAEAAABFAA8AAAACAAEAAABFABAAAAACAAEAAABFABEAAAACAAEAAABFABIAAAACAAEAAABFABMAAAACAAEAAABFABQAAAACAAEAAABFABUAAAACAAEAAABFABYAAAACAAEAAABFABcAAAACAAEAAABFABgAAAACAAEAAABFABkAAAACAAEAAABFABoAAAACAAEAAABFABsAAAACAAEAAABFABwAAAACAAEAAABFAB0AAAACAAEAAABFAB4AAAACAAEAAABFAB8AAAACAAEAAABFACAAAAACAAEAAABFACEAAAACAAEAAABFACIAAAACAAEAAABFACMAAAACAAEAAABFACQAAAACAAEAAABFACUAAAACAAEAAABFACYAAAACAAEAAABFACcAAAACAAEAAABFACgAAAACAAEAAABGAAAAAAACAAEAAABGAAEAAAACAAEAAABGAAIAAAACAAEAAABGAAMAAAACAAEAAABGAAQAAAACAAEAAABGAAUAAAACAAEAAABGAAYAAAACAAEAAABGAAcAAAACAAEAAABGAAgAAAACAAEAAABGAAkAAAACAAEAAABGAAoAAAACAAEAAABGAAsAAAACAAEAAABGAAwAAAACAAEAAABGAA0AAAACAAEAAABGAA4AAAACAAEAAABGAA8AAAACAAEAAABGABAAAAACAAEAAABGABEAAAACAAEAAABGABIAAAACAAEAAABGABMAAAACAAEAAABGABQAAAACAAEAAABGABUAAAACAAEAAABGABYAAAACAAEAAABGABcAAAACAAEAAABGABgAAAACAAEAAABGABkAAAACAAEAAABGABoAAAACAAEAAABGABsAAAACAAEAAABGABwAAAACAAEAAABGAB0AAAACAAEAAABGAB4AAAACAAEAAABGAB8AAAACAAEAAABGACAAAAACAAEAAABGACEAAAACAAEAAABGACIAAAACAAEAAABGACMAAAACAAEAAABGACQAAAACAAEAAABGACUAAAACAAEAAABGACYAAAACAAEAAABGACcAAAACAAEAAABGACgAAAACAAEAAABHAAAAAAACAAEAAABHAAEAAAACAAEAAABHAAIAAAACAAEAAABHAAMAAAACAAEAAABHAAQAAAACAAEAAABHAAUAAAACAAEAAABHAAYAAAACAAEAAABHAAcAAAACAAEAAABHAAgAAAACAAEAAABHAAkAAAACAAEAAABHAAoAAAACAAEAAABHAAsAAAACAAEAAABHAAwAAAACAAEAAABHAA0AAAACAAEAAABHAA4AAAACAAEAAABHAA8AAAACAAEAAABHABAAAAACAAEAAABHABEAAAACAAEAAABHABIAAAACAAEAAABHABMAAAACAAEAAABHABQAAAACAAEAAABHABUAAAACAAEAAABHABYAAAACAAEAAABHABcAAAACAAEAAABHABgAAAACAAEAAABHABkAAAACAAEAAABHABoAAAACAAEAAABHABsAAAACAAEAAABHABwAAAACAAEAAABHAB0AAAACAAEAAABHAB4AAAACAAEAAABHAB8AAAACAAEAAABHACAAAAACAAEAAABHACEAAAACAAEAAABHACIAAAACAAEAAABHACMAAAACAAEAAABHACQAAAACAAEAAABHACUAAAACAAEAAABHACYAAAACAAEAAABHACcAAAACAAEAAABHACgAAAACAAEAAAAsAA8AAAADAAEAAAArABUAAAAAAAIAAAAbAAsAAAACAAEAAAAbAAwAAAACAAEAAAAbAA0AAAACAAEAAAAbAA4AAAACAAEAAAAbAA8AAAACAAEAAAAbABAAAAACAAEAAAAbABEAAAACAAEAAAAbABIAAAACAAEAAAAbABMAAAACAAEAAAAbABQAAAACAAEAAAAbABUAAAACAAEAAAAbABYAAAACAAEAAAAbABcAAAACAAEAAAAbABgAAAACAAEAAAAcAAsAAAACAAEAAAAcAAwAAAACAAEAAAAcAA0AAAACAAEAAAAcAA4AAAABAAAAAAAcAA8AAAABAAEAAAAcABAAAAABAAEAAAAcABEAAAABAAEAAAAcABIAAAABAAEAAAAcABMAAAABAAEAAAAcABQAAAABAAEAAAAcABUAAAABAAEAAAAcABYAAAABAAEAAAAcABcAAAABAAEAAAAcABgAAAABAAEAAAAdAAsAAAACAAEAAAAdAAwAAAABAAMAAAAdAA0AAAABAAQAAAAdAA4AAAABAAUAAAAdAA8AAAAAAAIAAAAdABAAAAAAAAIAAAAdABEAAAAAAAIAAAAdABIAAAAAAAIAAAAdABMAAAAAAAIAAAAdABQAAAAAAAIAAAAdABUAAAAAAAIAAAAdABYAAAAAAAIAAAAdABcAAAAAAAIAAAAdABgAAAAAAAIAAAAeAAsAAAACAAEAAAAeAAwAAAACAAMAAAAeAA0AAAAMAAAAAAAeAA4AAAACAAUAAAAeAA8AAAAAAAIAAAAeABAAAAAAAAIAAAAeABEAAAAAAAIAAAAeABIAAAAAAAIAAAAeABMAAAAAAAIAAAAeABQAAAAAAAIAAAAeABUAAAAAAAIAAAAeABYAAAAAAAIAAAAeABcAAAAAAAIAAAAeABgAAAAAAAIAAAAfAAsAAAACAAEAAAAfAAwAAAADAAMAAAAfAA0AAAANAAAAAAAfAA4AAAADAAUAAAAfAA8AAAAAAAIAAAAfABAAAAAAAAIAAAAfABEAAAAAAAIAAAAfABIAAAAAAAIAAAAfABMAAAAAAAIAAAAfABQAAAAAAAIAAAAfABUAAAAAAAIAAAAfABYAAAAAAAIAAAAfABcAAAAAAAIAAAAfABgAAAAAAAIAAAAgAAsAAAACAAEAAAAgAAwAAAABAAMAAAAgAA0AAAACAAQAAAAgAA4AAAABAAUAAAAgAA8AAAAAAAIAAAAgABAAAAAAAAIAAAAgABEAAAAAAAIAAAAgABIAAAAAAAIAAAAgABMAAAAAAAIAAAAgABQAAAAAAAIAAAAgABUAAAAAAAIAAAAgABYAAAAAAAIAAAAgABcAAAAAAAIAAAAgABgAAAAAAAIAAAAhAAsAAAACAAEAAAAhAAwAAAACAAMAAAAhAA0AAAACAAQAAAAhAA4AAAACAAUAAAAhAA8AAAAAAAIAAAAhABAAAAAAAAIAAAAhABEAAAAAAAIAAAAhABIAAAAAAAIAAAAhABMAAAAAAAIAAAAhABQAAAAAAAIAAAAhABUAAAAAAAIAAAAhABYAAAAAAAIAAAAhABcAAAAAAAIAAAAhABgAAAAAAAIAAAAiAAsAAAACAAEAAAAiAAwAAAADAAMAAAAiAA0AAAAMAAoAAAAiAA4AAAAMAAsAAAAiAA8AAAAMAAwAAAAiABAAAAAAAAIAAAAiABEAAAAAAAIAAAAiABIAAAAAAAIAAAAiABMAAAAAAAIAAAAiABQAAAAAAAIAAAAiABUAAAAAAAIAAAAiABYAAAAAAAIAAAAiABcAAAAQAAQAAAAiABgAAAAAAAIAAAAjAAsAAAACAAEAAAAjAAwAAAACAAMAAAAjAA0AAAANAAoAAAAjAA4AAAANAAsAAAAjAA8AAAANAAwAAAAjABAAAAAAAAIAAAAjABEAAAAAAAIAAAAjABIAAAAAAAIAAAAjABMAAAAAAAIAAAAjABQAAAAAAAIAAAAjABUAAAAAAAIAAAAjABYAAAAAAAIAAAAjABcAAAAAAAIAAAAjABgAAAAAAAIAAAAkAAsAAAACAAEAAAAkAAwAAAACAAMAAAAkAA0AAAACAAQAAAAkAA4AAAACAAUAAAAkAA8AAAAAAAIAAAAkABAAAAAAAAIAAAAkABEAAAAAAAIAAAAkABIAAAAAAAIAAAAkABMAAAAAAAIAAAAkABQAAAAAAAIAAAAkABUAAAAPAAQAAAAkABYAAAAAAAIAAAAkABcAAAANAAEAAAAkABgAAAARAAQAAAAlAAsAAAACAAEAAAAlAAwAAAADAAMAAAAlAA0AAAADAAQAAAAlAA4AAAADAAUAAAAlAA8AAAAAAAIAAAAlABAAAAAAAAIAAAAlABEAAAAAAAIAAAAlABIAAAAAAAIAAAAlABMAAAAAAAIAAAAlABQAAAAAAAIAAAAlABUAAAAAAAIAAAAlABYAAAAAAAIAAAAlABcAAAAAAAIAAAAlABgAAAAAAAIAAAAmAAsAAAACAAEAAAAmAAwAAAABAAMAAAAmAA0AAAABAAQAAAAmAA4AAAABAAUAAAAmAA8AAAAAAAIAAAAmABAAAAAAAAIAAAAmABEAAAAAAAcAAAAmABIAAAAAAAgAAAAmABMAAAAAAAkAAAAmABQAAAAAAAIAAAAmABUAAAAAAAIAAAAmABYAAAAAAAIAAAAmABcAAAASAAQAAAAmABgAAAAAAAIAAAAnAAsAAAACAAEAAAAnAAwAAAACAAMAAAAnAA0AAAACAAQAAAAnAA4AAAACAAUAAAAnAA8AAAAAAAIAAAAnABAAAAAAAAIAAAAnABEAAAABAAcAAAAnABIAAAABAAgAAAAnABMAAAABAAkAAAAnABQAAAAAAAIAAAAnABUAAAAAAAIAAAAnABYAAAAAAAIAAAAnABcAAAAAAAIAAAAnABgAAAAAAAIAAAAoAAsAAAACAAEAAAAoAAwAAAADAAMAAAAoAA0AAAADAAQAAAAoAA4AAAADAAUAAAAoAA8AAAAAAAIAAAAoABAAAAAAAAIAAAAoABEAAAACAAcAAAAoABIAAAACAAgAAAAoABMAAAACAAkAAAAoABQAAAAAAAIAAAAoABUAAAAAAAIAAAAoABYAAAAAAAIAAAAoABcAAAAAAAIAAAAoABgAAAAAAAIAAAApAAsAAAACAAEAAAApAAwAAAABAAMAAAApAA0AAAABAAQAAAApAA4AAAABAAUAAAApAA8AAAATAAEAAAApABAAAAATAAIAAAApABEAAAATAAMAAAApABIAAAAAAAIAAAApABMAAAAAAAIAAAApABQAAAAAAAIAAAApABUAAAAAAAIAAAApABYAAAAAAAIAAAApABcAAAAAAAIAAAApABgAAAAAAAIAAAAXAAYAAAACAAEAAAAXAAcAAAACAAEAAAAXAAgAAAACAAEAAAAXAAkAAAACAAEAAAAXAAoAAAACAAEAAAAXAAsAAAACAAEAAAAXAAwAAAACAAEAAAAXAA0AAAACAAEAAAAXAA4AAAACAAEAAAAXAA8AAAACAAEAAAAXABAAAAACAAEAAAAXABEAAAACAAEAAAAXABIAAAACAAEAAAAYAAYAAAACAAEAAAAYAAcAAAACAAEAAAAYAAgAAAACAAEAAAAYAAkAAAACAAEAAAAYAAoAAAACAAEAAAAYAAsAAAACAAEAAAAYAAwAAAACAAEAAAAYAA0AAAACAAEAAAAYAA4AAAACAAEAAAAYAA8AAAACAAEAAAAYABAAAAACAAEAAAAYABEAAAACAAEAAAAYABIAAAACAAEAAAAZAAYAAAACAAEAAAAZAAcAAAACAAEAAAAZAAgAAAACAAEAAAAZAAkAAAACAAEAAAAZAAoAAAACAAEAAAAZAAsAAAACAAEAAAAZAAwAAAACAAEAAAAZAA0AAAACAAEAAAAZAA4AAAACAAEAAAAZAA8AAAACAAEAAAAZABAAAAACAAEAAAAZABEAAAACAAEAAAAZABIAAAACAAEAAAAaAAYAAAACAAEAAAAaAAcAAAACAAEAAAAaAAgAAAACAAEAAAAaAAkAAAACAAEAAAAaAAoAAAACAAEAAAAaAAsAAAACAAEAAAAaAAwAAAACAAEAAAAaAA0AAAACAAEAAAAaAA4AAAACAAEAAAAaAA8AAAACAAEAAAAaABAAAAACAAEAAAAaABEAAAACAAEAAAAaABIAAAACAAEAAAAbAAYAAAACAAEAAAAbAAcAAAACAAEAAAAbAAgAAAACAAEAAAAbAAkAAAACAAEAAAAbAAoAAAACAAEAAAAXABMAAAACAAEAAAAXABQAAAACAAEAAAAXABUAAAACAAEAAAAXABYAAAACAAEAAAAXABcAAAACAAEAAAAXABgAAAACAAEAAAAYABMAAAACAAEAAAAYABQAAAACAAEAAAAYABUAAAACAAEAAAAYABYAAAACAAEAAAAYABcAAAACAAEAAAAYABgAAAACAAEAAAAZABMAAAACAAEAAAAZABQAAAACAAEAAAAZABUAAAACAAEAAAAZABYAAAACAAEAAAAZABcAAAACAAEAAAAZABgAAAACAAEAAAAaABMAAAACAAEAAAAaABQAAAACAAEAAAAaABUAAAACAAEAAAAaABYAAAACAAEAAAAaABcAAAACAAEAAAAaABgAAAACAAEAAAAcAAYAAAACAAEAAAAcAAcAAAACAAEAAAAcAAgAAAACAAEAAAAcAAkAAAACAAEAAAAcAAoAAAACAAEAAAAdAAYAAAACAAEAAAAdAAcAAAACAAEAAAAdAAgAAAACAAEAAAAdAAkAAAACAAEAAAAdAAoAAAACAAEAAAAeAAYAAAACAAEAAAAeAAcAAAACAAEAAAAeAAgAAAACAAEAAAAeAAkAAAACAAEAAAAeAAoAAAACAAEAAAAfAAYAAAACAAEAAAAfAAcAAAACAAEAAAAfAAgAAAACAAEAAAAfAAkAAAACAAEAAAAfAAoAAAACAAEAAAAgAAYAAAACAAEAAAAgAAcAAAACAAEAAAAgAAgAAAACAAEAAAAgAAkAAAACAAEAAAAgAAoAAAACAAEAAAAhAAYAAAACAAEAAAAhAAcAAAACAAEAAAAhAAgAAAACAAEAAAAhAAkAAAACAAEAAAAhAAoAAAACAAEAAAAiAAYAAAACAAEAAAAiAAcAAAACAAEAAAAiAAgAAAACAAEAAAAiAAkAAAACAAEAAAAiAAoAAAACAAEAAAAjAAYAAAACAAEAAAAjAAcAAAACAAEAAAAjAAgAAAACAAEAAAAjAAkAAAACAAEAAAAjAAoAAAACAAEAAAAkAAYAAAACAAEAAAAkAAcAAAACAAEAAAAkAAgAAAACAAEAAAAkAAkAAAACAAEAAAAkAAoAAAACAAEAAAAlAAYAAAACAAEAAAAlAAcAAAACAAEAAAAlAAgAAAACAAEAAAAlAAkAAAACAAEAAAAlAAoAAAACAAEAAAAmAAYAAAACAAEAAAAmAAcAAAACAAEAAAAmAAgAAAACAAEAAAAmAAkAAAACAAEAAAAmAAoAAAACAAEAAAAnAAYAAAACAAEAAAAnAAcAAAACAAEAAAAnAAgAAAACAAEAAAAnAAkAAAACAAEAAAAnAAoAAAACAAEAAAAoAAYAAAACAAEAAAAoAAcAAAACAAEAAAAoAAgAAAACAAEAAAAoAAkAAAACAAEAAAAoAAoAAAACAAEAAAApAAYAAAACAAEAAAApAAcAAAACAAEAAAApAAgAAAACAAEAAAApAAkAAAACAAEAAAApAAoAAAACAAEAAAD0////AAACAAEAAAD1////AAACAAEAAAD1/wAAAAACAAEAAAD2/wAAAAACAAEAAAD2/wEAAAACAAEAAAD3/wIAAAACAAEAAAD4/wMAAAACAAEAAAD4/wQAAAACAAEAAAD5/wUAAAACAAEAAAD6/wYAAAACAAEAAAD6/wcAAAACAAEAAAD7/wgAAAACAAEAAAD8/wkAAAACAAEAAAD9/woAAAACAAEAAAD+/wsAAAACAAEAAAD+/wwAAAACAAEAAAD//w0AAAACAAEAAADl//T/AAACAAEAAADl//X/AAACAAEAAADl//b/AAACAAEAAADl//f/AAACAAEAAADl//j/AAACAAEAAADl//n/AAACAAEAAADl//r/AAACAAEAAADl//v/AAACAAEAAADl//z/AAACAAEAAADl//3/AAACAAEAAADl//7/AAACAAEAAADl////AAACAAEAAADl/wAAAAACAAEAAADl/wEAAAACAAEAAADl/wIAAAACAAEAAADl/wMAAAACAAEAAADl/wQAAAACAAEAAADl/wUAAAACAAEAAADl/wYAAAACAAEAAADl/wcAAAACAAEAAADl/wgAAAACAAEAAADl/wkAAAACAAEAAADl/woAAAACAAEAAADl/wsAAAACAAEAAADl/wwAAAACAAEAAADl/w0AAAACAAEAAADl/w4AAAACAAEAAADl/w8AAAACAAEAAADl/xAAAAACAAEAAADl/xEAAAACAAEAAADl/xIAAAACAAEAAADl/xMAAAACAAEAAADl/xQAAAACAAEAAADl/xUAAAACAAEAAADl/xYAAAACAAEAAADl/xcAAAACAAEAAADl/xgAAAACAAEAAADl/xkAAAACAAEAAADl/xoAAAACAAEAAADl/xsAAAACAAEAAADl/xwAAAACAAEAAADl/x0AAAACAAEAAADl/x4AAAACAAEAAADl/x8AAAACAAEAAADl/yAAAAACAAEAAADl/yEAAAACAAEAAADl/yIAAAACAAEAAADl/yMAAAACAAEAAADl/yQAAAACAAEAAADl/yUAAAACAAEAAADl/yYAAAACAAEAAADl/ycAAAACAAEAAADl/ygAAAACAAEAAADl/ykAAAACAAEAAADl/yoAAAACAAEAAADl/ysAAAACAAEAAADl/ywAAAACAAEAAADl/y0AAAACAAEAAADl/y4AAAACAAEAAADl/y8AAAACAAEAAADl/zAAAAACAAEAAADl/zEAAAACAAEAAADl/zIAAAACAAEAAADl/zMAAAACAAEAAADl/zQAAAACAAEAAADl/zUAAAACAAEAAADl/zYAAAACAAEAAADl/zcAAAACAAEAAADl/zgAAAACAAEAAADm//T/AAACAAEAAADm//X/AAACAAEAAADm//b/AAACAAEAAADm//f/AAACAAEAAADm//j/AAACAAEAAADm//n/AAACAAEAAADm//r/AAACAAEAAADm//v/AAACAAEAAADm//z/AAACAAEAAADm//3/AAACAAEAAADm//7/AAACAAEAAADm////AAACAAEAAADm/wAAAAACAAEAAADm/wEAAAACAAEAAADm/wIAAAACAAEAAADm/wMAAAACAAEAAADm/wQAAAACAAEAAADm/wUAAAACAAEAAADm/wYAAAACAAEAAADm/wcAAAACAAEAAADm/wgAAAACAAEAAADm/wkAAAACAAEAAADm/woAAAACAAEAAADm/wsAAAACAAEAAADm/wwAAAACAAEAAADm/w0AAAACAAEAAADm/w4AAAACAAEAAADm/w8AAAACAAEAAADm/xAAAAACAAEAAADm/xEAAAACAAEAAADm/xIAAAACAAEAAADm/xMAAAACAAEAAADm/xQAAAACAAEAAADm/xUAAAACAAEAAADm/xYAAAACAAEAAADm/xcAAAACAAEAAADm/xgAAAACAAEAAADm/xkAAAACAAEAAADm/xoAAAACAAEAAADm/xsAAAACAAEAAADm/xwAAAACAAEAAADm/x0AAAACAAEAAADm/x4AAAACAAEAAADm/x8AAAACAAEAAADm/yAAAAACAAEAAADm/yEAAAACAAEAAADm/yIAAAACAAEAAADm/yMAAAACAAEAAADm/yQAAAACAAEAAADm/yUAAAACAAEAAADm/yYAAAACAAEAAADm/ycAAAACAAEAAADm/ygAAAACAAEAAADm/ykAAAACAAEAAADm/yoAAAACAAEAAADm/ysAAAACAAEAAADm/ywAAAACAAEAAADm/y0AAAACAAEAAADm/y4AAAACAAEAAADm/y8AAAACAAEAAADm/zAAAAACAAEAAADm/zEAAAACAAEAAADm/zIAAAACAAEAAADm/zMAAAACAAEAAADm/zQAAAACAAEAAADm/zUAAAACAAEAAADm/zYAAAACAAEAAADm/zcAAAACAAEAAADm/zgAAAACAAEAAADn//T/AAACAAEAAADn//X/AAACAAEAAADn//b/AAACAAEAAADn//f/AAACAAEAAADn//j/AAACAAEAAADn//n/AAACAAEAAADn//r/AAACAAEAAADn//v/AAACAAEAAADn//z/AAACAAEAAADn//3/AAACAAEAAADn//7/AAACAAEAAADn////AAACAAEAAADn/wAAAAACAAEAAADn/wEAAAACAAEAAADn/wIAAAACAAEAAADn/wMAAAACAAEAAADn/wQAAAACAAEAAADn/wUAAAACAAEAAADn/wYAAAACAAEAAADn/wcAAAACAAEAAADn/wgAAAACAAEAAADn/wkAAAACAAEAAADn/woAAAACAAEAAADn/wsAAAACAAEAAADn/wwAAAACAAEAAADn/w0AAAACAAEAAADn/w4AAAACAAEAAADn/w8AAAACAAEAAADn/xAAAAACAAEAAADn/xEAAAACAAEAAADn/xIAAAACAAEAAADn/xMAAAACAAEAAADn/xQAAAACAAEAAADn/xUAAAACAAEAAADn/xYAAAACAAEAAADn/xcAAAACAAEAAADn/xgAAAACAAEAAADn/xkAAAACAAEAAADn/xoAAAACAAEAAADn/xsAAAACAAEAAADn/xwAAAACAAEAAADn/x0AAAACAAEAAADn/x4AAAACAAEAAADn/x8AAAACAAEAAADn/yAAAAACAAEAAADn/yEAAAACAAEAAADn/yIAAAACAAEAAADn/yMAAAACAAEAAADn/yQAAAACAAEAAADn/yUAAAACAAEAAADn/yYAAAACAAEAAADn/ycAAAACAAEAAADn/ygAAAACAAEAAADn/ykAAAACAAEAAADn/yoAAAACAAEAAADn/ysAAAACAAEAAADn/ywAAAACAAEAAADn/y0AAAACAAEAAADn/y4AAAACAAEAAADn/y8AAAACAAEAAADn/zAAAAACAAEAAADn/zEAAAACAAEAAADn/zIAAAACAAEAAADn/zMAAAACAAEAAADn/zQAAAACAAEAAADn/zUAAAACAAEAAADn/zYAAAACAAEAAADn/zcAAAACAAEAAADn/zgAAAACAAEAAADo//T/AAACAAEAAADo//X/AAACAAEAAADo//b/AAACAAEAAADo//f/AAACAAEAAADo//j/AAACAAEAAADo//n/AAACAAEAAADo//r/AAACAAEAAADo//v/AAACAAEAAADo//z/AAACAAEAAADo//3/AAACAAEAAADo//7/AAACAAEAAADo////AAACAAEAAADo/wAAAAACAAEAAADo/wEAAAACAAEAAADo/wIAAAACAAEAAADo/wMAAAACAAEAAADo/wQAAAACAAEAAADo/wUAAAACAAEAAADo/wYAAAACAAEAAADo/wcAAAACAAEAAADo/wgAAAACAAEAAADo/wkAAAACAAEAAADo/woAAAACAAEAAADo/wsAAAACAAEAAADo/wwAAAACAAEAAADo/w0AAAACAAEAAADo/w4AAAACAAEAAADo/w8AAAACAAEAAADo/xAAAAACAAEAAADo/xEAAAACAAEAAADo/xIAAAACAAEAAADo/xMAAAACAAEAAADo/xQAAAACAAEAAADo/xUAAAACAAEAAADo/xYAAAACAAEAAADo/xcAAAACAAEAAADo/xgAAAACAAEAAADo/xkAAAACAAEAAADo/xoAAAACAAEAAADo/xsAAAACAAEAAADo/xwAAAACAAEAAADo/x0AAAACAAEAAADo/x4AAAACAAEAAADo/x8AAAACAAEAAADo/yAAAAACAAEAAADo/yEAAAACAAEAAADo/yIAAAACAAEAAADo/yMAAAACAAEAAADo/yQAAAACAAEAAADo/yUAAAACAAEAAADo/yYAAAACAAEAAADo/ycAAAACAAEAAADo/ygAAAACAAEAAADo/ykAAAACAAEAAADo/yoAAAACAAEAAADo/ysAAAACAAEAAADo/ywAAAACAAEAAADo/y0AAAACAAEAAADo/y4AAAACAAEAAADo/y8AAAACAAEAAADo/zAAAAACAAEAAADo/zEAAAACAAEAAADo/zIAAAACAAEAAADo/zMAAAACAAEAAADo/zQAAAACAAEAAADo/zUAAAACAAEAAADo/zYAAAACAAEAAADo/zcAAAACAAEAAADo/zgAAAACAAEAAADp//T/AAACAAEAAADp//X/AAACAAEAAADp//b/AAACAAEAAADp//f/AAACAAEAAADp//j/AAACAAEAAADp//n/AAACAAEAAADp//r/AAACAAEAAADp//v/AAACAAEAAADp//z/AAACAAEAAADp//3/AAACAAEAAADp//7/AAACAAEAAADp////AAACAAEAAADp/wAAAAACAAEAAADp/wEAAAACAAEAAADp/wIAAAACAAEAAADp/wMAAAACAAEAAADp/wQAAAACAAEAAADp/wUAAAACAAEAAADp/wYAAAACAAEAAADp/wcAAAACAAEAAADp/wgAAAACAAEAAADp/wkAAAACAAEAAADp/woAAAACAAEAAADp/wsAAAACAAEAAADp/wwAAAACAAEAAADp/w0AAAACAAEAAADp/w4AAAACAAEAAADp/w8AAAACAAEAAADp/xAAAAACAAEAAADp/xEAAAACAAEAAADp/xIAAAACAAEAAADp/xMAAAACAAEAAADp/xQAAAACAAEAAADp/xUAAAACAAEAAADp/xYAAAACAAEAAADp/xcAAAACAAEAAADp/xgAAAACAAEAAADp/xkAAAACAAEAAADp/xoAAAACAAEAAADp/xsAAAACAAEAAADp/xwAAAACAAEAAADp/x0AAAACAAEAAADp/x4AAAACAAEAAADp/x8AAAACAAEAAADp/yAAAAACAAEAAADp/yEAAAACAAEAAADp/yIAAAACAAEAAADp/yMAAAACAAEAAADp/yQAAAACAAEAAADp/yUAAAACAAEAAADp/yYAAAACAAEAAADp/ycAAAACAAEAAADp/ygAAAACAAEAAADp/ykAAAACAAEAAADp/yoAAAACAAEAAADp/ysAAAACAAEAAADp/ywAAAACAAEAAADp/y0AAAACAAEAAADp/y4AAAACAAEAAADp/y8AAAACAAEAAADp/zAAAAACAAEAAADp/zEAAAACAAEAAADp/zIAAAACAAEAAADp/zMAAAACAAEAAADp/zQAAAACAAEAAADp/zUAAAACAAEAAADp/zYAAAACAAEAAADp/zcAAAACAAEAAADp/zgAAAACAAEAAADq//T/AAACAAEAAADq//X/AAACAAEAAADq//b/AAACAAEAAADq//f/AAACAAEAAADq//j/AAACAAEAAADq//n/AAACAAEAAADq//r/AAACAAEAAADq//v/AAACAAEAAADq//z/AAACAAEAAADq//3/AAACAAEAAADq//7/AAACAAEAAADq////AAACAAEAAADq/wAAAAACAAEAAADq/wEAAAACAAEAAADq/wIAAAACAAEAAADq/wMAAAACAAEAAADq/wQAAAACAAEAAADq/wUAAAACAAEAAADq/wYAAAACAAEAAADq/wcAAAACAAEAAADq/wgAAAACAAEAAADq/wkAAAACAAEAAADq/woAAAACAAEAAADq/wsAAAACAAEAAADq/wwAAAACAAEAAADq/w0AAAACAAEAAADq/w4AAAACAAEAAADq/w8AAAACAAEAAADq/xAAAAACAAEAAADq/xEAAAACAAEAAADq/xIAAAACAAEAAADq/xMAAAACAAEAAADq/xQAAAACAAEAAADq/xUAAAACAAEAAADq/xYAAAACAAEAAADq/xcAAAACAAEAAADq/xgAAAACAAEAAADq/xkAAAACAAEAAADq/xoAAAACAAEAAADq/xsAAAACAAEAAADq/xwAAAACAAEAAADq/x0AAAACAAEAAADq/x4AAAACAAEAAADq/x8AAAACAAEAAADq/yAAAAACAAEAAADq/yEAAAACAAEAAADq/yIAAAACAAEAAADq/yMAAAACAAEAAADq/yQAAAACAAEAAADq/yUAAAACAAEAAADq/yYAAAACAAEAAADq/ycAAAACAAEAAADq/ygAAAACAAEAAADq/ykAAAACAAEAAADq/yoAAAACAAEAAADq/ysAAAACAAEAAADq/ywAAAACAAEAAADq/y0AAAACAAEAAADq/y4AAAACAAEAAADq/y8AAAACAAEAAADq/zAAAAACAAEAAADq/zEAAAACAAEAAADq/zIAAAACAAEAAADq/zMAAAACAAEAAADq/zQAAAACAAEAAADq/zUAAAACAAEAAADq/zYAAAACAAEAAADq/zcAAAACAAEAAADq/zgAAAACAAEAAADr//T/AAACAAEAAADr//X/AAACAAEAAADr//b/AAACAAEAAADr//f/AAACAAEAAADr//j/AAACAAEAAADr//n/AAACAAEAAADr//r/AAACAAEAAADr//v/AAACAAEAAADr//z/AAACAAEAAADr//3/AAACAAEAAADr//7/AAACAAEAAADr////AAACAAEAAADr/wAAAAACAAEAAADr/wEAAAACAAEAAADr/wIAAAACAAEAAADr/wMAAAACAAEAAADr/wQAAAACAAEAAADr/wUAAAACAAEAAADr/wYAAAACAAEAAADr/wcAAAACAAEAAADr/wgAAAACAAEAAADr/wkAAAACAAEAAADr/woAAAACAAEAAADr/wsAAAACAAEAAADr/wwAAAACAAEAAADr/w0AAAACAAEAAADr/w4AAAACAAEAAADr/w8AAAACAAEAAADr/xAAAAACAAEAAADr/xEAAAACAAEAAADr/xIAAAACAAEAAADr/xMAAAACAAEAAADr/xQAAAACAAEAAADr/xUAAAACAAEAAADr/xYAAAACAAEAAADr/xcAAAACAAEAAADr/xgAAAACAAEAAADr/xkAAAACAAEAAADr/xoAAAACAAEAAADr/xsAAAACAAEAAADr/xwAAAACAAEAAADr/x0AAAACAAEAAADr/x4AAAACAAEAAADr/x8AAAACAAEAAADr/yAAAAACAAEAAADr/yEAAAACAAEAAADr/yIAAAACAAEAAADr/yMAAAACAAEAAADr/yQAAAACAAEAAADr/yUAAAACAAEAAADr/yYAAAACAAEAAADr/ycAAAACAAEAAADr/ygAAAACAAEAAADr/ykAAAACAAEAAADr/yoAAAACAAEAAADr/ysAAAACAAEAAADr/ywAAAACAAEAAADr/y0AAAACAAEAAADr/y4AAAACAAEAAADr/y8AAAACAAEAAADr/zAAAAACAAEAAADr/zEAAAACAAEAAADr/zIAAAACAAEAAADr/zMAAAACAAEAAADr/zQAAAACAAEAAADr/zUAAAACAAEAAADr/zYAAAACAAEAAADr/zcAAAACAAEAAADr/zgAAAACAAEAAADs//T/AAACAAEAAADs//X/AAACAAEAAADs//b/AAACAAEAAADs//f/AAACAAEAAADs//j/AAACAAEAAADs//n/AAACAAEAAADs//r/AAACAAEAAADs//v/AAACAAEAAADs//z/AAACAAEAAADs//3/AAACAAEAAADs//7/AAACAAEAAADs////AAACAAEAAADs/wAAAAACAAEAAADs/wEAAAACAAEAAADs/wIAAAACAAEAAADs/wMAAAACAAEAAADs/wQAAAACAAEAAADs/wUAAAACAAEAAADs/wYAAAACAAEAAADs/wcAAAACAAEAAADs/wgAAAACAAEAAADs/wkAAAACAAEAAADs/woAAAACAAEAAADs/wsAAAACAAEAAADs/wwAAAACAAEAAADs/w0AAAACAAEAAADs/w4AAAACAAEAAADs/w8AAAACAAEAAADs/xAAAAACAAEAAADs/xEAAAACAAEAAADs/xIAAAACAAEAAADs/xMAAAACAAEAAADs/xQAAAACAAEAAADs/xUAAAACAAEAAADs/xYAAAACAAEAAADs/xcAAAACAAEAAADs/xgAAAACAAEAAADs/xkAAAACAAEAAADs/xoAAAACAAEAAADs/xsAAAACAAEAAADs/xwAAAACAAEAAADs/x0AAAACAAEAAADs/x4AAAACAAEAAADs/x8AAAACAAEAAADs/yAAAAACAAEAAADs/yEAAAACAAEAAADs/yIAAAACAAEAAADs/yMAAAACAAEAAADs/yQAAAACAAEAAADs/yUAAAACAAEAAADs/yYAAAACAAEAAADs/ycAAAACAAEAAADs/ygAAAACAAEAAADs/ykAAAACAAEAAADs/yoAAAACAAEAAADs/ysAAAACAAEAAADs/ywAAAACAAEAAADs/y0AAAACAAEAAADs/y4AAAACAAEAAADs/y8AAAACAAEAAADs/zAAAAACAAEAAADs/zEAAAACAAEAAADs/zIAAAACAAEAAADs/zMAAAACAAEAAADs/zQAAAACAAEAAADs/zUAAAACAAEAAADs/zYAAAACAAEAAADs/zcAAAACAAEAAADs/zgAAAACAAEAAADt//T/AAACAAEAAADt//X/AAACAAEAAADt//b/AAACAAEAAADt//f/AAACAAEAAADt//j/AAACAAEAAADt//n/AAACAAEAAADt//r/AAACAAEAAADt//v/AAACAAEAAADt//z/AAACAAEAAADt//3/AAACAAEAAADt//7/AAACAAEAAADt////AAACAAEAAADt/wAAAAACAAEAAADt/wEAAAACAAEAAADt/wIAAAACAAEAAADt/wMAAAACAAEAAADt/wQAAAACAAEAAADt/wUAAAACAAEAAADt/wYAAAACAAEAAADt/wcAAAACAAEAAADt/wgAAAACAAEAAADt/wkAAAACAAEAAADt/woAAAACAAEAAADt/wsAAAACAAEAAADt/wwAAAACAAEAAADt/w0AAAACAAEAAADt/w4AAAACAAEAAADt/w8AAAACAAEAAADt/xAAAAACAAEAAADt/xEAAAACAAEAAADt/xIAAAACAAEAAADt/xMAAAACAAEAAADt/xQAAAACAAEAAADt/xUAAAACAAEAAADt/xYAAAACAAEAAADt/xcAAAACAAEAAADt/xgAAAACAAEAAADt/xkAAAACAAEAAADt/xoAAAACAAEAAADt/xsAAAACAAEAAADt/xwAAAACAAEAAADt/x0AAAACAAEAAADt/x4AAAACAAEAAADt/x8AAAACAAEAAADt/yAAAAACAAEAAADt/yEAAAACAAEAAADt/yIAAAACAAEAAADt/yMAAAACAAEAAADt/yQAAAACAAEAAADt/yUAAAACAAEAAADt/yYAAAACAAEAAADt/ycAAAACAAEAAADt/ygAAAACAAEAAADt/ykAAAACAAEAAADt/yoAAAACAAEAAADt/ysAAAACAAEAAADt/ywAAAACAAEAAADt/y0AAAACAAEAAADt/y4AAAACAAEAAADt/y8AAAACAAEAAADt/zAAAAACAAEAAADt/zEAAAACAAEAAADt/zIAAAACAAEAAADt/zMAAAACAAEAAADt/zQAAAACAAEAAADt/zUAAAACAAEAAADt/zYAAAACAAEAAADt/zcAAAACAAEAAADt/zgAAAACAAEAAADu//T/AAACAAEAAADu//X/AAACAAEAAADu//b/AAACAAEAAADu//f/AAACAAEAAADu//j/AAACAAEAAADu//n/AAACAAEAAADu//r/AAACAAEAAADu//v/AAACAAEAAADu//z/AAACAAEAAADu//3/AAACAAEAAADu//7/AAACAAEAAADu////AAACAAEAAADu/wAAAAACAAEAAADu/wEAAAACAAEAAADu/wIAAAACAAEAAADu/wMAAAACAAEAAADu/wQAAAACAAEAAADu/wUAAAACAAEAAADu/wYAAAACAAEAAADu/wcAAAACAAEAAADu/wgAAAACAAEAAADu/wkAAAACAAEAAADu/woAAAACAAEAAADu/wsAAAACAAEAAADu/wwAAAACAAEAAADu/w0AAAACAAEAAADu/w4AAAACAAEAAADu/w8AAAACAAEAAADu/xAAAAACAAEAAADu/xEAAAACAAEAAADu/xIAAAACAAEAAADu/xMAAAACAAEAAADu/xQAAAACAAEAAADu/xUAAAACAAEAAADu/xYAAAACAAEAAADu/xcAAAACAAEAAADu/xgAAAACAAEAAADu/xkAAAACAAEAAADu/xoAAAACAAEAAADu/xsAAAACAAEAAADu/xwAAAACAAEAAADu/x0AAAACAAEAAADu/x4AAAACAAEAAADu/x8AAAACAAEAAADu/yAAAAACAAEAAADu/yEAAAACAAEAAADu/yIAAAACAAEAAADu/yMAAAACAAEAAADu/yQAAAACAAEAAADu/yUAAAACAAEAAADu/yYAAAACAAEAAADu/ycAAAACAAEAAADu/ygAAAACAAEAAADu/ykAAAACAAEAAADu/yoAAAACAAEAAADu/ysAAAACAAEAAADu/ywAAAACAAEAAADu/y0AAAACAAEAAADu/y4AAAACAAEAAADu/y8AAAACAAEAAADu/zAAAAACAAEAAADu/zEAAAACAAEAAADu/zIAAAACAAEAAADu/zMAAAACAAEAAADu/zQAAAACAAEAAADu/zUAAAACAAEAAADu/zYAAAACAAEAAADu/zcAAAACAAEAAADu/zgAAAACAAEAAADv//T/AAACAAEAAADv//X/AAACAAEAAADv//b/AAACAAEAAADv//f/AAACAAEAAADv//j/AAACAAEAAADv//n/AAACAAEAAADv//r/AAACAAEAAADv//v/AAACAAEAAADv//z/AAACAAEAAADv//3/AAACAAEAAADv//7/AAACAAEAAADv////AAACAAEAAADv/wAAAAACAAEAAADv/wEAAAACAAEAAADv/wIAAAACAAEAAADv/wMAAAACAAEAAADv/wQAAAACAAEAAADv/wUAAAACAAEAAADv/wYAAAACAAEAAADv/wcAAAACAAEAAADv/wgAAAACAAEAAADv/wkAAAACAAEAAADv/woAAAACAAEAAADv/wsAAAACAAEAAADv/wwAAAACAAEAAADv/w0AAAACAAEAAADv/w4AAAACAAEAAADv/w8AAAACAAEAAADv/xAAAAACAAEAAADv/xEAAAACAAEAAADv/xIAAAACAAEAAADv/xMAAAACAAEAAADv/xQAAAACAAEAAADv/xUAAAACAAEAAADv/xYAAAACAAEAAADv/xcAAAACAAEAAADv/xgAAAACAAEAAADv/xkAAAACAAEAAADv/xoAAAACAAEAAADv/xsAAAACAAEAAADv/xwAAAACAAEAAADv/x0AAAACAAEAAADv/x4AAAACAAEAAADv/x8AAAACAAEAAADv/yAAAAACAAEAAADv/yEAAAACAAEAAADv/yIAAAACAAEAAADv/yMAAAACAAEAAADv/yQAAAACAAEAAADv/yUAAAACAAEAAADv/yYAAAACAAEAAADv/ycAAAACAAEAAADv/ygAAAACAAEAAADv/ykAAAACAAEAAADv/yoAAAACAAEAAADv/ysAAAACAAEAAADv/ywAAAACAAEAAADv/y0AAAACAAEAAADv/y4AAAACAAEAAADv/y8AAAACAAEAAADv/zAAAAACAAEAAADv/zEAAAACAAEAAADv/zIAAAACAAEAAADv/zMAAAACAAEAAADv/zQAAAACAAEAAADv/zUAAAACAAEAAADv/zYAAAACAAEAAADv/zcAAAACAAEAAADv/zgAAAACAAEAAADw//T/AAACAAEAAADw//X/AAACAAEAAADw//b/AAACAAEAAADw//f/AAACAAEAAADw//j/AAACAAEAAADw//n/AAACAAEAAADw//r/AAACAAEAAADw//v/AAACAAEAAADw//z/AAACAAEAAADw//3/AAACAAEAAADw//7/AAACAAEAAADw////AAACAAEAAADw/wAAAAACAAEAAADw/wEAAAACAAEAAADw/wIAAAACAAEAAADw/wMAAAACAAEAAADw/wQAAAACAAEAAADw/wUAAAACAAEAAADw/wYAAAACAAEAAADw/wcAAAACAAEAAADw/wgAAAACAAEAAADw/wkAAAACAAEAAADw/woAAAACAAEAAADw/wsAAAACAAEAAADw/wwAAAACAAEAAADw/w0AAAACAAEAAADw/w4AAAACAAEAAADw/w8AAAACAAEAAADw/xAAAAACAAEAAADw/xEAAAACAAEAAADw/xIAAAACAAEAAADw/xMAAAACAAEAAADw/xQAAAACAAEAAADw/xUAAAACAAEAAADw/xYAAAACAAEAAADw/xcAAAACAAEAAADw/xgAAAACAAEAAADw/xkAAAACAAEAAADw/xoAAAACAAEAAADw/xsAAAACAAEAAADw/xwAAAACAAEAAADw/x0AAAACAAEAAADw/x4AAAACAAEAAADw/x8AAAACAAEAAADw/yAAAAACAAEAAADw/yEAAAACAAEAAADw/yIAAAACAAEAAADw/yMAAAACAAEAAADw/yQAAAACAAEAAADw/yUAAAACAAEAAADw/yYAAAACAAEAAADw/ycAAAACAAEAAADw/ygAAAACAAEAAADw/ykAAAACAAEAAADw/yoAAAACAAEAAADw/ysAAAACAAEAAADw/ywAAAACAAEAAADw/y0AAAACAAEAAADw/y4AAAACAAEAAADw/y8AAAACAAEAAADw/zAAAAACAAEAAADw/zEAAAACAAEAAADw/zIAAAACAAEAAADw/zMAAAACAAEAAADw/zQAAAACAAEAAADw/zUAAAACAAEAAADw/zYAAAACAAEAAADw/zcAAAACAAEAAADw/zgAAAACAAEAAADx//T/AAACAAEAAADx//X/AAACAAEAAADx//b/AAACAAEAAADx//f/AAACAAEAAADx//j/AAACAAEAAADx//n/AAACAAEAAADx//r/AAACAAEAAADx//v/AAACAAEAAADx//z/AAACAAEAAADx//3/AAACAAEAAADx//7/AAACAAEAAADx////AAACAAEAAADx/wAAAAACAAEAAADx/wEAAAACAAEAAADx/wIAAAACAAEAAADx/wMAAAACAAEAAADx/wQAAAACAAEAAADx/wUAAAACAAEAAADx/wYAAAACAAEAAADx/wcAAAACAAEAAADx/wgAAAACAAEAAADx/wkAAAACAAEAAADx/woAAAACAAEAAADx/wsAAAACAAEAAADx/wwAAAACAAEAAADx/w0AAAACAAEAAADx/w4AAAACAAEAAADx/w8AAAACAAEAAADx/xAAAAACAAEAAADx/xEAAAACAAEAAADx/xIAAAACAAEAAADx/xMAAAACAAEAAADx/xQAAAACAAEAAADx/xUAAAACAAEAAADx/xYAAAACAAEAAADx/xcAAAACAAEAAADx/xgAAAACAAEAAADx/xkAAAACAAEAAADx/xoAAAACAAEAAADx/xsAAAACAAEAAADx/xwAAAACAAEAAADx/x0AAAACAAEAAADx/x4AAAACAAEAAADx/x8AAAACAAEAAADx/yAAAAACAAEAAADx/yEAAAACAAEAAADx/yIAAAACAAEAAADx/yMAAAACAAEAAADx/yQAAAACAAEAAADx/yUAAAACAAEAAADx/yYAAAACAAEAAADx/ycAAAACAAEAAADx/ygAAAACAAEAAADx/ykAAAACAAEAAADx/yoAAAACAAEAAADx/ysAAAACAAEAAADx/ywAAAACAAEAAADx/y0AAAACAAEAAADx/y4AAAACAAEAAADx/y8AAAACAAEAAADx/zAAAAACAAEAAADx/zEAAAACAAEAAADx/zIAAAACAAEAAADx/zMAAAACAAEAAADx/zQAAAACAAEAAADx/zUAAAACAAEAAADx/zYAAAACAAEAAADx/zcAAAACAAEAAADx/zgAAAACAAEAAADy//T/AAACAAEAAADy//X/AAACAAEAAADy//b/AAACAAEAAADy//f/AAACAAEAAADy//j/AAACAAEAAADy//n/AAACAAEAAADy//r/AAACAAEAAADy//v/AAACAAEAAADy//z/AAACAAEAAADy//3/AAACAAEAAADy//7/AAACAAEAAADy////AAACAAEAAADy/wAAAAACAAEAAADy/wEAAAACAAEAAADy/wIAAAACAAEAAADy/wMAAAACAAEAAADy/wQAAAACAAEAAADy/wUAAAACAAEAAADy/wYAAAACAAEAAADy/wcAAAACAAEAAADy/wgAAAACAAEAAADy/wkAAAACAAEAAADy/woAAAACAAEAAADy/wsAAAACAAEAAADy/wwAAAACAAEAAADy/w0AAAACAAEAAADy/w4AAAACAAEAAADy/w8AAAACAAEAAADy/xAAAAACAAEAAADy/xEAAAACAAEAAADy/xIAAAACAAEAAADy/xMAAAACAAEAAADy/xQAAAACAAEAAADy/xUAAAACAAEAAADy/xYAAAACAAEAAADy/xcAAAACAAEAAADy/xgAAAACAAEAAADy/xkAAAACAAEAAADy/xoAAAACAAEAAADy/xsAAAACAAEAAADy/xwAAAACAAEAAADy/x0AAAACAAEAAADy/x4AAAACAAEAAADy/x8AAAACAAEAAADy/yAAAAACAAEAAADy/yEAAAACAAEAAADy/yIAAAACAAEAAADy/yMAAAACAAEAAADy/yQAAAACAAEAAADy/yUAAAACAAEAAADy/yYAAAACAAEAAADy/ycAAAACAAEAAADy/ygAAAACAAEAAADy/ykAAAACAAEAAADy/yoAAAACAAEAAADy/ysAAAACAAEAAADy/ywAAAACAAEAAADy/y0AAAACAAEAAADy/y4AAAACAAEAAADy/y8AAAACAAEAAADy/zAAAAACAAEAAADy/zEAAAACAAEAAADy/zIAAAACAAEAAADy/zMAAAACAAEAAADy/zQAAAACAAEAAADy/zUAAAACAAEAAADy/zYAAAACAAEAAADy/zcAAAACAAEAAADy/zgAAAACAAEAAADz//T/AAACAAEAAADz//X/AAACAAEAAADz//b/AAACAAEAAADz//f/AAACAAEAAADz//j/AAACAAEAAADz//n/AAACAAEAAADz//r/AAACAAEAAADz//v/AAACAAEAAADz//z/AAACAAEAAADz//3/AAACAAEAAADz//7/AAACAAEAAADz////AAACAAEAAADz/wAAAAACAAEAAADz/wEAAAACAAEAAADz/wIAAAACAAEAAADz/wMAAAACAAEAAADz/wQAAAACAAEAAADz/wUAAAACAAEAAADz/wYAAAACAAEAAADz/wcAAAACAAEAAADz/wgAAAACAAEAAADz/wkAAAACAAEAAADz/woAAAACAAEAAADz/wsAAAACAAEAAADz/wwAAAACAAEAAADz/w0AAAACAAEAAADz/w4AAAACAAEAAADz/w8AAAACAAEAAADz/xAAAAACAAEAAADz/xEAAAACAAEAAADz/xIAAAACAAEAAADz/xMAAAACAAEAAADz/xQAAAACAAEAAADz/xUAAAACAAEAAADz/xYAAAACAAEAAADz/xcAAAACAAEAAADz/xgAAAACAAEAAADz/xkAAAACAAEAAADz/xoAAAACAAEAAADz/xsAAAACAAEAAADz/xwAAAACAAEAAADz/x0AAAACAAEAAADz/x4AAAACAAEAAADz/x8AAAACAAEAAADz/yAAAAACAAEAAADz/yEAAAACAAEAAADz/yIAAAACAAEAAADz/yMAAAACAAEAAADz/yQAAAACAAEAAADz/yUAAAACAAEAAADz/yYAAAACAAEAAADz/ycAAAACAAEAAADz/ygAAAACAAEAAADz/ykAAAACAAEAAADz/yoAAAACAAEAAADz/ysAAAACAAEAAADz/ywAAAACAAEAAADz/y0AAAACAAEAAADz/y4AAAACAAEAAADz/y8AAAACAAEAAADz/zAAAAACAAEAAADz/zEAAAACAAEAAADz/zIAAAACAAEAAADz/zMAAAACAAEAAADz/zQAAAACAAEAAADz/zUAAAACAAEAAADz/zYAAAACAAEAAADz/zcAAAACAAEAAADz/zgAAAACAAEAAAD0//T/AAACAAEAAAD0//X/AAACAAEAAAD0//b/AAACAAEAAAD0//f/AAACAAEAAAD0//j/AAACAAEAAAD0//n/AAACAAEAAAD0//r/AAACAAEAAAD0//v/AAACAAEAAAD0//z/AAACAAEAAAD0//3/AAACAAEAAAD0//7/AAACAAEAAAD0/wAAAAACAAEAAAD0/wEAAAACAAEAAAD0/wIAAAACAAEAAAD0/wMAAAACAAEAAAD0/wQAAAACAAEAAAD0/wUAAAACAAEAAAD0/wYAAAACAAEAAAD0/wcAAAACAAEAAAD0/wgAAAACAAEAAAD0/wkAAAACAAEAAAD0/woAAAACAAEAAAD0/wsAAAACAAEAAAD0/wwAAAACAAEAAAD0/w0AAAACAAEAAAD0/w4AAAACAAEAAAD0/w8AAAACAAEAAAD0/xAAAAACAAEAAAD0/xEAAAACAAEAAAD0/xIAAAACAAEAAAD0/xMAAAACAAEAAAD0/xQAAAACAAEAAAD0/xUAAAACAAEAAAD0/xYAAAACAAEAAAD0/xcAAAACAAEAAAD0/xgAAAACAAEAAAD0/xkAAAACAAEAAAD0/xoAAAACAAEAAAD0/xsAAAACAAEAAAD0/xwAAAACAAEAAAD0/x0AAAACAAEAAAD0/x4AAAACAAEAAAD0/x8AAAACAAEAAAD0/yAAAAACAAEAAAD0/yEAAAACAAEAAAD0/yIAAAACAAEAAAD0/yMAAAACAAEAAAD0/yQAAAACAAEAAAD0/yUAAAACAAEAAAD0/yYAAAACAAEAAAD0/ycAAAACAAEAAAD0/ygAAAACAAEAAAD0/ykAAAACAAEAAAD0/yoAAAACAAEAAAD0/ysAAAACAAEAAAD0/ywAAAACAAEAAAD0/y0AAAACAAEAAAD0/y4AAAACAAEAAAD0/y8AAAACAAEAAAD0/zAAAAACAAEAAAD0/zEAAAACAAEAAAD0/zIAAAACAAEAAAD0/zMAAAACAAEAAAD0/zQAAAACAAEAAAD0/zUAAAACAAEAAAD0/zYAAAACAAEAAAD0/zcAAAACAAEAAAD0/zgAAAACAAEAAAD1//T/AAACAAEAAAD1//X/AAACAAEAAAD1//b/AAACAAEAAAD1//f/AAACAAEAAAD1//j/AAACAAEAAAD1//n/AAACAAEAAAD1//r/AAACAAEAAAD1//v/AAACAAEAAAD1//z/AAACAAEAAAD1//3/AAACAAEAAAD1//7/AAACAAEAAAD1/wEAAAACAAEAAAD1/wIAAAACAAEAAAD1/wMAAAACAAEAAAD1/wQAAAACAAEAAAD1/wUAAAACAAEAAAD1/wYAAAACAAEAAAD1/wcAAAACAAEAAAD1/wgAAAACAAEAAAD1/wkAAAACAAEAAAD1/woAAAACAAEAAAD1/wsAAAACAAEAAAD1/wwAAAACAAEAAAD1/w0AAAACAAEAAAD1/w4AAAACAAEAAAD1/w8AAAACAAEAAAD1/xAAAAACAAEAAAD1/xEAAAACAAEAAAD1/xIAAAACAAEAAAD1/xMAAAACAAEAAAD1/xQAAAACAAEAAAD1/xUAAAACAAEAAAD1/xYAAAACAAEAAAD1/xcAAAACAAEAAAD1/xgAAAACAAEAAAD1/xkAAAACAAEAAAD1/xoAAAACAAEAAAD1/xsAAAACAAEAAAD1/xwAAAACAAEAAAD1/x0AAAACAAEAAAD1/x4AAAACAAEAAAD1/x8AAAACAAEAAAD1/yAAAAACAAEAAAD1/yEAAAACAAEAAAD1/yIAAAACAAEAAAD1/yMAAAACAAEAAAD1/yQAAAACAAEAAAD1/yUAAAACAAEAAAD1/yYAAAACAAEAAAD1/ycAAAACAAEAAAD1/ygAAAACAAEAAAD1/ykAAAACAAEAAAD1/yoAAAACAAEAAAD1/ysAAAACAAEAAAD1/ywAAAACAAEAAAD1/y0AAAACAAEAAAD1/y4AAAACAAEAAAD1/y8AAAACAAEAAAD1/zAAAAACAAEAAAD1/zEAAAACAAEAAAD1/zIAAAACAAEAAAD1/zMAAAACAAEAAAD1/zQAAAACAAEAAAD1/zUAAAACAAEAAAD1/zYAAAACAAEAAAD1/zcAAAACAAEAAAD1/zgAAAACAAEAAAD2//T/AAACAAEAAAD2//X/AAACAAEAAAD2//b/AAACAAEAAAD2//f/AAACAAEAAAD2//j/AAACAAEAAAD2//n/AAACAAEAAAD2//r/AAACAAEAAAD2//v/AAACAAEAAAD2//z/AAACAAEAAAD2//3/AAACAAEAAAD2//7/AAACAAEAAAD2////AAACAAEAAAD2/wIAAAACAAEAAAD2/wMAAAACAAEAAAD2/wQAAAACAAEAAAD2/wUAAAACAAEAAAD2/wYAAAACAAEAAAD2/wcAAAACAAEAAAD2/wgAAAACAAEAAAD2/wkAAAACAAEAAAD2/woAAAACAAEAAAD2/wsAAAACAAEAAAD2/wwAAAACAAEAAAD2/w0AAAACAAEAAAD2/w4AAAACAAEAAAD2/w8AAAACAAEAAAD2/xAAAAACAAEAAAD2/xEAAAACAAEAAAD2/xIAAAACAAEAAAD2/xMAAAACAAEAAAD2/xQAAAACAAEAAAD2/xUAAAACAAEAAAD2/xYAAAACAAEAAAD2/xcAAAACAAEAAAD2/xgAAAACAAEAAAD2/xkAAAACAAEAAAD2/xoAAAACAAEAAAD2/xsAAAACAAEAAAD2/xwAAAACAAEAAAD2/x0AAAACAAEAAAD2/x4AAAACAAEAAAD2/x8AAAACAAEAAAD2/yAAAAACAAEAAAD2/yEAAAACAAEAAAD2/yIAAAACAAEAAAD2/yMAAAACAAEAAAD2/yQAAAACAAEAAAD2/yUAAAACAAEAAAD2/yYAAAACAAEAAAD2/ycAAAACAAEAAAD2/ygAAAACAAEAAAD2/ykAAAACAAEAAAD2/yoAAAACAAEAAAD2/ysAAAACAAEAAAD2/ywAAAACAAEAAAD2/y0AAAACAAEAAAD2/y4AAAACAAEAAAD2/y8AAAACAAEAAAD2/zAAAAACAAEAAAD2/zEAAAACAAEAAAD2/zIAAAACAAEAAAD2/zMAAAACAAEAAAD2/zQAAAACAAEAAAD2/zUAAAACAAEAAAD2/zYAAAACAAEAAAD2/zcAAAACAAEAAAD2/zgAAAACAAEAAAD3//T/AAACAAEAAAD3//X/AAACAAEAAAD3//b/AAACAAEAAAD3//f/AAACAAEAAAD3//j/AAACAAEAAAD3//n/AAACAAEAAAD3//r/AAACAAEAAAD3//v/AAACAAEAAAD3//z/AAACAAEAAAD3//3/AAACAAEAAAD3//7/AAACAAEAAAD3////AAACAAEAAAD3/wAAAAACAAEAAAD3/wEAAAACAAEAAAD3/wMAAAACAAEAAAD3/wQAAAACAAEAAAD3/wUAAAACAAEAAAD3/wYAAAACAAEAAAD3/wcAAAACAAEAAAD3/wgAAAACAAEAAAD3/wkAAAACAAEAAAD3/woAAAACAAEAAAD3/wsAAAACAAEAAAD3/wwAAAACAAEAAAD3/w0AAAACAAEAAAD3/w4AAAACAAEAAAD3/w8AAAACAAEAAAD3/xAAAAACAAEAAAD3/xEAAAACAAEAAAD3/xIAAAACAAEAAAD3/xMAAAACAAEAAAD3/xQAAAACAAEAAAD3/xUAAAACAAEAAAD3/xYAAAACAAEAAAD3/xcAAAACAAEAAAD3/xgAAAACAAEAAAD3/xkAAAACAAEAAAD3/xoAAAACAAEAAAD3/xsAAAACAAEAAAD3/xwAAAACAAEAAAD3/x0AAAACAAEAAAD3/x4AAAACAAEAAAD3/x8AAAACAAEAAAD3/yAAAAACAAEAAAD3/yEAAAACAAEAAAD3/yIAAAACAAEAAAD3/yMAAAACAAEAAAD3/yQAAAACAAEAAAD3/yUAAAACAAEAAAD3/yYAAAACAAEAAAD3/ycAAAACAAEAAAD3/ygAAAACAAEAAAD3/ykAAAACAAEAAAD3/yoAAAACAAEAAAD3/ysAAAACAAEAAAD3/ywAAAACAAEAAAD3/y0AAAACAAEAAAD3/y4AAAACAAEAAAD3/y8AAAACAAEAAAD3/zAAAAACAAEAAAD3/zEAAAACAAEAAAD3/zIAAAACAAEAAAD3/zMAAAACAAEAAAD3/zQAAAACAAEAAAD3/zUAAAACAAEAAAD3/zYAAAACAAEAAAD3/zcAAAACAAEAAAD3/zgAAAACAAEAAAD4//T/AAACAAEAAAD4//X/AAACAAEAAAD4//b/AAACAAEAAAD4//f/AAACAAEAAAD4//j/AAACAAEAAAD4//n/AAACAAEAAAD4//r/AAACAAEAAAD4//v/AAACAAEAAAD4//z/AAACAAEAAAD4//3/AAACAAEAAAD4//7/AAACAAEAAAD4////AAACAAEAAAD4/wAAAAACAAEAAAD4/wEAAAACAAEAAAD4/wIAAAACAAEAAAD4/wUAAAACAAEAAAD4/wYAAAACAAEAAAD4/wcAAAACAAEAAAD4/wgAAAACAAEAAAD4/wkAAAACAAEAAAD4/woAAAACAAEAAAD4/wsAAAACAAEAAAD4/wwAAAACAAEAAAD4/w0AAAACAAEAAAD4/w4AAAACAAEAAAD4/w8AAAACAAEAAAD4/xAAAAACAAEAAAD4/xEAAAACAAEAAAD4/xIAAAACAAEAAAD4/xMAAAACAAEAAAD4/xQAAAACAAEAAAD4/xUAAAACAAEAAAD4/xYAAAACAAEAAAD4/xcAAAACAAEAAAD4/xgAAAACAAEAAAD4/xkAAAACAAEAAAD4/xoAAAACAAEAAAD4/xsAAAACAAEAAAD4/xwAAAACAAEAAAD4/x0AAAACAAEAAAD4/x4AAAACAAEAAAD4/x8AAAACAAEAAAD4/yAAAAACAAEAAAD4/yEAAAACAAEAAAD4/yIAAAACAAEAAAD4/yMAAAACAAEAAAD4/yQAAAACAAEAAAD4/yUAAAACAAEAAAD4/yYAAAACAAEAAAD4/ycAAAACAAEAAAD4/ygAAAACAAEAAAD4/ykAAAACAAEAAAD4/yoAAAACAAEAAAD4/ysAAAACAAEAAAD4/ywAAAACAAEAAAD4/y0AAAACAAEAAAD4/y4AAAACAAEAAAD4/y8AAAACAAEAAAD4/zAAAAACAAEAAAD4/zEAAAACAAEAAAD4/zIAAAACAAEAAAD4/zMAAAACAAEAAAD4/zQAAAACAAEAAAD4/zUAAAACAAEAAAD4/zYAAAACAAEAAAD4/zcAAAACAAEAAAD4/zgAAAACAAEAAAD5//T/AAACAAEAAAD5//X/AAACAAEAAAD5//b/AAACAAEAAAD5//f/AAACAAEAAAD5//j/AAACAAEAAAD5//n/AAACAAEAAAD5//r/AAACAAEAAAD5//v/AAACAAEAAAD5//z/AAACAAEAAAD5//3/AAACAAEAAAD5//7/AAACAAEAAAD5////AAACAAEAAAD5/wAAAAACAAEAAAD5/wEAAAACAAEAAAD5/wIAAAACAAEAAAD5/wMAAAACAAEAAAD5/wQAAAACAAEAAAD5/wYAAAACAAEAAAD5/wcAAAACAAEAAAD5/wgAAAACAAEAAAD5/wkAAAACAAEAAAD5/woAAAACAAEAAAD5/wsAAAACAAEAAAD5/wwAAAACAAEAAAD5/w0AAAACAAEAAAD5/w4AAAACAAEAAAD5/w8AAAACAAEAAAD5/xAAAAACAAEAAAD5/xEAAAACAAEAAAD5/xIAAAACAAEAAAD5/xMAAAACAAEAAAD5/xQAAAACAAEAAAD5/xUAAAACAAEAAAD5/xYAAAACAAEAAAD5/xcAAAACAAEAAAD5/xgAAAACAAEAAAD5/xkAAAACAAEAAAD5/xoAAAACAAEAAAD5/xsAAAACAAEAAAD5/xwAAAACAAEAAAD5/x0AAAACAAEAAAD5/x4AAAACAAEAAAD5/x8AAAACAAEAAAD5/yAAAAACAAEAAAD5/yEAAAACAAEAAAD5/yIAAAACAAEAAAD5/yMAAAACAAEAAAD5/yQAAAACAAEAAAD5/yUAAAACAAEAAAD5/yYAAAACAAEAAAD5/ycAAAACAAEAAAD5/ygAAAACAAEAAAD5/ykAAAACAAEAAAD5/yoAAAACAAEAAAD5/ysAAAACAAEAAAD5/ywAAAACAAEAAAD5/y0AAAACAAEAAAD5/y4AAAACAAEAAAD5/y8AAAACAAEAAAD5/zAAAAACAAEAAAD5/zEAAAACAAEAAAD5/zIAAAACAAEAAAD5/zMAAAACAAEAAAD5/zQAAAACAAEAAAD5/zUAAAACAAEAAAD5/zYAAAACAAEAAAD5/zcAAAACAAEAAAD5/zgAAAACAAEAAAD6//T/AAACAAEAAAD6//X/AAACAAEAAAD6//b/AAACAAEAAAD6//f/AAACAAEAAAD6//j/AAACAAEAAAD6//n/AAACAAEAAAD6//r/AAACAAEAAAD6//v/AAACAAEAAAD6//z/AAACAAEAAAD6//3/AAACAAEAAAD6//7/AAACAAEAAAD6////AAACAAEAAAD6/wAAAAACAAEAAAD6/wEAAAACAAEAAAD6/wIAAAACAAEAAAD6/wMAAAACAAEAAAD6/wQAAAACAAEAAAD6/wUAAAACAAEAAAD6/wgAAAACAAEAAAD6/wkAAAACAAEAAAD6/woAAAACAAEAAAD6/wsAAAACAAEAAAD6/wwAAAACAAEAAAD6/w0AAAACAAEAAAD6/w4AAAACAAEAAAD6/w8AAAACAAEAAAD6/xAAAAACAAEAAAD6/xEAAAACAAEAAAD6/xIAAAACAAEAAAD6/xMAAAACAAEAAAD6/xQAAAACAAEAAAD6/xUAAAACAAEAAAD6/xYAAAACAAEAAAD6/xcAAAACAAEAAAD6/xgAAAACAAEAAAD6/xkAAAACAAEAAAD6/xoAAAACAAEAAAD6/xsAAAACAAEAAAD6/xwAAAACAAEAAAD6/x0AAAACAAEAAAD6/x4AAAACAAEAAAD6/x8AAAACAAEAAAD6/yAAAAACAAEAAAD6/yEAAAACAAEAAAD6/yIAAAACAAEAAAD6/yMAAAACAAEAAAD6/yQAAAACAAEAAAD6/yUAAAACAAEAAAD6/yYAAAACAAEAAAD6/ycAAAACAAEAAAD6/ygAAAACAAEAAAD6/ykAAAACAAEAAAD6/yoAAAACAAEAAAD6/ysAAAACAAEAAAD6/ywAAAACAAEAAAD6/y0AAAACAAEAAAD6/y4AAAACAAEAAAD6/y8AAAACAAEAAAD6/zAAAAACAAEAAAD6/zEAAAACAAEAAAD6/zIAAAACAAEAAAD6/zMAAAACAAEAAAD6/zQAAAACAAEAAAD6/zUAAAACAAEAAAD6/zYAAAACAAEAAAD6/zcAAAACAAEAAAD6/zgAAAACAAEAAAD7//T/AAACAAEAAAD7//X/AAACAAEAAAD7//b/AAACAAEAAAD7//f/AAACAAEAAAD7//j/AAACAAEAAAD7//n/AAACAAEAAAD7//r/AAACAAEAAAD7//v/AAACAAEAAAD7//z/AAACAAEAAAD7//3/AAACAAEAAAD7//7/AAACAAEAAAD7////AAACAAEAAAD7/wAAAAACAAEAAAD7/wEAAAACAAEAAAD7/wIAAAACAAEAAAD7/wMAAAACAAEAAAD7/wQAAAACAAEAAAD7/wUAAAACAAEAAAD7/wYAAAACAAEAAAD7/wcAAAACAAEAAAD7/wkAAAACAAEAAAD7/woAAAACAAEAAAD7/wsAAAACAAEAAAD7/wwAAAACAAEAAAD7/w0AAAACAAEAAAD7/w4AAAACAAEAAAD7/w8AAAACAAEAAAD7/xAAAAACAAEAAAD7/xEAAAACAAEAAAD7/xIAAAACAAEAAAD7/xMAAAACAAEAAAD7/xQAAAACAAEAAAD7/xUAAAACAAEAAAD7/xYAAAACAAEAAAD7/xcAAAACAAEAAAD7/xgAAAACAAEAAAD7/xkAAAACAAEAAAD7/xoAAAACAAEAAAD7/xsAAAACAAEAAAD7/xwAAAACAAEAAAD7/x0AAAACAAEAAAD7/x4AAAACAAEAAAD7/x8AAAACAAEAAAD7/yAAAAACAAEAAAD7/yEAAAACAAEAAAD7/yIAAAACAAEAAAD7/yMAAAACAAEAAAD7/yQAAAACAAEAAAD7/yUAAAACAAEAAAD7/yYAAAACAAEAAAD7/ycAAAACAAEAAAD7/ygAAAACAAEAAAD7/ykAAAACAAEAAAD7/yoAAAACAAEAAAD7/ysAAAACAAEAAAD7/ywAAAACAAEAAAD7/y0AAAACAAEAAAD7/y4AAAACAAEAAAD7/y8AAAACAAEAAAD7/zAAAAACAAEAAAD7/zEAAAACAAEAAAD7/zIAAAACAAEAAAD7/zMAAAACAAEAAAD7/zQAAAACAAEAAAD7/zUAAAACAAEAAAD7/zYAAAACAAEAAAD7/zcAAAACAAEAAAD7/zgAAAACAAEAAAD8//T/AAACAAEAAAD8//X/AAACAAEAAAD8//b/AAACAAEAAAD8//f/AAACAAEAAAD8//j/AAACAAEAAAD8//n/AAACAAEAAAD8//r/AAACAAEAAAD8//v/AAACAAEAAAD8//z/AAACAAEAAAD8//3/AAACAAEAAAD8//7/AAACAAEAAAD8////AAACAAEAAAD8/wAAAAACAAEAAAD8/wEAAAACAAEAAAD8/wIAAAACAAEAAAD8/wMAAAACAAEAAAD8/wQAAAACAAEAAAD8/wUAAAACAAEAAAD8/wYAAAACAAEAAAD8/wcAAAACAAEAAAD8/wgAAAACAAEAAAD8/woAAAACAAEAAAD8/wsAAAACAAEAAAD8/wwAAAACAAEAAAD8/w0AAAACAAEAAAD8/w4AAAACAAEAAAD8/w8AAAACAAEAAAD8/xAAAAACAAEAAAD8/xEAAAACAAEAAAD8/xIAAAACAAEAAAD8/xMAAAACAAEAAAD8/xQAAAACAAEAAAD8/xUAAAACAAEAAAD8/xYAAAACAAEAAAD8/xcAAAACAAEAAAD8/xgAAAACAAEAAAD8/xkAAAACAAEAAAD8/xoAAAACAAEAAAD8/xsAAAACAAEAAAD8/xwAAAACAAEAAAD8/x0AAAACAAEAAAD8/x4AAAACAAEAAAD8/x8AAAACAAEAAAD8/yAAAAACAAEAAAD8/yEAAAACAAEAAAD8/yIAAAACAAEAAAD8/yMAAAACAAEAAAD8/yQAAAACAAEAAAD8/yUAAAACAAEAAAD8/yYAAAACAAEAAAD8/ycAAAACAAEAAAD8/ygAAAACAAEAAAD8/ykAAAACAAEAAAD8/yoAAAACAAEAAAD8/ysAAAACAAEAAAD8/ywAAAACAAEAAAD8/y0AAAACAAEAAAD8/y4AAAACAAEAAAD8/y8AAAACAAEAAAD8/zAAAAACAAEAAAD8/zEAAAACAAEAAAD8/zIAAAACAAEAAAD8/zMAAAACAAEAAAD8/zQAAAACAAEAAAD8/zUAAAACAAEAAAD8/zYAAAACAAEAAAD8/zcAAAACAAEAAAD8/zgAAAACAAEAAAD9//T/AAACAAEAAAD9//X/AAACAAEAAAD9//b/AAACAAEAAAD9//f/AAACAAEAAAD9//j/AAACAAEAAAD9//n/AAACAAEAAAD9//r/AAACAAEAAAD9//v/AAACAAEAAAD9//z/AAACAAEAAAD9//3/AAACAAEAAAD9//7/AAACAAEAAAD9////AAACAAEAAAD9/wAAAAACAAEAAAD9/wEAAAACAAEAAAD9/wIAAAACAAEAAAD9/wMAAAACAAEAAAD9/wQAAAACAAEAAAD9/wUAAAACAAEAAAD9/wYAAAACAAEAAAD9/wcAAAACAAEAAAD9/wgAAAACAAEAAAD9/wkAAAACAAEAAAD9/wsAAAACAAEAAAD9/wwAAAACAAEAAAD9/w0AAAACAAEAAAD9/w4AAAACAAEAAAD9/w8AAAACAAEAAAD9/xAAAAACAAEAAAD9/xEAAAACAAEAAAD9/xIAAAACAAEAAAD9/xMAAAACAAEAAAD9/xQAAAACAAEAAAD9/xUAAAACAAEAAAD9/xYAAAACAAEAAAD9/xcAAAACAAEAAAD9/xgAAAACAAEAAAD9/xkAAAACAAEAAAD9/xoAAAACAAEAAAD9/xsAAAACAAEAAAD9/xwAAAACAAEAAAD9/x0AAAACAAEAAAD9/x4AAAACAAEAAAD9/x8AAAACAAEAAAD9/yAAAAACAAEAAAD9/yEAAAACAAEAAAD9/yIAAAACAAEAAAD9/yMAAAACAAEAAAD9/yQAAAACAAEAAAD9/yUAAAACAAEAAAD9/yYAAAACAAEAAAD9/ycAAAACAAEAAAD9/ygAAAACAAEAAAD9/ykAAAACAAEAAAD9/yoAAAACAAEAAAD9/ysAAAACAAEAAAD9/ywAAAACAAEAAAD9/y0AAAACAAEAAAD9/y4AAAACAAEAAAD9/y8AAAACAAEAAAD9/zAAAAACAAEAAAD9/zEAAAACAAEAAAD9/zIAAAACAAEAAAD9/zMAAAACAAEAAAD9/zQAAAACAAEAAAD9/zUAAAACAAEAAAD9/zYAAAACAAEAAAD9/zcAAAACAAEAAAD9/zgAAAACAAEAAAD+//T/AAACAAEAAAD+//X/AAACAAEAAAD+//b/AAACAAEAAAD+//f/AAACAAEAAAD+//j/AAACAAEAAAD+//n/AAACAAEAAAD+//r/AAACAAEAAAD+//v/AAACAAEAAAD+//z/AAACAAEAAAD+//3/AAACAAEAAAD+//7/AAACAAEAAAD+////AAACAAEAAAD+/wAAAAACAAEAAAD+/wEAAAACAAEAAAD+/wIAAAACAAEAAAD+/wMAAAACAAEAAAD+/wQAAAACAAEAAAD+/wUAAAACAAEAAAD+/wYAAAACAAEAAAD+/wcAAAACAAEAAAD+/wgAAAACAAEAAAD+/wkAAAACAAEAAAD+/woAAAACAAEAAAD+/w0AAAACAAEAAAD+/w4AAAACAAEAAAD+/w8AAAACAAEAAAD+/xAAAAACAAEAAAD+/xEAAAACAAEAAAD+/xIAAAACAAEAAAD+/xMAAAACAAEAAAD+/xQAAAACAAEAAAD+/xUAAAACAAEAAAD+/xYAAAACAAEAAAD+/xcAAAACAAEAAAD+/xgAAAACAAEAAAD+/xkAAAACAAEAAAD+/xoAAAACAAEAAAD+/xsAAAACAAEAAAD+/xwAAAACAAEAAAD+/x0AAAACAAEAAAD+/x4AAAACAAEAAAD+/x8AAAACAAEAAAD+/yAAAAACAAEAAAD+/yEAAAACAAEAAAD+/yIAAAACAAEAAAD+/yMAAAACAAEAAAD+/yQAAAACAAEAAAD+/yUAAAACAAEAAAD+/yYAAAACAAEAAAD+/ycAAAACAAEAAAD+/ygAAAACAAEAAAD+/ykAAAACAAEAAAD+/yoAAAACAAEAAAD+/ysAAAACAAEAAAD+/ywAAAACAAEAAAD+/y0AAAACAAEAAAD+/y4AAAACAAEAAAD+/y8AAAACAAEAAAD+/zAAAAACAAEAAAD+/zEAAAACAAEAAAD+/zIAAAACAAEAAAD+/zMAAAACAAEAAAD+/zQAAAACAAEAAAD+/zUAAAACAAEAAAD+/zYAAAACAAEAAAD+/zcAAAACAAEAAAD+/zgAAAACAAEAAAD///T/AAACAAEAAAD///X/AAACAAEAAAD///b/AAACAAEAAAD///f/AAACAAEAAAD///j/AAACAAEAAAD///n/AAACAAEAAAD///r/AAACAAEAAAD///v/AAACAAEAAAD///z/AAACAAEAAAD///3/AAACAAEAAAD///7/AAACAAEAAAD/////AAACAAEAAAD//wAAAAACAAEAAAD//wEAAAACAAEAAAD//wIAAAACAAEAAAD//wMAAAACAAEAAAD//wQAAAACAAEAAAD//wUAAAACAAEAAAD//wYAAAACAAEAAAD//wcAAAACAAEAAAD//wgAAAACAAEAAAD//wkAAAACAAEAAAD//woAAAACAAEAAAD//wsAAAACAAEAAAD//wwAAAACAAEAAAD//w4AAAACAAEAAAD//w8AAAACAAEAAAD//xAAAAACAAEAAAD//xEAAAACAAEAAAD//xIAAAACAAEAAAD//xMAAAACAAEAAAD//xQAAAACAAEAAAD//xUAAAACAAEAAAD//xYAAAACAAEAAAD//xcAAAACAAEAAAD//xgAAAACAAEAAAD//xkAAAACAAEAAAD//xoAAAACAAEAAAD//xsAAAACAAEAAAD//xwAAAACAAEAAAD//x0AAAACAAEAAAD//x4AAAACAAEAAAD//x8AAAACAAEAAAD//yAAAAACAAEAAAD//yEAAAACAAEAAAD//yIAAAACAAEAAAD//yMAAAACAAEAAAD//yQAAAACAAEAAAD//yUAAAACAAEAAAD//yYAAAACAAEAAAD//ycAAAACAAEAAAD//ygAAAACAAEAAAD//ykAAAACAAEAAAD//yoAAAACAAEAAAD//ysAAAACAAEAAAD//ywAAAACAAEAAAD//y0AAAACAAEAAAD//y4AAAACAAEAAAD//y8AAAACAAEAAAD//zAAAAACAAEAAAD//zEAAAACAAEAAAD//zIAAAACAAEAAAD//zMAAAACAAEAAAD//zQAAAACAAEAAAD//zUAAAACAAEAAAD//zYAAAACAAEAAAD//zcAAAACAAEAAAD//zgAAAACAAEAAAAAAPT/AAACAAEAAAAAAPX/AAACAAEAAAAAAPb/AAACAAEAAAAAAPf/AAACAAEAAAAAAPj/AAACAAEAAAAAAPn/AAACAAEAAAAAAPr/AAACAAEAAAAAAPv/AAACAAEAAAAAAPz/AAACAAEAAAAAAP3/AAACAAEAAAAAAP7/AAACAAEAAAAAAP//AAACAAEAAAAAACkAAAACAAEAAAAAACoAAAACAAEAAAAAACsAAAACAAEAAAAAACwAAAACAAEAAAAAAC0AAAACAAEAAAAAAC4AAAACAAEAAAAAAC8AAAACAAEAAAAAADAAAAACAAEAAAAAADEAAAACAAEAAAAAADIAAAACAAEAAAAAADMAAAACAAEAAAAAADQAAAACAAEAAAAAADUAAAACAAEAAAAAADYAAAACAAEAAAAAADcAAAACAAEAAAAAADgAAAACAAEAAAABAPT/AAACAAEAAAABAPX/AAACAAEAAAABAPb/AAACAAEAAAABAPf/AAACAAEAAAABAPj/AAACAAEAAAABAPn/AAACAAEAAAABAPr/AAACAAEAAAABAPv/AAACAAEAAAABAPz/AAACAAEAAAABAP3/AAACAAEAAAABAP7/AAACAAEAAAABAP//AAACAAEAAAABACkAAAACAAEAAAABACoAAAACAAEAAAABACsAAAACAAEAAAABACwAAAACAAEAAAABAC0AAAACAAEAAAABAC4AAAACAAEAAAABAC8AAAACAAEAAAABADAAAAACAAEAAAABADEAAAACAAEAAAABADIAAAACAAEAAAABADMAAAACAAEAAAABADQAAAACAAEAAAABADUAAAACAAEAAAABADYAAAACAAEAAAABADcAAAACAAEAAAABADgAAAACAAEAAAACAPT/AAACAAEAAAACAPX/AAACAAEAAAACAPb/AAACAAEAAAACAPf/AAACAAEAAAACAPj/AAACAAEAAAACAPn/AAACAAEAAAACAPr/AAACAAEAAAACAPv/AAACAAEAAAACAPz/AAACAAEAAAACAP3/AAACAAEAAAACAP7/AAACAAEAAAACAP//AAACAAEAAAACACkAAAACAAEAAAACACoAAAACAAEAAAACACsAAAACAAEAAAACACwAAAACAAEAAAACAC0AAAACAAEAAAACAC4AAAACAAEAAAACAC8AAAACAAEAAAACADAAAAACAAEAAAACADEAAAACAAEAAAACADIAAAACAAEAAAACADMAAAACAAEAAAACADQAAAACAAEAAAACADUAAAACAAEAAAACADYAAAACAAEAAAACADcAAAACAAEAAAACADgAAAACAAEAAAADAPT/AAACAAEAAAADAPX/AAACAAEAAAADAPb/AAACAAEAAAADAPf/AAACAAEAAAADAPj/AAACAAEAAAADAPn/AAACAAEAAAADAPr/AAACAAEAAAADAPv/AAACAAEAAAADAPz/AAACAAEAAAADAP3/AAACAAEAAAADAP7/AAACAAEAAAADAP//AAACAAEAAAADACkAAAACAAEAAAADACoAAAACAAEAAAADACsAAAACAAEAAAADACwAAAACAAEAAAADAC0AAAACAAEAAAADAC4AAAACAAEAAAADAC8AAAACAAEAAAADADAAAAACAAEAAAADADEAAAACAAEAAAADADIAAAACAAEAAAADADMAAAACAAEAAAADADQAAAACAAEAAAADADUAAAACAAEAAAADADYAAAACAAEAAAADADcAAAACAAEAAAADADgAAAACAAEAAAAEAPT/AAACAAEAAAAEAPX/AAACAAEAAAAEAPb/AAACAAEAAAAEAPf/AAACAAEAAAAEAPj/AAACAAEAAAAEAPn/AAACAAEAAAAEAPr/AAACAAEAAAAEAPv/AAACAAEAAAAEAPz/AAACAAEAAAAEAP3/AAACAAEAAAAEAP7/AAACAAEAAAAEAP//AAACAAEAAAAEACkAAAACAAEAAAAEACoAAAACAAEAAAAEACsAAAACAAEAAAAEACwAAAACAAEAAAAEAC0AAAACAAEAAAAEAC4AAAACAAEAAAAEAC8AAAACAAEAAAAEADAAAAACAAEAAAAEADEAAAACAAEAAAAEADIAAAACAAEAAAAEADMAAAACAAEAAAAEADQAAAACAAEAAAAEADUAAAACAAEAAAAEADYAAAACAAEAAAAEADcAAAACAAEAAAAEADgAAAACAAEAAAAFAPT/AAACAAEAAAAFAPX/AAACAAEAAAAFAPb/AAACAAEAAAAFAPf/AAACAAEAAAAFAPj/AAACAAEAAAAFAPn/AAACAAEAAAAFAPr/AAACAAEAAAAFAPv/AAACAAEAAAAFAPz/AAACAAEAAAAFAP3/AAACAAEAAAAFAP7/AAACAAEAAAAFAP//AAACAAEAAAAFACkAAAACAAEAAAAFACoAAAACAAEAAAAFACsAAAACAAEAAAAFACwAAAACAAEAAAAFAC0AAAACAAEAAAAFAC4AAAACAAEAAAAFAC8AAAACAAEAAAAFADAAAAACAAEAAAAFADEAAAACAAEAAAAFADIAAAACAAEAAAAFADMAAAACAAEAAAAFADQAAAACAAEAAAAFADUAAAACAAEAAAAFADYAAAACAAEAAAAFADcAAAACAAEAAAAFADgAAAACAAEAAAAGAPT/AAACAAEAAAAGAPX/AAACAAEAAAAGAPb/AAACAAEAAAAGAPf/AAACAAEAAAAGAPj/AAACAAEAAAAGAPn/AAACAAEAAAAGAPr/AAACAAEAAAAGAPv/AAACAAEAAAAGAPz/AAACAAEAAAAGAP3/AAACAAEAAAAGAP7/AAACAAEAAAAGAP//AAACAAEAAAAGACkAAAACAAEAAAAGACoAAAACAAEAAAAGACsAAAACAAEAAAAGACwAAAACAAEAAAAGAC0AAAACAAEAAAAGAC4AAAACAAEAAAAGAC8AAAACAAEAAAAGADAAAAACAAEAAAAGADEAAAACAAEAAAAGADIAAAACAAEAAAAGADMAAAACAAEAAAAGADQAAAACAAEAAAAGADUAAAACAAEAAAAGADYAAAACAAEAAAAGADcAAAACAAEAAAAGADgAAAACAAEAAAAHAPT/AAACAAEAAAAHAPX/AAACAAEAAAAHAPb/AAACAAEAAAAHAPf/AAACAAEAAAAHAPj/AAACAAEAAAAHAPn/AAACAAEAAAAHAPr/AAACAAEAAAAHAPv/AAACAAEAAAAHAPz/AAACAAEAAAAHAP3/AAACAAEAAAAHAP7/AAACAAEAAAAHAP//AAACAAEAAAAHACkAAAACAAEAAAAHACoAAAACAAEAAAAHACsAAAACAAEAAAAHACwAAAACAAEAAAAHAC0AAAACAAEAAAAHAC4AAAACAAEAAAAHAC8AAAACAAEAAAAHADAAAAACAAEAAAAHADEAAAACAAEAAAAHADIAAAACAAEAAAAHADMAAAACAAEAAAAHADQAAAACAAEAAAAHADUAAAACAAEAAAAHADYAAAACAAEAAAAHADcAAAACAAEAAAAHADgAAAACAAEAAAAIACkAAAACAAEAAAAIACoAAAACAAEAAAAIACsAAAACAAEAAAAIACwAAAACAAEAAAAIAC0AAAACAAEAAAAIAC4AAAACAAEAAAAIAC8AAAACAAEAAAAIADAAAAACAAEAAAAIADEAAAACAAEAAAAIADIAAAACAAEAAAAIADMAAAACAAEAAAAIADQAAAACAAEAAAAIADUAAAACAAEAAAAIADYAAAACAAEAAAAIADcAAAACAAEAAAAIADgAAAACAAEAAAAJACkAAAACAAEAAAAJACoAAAACAAEAAAAJACsAAAACAAEAAAAJACwAAAACAAEAAAAJAC0AAAACAAEAAAAJAC4AAAACAAEAAAAJAC8AAAACAAEAAAAJADAAAAACAAEAAAAJADEAAAACAAEAAAAJADIAAAACAAEAAAAJADMAAAACAAEAAAAJADQAAAACAAEAAAAJADUAAAACAAEAAAAJADYAAAACAAEAAAAJADcAAAACAAEAAAAJADgAAAACAAEAAAAKACkAAAACAAEAAAAKACoAAAACAAEAAAAKACsAAAACAAEAAAAKACwAAAACAAEAAAAKAC0AAAACAAEAAAAKAC4AAAACAAEAAAAKAC8AAAACAAEAAAAKADAAAAACAAEAAAAKADEAAAACAAEAAAAKADIAAAACAAEAAAAKADMAAAACAAEAAAAKADQAAAACAAEAAAAKADUAAAACAAEAAAAKADYAAAACAAEAAAAKADcAAAACAAEAAAAKADgAAAACAAEAAAALACkAAAACAAEAAAALACoAAAACAAEAAAALACsAAAACAAEAAAALACwAAAACAAEAAAALAC0AAAACAAEAAAALAC4AAAACAAEAAAALAC8AAAACAAEAAAALADAAAAACAAEAAAALADEAAAACAAEAAAALADIAAAACAAEAAAALADMAAAACAAEAAAALADQAAAACAAEAAAALADUAAAACAAEAAAALADYAAAACAAEAAAALADcAAAACAAEAAAALADgAAAACAAEAAAAMACkAAAACAAEAAAAMACoAAAACAAEAAAAMACsAAAACAAEAAAAMACwAAAACAAEAAAAMAC0AAAACAAEAAAAMAC4AAAACAAEAAAAMAC8AAAACAAEAAAAMADAAAAACAAEAAAAMADEAAAACAAEAAAAMADIAAAACAAEAAAAMADMAAAACAAEAAAAMADQAAAACAAEAAAAMADUAAAACAAEAAAAMADYAAAACAAEAAAAMADcAAAACAAEAAAAMADgAAAACAAEAAAANACkAAAACAAEAAAANACoAAAACAAEAAAANACsAAAACAAEAAAANACwAAAACAAEAAAANAC0AAAACAAEAAAANAC4AAAACAAEAAAANAC8AAAACAAEAAAANADAAAAACAAEAAAANADEAAAACAAEAAAANADIAAAACAAEAAAANADMAAAACAAEAAAANADQAAAACAAEAAAANADUAAAACAAEAAAANADYAAAACAAEAAAANADcAAAACAAEAAAANADgAAAACAAEAAAAOACkAAAACAAEAAAAOACoAAAACAAEAAAAOACsAAAACAAEAAAAOACwAAAACAAEAAAAOAC0AAAACAAEAAAAOAC4AAAACAAEAAAAOAC8AAAACAAEAAAAOADAAAAACAAEAAAAOADEAAAACAAEAAAAOADIAAAACAAEAAAAOADMAAAACAAEAAAAOADQAAAACAAEAAAAOADUAAAACAAEAAAAOADYAAAACAAEAAAAOADcAAAACAAEAAAAOADgAAAACAAEAAAAPACkAAAACAAEAAAAPACoAAAACAAEAAAAPACsAAAACAAEAAAAPACwAAAACAAEAAAAPAC0AAAACAAEAAAAPAC4AAAACAAEAAAAPAC8AAAACAAEAAAAPADAAAAACAAEAAAAPADEAAAACAAEAAAAPADIAAAACAAEAAAAPADMAAAACAAEAAAAPADQAAAACAAEAAAAPADUAAAACAAEAAAAPADYAAAACAAEAAAAPADcAAAACAAEAAAAPADgAAAACAAEAAAAQACkAAAACAAEAAAAQACoAAAACAAEAAAAQACsAAAACAAEAAAAQACwAAAACAAEAAAAQAC0AAAACAAEAAAAQAC4AAAACAAEAAAAQAC8AAAACAAEAAAAQADAAAAACAAEAAAAQADEAAAACAAEAAAAQADIAAAACAAEAAAAQADMAAAACAAEAAAAQADQAAAACAAEAAAAQADUAAAACAAEAAAAQADYAAAACAAEAAAAQADcAAAACAAEAAAAQADgAAAACAAEAAAARACkAAAACAAEAAAARACoAAAACAAEAAAARACsAAAACAAEAAAARACwAAAACAAEAAAARAC0AAAACAAEAAAARAC4AAAACAAEAAAARAC8AAAACAAEAAAARADAAAAACAAEAAAARADEAAAACAAEAAAARADIAAAACAAEAAAARADMAAAACAAEAAAARADQAAAACAAEAAAARADUAAAACAAEAAAARADYAAAACAAEAAAARADcAAAACAAEAAAARADgAAAACAAEAAAASACkAAAACAAEAAAASACoAAAACAAEAAAASACsAAAACAAEAAAASACwAAAACAAEAAAASAC0AAAACAAEAAAASAC4AAAACAAEAAAASAC8AAAACAAEAAAASADAAAAACAAEAAAASADEAAAACAAEAAAASADIAAAACAAEAAAASADMAAAACAAEAAAASADQAAAACAAEAAAASADUAAAACAAEAAAASADYAAAACAAEAAAASADcAAAACAAEAAAASADgAAAACAAEAAAATACkAAAACAAEAAAATACoAAAACAAEAAAATACsAAAACAAEAAAATACwAAAACAAEAAAATAC0AAAACAAEAAAATAC4AAAACAAEAAAATAC8AAAACAAEAAAATADAAAAACAAEAAAATADEAAAACAAEAAAATADIAAAACAAEAAAATADMAAAACAAEAAAATADQAAAACAAEAAAATADUAAAACAAEAAAATADYAAAACAAEAAAATADcAAAACAAEAAAATADgAAAACAAEAAAAUACkAAAACAAEAAAAUACoAAAACAAEAAAAUACsAAAACAAEAAAAUACwAAAACAAEAAAAUAC0AAAACAAEAAAAUAC4AAAACAAEAAAAUAC8AAAACAAEAAAAUADAAAAACAAEAAAAUADEAAAACAAEAAAAUADIAAAACAAEAAAAUADMAAAACAAEAAAAUADQAAAACAAEAAAAUADUAAAACAAEAAAAUADYAAAACAAEAAAAUADcAAAACAAEAAAAUADgAAAACAAEAAAAVACkAAAACAAEAAAAVACoAAAACAAEAAAAVACsAAAACAAEAAAAVACwAAAACAAEAAAAVAC0AAAACAAEAAAAVAC4AAAACAAEAAAAVAC8AAAACAAEAAAAVADAAAAACAAEAAAAVADEAAAACAAEAAAAVADIAAAACAAEAAAAVADMAAAACAAEAAAAVADQAAAACAAEAAAAVADUAAAACAAEAAAAVADYAAAACAAEAAAAVADcAAAACAAEAAAAVADgAAAACAAEAAAAWACkAAAACAAEAAAAWACoAAAACAAEAAAAWACsAAAACAAEAAAAWACwAAAACAAEAAAAWAC0AAAACAAEAAAAWAC4AAAACAAEAAAAWAC8AAAACAAEAAAAWADAAAAACAAEAAAAWADEAAAACAAEAAAAWADIAAAACAAEAAAAWADMAAAACAAEAAAAWADQAAAACAAEAAAAWADUAAAACAAEAAAAWADYAAAACAAEAAAAWADcAAAACAAEAAAAWADgAAAACAAEAAAAXACkAAAACAAEAAAAXACoAAAACAAEAAAAXACsAAAACAAEAAAAXACwAAAACAAEAAAAXAC0AAAACAAEAAAAXAC4AAAACAAEAAAAXAC8AAAACAAEAAAAXADAAAAACAAEAAAAXADEAAAACAAEAAAAXADIAAAACAAEAAAAXADMAAAACAAEAAAAXADQAAAACAAEAAAAXADUAAAACAAEAAAAXADYAAAACAAEAAAAXADcAAAACAAEAAAAXADgAAAACAAEAAAAYACkAAAACAAEAAAAYACoAAAACAAEAAAAYACsAAAACAAEAAAAYACwAAAACAAEAAAAYAC0AAAACAAEAAAAYAC4AAAACAAEAAAAYAC8AAAACAAEAAAAYADAAAAACAAEAAAAYADEAAAACAAEAAAAYADIAAAACAAEAAAAYADMAAAACAAEAAAAYADQAAAACAAEAAAAYADUAAAACAAEAAAAYADYAAAACAAEAAAAYADcAAAACAAEAAAAYADgAAAACAAEAAAAZACkAAAACAAEAAAAZACoAAAACAAEAAAAZACsAAAACAAEAAAAZACwAAAACAAEAAAAZAC0AAAACAAEAAAAZAC4AAAACAAEAAAAZAC8AAAACAAEAAAAZADAAAAACAAEAAAAZADEAAAACAAEAAAAZADIAAAACAAEAAAAZADMAAAACAAEAAAAZADQAAAACAAEAAAAZADUAAAACAAEAAAAZADYAAAACAAEAAAAZADcAAAACAAEAAAAZADgAAAACAAEAAAAaACkAAAACAAEAAAAaACoAAAACAAEAAAAaACsAAAACAAEAAAAaACwAAAACAAEAAAAaAC0AAAACAAEAAAAaAC4AAAACAAEAAAAaAC8AAAACAAEAAAAaADAAAAACAAEAAAAaADEAAAACAAEAAAAaADIAAAACAAEAAAAaADMAAAACAAEAAAAaADQAAAACAAEAAAAaADUAAAACAAEAAAAaADYAAAACAAEAAAAaADcAAAACAAEAAAAaADgAAAACAAEAAAAbACkAAAACAAEAAAAbACoAAAACAAEAAAAbACsAAAACAAEAAAAbACwAAAACAAEAAAAbAC0AAAACAAEAAAAbAC4AAAACAAEAAAAbAC8AAAACAAEAAAAbADAAAAACAAEAAAAbADEAAAACAAEAAAAbADIAAAACAAEAAAAbADMAAAACAAEAAAAbADQAAAACAAEAAAAbADUAAAACAAEAAAAbADYAAAACAAEAAAAbADcAAAACAAEAAAAbADgAAAACAAEAAAAcACkAAAACAAEAAAAcACoAAAACAAEAAAAcACsAAAACAAEAAAAcACwAAAACAAEAAAAcAC0AAAACAAEAAAAcAC4AAAACAAEAAAAcAC8AAAACAAEAAAAcADAAAAACAAEAAAAcADEAAAACAAEAAAAcADIAAAACAAEAAAAcADMAAAACAAEAAAAcADQAAAACAAEAAAAcADUAAAACAAEAAAAcADYAAAACAAEAAAAcADcAAAACAAEAAAAcADgAAAACAAEAAAAdACkAAAACAAEAAAAdACoAAAACAAEAAAAdACsAAAACAAEAAAAdACwAAAACAAEAAAAdAC0AAAACAAEAAAAdAC4AAAACAAEAAAAdAC8AAAACAAEAAAAdADAAAAACAAEAAAAdADEAAAACAAEAAAAdADIAAAACAAEAAAAdADMAAAACAAEAAAAdADQAAAACAAEAAAAdADUAAAACAAEAAAAdADYAAAACAAEAAAAdADcAAAACAAEAAAAdADgAAAACAAEAAAAeACkAAAACAAEAAAAeACoAAAACAAEAAAAeACsAAAACAAEAAAAeACwAAAACAAEAAAAeAC0AAAACAAEAAAAeAC4AAAACAAEAAAAeAC8AAAACAAEAAAAeADAAAAACAAEAAAAeADEAAAACAAEAAAAeADIAAAACAAEAAAAeADMAAAACAAEAAAAeADQAAAACAAEAAAAeADUAAAACAAEAAAAeADYAAAACAAEAAAAeADcAAAACAAEAAAAeADgAAAACAAEAAAAfACkAAAACAAEAAAAfACoAAAACAAEAAAAfACsAAAACAAEAAAAfACwAAAACAAEAAAAfAC0AAAACAAEAAAAfAC4AAAACAAEAAAAfAC8AAAACAAEAAAAfADAAAAACAAEAAAAfADEAAAACAAEAAAAfADIAAAACAAEAAAAfADMAAAACAAEAAAAfADQAAAACAAEAAAAfADUAAAACAAEAAAAfADYAAAACAAEAAAAfADcAAAACAAEAAAAfADgAAAACAAEAAAAgACkAAAACAAEAAAAgACoAAAACAAEAAAAgACsAAAACAAEAAAAgACwAAAACAAEAAAAgAC0AAAACAAEAAAAgAC4AAAACAAEAAAAgAC8AAAACAAEAAAAgADAAAAACAAEAAAAgADEAAAACAAEAAAAgADIAAAACAAEAAAAgADMAAAACAAEAAAAgADQAAAACAAEAAAAgADUAAAACAAEAAAAgADYAAAACAAEAAAAgADcAAAACAAEAAAAgADgAAAACAAEAAAAhACkAAAACAAEAAAAhACoAAAACAAEAAAAhACsAAAACAAEAAAAhACwAAAACAAEAAAAhAC0AAAACAAEAAAAhAC4AAAACAAEAAAAhAC8AAAACAAEAAAAhADAAAAACAAEAAAAhADEAAAACAAEAAAAhADIAAAACAAEAAAAhADMAAAACAAEAAAAhADQAAAACAAEAAAAhADUAAAACAAEAAAAhADYAAAACAAEAAAAhADcAAAACAAEAAAAhADgAAAACAAEAAAAiACkAAAACAAEAAAAiACoAAAACAAEAAAAiACsAAAACAAEAAAAiACwAAAACAAEAAAAiAC0AAAACAAEAAAAiAC4AAAACAAEAAAAiAC8AAAACAAEAAAAiADAAAAACAAEAAAAiADEAAAACAAEAAAAiADIAAAACAAEAAAAiADMAAAACAAEAAAAiADQAAAACAAEAAAAiADUAAAACAAEAAAAiADYAAAACAAEAAAAiADcAAAACAAEAAAAiADgAAAACAAEAAAAjACkAAAACAAEAAAAjACoAAAACAAEAAAAjACsAAAACAAEAAAAjACwAAAACAAEAAAAjAC0AAAACAAEAAAAjAC4AAAACAAEAAAAjAC8AAAACAAEAAAAjADAAAAACAAEAAAAjADEAAAACAAEAAAAjADIAAAACAAEAAAAjADMAAAACAAEAAAAjADQAAAACAAEAAAAjADUAAAACAAEAAAAjADYAAAACAAEAAAAjADcAAAACAAEAAAAjADgAAAACAAEAAAAkACkAAAACAAEAAAAkACoAAAACAAEAAAAkACsAAAACAAEAAAAkACwAAAACAAEAAAAkAC0AAAACAAEAAAAkAC4AAAACAAEAAAAkAC8AAAACAAEAAAAkADAAAAACAAEAAAAkADEAAAACAAEAAAAkADIAAAACAAEAAAAkADMAAAACAAEAAAAkADQAAAACAAEAAAAkADUAAAACAAEAAAAkADYAAAACAAEAAAAkADcAAAACAAEAAAAkADgAAAACAAEAAAAlACkAAAACAAEAAAAlACoAAAACAAEAAAAlACsAAAACAAEAAAAlACwAAAACAAEAAAAlAC0AAAACAAEAAAAlAC4AAAACAAEAAAAlAC8AAAACAAEAAAAlADAAAAACAAEAAAAlADEAAAACAAEAAAAlADIAAAACAAEAAAAlADMAAAACAAEAAAAlADQAAAACAAEAAAAlADUAAAACAAEAAAAlADYAAAACAAEAAAAlADcAAAACAAEAAAAlADgAAAACAAEAAAAmACkAAAACAAEAAAAmACoAAAACAAEAAAAmACsAAAACAAEAAAAmACwAAAACAAEAAAAmAC0AAAACAAEAAAAmAC4AAAACAAEAAAAmAC8AAAACAAEAAAAmADAAAAACAAEAAAAmADEAAAACAAEAAAAmADIAAAACAAEAAAAmADMAAAACAAEAAAAmADQAAAACAAEAAAAmADUAAAACAAEAAAAmADYAAAACAAEAAAAmADcAAAACAAEAAAAmADgAAAACAAEAAAAnACkAAAACAAEAAAAnACoAAAACAAEAAAAnACsAAAACAAEAAAAnACwAAAACAAEAAAAnAC0AAAACAAEAAAAnAC4AAAACAAEAAAAnAC8AAAACAAEAAAAnADAAAAACAAEAAAAnADEAAAACAAEAAAAnADIAAAACAAEAAAAnADMAAAACAAEAAAAnADQAAAACAAEAAAAnADUAAAACAAEAAAAnADYAAAACAAEAAAAnADcAAAACAAEAAAAnADgAAAACAAEAAAAoACkAAAACAAEAAAAoACoAAAACAAEAAAAoACsAAAACAAEAAAAoACwAAAACAAEAAAAoAC0AAAACAAEAAAAoAC4AAAACAAEAAAAoAC8AAAACAAEAAAAoADAAAAACAAEAAAAoADEAAAACAAEAAAAoADIAAAACAAEAAAAoADMAAAACAAEAAAAoADQAAAACAAEAAAAoADUAAAACAAEAAAAoADYAAAACAAEAAAAoADcAAAACAAEAAAAoADgAAAACAAEAAAApACkAAAACAAEAAAApACoAAAACAAEAAAApACsAAAACAAEAAAApACwAAAACAAEAAAApAC0AAAACAAEAAAApAC4AAAACAAEAAAApAC8AAAACAAEAAAApADAAAAACAAEAAAApADEAAAACAAEAAAApADIAAAACAAEAAAApADMAAAACAAEAAAApADQAAAACAAEAAAApADUAAAACAAEAAAApADYAAAACAAEAAAApADcAAAACAAEAAAApADgAAAACAAEAAAAqACkAAAACAAEAAAAqACoAAAACAAEAAAAqACsAAAACAAEAAAAqACwAAAACAAEAAAAqAC0AAAACAAEAAAAqAC4AAAACAAEAAAAqAC8AAAACAAEAAAAqADAAAAACAAEAAAAqADEAAAACAAEAAAAqADIAAAACAAEAAAAqADMAAAACAAEAAAAqADQAAAACAAEAAAAqADUAAAACAAEAAAAqADYAAAACAAEAAAAqADcAAAACAAEAAAAqADgAAAACAAEAAAArACkAAAACAAEAAAArACoAAAACAAEAAAArACsAAAACAAEAAAArACwAAAACAAEAAAArAC0AAAACAAEAAAArAC4AAAACAAEAAAArAC8AAAACAAEAAAArADAAAAACAAEAAAArADEAAAACAAEAAAArADIAAAACAAEAAAArADMAAAACAAEAAAArADQAAAACAAEAAAArADUAAAACAAEAAAArADYAAAACAAEAAAArADcAAAACAAEAAAArADgAAAACAAEAAAAsACkAAAACAAEAAAAsACoAAAACAAEAAAAsACsAAAACAAEAAAAsACwAAAACAAEAAAAsAC0AAAACAAEAAAAsAC4AAAACAAEAAAAsAC8AAAACAAEAAAAsADAAAAACAAEAAAAsADEAAAACAAEAAAAsADIAAAACAAEAAAAsADMAAAACAAEAAAAsADQAAAACAAEAAAAsADUAAAACAAEAAAAsADYAAAACAAEAAAAsADcAAAACAAEAAAAsADgAAAACAAEAAAAtACkAAAACAAEAAAAtACoAAAACAAEAAAAtACsAAAACAAEAAAAtACwAAAACAAEAAAAtAC0AAAACAAEAAAAtAC4AAAACAAEAAAAtAC8AAAACAAEAAAAtADAAAAACAAEAAAAtADEAAAACAAEAAAAtADIAAAACAAEAAAAtADMAAAACAAEAAAAtADQAAAACAAEAAAAtADUAAAACAAEAAAAtADYAAAACAAEAAAAtADcAAAACAAEAAAAtADgAAAACAAEAAAAuACkAAAACAAEAAAAuACoAAAACAAEAAAAuACsAAAACAAEAAAAuACwAAAACAAEAAAAuAC0AAAACAAEAAAAuAC4AAAACAAEAAAAuAC8AAAACAAEAAAAuADAAAAACAAEAAAAuADEAAAACAAEAAAAuADIAAAACAAEAAAAuADMAAAACAAEAAAAuADQAAAACAAEAAAAuADUAAAACAAEAAAAuADYAAAACAAEAAAAuADcAAAACAAEAAAAuADgAAAACAAEAAAAvACkAAAACAAEAAAAvACoAAAACAAEAAAAvACsAAAACAAEAAAAvACwAAAACAAEAAAAvAC0AAAACAAEAAAAvAC4AAAACAAEAAAAvAC8AAAACAAEAAAAvADAAAAACAAEAAAAvADEAAAACAAEAAAAvADIAAAACAAEAAAAvADMAAAACAAEAAAAvADQAAAACAAEAAAAvADUAAAACAAEAAAAvADYAAAACAAEAAAAvADcAAAACAAEAAAAvADgAAAACAAEAAAAwACkAAAACAAEAAAAwACoAAAACAAEAAAAwACsAAAACAAEAAAAwACwAAAACAAEAAAAwAC0AAAACAAEAAAAwAC4AAAACAAEAAAAwAC8AAAACAAEAAAAwADAAAAACAAEAAAAwADEAAAACAAEAAAAwADIAAAACAAEAAAAwADMAAAACAAEAAAAwADQAAAACAAEAAAAwADUAAAACAAEAAAAwADYAAAACAAEAAAAwADcAAAACAAEAAAAwADgAAAACAAEAAAAxACkAAAACAAEAAAAxACoAAAACAAEAAAAxACsAAAACAAEAAAAxACwAAAACAAEAAAAxAC0AAAACAAEAAAAxAC4AAAACAAEAAAAxAC8AAAACAAEAAAAxADAAAAACAAEAAAAxADEAAAACAAEAAAAxADIAAAACAAEAAAAxADMAAAACAAEAAAAxADQAAAACAAEAAAAxADUAAAACAAEAAAAxADYAAAACAAEAAAAxADcAAAACAAEAAAAxADgAAAACAAEAAAAyACkAAAACAAEAAAAyACoAAAACAAEAAAAyACsAAAACAAEAAAAyACwAAAACAAEAAAAyAC0AAAACAAEAAAAyAC4AAAACAAEAAAAyAC8AAAACAAEAAAAyADAAAAACAAEAAAAyADEAAAACAAEAAAAyADIAAAACAAEAAAAyADMAAAACAAEAAAAyADQAAAACAAEAAAAyADUAAAACAAEAAAAyADYAAAACAAEAAAAyADcAAAACAAEAAAAyADgAAAACAAEAAAAzACkAAAACAAEAAAAzACoAAAACAAEAAAAzACsAAAACAAEAAAAzACwAAAACAAEAAAAzAC0AAAACAAEAAAAzAC4AAAACAAEAAAAzAC8AAAACAAEAAAAzADAAAAACAAEAAAAzADEAAAACAAEAAAAzADIAAAACAAEAAAAzADMAAAACAAEAAAAzADQAAAACAAEAAAAzADUAAAACAAEAAAAzADYAAAACAAEAAAAzADcAAAACAAEAAAAzADgAAAACAAEAAAA0ACkAAAACAAEAAAA0ACoAAAACAAEAAAA0ACsAAAACAAEAAAA0ACwAAAACAAEAAAA0AC0AAAACAAEAAAA0AC4AAAACAAEAAAA0AC8AAAACAAEAAAA0ADAAAAACAAEAAAA0ADEAAAACAAEAAAA0ADIAAAACAAEAAAA0ADMAAAACAAEAAAA0ADQAAAACAAEAAAA0ADUAAAACAAEAAAA0ADYAAAACAAEAAAA0ADcAAAACAAEAAAA0ADgAAAACAAEAAAA1ACkAAAACAAEAAAA1ACoAAAACAAEAAAA1ACsAAAACAAEAAAA1ACwAAAACAAEAAAA1AC0AAAACAAEAAAA1AC4AAAACAAEAAAA1AC8AAAACAAEAAAA1ADAAAAACAAEAAAA1ADEAAAACAAEAAAA1ADIAAAACAAEAAAA1ADMAAAACAAEAAAA1ADQAAAACAAEAAAA1ADUAAAACAAEAAAA1ADYAAAACAAEAAAA1ADcAAAACAAEAAAA1ADgAAAACAAEAAAA2ACkAAAACAAEAAAA2ACoAAAACAAEAAAA2ACsAAAACAAEAAAA2ACwAAAACAAEAAAA2AC0AAAACAAEAAAA2AC4AAAACAAEAAAA2AC8AAAACAAEAAAA2ADAAAAACAAEAAAA2ADEAAAACAAEAAAA2ADIAAAACAAEAAAA2ADMAAAACAAEAAAA2ADQAAAACAAEAAAA2ADUAAAACAAEAAAA2ADYAAAACAAEAAAA2ADcAAAACAAEAAAA2ADgAAAACAAEAAAA3ACkAAAACAAEAAAA3ACoAAAACAAEAAAA3ACsAAAACAAEAAAA3ACwAAAACAAEAAAA3AC0AAAACAAEAAAA3AC4AAAACAAEAAAA3AC8AAAACAAEAAAA3ADAAAAACAAEAAAA3ADEAAAACAAEAAAA3ADIAAAACAAEAAAA3ADMAAAACAAEAAAA3ADQAAAACAAEAAAA3ADUAAAACAAEAAAA3ADYAAAACAAEAAAA3ADcAAAACAAEAAAA3ADgAAAACAAEAAAA4ACkAAAACAAEAAAA4ACoAAAACAAEAAAA4ACsAAAACAAEAAAA4ACwAAAACAAEAAAA4AC0AAAACAAEAAAA4AC4AAAACAAEAAAA4AC8AAAACAAEAAAA4ADAAAAACAAEAAAA4ADEAAAACAAEAAAA4ADIAAAACAAEAAAA4ADMAAAACAAEAAAA4ADQAAAACAAEAAAA4ADUAAAACAAEAAAA4ADYAAAACAAEAAAA4ADcAAAACAAEAAAA4ADgAAAACAAEAAAA5ACkAAAACAAEAAAA5ACoAAAACAAEAAAA5ACsAAAACAAEAAAA5ACwAAAACAAEAAAA5AC0AAAACAAEAAAA5AC4AAAACAAEAAAA5AC8AAAACAAEAAAA5ADAAAAACAAEAAAA5ADEAAAACAAEAAAA5ADIAAAACAAEAAAA5ADMAAAACAAEAAAA5ADQAAAACAAEAAAA5ADUAAAACAAEAAAA5ADYAAAACAAEAAAA5ADcAAAACAAEAAAA5ADgAAAACAAEAAAA6ACkAAAACAAEAAAA6ACoAAAACAAEAAAA6ACsAAAACAAEAAAA6ACwAAAACAAEAAAA6AC0AAAACAAEAAAA6AC4AAAACAAEAAAA6AC8AAAACAAEAAAA6ADAAAAACAAEAAAA6ADEAAAACAAEAAAA6ADIAAAACAAEAAAA6ADMAAAACAAEAAAA6ADQAAAACAAEAAAA6ADUAAAACAAEAAAA6ADYAAAACAAEAAAA6ADcAAAACAAEAAAA6ADgAAAACAAEAAAA7ACkAAAACAAEAAAA7ACoAAAACAAEAAAA7ACsAAAACAAEAAAA7ACwAAAACAAEAAAA7AC0AAAACAAEAAAA7AC4AAAACAAEAAAA7AC8AAAACAAEAAAA7ADAAAAACAAEAAAA7ADEAAAACAAEAAAA7ADIAAAACAAEAAAA7ADMAAAACAAEAAAA7ADQAAAACAAEAAAA7ADUAAAACAAEAAAA7ADYAAAACAAEAAAA7ADcAAAACAAEAAAA7ADgAAAACAAEAAAA8ACkAAAACAAEAAAA8ACoAAAACAAEAAAA8ACsAAAACAAEAAAA8ACwAAAACAAEAAAA8AC0AAAACAAEAAAA8AC4AAAACAAEAAAA8AC8AAAACAAEAAAA8ADAAAAACAAEAAAA8ADEAAAACAAEAAAA8ADIAAAACAAEAAAA8ADMAAAACAAEAAAA8ADQAAAACAAEAAAA8ADUAAAACAAEAAAA8ADYAAAACAAEAAAA8ADcAAAACAAEAAAA8ADgAAAACAAEAAAA9ACkAAAACAAEAAAA9ACoAAAACAAEAAAA9ACsAAAACAAEAAAA9ACwAAAACAAEAAAA9AC0AAAACAAEAAAA9AC4AAAACAAEAAAA9AC8AAAACAAEAAAA9ADAAAAACAAEAAAA9ADEAAAACAAEAAAA9ADIAAAACAAEAAAA9ADMAAAACAAEAAAA9ADQAAAACAAEAAAA9ADUAAAACAAEAAAA9ADYAAAACAAEAAAA9ADcAAAACAAEAAAA9ADgAAAACAAEAAAA+ACkAAAACAAEAAAA+ACoAAAACAAEAAAA+ACsAAAACAAEAAAA+ACwAAAACAAEAAAA+AC0AAAACAAEAAAA+AC4AAAACAAEAAAA+AC8AAAACAAEAAAA+ADAAAAACAAEAAAA+ADEAAAACAAEAAAA+ADIAAAACAAEAAAA+ADMAAAACAAEAAAA+ADQAAAACAAEAAAA+ADUAAAACAAEAAAA+ADYAAAACAAEAAAA+ADcAAAACAAEAAAA+ADgAAAACAAEAAAA/ACkAAAACAAEAAAA/ACoAAAACAAEAAAA/ACsAAAACAAEAAAA/ACwAAAACAAEAAAA/AC0AAAACAAEAAAA/AC4AAAACAAEAAAA/AC8AAAACAAEAAAA/ADAAAAACAAEAAAA/ADEAAAACAAEAAAA/ADIAAAACAAEAAAA/ADMAAAACAAEAAAA/ADQAAAACAAEAAAA/ADUAAAACAAEAAAA/ADYAAAACAAEAAAA/ADcAAAACAAEAAAA/ADgAAAACAAEAAABAACkAAAACAAEAAABAACoAAAACAAEAAABAACsAAAACAAEAAABAACwAAAACAAEAAABAAC0AAAACAAEAAABAAC4AAAACAAEAAABAAC8AAAACAAEAAABAADAAAAACAAEAAABAADEAAAACAAEAAABAADIAAAACAAEAAABAADMAAAACAAEAAABAADQAAAACAAEAAABAADUAAAACAAEAAABAADYAAAACAAEAAABAADcAAAACAAEAAABAADgAAAACAAEAAABBACkAAAACAAEAAABBACoAAAACAAEAAABBACsAAAACAAEAAABBACwAAAACAAEAAABBAC0AAAACAAEAAABBAC4AAAACAAEAAABBAC8AAAACAAEAAABBADAAAAACAAEAAABBADEAAAACAAEAAABBADIAAAACAAEAAABBADMAAAACAAEAAABBADQAAAACAAEAAABBADUAAAACAAEAAABBADYAAAACAAEAAABBADcAAAACAAEAAABBADgAAAACAAEAAABCACkAAAACAAEAAABCACoAAAACAAEAAABCACsAAAACAAEAAABCACwAAAACAAEAAABCAC0AAAACAAEAAABCAC4AAAACAAEAAABCAC8AAAACAAEAAABCADAAAAACAAEAAABCADEAAAACAAEAAABCADIAAAACAAEAAABCADMAAAACAAEAAABCADQAAAACAAEAAABCADUAAAACAAEAAABCADYAAAACAAEAAABCADcAAAACAAEAAABCADgAAAACAAEAAABDACkAAAACAAEAAABDACoAAAACAAEAAABDACsAAAACAAEAAABDACwAAAACAAEAAABDAC0AAAACAAEAAABDAC4AAAACAAEAAABDAC8AAAACAAEAAABDADAAAAACAAEAAABDADEAAAACAAEAAABDADIAAAACAAEAAABDADMAAAACAAEAAABDADQAAAACAAEAAABDADUAAAACAAEAAABDADYAAAACAAEAAABDADcAAAACAAEAAABDADgAAAACAAEAAABEACkAAAACAAEAAABEACoAAAACAAEAAABEACsAAAACAAEAAABEACwAAAACAAEAAABEAC0AAAACAAEAAABEAC4AAAACAAEAAABEAC8AAAACAAEAAABEADAAAAACAAEAAABEADEAAAACAAEAAABEADIAAAACAAEAAABEADMAAAACAAEAAABEADQAAAACAAEAAABEADUAAAACAAEAAABEADYAAAACAAEAAABEADcAAAACAAEAAABEADgAAAACAAEAAABFACkAAAACAAEAAABFACoAAAACAAEAAABFACsAAAACAAEAAABFACwAAAACAAEAAABFAC0AAAACAAEAAABFAC4AAAACAAEAAABFAC8AAAACAAEAAABFADAAAAACAAEAAABFADEAAAACAAEAAABFADIAAAACAAEAAABFADMAAAACAAEAAABFADQAAAACAAEAAABFADUAAAACAAEAAABFADYAAAACAAEAAABFADcAAAACAAEAAABFADgAAAACAAEAAABGACkAAAACAAEAAABGACoAAAACAAEAAABGACsAAAACAAEAAABGACwAAAACAAEAAABGAC0AAAACAAEAAABGAC4AAAACAAEAAABGAC8AAAACAAEAAABGADAAAAACAAEAAABGADEAAAACAAEAAABGADIAAAACAAEAAABGADMAAAACAAEAAABGADQAAAACAAEAAABGADUAAAACAAEAAABGADYAAAACAAEAAABGADcAAAACAAEAAABGADgAAAACAAEAAABHACkAAAACAAEAAABHACoAAAACAAEAAABHACsAAAACAAEAAABHACwAAAACAAEAAABHAC0AAAACAAEAAABHAC4AAAACAAEAAABHAC8AAAACAAEAAABHADAAAAACAAEAAABHADEAAAACAAEAAABHADIAAAACAAEAAABHADMAAAACAAEAAABHADQAAAACAAEAAABHADUAAAACAAEAAABHADYAAAACAAEAAABHADcAAAACAAEAAABHADgAAAACAAEAAABIACYAAAACAAEAAABIACcAAAACAAEAAABIACgAAAACAAEAAABIACkAAAACAAEAAABIACoAAAACAAEAAABIACsAAAACAAEAAABIACwAAAACAAEAAABIAC0AAAACAAEAAABIAC4AAAACAAEAAABIAC8AAAACAAEAAABIADAAAAACAAEAAABIADEAAAACAAEAAABIADIAAAACAAEAAABIADMAAAACAAEAAABIADQAAAACAAEAAABIADUAAAACAAEAAABIADYAAAACAAEAAABIADcAAAACAAEAAABIADgAAAACAAEAAABJACYAAAACAAEAAABJACcAAAACAAEAAABJACgAAAACAAEAAABJACkAAAACAAEAAABJACoAAAACAAEAAABJACsAAAACAAEAAABJACwAAAACAAEAAABJAC0AAAACAAEAAABJAC4AAAACAAEAAABJAC8AAAACAAEAAABJADAAAAACAAEAAABJADEAAAACAAEAAABJADIAAAACAAEAAABJADMAAAACAAEAAABJADQAAAACAAEAAABJADUAAAACAAEAAABJADYAAAACAAEAAABJADcAAAACAAEAAABJADgAAAACAAEAAABKACYAAAACAAEAAABKACcAAAACAAEAAABKACgAAAACAAEAAABKACkAAAACAAEAAABKACoAAAACAAEAAABKACsAAAACAAEAAABKACwAAAACAAEAAABKAC0AAAACAAEAAABKAC4AAAACAAEAAABKAC8AAAACAAEAAABKADAAAAACAAEAAABKADEAAAACAAEAAABKADIAAAACAAEAAABKADMAAAACAAEAAABKADQAAAACAAEAAABKADUAAAACAAEAAABKADYAAAACAAEAAABKADcAAAACAAEAAABKADgAAAACAAEAAABLACYAAAACAAEAAABLACcAAAACAAEAAABLACgAAAACAAEAAABLACkAAAACAAEAAABLACoAAAACAAEAAABLACsAAAACAAEAAABLACwAAAACAAEAAABLAC0AAAACAAEAAABLAC4AAAACAAEAAABLAC8AAAACAAEAAABLADAAAAACAAEAAABLADEAAAACAAEAAABLADIAAAACAAEAAABLADMAAAACAAEAAABLADQAAAACAAEAAABLADUAAAACAAEAAABLADYAAAACAAEAAABLADcAAAACAAEAAABLADgAAAACAAEAAABMACYAAAACAAEAAABMACcAAAACAAEAAABMACgAAAACAAEAAABMACkAAAACAAEAAABMACoAAAACAAEAAABMACsAAAACAAEAAABMACwAAAACAAEAAABMAC0AAAACAAEAAABMAC4AAAACAAEAAABMAC8AAAACAAEAAABMADAAAAACAAEAAABMADEAAAACAAEAAABMADIAAAACAAEAAABMADMAAAACAAEAAABMADQAAAACAAEAAABMADUAAAACAAEAAABMADYAAAACAAEAAABMADcAAAACAAEAAABMADgAAAACAAEAAABNACYAAAACAAEAAABNACcAAAACAAEAAABNACgAAAACAAEAAABNACkAAAACAAEAAABNACoAAAACAAEAAABNACsAAAACAAEAAABNACwAAAACAAEAAABNAC0AAAACAAEAAABNAC4AAAACAAEAAABNAC8AAAACAAEAAABNADAAAAACAAEAAABNADEAAAACAAEAAABNADIAAAACAAEAAABNADMAAAACAAEAAABNADQAAAACAAEAAABNADUAAAACAAEAAABNADYAAAACAAEAAABNADcAAAACAAEAAABNADgAAAACAAEAAABOACYAAAACAAEAAABOACcAAAACAAEAAABOACgAAAACAAEAAABOACkAAAACAAEAAABOACoAAAACAAEAAABOACsAAAACAAEAAABOACwAAAACAAEAAABOAC0AAAACAAEAAABOAC4AAAACAAEAAABOAC8AAAACAAEAAABOADAAAAACAAEAAABOADEAAAACAAEAAABOADIAAAACAAEAAABOADMAAAACAAEAAABOADQAAAACAAEAAABOADUAAAACAAEAAABOADYAAAACAAEAAABOADcAAAACAAEAAABOADgAAAACAAEAAABPACYAAAACAAEAAABPACcAAAACAAEAAABPACgAAAACAAEAAABPACkAAAACAAEAAABPACoAAAACAAEAAABPACsAAAACAAEAAABPACwAAAACAAEAAABPAC0AAAACAAEAAABPAC4AAAACAAEAAABPAC8AAAACAAEAAABPADAAAAACAAEAAABPADEAAAACAAEAAABPADIAAAACAAEAAABPADMAAAACAAEAAABPADQAAAACAAEAAABPADUAAAACAAEAAABPADYAAAACAAEAAABPADcAAAACAAEAAABPADgAAAACAAEAAABQACYAAAACAAEAAABQACcAAAACAAEAAABQACgAAAACAAEAAABQACkAAAACAAEAAABQACoAAAACAAEAAABQACsAAAACAAEAAABQACwAAAACAAEAAABQAC0AAAACAAEAAABQAC4AAAACAAEAAABQAC8AAAACAAEAAABQADAAAAACAAEAAABQADEAAAACAAEAAABQADIAAAACAAEAAABQADMAAAACAAEAAABQADQAAAACAAEAAABQADUAAAACAAEAAABQADYAAAACAAEAAABQADcAAAACAAEAAABQADgAAAACAAEAAABRACYAAAACAAEAAABRACcAAAACAAEAAABRACgAAAACAAEAAABRACkAAAACAAEAAABRACoAAAACAAEAAABRACsAAAACAAEAAABRACwAAAACAAEAAABRAC0AAAACAAEAAABRAC4AAAACAAEAAABRAC8AAAACAAEAAABRADAAAAACAAEAAABRADEAAAACAAEAAABRADIAAAACAAEAAABRADMAAAACAAEAAABRADQAAAACAAEAAABRADUAAAACAAEAAABRADYAAAACAAEAAABRADcAAAACAAEAAABRADgAAAACAAEAAABSACYAAAACAAEAAABSACcAAAACAAEAAABSACgAAAACAAEAAABSACkAAAACAAEAAABSACoAAAACAAEAAABSACsAAAACAAEAAABSACwAAAACAAEAAABSAC0AAAACAAEAAABSAC4AAAACAAEAAABSAC8AAAACAAEAAABSADAAAAACAAEAAABSADEAAAACAAEAAABSADIAAAACAAEAAABSADMAAAACAAEAAABSADQAAAACAAEAAABSADUAAAACAAEAAABSADYAAAACAAEAAABSADcAAAACAAEAAABSADgAAAACAAEAAABTACYAAAACAAEAAABTACcAAAACAAEAAABTACgAAAACAAEAAABTACkAAAACAAEAAABTACoAAAACAAEAAABTACsAAAACAAEAAABTACwAAAACAAEAAABTAC0AAAACAAEAAABTAC4AAAACAAEAAABTAC8AAAACAAEAAABTADAAAAACAAEAAABTADEAAAACAAEAAABTADIAAAACAAEAAABTADMAAAACAAEAAABTADQAAAACAAEAAABTADUAAAACAAEAAABTADYAAAACAAEAAABTADcAAAACAAEAAABTADgAAAACAAEAAABUACYAAAACAAEAAABUACcAAAACAAEAAABUACgAAAACAAEAAABUACkAAAACAAEAAABUACoAAAACAAEAAABUACsAAAACAAEAAABUACwAAAACAAEAAABUAC0AAAACAAEAAABUAC4AAAACAAEAAABUAC8AAAACAAEAAABUADAAAAACAAEAAABUADEAAAACAAEAAABUADIAAAACAAEAAABUADMAAAACAAEAAABUADQAAAACAAEAAABUADUAAAACAAEAAABUADYAAAACAAEAAABUADcAAAACAAEAAABUADgAAAACAAEAAABVACYAAAACAAEAAABVACcAAAACAAEAAABVACgAAAACAAEAAABVACkAAAACAAEAAABVACoAAAACAAEAAABVACsAAAACAAEAAABVACwAAAACAAEAAABVAC0AAAACAAEAAABVAC4AAAACAAEAAABVAC8AAAACAAEAAABVADAAAAACAAEAAABVADEAAAACAAEAAABVADIAAAACAAEAAABVADMAAAACAAEAAABVADQAAAACAAEAAABVADUAAAACAAEAAABVADYAAAACAAEAAABVADcAAAACAAEAAABVADgAAAACAAEAAABWACYAAAACAAEAAABWACcAAAACAAEAAABWACgAAAACAAEAAABWACkAAAACAAEAAABWACoAAAACAAEAAABWACsAAAACAAEAAABWACwAAAACAAEAAABWAC0AAAACAAEAAABWAC4AAAACAAEAAABWAC8AAAACAAEAAABWADAAAAACAAEAAABWADEAAAACAAEAAABWADIAAAACAAEAAABWADMAAAACAAEAAABWADQAAAACAAEAAABWADUAAAACAAEAAABWADYAAAACAAEAAABWADcAAAACAAEAAABWADgAAAACAAEAAABXACYAAAACAAEAAABXACcAAAACAAEAAABXACgAAAACAAEAAABXACkAAAACAAEAAABXACoAAAACAAEAAABXACsAAAACAAEAAABXACwAAAACAAEAAABXAC0AAAACAAEAAABXAC4AAAACAAEAAABXAC8AAAACAAEAAABXADAAAAACAAEAAABXADEAAAACAAEAAABXADIAAAACAAEAAABXADMAAAACAAEAAABXADQAAAACAAEAAABXADUAAAACAAEAAABXADYAAAACAAEAAABXADcAAAACAAEAAABXADgAAAACAAEAAABYACYAAAACAAEAAABYACcAAAACAAEAAABYACgAAAACAAEAAABYACkAAAACAAEAAABYACoAAAACAAEAAABYACsAAAACAAEAAABYACwAAAACAAEAAABYAC0AAAACAAEAAABYAC4AAAACAAEAAABYAC8AAAACAAEAAABYADAAAAACAAEAAABYADEAAAACAAEAAABYADIAAAACAAEAAABYADMAAAACAAEAAABYADQAAAACAAEAAABYADUAAAACAAEAAABYADYAAAACAAEAAABYADcAAAACAAEAAABYADgAAAACAAEAAABZACYAAAACAAEAAABZACcAAAACAAEAAABZACgAAAACAAEAAABZACkAAAACAAEAAABZACoAAAACAAEAAABZACsAAAACAAEAAABZACwAAAACAAEAAABZAC0AAAACAAEAAABZAC4AAAACAAEAAABZAC8AAAACAAEAAABZADAAAAACAAEAAABZADEAAAACAAEAAABZADIAAAACAAEAAABZADMAAAACAAEAAABZADQAAAACAAEAAABZADUAAAACAAEAAABZADYAAAACAAEAAABZADcAAAACAAEAAABZADgAAAACAAEAAABaACYAAAACAAEAAABaACcAAAACAAEAAABaACgAAAACAAEAAABaACkAAAACAAEAAABaACoAAAACAAEAAABaACsAAAACAAEAAABaACwAAAACAAEAAABaAC0AAAACAAEAAABaAC4AAAACAAEAAABaAC8AAAACAAEAAABaADAAAAACAAEAAABaADEAAAACAAEAAABaADIAAAACAAEAAABaADMAAAACAAEAAABaADQAAAACAAEAAABaADUAAAACAAEAAABaADYAAAACAAEAAABaADcAAAACAAEAAABaADgAAAACAAEAAABbACYAAAACAAEAAABbACcAAAACAAEAAABbACgAAAACAAEAAABbACkAAAACAAEAAABbACoAAAACAAEAAABbACsAAAACAAEAAABbACwAAAACAAEAAABbAC0AAAACAAEAAABbAC4AAAACAAEAAABbAC8AAAACAAEAAABbADAAAAACAAEAAABbADEAAAACAAEAAABbADIAAAACAAEAAABbADMAAAACAAEAAABbADQAAAACAAEAAABbADUAAAACAAEAAABbADYAAAACAAEAAABbADcAAAACAAEAAABbADgAAAACAAEAAABcACYAAAACAAEAAABcACcAAAACAAEAAABcACgAAAACAAEAAABcACkAAAACAAEAAABcACoAAAACAAEAAABcACsAAAACAAEAAABcACwAAAACAAEAAABcAC0AAAACAAEAAABcAC4AAAACAAEAAABcAC8AAAACAAEAAABcADAAAAACAAEAAABcADEAAAACAAEAAABcADIAAAACAAEAAABcADMAAAACAAEAAABcADQAAAACAAEAAABcADUAAAACAAEAAABcADYAAAACAAEAAABcADcAAAACAAEAAABcADgAAAACAAEAAABdACYAAAACAAEAAABdACcAAAACAAEAAABdACgAAAACAAEAAABdACkAAAACAAEAAABdACoAAAACAAEAAABdACsAAAACAAEAAABdACwAAAACAAEAAABdAC0AAAACAAEAAABdAC4AAAACAAEAAABdAC8AAAACAAEAAABdADAAAAACAAEAAABdADEAAAACAAEAAABdADIAAAACAAEAAABdADMAAAACAAEAAABdADQAAAACAAEAAABdADUAAAACAAEAAABdADYAAAACAAEAAABdADcAAAACAAEAAABdADgAAAACAAEAAABeACYAAAACAAEAAABeACcAAAACAAEAAABeACgAAAACAAEAAABeACkAAAACAAEAAABeACoAAAACAAEAAABeACsAAAACAAEAAABeACwAAAACAAEAAABeAC0AAAACAAEAAABeAC4AAAACAAEAAABeAC8AAAACAAEAAABeADAAAAACAAEAAABeADEAAAACAAEAAABeADIAAAACAAEAAABeADMAAAACAAEAAABeADQAAAACAAEAAABeADUAAAACAAEAAABeADYAAAACAAEAAABeADcAAAACAAEAAABeADgAAAACAAEAAABfACYAAAACAAEAAABfACcAAAACAAEAAABfACgAAAACAAEAAABfACkAAAACAAEAAABfACoAAAACAAEAAABfACsAAAACAAEAAABfACwAAAACAAEAAABfAC0AAAACAAEAAABfAC4AAAACAAEAAABfAC8AAAACAAEAAABfADAAAAACAAEAAABfADEAAAACAAEAAABfADIAAAACAAEAAABfADMAAAACAAEAAABfADQAAAACAAEAAABfADUAAAACAAEAAABfADYAAAACAAEAAABfADcAAAACAAEAAABfADgAAAACAAEAAABgACYAAAACAAEAAABgACcAAAACAAEAAABgACgAAAACAAEAAABgACkAAAACAAEAAABgACoAAAACAAEAAABgACsAAAACAAEAAABgACwAAAACAAEAAABgAC0AAAACAAEAAABgAC4AAAACAAEAAABgAC8AAAACAAEAAABgADAAAAACAAEAAABgADEAAAACAAEAAABgADIAAAACAAEAAABgADMAAAACAAEAAABgADQAAAACAAEAAABgADUAAAACAAEAAABgADYAAAACAAEAAABgADcAAAACAAEAAABgADgAAAACAAEAAABhACYAAAACAAEAAABhACcAAAACAAEAAABhACgAAAACAAEAAABhACkAAAACAAEAAABhACoAAAACAAEAAABhACsAAAACAAEAAABhACwAAAACAAEAAABhAC0AAAACAAEAAABhAC4AAAACAAEAAABhAC8AAAACAAEAAABhADAAAAACAAEAAABhADEAAAACAAEAAABhADIAAAACAAEAAABhADMAAAACAAEAAABhADQAAAACAAEAAABhADUAAAACAAEAAABhADYAAAACAAEAAABhADcAAAACAAEAAABhADgAAAACAAEAAABiACYAAAACAAEAAABiACcAAAACAAEAAABiACgAAAACAAEAAABiACkAAAACAAEAAABiACoAAAACAAEAAABiACsAAAACAAEAAABiACwAAAACAAEAAABiAC0AAAACAAEAAABiAC4AAAACAAEAAABiAC8AAAACAAEAAABiADAAAAACAAEAAABiADEAAAACAAEAAABiADIAAAACAAEAAABiADMAAAACAAEAAABiADQAAAACAAEAAABiADUAAAACAAEAAABiADYAAAACAAEAAABiADcAAAACAAEAAABiADgAAAACAAEAAABjACYAAAACAAEAAABjACcAAAACAAEAAABjACgAAAACAAEAAABjACkAAAACAAEAAABjACoAAAACAAEAAABjACsAAAACAAEAAABjACwAAAACAAEAAABjAC0AAAACAAEAAABjAC4AAAACAAEAAABjAC8AAAACAAEAAABjADAAAAACAAEAAABjADEAAAACAAEAAABjADIAAAACAAEAAABjADMAAAACAAEAAABjADQAAAACAAEAAABjADUAAAACAAEAAABjADYAAAACAAEAAABjADcAAAACAAEAAABjADgAAAACAAEAAABkACYAAAACAAEAAABkACcAAAACAAEAAABkACgAAAACAAEAAABkACkAAAACAAEAAABkACoAAAACAAEAAABkACsAAAACAAEAAABkACwAAAACAAEAAABkAC0AAAACAAEAAABkAC4AAAACAAEAAABkAC8AAAACAAEAAABkADAAAAACAAEAAABkADEAAAACAAEAAABkADIAAAACAAEAAABkADMAAAACAAEAAABkADQAAAACAAEAAABkADUAAAACAAEAAABkADYAAAACAAEAAABkADcAAAACAAEAAABkADgAAAACAAEAAABlACYAAAACAAEAAABlACcAAAACAAEAAABlACgAAAACAAEAAABlACkAAAACAAEAAABlACoAAAACAAEAAABlACsAAAACAAEAAABlACwAAAACAAEAAABlAC0AAAACAAEAAABlAC4AAAACAAEAAABlAC8AAAACAAEAAABlADAAAAACAAEAAABlADEAAAACAAEAAABlADIAAAACAAEAAABlADMAAAACAAEAAABlADQAAAACAAEAAABlADUAAAACAAEAAABlADYAAAACAAEAAABlADcAAAACAAEAAABlADgAAAACAAEAAABmACYAAAACAAEAAABmACcAAAACAAEAAABmACgAAAACAAEAAABmACkAAAACAAEAAABmACoAAAACAAEAAABmACsAAAACAAEAAABmACwAAAACAAEAAABmAC0AAAACAAEAAABmAC4AAAACAAEAAABmAC8AAAACAAEAAABmADAAAAACAAEAAABmADEAAAACAAEAAABmADIAAAACAAEAAABmADMAAAACAAEAAABmADQAAAACAAEAAABmADUAAAACAAEAAABmADYAAAACAAEAAABmADcAAAACAAEAAABmADgAAAACAAEAAABGAPL/AAACAAEAAABGAPP/AAACAAEAAABGAPT/AAACAAEAAABGAPX/AAACAAEAAABGAPb/AAACAAEAAABGAPf/AAACAAEAAABGAPj/AAACAAEAAABGAPn/AAACAAEAAABGAPr/AAACAAEAAABGAPv/AAACAAEAAABGAPz/AAACAAEAAABGAP3/AAACAAEAAABGAP7/AAACAAEAAABGAP//AAACAAEAAABHAPL/AAACAAEAAABHAPP/AAACAAEAAABHAPT/AAACAAEAAABHAPX/AAACAAEAAABHAPb/AAACAAEAAABHAPf/AAACAAEAAABHAPj/AAACAAEAAABHAPn/AAACAAEAAABHAPr/AAACAAEAAABHAPv/AAACAAEAAABHAPz/AAACAAEAAABHAP3/AAACAAEAAABHAP7/AAACAAEAAABHAP//AAACAAEAAABIAPL/AAACAAEAAABIAPP/AAACAAEAAABIAPT/AAACAAEAAABIAPX/AAACAAEAAABIAPb/AAACAAEAAABIAPf/AAACAAEAAABIAPj/AAACAAEAAABIAPn/AAACAAEAAABIAPr/AAACAAEAAABIAPv/AAACAAEAAABIAPz/AAACAAEAAABIAP3/AAACAAEAAABIAP7/AAACAAEAAABIAP//AAACAAEAAABIAAAAAAACAAEAAABIAAEAAAACAAEAAABIAAIAAAACAAEAAABIAAMAAAACAAEAAABIAAQAAAACAAEAAABIAAUAAAACAAEAAABIAAYAAAACAAEAAABIAAcAAAACAAEAAABIAAgAAAACAAEAAABIAAkAAAACAAEAAABIAAoAAAACAAEAAABIAAsAAAACAAEAAABIAAwAAAACAAEAAABIAA0AAAACAAEAAABIAA4AAAACAAEAAABIAA8AAAACAAEAAABIABAAAAACAAEAAABIABEAAAACAAEAAABIABIAAAACAAEAAABIABMAAAACAAEAAABIABQAAAACAAEAAABIABUAAAACAAEAAABIABYAAAACAAEAAABIABcAAAACAAEAAABIABgAAAACAAEAAABIABkAAAACAAEAAABIABoAAAACAAEAAABIABsAAAACAAEAAABIABwAAAACAAEAAABIAB0AAAACAAEAAABIAB4AAAACAAEAAABIAB8AAAACAAEAAABIACAAAAACAAEAAABIACEAAAACAAEAAABIACIAAAACAAEAAABIACMAAAACAAEAAABIACQAAAACAAEAAABIACUAAAACAAEAAABJAPL/AAACAAEAAABJAPP/AAACAAEAAABJAPT/AAACAAEAAABJAPX/AAACAAEAAABJAPb/AAACAAEAAABJAPf/AAACAAEAAABJAPj/AAACAAEAAABJAPn/AAACAAEAAABJAPr/AAACAAEAAABJAPv/AAACAAEAAABJAPz/AAACAAEAAABJAP3/AAACAAEAAABJAP7/AAACAAEAAABJAP//AAACAAEAAABJAAAAAAACAAEAAABJAAEAAAACAAEAAABJAAIAAAACAAEAAABJAAMAAAACAAEAAABJAAQAAAACAAEAAABJAAUAAAACAAEAAABJAAYAAAACAAEAAABJAAcAAAACAAEAAABJAAgAAAACAAEAAABJAAkAAAACAAEAAABJAAoAAAACAAEAAABJAAsAAAACAAEAAABJAAwAAAACAAEAAABJAA0AAAACAAEAAABJAA4AAAACAAEAAABJAA8AAAACAAEAAABJABAAAAACAAEAAABJABEAAAACAAEAAABJABIAAAACAAEAAABJABMAAAACAAEAAABJABQAAAACAAEAAABJABUAAAACAAEAAABJABYAAAACAAEAAABJABcAAAACAAEAAABJABgAAAACAAEAAABJABkAAAACAAEAAABJABoAAAACAAEAAABJABsAAAACAAEAAABJABwAAAACAAEAAABJAB0AAAACAAEAAABJAB4AAAACAAEAAABJAB8AAAACAAEAAABJACAAAAACAAEAAABJACEAAAACAAEAAABJACIAAAACAAEAAABJACMAAAACAAEAAABJACQAAAACAAEAAABJACUAAAACAAEAAABKAPL/AAACAAEAAABKAPP/AAACAAEAAABKAPT/AAACAAEAAABKAPX/AAACAAEAAABKAPb/AAACAAEAAABKAPf/AAACAAEAAABKAPj/AAACAAEAAABKAPn/AAACAAEAAABKAPr/AAACAAEAAABKAPv/AAACAAEAAABKAPz/AAACAAEAAABKAP3/AAACAAEAAABKAP7/AAACAAEAAABKAP//AAACAAEAAABKAAAAAAACAAEAAABKAAEAAAACAAEAAABKAAIAAAACAAEAAABKAAMAAAACAAEAAABKAAQAAAACAAEAAABKAAUAAAACAAEAAABKAAYAAAACAAEAAABKAAcAAAACAAEAAABKAAgAAAACAAEAAABKAAkAAAACAAEAAABKAAoAAAACAAEAAABKAAsAAAACAAEAAABKAAwAAAACAAEAAABKAA0AAAACAAEAAABKAA4AAAACAAEAAABKAA8AAAACAAEAAABKABAAAAACAAEAAABKABEAAAACAAEAAABKABIAAAACAAEAAABKABMAAAACAAEAAABKABQAAAACAAEAAABKABUAAAACAAEAAABKABYAAAACAAEAAABKABcAAAACAAEAAABKABgAAAACAAEAAABKABkAAAACAAEAAABKABoAAAACAAEAAABKABsAAAACAAEAAABKABwAAAACAAEAAABKAB0AAAACAAEAAABKAB4AAAACAAEAAABKAB8AAAACAAEAAABKACAAAAACAAEAAABKACEAAAACAAEAAABKACIAAAACAAEAAABKACMAAAACAAEAAABKACQAAAACAAEAAABKACUAAAACAAEAAABLAPL/AAACAAEAAABLAPP/AAACAAEAAABLAPT/AAACAAEAAABLAPX/AAACAAEAAABLAPb/AAACAAEAAABLAPf/AAACAAEAAABLAPj/AAACAAEAAABLAPn/AAACAAEAAABLAPr/AAACAAEAAABLAPv/AAACAAEAAABLAPz/AAACAAEAAABLAP3/AAACAAEAAABLAP7/AAACAAEAAABLAP//AAACAAEAAABLAAAAAAACAAEAAABLAAEAAAACAAEAAABLAAIAAAACAAEAAABLAAMAAAACAAEAAABLAAQAAAACAAEAAABLAAUAAAACAAEAAABLAAYAAAACAAEAAABLAAcAAAACAAEAAABLAAgAAAACAAEAAABLAAkAAAACAAEAAABLAAoAAAACAAEAAABLAAsAAAACAAEAAABLAAwAAAACAAEAAABLAA0AAAACAAEAAABLAA4AAAACAAEAAABLAA8AAAACAAEAAABLABAAAAACAAEAAABLABEAAAACAAEAAABLABIAAAACAAEAAABLABMAAAACAAEAAABLABQAAAACAAEAAABLABUAAAACAAEAAABLABYAAAACAAEAAABLABcAAAACAAEAAABLABgAAAACAAEAAABLABkAAAACAAEAAABLABoAAAACAAEAAABLABsAAAACAAEAAABLABwAAAACAAEAAABLAB0AAAACAAEAAABLAB4AAAACAAEAAABLAB8AAAACAAEAAABLACAAAAACAAEAAABLACEAAAACAAEAAABLACIAAAACAAEAAABLACMAAAACAAEAAABLACQAAAACAAEAAABLACUAAAACAAEAAABMAPL/AAACAAEAAABMAPP/AAACAAEAAABMAPT/AAACAAEAAABMAPX/AAACAAEAAABMAPb/AAACAAEAAABMAPf/AAACAAEAAABMAPj/AAACAAEAAABMAPn/AAACAAEAAABMAPr/AAACAAEAAABMAPv/AAACAAEAAABMAPz/AAACAAEAAABMAP3/AAACAAEAAABMAP7/AAACAAEAAABMAP//AAACAAEAAABMAAAAAAACAAEAAABMAAEAAAACAAEAAABMAAIAAAACAAEAAABMAAMAAAACAAEAAABMAAQAAAACAAEAAABMAAUAAAACAAEAAABMAAYAAAACAAEAAABMAAcAAAACAAEAAABMAAgAAAACAAEAAABMAAkAAAACAAEAAABMAAoAAAACAAEAAABMAAsAAAACAAEAAABMAAwAAAACAAEAAABMAA0AAAACAAEAAABMAA4AAAACAAEAAABMAA8AAAACAAEAAABMABAAAAACAAEAAABMABEAAAACAAEAAABMABIAAAACAAEAAABMABMAAAACAAEAAABMABQAAAACAAEAAABMABUAAAACAAEAAABMABYAAAACAAEAAABMABcAAAACAAEAAABMABgAAAACAAEAAABMABkAAAACAAEAAABMABoAAAACAAEAAABMABsAAAACAAEAAABMABwAAAACAAEAAABMAB0AAAACAAEAAABMAB4AAAACAAEAAABMAB8AAAACAAEAAABMACAAAAACAAEAAABMACEAAAACAAEAAABMACIAAAACAAEAAABMACMAAAACAAEAAABMACQAAAACAAEAAABMACUAAAACAAEAAABNAPL/AAACAAEAAABNAPP/AAACAAEAAABNAPT/AAACAAEAAABNAPX/AAACAAEAAABNAPb/AAACAAEAAABNAPf/AAACAAEAAABNAPj/AAACAAEAAABNAPn/AAACAAEAAABNAPr/AAACAAEAAABNAPv/AAACAAEAAABNAPz/AAACAAEAAABNAP3/AAACAAEAAABNAP7/AAACAAEAAABNAP//AAACAAEAAABNAAAAAAACAAEAAABNAAEAAAACAAEAAABNAAIAAAACAAEAAABNAAMAAAACAAEAAABNAAQAAAACAAEAAABNAAUAAAACAAEAAABNAAYAAAACAAEAAABNAAcAAAACAAEAAABNAAgAAAACAAEAAABNAAkAAAACAAEAAABNAAoAAAACAAEAAABNAAsAAAACAAEAAABNAAwAAAACAAEAAABNAA0AAAACAAEAAABNAA4AAAACAAEAAABNAA8AAAACAAEAAABNABAAAAACAAEAAABNABEAAAACAAEAAABNABIAAAACAAEAAABNABMAAAACAAEAAABNABQAAAACAAEAAABNABUAAAACAAEAAABNABYAAAACAAEAAABNABcAAAACAAEAAABNABgAAAACAAEAAABNABkAAAACAAEAAABNABoAAAACAAEAAABNABsAAAACAAEAAABNABwAAAACAAEAAABNAB0AAAACAAEAAABNAB4AAAACAAEAAABNAB8AAAACAAEAAABNACAAAAACAAEAAABNACEAAAACAAEAAABNACIAAAACAAEAAABNACMAAAACAAEAAABNACQAAAACAAEAAABNACUAAAACAAEAAABOAPL/AAACAAEAAABOAPP/AAACAAEAAABOAPT/AAACAAEAAABOAPX/AAACAAEAAABOAPb/AAACAAEAAABOAPf/AAACAAEAAABOAPj/AAACAAEAAABOAPn/AAACAAEAAABOAPr/AAACAAEAAABOAPv/AAACAAEAAABOAPz/AAACAAEAAABOAP3/AAACAAEAAABOAP7/AAACAAEAAABOAP//AAACAAEAAABOAAAAAAACAAEAAABOAAEAAAACAAEAAABOAAIAAAACAAEAAABOAAMAAAACAAEAAABOAAQAAAACAAEAAABOAAUAAAACAAEAAABOAAYAAAACAAEAAABOAAcAAAACAAEAAABOAAgAAAACAAEAAABOAAkAAAACAAEAAABOAAoAAAACAAEAAABOAAsAAAACAAEAAABOAAwAAAACAAEAAABOAA0AAAACAAEAAABOAA4AAAACAAEAAABOAA8AAAACAAEAAABOABAAAAACAAEAAABOABEAAAACAAEAAABOABIAAAACAAEAAABOABMAAAACAAEAAABOABQAAAACAAEAAABOABUAAAACAAEAAABOABYAAAACAAEAAABOABcAAAACAAEAAABOABgAAAACAAEAAABOABkAAAACAAEAAABOABoAAAACAAEAAABOABsAAAACAAEAAABOABwAAAACAAEAAABOAB0AAAACAAEAAABOAB4AAAACAAEAAABOAB8AAAACAAEAAABOACAAAAACAAEAAABOACEAAAACAAEAAABOACIAAAACAAEAAABOACMAAAACAAEAAABOACQAAAACAAEAAABOACUAAAACAAEAAABPAPL/AAACAAEAAABPAPP/AAACAAEAAABPAPT/AAACAAEAAABPAPX/AAACAAEAAABPAPb/AAACAAEAAABPAPf/AAACAAEAAABPAPj/AAACAAEAAABPAPn/AAACAAEAAABPAPr/AAACAAEAAABPAPv/AAACAAEAAABPAPz/AAACAAEAAABPAP3/AAACAAEAAABPAP7/AAACAAEAAABPAP//AAACAAEAAABPAAAAAAACAAEAAABPAAEAAAACAAEAAABPAAIAAAACAAEAAABPAAMAAAACAAEAAABPAAQAAAACAAEAAABPAAUAAAACAAEAAABPAAYAAAACAAEAAABPAAcAAAACAAEAAABPAAgAAAACAAEAAABPAAkAAAACAAEAAABPAAoAAAACAAEAAABPAAsAAAACAAEAAABPAAwAAAACAAEAAABPAA0AAAACAAEAAABPAA4AAAACAAEAAABPAA8AAAACAAEAAABPABAAAAACAAEAAABPABEAAAACAAEAAABPABIAAAACAAEAAABPABMAAAACAAEAAABPABQAAAACAAEAAABPABUAAAACAAEAAABPABYAAAACAAEAAABPABcAAAACAAEAAABPABgAAAACAAEAAABPABkAAAACAAEAAABPABoAAAACAAEAAABPABsAAAACAAEAAABPABwAAAACAAEAAABPAB0AAAACAAEAAABPAB4AAAACAAEAAABPAB8AAAACAAEAAABPACAAAAACAAEAAABPACEAAAACAAEAAABPACIAAAACAAEAAABPACMAAAACAAEAAABPACQAAAACAAEAAABPACUAAAACAAEAAABQAPL/AAACAAEAAABQAPP/AAACAAEAAABQAPT/AAACAAEAAABQAPX/AAACAAEAAABQAPb/AAACAAEAAABQAPf/AAACAAEAAABQAPj/AAACAAEAAABQAPn/AAACAAEAAABQAPr/AAACAAEAAABQAPv/AAACAAEAAABQAPz/AAACAAEAAABQAP3/AAACAAEAAABQAP7/AAACAAEAAABQAP//AAACAAEAAABQAAAAAAACAAEAAABQAAEAAAACAAEAAABQAAIAAAACAAEAAABQAAMAAAACAAEAAABQAAQAAAACAAEAAABQAAUAAAACAAEAAABQAAYAAAACAAEAAABQAAcAAAACAAEAAABQAAgAAAACAAEAAABQAAkAAAACAAEAAABQAAoAAAACAAEAAABQAAsAAAACAAEAAABQAAwAAAACAAEAAABQAA0AAAACAAEAAABQAA4AAAACAAEAAABQAA8AAAACAAEAAABQABAAAAACAAEAAABQABEAAAACAAEAAABQABIAAAACAAEAAABQABMAAAACAAEAAABQABQAAAACAAEAAABQABUAAAACAAEAAABQABYAAAACAAEAAABQABcAAAACAAEAAABQABgAAAACAAEAAABQABkAAAACAAEAAABQABoAAAACAAEAAABQABsAAAACAAEAAABQABwAAAACAAEAAABQAB0AAAACAAEAAABQAB4AAAACAAEAAABQAB8AAAACAAEAAABQACAAAAACAAEAAABQACEAAAACAAEAAABQACIAAAACAAEAAABQACMAAAACAAEAAABQACQAAAACAAEAAABQACUAAAACAAEAAABRAPL/AAACAAEAAABRAPP/AAACAAEAAABRAPT/AAACAAEAAABRAPX/AAACAAEAAABRAPb/AAACAAEAAABRAPf/AAACAAEAAABRAPj/AAACAAEAAABRAPn/AAACAAEAAABRAPr/AAACAAEAAABRAPv/AAACAAEAAABRAPz/AAACAAEAAABRAP3/AAACAAEAAABRAP7/AAACAAEAAABRAP//AAACAAEAAABRAAAAAAACAAEAAABRAAEAAAACAAEAAABRAAIAAAACAAEAAABRAAMAAAACAAEAAABRAAQAAAACAAEAAABRAAUAAAACAAEAAABRAAYAAAACAAEAAABRAAcAAAACAAEAAABRAAgAAAACAAEAAABRAAkAAAACAAEAAABRAAoAAAACAAEAAABRAAsAAAACAAEAAABRAAwAAAACAAEAAABRAA0AAAACAAEAAABRAA4AAAACAAEAAABRAA8AAAACAAEAAABRABAAAAACAAEAAABRABEAAAACAAEAAABRABIAAAACAAEAAABRABMAAAACAAEAAABRABQAAAACAAEAAABRABUAAAACAAEAAABRABYAAAACAAEAAABRABcAAAACAAEAAABRABgAAAACAAEAAABRABkAAAACAAEAAABRABoAAAACAAEAAABRABsAAAACAAEAAABRABwAAAACAAEAAABRAB0AAAACAAEAAABRAB4AAAACAAEAAABRAB8AAAACAAEAAABRACAAAAACAAEAAABRACEAAAACAAEAAABRACIAAAACAAEAAABRACMAAAACAAEAAABRACQAAAACAAEAAABRACUAAAACAAEAAABSAPL/AAACAAEAAABSAPP/AAACAAEAAABSAPT/AAACAAEAAABSAPX/AAACAAEAAABSAPb/AAACAAEAAABSAPf/AAACAAEAAABSAPj/AAACAAEAAABSAPn/AAACAAEAAABSAPr/AAACAAEAAABSAPv/AAACAAEAAABSAPz/AAACAAEAAABSAP3/AAACAAEAAABSAP7/AAACAAEAAABSAP//AAACAAEAAABSAAAAAAACAAEAAABSAAEAAAACAAEAAABSAAIAAAACAAEAAABSAAMAAAACAAEAAABSAAQAAAACAAEAAABSAAUAAAACAAEAAABSAAYAAAACAAEAAABSAAcAAAACAAEAAABSAAgAAAACAAEAAABSAAkAAAACAAEAAABSAAoAAAACAAEAAABSAAsAAAACAAEAAABSAAwAAAACAAEAAABSAA0AAAACAAEAAABSAA4AAAACAAEAAABSAA8AAAACAAEAAABSABAAAAACAAEAAABSABEAAAACAAEAAABSABIAAAACAAEAAABSABMAAAACAAEAAABSABQAAAACAAEAAABSABUAAAACAAEAAABSABYAAAACAAEAAABSABcAAAACAAEAAABSABgAAAACAAEAAABSABkAAAACAAEAAABSABoAAAACAAEAAABSABsAAAACAAEAAABSABwAAAACAAEAAABSAB0AAAACAAEAAABSAB4AAAACAAEAAABSAB8AAAACAAEAAABSACAAAAACAAEAAABSACEAAAACAAEAAABSACIAAAACAAEAAABSACMAAAACAAEAAABSACQAAAACAAEAAABSACUAAAACAAEAAABTAPL/AAACAAEAAABTAPP/AAACAAEAAABTAPT/AAACAAEAAABTAPX/AAACAAEAAABTAPb/AAACAAEAAABTAPf/AAACAAEAAABTAPj/AAACAAEAAABTAPn/AAACAAEAAABTAPr/AAACAAEAAABTAPv/AAACAAEAAABTAPz/AAACAAEAAABTAP3/AAACAAEAAABTAP7/AAACAAEAAABTAP//AAACAAEAAABTAAAAAAACAAEAAABTAAEAAAACAAEAAABTAAIAAAACAAEAAABTAAMAAAACAAEAAABTAAQAAAACAAEAAABTAAUAAAACAAEAAABTAAYAAAACAAEAAABTAAcAAAACAAEAAABTAAgAAAACAAEAAABTAAkAAAACAAEAAABTAAoAAAACAAEAAABTAAsAAAACAAEAAABTAAwAAAACAAEAAABTAA0AAAACAAEAAABTAA4AAAACAAEAAABTAA8AAAACAAEAAABTABAAAAACAAEAAABTABEAAAACAAEAAABTABIAAAACAAEAAABTABMAAAACAAEAAABTABQAAAACAAEAAABTABUAAAACAAEAAABTABYAAAACAAEAAABTABcAAAACAAEAAABTABgAAAACAAEAAABTABkAAAACAAEAAABTABoAAAACAAEAAABTABsAAAACAAEAAABTABwAAAACAAEAAABTAB0AAAACAAEAAABTAB4AAAACAAEAAABTAB8AAAACAAEAAABTACAAAAACAAEAAABTACEAAAACAAEAAABTACIAAAACAAEAAABTACMAAAACAAEAAABTACQAAAACAAEAAABTACUAAAACAAEAAABUAPL/AAACAAEAAABUAPP/AAACAAEAAABUAPT/AAACAAEAAABUAPX/AAACAAEAAABUAPb/AAACAAEAAABUAPf/AAACAAEAAABUAPj/AAACAAEAAABUAPn/AAACAAEAAABUAPr/AAACAAEAAABUAPv/AAACAAEAAABUAPz/AAACAAEAAABUAP3/AAACAAEAAABUAP7/AAACAAEAAABUAP//AAACAAEAAABUAAAAAAACAAEAAABUAAEAAAACAAEAAABUAAIAAAACAAEAAABUAAMAAAACAAEAAABUAAQAAAACAAEAAABUAAUAAAACAAEAAABUAAYAAAACAAEAAABUAAcAAAACAAEAAABUAAgAAAACAAEAAABUAAkAAAACAAEAAABUAAoAAAACAAEAAABUAAsAAAACAAEAAABUAAwAAAACAAEAAABUAA0AAAACAAEAAABUAA4AAAACAAEAAABUAA8AAAACAAEAAABUABAAAAACAAEAAABUABEAAAACAAEAAABUABIAAAACAAEAAABUABMAAAACAAEAAABUABQAAAACAAEAAABUABUAAAACAAEAAABUABYAAAACAAEAAABUABcAAAACAAEAAABUABgAAAACAAEAAABUABkAAAACAAEAAABUABoAAAACAAEAAABUABsAAAACAAEAAABUABwAAAACAAEAAABUAB0AAAACAAEAAABUAB4AAAACAAEAAABUAB8AAAACAAEAAABUACAAAAACAAEAAABUACEAAAACAAEAAABUACIAAAACAAEAAABUACMAAAACAAEAAABUACQAAAACAAEAAABUACUAAAACAAEAAABVAPL/AAACAAEAAABVAPP/AAACAAEAAABVAPT/AAACAAEAAABVAPX/AAACAAEAAABVAPb/AAACAAEAAABVAPf/AAACAAEAAABVAPj/AAACAAEAAABVAPn/AAACAAEAAABVAPr/AAACAAEAAABVAPv/AAACAAEAAABVAPz/AAACAAEAAABVAP3/AAACAAEAAABVAP7/AAACAAEAAABVAP//AAACAAEAAABVAAAAAAACAAEAAABVAAEAAAACAAEAAABVAAIAAAACAAEAAABVAAMAAAACAAEAAABVAAQAAAACAAEAAABVAAUAAAACAAEAAABVAAYAAAACAAEAAABVAAcAAAACAAEAAABVAAgAAAACAAEAAABVAAkAAAACAAEAAABVAAoAAAACAAEAAABVAAsAAAACAAEAAABVAAwAAAACAAEAAABVAA0AAAACAAEAAABVAA4AAAACAAEAAABVAA8AAAACAAEAAABVABAAAAACAAEAAABVABEAAAACAAEAAABVABIAAAACAAEAAABVABMAAAACAAEAAABVABQAAAACAAEAAABVABUAAAACAAEAAABVABYAAAACAAEAAABVABcAAAACAAEAAABVABgAAAACAAEAAABVABkAAAACAAEAAABVABoAAAACAAEAAABVABsAAAACAAEAAABVABwAAAACAAEAAABVAB0AAAACAAEAAABVAB4AAAACAAEAAABVAB8AAAACAAEAAABVACAAAAACAAEAAABVACEAAAACAAEAAABVACIAAAACAAEAAABVACMAAAACAAEAAABVACQAAAACAAEAAABVACUAAAACAAEAAABWAPL/AAACAAEAAABWAPP/AAACAAEAAABWAPT/AAACAAEAAABWAPX/AAACAAEAAABWAPb/AAACAAEAAABWAPf/AAACAAEAAABWAPj/AAACAAEAAABWAPn/AAACAAEAAABWAPr/AAACAAEAAABWAPv/AAACAAEAAABWAPz/AAACAAEAAABWAP3/AAACAAEAAABWAP7/AAACAAEAAABWAP//AAACAAEAAABWAAAAAAACAAEAAABWAAEAAAACAAEAAABWAAIAAAACAAEAAABWAAMAAAACAAEAAABWAAQAAAACAAEAAABWAAUAAAACAAEAAABWAAYAAAACAAEAAABWAAcAAAACAAEAAABWAAgAAAACAAEAAABWAAkAAAACAAEAAABWAAoAAAACAAEAAABWAAsAAAACAAEAAABWAAwAAAACAAEAAABWAA0AAAACAAEAAABWAA4AAAACAAEAAABWAA8AAAACAAEAAABWABAAAAACAAEAAABWABEAAAACAAEAAABWABIAAAACAAEAAABWABMAAAACAAEAAABWABQAAAACAAEAAABWABUAAAACAAEAAABWABYAAAACAAEAAABWABcAAAACAAEAAABWABgAAAACAAEAAABWABkAAAACAAEAAABWABoAAAACAAEAAABWABsAAAACAAEAAABWABwAAAACAAEAAABWAB0AAAACAAEAAABWAB4AAAACAAEAAABWAB8AAAACAAEAAABWACAAAAACAAEAAABWACEAAAACAAEAAABWACIAAAACAAEAAABWACMAAAACAAEAAABWACQAAAACAAEAAABWACUAAAACAAEAAABXAPL/AAACAAEAAABXAPP/AAACAAEAAABXAPT/AAACAAEAAABXAPX/AAACAAEAAABXAPb/AAACAAEAAABXAPf/AAACAAEAAABXAPj/AAACAAEAAABXAPn/AAACAAEAAABXAPr/AAACAAEAAABXAPv/AAACAAEAAABXAPz/AAACAAEAAABXAP3/AAACAAEAAABXAP7/AAACAAEAAABXAP//AAACAAEAAABXAAAAAAACAAEAAABXAAEAAAACAAEAAABXAAIAAAACAAEAAABXAAMAAAACAAEAAABXAAQAAAACAAEAAABXAAUAAAACAAEAAABXAAYAAAACAAEAAABXAAcAAAACAAEAAABXAAgAAAACAAEAAABXAAkAAAACAAEAAABXAAoAAAACAAEAAABXAAsAAAACAAEAAABXAAwAAAACAAEAAABXAA0AAAACAAEAAABXAA4AAAACAAEAAABXAA8AAAACAAEAAABXABAAAAACAAEAAABXABEAAAACAAEAAABXABIAAAACAAEAAABXABMAAAACAAEAAABXABQAAAACAAEAAABXABUAAAACAAEAAABXABYAAAACAAEAAABXABcAAAACAAEAAABXABgAAAACAAEAAABXABkAAAACAAEAAABXABoAAAACAAEAAABXABsAAAACAAEAAABXABwAAAACAAEAAABXAB0AAAACAAEAAABXAB4AAAACAAEAAABXAB8AAAACAAEAAABXACAAAAACAAEAAABXACEAAAACAAEAAABXACIAAAACAAEAAABXACMAAAACAAEAAABXACQAAAACAAEAAABXACUAAAACAAEAAABYAPL/AAACAAEAAABYAPP/AAACAAEAAABYAPT/AAACAAEAAABYAPX/AAACAAEAAABYAPb/AAACAAEAAABYAPf/AAACAAEAAABYAPj/AAACAAEAAABYAPn/AAACAAEAAABYAPr/AAACAAEAAABYAPv/AAACAAEAAABYAPz/AAACAAEAAABYAP3/AAACAAEAAABYAP7/AAACAAEAAABYAP//AAACAAEAAABYAAAAAAACAAEAAABYAAEAAAACAAEAAABYAAIAAAACAAEAAABYAAMAAAACAAEAAABYAAQAAAACAAEAAABYAAUAAAACAAEAAABYAAYAAAACAAEAAABYAAcAAAACAAEAAABYAAgAAAACAAEAAABYAAkAAAACAAEAAABYAAoAAAACAAEAAABYAAsAAAACAAEAAABYAAwAAAACAAEAAABYAA0AAAACAAEAAABYAA4AAAACAAEAAABYAA8AAAACAAEAAABYABAAAAACAAEAAABYABEAAAACAAEAAABYABIAAAACAAEAAABYABMAAAACAAEAAABYABQAAAACAAEAAABYABUAAAACAAEAAABYABYAAAACAAEAAABYABcAAAACAAEAAABYABgAAAACAAEAAABYABkAAAACAAEAAABYABoAAAACAAEAAABYABsAAAACAAEAAABYABwAAAACAAEAAABYAB0AAAACAAEAAABYAB4AAAACAAEAAABYAB8AAAACAAEAAABYACAAAAACAAEAAABYACEAAAACAAEAAABYACIAAAACAAEAAABYACMAAAACAAEAAABYACQAAAACAAEAAABYACUAAAACAAEAAABZAPL/AAACAAEAAABZAPP/AAACAAEAAABZAPT/AAACAAEAAABZAPX/AAACAAEAAABZAPb/AAACAAEAAABZAPf/AAACAAEAAABZAPj/AAACAAEAAABZAPn/AAACAAEAAABZAPr/AAACAAEAAABZAPv/AAACAAEAAABZAPz/AAACAAEAAABZAP3/AAACAAEAAABZAP7/AAACAAEAAABZAP//AAACAAEAAABZAAAAAAACAAEAAABZAAEAAAACAAEAAABZAAIAAAACAAEAAABZAAMAAAACAAEAAABZAAQAAAACAAEAAABZAAUAAAACAAEAAABZAAYAAAACAAEAAABZAAcAAAACAAEAAABZAAgAAAACAAEAAABZAAkAAAACAAEAAABZAAoAAAACAAEAAABZAAsAAAACAAEAAABZAAwAAAACAAEAAABZAA0AAAACAAEAAABZAA4AAAACAAEAAABZAA8AAAACAAEAAABZABAAAAACAAEAAABZABEAAAACAAEAAABZABIAAAACAAEAAABZABMAAAACAAEAAABZABQAAAACAAEAAABZABUAAAACAAEAAABZABYAAAACAAEAAABZABcAAAACAAEAAABZABgAAAACAAEAAABZABkAAAACAAEAAABZABoAAAACAAEAAABZABsAAAACAAEAAABZABwAAAACAAEAAABZAB0AAAACAAEAAABZAB4AAAACAAEAAABZAB8AAAACAAEAAABZACAAAAACAAEAAABZACEAAAACAAEAAABZACIAAAACAAEAAABZACMAAAACAAEAAABZACQAAAACAAEAAABZACUAAAACAAEAAABaAPL/AAACAAEAAABaAPP/AAACAAEAAABaAPT/AAACAAEAAABaAPX/AAACAAEAAABaAPb/AAACAAEAAABaAPf/AAACAAEAAABaAPj/AAACAAEAAABaAPn/AAACAAEAAABaAPr/AAACAAEAAABaAPv/AAACAAEAAABaAPz/AAACAAEAAABaAP3/AAACAAEAAABaAP7/AAACAAEAAABaAP//AAACAAEAAABaAAAAAAACAAEAAABaAAEAAAACAAEAAABaAAIAAAACAAEAAABaAAMAAAACAAEAAABaAAQAAAACAAEAAABaAAUAAAACAAEAAABaAAYAAAACAAEAAABaAAcAAAACAAEAAABaAAgAAAACAAEAAABaAAkAAAACAAEAAABaAAoAAAACAAEAAABaAAsAAAACAAEAAABaAAwAAAACAAEAAABaAA0AAAACAAEAAABaAA4AAAACAAEAAABaAA8AAAACAAEAAABaABAAAAACAAEAAABaABEAAAACAAEAAABaABIAAAACAAEAAABaABMAAAACAAEAAABaABQAAAACAAEAAABaABUAAAACAAEAAABaABYAAAACAAEAAABaABcAAAACAAEAAABaABgAAAACAAEAAABaABkAAAACAAEAAABaABoAAAACAAEAAABaABsAAAACAAEAAABaABwAAAACAAEAAABaAB0AAAACAAEAAABaAB4AAAACAAEAAABaAB8AAAACAAEAAABaACAAAAACAAEAAABaACEAAAACAAEAAABaACIAAAACAAEAAABaACMAAAACAAEAAABaACQAAAACAAEAAABaACUAAAACAAEAAABbAPL/AAACAAEAAABbAPP/AAACAAEAAABbAPT/AAACAAEAAABbAPX/AAACAAEAAABbAPb/AAACAAEAAABbAPf/AAACAAEAAABbAPj/AAACAAEAAABbAPn/AAACAAEAAABbAPr/AAACAAEAAABbAPv/AAACAAEAAABbAPz/AAACAAEAAABbAP3/AAACAAEAAABbAP7/AAACAAEAAABbAP//AAACAAEAAABbAAAAAAACAAEAAABbAAEAAAACAAEAAABbAAIAAAACAAEAAABbAAMAAAACAAEAAABbAAQAAAACAAEAAABbAAUAAAACAAEAAABbAAYAAAACAAEAAABbAAcAAAACAAEAAABbAAgAAAACAAEAAABbAAkAAAACAAEAAABbAAoAAAACAAEAAABbAAsAAAACAAEAAABbAAwAAAACAAEAAABbAA0AAAACAAEAAABbAA4AAAACAAEAAABbAA8AAAACAAEAAABbABAAAAACAAEAAABbABEAAAACAAEAAABbABIAAAACAAEAAABbABMAAAACAAEAAABbABQAAAACAAEAAABbABUAAAACAAEAAABbABYAAAACAAEAAABbABcAAAACAAEAAABbABgAAAACAAEAAABbABkAAAACAAEAAABbABoAAAACAAEAAABbABsAAAACAAEAAABbABwAAAACAAEAAABbAB0AAAACAAEAAABbAB4AAAACAAEAAABbAB8AAAACAAEAAABbACAAAAACAAEAAABbACEAAAACAAEAAABbACIAAAACAAEAAABbACMAAAACAAEAAABbACQAAAACAAEAAABbACUAAAACAAEAAABcAPL/AAACAAEAAABcAPP/AAACAAEAAABcAPT/AAACAAEAAABcAPX/AAACAAEAAABcAPb/AAACAAEAAABcAPf/AAACAAEAAABcAPj/AAACAAEAAABcAPn/AAACAAEAAABcAPr/AAACAAEAAABcAPv/AAACAAEAAABcAPz/AAACAAEAAABcAP3/AAACAAEAAABcAP7/AAACAAEAAABcAP//AAACAAEAAABcAAAAAAACAAEAAABcAAEAAAACAAEAAABcAAIAAAACAAEAAABcAAMAAAACAAEAAABcAAQAAAACAAEAAABcAAUAAAACAAEAAABcAAYAAAACAAEAAABcAAcAAAACAAEAAABcAAgAAAACAAEAAABcAAkAAAACAAEAAABcAAoAAAACAAEAAABcAAsAAAACAAEAAABcAAwAAAACAAEAAABcAA0AAAACAAEAAABcAA4AAAACAAEAAABcAA8AAAACAAEAAABcABAAAAACAAEAAABcABEAAAACAAEAAABcABIAAAACAAEAAABcABMAAAACAAEAAABcABQAAAACAAEAAABcABUAAAACAAEAAABcABYAAAACAAEAAABcABcAAAACAAEAAABcABgAAAACAAEAAABcABkAAAACAAEAAABcABoAAAACAAEAAABcABsAAAACAAEAAABcABwAAAACAAEAAABcAB0AAAACAAEAAABcAB4AAAACAAEAAABcAB8AAAACAAEAAABcACAAAAACAAEAAABcACEAAAACAAEAAABcACIAAAACAAEAAABcACMAAAACAAEAAABcACQAAAACAAEAAABcACUAAAACAAEAAABdAPL/AAACAAEAAABdAPP/AAACAAEAAABdAPT/AAACAAEAAABdAPX/AAACAAEAAABdAPb/AAACAAEAAABdAPf/AAACAAEAAABdAPj/AAACAAEAAABdAPn/AAACAAEAAABdAPr/AAACAAEAAABdAPv/AAACAAEAAABdAPz/AAACAAEAAABdAP3/AAACAAEAAABdAP7/AAACAAEAAABdAP//AAACAAEAAABdAAAAAAACAAEAAABdAAEAAAACAAEAAABdAAIAAAACAAEAAABdAAMAAAACAAEAAABdAAQAAAACAAEAAABdAAUAAAACAAEAAABdAAYAAAACAAEAAABdAAcAAAACAAEAAABdAAgAAAACAAEAAABdAAkAAAACAAEAAABdAAoAAAACAAEAAABdAAsAAAACAAEAAABdAAwAAAACAAEAAABdAA0AAAACAAEAAABdAA4AAAACAAEAAABdAA8AAAACAAEAAABdABAAAAACAAEAAABdABEAAAACAAEAAABdABIAAAACAAEAAABdABMAAAACAAEAAABdABQAAAACAAEAAABdABUAAAACAAEAAABdABYAAAACAAEAAABdABcAAAACAAEAAABdABgAAAACAAEAAABdABkAAAACAAEAAABdABoAAAACAAEAAABdABsAAAACAAEAAABdABwAAAACAAEAAABdAB0AAAACAAEAAABdAB4AAAACAAEAAABdAB8AAAACAAEAAABdACAAAAACAAEAAABdACEAAAACAAEAAABdACIAAAACAAEAAABdACMAAAACAAEAAABdACQAAAACAAEAAABdACUAAAACAAEAAABeAPL/AAACAAEAAABeAPP/AAACAAEAAABeAPT/AAACAAEAAABeAPX/AAACAAEAAABeAPb/AAACAAEAAABeAPf/AAACAAEAAABeAPj/AAACAAEAAABeAPn/AAACAAEAAABeAPr/AAACAAEAAABeAPv/AAACAAEAAABeAPz/AAACAAEAAABeAP3/AAACAAEAAABeAP7/AAACAAEAAABeAP//AAACAAEAAABeAAAAAAACAAEAAABeAAEAAAACAAEAAABeAAIAAAACAAEAAABeAAMAAAACAAEAAABeAAQAAAACAAEAAABeAAUAAAACAAEAAABeAAYAAAACAAEAAABeAAcAAAACAAEAAABeAAgAAAACAAEAAABeAAkAAAACAAEAAABeAAoAAAACAAEAAABeAAsAAAACAAEAAABeAAwAAAACAAEAAABeAA0AAAACAAEAAABeAA4AAAACAAEAAABeAA8AAAACAAEAAABeABAAAAACAAEAAABeABEAAAACAAEAAABeABIAAAACAAEAAABeABMAAAACAAEAAABeABQAAAACAAEAAABeABUAAAACAAEAAABeABYAAAACAAEAAABeABcAAAACAAEAAABeABgAAAACAAEAAABeABkAAAACAAEAAABeABoAAAACAAEAAABeABsAAAACAAEAAABeABwAAAACAAEAAABeAB0AAAACAAEAAABeAB4AAAACAAEAAABeAB8AAAACAAEAAABeACAAAAACAAEAAABeACEAAAACAAEAAABeACIAAAACAAEAAABeACMAAAACAAEAAABeACQAAAACAAEAAABeACUAAAACAAEAAABfAPL/AAACAAEAAABfAPP/AAACAAEAAABfAPT/AAACAAEAAABfAPX/AAACAAEAAABfAPb/AAACAAEAAABfAPf/AAACAAEAAABfAPj/AAACAAEAAABfAPn/AAACAAEAAABfAPr/AAACAAEAAABfAPv/AAACAAEAAABfAPz/AAACAAEAAABfAP3/AAACAAEAAABfAP7/AAACAAEAAABfAP//AAACAAEAAABfAAAAAAACAAEAAABfAAEAAAACAAEAAABfAAIAAAACAAEAAABfAAMAAAACAAEAAABfAAQAAAACAAEAAABfAAUAAAACAAEAAABfAAYAAAACAAEAAABfAAcAAAACAAEAAABfAAgAAAACAAEAAABfAAkAAAACAAEAAABfAAoAAAACAAEAAABfAAsAAAACAAEAAABfAAwAAAACAAEAAABfAA0AAAACAAEAAABfAA4AAAACAAEAAABfAA8AAAACAAEAAABfABAAAAACAAEAAABfABEAAAACAAEAAABfABIAAAACAAEAAABfABMAAAACAAEAAABfABQAAAACAAEAAABfABUAAAACAAEAAABfABYAAAACAAEAAABfABcAAAACAAEAAABfABgAAAACAAEAAABfABkAAAACAAEAAABfABoAAAACAAEAAABfABsAAAACAAEAAABfABwAAAACAAEAAABfAB0AAAACAAEAAABfAB4AAAACAAEAAABfAB8AAAACAAEAAABfACAAAAACAAEAAABfACEAAAACAAEAAABfACIAAAACAAEAAABfACMAAAACAAEAAABfACQAAAACAAEAAABfACUAAAACAAEAAABgAPL/AAACAAEAAABgAPP/AAACAAEAAABgAPT/AAACAAEAAABgAPX/AAACAAEAAABgAPb/AAACAAEAAABgAPf/AAACAAEAAABgAPj/AAACAAEAAABgAPn/AAACAAEAAABgAPr/AAACAAEAAABgAPv/AAACAAEAAABgAPz/AAACAAEAAABgAP3/AAACAAEAAABgAP7/AAACAAEAAABgAP//AAACAAEAAABgAAAAAAACAAEAAABgAAEAAAACAAEAAABgAAIAAAACAAEAAABgAAMAAAACAAEAAABgAAQAAAACAAEAAABgAAUAAAACAAEAAABgAAYAAAACAAEAAABgAAcAAAACAAEAAABgAAgAAAACAAEAAABgAAkAAAACAAEAAABgAAoAAAACAAEAAABgAAsAAAACAAEAAABgAAwAAAACAAEAAABgAA0AAAACAAEAAABgAA4AAAACAAEAAABgAA8AAAACAAEAAABgABAAAAACAAEAAABgABEAAAACAAEAAABgABIAAAACAAEAAABgABMAAAACAAEAAABgABQAAAACAAEAAABgABUAAAACAAEAAABgABYAAAACAAEAAABgABcAAAACAAEAAABgABgAAAACAAEAAABgABkAAAACAAEAAABgABoAAAACAAEAAABgABsAAAACAAEAAABgABwAAAACAAEAAABgAB0AAAACAAEAAABgAB4AAAACAAEAAABgAB8AAAACAAEAAABgACAAAAACAAEAAABgACEAAAACAAEAAABgACIAAAACAAEAAABgACMAAAACAAEAAABgACQAAAACAAEAAABgACUAAAACAAEAAABhAPL/AAACAAEAAABhAPP/AAACAAEAAABhAPT/AAACAAEAAABhAPX/AAACAAEAAABhAPb/AAACAAEAAABhAPf/AAACAAEAAABhAPj/AAACAAEAAABhAPn/AAACAAEAAABhAPr/AAACAAEAAABhAPv/AAACAAEAAABhAPz/AAACAAEAAABhAP3/AAACAAEAAABhAP7/AAACAAEAAABhAP//AAACAAEAAABhAAAAAAACAAEAAABhAAEAAAACAAEAAABhAAIAAAACAAEAAABhAAMAAAACAAEAAABhAAQAAAACAAEAAABhAAUAAAACAAEAAABhAAYAAAACAAEAAABhAAcAAAACAAEAAABhAAgAAAACAAEAAABhAAkAAAACAAEAAABhAAoAAAACAAEAAABhAAsAAAACAAEAAABhAAwAAAACAAEAAABhAA0AAAACAAEAAABhAA4AAAACAAEAAABhAA8AAAACAAEAAABhABAAAAACAAEAAABhABEAAAACAAEAAABhABIAAAACAAEAAABhABMAAAACAAEAAABhABQAAAACAAEAAABhABUAAAACAAEAAABhABYAAAACAAEAAABhABcAAAACAAEAAABhABgAAAACAAEAAABhABkAAAACAAEAAABhABoAAAACAAEAAABhABsAAAACAAEAAABhABwAAAACAAEAAABhAB0AAAACAAEAAABhAB4AAAACAAEAAABhAB8AAAACAAEAAABhACAAAAACAAEAAABhACEAAAACAAEAAABhACIAAAACAAEAAABhACMAAAACAAEAAABhACQAAAACAAEAAABhACUAAAACAAEAAABiAPL/AAACAAEAAABiAPP/AAACAAEAAABiAPT/AAACAAEAAABiAPX/AAACAAEAAABiAPb/AAACAAEAAABiAPf/AAACAAEAAABiAPj/AAACAAEAAABiAPn/AAACAAEAAABiAPr/AAACAAEAAABiAPv/AAACAAEAAABiAPz/AAACAAEAAABiAP3/AAACAAEAAABiAP7/AAACAAEAAABiAP//AAACAAEAAABiAAAAAAACAAEAAABiAAEAAAACAAEAAABiAAIAAAACAAEAAABiAAMAAAACAAEAAABiAAQAAAACAAEAAABiAAUAAAACAAEAAABiAAYAAAACAAEAAABiAAcAAAACAAEAAABiAAgAAAACAAEAAABiAAkAAAACAAEAAABiAAoAAAACAAEAAABiAAsAAAACAAEAAABiAAwAAAACAAEAAABiAA0AAAACAAEAAABiAA4AAAACAAEAAABiAA8AAAACAAEAAABiABAAAAACAAEAAABiABEAAAACAAEAAABiABIAAAACAAEAAABiABMAAAACAAEAAABiABQAAAACAAEAAABiABUAAAACAAEAAABiABYAAAACAAEAAABiABcAAAACAAEAAABiABgAAAACAAEAAABiABkAAAACAAEAAABiABoAAAACAAEAAABiABsAAAACAAEAAABiABwAAAACAAEAAABiAB0AAAACAAEAAABiAB4AAAACAAEAAABiAB8AAAACAAEAAABiACAAAAACAAEAAABiACEAAAACAAEAAABiACIAAAACAAEAAABiACMAAAACAAEAAABiACQAAAACAAEAAABiACUAAAACAAEAAABjAPL/AAACAAEAAABjAPP/AAACAAEAAABjAPT/AAACAAEAAABjAPX/AAACAAEAAABjAPb/AAACAAEAAABjAPf/AAACAAEAAABjAPj/AAACAAEAAABjAPn/AAACAAEAAABjAPr/AAACAAEAAABjAPv/AAACAAEAAABjAPz/AAACAAEAAABjAP3/AAACAAEAAABjAP7/AAACAAEAAABjAP//AAACAAEAAABjAAAAAAACAAEAAABjAAEAAAACAAEAAABjAAIAAAACAAEAAABjAAMAAAACAAEAAABjAAQAAAACAAEAAABjAAUAAAACAAEAAABjAAYAAAACAAEAAABjAAcAAAACAAEAAABjAAgAAAACAAEAAABjAAkAAAACAAEAAABjAAoAAAACAAEAAABjAAsAAAACAAEAAABjAAwAAAACAAEAAABjAA0AAAACAAEAAABjAA4AAAACAAEAAABjAA8AAAACAAEAAABjABAAAAACAAEAAABjABEAAAACAAEAAABjABIAAAACAAEAAABjABMAAAACAAEAAABjABQAAAACAAEAAABjABUAAAACAAEAAABjABYAAAACAAEAAABjABcAAAACAAEAAABjABgAAAACAAEAAABjABkAAAACAAEAAABjABoAAAACAAEAAABjABsAAAACAAEAAABjABwAAAACAAEAAABjAB0AAAACAAEAAABjAB4AAAACAAEAAABjAB8AAAACAAEAAABjACAAAAACAAEAAABjACEAAAACAAEAAABjACIAAAACAAEAAABjACMAAAACAAEAAABjACQAAAACAAEAAABjACUAAAACAAEAAABkAPL/AAACAAEAAABkAPP/AAACAAEAAABkAPT/AAACAAEAAABkAPX/AAACAAEAAABkAPb/AAACAAEAAABkAPf/AAACAAEAAABkAPj/AAACAAEAAABkAPn/AAACAAEAAABkAPr/AAACAAEAAABkAPv/AAACAAEAAABkAPz/AAACAAEAAABkAP3/AAACAAEAAABkAP7/AAACAAEAAABkAP//AAACAAEAAABkAAAAAAACAAEAAABkAAEAAAACAAEAAABkAAIAAAACAAEAAABkAAMAAAACAAEAAABkAAQAAAACAAEAAABkAAUAAAACAAEAAABkAAYAAAACAAEAAABkAAcAAAACAAEAAABkAAgAAAACAAEAAABkAAkAAAACAAEAAABkAAoAAAACAAEAAABkAAsAAAACAAEAAABkAAwAAAACAAEAAABkAA0AAAACAAEAAABkAA4AAAACAAEAAABkAA8AAAACAAEAAABkABAAAAACAAEAAABkABEAAAACAAEAAABkABIAAAACAAEAAABkABMAAAACAAEAAABkABQAAAACAAEAAABkABUAAAACAAEAAABkABYAAAACAAEAAABkABcAAAACAAEAAABkABgAAAACAAEAAABkABkAAAACAAEAAABkABoAAAACAAEAAABkABsAAAACAAEAAABkABwAAAACAAEAAABkAB0AAAACAAEAAABkAB4AAAACAAEAAABkAB8AAAACAAEAAABkACAAAAACAAEAAABkACEAAAACAAEAAABkACIAAAACAAEAAABkACMAAAACAAEAAABkACQAAAACAAEAAABkACUAAAACAAEAAABlAPL/AAACAAEAAABlAPP/AAACAAEAAABlAPT/AAACAAEAAABlAPX/AAACAAEAAABlAPb/AAACAAEAAABlAPf/AAACAAEAAABlAPj/AAACAAEAAABlAPn/AAACAAEAAABlAPr/AAACAAEAAABlAPv/AAACAAEAAABlAPz/AAACAAEAAABlAP3/AAACAAEAAABlAP7/AAACAAEAAABlAP//AAACAAEAAABlAAAAAAACAAEAAABlAAEAAAACAAEAAABlAAIAAAACAAEAAABlAAMAAAACAAEAAABlAAQAAAACAAEAAABlAAUAAAACAAEAAABlAAYAAAACAAEAAABlAAcAAAACAAEAAABlAAgAAAACAAEAAABlAAkAAAACAAEAAABlAAoAAAACAAEAAABlAAsAAAACAAEAAABlAAwAAAACAAEAAABlAA0AAAACAAEAAABlAA4AAAACAAEAAABlAA8AAAACAAEAAABlABAAAAACAAEAAABlABEAAAACAAEAAABlABIAAAACAAEAAABlABMAAAACAAEAAABlABQAAAACAAEAAABlABUAAAACAAEAAABlABYAAAACAAEAAABlABcAAAACAAEAAABlABgAAAACAAEAAABlABkAAAACAAEAAABlABoAAAACAAEAAABlABsAAAACAAEAAABlABwAAAACAAEAAABlAB0AAAACAAEAAABlAB4AAAACAAEAAABlAB8AAAACAAEAAABlACAAAAACAAEAAABlACEAAAACAAEAAABlACIAAAACAAEAAABlACMAAAACAAEAAABlACQAAAACAAEAAABlACUAAAACAAEAAABmAPL/AAACAAEAAABmAPP/AAACAAEAAABmAPT/AAACAAEAAABmAPX/AAACAAEAAABmAPb/AAACAAEAAABmAPf/AAACAAEAAABmAPj/AAACAAEAAABmAPn/AAACAAEAAABmAPr/AAACAAEAAABmAPv/AAACAAEAAABmAPz/AAACAAEAAABmAP3/AAACAAEAAABmAP7/AAACAAEAAABmAP//AAACAAEAAABmAAAAAAACAAEAAABmAAEAAAACAAEAAABmAAIAAAACAAEAAABmAAMAAAACAAEAAABmAAQAAAACAAEAAABmAAUAAAACAAEAAABmAAYAAAACAAEAAABmAAcAAAACAAEAAABmAAgAAAACAAEAAABmAAkAAAACAAEAAABmAAoAAAACAAEAAABmAAsAAAACAAEAAABmAAwAAAACAAEAAABmAA0AAAACAAEAAABmAA4AAAACAAEAAABmAA8AAAACAAEAAABmABAAAAACAAEAAABmABEAAAACAAEAAABmABIAAAACAAEAAABmABMAAAACAAEAAABmABQAAAACAAEAAABmABUAAAACAAEAAABmABYAAAACAAEAAABmABcAAAACAAEAAABmABgAAAACAAEAAABmABkAAAACAAEAAABmABoAAAACAAEAAABmABsAAAACAAEAAABmABwAAAACAAEAAABmAB0AAAACAAEAAABmAB4AAAACAAEAAABmAB8AAAACAAEAAABmACAAAAACAAEAAABmACEAAAACAAEAAABmACIAAAACAAEAAABmACMAAAACAAEAAABmACQAAAACAAEAAABmACUAAAACAAEAAADl//L/AAACAAEAAADl//P/AAACAAEAAADm//L/AAACAAEAAADm//P/AAACAAEAAADn//L/AAACAAEAAADn//P/AAACAAEAAADo//L/AAACAAEAAADo//P/AAACAAEAAADp//L/AAACAAEAAADp//P/AAACAAEAAADq//L/AAACAAEAAADq//P/AAACAAEAAADr//L/AAACAAEAAADr//P/AAACAAEAAADs//L/AAACAAEAAADs//P/AAACAAEAAADt//L/AAACAAEAAADt//P/AAACAAEAAADu//L/AAACAAEAAADu//P/AAACAAEAAADv//L/AAACAAEAAADv//P/AAACAAEAAADw//L/AAACAAEAAADw//P/AAACAAEAAADx//L/AAACAAEAAADx//P/AAACAAEAAADy//L/AAACAAEAAADy//P/AAACAAEAAADz//L/AAACAAEAAADz//P/AAACAAEAAAD0//L/AAACAAEAAAD0//P/AAACAAEAAAD1//L/AAACAAEAAAD1//P/AAACAAEAAAD2//L/AAACAAEAAAD2//P/AAACAAEAAAD3//L/AAACAAEAAAD3//P/AAACAAEAAAD4//L/AAACAAEAAAD4//P/AAACAAEAAAD5//L/AAACAAEAAAD5//P/AAACAAEAAAD6//L/AAACAAEAAAD6//P/AAACAAEAAAD7//L/AAACAAEAAAD7//P/AAACAAEAAAD8//L/AAACAAEAAAD8//P/AAACAAEAAAD9//L/AAACAAEAAAD9//P/AAACAAEAAAD+//L/AAACAAEAAAD+//P/AAACAAEAAAD///L/AAACAAEAAAD///P/AAACAAEAAAAAAPL/AAACAAEAAAAAAPP/AAACAAEAAAABAPL/AAACAAEAAAABAPP/AAACAAEAAAACAPL/AAACAAEAAAACAPP/AAACAAEAAAADAPL/AAACAAEAAAADAPP/AAACAAEAAAAEAPL/AAACAAEAAAAEAPP/AAACAAEAAAAFAPL/AAACAAEAAAAFAPP/AAACAAEAAAAGAPL/AAACAAEAAAAGAPP/AAACAAEAAAAHAPL/AAACAAEAAAAHAPP/AAACAAEAAAAIAPL/AAACAAEAAAAIAPP/AAACAAEAAAAIAPT/AAACAAEAAAAIAPX/AAACAAEAAAAIAPb/AAACAAEAAAAIAPf/AAACAAEAAAAIAPj/AAACAAEAAAAIAPn/AAACAAEAAAAIAPr/AAACAAEAAAAIAPv/AAACAAEAAAAIAPz/AAACAAEAAAAIAP3/AAACAAEAAAAIAP7/AAACAAEAAAAIAP//AAACAAEAAAAJAPL/AAACAAEAAAAJAPP/AAACAAEAAAAJAPT/AAACAAEAAAAJAPX/AAACAAEAAAAJAPb/AAACAAEAAAAJAPf/AAACAAEAAAAJAPj/AAACAAEAAAAJAPn/AAACAAEAAAAJAPr/AAACAAEAAAAJAPv/AAACAAEAAAAJAPz/AAACAAEAAAAJAP3/AAACAAEAAAAJAP7/AAACAAEAAAAJAP//AAACAAEAAAAKAPL/AAACAAEAAAAKAPP/AAACAAEAAAAKAPT/AAACAAEAAAAKAPX/AAACAAEAAAAKAPb/AAACAAEAAAAKAPf/AAACAAEAAAAKAPj/AAACAAEAAAAKAPn/AAACAAEAAAAKAPr/AAACAAEAAAAKAPv/AAACAAEAAAAKAPz/AAACAAEAAAAKAP3/AAACAAEAAAAKAP7/AAACAAEAAAAKAP//AAACAAEAAAALAPL/AAACAAEAAAALAPP/AAACAAEAAAALAPT/AAACAAEAAAALAPX/AAACAAEAAAALAPb/AAACAAEAAAALAPf/AAACAAEAAAALAPj/AAACAAEAAAALAPn/AAACAAEAAAALAPr/AAACAAEAAAALAPv/AAACAAEAAAALAPz/AAACAAEAAAALAP3/AAACAAEAAAALAP7/AAACAAEAAAALAP//AAACAAEAAAAMAPL/AAACAAEAAAAMAPP/AAACAAEAAAAMAPT/AAACAAEAAAAMAPX/AAACAAEAAAAMAPb/AAACAAEAAAAMAPf/AAACAAEAAAAMAPj/AAACAAEAAAAMAPn/AAACAAEAAAAMAPr/AAACAAEAAAAMAPv/AAACAAEAAAAMAPz/AAACAAEAAAAMAP3/AAACAAEAAAAMAP7/AAACAAEAAAAMAP//AAACAAEAAAANAPL/AAACAAEAAAANAPP/AAACAAEAAAANAPT/AAACAAEAAAANAPX/AAACAAEAAAANAPb/AAACAAEAAAANAPf/AAACAAEAAAANAPj/AAACAAEAAAANAPn/AAACAAEAAAANAPr/AAACAAEAAAANAPv/AAACAAEAAAANAPz/AAACAAEAAAANAP3/AAACAAEAAAANAP7/AAACAAEAAAANAP//AAACAAEAAAAOAPL/AAACAAEAAAAOAPP/AAACAAEAAAAOAPT/AAACAAEAAAAOAPX/AAACAAEAAAAOAPb/AAACAAEAAAAOAPf/AAACAAEAAAAOAPj/AAACAAEAAAAOAPn/AAACAAEAAAAOAPr/AAACAAEAAAAOAPv/AAACAAEAAAAOAPz/AAACAAEAAAAOAP3/AAACAAEAAAAOAP7/AAACAAEAAAAOAP//AAACAAEAAAAPAPL/AAACAAEAAAAPAPP/AAACAAEAAAAPAPT/AAACAAEAAAAPAPX/AAACAAEAAAAPAPb/AAACAAEAAAAPAPf/AAACAAEAAAAPAPj/AAACAAEAAAAPAPn/AAACAAEAAAAPAPr/AAACAAEAAAAPAPv/AAACAAEAAAAPAPz/AAACAAEAAAAPAP3/AAACAAEAAAAPAP7/AAACAAEAAAAPAP//AAACAAEAAAAQAPL/AAACAAEAAAAQAPP/AAACAAEAAAAQAPT/AAACAAEAAAAQAPX/AAACAAEAAAAQAPb/AAACAAEAAAAQAPf/AAACAAEAAAAQAPj/AAACAAEAAAAQAPn/AAACAAEAAAAQAPr/AAACAAEAAAAQAPv/AAACAAEAAAAQAPz/AAACAAEAAAAQAP3/AAACAAEAAAAQAP7/AAACAAEAAAAQAP//AAACAAEAAAARAPL/AAACAAEAAAARAPP/AAACAAEAAAARAPT/AAACAAEAAAARAPX/AAACAAEAAAARAPb/AAACAAEAAAARAPf/AAACAAEAAAARAPj/AAACAAEAAAARAPn/AAACAAEAAAARAPr/AAACAAEAAAARAPv/AAACAAEAAAARAPz/AAACAAEAAAARAP3/AAACAAEAAAARAP7/AAACAAEAAAARAP//AAACAAEAAAASAPL/AAACAAEAAAASAPP/AAACAAEAAAASAPT/AAACAAEAAAASAPX/AAACAAEAAAASAPb/AAACAAEAAAASAPf/AAACAAEAAAASAPj/AAACAAEAAAASAPn/AAACAAEAAAASAPr/AAACAAEAAAASAPv/AAACAAEAAAASAPz/AAACAAEAAAASAP3/AAACAAEAAAASAP7/AAACAAEAAAASAP//AAACAAEAAAATAPL/AAACAAEAAAATAPP/AAACAAEAAAATAPT/AAACAAEAAAATAPX/AAACAAEAAAATAPb/AAACAAEAAAATAPf/AAACAAEAAAATAPj/AAACAAEAAAATAPn/AAACAAEAAAATAPr/AAACAAEAAAATAPv/AAACAAEAAAATAPz/AAACAAEAAAATAP3/AAACAAEAAAATAP7/AAACAAEAAAATAP//AAACAAEAAAAUAPL/AAACAAEAAAAUAPP/AAACAAEAAAAUAPT/AAACAAEAAAAUAPX/AAACAAEAAAAUAPb/AAACAAEAAAAUAPf/AAACAAEAAAAUAPj/AAACAAEAAAAUAPn/AAACAAEAAAAUAPr/AAACAAEAAAAUAPv/AAACAAEAAAAUAPz/AAACAAEAAAAUAP3/AAACAAEAAAAUAP7/AAACAAEAAAAUAP//AAACAAEAAAAVAPL/AAACAAEAAAAVAPP/AAACAAEAAAAVAPT/AAACAAEAAAAVAPX/AAACAAEAAAAVAPb/AAACAAEAAAAVAPf/AAACAAEAAAAVAPj/AAACAAEAAAAVAPn/AAACAAEAAAAVAPr/AAACAAEAAAAVAPv/AAACAAEAAAAVAPz/AAACAAEAAAAVAP3/AAACAAEAAAAVAP7/AAACAAEAAAAVAP//AAACAAEAAAAWAPL/AAACAAEAAAAWAPP/AAACAAEAAAAWAPT/AAACAAEAAAAWAPX/AAACAAEAAAAWAPb/AAACAAEAAAAWAPf/AAACAAEAAAAWAPj/AAACAAEAAAAWAPn/AAACAAEAAAAWAPr/AAACAAEAAAAWAPv/AAACAAEAAAAWAPz/AAACAAEAAAAWAP3/AAACAAEAAAAWAP7/AAACAAEAAAAWAP//AAACAAEAAAAXAPL/AAACAAEAAAAXAPP/AAACAAEAAAAXAPT/AAACAAEAAAAXAPX/AAACAAEAAAAXAPb/AAACAAEAAAAXAPf/AAACAAEAAAAXAPj/AAACAAEAAAAXAPn/AAACAAEAAAAXAPr/AAACAAEAAAAXAPv/AAACAAEAAAAXAPz/AAACAAEAAAAXAP3/AAACAAEAAAAXAP7/AAACAAEAAAAXAP//AAACAAEAAAAYAPL/AAACAAEAAAAYAPP/AAACAAEAAAAYAPT/AAACAAEAAAAYAPX/AAACAAEAAAAYAPb/AAACAAEAAAAYAPf/AAACAAEAAAAYAPj/AAACAAEAAAAYAPn/AAACAAEAAAAYAPr/AAACAAEAAAAYAPv/AAACAAEAAAAYAPz/AAACAAEAAAAYAP3/AAACAAEAAAAYAP7/AAACAAEAAAAYAP//AAACAAEAAAAZAPL/AAACAAEAAAAZAPP/AAACAAEAAAAZAPT/AAACAAEAAAAZAPX/AAACAAEAAAAZAPb/AAACAAEAAAAZAPf/AAACAAEAAAAZAPj/AAACAAEAAAAZAPn/AAACAAEAAAAZAPr/AAACAAEAAAAZAPv/AAACAAEAAAAZAPz/AAACAAEAAAAZAP3/AAACAAEAAAAZAP7/AAACAAEAAAAZAP//AAACAAEAAAAaAPL/AAACAAEAAAAaAPP/AAACAAEAAAAaAPT/AAACAAEAAAAaAPX/AAACAAEAAAAaAPb/AAACAAEAAAAaAPf/AAACAAEAAAAaAPj/AAACAAEAAAAaAPn/AAACAAEAAAAaAPr/AAACAAEAAAAaAPv/AAACAAEAAAAaAPz/AAACAAEAAAAaAP3/AAACAAEAAAAaAP7/AAACAAEAAAAaAP//AAACAAEAAAAbAPL/AAACAAEAAAAbAPP/AAACAAEAAAAbAPT/AAACAAEAAAAbAPX/AAACAAEAAAAbAPb/AAACAAEAAAAbAPf/AAACAAEAAAAbAPj/AAACAAEAAAAbAPn/AAACAAEAAAAbAPr/AAACAAEAAAAbAPv/AAACAAEAAAAbAPz/AAACAAEAAAAbAP3/AAACAAEAAAAbAP7/AAACAAEAAAAbAP//AAACAAEAAAAcAPL/AAACAAEAAAAcAPP/AAACAAEAAAAcAPT/AAACAAEAAAAcAPX/AAACAAEAAAAcAPb/AAACAAEAAAAcAPf/AAACAAEAAAAcAPj/AAACAAEAAAAcAPn/AAACAAEAAAAcAPr/AAACAAEAAAAcAPv/AAACAAEAAAAcAPz/AAACAAEAAAAcAP3/AAACAAEAAAAcAP7/AAACAAEAAAAcAP//AAACAAEAAAAdAPL/AAACAAEAAAAdAPP/AAACAAEAAAAdAPT/AAACAAEAAAAdAPX/AAACAAEAAAAdAPb/AAACAAEAAAAdAPf/AAACAAEAAAAdAPj/AAACAAEAAAAdAPn/AAACAAEAAAAdAPr/AAACAAEAAAAdAPv/AAACAAEAAAAdAPz/AAACAAEAAAAdAP3/AAACAAEAAAAdAP7/AAACAAEAAAAdAP//AAACAAEAAAAeAPL/AAACAAEAAAAeAPP/AAACAAEAAAAeAPT/AAACAAEAAAAeAPX/AAACAAEAAAAeAPb/AAACAAEAAAAeAPf/AAACAAEAAAAeAPj/AAACAAEAAAAeAPn/AAACAAEAAAAeAPr/AAACAAEAAAAeAPv/AAACAAEAAAAeAPz/AAACAAEAAAAeAP3/AAACAAEAAAAeAP7/AAACAAEAAAAeAP//AAACAAEAAAAfAPL/AAACAAEAAAAfAPP/AAACAAEAAAAfAPT/AAACAAEAAAAfAPX/AAACAAEAAAAfAPb/AAACAAEAAAAfAPf/AAACAAEAAAAfAPj/AAACAAEAAAAfAPn/AAACAAEAAAAfAPr/AAACAAEAAAAfAPv/AAACAAEAAAAfAPz/AAACAAEAAAAfAP3/AAACAAEAAAAfAP7/AAACAAEAAAAfAP//AAACAAEAAAAgAPL/AAACAAEAAAAgAPP/AAACAAEAAAAgAPT/AAACAAEAAAAgAPX/AAACAAEAAAAgAPb/AAACAAEAAAAgAPf/AAACAAEAAAAgAPj/AAACAAEAAAAgAPn/AAACAAEAAAAgAPr/AAACAAEAAAAgAPv/AAACAAEAAAAgAPz/AAACAAEAAAAgAP3/AAACAAEAAAAgAP7/AAACAAEAAAAgAP//AAACAAEAAAAhAPL/AAACAAEAAAAhAPP/AAACAAEAAAAhAPT/AAACAAEAAAAhAPX/AAACAAEAAAAhAPb/AAACAAEAAAAhAPf/AAACAAEAAAAhAPj/AAACAAEAAAAhAPn/AAACAAEAAAAhAPr/AAACAAEAAAAhAPv/AAACAAEAAAAhAPz/AAACAAEAAAAhAP3/AAACAAEAAAAhAP7/AAACAAEAAAAhAP//AAACAAEAAAAiAPL/AAACAAEAAAAiAPP/AAACAAEAAAAiAPT/AAACAAEAAAAiAPX/AAACAAEAAAAiAPb/AAACAAEAAAAiAPf/AAACAAEAAAAiAPj/AAACAAEAAAAiAPn/AAACAAEAAAAiAPr/AAACAAEAAAAiAPv/AAACAAEAAAAiAPz/AAACAAEAAAAiAP3/AAACAAEAAAAiAP7/AAACAAEAAAAiAP//AAACAAEAAAAjAPL/AAACAAEAAAAjAPP/AAACAAEAAAAjAPT/AAACAAEAAAAjAPX/AAACAAEAAAAjAPb/AAACAAEAAAAjAPf/AAACAAEAAAAjAPj/AAACAAEAAAAjAPn/AAACAAEAAAAjAPr/AAACAAEAAAAjAPv/AAACAAEAAAAjAPz/AAACAAEAAAAjAP3/AAACAAEAAAAjAP7/AAACAAEAAAAjAP//AAACAAEAAAAkAPL/AAACAAEAAAAkAPP/AAACAAEAAAAkAPT/AAACAAEAAAAkAPX/AAACAAEAAAAkAPb/AAACAAEAAAAkAPf/AAACAAEAAAAkAPj/AAACAAEAAAAkAPn/AAACAAEAAAAkAPr/AAACAAEAAAAkAPv/AAACAAEAAAAkAPz/AAACAAEAAAAkAP3/AAACAAEAAAAkAP7/AAACAAEAAAAkAP//AAACAAEAAAAlAPL/AAACAAEAAAAlAPP/AAACAAEAAAAlAPT/AAACAAEAAAAlAPX/AAACAAEAAAAlAPb/AAACAAEAAAAlAPf/AAACAAEAAAAlAPj/AAACAAEAAAAlAPn/AAACAAEAAAAlAPr/AAACAAEAAAAlAPv/AAACAAEAAAAlAPz/AAACAAEAAAAlAP3/AAACAAEAAAAlAP7/AAACAAEAAAAlAP//AAACAAEAAAAmAPL/AAACAAEAAAAmAPP/AAACAAEAAAAmAPT/AAACAAEAAAAmAPX/AAACAAEAAAAmAPb/AAACAAEAAAAmAPf/AAACAAEAAAAmAPj/AAACAAEAAAAmAPn/AAACAAEAAAAmAPr/AAACAAEAAAAmAPv/AAACAAEAAAAmAPz/AAACAAEAAAAmAP3/AAACAAEAAAAmAP7/AAACAAEAAAAmAP//AAACAAEAAAAnAPL/AAACAAEAAAAnAPP/AAACAAEAAAAnAPT/AAACAAEAAAAnAPX/AAACAAEAAAAnAPb/AAACAAEAAAAnAPf/AAACAAEAAAAnAPj/AAACAAEAAAAnAPn/AAACAAEAAAAnAPr/AAACAAEAAAAnAPv/AAACAAEAAAAnAPz/AAACAAEAAAAnAP3/AAACAAEAAAAnAP7/AAACAAEAAAAnAP//AAACAAEAAAAoAPL/AAACAAEAAAAoAPP/AAACAAEAAAAoAPT/AAACAAEAAAAoAPX/AAACAAEAAAAoAPb/AAACAAEAAAAoAPf/AAACAAEAAAAoAPj/AAACAAEAAAAoAPn/AAACAAEAAAAoAPr/AAACAAEAAAAoAPv/AAACAAEAAAAoAPz/AAACAAEAAAAoAP3/AAACAAEAAAAoAP7/AAACAAEAAAAoAP//AAACAAEAAAApAPL/AAACAAEAAAApAPP/AAACAAEAAAApAPT/AAACAAEAAAApAPX/AAACAAEAAAApAPb/AAACAAEAAAApAPf/AAACAAEAAAApAPj/AAACAAEAAAApAPn/AAACAAEAAAApAPr/AAACAAEAAAApAPv/AAACAAEAAAApAPz/AAACAAEAAAApAP3/AAACAAEAAAApAP7/AAACAAEAAAApAP//AAACAAEAAAAqAPL/AAACAAEAAAAqAPP/AAACAAEAAAAqAPT/AAACAAEAAAAqAPX/AAACAAEAAAAqAPb/AAACAAEAAAAqAPf/AAACAAEAAAAqAPj/AAACAAEAAAAqAPn/AAACAAEAAAAqAPr/AAACAAEAAAAqAPv/AAACAAEAAAAqAPz/AAACAAEAAAAqAP3/AAACAAEAAAAqAP7/AAACAAEAAAAqAP//AAACAAEAAAArAPL/AAACAAEAAAArAPP/AAACAAEAAAArAPT/AAACAAEAAAArAPX/AAACAAEAAAArAPb/AAACAAEAAAArAPf/AAACAAEAAAArAPj/AAACAAEAAAArAPn/AAACAAEAAAArAPr/AAACAAEAAAArAPv/AAACAAEAAAArAPz/AAACAAEAAAArAP3/AAACAAEAAAArAP7/AAACAAEAAAArAP//AAACAAEAAAAsAPL/AAACAAEAAAAsAPP/AAACAAEAAAAsAPT/AAACAAEAAAAsAPX/AAACAAEAAAAsAPb/AAACAAEAAAAsAPf/AAACAAEAAAAsAPj/AAACAAEAAAAsAPn/AAACAAEAAAAsAPr/AAACAAEAAAAsAPv/AAACAAEAAAAsAPz/AAACAAEAAAAsAP3/AAACAAEAAAAsAP7/AAACAAEAAAAsAP//AAACAAEAAAAtAPL/AAACAAEAAAAtAPP/AAACAAEAAAAtAPT/AAACAAEAAAAtAPX/AAACAAEAAAAtAPb/AAACAAEAAAAtAPf/AAACAAEAAAAtAPj/AAACAAEAAAAtAPn/AAACAAEAAAAtAPr/AAACAAEAAAAtAPv/AAACAAEAAAAtAPz/AAACAAEAAAAtAP3/AAACAAEAAAAtAP7/AAACAAEAAAAtAP//AAACAAEAAAAuAPL/AAACAAEAAAAuAPP/AAACAAEAAAAuAPT/AAACAAEAAAAuAPX/AAACAAEAAAAuAPb/AAACAAEAAAAuAPf/AAACAAEAAAAuAPj/AAACAAEAAAAuAPn/AAACAAEAAAAuAPr/AAACAAEAAAAuAPv/AAACAAEAAAAuAPz/AAACAAEAAAAuAP3/AAACAAEAAAAuAP7/AAACAAEAAAAuAP//AAACAAEAAAAvAPL/AAACAAEAAAAvAPP/AAACAAEAAAAvAPT/AAACAAEAAAAvAPX/AAACAAEAAAAvAPb/AAACAAEAAAAvAPf/AAACAAEAAAAvAPj/AAACAAEAAAAvAPn/AAACAAEAAAAvAPr/AAACAAEAAAAvAPv/AAACAAEAAAAvAPz/AAACAAEAAAAvAP3/AAACAAEAAAAvAP7/AAACAAEAAAAvAP//AAACAAEAAAAwAPL/AAACAAEAAAAwAPP/AAACAAEAAAAwAPT/AAACAAEAAAAwAPX/AAACAAEAAAAwAPb/AAACAAEAAAAwAPf/AAACAAEAAAAwAPj/AAACAAEAAAAwAPn/AAACAAEAAAAwAPr/AAACAAEAAAAwAPv/AAACAAEAAAAwAPz/AAACAAEAAAAwAP3/AAACAAEAAAAwAP7/AAACAAEAAAAwAP//AAACAAEAAAAxAPL/AAACAAEAAAAxAPP/AAACAAEAAAAxAPT/AAACAAEAAAAxAPX/AAACAAEAAAAxAPb/AAACAAEAAAAxAPf/AAACAAEAAAAxAPj/AAACAAEAAAAxAPn/AAACAAEAAAAxAPr/AAACAAEAAAAxAPv/AAACAAEAAAAxAPz/AAACAAEAAAAxAP3/AAACAAEAAAAxAP7/AAACAAEAAAAxAP//AAACAAEAAAAyAPL/AAACAAEAAAAyAPP/AAACAAEAAAAyAPT/AAACAAEAAAAyAPX/AAACAAEAAAAyAPb/AAACAAEAAAAyAPf/AAACAAEAAAAyAPj/AAACAAEAAAAyAPn/AAACAAEAAAAyAPr/AAACAAEAAAAyAPv/AAACAAEAAAAyAPz/AAACAAEAAAAyAP3/AAACAAEAAAAyAP7/AAACAAEAAAAyAP//AAACAAEAAAAzAPL/AAACAAEAAAAzAPP/AAACAAEAAAAzAPT/AAACAAEAAAAzAPX/AAACAAEAAAAzAPb/AAACAAEAAAAzAPf/AAACAAEAAAAzAPj/AAACAAEAAAAzAPn/AAACAAEAAAAzAPr/AAACAAEAAAAzAPv/AAACAAEAAAAzAPz/AAACAAEAAAAzAP3/AAACAAEAAAAzAP7/AAACAAEAAAAzAP//AAACAAEAAAA0APL/AAACAAEAAAA0APP/AAACAAEAAAA0APT/AAACAAEAAAA0APX/AAACAAEAAAA0APb/AAACAAEAAAA0APf/AAACAAEAAAA0APj/AAACAAEAAAA0APn/AAACAAEAAAA0APr/AAACAAEAAAA0APv/AAACAAEAAAA0APz/AAACAAEAAAA0AP3/AAACAAEAAAA0AP7/AAACAAEAAAA0AP//AAACAAEAAAA1APL/AAACAAEAAAA1APP/AAACAAEAAAA1APT/AAACAAEAAAA1APX/AAACAAEAAAA1APb/AAACAAEAAAA1APf/AAACAAEAAAA1APj/AAACAAEAAAA1APn/AAACAAEAAAA1APr/AAACAAEAAAA1APv/AAACAAEAAAA1APz/AAACAAEAAAA1AP3/AAACAAEAAAA1AP7/AAACAAEAAAA1AP//AAACAAEAAAA2APL/AAACAAEAAAA2APP/AAACAAEAAAA2APT/AAACAAEAAAA2APX/AAACAAEAAAA2APb/AAACAAEAAAA2APf/AAACAAEAAAA2APj/AAACAAEAAAA2APn/AAACAAEAAAA2APr/AAACAAEAAAA2APv/AAACAAEAAAA2APz/AAACAAEAAAA2AP3/AAACAAEAAAA2AP7/AAACAAEAAAA2AP//AAACAAEAAAA3APL/AAACAAEAAAA3APP/AAACAAEAAAA3APT/AAACAAEAAAA3APX/AAACAAEAAAA3APb/AAACAAEAAAA3APf/AAACAAEAAAA3APj/AAACAAEAAAA3APn/AAACAAEAAAA3APr/AAACAAEAAAA3APv/AAACAAEAAAA3APz/AAACAAEAAAA3AP3/AAACAAEAAAA3AP7/AAACAAEAAAA3AP//AAACAAEAAAA4APL/AAACAAEAAAA4APP/AAACAAEAAAA4APT/AAACAAEAAAA4APX/AAACAAEAAAA4APb/AAACAAEAAAA4APf/AAACAAEAAAA4APj/AAACAAEAAAA4APn/AAACAAEAAAA4APr/AAACAAEAAAA4APv/AAACAAEAAAA4APz/AAACAAEAAAA4AP3/AAACAAEAAAA4AP7/AAACAAEAAAA4AP//AAACAAEAAAA5APL/AAACAAEAAAA5APP/AAACAAEAAAA5APT/AAACAAEAAAA5APX/AAACAAEAAAA5APb/AAACAAEAAAA5APf/AAACAAEAAAA5APj/AAACAAEAAAA5APn/AAACAAEAAAA5APr/AAACAAEAAAA5APv/AAACAAEAAAA5APz/AAACAAEAAAA5AP3/AAACAAEAAAA5AP7/AAACAAEAAAA5AP//AAACAAEAAAA6APL/AAACAAEAAAA6APP/AAACAAEAAAA6APT/AAACAAEAAAA6APX/AAACAAEAAAA6APb/AAACAAEAAAA6APf/AAACAAEAAAA6APj/AAACAAEAAAA6APn/AAACAAEAAAA6APr/AAACAAEAAAA6APv/AAACAAEAAAA6APz/AAACAAEAAAA6AP3/AAACAAEAAAA6AP7/AAACAAEAAAA6AP//AAACAAEAAAA7APL/AAACAAEAAAA7APP/AAACAAEAAAA7APT/AAACAAEAAAA7APX/AAACAAEAAAA7APb/AAACAAEAAAA7APf/AAACAAEAAAA7APj/AAACAAEAAAA7APn/AAACAAEAAAA7APr/AAACAAEAAAA7APv/AAACAAEAAAA7APz/AAACAAEAAAA7AP3/AAACAAEAAAA7AP7/AAACAAEAAAA7AP//AAACAAEAAAA8APL/AAACAAEAAAA8APP/AAACAAEAAAA8APT/AAACAAEAAAA8APX/AAACAAEAAAA8APb/AAACAAEAAAA8APf/AAACAAEAAAA8APj/AAACAAEAAAA8APn/AAACAAEAAAA8APr/AAACAAEAAAA8APv/AAACAAEAAAA8APz/AAACAAEAAAA8AP3/AAACAAEAAAA8AP7/AAACAAEAAAA8AP//AAACAAEAAAA9APL/AAACAAEAAAA9APP/AAACAAEAAAA9APT/AAACAAEAAAA9APX/AAACAAEAAAA9APb/AAACAAEAAAA9APf/AAACAAEAAAA9APj/AAACAAEAAAA9APn/AAACAAEAAAA9APr/AAACAAEAAAA9APv/AAACAAEAAAA9APz/AAACAAEAAAA9AP3/AAACAAEAAAA9AP7/AAACAAEAAAA9AP//AAACAAEAAAA+APL/AAACAAEAAAA+APP/AAACAAEAAAA+APT/AAACAAEAAAA+APX/AAACAAEAAAA+APb/AAACAAEAAAA+APf/AAACAAEAAAA+APj/AAACAAEAAAA+APn/AAACAAEAAAA+APr/AAACAAEAAAA+APv/AAACAAEAAAA+APz/AAACAAEAAAA+AP3/AAACAAEAAAA+AP7/AAACAAEAAAA+AP//AAACAAEAAAA/APL/AAACAAEAAAA/APP/AAACAAEAAAA/APT/AAACAAEAAAA/APX/AAACAAEAAAA/APb/AAACAAEAAAA/APf/AAACAAEAAAA/APj/AAACAAEAAAA/APn/AAACAAEAAAA/APr/AAACAAEAAAA/APv/AAACAAEAAAA/APz/AAACAAEAAAA/AP3/AAACAAEAAAA/AP7/AAACAAEAAAA/AP//AAACAAEAAABAAPL/AAACAAEAAABAAPP/AAACAAEAAABAAPT/AAACAAEAAABAAPX/AAACAAEAAABAAPb/AAACAAEAAABAAPf/AAACAAEAAABAAPj/AAACAAEAAABAAPn/AAACAAEAAABAAPr/AAACAAEAAABAAPv/AAACAAEAAABAAPz/AAACAAEAAABAAP3/AAACAAEAAABAAP7/AAACAAEAAABAAP//AAACAAEAAABBAPL/AAACAAEAAABBAPP/AAACAAEAAABBAPT/AAACAAEAAABBAPX/AAACAAEAAABBAPb/AAACAAEAAABBAPf/AAACAAEAAABBAPj/AAACAAEAAABBAPn/AAACAAEAAABBAPr/AAACAAEAAABBAPv/AAACAAEAAABBAPz/AAACAAEAAABBAP3/AAACAAEAAABBAP7/AAACAAEAAABBAP//AAACAAEAAABCAPL/AAACAAEAAABCAPP/AAACAAEAAABCAPT/AAACAAEAAABCAPX/AAACAAEAAABCAPb/AAACAAEAAABCAPf/AAACAAEAAABCAPj/AAACAAEAAABCAPn/AAACAAEAAABCAPr/AAACAAEAAABCAPv/AAACAAEAAABCAPz/AAACAAEAAABCAP3/AAACAAEAAABCAP7/AAACAAEAAABCAP//AAACAAEAAABDAPL/AAACAAEAAABDAPP/AAACAAEAAABDAPT/AAACAAEAAABDAPX/AAACAAEAAABDAPb/AAACAAEAAABDAPf/AAACAAEAAABDAPj/AAACAAEAAABDAPn/AAACAAEAAABDAPr/AAACAAEAAABDAPv/AAACAAEAAABDAPz/AAACAAEAAABDAP3/AAACAAEAAABDAP7/AAACAAEAAABDAP//AAACAAEAAABEAPL/AAACAAEAAABEAPP/AAACAAEAAABEAPT/AAACAAEAAABEAPX/AAACAAEAAABEAPb/AAACAAEAAABEAPf/AAACAAEAAABEAPj/AAACAAEAAABEAPn/AAACAAEAAABEAPr/AAACAAEAAABEAPv/AAACAAEAAABEAPz/AAACAAEAAABEAP3/AAACAAEAAABEAP7/AAACAAEAAABEAP//AAACAAEAAABFAPL/AAACAAEAAABFAPP/AAACAAEAAABFAPT/AAACAAEAAABFAPX/AAACAAEAAABFAPb/AAACAAEAAABFAPf/AAACAAEAAABFAPj/AAACAAEAAABFAPn/AAACAAEAAABFAPr/AAACAAEAAABFAPv/AAACAAEAAABFAPz/AAACAAEAAABFAP3/AAACAAEAAABFAP7/AAACAAEAAABFAP//AAACAAEAAAA=") +tile_set = SubResource("TileSet_5bd38") + +[node name="Player" parent="." instance=ExtResource("3_3sswl")] +position = Vector2(584, 442) + +[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("4_3t3gn")] +position = Vector2(584, 456) +scale = Vector2(3.44061, 0.770942) +player = NodePath("../Player") +push_direction = 2 + +[node name="Camera2D" type="Camera2D" parent="."] +z_index = 4096 +position = Vector2(582, 328) +zoom = Vector2(2, 2) + +[node name="PauseMenu" parent="Camera2D" instance=ExtResource("5_gl2jq")] diff --git a/scenes/level/main_level.tscn b/scenes/level/main_level.tscn new file mode 100644 index 0000000..8cdd347 --- /dev/null +++ b/scenes/level/main_level.tscn @@ -0,0 +1,1672 @@ +[gd_scene load_steps=9 format=4 uid="uid://ds1fjw3marbia"] + +[ext_resource type="Script" uid="uid://2k5farej1c8m" path="res://scripts/main_level.gd" id="1_rqc32"] +[ext_resource type="Texture2D" uid="uid://bj3fteudhyal6" path="res://assets/textures/Overworld.png" id="2_hr3vg"] +[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="3_5ranr"] +[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="4_y0qys"] +[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/menu/pause_menu.tscn" id="5_06oyi"] +[ext_resource type="PackedScene" uid="uid://cjvtoi20cy8wi" path="res://scenes/menu/inventory.tscn" id="6_cymwe"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_n0o3p"] +texture = ExtResource("2_hr3vg") +0:0/0 = 0 +0:0/0/terrain_set = 0 +0:0/0/terrain = 0 +0:0/0/terrains_peering_bit/right_side = 0 +0:0/0/terrains_peering_bit/bottom_right_corner = 0 +0:0/0/terrains_peering_bit/bottom_side = 0 +0:0/0/terrains_peering_bit/bottom_left_corner = 0 +0:0/0/terrains_peering_bit/left_side = 0 +0:0/0/terrains_peering_bit/top_left_corner = 0 +0:0/0/terrains_peering_bit/top_side = 0 +0:0/0/terrains_peering_bit/top_right_corner = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +4:0/0 = 0 +5:0/0 = 0 +25:0/0 = 0 +26:0/0 = 0 +27:0/0 = 0 +28:0/0 = 0 +29:0/0 = 0 +30:0/0 = 0 +31:0/0 = 0 +32:0/0 = 0 +33:0/0 = 0 +34:0/0 = 0 +35:0/0 = 0 +36:0/0 = 0 +37:0/0 = 0 +25:1/0 = 0 +26:1/0 = 0 +27:1/0 = 0 +28:1/0 = 0 +29:1/0 = 0 +30:1/0 = 0 +31:1/0 = 0 +32:1/0 = 0 +33:1/0 = 0 +34:1/0 = 0 +35:1/0 = 0 +36:1/0 = 0 +37:1/0 = 0 +38:1/0 = 0 +25:2/0 = 0 +26:2/0 = 0 +27:2/0 = 0 +28:2/0 = 0 +29:2/0 = 0 +30:2/0 = 0 +31:2/0 = 0 +32:2/0 = 0 +33:2/0 = 0 +34:2/0 = 0 +35:2/0 = 0 +36:2/0 = 0 +37:2/0 = 0 +38:2/0 = 0 +3:3/0 = 0 +4:3/0 = 0 +5:3/0 = 0 +25:3/0 = 0 +26:3/0 = 0 +27:3/0 = 0 +28:3/0 = 0 +29:3/0 = 0 +30:3/0 = 0 +31:3/0 = 0 +32:3/0 = 0 +33:3/0 = 0 +34:3/0 = 0 +35:3/0 = 0 +36:3/0 = 0 +37:3/0 = 0 +38:3/0 = 0 +3:4/0 = 0 +4:4/0 = 0 +5:4/0 = 0 +21:4/0 = 0 +25:4/0 = 0 +26:4/0 = 0 +27:4/0 = 0 +28:4/0 = 0 +29:4/0 = 0 +30:4/0 = 0 +31:4/0 = 0 +32:4/0 = 0 +33:4/0 = 0 +34:4/0 = 0 +35:4/0 = 0 +36:4/0 = 0 +37:4/0 = 0 +38:4/0 = 0 +6:5/0 = 0 +7:5/0 = 0 +8:5/0 = 0 +9:5/0 = 0 +10:5/0 = 0 +21:5/0 = 0 +25:5/0 = 0 +26:5/0 = 0 +27:5/0 = 0 +28:5/0 = 0 +29:5/0 = 0 +30:5/0 = 0 +31:5/0 = 0 +32:5/0 = 0 +33:5/0 = 0 +34:5/0 = 0 +35:5/0 = 0 +36:5/0 = 0 +37:5/0 = 0 +38:5/0 = 0 +39:5/0 = 0 +5:6/0 = 0 +6:6/0 = 0 +7:6/0 = 0 +8:6/0 = 0 +9:6/0 = 0 +10:6/0 = 0 +15:6/0 = 0 +15:6/0/terrain_set = 0 +15:6/0/terrain = 2 +15:6/0/terrains_peering_bit/right_side = 2 +15:6/0/terrains_peering_bit/bottom_right_corner = 1 +15:6/0/terrains_peering_bit/bottom_side = 2 +15:6/0/terrains_peering_bit/bottom_left_corner = 2 +15:6/0/terrains_peering_bit/left_side = 2 +15:6/0/terrains_peering_bit/top_left_corner = 2 +15:6/0/terrains_peering_bit/top_side = 2 +15:6/0/terrains_peering_bit/top_right_corner = 2 +16:6/0 = 0 +16:6/0/terrain_set = 0 +16:6/0/terrain = 2 +16:6/0/terrains_peering_bit/right_side = 2 +16:6/0/terrains_peering_bit/bottom_right_corner = 1 +16:6/0/terrains_peering_bit/bottom_side = 1 +16:6/0/terrains_peering_bit/bottom_left_corner = 1 +16:6/0/terrains_peering_bit/left_side = 2 +16:6/0/terrains_peering_bit/top_left_corner = 2 +16:6/0/terrains_peering_bit/top_side = 2 +16:6/0/terrains_peering_bit/top_right_corner = 2 +17:6/0 = 0 +17:6/0/terrain_set = 0 +17:6/0/terrain = 2 +17:6/0/terrains_peering_bit/right_side = 2 +17:6/0/terrains_peering_bit/bottom_right_corner = 2 +17:6/0/terrains_peering_bit/bottom_side = 2 +17:6/0/terrains_peering_bit/bottom_left_corner = 1 +17:6/0/terrains_peering_bit/left_side = 2 +17:6/0/terrains_peering_bit/top_left_corner = 2 +17:6/0/terrains_peering_bit/top_side = 2 +17:6/0/terrains_peering_bit/top_right_corner = 2 +18:6/0 = 0 +18:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +19:6/0 = 0 +19:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +20:6/0 = 0 +20:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +21:6/0 = 0 +22:6/0 = 0 +23:6/0 = 0 +24:6/0 = 0 +25:6/0 = 0 +26:6/0 = 0 +27:6/0 = 0 +28:6/0 = 0 +29:6/0 = 0 +30:6/0 = 0 +31:6/0 = 0 +32:6/0 = 0 +33:6/0 = 0 +34:6/0 = 0 +35:6/0 = 0 +36:6/0 = 0 +37:6/0 = 0 +38:6/0 = 0 +39:6/0 = 0 +5:7/0 = 0 +6:7/0 = 0 +7:7/0 = 0 +8:7/0 = 0 +9:7/0 = 0 +10:7/0 = 0 +11:7/0 = 0 +12:7/0 = 0 +15:7/0 = 0 +15:7/0/terrain_set = 0 +15:7/0/terrain = 2 +15:7/0/terrains_peering_bit/right_side = 1 +15:7/0/terrains_peering_bit/bottom_right_corner = 1 +15:7/0/terrains_peering_bit/bottom_side = 2 +15:7/0/terrains_peering_bit/bottom_left_corner = 2 +15:7/0/terrains_peering_bit/left_side = 2 +15:7/0/terrains_peering_bit/top_left_corner = 2 +15:7/0/terrains_peering_bit/top_side = 2 +15:7/0/terrains_peering_bit/top_right_corner = 1 +17:7/0 = 0 +17:7/0/terrain_set = 0 +17:7/0/terrain = 2 +17:7/0/terrains_peering_bit/right_side = 2 +17:7/0/terrains_peering_bit/bottom_right_corner = 2 +17:7/0/terrains_peering_bit/bottom_side = 2 +17:7/0/terrains_peering_bit/bottom_left_corner = 1 +17:7/0/terrains_peering_bit/left_side = 1 +17:7/0/terrains_peering_bit/top_left_corner = 1 +17:7/0/terrains_peering_bit/top_side = 2 +17:7/0/terrains_peering_bit/top_right_corner = 2 +18:7/0 = 0 +18:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +19:7/0 = 0 +19:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +20:7/0 = 0 +20:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +26:7/0 = 0 +27:7/0 = 0 +28:7/0 = 0 +29:7/0 = 0 +30:7/0 = 0 +35:7/0 = 0 +36:7/0 = 0 +37:7/0 = 0 +38:7/0 = 0 +39:7/0 = 0 +0:8/0 = 0 +1:8/0 = 0 +5:8/0 = 0 +6:8/0 = 0 +7:8/0 = 0 +8:8/0 = 0 +9:8/0 = 0 +10:8/0 = 0 +11:8/0 = 0 +12:8/0 = 0 +13:8/0 = 0 +14:8/0 = 0 +15:8/0 = 0 +15:8/0/terrain_set = 0 +15:8/0/terrain = 2 +15:8/0/terrains_peering_bit/right_side = 2 +15:8/0/terrains_peering_bit/bottom_right_corner = 2 +15:8/0/terrains_peering_bit/bottom_side = 2 +15:8/0/terrains_peering_bit/bottom_left_corner = 2 +15:8/0/terrains_peering_bit/left_side = 2 +15:8/0/terrains_peering_bit/top_left_corner = 2 +15:8/0/terrains_peering_bit/top_side = 2 +15:8/0/terrains_peering_bit/top_right_corner = 1 +16:8/0 = 0 +16:8/0/terrain_set = 0 +16:8/0/terrain = 2 +16:8/0/terrains_peering_bit/right_side = 2 +16:8/0/terrains_peering_bit/bottom_right_corner = 2 +16:8/0/terrains_peering_bit/bottom_side = 2 +16:8/0/terrains_peering_bit/bottom_left_corner = 2 +16:8/0/terrains_peering_bit/left_side = 2 +16:8/0/terrains_peering_bit/top_left_corner = 1 +16:8/0/terrains_peering_bit/top_side = 1 +16:8/0/terrains_peering_bit/top_right_corner = 1 +17:8/0 = 0 +17:8/0/terrain_set = 0 +17:8/0/terrain = 2 +17:8/0/terrains_peering_bit/right_side = 2 +17:8/0/terrains_peering_bit/bottom_right_corner = 2 +17:8/0/terrains_peering_bit/bottom_side = 2 +17:8/0/terrains_peering_bit/bottom_left_corner = 2 +17:8/0/terrains_peering_bit/left_side = 2 +17:8/0/terrains_peering_bit/top_left_corner = 1 +17:8/0/terrains_peering_bit/top_side = 2 +17:8/0/terrains_peering_bit/top_right_corner = 2 +18:8/0 = 0 +18:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +19:8/0 = 0 +19:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +20:8/0 = 0 +20:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +26:8/0 = 0 +26:8/0/z_index = 1 +28:8/0 = 0 +28:8/0/z_index = 1 +29:8/0 = 0 +29:8/0/z_index = 1 +31:8/0 = 0 +32:8/0 = 0 +33:8/0 = 0 +35:8/0 = 0 +36:8/0 = 0 +37:8/0 = 0 +38:8/0 = 0 +39:8/0 = 0 +0:9/0 = 0 +0:9/0/terrain_set = 0 +0:9/0/terrain = 0 +0:9/0/terrains_peering_bit/right_side = 0 +0:9/0/terrains_peering_bit/bottom_side = 0 +0:9/0/terrains_peering_bit/bottom_left_corner = 0 +0:9/0/terrains_peering_bit/left_side = 0 +0:9/0/terrains_peering_bit/top_left_corner = 0 +0:9/0/terrains_peering_bit/top_side = 0 +0:9/0/terrains_peering_bit/top_right_corner = 0 +1:9/0 = 0 +1:9/0/terrain_set = 0 +1:9/0/terrain = 0 +1:9/0/terrains_peering_bit/right_side = 0 +1:9/0/terrains_peering_bit/bottom_right_corner = 0 +1:9/0/terrains_peering_bit/bottom_side = 0 +1:9/0/terrains_peering_bit/left_side = 0 +1:9/0/terrains_peering_bit/top_left_corner = 0 +1:9/0/terrains_peering_bit/top_side = 0 +1:9/0/terrains_peering_bit/top_right_corner = 0 +2:9/0 = 0 +2:9/0/terrain_set = 0 +2:9/0/terrain = 0 +2:9/0/terrains_peering_bit/right_side = 0 +2:9/0/terrains_peering_bit/bottom_right_corner = 0 +2:9/0/terrains_peering_bit/bottom_side = 0 +2:9/0/terrains_peering_bit/bottom_left_corner = 1 +2:9/0/terrains_peering_bit/left_side = 1 +2:9/0/terrains_peering_bit/top_left_corner = 1 +2:9/0/terrains_peering_bit/top_side = 1 +2:9/0/terrains_peering_bit/top_right_corner = 1 +3:9/0 = 0 +3:9/0/terrain_set = 0 +3:9/0/terrain = 0 +3:9/0/terrains_peering_bit/right_side = 1 +3:9/0/terrains_peering_bit/bottom_right_corner = 1 +3:9/0/terrains_peering_bit/bottom_side = 0 +3:9/0/terrains_peering_bit/bottom_left_corner = 0 +3:9/0/terrains_peering_bit/left_side = 0 +3:9/0/terrains_peering_bit/top_left_corner = 1 +3:9/0/terrains_peering_bit/top_side = 1 +3:9/0/terrains_peering_bit/top_right_corner = 1 +4:9/0 = 0 +5:9/0 = 0 +5:9/0/terrain_set = 0 +5:9/0/terrain = 0 +5:9/0/terrains_peering_bit/right_side = 0 +5:9/0/terrains_peering_bit/bottom_right_corner = 0 +5:9/0/terrains_peering_bit/bottom_side = 0 +5:9/0/terrains_peering_bit/bottom_left_corner = 0 +5:9/0/terrains_peering_bit/left_side = 0 +5:9/0/terrains_peering_bit/top_left_corner = 0 +5:9/0/terrains_peering_bit/top_side = 0 +5:9/0/terrains_peering_bit/top_right_corner = 0 +6:9/0 = 0 +7:9/0 = 0 +7:9/0/terrain_set = 0 +7:9/0/terrain = 0 +7:9/0/terrains_peering_bit/right_side = 0 +7:9/0/terrains_peering_bit/bottom_right_corner = 0 +7:9/0/terrains_peering_bit/bottom_side = 0 +7:9/0/terrains_peering_bit/bottom_left_corner = 0 +7:9/0/terrains_peering_bit/left_side = 0 +7:9/0/terrains_peering_bit/top_left_corner = 0 +7:9/0/terrains_peering_bit/top_side = 0 +7:9/0/terrains_peering_bit/top_right_corner = 0 +8:9/0 = 0 +8:9/0/terrain_set = 0 +8:9/0/terrain = 0 +8:9/0/terrains_peering_bit/right_side = 0 +8:9/0/terrains_peering_bit/bottom_right_corner = 0 +8:9/0/terrains_peering_bit/bottom_side = 0 +8:9/0/terrains_peering_bit/bottom_left_corner = 0 +8:9/0/terrains_peering_bit/left_side = 0 +8:9/0/terrains_peering_bit/top_left_corner = 0 +8:9/0/terrains_peering_bit/top_side = 0 +8:9/0/terrains_peering_bit/top_right_corner = 0 +10:9/0 = 0 +11:9/0 = 0 +12:9/0 = 0 +13:9/0 = 0 +14:9/0 = 0 +15:9/0 = 0 +15:9/0/terrain_set = 0 +15:9/0/terrain = 2 +15:9/0/terrains_peering_bit/right_side = 2 +15:9/0/terrains_peering_bit/bottom_right_corner = 2 +15:9/0/terrains_peering_bit/bottom_side = 2 +15:9/0/terrains_peering_bit/bottom_left_corner = 1 +15:9/0/terrains_peering_bit/left_side = 1 +15:9/0/terrains_peering_bit/top_left_corner = 1 +15:9/0/terrains_peering_bit/top_side = 1 +15:9/0/terrains_peering_bit/top_right_corner = 1 +16:9/0 = 0 +16:9/0/terrain_set = 0 +16:9/0/terrain = 2 +16:9/0/terrains_peering_bit/right_side = 1 +16:9/0/terrains_peering_bit/bottom_right_corner = 1 +16:9/0/terrains_peering_bit/bottom_side = 2 +16:9/0/terrains_peering_bit/bottom_left_corner = 2 +16:9/0/terrains_peering_bit/left_side = 2 +16:9/0/terrains_peering_bit/top_left_corner = 1 +16:9/0/terrains_peering_bit/top_side = 1 +16:9/0/terrains_peering_bit/top_right_corner = 1 +17:9/0 = 0 +18:9/0 = 0 +19:9/0 = 0 +32:9/0 = 0 +34:9/0 = 0 +35:9/0 = 0 +36:9/0 = 0 +37:9/0 = 0 +0:10/0 = 0 +0:10/0/terrain_set = 0 +0:10/0/terrain = 0 +0:10/0/terrains_peering_bit/right_side = 0 +0:10/0/terrains_peering_bit/bottom_right_corner = 0 +0:10/0/terrains_peering_bit/bottom_side = 0 +0:10/0/terrains_peering_bit/bottom_left_corner = 0 +0:10/0/terrains_peering_bit/left_side = 0 +0:10/0/terrains_peering_bit/top_left_corner = 0 +0:10/0/terrains_peering_bit/top_side = 0 +1:10/0 = 0 +1:10/0/terrain_set = 0 +1:10/0/terrain = 0 +1:10/0/terrains_peering_bit/right_side = 0 +1:10/0/terrains_peering_bit/bottom_right_corner = 0 +1:10/0/terrains_peering_bit/bottom_side = 0 +1:10/0/terrains_peering_bit/bottom_left_corner = 0 +1:10/0/terrains_peering_bit/left_side = 0 +1:10/0/terrains_peering_bit/top_side = 0 +1:10/0/terrains_peering_bit/top_right_corner = 0 +2:10/0 = 0 +2:10/0/terrain_set = 0 +2:10/0/terrain = 0 +2:10/0/terrains_peering_bit/right_side = 0 +2:10/0/terrains_peering_bit/bottom_right_corner = 1 +2:10/0/terrains_peering_bit/bottom_side = 1 +2:10/0/terrains_peering_bit/bottom_left_corner = 1 +2:10/0/terrains_peering_bit/left_side = 1 +2:10/0/terrains_peering_bit/top_left_corner = 1 +2:10/0/terrains_peering_bit/top_side = 0 +2:10/0/terrains_peering_bit/top_right_corner = 0 +3:10/0 = 0 +3:10/0/terrain_set = 0 +3:10/0/terrain = 0 +3:10/0/terrains_peering_bit/right_side = 1 +3:10/0/terrains_peering_bit/bottom_right_corner = 1 +3:10/0/terrains_peering_bit/bottom_side = 1 +3:10/0/terrains_peering_bit/bottom_left_corner = 1 +3:10/0/terrains_peering_bit/left_side = 0 +3:10/0/terrains_peering_bit/top_left_corner = 0 +3:10/0/terrains_peering_bit/top_side = 0 +3:10/0/terrains_peering_bit/top_right_corner = 1 +4:10/0 = 0 +5:10/0 = 0 +5:10/0/terrain_set = 0 +5:10/0/terrain = 0 +5:10/0/terrains_peering_bit/right_side = 0 +5:10/0/terrains_peering_bit/bottom_right_corner = 0 +5:10/0/terrains_peering_bit/bottom_side = 0 +5:10/0/terrains_peering_bit/bottom_left_corner = 0 +5:10/0/terrains_peering_bit/left_side = 0 +5:10/0/terrains_peering_bit/top_left_corner = 0 +5:10/0/terrains_peering_bit/top_side = 0 +5:10/0/terrains_peering_bit/top_right_corner = 0 +6:10/0 = 0 +7:10/0 = 0 +7:10/0/terrain_set = 0 +7:10/0/terrain = 0 +7:10/0/terrains_peering_bit/right_side = 0 +7:10/0/terrains_peering_bit/bottom_right_corner = 0 +7:10/0/terrains_peering_bit/bottom_side = 0 +7:10/0/terrains_peering_bit/bottom_left_corner = 0 +7:10/0/terrains_peering_bit/left_side = 0 +7:10/0/terrains_peering_bit/top_left_corner = 0 +7:10/0/terrains_peering_bit/top_side = 0 +7:10/0/terrains_peering_bit/top_right_corner = 0 +8:10/0 = 0 +8:10/0/terrain_set = 0 +8:10/0/terrain = 0 +8:10/0/terrains_peering_bit/right_side = 0 +8:10/0/terrains_peering_bit/bottom_right_corner = 0 +8:10/0/terrains_peering_bit/bottom_side = 0 +8:10/0/terrains_peering_bit/bottom_left_corner = 0 +8:10/0/terrains_peering_bit/left_side = 0 +8:10/0/terrains_peering_bit/top_left_corner = 0 +8:10/0/terrains_peering_bit/top_side = 0 +8:10/0/terrains_peering_bit/top_right_corner = 0 +9:10/0 = 0 +10:10/0 = 0 +11:10/0 = 0 +12:10/0 = 0 +13:10/0 = 0 +14:10/0 = 0 +15:10/0 = 0 +15:10/0/terrain_set = 0 +15:10/0/terrain = 2 +15:10/0/terrains_peering_bit/right_side = 2 +15:10/0/terrains_peering_bit/bottom_right_corner = 1 +15:10/0/terrains_peering_bit/bottom_side = 1 +15:10/0/terrains_peering_bit/bottom_left_corner = 1 +15:10/0/terrains_peering_bit/left_side = 1 +15:10/0/terrains_peering_bit/top_left_corner = 1 +15:10/0/terrains_peering_bit/top_side = 2 +15:10/0/terrains_peering_bit/top_right_corner = 2 +16:10/0 = 0 +16:10/0/terrain_set = 0 +16:10/0/terrain = 2 +16:10/0/terrains_peering_bit/right_side = 1 +16:10/0/terrains_peering_bit/bottom_right_corner = 1 +16:10/0/terrains_peering_bit/bottom_side = 1 +16:10/0/terrains_peering_bit/bottom_left_corner = 1 +16:10/0/terrains_peering_bit/left_side = 2 +16:10/0/terrains_peering_bit/top_left_corner = 2 +16:10/0/terrains_peering_bit/top_side = 2 +16:10/0/terrains_peering_bit/top_right_corner = 1 +17:10/0 = 0 +18:10/0 = 0 +19:10/0 = 0 +32:10/0 = 0 +33:10/0 = 0 +34:10/0 = 0 +35:10/0 = 0 +36:10/0 = 0 +37:10/0 = 0 +0:11/0 = 0 +0:11/0/terrain_set = 0 +0:11/0/terrain = 0 +0:11/0/terrains_peering_bit/right_side = 0 +0:11/0/terrains_peering_bit/bottom_right_corner = 0 +0:11/0/terrains_peering_bit/bottom_side = 0 +1:11/0 = 0 +1:11/0/terrain_set = 0 +1:11/0/terrain = 0 +1:11/0/terrains_peering_bit/right_side = 0 +1:11/0/terrains_peering_bit/bottom_right_corner = 0 +1:11/0/terrains_peering_bit/bottom_side = 0 +1:11/0/terrains_peering_bit/bottom_left_corner = 0 +1:11/0/terrains_peering_bit/left_side = 0 +2:11/0 = 0 +2:11/0/terrain_set = 0 +2:11/0/terrain = 0 +2:11/0/terrains_peering_bit/bottom_side = 0 +2:11/0/terrains_peering_bit/bottom_left_corner = 0 +2:11/0/terrains_peering_bit/left_side = 0 +3:11/0 = 0 +4:11/0 = 0 +5:11/0 = 0 +6:11/0 = 0 +7:11/0 = 0 +8:11/0 = 0 +9:11/0 = 0 +10:11/0 = 0 +11:11/0 = 0 +12:11/0 = 0 +13:11/0 = 0 +14:11/0 = 0 +15:11/0 = 0 +16:11/0 = 0 +17:11/0 = 0 +18:11/0 = 0 +19:11/0 = 0 +20:11/0 = 0 +32:11/0 = 0 +34:11/0 = 0 +35:11/0 = 0 +36:11/0 = 0 +37:11/0 = 0 +0:12/0 = 0 +1:12/0 = 0 +2:12/0 = 0 +3:12/0 = 0 +4:12/0 = 0 +5:12/0 = 0 +6:12/0 = 0 +7:12/0 = 0 +9:12/0 = 0 +10:12/0 = 0 +11:12/0 = 0 +12:12/0 = 0 +13:12/0 = 0 +14:12/0 = 0 +15:12/0 = 0 +16:12/0 = 0 +17:12/0 = 0 +18:12/0 = 0 +19:12/0 = 0 +20:12/0 = 0 +22:12/0 = 0 +23:12/0 = 0 +25:12/0 = 0 +26:12/0 = 0 +27:12/0 = 0 +30:12/0 = 0 +32:12/0 = 0 +34:12/0 = 0 +35:12/0 = 0 +36:12/0 = 0 +37:12/0 = 0 +0:13/0 = 0 +1:13/0 = 0 +2:13/0 = 0 +3:13/0 = 0 +4:13/0 = 0 +5:13/0 = 0 +6:13/0 = 0 +7:13/0 = 0 +8:13/0 = 0 +8:13/0/terrain_set = 0 +8:13/0/terrain = 0 +8:13/0/terrains_peering_bit/right_side = 0 +8:13/0/terrains_peering_bit/bottom_right_corner = 0 +8:13/0/terrains_peering_bit/bottom_side = 0 +8:13/0/terrains_peering_bit/bottom_left_corner = 1 +8:13/0/terrains_peering_bit/left_side = 1 +8:13/0/terrains_peering_bit/top_left_corner = 1 +8:13/0/terrains_peering_bit/top_side = 2 +8:13/0/terrains_peering_bit/top_right_corner = 2 +9:13/0 = 0 +9:13/0/terrain_set = 0 +9:13/0/terrain = 0 +9:13/0/terrains_peering_bit/right_side = 1 +9:13/0/terrains_peering_bit/bottom_right_corner = 1 +9:13/0/terrains_peering_bit/bottom_side = 0 +9:13/0/terrains_peering_bit/bottom_left_corner = 0 +9:13/0/terrains_peering_bit/left_side = 0 +9:13/0/terrains_peering_bit/top_left_corner = 2 +9:13/0/terrains_peering_bit/top_side = 2 +9:13/0/terrains_peering_bit/top_right_corner = 1 +10:13/0 = 0 +10:13/0/terrain_set = 0 +10:13/0/terrain = 0 +10:13/0/terrains_peering_bit/right_side = 0 +10:13/0/terrains_peering_bit/bottom_right_corner = 0 +10:13/0/terrains_peering_bit/bottom_side = 0 +10:13/0/terrains_peering_bit/bottom_left_corner = 2 +10:13/0/terrains_peering_bit/left_side = 2 +10:13/0/terrains_peering_bit/top_left_corner = 1 +10:13/0/terrains_peering_bit/top_side = 1 +10:13/0/terrains_peering_bit/top_right_corner = 1 +11:13/0 = 0 +11:13/0/terrain_set = 0 +11:13/0/terrain = 0 +11:13/0/terrains_peering_bit/right_side = 2 +11:13/0/terrains_peering_bit/bottom_right_corner = 2 +11:13/0/terrains_peering_bit/bottom_side = 0 +11:13/0/terrains_peering_bit/bottom_left_corner = 0 +11:13/0/terrains_peering_bit/left_side = 0 +11:13/0/terrains_peering_bit/top_left_corner = 1 +11:13/0/terrains_peering_bit/top_side = 1 +11:13/0/terrains_peering_bit/top_right_corner = 1 +12:13/0 = 0 +13:13/0 = 0 +14:13/0 = 0 +15:13/0 = 0 +16:13/0 = 0 +17:13/0 = 0 +18:13/0 = 0 +19:13/0 = 0 +20:13/0 = 0 +23:13/0 = 0 +24:13/0 = 0 +25:13/0 = 0 +26:13/0 = 0 +27:13/0 = 0 +28:13/0 = 0 +29:13/0 = 0 +30:13/0 = 0 +32:13/0 = 0 +34:13/0 = 0 +35:13/0 = 0 +36:13/0 = 0 +0:14/0 = 0 +1:14/0 = 0 +2:14/0 = 0 +3:14/0 = 0 +4:14/0 = 0 +5:14/0 = 0 +6:14/0 = 0 +7:14/0 = 0 +8:14/0 = 0 +8:14/0/terrain_set = 0 +8:14/0/terrain = 0 +8:14/0/terrains_peering_bit/right_side = 0 +8:14/0/terrains_peering_bit/bottom_right_corner = 2 +8:14/0/terrains_peering_bit/bottom_side = 2 +8:14/0/terrains_peering_bit/bottom_left_corner = 1 +8:14/0/terrains_peering_bit/left_side = 1 +8:14/0/terrains_peering_bit/top_left_corner = 1 +8:14/0/terrains_peering_bit/top_side = 0 +8:14/0/terrains_peering_bit/top_right_corner = 0 +9:14/0 = 0 +9:14/0/terrain_set = 0 +9:14/0/terrain = 0 +9:14/0/terrains_peering_bit/right_side = 1 +9:14/0/terrains_peering_bit/bottom_right_corner = 1 +9:14/0/terrains_peering_bit/bottom_side = 2 +9:14/0/terrains_peering_bit/bottom_left_corner = 2 +9:14/0/terrains_peering_bit/left_side = 0 +9:14/0/terrains_peering_bit/top_left_corner = 0 +9:14/0/terrains_peering_bit/top_side = 0 +9:14/0/terrains_peering_bit/top_right_corner = 1 +10:14/0 = 0 +10:14/0/terrain_set = 0 +10:14/0/terrain = 0 +10:14/0/terrains_peering_bit/right_side = 0 +10:14/0/terrains_peering_bit/bottom_right_corner = 1 +10:14/0/terrains_peering_bit/bottom_side = 1 +10:14/0/terrains_peering_bit/bottom_left_corner = 1 +10:14/0/terrains_peering_bit/left_side = 2 +10:14/0/terrains_peering_bit/top_left_corner = 2 +10:14/0/terrains_peering_bit/top_side = 0 +10:14/0/terrains_peering_bit/top_right_corner = 0 +11:14/0 = 0 +11:14/0/terrain_set = 0 +11:14/0/terrain = 0 +11:14/0/terrains_peering_bit/right_side = 2 +11:14/0/terrains_peering_bit/bottom_right_corner = 1 +11:14/0/terrains_peering_bit/bottom_side = 1 +11:14/0/terrains_peering_bit/bottom_left_corner = 1 +11:14/0/terrains_peering_bit/left_side = 0 +11:14/0/terrains_peering_bit/top_left_corner = 0 +11:14/0/terrains_peering_bit/top_side = 0 +11:14/0/terrains_peering_bit/top_right_corner = 2 +12:14/0 = 0 +13:14/0 = 0 +14:14/0 = 0 +15:14/0 = 0 +16:14/0 = 0 +18:14/0 = 0 +19:14/0 = 0 +20:14/0 = 0 +21:14/0 = 0 +22:14/0 = 0 +23:14/0 = 0 +24:14/0 = 0 +25:14/0 = 0 +26:14/0 = 0 +27:14/0 = 0 +28:14/0 = 0 +29:14/0 = 0 +30:14/0 = 0 +32:14/0 = 0 +34:14/0 = 0 +35:14/0 = 0 +36:14/0 = 0 +0:15/0 = 0 +1:15/0 = 0 +2:15/0 = 0 +3:15/0 = 0 +4:15/0 = 0 +5:15/0 = 0 +6:15/0 = 0 +7:15/0 = 0 +8:15/0 = 0 +9:15/0 = 0 +11:15/0 = 0 +12:15/0 = 0 +13:15/0 = 0 +14:15/0 = 0 +15:15/0 = 0 +16:15/0 = 0 +17:15/0 = 0 +18:15/0 = 0 +23:15/0 = 0 +24:15/0 = 0 +25:15/0 = 0 +26:15/0 = 0 +27:15/0 = 0 +28:15/0 = 0 +29:15/0 = 0 +0:16/0 = 0 +1:16/0 = 0 +2:16/0 = 0 +3:16/0 = 0 +4:16/0 = 0 +5:16/0 = 0 +6:16/0 = 0 +7:16/0 = 0 +11:16/0 = 0 +12:16/0 = 0 +13:16/0 = 0 +14:16/0 = 0 +17:16/0 = 0 +18:16/0 = 0 +23:16/0 = 0 +24:16/0 = 0 +28:16/0 = 0 +29:16/0 = 0 +33:16/0 = 0 +0:17/0 = 0 +2:17/0 = 0 +3:17/0 = 0 +4:17/0 = 0 +5:17/0 = 0 +6:17/0 = 0 +7:17/0 = 0 +9:17/0 = 0 +10:17/0 = 0 +11:17/0 = 0 +12:17/0 = 0 +13:17/0 = 0 +14:17/0 = 0 +15:17/0 = 0 +16:17/0 = 0 +19:17/0 = 0 +20:17/0 = 0 +21:17/0 = 0 +22:17/0 = 0 +23:17/0 = 0 +24:17/0 = 0 +25:17/0 = 0 +27:17/0 = 0 +28:17/0 = 0 +29:17/0 = 0 +30:17/0 = 0 +31:17/0 = 0 +32:17/0 = 0 +33:17/0 = 0 +34:17/0 = 0 +35:17/0 = 0 +36:17/0 = 0 +37:17/0 = 0 +38:17/0 = 0 +39:17/0 = 0 +0:18/0 = 0 +2:18/0 = 0 +3:18/0 = 0 +4:18/0 = 0 +5:18/0 = 0 +6:18/0 = 0 +7:18/0 = 0 +8:18/0 = 0 +9:18/0 = 0 +10:18/0 = 0 +11:18/0 = 0 +12:18/0 = 0 +13:18/0 = 0 +14:18/0 = 0 +15:18/0 = 0 +16:18/0 = 0 +17:18/0 = 0 +18:18/0 = 0 +19:18/0 = 0 +20:18/0 = 0 +21:18/0 = 0 +22:18/0 = 0 +23:18/0 = 0 +24:18/0 = 0 +25:18/0 = 0 +27:18/0 = 0 +28:18/0 = 0 +29:18/0 = 0 +30:18/0 = 0 +31:18/0 = 0 +32:18/0 = 0 +33:18/0 = 0 +34:18/0 = 0 +35:18/0 = 0 +36:18/0 = 0 +37:18/0 = 0 +38:18/0 = 0 +39:18/0 = 0 +0:19/0 = 0 +1:19/0 = 0 +3:19/0 = 0 +4:19/0 = 0 +5:19/0 = 0 +6:19/0 = 0 +7:19/0 = 0 +8:19/0 = 0 +9:19/0 = 0 +10:19/0 = 0 +11:19/0 = 0 +12:19/0 = 0 +13:19/0 = 0 +14:19/0 = 0 +15:19/0 = 0 +16:19/0 = 0 +17:19/0 = 0 +18:19/0 = 0 +19:19/0 = 0 +20:19/0 = 0 +21:19/0 = 0 +22:19/0 = 0 +23:19/0 = 0 +24:19/0 = 0 +27:19/0 = 0 +28:19/0 = 0 +29:19/0 = 0 +30:19/0 = 0 +31:19/0 = 0 +32:19/0 = 0 +33:19/0 = 0 +34:19/0 = 0 +35:19/0 = 0 +36:19/0 = 0 +37:19/0 = 0 +38:19/0 = 0 +39:19/0 = 0 +0:20/0 = 0 +1:20/0 = 0 +2:20/0 = 0 +3:20/0 = 0 +4:20/0 = 0 +5:20/0 = 0 +6:20/0 = 0 +7:20/0 = 0 +9:20/0 = 0 +10:20/0 = 0 +11:20/0 = 0 +12:20/0 = 0 +13:20/0 = 0 +14:20/0 = 0 +15:20/0 = 0 +16:20/0 = 0 +17:20/0 = 0 +18:20/0 = 0 +19:20/0 = 0 +20:20/0 = 0 +21:20/0 = 0 +22:20/0 = 0 +23:20/0 = 0 +24:20/0 = 0 +25:20/0 = 0 +26:20/0 = 0 +27:20/0 = 0 +28:20/0 = 0 +29:20/0 = 0 +0:21/0 = 0 +1:21/0 = 0 +2:21/0 = 0 +3:21/0 = 0 +4:21/0 = 0 +5:21/0 = 0 +6:21/0 = 0 +7:21/0 = 0 +9:21/0 = 0 +10:21/0 = 0 +11:21/0 = 0 +12:21/0 = 0 +13:21/0 = 0 +14:21/0 = 0 +15:21/0 = 0 +16:21/0 = 0 +17:21/0 = 0 +18:21/0 = 0 +19:21/0 = 0 +20:21/0 = 0 +21:21/0 = 0 +22:21/0 = 0 +23:21/0 = 0 +24:21/0 = 0 +25:21/0 = 0 +26:21/0 = 0 +27:21/0 = 0 +28:21/0 = 0 +29:21/0 = 0 +0:22/0 = 0 +1:22/0 = 0 +2:22/0 = 0 +3:22/0 = 0 +4:22/0 = 0 +5:22/0 = 0 +6:22/0 = 0 +7:22/0 = 0 +8:22/0 = 0 +9:22/0 = 0 +10:22/0 = 0 +11:22/0 = 0 +12:22/0 = 0 +13:22/0 = 0 +15:22/0 = 0 +16:22/0 = 0 +17:22/0 = 0 +18:22/0 = 0 +19:22/0 = 0 +20:22/0 = 0 +21:22/0 = 0 +22:22/0 = 0 +23:22/0 = 0 +24:22/0 = 0 +25:22/0 = 0 +26:22/0 = 0 +28:22/0 = 0 +29:22/0 = 0 +0:23/0 = 0 +1:23/0 = 0 +2:23/0 = 0 +3:23/0 = 0 +4:23/0 = 0 +5:23/0 = 0 +6:23/0 = 0 +7:23/0 = 0 +8:23/0 = 0 +9:23/0 = 0 +10:23/0 = 0 +11:23/0 = 0 +12:23/0 = 0 +13:23/0 = 0 +15:23/0 = 0 +16:23/0 = 0 +18:23/0 = 0 +19:23/0 = 0 +20:23/0 = 0 +21:23/0 = 0 +22:23/0 = 0 +23:23/0 = 0 +24:23/0 = 0 +25:23/0 = 0 +26:23/0 = 0 +27:23/0 = 0 +28:23/0 = 0 +29:23/0 = 0 +0:24/0 = 0 +1:24/0 = 0 +2:24/0 = 0 +3:24/0 = 0 +4:24/0 = 0 +5:24/0 = 0 +8:24/0 = 0 +9:24/0 = 0 +10:24/0 = 0 +12:24/0 = 0 +13:24/0 = 0 +15:24/0 = 0 +16:24/0 = 0 +18:24/0 = 0 +19:24/0 = 0 +20:24/0 = 0 +21:24/0 = 0 +22:24/0 = 0 +25:24/0 = 0 +26:24/0 = 0 +27:24/0 = 0 +28:24/0 = 0 +29:24/0 = 0 +0:25/0 = 0 +1:25/0 = 0 +2:25/0 = 0 +3:25/0 = 0 +4:25/0 = 0 +5:25/0 = 0 +8:25/0 = 0 +9:25/0 = 0 +10:25/0 = 0 +11:25/0 = 0 +12:25/0 = 0 +13:25/0 = 0 +14:25/0 = 0 +15:25/0 = 0 +16:25/0 = 0 +17:25/0 = 0 +18:25/0 = 0 +19:25/0 = 0 +20:25/0 = 0 +21:25/0 = 0 +22:25/0 = 0 +25:25/0 = 0 +26:25/0 = 0 +27:25/0 = 0 +28:25/0 = 0 +29:25/0 = 0 +0:26/0 = 0 +1:26/0 = 0 +2:26/0 = 0 +3:26/0 = 0 +4:26/0 = 0 +5:26/0 = 0 +6:26/0 = 0 +7:26/0 = 0 +8:26/0 = 0 +9:26/0 = 0 +11:26/0 = 0 +12:26/0 = 0 +13:26/0 = 0 +14:26/0 = 0 +15:26/0 = 0 +16:26/0 = 0 +17:26/0 = 0 +18:26/0 = 0 +19:26/0 = 0 +20:26/0 = 0 +21:26/0 = 0 +22:26/0 = 0 +25:26/0 = 0 +26:26/0 = 0 +27:26/0 = 0 +28:26/0 = 0 +29:26/0 = 0 +0:27/0 = 0 +1:27/0 = 0 +2:27/0 = 0 +3:27/0 = 0 +4:27/0 = 0 +5:27/0 = 0 +6:27/0 = 0 +7:27/0 = 0 +8:27/0 = 0 +9:27/0 = 0 +10:27/0 = 0 +11:27/0 = 0 +12:27/0 = 0 +13:27/0 = 0 +14:27/0 = 0 +15:27/0 = 0 +16:27/0 = 0 +17:27/0 = 0 +18:27/0 = 0 +19:27/0 = 0 +20:27/0 = 0 +21:27/0 = 0 +22:27/0 = 0 +25:27/0 = 0 +26:27/0 = 0 +27:27/0 = 0 +28:27/0 = 0 +29:27/0 = 0 +0:28/0 = 0 +1:28/0 = 0 +2:28/0 = 0 +3:28/0 = 0 +4:28/0 = 0 +5:28/0 = 0 +6:28/0 = 0 +7:28/0 = 0 +8:28/0 = 0 +9:28/0 = 0 +10:28/0 = 0 +11:28/0 = 0 +12:28/0 = 0 +13:28/0 = 0 +14:28/0 = 0 +15:28/0 = 0 +16:28/0 = 0 +17:28/0 = 0 +19:28/0 = 0 +20:28/0 = 0 +21:28/0 = 0 +22:28/0 = 0 +23:28/0 = 0 +25:28/0 = 0 +26:28/0 = 0 +28:28/0 = 0 +29:28/0 = 0 +0:29/0 = 0 +1:29/0 = 0 +2:29/0 = 0 +3:29/0 = 0 +4:29/0 = 0 +5:29/0 = 0 +6:29/0 = 0 +7:29/0 = 0 +8:29/0 = 0 +9:29/0 = 0 +10:29/0 = 0 +11:29/0 = 0 +12:29/0 = 0 +14:29/0 = 0 +15:29/0 = 0 +16:29/0 = 0 +17:29/0 = 0 +18:29/0 = 0 +19:29/0 = 0 +20:29/0 = 0 +21:29/0 = 0 +22:29/0 = 0 +23:29/0 = 0 +0:30/0 = 0 +1:30/0 = 0 +2:30/0 = 0 +3:30/0 = 0 +4:30/0 = 0 +5:30/0 = 0 +6:30/0 = 0 +7:30/0 = 0 +8:30/0 = 0 +9:30/0 = 0 +10:30/0 = 0 +11:30/0 = 0 +12:30/0 = 0 +14:30/0 = 0 +15:30/0 = 0 +16:30/0 = 0 +17:30/0 = 0 +18:30/0 = 0 +19:30/0 = 0 +20:30/0 = 0 +21:30/0 = 0 +22:30/0 = 0 +23:30/0 = 0 +0:31/0 = 0 +1:31/0 = 0 +2:31/0 = 0 +3:31/0 = 0 +4:31/0 = 0 +5:31/0 = 0 +6:31/0 = 0 +7:31/0 = 0 +8:31/0 = 0 +9:31/0 = 0 +10:31/0 = 0 +11:31/0 = 0 +12:31/0 = 0 +13:31/0 = 0 +14:31/0 = 0 +15:31/0 = 0 +16:31/0 = 0 +19:31/0 = 0 +20:31/0 = 0 +21:31/0 = 0 +22:31/0 = 0 +23:31/0 = 0 +24:31/0 = 0 +25:31/0 = 0 +26:31/0 = 0 +27:31/0 = 0 +0:32/0 = 0 +1:32/0 = 0 +2:32/0 = 0 +3:32/0 = 0 +4:32/0 = 0 +5:32/0 = 0 +6:32/0 = 0 +7:32/0 = 0 +8:32/0 = 0 +9:32/0 = 0 +10:32/0 = 0 +11:32/0 = 0 +12:32/0 = 0 +13:32/0 = 0 +14:32/0 = 0 +15:32/0 = 0 +16:32/0 = 0 +17:32/0 = 0 +18:32/0 = 0 +19:32/0 = 0 +20:32/0 = 0 +21:32/0 = 0 +22:32/0 = 0 +23:32/0 = 0 +24:32/0 = 0 +27:32/0 = 0 +0:33/0 = 0 +1:33/0 = 0 +4:33/0 = 0 +5:33/0 = 0 +6:33/0 = 0 +7:33/0 = 0 +8:33/0 = 0 +9:33/0 = 0 +10:33/0 = 0 +11:33/0 = 0 +12:33/0 = 0 +13:33/0 = 0 +14:33/0 = 0 +15:33/0 = 0 +16:33/0 = 0 +17:33/0 = 0 +18:33/0 = 0 +24:33/0 = 0 +25:33/0 = 0 +26:33/0 = 0 +27:33/0 = 0 +0:34/0 = 0 +1:34/0 = 0 +4:34/0 = 0 +5:34/0 = 0 +6:34/0 = 0 +7:34/0 = 0 +0:35/0 = 0 +1:35/0 = 0 +6:0/size_in_atlas = Vector2i(5, 5) +6:0/0 = 0 +6:0/0/z_index = 1 +6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -24, 32, -24, 32, 12, 32, 24, -32, 24, -32, 12) +4:1/size_in_atlas = Vector2i(2, 2) +4:1/0 = 0 +4:1/0/z_index = 1 +16:0/size_in_atlas = Vector2i(2, 2) +16:0/0 = 0 +16:2/size_in_atlas = Vector2i(2, 2) +16:2/0 = 0 +18:2/size_in_atlas = Vector2i(2, 2) +18:2/0 = 0 +18:0/size_in_atlas = Vector2i(2, 2) +18:0/0 = 0 +20:0/size_in_atlas = Vector2i(2, 2) +20:0/0 = 0 +20:2/size_in_atlas = Vector2i(2, 2) +20:2/0 = 0 +22:0/size_in_atlas = Vector2i(3, 6) +22:0/0 = 0 +3:5/size_in_atlas = Vector2i(3, 1) +3:5/0 = 0 +11:5/size_in_atlas = Vector2i(2, 2) +11:5/0 = 0 +13:5/size_in_atlas = Vector2i(2, 3) +13:5/0 = 0 +13:5/0/z_index = 1 +22:9/size_in_atlas = Vector2i(3, 3) +22:9/0 = 0 +22:9/0/z_index = 1 +25:9/size_in_atlas = Vector2i(3, 3) +25:9/0 = 0 +25:9/0/z_index = 1 +28:9/size_in_atlas = Vector2i(3, 3) +28:9/0 = 0 +28:9/0/z_index = 1 +27:8/0 = 0 +27:8/0/z_index = 1 +21:7/size_in_atlas = Vector2i(1, 2) +21:7/0 = 0 +21:7/0/z_index = 1 +22:7/0 = 0 +22:7/0/z_index = 1 +22:8/0 = 0 +22:8/0/z_index = 1 +23:7/size_in_atlas = Vector2i(1, 2) +23:7/0 = 0 +23:7/0/z_index = 1 +24:7/size_in_atlas = Vector2i(1, 2) +24:7/0 = 0 +24:7/0/z_index = 1 +0:3/0 = 0 +0:3/0/terrain_set = 0 +0:3/0/terrain = 0 +0:3/0/terrains_peering_bit/right_side = 0 +0:3/0/terrains_peering_bit/bottom_right_corner = 2 +0:3/0/terrains_peering_bit/bottom_side = 0 +0:3/0/terrains_peering_bit/bottom_left_corner = 0 +0:3/0/terrains_peering_bit/left_side = 0 +0:3/0/terrains_peering_bit/top_left_corner = 0 +0:3/0/terrains_peering_bit/top_side = 0 +0:3/0/terrains_peering_bit/top_right_corner = 0 +1:3/0 = 0 +1:3/0/terrain_set = 0 +1:3/0/terrain = 0 +1:3/0/terrains_peering_bit/right_side = 0 +1:3/0/terrains_peering_bit/bottom_right_corner = 2 +1:3/0/terrains_peering_bit/bottom_side = 2 +1:3/0/terrains_peering_bit/bottom_left_corner = 2 +1:3/0/terrains_peering_bit/left_side = 0 +1:3/0/terrains_peering_bit/top_left_corner = 0 +1:3/0/terrains_peering_bit/top_side = 0 +1:3/0/terrains_peering_bit/top_right_corner = 0 +2:3/0 = 0 +2:3/0/terrain_set = 0 +2:3/0/terrain = 0 +2:3/0/terrains_peering_bit/right_side = 0 +2:3/0/terrains_peering_bit/bottom_right_corner = 0 +2:3/0/terrains_peering_bit/bottom_side = 0 +2:3/0/terrains_peering_bit/bottom_left_corner = 2 +2:3/0/terrains_peering_bit/left_side = 0 +2:3/0/terrains_peering_bit/top_left_corner = 0 +2:3/0/terrains_peering_bit/top_side = 0 +2:3/0/terrains_peering_bit/top_right_corner = 0 +2:4/0 = 0 +2:4/0/terrain_set = 0 +2:4/0/terrain = 0 +2:4/0/terrains_peering_bit/right_side = 0 +2:4/0/terrains_peering_bit/bottom_right_corner = 0 +2:4/0/terrains_peering_bit/bottom_side = 0 +2:4/0/terrains_peering_bit/bottom_left_corner = 2 +2:4/0/terrains_peering_bit/left_side = 2 +2:4/0/terrains_peering_bit/top_left_corner = 2 +2:4/0/terrains_peering_bit/top_side = 0 +2:4/0/terrains_peering_bit/top_right_corner = 0 +2:5/0 = 0 +2:5/0/terrain_set = 0 +2:5/0/terrain = 0 +2:5/0/terrains_peering_bit/right_side = 0 +2:5/0/terrains_peering_bit/bottom_right_corner = 0 +2:5/0/terrains_peering_bit/bottom_side = 0 +2:5/0/terrains_peering_bit/bottom_left_corner = 0 +2:5/0/terrains_peering_bit/left_side = 0 +2:5/0/terrains_peering_bit/top_left_corner = 2 +2:5/0/terrains_peering_bit/top_side = 0 +2:5/0/terrains_peering_bit/top_right_corner = 0 +1:5/0 = 0 +1:5/0/terrain_set = 0 +1:5/0/terrain = 0 +1:5/0/terrains_peering_bit/right_side = 0 +1:5/0/terrains_peering_bit/bottom_right_corner = 0 +1:5/0/terrains_peering_bit/bottom_side = 0 +1:5/0/terrains_peering_bit/bottom_left_corner = 0 +1:5/0/terrains_peering_bit/left_side = 0 +1:5/0/terrains_peering_bit/top_left_corner = 2 +1:5/0/terrains_peering_bit/top_side = 2 +1:5/0/terrains_peering_bit/top_right_corner = 2 +1:4/0 = 0 +1:4/0/terrain_set = 0 +1:4/0/terrain = 2 +1:4/0/terrains_peering_bit/right_side = 2 +1:4/0/terrains_peering_bit/bottom_right_corner = 2 +1:4/0/terrains_peering_bit/bottom_side = 2 +1:4/0/terrains_peering_bit/bottom_left_corner = 2 +1:4/0/terrains_peering_bit/left_side = 2 +1:4/0/terrains_peering_bit/top_left_corner = 2 +1:4/0/terrains_peering_bit/top_side = 2 +1:4/0/terrains_peering_bit/top_right_corner = 2 +0:4/0 = 0 +0:4/0/terrain_set = 0 +0:4/0/terrain = 0 +0:4/0/terrains_peering_bit/right_side = 2 +0:4/0/terrains_peering_bit/bottom_right_corner = 2 +0:4/0/terrains_peering_bit/bottom_side = 0 +0:4/0/terrains_peering_bit/bottom_left_corner = 0 +0:4/0/terrains_peering_bit/left_side = 0 +0:4/0/terrains_peering_bit/top_left_corner = 0 +0:4/0/terrains_peering_bit/top_side = 0 +0:4/0/terrains_peering_bit/top_right_corner = 2 +0:5/0 = 0 +0:5/0/terrain_set = 0 +0:5/0/terrain = 0 +0:5/0/terrains_peering_bit/right_side = 0 +0:5/0/terrains_peering_bit/bottom_right_corner = 0 +0:5/0/terrains_peering_bit/bottom_side = 0 +0:5/0/terrains_peering_bit/bottom_left_corner = 0 +0:5/0/terrains_peering_bit/left_side = 0 +0:5/0/terrains_peering_bit/top_left_corner = 0 +0:5/0/terrains_peering_bit/top_side = 0 +0:5/0/terrains_peering_bit/top_right_corner = 2 +1:6/0 = 0 +1:6/0/terrain_set = 0 +1:6/0/terrain = 0 +1:6/0/terrains_peering_bit/right_side = 2 +1:6/0/terrains_peering_bit/bottom_right_corner = 2 +1:6/0/terrains_peering_bit/bottom_side = 0 +1:6/0/terrains_peering_bit/bottom_left_corner = 0 +1:6/0/terrains_peering_bit/left_side = 0 +1:6/0/terrains_peering_bit/top_left_corner = 2 +1:6/0/terrains_peering_bit/top_side = 2 +1:6/0/terrains_peering_bit/top_right_corner = 2 +0:6/0 = 0 +0:6/0/terrain_set = 0 +0:6/0/terrain = 0 +0:6/0/terrains_peering_bit/right_side = 0 +0:6/0/terrains_peering_bit/bottom_right_corner = 0 +0:6/0/terrains_peering_bit/bottom_side = 0 +0:6/0/terrains_peering_bit/bottom_left_corner = 2 +0:6/0/terrains_peering_bit/left_side = 2 +0:6/0/terrains_peering_bit/top_left_corner = 2 +0:6/0/terrains_peering_bit/top_side = 2 +0:6/0/terrains_peering_bit/top_right_corner = 2 +0:7/0 = 0 +0:7/0/terrain_set = 0 +0:7/0/terrain = 0 +0:7/0/terrains_peering_bit/right_side = 0 +0:7/0/terrains_peering_bit/bottom_right_corner = 2 +0:7/0/terrains_peering_bit/bottom_side = 2 +0:7/0/terrains_peering_bit/bottom_left_corner = 2 +0:7/0/terrains_peering_bit/left_side = 2 +0:7/0/terrains_peering_bit/top_left_corner = 2 +0:7/0/terrains_peering_bit/top_side = 0 +0:7/0/terrains_peering_bit/top_right_corner = 0 +1:7/0 = 0 +1:7/0/terrain_set = 0 +1:7/0/terrain = 0 +1:7/0/terrains_peering_bit/right_side = 2 +1:7/0/terrains_peering_bit/bottom_right_corner = 2 +1:7/0/terrains_peering_bit/bottom_side = 2 +1:7/0/terrains_peering_bit/bottom_left_corner = 2 +1:7/0/terrains_peering_bit/left_side = 0 +1:7/0/terrains_peering_bit/top_left_corner = 0 +1:7/0/terrains_peering_bit/top_side = 0 +1:7/0/terrains_peering_bit/top_right_corner = 2 +2:6/0 = 0 +2:6/0/terrain_set = 0 +2:6/0/terrain = 0 +2:6/0/terrains_peering_bit/right_side = 0 +2:6/0/terrains_peering_bit/bottom_right_corner = 1 +2:6/0/terrains_peering_bit/bottom_side = 0 +2:6/0/terrains_peering_bit/bottom_left_corner = 0 +2:6/0/terrains_peering_bit/left_side = 0 +2:6/0/terrains_peering_bit/top_left_corner = 0 +2:6/0/terrains_peering_bit/top_side = 0 +2:6/0/terrains_peering_bit/top_right_corner = 0 +3:6/0 = 0 +3:6/0/terrain_set = 0 +3:6/0/terrain = 0 +3:6/0/terrains_peering_bit/right_side = 0 +3:6/0/terrains_peering_bit/bottom_right_corner = 1 +3:6/0/terrains_peering_bit/bottom_side = 1 +3:6/0/terrains_peering_bit/bottom_left_corner = 1 +3:6/0/terrains_peering_bit/left_side = 0 +3:6/0/terrains_peering_bit/top_left_corner = 0 +3:6/0/terrains_peering_bit/top_side = 0 +3:6/0/terrains_peering_bit/top_right_corner = 0 +4:6/0 = 0 +4:6/0/terrain_set = 0 +4:6/0/terrain = 0 +4:6/0/terrains_peering_bit/right_side = 0 +4:6/0/terrains_peering_bit/bottom_right_corner = 0 +4:6/0/terrains_peering_bit/bottom_side = 0 +4:6/0/terrains_peering_bit/bottom_left_corner = 1 +4:6/0/terrains_peering_bit/left_side = 0 +4:6/0/terrains_peering_bit/top_left_corner = 0 +4:6/0/terrains_peering_bit/top_side = 0 +4:6/0/terrains_peering_bit/top_right_corner = 0 +4:7/0 = 0 +4:7/0/terrain_set = 0 +4:7/0/terrain = 0 +4:7/0/terrains_peering_bit/right_side = 0 +4:7/0/terrains_peering_bit/bottom_right_corner = 0 +4:7/0/terrains_peering_bit/bottom_side = 0 +4:7/0/terrains_peering_bit/bottom_left_corner = 1 +4:7/0/terrains_peering_bit/left_side = 1 +4:7/0/terrains_peering_bit/top_left_corner = 1 +4:7/0/terrains_peering_bit/top_side = 0 +4:7/0/terrains_peering_bit/top_right_corner = 0 +3:7/0 = 0 +3:7/0/terrain_set = 0 +3:7/0/terrain = 1 +3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:7/0/terrains_peering_bit/right_side = 1 +3:7/0/terrains_peering_bit/bottom_right_corner = 1 +3:7/0/terrains_peering_bit/bottom_side = 1 +3:7/0/terrains_peering_bit/bottom_left_corner = 1 +3:7/0/terrains_peering_bit/left_side = 1 +3:7/0/terrains_peering_bit/top_left_corner = 1 +3:7/0/terrains_peering_bit/top_side = 1 +3:7/0/terrains_peering_bit/top_right_corner = 1 +2:7/0 = 0 +2:7/0/terrain_set = 0 +2:7/0/terrain = 0 +2:7/0/terrains_peering_bit/right_side = 1 +2:7/0/terrains_peering_bit/bottom_right_corner = 1 +2:7/0/terrains_peering_bit/bottom_side = 0 +2:7/0/terrains_peering_bit/bottom_left_corner = 0 +2:7/0/terrains_peering_bit/left_side = 0 +2:7/0/terrains_peering_bit/top_left_corner = 0 +2:7/0/terrains_peering_bit/top_side = 0 +2:7/0/terrains_peering_bit/top_right_corner = 1 +2:8/0 = 0 +2:8/0/terrain_set = 0 +2:8/0/terrain = 0 +2:8/0/terrains_peering_bit/right_side = 0 +2:8/0/terrains_peering_bit/bottom_right_corner = 0 +2:8/0/terrains_peering_bit/bottom_side = 0 +2:8/0/terrains_peering_bit/bottom_left_corner = 0 +2:8/0/terrains_peering_bit/left_side = 0 +2:8/0/terrains_peering_bit/top_left_corner = 0 +2:8/0/terrains_peering_bit/top_side = 0 +2:8/0/terrains_peering_bit/top_right_corner = 1 +3:8/0 = 0 +3:8/0/terrain_set = 0 +3:8/0/terrain = 0 +3:8/0/terrains_peering_bit/right_side = 0 +3:8/0/terrains_peering_bit/bottom_right_corner = 0 +3:8/0/terrains_peering_bit/bottom_side = 0 +3:8/0/terrains_peering_bit/bottom_left_corner = 0 +3:8/0/terrains_peering_bit/left_side = 0 +3:8/0/terrains_peering_bit/top_left_corner = 1 +3:8/0/terrains_peering_bit/top_side = 1 +3:8/0/terrains_peering_bit/top_right_corner = 1 +4:8/0 = 0 +4:8/0/terrain_set = 0 +4:8/0/terrain = 0 +4:8/0/terrains_peering_bit/right_side = 0 +4:8/0/terrains_peering_bit/bottom_right_corner = 0 +4:8/0/terrains_peering_bit/bottom_side = 0 +4:8/0/terrains_peering_bit/bottom_left_corner = 0 +4:8/0/terrains_peering_bit/left_side = 0 +4:8/0/terrains_peering_bit/top_left_corner = 1 +4:8/0/terrains_peering_bit/top_side = 0 +4:8/0/terrains_peering_bit/top_right_corner = 0 +0:1/animation_columns = 4 +0:1/animation_mode = 1 +0:1/animation_frame_0/duration = 0.5 +0:1/animation_frame_1/duration = 0.5 +0:1/animation_frame_2/duration = 0.5 +0:1/animation_frame_3/duration = 0.5 +0:1/animation_frame_4/duration = 0.5 +0:1/animation_frame_5/duration = 0.5 +0:1/animation_frame_6/duration = 0.5 +0:1/animation_frame_7/duration = 0.5 +0:1/0 = 0 +0:1/0/terrain_set = 0 +0:1/0/terrain = 1 +0:1/0/probability = 0.3 +0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +0:1/0/terrains_peering_bit/right_side = 1 +0:1/0/terrains_peering_bit/bottom_right_corner = 1 +0:1/0/terrains_peering_bit/bottom_side = 1 +0:1/0/terrains_peering_bit/bottom_left_corner = 1 +0:1/0/terrains_peering_bit/left_side = 1 +0:1/0/terrains_peering_bit/top_left_corner = 1 +0:1/0/terrains_peering_bit/top_side = 1 +0:1/0/terrains_peering_bit/top_right_corner = 1 +11:0/size_in_atlas = Vector2i(2, 2) +11:0/0 = 0 +11:0/0/texture_origin = Vector2i(8, 8) +11:0/0/z_index = 2 +14:0/size_in_atlas = Vector2i(2, 2) +14:0/0 = 0 +14:0/0/texture_origin = Vector2i(-8, 8) +14:0/0/z_index = 2 +11:2/size_in_atlas = Vector2i(5, 3) +11:2/0 = 0 +11:2/0/z_index = 1 +25:7/size_in_atlas = Vector2i(1, 2) +25:7/0 = 0 +25:7/0/z_index = 1 +16:4/size_in_atlas = Vector2i(1, 2) +16:4/0 = 0 +16:4/0/texture_origin = Vector2i(0, 8) +16:4/0/z_index = 1 +17:4/size_in_atlas = Vector2i(1, 2) +17:4/0 = 0 +17:4/0/texture_origin = Vector2i(0, 8) +17:4/0/z_index = 1 +18:4/size_in_atlas = Vector2i(1, 2) +18:4/0 = 0 +18:4/0/texture_origin = Vector2i(0, 8) +18:4/0/z_index = 1 +19:4/size_in_atlas = Vector2i(1, 2) +19:4/0 = 0 +19:4/0/texture_origin = Vector2i(0, 8) +19:4/0/z_index = 1 +20:4/size_in_atlas = Vector2i(1, 2) +20:4/0 = 0 +20:4/0/texture_origin = Vector2i(0, 8) +20:4/0/z_index = 1 + +[sub_resource type="TileSet" id="TileSet_snsnx"] +physics_layer_0/collision_layer = 1 +terrain_set_0/mode = 0 +terrain_set_0/terrain_0/name = "Grass" +terrain_set_0/terrain_0/color = Color(0.34902, 0.890196, 0.352941, 1) +terrain_set_0/terrain_1/name = "Water" +terrain_set_0/terrain_1/color = Color(0.223529, 0.6, 0.882353, 1) +terrain_set_0/terrain_2/name = "Grass Paths" +terrain_set_0/terrain_2/color = Color(0.588235, 0.713726, 0.239216, 1) +sources/0 = SubResource("TileSetAtlasSource_n0o3p") + +[node name="MainLevel" type="Node2D"] +script = ExtResource("1_rqc32") + +[node name="TileMapLayer" type="TileMapLayer" parent="."] +position = Vector2(-154, 113) +tile_map_data = PackedByteArray("AAAAAP//AAASACEAAAD/////AAARACEAAAD+////AAARACEAAAD9////AAARACEAAAD7////AAAQACEAAAD6////AAAHAAoAAAD5////AAAHAAkAAAD4////AAAHAAkAAAD5/wAAAAAFAAoAAAD6/wAAAAAAAAMAAAD7/wAAAAABAAMAAAD8/wAAAAABAAMAAAD9/wAAAAABAAMAAAD+/wAAAAABAAMAAAD//wAAAAABAAMAAAAAAAAAAAABAAMAAAABAAAAAAABAAMAAAACAAEAAAABAAQAAAADAAEAAAABAAQAAAAEAAEAAAABAAQAAAD4/wAAAAANABwAAAD3/wAAAAAIAAoAAAACAAAAAAABAAMAAAADAAAAAAABAAMAAAAEAAAAAAABAAMAAAAFAAAAAAABAAMAAAAGAAAAAAABAAcAAAAHAAAAAAABAAQAAAAIAAAAAAAAAAcAAAABAP//AAAIAAoAAAACAP//AAAIAAoAAAADAP//AAAFAAkAAAAEAP//AAAHAAoAAAAFAP//AAAFAAkAAAAGAP//AAAAAAMAAAD2/wAAAAAMABwAAAD1/wAAAAALABwAAAD9/wEAAAABAAQAAAD+/wEAAAABAAQAAAD//wEAAAABAAQAAAAAAAEAAAABAAQAAAABAAEAAAABAAQAAAAFAAEAAAABAAQAAAAGAAEAAAABAAQAAAAHAAEAAAABAAQAAAAIAAEAAAABAAQAAAAJAAEAAAABAAQAAAD8/wEAAAABAAQAAAD7/wEAAAABAAQAAAD6/wEAAAABAAcAAAD5/wEAAAABAAMAAAD4/wEAAAAAAAMAAAD3/wEAAAAHAAkAAAD2/wEAAAAFAAoAAAD1/wEAAAAFAAkAAAD0/wEAAAAHAAoAAAD5//7/AAAFAAkAAAD6//7/AAAIAAoAAAD7//7/AAAQACAAAAD8//7/AAARACAAAAD9//7/AAARACAAAAD+//7/AAARACAAAAD///7/AAARACAAAAAAAP7/AAASACAAAAABAP7/AAAFAAoAAAACAP7/AAAIAAoAAAADAP7/AAAFAAoAAAAFAP7/AAAFAAkAAAAGAP7/AAAAAAAAAAAIAP7/AAACAAMAAAAJAP7/AAAHAAkAAAALAP7/AAAFAAoAAAAMAP7/AAAAAAAAAAD4//7/AAAFAAoAAAD3//7/AAAAAAAAAAD3//3/AAANABwAAAD4//3/AAAHAAoAAAD5//3/AAAFAAoAAAD6//3/AAAHAAoAAAD7//3/AAAHAAoAAAD8//3/AAAIAAkAAAD9//3/AAAFAAkAAAD+//3/AAAAAAAAAAD///3/AAAIAAoAAAAAAP3/AAAIAAkAAAABAP3/AAAIAAoAAAACAP3/AAAHAAkAAAADAP3/AAANABwAAAAEAPz/AAAHAAkAAAAFAPz/AAAAAAAAAAAHAPz/AAAIAAoAAAADAPz/AAAFAAkAAAACAPz/AAAIAAoAAAABAPz/AAAIAAkAAAAAAPz/AAAHAAoAAAD///z/AAAHAAoAAAD+//z/AAAIAAoAAAD9//z/AAAFAAoAAAD8//z/AAAAAAAAAAD7//z/AAAFAAoAAAD6//z/AAAAAAAAAAD5//z/AAANABwAAAD4//z/AAAIAAkAAAD3//z/AAAFAAkAAAAEAP3/AAAAAAAAAAAFAP3/AAAFAAkAAAAGAP3/AAAAAAAAAAAIAP3/AAAFAAoAAAAJAP3/AAAHAAoAAAALAP3/AAAIAAkAAAAMAP3/AAAFAAoAAAANAP7/AAAHAAoAAAAJAPz/AAAHAAoAAAAKAPz/AAAIAAoAAAALAPz/AAAFAAoAAAD+//v/AAAHAAoAAAD9//v/AAAFAAkAAAD8//v/AAAHAAoAAAD7//v/AAAIAAoAAAD6//v/AAAAAAAAAAD5//v/AAAIAAkAAAD4//v/AAAFAAkAAAD3//v/AAAIAAkAAAD2//v/AAAAAAAAAAD///v/AAANABwAAAAAAPv/AAAHAAkAAAABAPv/AAAIAAkAAAACAPv/AAAHAAkAAAADAPv/AAAAAAAAAAAEAPv/AAAFAAoAAAAFAPv/AAAHAAoAAAAGAPv/AAAHAAoAAAAHAPv/AAAIAAoAAAAJAPv/AAAFAAkAAAAKAPv/AAAFAAoAAAALAPv/AAAFAAoAAAAMAPv/AAAAAAAAAAD1//v/AAAFAAkAAAD0//v/AAAIAAkAAADz//r/AAAFAAkAAADy//r/AAAFAAkAAADy//v/AAAHAAoAAADz//v/AAAAAAAAAAAAAPr/AAAFAAoAAAD///r/AAAFAAoAAAD+//r/AAAFAAoAAAD9//r/AAAHAAoAAAD8//r/AAAHAAkAAAD7//r/AAAAAAAAAAD6//r/AAAHAAoAAAD5//r/AAAAAAAAAAD4//r/AAAIAAkAAAD3//r/AAAHAAoAAAD2//r/AAAFAAkAAAD1//r/AAAIAAkAAAD0//r/AAAFAAkAAAABAPr/AAAIAAkAAAACAPr/AAAFAAoAAAADAPr/AAAHAAkAAAAEAPr/AAAFAAoAAAAFAPr/AAAIAAoAAAAGAPr/AAAIAAkAAAAHAPr/AAAIAAkAAAAIAPr/AAAFAAoAAAAJAPr/AAAFAAoAAAAKAPr/AAAIAAoAAAALAPr/AAAHAAkAAAD6//n/AAAHAAkAAAD5//n/AAAIAAkAAAD4//n/AAAAAAAAAAD3//n/AAAIAAkAAAD2//n/AAAFAAoAAAD1//n/AAAFAAoAAAD0//n/AAAHAAoAAAAMAPr/AAAFAAkAAAANAPr/AAAHAAoAAAAOAPr/AAAIAAoAAAAPAPr/AAAAAAAAAAAQAPr/AAAFAAkAAAAIAPn/AAAFAAkAAAAHAPn/AAAHAAkAAAAGAPn/AAAAAAAAAAAFAPn/AAAAAAAAAAAEAPn/AAAFAAkAAAADAPn/AAAFAAoAAAACAPn/AAAAAAAAAAABAPn/AAAFAAkAAAAAAPn/AAAIAAkAAAD///n/AAAHAAoAAAD+//n/AAAFAAkAAAD9//n/AAAHAAkAAAD8//n/AAAFAAkAAAD7//n/AAAFAAoAAAD2//j/AAAHAAoAAAD1//j/AAAHAAkAAAD0//j/AAAHAAoAAADz//j/AAAFAAoAAADy//j/AAAFAAkAAADx//j/AAAFAAoAAAAJAPn/AAAFAAkAAAD///j/AAAFAAkAAAD+//j/AAAIAAkAAAD9//j/AAAFAAkAAAD8//j/AAAIAAkAAAD7//j/AAAFAAoAAAD6//j/AAAFAAoAAAD5//j/AAAIAAoAAAD4//j/AAAIAAkAAAD3//j/AAAFAAkAAAAAAPj/AAAIAAoAAAABAPj/AAAHAAoAAAACAPj/AAAFAAoAAAADAPj/AAAHAAoAAAAEAPj/AAAIAAkAAAAFAPj/AAAHAAoAAAAGAPj/AAAAAAAAAAAHAPj/AAAIAAoAAAAIAPj/AAAHAAkAAAAJAPj/AAAFAAoAAAAKAPj/AAAAAAAAAAAEAPf/AAAHAAkAAAADAPf/AAAFAAkAAAACAPf/AAAHAAkAAAABAPf/AAAIAAoAAAAAAPf/AAAFAAkAAAD///f/AAAIAAoAAAD+//f/AAAHAAoAAAD9//f/AAAIAAoAAAD8//f/AAAIAAkAAAD7//f/AAAIAAoAAAD6//f/AAAIAAkAAAD5//f/AAAHAAoAAAD4//f/AAAIAAkAAAD3//f/AAAIAAoAAAD2//f/AAAIAAkAAAD1//f/AAAHAAkAAAD0//f/AAAFAAoAAADz//f/AAAFAAkAAAALAPj/AAAFAAoAAAAMAPj/AAAHAAoAAAANAPj/AAAFAAoAAAAOAPj/AAAHAAoAAAAPAPj/AAAHAAoAAAAQAPn/AAAIAAkAAAARAPn/AAAIAAkAAAASAPn/AAAFAAkAAAATAPn/AAAFAAoAAAAPAPn/AAAHAAoAAAAOAPn/AAAHAAoAAADx//7/AAADAAcAAADx//3/AAADAAcAAADx//z/AAADAAYAAADx//v/AAAFAAkAAADx//r/AAAFAAoAAADx//n/AAAAAAAAAADy//n/AAAFAAoAAADz//n/AAAAAAAAAADy//z/AAAEAAYAAADy//3/AAACAAoAAADy//7/AAAAAAEAAADy////AAADAAcAAADx////AAADAAcAAADx/wAAAAADAAcAAADx/wEAAAAAAAEAAADy/wEAAAACAAkAAADy/wAAAAADAAcAAADz/wAAAAACAAkAAADz////AAADAAcAAADz//7/AAADAAcAAADz//3/AAADAAYAAADz//z/AAAFAAoAAAD0//z/AAAIAAkAAAD0//3/AAAEAAYAAAD0//7/AAAEAAcAAAD0////AAAEAAcAAAD0/wAAAAAEAAgAAAD1////AAAAAAAAAAD1//7/AAAFAAoAAAD1//3/AAAFAAoAAAD1//z/AAAAAAAAAAD2//z/AAAIAAoAAAD2//3/AAAAAAAAAAD2//7/AAAHAAkAAAD2////AAAIAAkAAAD3////AAAHAAoAAADz/wEAAAAEAAgAAADy//f/AAAHAAoAAADx//f/AAAFAAoAAAAIAPf/AAAIAAoAAAAHAPf/AAAIAAoAAAAGAPf/AAAIAAkAAAAFAPf/AAAFAAkAAAAJAPf/AAAIAAoAAAAKAPf/AAAIAAkAAAALAPf/AAAHAAoAAAAMAPf/AAAHAAoAAAANAPf/AAAAAAAAAAAOAPf/AAAAAAAAAAAPAPf/AAAHAAkAAAAQAPf/AAAAAAAAAAAQAPj/AAAHAAkAAAARAPj/AAAHAAoAAAARAPf/AAAIAAkAAAASAPf/AAAAAAAAAAASAPj/AAAIAAoAAAATAPj/AAAFAAoAAAATAPf/AAAIAAoAAAAMAPn/AAAHAAkAAAALAPn/AAAIAAkAAAAKAPn/AAAFAAoAAAANAPn/AAAIAAkAAAASAPv/AAAFAAkAAAASAPr/AAAFAAoAAAARAPr/AAAHAAkAAAARAPv/AAAAAAAAAAAQAPv/AAAFAAkAAAAPAPv/AAAFAAkAAAAOAPv/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAHAAkAAAAMAPz/AAAFAAkAAAANAP3/AAAFAAoAAAAOAP3/AAANABwAAAAOAPz/AAAAAAAAAAAPAPz/AAAFAAkAAAAPAP3/AAAFAAoAAAAPAP7/AAAHAAkAAAAOAP7/AAAIAAkAAAAOAP//AAAHAAkAAAANAP//AAAIAAoAAAAMAP//AAAIAAoAAAALAP//AAAHAAkAAAAKAP//AAAIAAoAAAAJAP//AAAAAAAAAAAIAP//AAACAAQAAAAJAAAAAAABAAMAAAAKAAAAAAABAAMAAAAKAAEAAAABAAQAAAALAAEAAAABAAQAAAALAAAAAAABAAMAAAAMAAAAAAABAAMAAAAMAAEAAAABAAQAAAANAAEAAAABAAQAAAANAAAAAAABAAMAAAAOAAAAAAABAAMAAAAOAAEAAAABAAQAAAAPAP//AAAIAAkAAAAQAP//AAAIAAoAAAAQAP7/AAAIAAoAAAAQAP3/AAAHAAkAAAAQAPz/AAAHAAoAAAARAPz/AAAIAAoAAAARAP3/AAAHAAoAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAAEAAAABAAQAAAASAAAAAAABAAMAAAASAP//AAAFAAoAAAASAP7/AAAIAAkAAAASAP3/AAAAAAAAAAASAPz/AAAFAAoAAAATAPz/AAAAAAAAAAATAPv/AAAHAAoAAAATAPr/AAAIAAkAAAATAP3/AAAFAAoAAAATAP7/AAAAAAAAAAATAP//AAAHAAkAAAATAAAAAAABAAMAAAATAAEAAAABAAQAAADi//D/AAAAAAsAAADi//H/AAABAAoAAADi//L/AAABAAkAAADi//P/AAABAAoAAADi//T/AAABAAkAAADi//X/AAABAAoAAADi//b/AAABAAkAAADi//f/AAABAAoAAADi//j/AAABAAkAAADi//n/AAABAAoAAADi//r/AAABAAkAAADi//v/AAABAAoAAADi//z/AAABAAkAAADi//3/AAABAAkAAADi//7/AAABAAkAAADi////AAABAAkAAADi/wAAAAABAAMAAADi/wEAAAABAAQAAADi/wIAAAABAAUAAADi/wMAAAAHAAkAAADi/wQAAAABAAkAAADi/wUAAAABAAkAAADi/wYAAAABAAoAAADi/wcAAAABAAkAAADi/wgAAAABAAoAAADi/wkAAAABAAkAAADi/woAAAABAAoAAADi/wsAAAABAAkAAADi/wwAAAABAAoAAADi/w0AAAABAAkAAADi/w4AAAABAAoAAADi/w8AAAABAAkAAADi/xAAAAABAAoAAADi/xEAAAABAAkAAADi/xIAAAABAAoAAADi/xMAAAABAAkAAADi/xQAAAABAAoAAADi/xUAAAABAAkAAADi/xYAAAABAAoAAADi/xcAAAABAAkAAADi/xgAAAABAAoAAADi/xkAAAABAAkAAADi/xoAAAABAAoAAADi/xsAAAABAAkAAADi/xwAAAABAAoAAADi/x0AAAABAAkAAADi/x4AAAABAAoAAADi/x8AAAABAAkAAADi/yAAAAABAAoAAADi/yEAAAABAAkAAADi/yIAAAABAAoAAADi/yMAAAABAAkAAADi/yQAAAABAAoAAADi/yUAAAABAAkAAADi/yYAAAABAAoAAADi/ycAAAABAAkAAADi/ygAAAABAAoAAADi/ykAAAAIAA4AAADi/yoAAAARAAcAAADi/ysAAAABAAQAAADi/ywAAAABAAUAAADi/y0AAAABAAkAAADi/y4AAAABAAoAAADi/y8AAAABAAkAAADi/zAAAAABAAoAAADi/zEAAAABAAkAAADi/zIAAAABAAoAAADi/zMAAAABAAkAAADj//D/AAABAAsAAADj//H/AAAIAAoAAADj//L/AAAIAAoAAADj//P/AAAHAAoAAADj//T/AAAIAAkAAADj//X/AAAIAAoAAADj//b/AAAFAAkAAADj//f/AAAIAAoAAADj//j/AAAFAAkAAADj//n/AAAHAAoAAADj//r/AAAHAAkAAADj//v/AAAIAAkAAADj//z/AAAHAAkAAADj//3/AAAFAAoAAADj//7/AAAIAAoAAADj////AAAIAAoAAADj/wAAAAABAAMAAADj/wEAAAABAAQAAADj/wIAAAABAAUAAADj/wMAAAAHAAoAAADj/wQAAAAIAAoAAADj/wUAAAAAAAAAAADj/wYAAAAFAAoAAADj/wcAAAAFAAoAAADj/wgAAAAHAAoAAADj/wkAAAAAAAAAAADj/woAAAAFAAkAAADj/wsAAAAFAAoAAADj/wwAAAAFAAkAAADj/w0AAAAFAAoAAADj/w4AAAAHAAoAAADj/w8AAAAAAAAAAADj/xAAAAAHAAkAAADj/xEAAAAIAAoAAADj/xIAAAAAAAAAAADj/xMAAAAIAAoAAADj/xQAAAAFAAoAAADj/xUAAAAIAAkAAADj/xYAAAAFAAoAAADj/xcAAAAFAAoAAADj/xgAAAAAAAAAAADj/xkAAAAIAAkAAADj/xoAAAAIAAkAAADj/xsAAAAHAAoAAADj/xwAAAAHAAkAAADj/x0AAAAFAAkAAADj/x4AAAAHAAoAAADj/x8AAAAHAAoAAADj/yAAAAAHAAkAAADj/yEAAAAIAAoAAADj/yIAAAAIAAkAAADj/yMAAAAFAAkAAADj/yQAAAAHAAoAAADj/yUAAAAAAAAAAADj/yYAAAAFAAoAAADj/ycAAAAIAAoAAADj/ygAAAAFAAkAAADj/ykAAAABAAMAAADj/yoAAAABAAQAAADj/ysAAAABAAQAAADj/ywAAAABAAUAAADj/y0AAAAFAAkAAADj/y4AAAAIAAkAAADj/y8AAAAHAAoAAADj/zAAAAAIAAkAAADj/zEAAAAHAAkAAADj/zIAAAAIAAkAAADj/zMAAAAFAAkAAADk//D/AAABAAsAAADk//H/AAAHAAkAAADk//L/AAAHAAoAAADk//P/AAAIAAkAAADk//T/AAAFAAoAAADk//X/AAAIAAkAAADk//b/AAAHAAoAAADk//f/AAAFAAoAAADk//j/AAAIAAoAAADk//n/AAAHAAkAAADk//r/AAAIAAkAAADk//v/AAAFAAoAAADk//z/AAAFAAoAAADk//3/AAAIAAkAAADk//7/AAAIAAoAAADk////AAAAAAAAAADk/wAAAAABAAMAAADk/wEAAAABAAQAAADk/wIAAAABAAUAAADk/wMAAAAIAAkAAADk/wQAAAAAAAAAAADk/wUAAAAAAAAAAADk/wYAAAAIAAoAAADk/wcAAAAAAAAAAADk/wgAAAAAAAAAAADk/wkAAAAAAAAAAADk/woAAAAIAAkAAADk/wsAAAAHAAoAAADk/wwAAAAHAAoAAADk/w0AAAAFAAoAAADk/w4AAAAAAAAAAADk/w8AAAAAAAAAAADk/xAAAAAFAAoAAADk/xEAAAAFAAoAAADk/xIAAAAHAAoAAADk/xMAAAAAAAAAAADk/xQAAAAFAAoAAADk/xUAAAAIAAoAAADk/xYAAAAIAAoAAADk/xcAAAAFAAkAAADk/xgAAAAFAAoAAADk/xkAAAAAAAAAAADk/xoAAAAHAAoAAADk/xsAAAAHAAkAAADk/xwAAAAHAAkAAADk/x0AAAAFAAoAAADk/x4AAAAAAAAAAADk/x8AAAAFAAkAAADk/yAAAAAIAAkAAADk/yEAAAAHAAkAAADk/yIAAAAIAAoAAADk/yMAAAAFAAkAAADk/yQAAAAHAAkAAADk/yUAAAAIAAoAAADk/yYAAAAIAAoAAADk/ycAAAAFAAoAAADk/ygAAAAFAAoAAADk/ykAAAABAAMAAADk/yoAAAABAAQAAADk/ysAAAABAAQAAADk/ywAAAABAAUAAADk/y0AAAAHAAkAAADk/y4AAAAHAAoAAADk/y8AAAAHAAkAAADk/zAAAAAHAAkAAADk/zEAAAAHAAoAAADk/zIAAAAAAAAAAADk/zMAAAAHAAkAAADl//D/AAABAAsAAADl//H/AAAIAAkAAADl//L/AAAIAAoAAADl//P/AAAHAAkAAADl//T/AAAFAAoAAADl//X/AAAAAAAAAADl//b/AAAHAAoAAADl//f/AAAFAAoAAADl//j/AAAHAAoAAADl//n/AAAFAAkAAADl//r/AAAFAAkAAADl//v/AAAHAAkAAADl//z/AAAIAAkAAADl//3/AAAIAAoAAADl//7/AAAHAAoAAADl////AAAFAAoAAADl/wAAAAABAAMAAADl/wEAAAABAAQAAADl/wIAAAABAAUAAADl/wMAAAAFAAkAAADl/wQAAAAHAAoAAADl/wUAAAAHAAkAAADl/wYAAAAIAAoAAADl/wcAAAAIAAkAAADl/wgAAAAIAAoAAADl/wkAAAAIAAoAAADl/woAAAAHAAoAAADl/wsAAAAHAAkAAADl/wwAAAAIAAkAAADl/w0AAAAAAAAAAADl/w4AAAAIAAoAAADl/w8AAAAFAAoAAADl/xAAAAAIAAkAAADl/xEAAAAFAAoAAADl/xIAAAAFAAoAAADl/xMAAAAFAAoAAADl/xQAAAAFAAoAAADl/xUAAAAFAAkAAADl/xYAAAAHAAoAAADl/xcAAAAIAAkAAADl/xgAAAAIAAoAAADl/xkAAAAIAAoAAADl/xoAAAAFAAoAAADl/xsAAAAHAAkAAADl/xwAAAAHAAoAAADl/x0AAAAAAAAAAADl/x4AAAAIAAkAAADl/x8AAAAIAAoAAADl/yAAAAAIAAoAAADl/yEAAAAIAAkAAADl/yIAAAAHAAkAAADl/yMAAAAIAAoAAADl/yQAAAAFAAkAAADl/yUAAAAAAAAAAADl/yYAAAAHAAoAAADl/ycAAAAFAAkAAADl/ygAAAAAAAAAAADl/ykAAAABAAMAAADl/yoAAAABAAQAAADl/ysAAAABAAQAAADl/ywAAAABAAUAAADl/y0AAAAIAAkAAADl/y4AAAAAAAAAAADl/y8AAAAAAAAAAADl/zAAAAAHAAkAAADl/zEAAAAHAAkAAADl/zIAAAAFAAkAAADl/zMAAAAAAAAAAADm//D/AAABAAsAAADm//H/AAAIAAoAAADm//L/AAAFAAoAAADm//P/AAAHAAkAAADm//T/AAAIAAkAAADm//X/AAAHAAoAAADm//b/AAAFAAkAAADm//f/AAAFAAkAAADm//j/AAAHAAoAAADm//n/AAAHAAkAAADm//r/AAAAAAAAAADm//v/AAAHAAkAAADm//z/AAAAAAAAAADm//3/AAAIAAkAAADm//7/AAAAAAAAAADm////AAAIAAkAAADm/wAAAAABAAMAAADm/wEAAAABAAQAAADm/wIAAAABAAUAAADm/wMAAAAIAAkAAADm/wQAAAAHAAoAAADm/wUAAAAIAAoAAADm/wYAAAAHAAoAAADm/wcAAAAHAAkAAADm/wgAAAAIAAoAAADm/wkAAAAHAAoAAADm/woAAAAFAAoAAADm/wsAAAAIAAkAAADm/wwAAAAHAAkAAADm/w0AAAAIAAkAAADm/w4AAAAAAAAAAADm/w8AAAAIAAoAAADm/xAAAAAFAAkAAADm/xEAAAAFAAkAAADm/xIAAAAFAAoAAADm/xMAAAAIAAoAAADm/xQAAAAFAAkAAADm/xUAAAAFAAoAAADm/xYAAAAIAAoAAADm/xcAAAAFAAkAAADm/xgAAAAHAAoAAADm/xkAAAAIAAoAAADm/xoAAAAFAAkAAADm/xsAAAAFAAoAAADm/xwAAAAHAAoAAADm/x0AAAAIAAoAAADm/x4AAAAIAAoAAADm/x8AAAAIAAoAAADm/yAAAAAAAAAAAADm/yEAAAAFAAkAAADm/yIAAAAFAAoAAADm/yMAAAAHAAoAAADm/yQAAAAIAAoAAADm/yUAAAAFAAoAAADm/yYAAAAFAAoAAADm/ycAAAAAAAAAAADm/ygAAAAHAAkAAADm/ykAAAABAAMAAADm/yoAAAABAAQAAADm/ysAAAABAAQAAADm/ywAAAABAAYAAADm/y0AAAAAAAUAAADm/y4AAAAIAAoAAADm/y8AAAAIAAkAAADm/zAAAAAIAAoAAADm/zEAAAAHAAoAAADm/zIAAAAHAAkAAADm/zMAAAAIAAkAAADn//D/AAABAAsAAADn//H/AAAFAAoAAADn//L/AAAIAAoAAADn//P/AAAHAAkAAADn//T/AAAIAAkAAADn//X/AAAFAAoAAADn//b/AAAAAAAAAADn//f/AAAFAAoAAADn//j/AAAHAAkAAADn//n/AAAIAAkAAADn//r/AAAHAAoAAADn//v/AAAAAAAAAADn//z/AAAFAAkAAADn//3/AAAFAAkAAADn//7/AAAFAAoAAADn////AAAHAAoAAADn/wAAAAABAAMAAADn/wEAAAABAAQAAADn/wIAAAABAAUAAADn/wMAAAAFAAoAAADn/wQAAAAHAAoAAADn/wUAAAAHAAoAAADn/wYAAAAIAAoAAADn/wcAAAAAAAAAAADn/wgAAAAIAAoAAADn/wkAAAAHAAkAAADn/woAAAAHAAoAAADn/wsAAAAIAAoAAADn/wwAAAAHAAoAAADn/w0AAAAIAAoAAADn/w4AAAAFAAkAAADn/w8AAAAFAAoAAADn/xAAAAAFAAoAAADn/xEAAAAIAAoAAADn/xIAAAAHAAkAAADn/xMAAAAIAAoAAADn/xQAAAAAAAAAAADn/xUAAAAIAAkAAADn/xYAAAAFAAkAAADn/xcAAAAIAAoAAADn/xgAAAAHAAoAAADn/xkAAAAFAAkAAADn/xoAAAAHAAoAAADn/xsAAAAIAAkAAADn/xwAAAAFAAkAAADn/x0AAAAIAAoAAADn/x4AAAAHAAoAAADn/x8AAAAIAAoAAADn/yAAAAAHAAoAAADn/yEAAAAIAAoAAADn/yIAAAAIAAoAAADn/yMAAAAFAAoAAADn/yQAAAAIAAoAAADn/yUAAAAFAAoAAADn/yYAAAAHAAoAAADn/ycAAAAFAAoAAADn/ygAAAAIAAkAAADn/ykAAAABAAMAAADn/yoAAAABAAQAAADn/ysAAAABAAQAAADn/ywAAAABAAQAAADn/y0AAAABAAUAAADn/y4AAAAFAAkAAADn/y8AAAAHAAkAAADn/zAAAAAAAAAAAADn/zEAAAAFAAkAAADn/zIAAAAFAAoAAADn/zMAAAAFAAkAAADo//D/AAABAAsAAADo//H/AAAFAAkAAADo//L/AAAFAAkAAADo//P/AAAAAAAAAADo//T/AAAFAAoAAADo//X/AAAFAAoAAADo//b/AAAHAAkAAADo//f/AAAIAAkAAADo//j/AAAHAAkAAADo//n/AAAAAAAAAADo//r/AAAFAAkAAADo//v/AAAIAAkAAADo//z/AAAFAAkAAADo//3/AAAFAAoAAADo//7/AAAHAAkAAADo////AAAAAAAAAADo/wAAAAABAAMAAADo/wEAAAABAAQAAADo/wIAAAABAAYAAADo/wMAAAAAAAQAAADo/wQAAAAAAAQAAADo/wUAAAAAAAUAAADo/wYAAAAIAAkAAADo/wcAAAAFAAkAAADo/wgAAAAHAAkAAADo/wkAAAAFAAoAAADo/woAAAAHAAkAAADo/wsAAAAAAAAAAADo/wwAAAAFAAkAAADo/w0AAAAIAAoAAADo/w4AAAAIAAkAAADo/w8AAAAAAAAAAADo/xAAAAAAAAAAAADo/xEAAAAHAAoAAADo/xIAAAAHAAkAAADo/xMAAAAIAAoAAADo/xQAAAAFAAoAAADo/xUAAAAAAAAAAADo/xYAAAAIAAoAAADo/xcAAAAHAAkAAADo/xgAAAAFAAkAAADo/xkAAAAAAAAAAADo/xoAAAAFAAoAAADo/xsAAAAHAAoAAADo/xwAAAAAAAAAAADo/x0AAAAHAAoAAADo/x4AAAAFAAkAAADo/x8AAAAFAAkAAADo/yAAAAAIAAoAAADo/yEAAAAHAAoAAADo/yIAAAAFAAkAAADo/yMAAAAFAAkAAADo/yQAAAAIAAkAAADo/yUAAAAFAAoAAADo/yYAAAAAAAAAAADo/ycAAAAFAAkAAADo/ygAAAAHAAkAAADo/ykAAAABAAMAAADo/yoAAAABAAQAAADo/ysAAAABAAQAAADo/ywAAAABAAQAAADo/y0AAAABAAYAAADo/y4AAAAAAAUAAADo/y8AAAAHAAoAAADo/zAAAAAHAAoAAADo/zEAAAAAAAAAAADo/zIAAAAIAAoAAADo/zMAAAAAAAAAAADp//D/AAABAAsAAADp//H/AAAFAAoAAADp//L/AAAFAAkAAADp//P/AAAAAAAAAADp//T/AAAHAAkAAADp//X/AAAFAAoAAADp//b/AAAFAAoAAADp//f/AAAFAAkAAADp//j/AAAHAAoAAADp//n/AAAFAAkAAADp//r/AAAFAAoAAADp//v/AAAFAAoAAADp//z/AAAAAAAAAADp//3/AAAAAAAAAADp//7/AAAFAAkAAADp////AAAHAAoAAADp/wAAAAABAAMAAADp/wEAAAABAAQAAADp/wIAAAABAAQAAADp/wMAAAABAAQAAADp/wQAAAABAAQAAADp/wUAAAABAAYAAADp/wYAAAAAAAQAAADp/wcAAAAAAAUAAADp/wgAAAAFAAoAAADp/wkAAAAAAAAAAADp/woAAAAHAAkAAADp/wsAAAAFAAoAAADp/wwAAAAFAAoAAADp/w0AAAAFAAoAAADp/w4AAAAAAAAAAADp/w8AAAAIAAoAAADp/xAAAAAHAAoAAADp/xEAAAAFAAoAAADp/xIAAAAIAAkAAADp/xMAAAAFAAoAAADp/xQAAAAFAAkAAADp/xUAAAAFAAoAAADp/xYAAAAIAAoAAADp/xcAAAAHAAoAAADp/xgAAAAAAAAAAADp/xkAAAAFAAoAAADp/xoAAAAFAAkAAADp/xsAAAAAAAAAAADp/xwAAAAHAAkAAADp/x0AAAAFAAoAAADp/x4AAAAHAAkAAADp/x8AAAAIAAoAAADp/yAAAAAIAAkAAADp/yEAAAAAAAAAAADp/yIAAAAIAAkAAADp/yMAAAAIAAkAAADp/yQAAAAFAAoAAADp/yUAAAAAAAAAAADp/yYAAAAFAAkAAADp/ycAAAAIAAoAAADp/ygAAAAFAAoAAADp/ykAAAACAAMAAADp/yoAAAAAAAcAAADp/ysAAAABAAQAAADp/ywAAAABAAQAAADp/y0AAAABAAQAAADp/y4AAAABAAUAAADp/y8AAAAIAAoAAADp/zAAAAAFAAkAAADp/zEAAAAHAAkAAADp/zIAAAAFAAoAAADp/zMAAAAAAAAAAADq//D/AAABAAsAAADq//H/AAAFAAoAAADq//L/AAAIAAoAAADq//P/AAAAAAAAAADq//T/AAAIAAoAAADq//X/AAAHAAoAAADq//b/AAAFAAkAAADq//f/AAAHAAkAAADq//j/AAAAAAAAAADq//n/AAAHAAkAAADq//r/AAAAAAAAAADq//v/AAAFAAkAAADq//z/AAAFAAkAAADq//3/AAAFAAkAAADq//7/AAAFAAoAAADq////AAAIAAkAAADq/wAAAAACAAMAAADq/wEAAAACAAQAAADq/wIAAAACAAQAAADq/wMAAAACAAQAAADq/wQAAAAAAAcAAADq/wUAAAABAAQAAADq/wYAAAABAAQAAADq/wcAAAABAAYAAADq/wgAAAAAAAUAAADq/wkAAAAIAAoAAADq/woAAAAAAAAAAADq/wsAAAAIAAoAAADq/wwAAAAHAAoAAADq/w0AAAAIAAkAAADq/w4AAAAFAAoAAADq/w8AAAAIAAkAAADq/xAAAAAHAAoAAADq/xEAAAAHAAkAAADq/xIAAAAFAAkAAADq/xMAAAAHAAoAAADq/xQAAAAHAAoAAADq/xUAAAAFAAoAAADq/xYAAAAHAAoAAADq/xcAAAAIAAkAAADq/xgAAAAAAAAAAADq/xkAAAAHAAkAAADq/xoAAAAHAAkAAADq/xsAAAAHAAoAAADq/xwAAAAAAAAAAADq/x0AAAAHAAkAAADq/x4AAAAFAAoAAADq/x8AAAAIAAkAAADq/yAAAAAAAAAAAADq/yEAAAAAAAAAAADq/yIAAAAFAAoAAADq/yMAAAAIAAkAAADq/yQAAAAIAAkAAADq/yUAAAAIAAoAAADq/yYAAAAFAAkAAADq/ycAAAAIAAkAAADq/ygAAAAHAAoAAADq/ykAAAAFAAoAAADq/yoAAAACAAMAAADq/ysAAAAAAAcAAADq/ywAAAABAAQAAADq/y0AAAABAAQAAADq/y4AAAABAAYAAADq/y8AAAAAAAUAAADq/zAAAAAIAAoAAADq/zEAAAAHAAkAAADq/zIAAAAFAAkAAADq/zMAAAAAAAAAAADr//D/AAABAAsAAADr//H/AAAAAAAAAADr//L/AAAIAAkAAADr//P/AAAIAAkAAADr//T/AAAHAAoAAADr//X/AAAFAAkAAADr//b/AAAHAAkAAADr//f/AAAIAAoAAADr//j/AAAIAAkAAADr//n/AAAFAAoAAADr//r/AAAIAAkAAADr//v/AAAIAAoAAADr//z/AAAIAAoAAADr//3/AAAFAAkAAADr//7/AAAFAAkAAADr////AAAAAAAAAADr/wAAAAAHAAkAAADr/wEAAAAFAAoAAADr/wIAAAAIAAoAAADr/wMAAAAFAAoAAADr/wQAAAACAAMAAADr/wUAAAAAAAcAAADr/wYAAAABAAQAAADr/wcAAAABAAQAAADr/wgAAAABAAYAAADr/wkAAAAAAAUAAADr/woAAAAIAAoAAADr/wsAAAAIAAoAAADr/wwAAAAIAAkAAADr/w0AAAAFAAoAAADr/w4AAAAFAAoAAADr/w8AAAAIAAkAAADr/xAAAAAFAAkAAADr/xEAAAAFAAkAAADr/xIAAAAIAAoAAADr/xMAAAAFAAkAAADr/xQAAAAHAAoAAADr/xUAAAAHAAoAAADr/xYAAAAIAAkAAADr/xcAAAAIAAkAAADr/xgAAAAHAAoAAADr/xkAAAAIAAoAAADr/xoAAAAFAAoAAADr/xsAAAAIAAoAAADr/xwAAAAHAAkAAADr/x0AAAAAAAAAAADr/x4AAAAFAAoAAADr/x8AAAAAAAAAAADr/yAAAAAAAAAAAADr/yEAAAAHAAkAAADr/yIAAAAFAAkAAADr/yMAAAAAAAAAAADr/yQAAAAIAAkAAADr/yUAAAAIAAkAAADr/yYAAAAFAAkAAADr/ycAAAAAAAAAAADr/ygAAAAFAAkAAADr/ykAAAAHAAoAAADr/yoAAAAIAAoAAADr/ysAAAACAAMAAADr/ywAAAAAAAcAAADr/y0AAAABAAQAAADr/y4AAAABAAQAAADr/y8AAAABAAUAAADr/zAAAAAHAAoAAADr/zEAAAAFAAoAAADr/zIAAAAFAAoAAADr/zMAAAAAAAAAAADs//D/AAABAAsAAADs//H/AAAFAAkAAADs//L/AAAAAAAAAADs//P/AAAIAAkAAADs//T/AAAIAAoAAADs//X/AAAHAAoAAADs//b/AAAHAAoAAADs//f/AAAIAAoAAADs//j/AAAFAAkAAADs//n/AAAIAAoAAADs//r/AAAAAAAAAADs//v/AAAAAAAAAADs//z/AAAIAAkAAADs//3/AAAIAAkAAADs//7/AAAFAAkAAADs////AAAFAAkAAADs/wAAAAAFAAoAAADs/wEAAAAIAAoAAADs/wIAAAAIAAkAAADs/wMAAAAFAAoAAADs/wQAAAAIAAoAAADs/wUAAAACAAMAAADs/wYAAAAAAAcAAADs/wcAAAABAAQAAADs/wgAAAABAAQAAADs/wkAAAABAAYAAADs/woAAAAAAAUAAADs/wsAAAAFAAoAAADs/wwAAAAIAAoAAADs/w0AAAAIAAkAAADs/w4AAAAIAAoAAADs/w8AAAAHAAoAAADs/xAAAAAIAAoAAADs/xEAAAAHAAkAAADs/xIAAAAAAAAAAADs/xMAAAAHAAoAAADs/xQAAAAHAAkAAADs/xUAAAAHAAkAAADs/xYAAAAIAAkAAADs/xcAAAAAAAAAAADs/xgAAAAFAAoAAADs/xkAAAAHAAoAAADs/xoAAAAHAAkAAADs/xsAAAAHAAkAAADs/xwAAAAFAAoAAADs/x0AAAAHAAkAAADs/x4AAAAHAAoAAADs/x8AAAAHAAoAAADs/yAAAAAHAAkAAADs/yEAAAAIAAoAAADs/yIAAAAIAAoAAADs/yMAAAAFAAoAAADs/yQAAAAHAAkAAADs/yUAAAAHAAoAAADs/yYAAAAHAAkAAADs/ycAAAAIAAkAAADs/ygAAAAAAAAAAADs/ykAAAAIAAkAAADs/yoAAAAHAAoAAADs/ysAAAAHAAoAAADs/ywAAAABAAMAAADs/y0AAAABAAQAAADs/y4AAAABAAQAAADs/y8AAAABAAYAAADs/zAAAAAAAAUAAADs/zEAAAAIAAkAAADs/zIAAAAHAAkAAADs/zMAAAAIAAoAAADt//D/AAABAAsAAADt//H/AAAIAAoAAADt//L/AAAIAAoAAADt//P/AAAHAAoAAADt//T/AAAAAAAAAADt//X/AAAAAAAAAADt//b/AAAAAAAAAADt//f/AAAIAAkAAADt//j/AAAIAAkAAADt//n/AAAIAAkAAADt//r/AAAAAAAAAADt//v/AAAHAAoAAADt//z/AAAAAAAAAADt//3/AAAFAAkAAADt//7/AAAFAAkAAADt////AAAIAAoAAADt/wAAAAAFAAoAAADt/wEAAAAIAAoAAADt/wIAAAAIAAoAAADt/wMAAAAFAAoAAADt/wQAAAAIAAoAAADt/wUAAAAFAAoAAADt/wYAAAACAAMAAADt/wcAAAAAAAcAAADt/wgAAAABAAQAAADt/wkAAAABAAQAAADt/woAAAABAAYAAADt/wsAAAAAAAUAAADt/wwAAAAIAAoAAADt/w0AAAAIAAkAAADt/w4AAAAFAAoAAADt/w8AAAAIAAoAAADt/xAAAAAAAAAAAADt/xEAAAAHAAoAAADt/xIAAAAHAAkAAADt/xMAAAAFAAoAAADt/xQAAAAAAAAAAADt/xUAAAAFAAoAAADt/xYAAAAHAAoAAADt/xcAAAAAAAAAAADt/xgAAAAIAAoAAADt/xkAAAAIAAkAAADt/xoAAAAIAAoAAADt/xsAAAAHAAkAAADt/xwAAAAHAAkAAADt/x0AAAAHAAoAAADt/x4AAAAFAAoAAADt/x8AAAAAAAAAAADt/yAAAAAFAAoAAADt/yEAAAAHAAkAAADt/yIAAAAAAAAAAADt/yMAAAAIAAkAAADt/yQAAAAIAAoAAADt/yUAAAAFAAoAAADt/yYAAAAFAAoAAADt/ycAAAAFAAkAAADt/ygAAAAFAAoAAADt/ykAAAAFAAkAAADt/yoAAAAHAAkAAADt/ysAAAAIAAoAAADt/ywAAAABAAMAAADt/y0AAAABAAQAAADt/y4AAAABAAQAAADt/y8AAAABAAQAAADt/zAAAAABAAUAAADt/zEAAAAHAAoAAADt/zIAAAAIAAkAAADt/zMAAAAHAAoAAADu//D/AAABAAsAAADu//H/AAAIAAoAAADu//L/AAAIAAoAAADu//P/AAAFAAoAAADu//T/AAAHAAoAAADu//X/AAAIAAkAAADu//b/AAAIAAoAAADu//f/AAAFAAoAAADu//j/AAAFAAkAAADu//n/AAAHAAoAAADu//r/AAAFAAkAAADu//v/AAAHAAkAAADu//z/AAAIAAoAAADu//3/AAACAAYAAADu//7/AAACAAcAAADu////AAACAAcAAADu/wAAAAACAAgAAADu/wEAAAAAAAAAAADu/wIAAAAFAAkAAADu/wMAAAAIAAkAAADu/wQAAAAFAAkAAADu/wUAAAAFAAoAAADu/wYAAAAIAAoAAADu/wcAAAACAAMAAADu/wgAAAAAAAcAAADu/wkAAAABAAQAAADu/woAAAABAAQAAADu/wsAAAABAAUAAADu/wwAAAAFAAkAAADu/w0AAAAFAAkAAADu/w4AAAAIAAoAAADu/w8AAAAIAAoAAADu/xAAAAAHAAkAAADu/xEAAAAAAAAAAADu/xIAAAAAAAAAAADu/xMAAAAAAAAAAADu/xQAAAAFAAkAAADu/xUAAAAHAAkAAADu/xYAAAAHAAkAAADu/xcAAAAFAAkAAADu/xgAAAAIAAoAAADu/xkAAAAIAAoAAADu/xoAAAAFAAoAAADu/xsAAAAIAAkAAADu/xwAAAAHAAkAAADu/x0AAAAHAAkAAADu/x4AAAAFAAoAAADu/x8AAAAFAAkAAADu/yAAAAAFAAoAAADu/yEAAAAIAAoAAADu/yIAAAAAAAAAAADu/yMAAAAFAAoAAADu/yQAAAAFAAoAAADu/yUAAAAFAAoAAADu/yYAAAAFAAkAAADu/ycAAAAAAAAAAADu/ygAAAAHAAkAAADu/ykAAAAHAAoAAADu/yoAAAAIAAkAAADu/ysAAAAIAAkAAADu/ywAAAACAAMAAADu/y0AAAAAAAcAAADu/y4AAAABAAQAAADu/y8AAAABAAQAAADu/zAAAAABAAUAAADu/zEAAAAAAAAAAADu/zIAAAAAAAAAAADu/zMAAAAFAAoAAADv//D/AAABAAsAAADv//H/AAAFAAoAAADv//L/AAAHAAkAAADv//P/AAAIAAkAAADv//T/AAAIAAkAAADv//X/AAAAAAAAAADv//b/AAAFAAkAAADv//f/AAAHAAoAAADv//j/AAAFAAoAAADv//n/AAAIAAoAAADv//r/AAAAAAAAAADv//v/AAAFAAkAAADv//z/AAACAAYAAADv//3/AAADAAoAAADv//7/AAADAAcAAADv////AAAAAAEAAADv/wAAAAADAAkAAADv/wEAAAACAAgAAADv/wIAAAAIAAoAAADv/wMAAAAHAAkAAADv/wQAAAAFAAkAAADv/wUAAAAHAAoAAADv/wYAAAAFAAkAAADv/wcAAAAHAAoAAADv/wgAAAACAAMAAADv/wkAAAAAAAcAAADv/woAAAABAAQAAADv/wsAAAABAAYAAADv/wwAAAAAAAUAAADv/w0AAAAIAAkAAADv/w4AAAAFAAkAAADv/w8AAAAFAAoAAADv/xAAAAAFAAoAAADv/xEAAAAIAAoAAADv/xIAAAAAAAAAAADv/xMAAAAAAAAAAADv/xQAAAAFAAkAAADv/xUAAAAHAAoAAADv/xYAAAAHAAoAAADv/xcAAAAHAAkAAADv/xgAAAAHAAoAAADv/xkAAAAHAAoAAADv/xoAAAAFAAkAAADv/xsAAAAAAAAAAADv/xwAAAAFAAkAAADv/x0AAAAIAAkAAADv/x4AAAAHAAoAAADv/x8AAAAHAAoAAADv/yAAAAAIAAkAAADv/yEAAAAFAAkAAADv/yIAAAAAAAAAAADv/yMAAAAFAAoAAADv/yQAAAAAAAAAAADv/yUAAAAHAAoAAADv/yYAAAAIAAkAAADv/ycAAAAIAAoAAADv/ygAAAAHAAkAAADv/ykAAAAIAAkAAADv/yoAAAAFAAoAAADv/ysAAAAFAAoAAADv/ywAAAAAAAMAAADv/y0AAAABAAcAAADv/y4AAAABAAQAAADv/y8AAAABAAQAAADv/zAAAAABAAUAAADv/zEAAAAHAAoAAADv/zIAAAAIAAoAAADv/zMAAAAHAAoAAADw//D/AAABAAsAAADw//H/AAAIAAoAAADw//L/AAAHAAoAAADw//P/AAAHAAoAAADw//T/AAAHAAoAAADw//X/AAAIAAoAAADw//b/AAAHAAkAAADw//f/AAAFAAkAAADw//j/AAAAAAAAAADw//n/AAAHAAkAAADw//r/AAAIAAkAAADw//v/AAAIAAkAAADw//z/AAADAAYAAADw//3/AAAAAAEAAADw//7/AAADAAcAAADw////AAADAAcAAADw/wAAAAADAAcAAADw/wEAAAADAAkAAADw/wIAAAACAAgAAADw/wMAAAAHAAoAAADw/wQAAAAAAAAAAADw/wUAAAAHAAoAAADw/wYAAAAFAAkAAADw/wcAAAAHAAkAAADw/wgAAAAHAAkAAADw/wkAAAABAAMAAADw/woAAAABAAQAAADw/wsAAAABAAQAAADw/wwAAAABAAYAAADw/w0AAAAAAAQAAADw/w4AAAAAAAUAAADw/w8AAAAAAAAAAADw/xAAAAAFAAoAAADw/xEAAAAAAAAAAADw/xIAAAAAAAAAAADw/xMAAAAHAAoAAADw/xQAAAAFAAoAAADw/xUAAAAHAAkAAADw/xYAAAAFAAoAAADw/xcAAAAAAAAAAADw/xgAAAAIAAkAAADw/xkAAAAHAAkAAADw/xoAAAAAAAAAAADw/xsAAAAHAAoAAADw/xwAAAAAAAAAAADw/x0AAAAFAAkAAADw/x4AAAAIAAkAAADw/x8AAAAHAAoAAADw/yAAAAAIAAoAAADw/yEAAAAAAAAAAADw/yIAAAAFAAoAAADw/yMAAAAAAAAAAADw/yQAAAAHAAkAAADw/yUAAAAIAAkAAADw/yYAAAAFAAoAAADw/ycAAAAIAAoAAADw/ygAAAAIAAoAAADw/ykAAAAIAAkAAADw/yoAAAAHAAkAAADw/ysAAAAIAAkAAADw/ywAAAABAAMAAADw/y0AAAABAAQAAADw/y4AAAABAAQAAADw/y8AAAABAAQAAADw/zAAAAABAAUAAADw/zEAAAAIAAoAAADw/zIAAAAAAAAAAADw/zMAAAAIAAoAAADx//D/AAABAAsAAADx//H/AAAHAAkAAADx//L/AAAFAAkAAADx//P/AAAHAAoAAADx//T/AAAHAAkAAADx//X/AAAHAAkAAADx//b/AAAAAAAAAADx/wIAAAADAAgAAADx/wMAAAAIAAoAAADx/wQAAAAHAAoAAADx/wUAAAAHAAoAAADx/wYAAAAHAAkAAADx/wcAAAAHAAkAAADx/wgAAAAFAAkAAADx/wkAAAABAAMAAADx/woAAAABAAQAAADx/wsAAAABAAQAAADx/wwAAAABAAQAAADx/w0AAAABAAQAAADx/w4AAAABAAYAAADx/w8AAAAAAAQAAADx/xAAAAAAAAQAAADx/xEAAAAAAAUAAADx/xIAAAAIAAkAAADx/xMAAAAFAAkAAADx/xQAAAAIAAoAAADx/xUAAAAFAAkAAADx/xYAAAAIAAoAAADx/xcAAAAIAAkAAADx/xgAAAAAAAAAAADx/xkAAAAAAAAAAADx/xoAAAAAAAAAAADx/xsAAAAHAAkAAADx/xwAAAAIAAkAAADx/x0AAAAIAAkAAADx/x4AAAAIAAoAAADx/x8AAAAHAAkAAADx/yAAAAAIAAkAAADx/yEAAAAAAAAAAADx/yIAAAAIAAoAAADx/yMAAAAHAAoAAADx/yQAAAAIAAkAAADx/yUAAAAHAAoAAADx/yYAAAAIAAoAAADx/ycAAAAFAAkAAADx/ygAAAAHAAoAAADx/ykAAAAAAAAAAADx/yoAAAAFAAkAAADx/ysAAAAIAAoAAADx/ywAAAABAAMAAADx/y0AAAABAAQAAADx/y4AAAABAAQAAADx/y8AAAABAAQAAADx/zAAAAABAAUAAADx/zEAAAAIAAkAAADx/zIAAAAHAAoAAADx/zMAAAAAAAAAAADy//D/AAABAAsAAADy//H/AAAFAAoAAADy//L/AAAFAAkAAADy//P/AAAIAAkAAADy//T/AAAFAAoAAADy//X/AAAHAAkAAADy//b/AAAIAAkAAADy/wIAAAAEAAgAAADy/wMAAAAFAAoAAADy/wQAAAAIAAoAAADy/wUAAAAHAAoAAADy/wYAAAAHAAkAAADy/wcAAAAHAAoAAADy/wgAAAAAAAMAAADy/wkAAAABAAcAAADy/woAAAABAAQAAADy/wsAAAABAAQAAADy/wwAAAABAAQAAADy/w0AAAABAAQAAADy/w4AAAABAAQAAADy/w8AAAABAAQAAADy/xAAAAABAAQAAADy/xEAAAABAAYAAADy/xIAAAAAAAQAAADy/xMAAAAAAAQAAADy/xQAAAAAAAUAAADy/xUAAAAHAAkAAADy/xYAAAAHAAkAAADy/xcAAAAIAAkAAADy/xgAAAAIAAkAAADy/xkAAAAHAAkAAADy/xoAAAAIAAoAAADy/xsAAAAAAAAAAADy/xwAAAAFAAkAAADy/x0AAAAFAAkAAADy/x4AAAAAAAAAAADy/x8AAAAFAAoAAADy/yAAAAAFAAoAAADy/yEAAAAAAAAAAADy/yIAAAAFAAoAAADy/yMAAAAAAAAAAADy/yQAAAAIAAkAAADy/yUAAAAHAAoAAADy/yYAAAAAAAAAAADy/ycAAAAHAAkAAADy/ygAAAAIAAoAAADy/ykAAAAFAAkAAADy/yoAAAAIAAoAAADy/ysAAAAAAAAAAADy/ywAAAABAAMAAADy/y0AAAABAAQAAADy/y4AAAABAAQAAADy/y8AAAABAAQAAADy/zAAAAABAAUAAADy/zEAAAAIAAkAAADy/zIAAAAFAAoAAADy/zMAAAAIAAoAAADz//D/AAABAAsAAADz//H/AAAIAAoAAADz//L/AAAHAAoAAADz//P/AAAFAAkAAADz//T/AAAFAAoAAADz//X/AAAFAAoAAADz//b/AAAHAAoAAADz/wIAAAAAAAAAAADz/wMAAAAHAAoAAADz/wQAAAAIAAkAAADz/wUAAAAHAAkAAADz/wYAAAAIAAkAAADz/wcAAAAIAAkAAADz/wgAAAABAAMAAADz/wkAAAABAAQAAADz/woAAAABAAQAAADz/wsAAAAAAAYAAADz/wwAAAACAAQAAADz/w0AAAAAAAcAAADz/w4AAAABAAQAAADz/w8AAAABAAQAAADz/xAAAAABAAQAAADz/xEAAAABAAQAAADz/xIAAAABAAQAAADz/xMAAAABAAQAAADz/xQAAAABAAYAAADz/xUAAAAAAAQAAADz/xYAAAAAAAUAAADz/xcAAAAAAAAAAADz/xgAAAAHAAoAAADz/xkAAAAAAAAAAADz/xoAAAAFAAkAAADz/xsAAAAFAAkAAADz/xwAAAAHAAkAAADz/x0AAAAAAAAAAADz/x4AAAAFAAoAAADz/x8AAAAFAAkAAADz/yAAAAAIAAkAAADz/yEAAAAIAAkAAADz/yIAAAAAAAAAAADz/yMAAAAFAAoAAADz/yQAAAAFAAoAAADz/yUAAAAIAAkAAADz/yYAAAAIAAoAAADz/ycAAAAIAAkAAADz/ygAAAAIAAkAAADz/ykAAAAHAAoAAADz/yoAAAAIAAkAAADz/ysAAAAAAAMAAADz/ywAAAABAAcAAADz/y0AAAABAAQAAADz/y4AAAABAAQAAADz/y8AAAABAAQAAADz/zAAAAABAAUAAADz/zEAAAAHAAoAAADz/zIAAAAIAAkAAADz/zMAAAAHAAoAAAD0//D/AAABAAsAAAD0//H/AAAFAAoAAAD0//L/AAAFAAkAAAD0//P/AAAFAAkAAAD0//T/AAAAAAAAAAD0//X/AAAFAAkAAAD0//b/AAAHAAoAAAD0/wIAAAAFAAkAAAD0/wMAAAAHAAoAAAD0/wQAAAANABwAAAD0/wUAAAAHAAkAAAD0/wYAAAAFAAkAAAD0/wcAAAAAAAMAAAD0/wgAAAABAAcAAAD0/wkAAAABAAQAAAD0/woAAAAAAAYAAAD0/wsAAAACAAUAAAD0/wwAAAAHAAkAAAD0/w0AAAACAAMAAAD0/w4AAAACAAQAAAD0/w8AAAAAAAcAAAD0/xAAAAABAAQAAAD0/xEAAAABAAQAAAD0/xIAAAABAAQAAAD0/xMAAAABAAQAAAD0/xQAAAABAAQAAAD0/xUAAAABAAQAAAD0/xYAAAABAAYAAAD0/xcAAAAAAAQAAAD0/xgAAAAAAAUAAAD0/xkAAAAHAAkAAAD0/xoAAAAAAAAAAAD0/xsAAAAIAAkAAAD0/xwAAAAFAAoAAAD0/x0AAAAIAAoAAAD0/x4AAAAHAAkAAAD0/x8AAAAIAAkAAAD0/yAAAAAIAAkAAAD0/yEAAAAHAAoAAAD0/yIAAAAFAAkAAAD0/yMAAAAIAAkAAAD0/yQAAAAAAAAAAAD0/yUAAAAIAAoAAAD0/yYAAAAAAAAAAAD0/ycAAAAFAAkAAAD0/ygAAAAIAAoAAAD0/ykAAAAHAAkAAAD0/yoAAAAHAAoAAAD0/ysAAAABAAMAAAD0/ywAAAABAAQAAAD0/y0AAAABAAQAAAD0/y4AAAABAAQAAAD0/y8AAAAAAAYAAAD0/zAAAAACAAUAAAD0/zEAAAAFAAkAAAD0/zIAAAAIAAoAAAD0/zMAAAAIAAoAAAD1//D/AAABAAsAAAD1//H/AAAFAAkAAAD1//L/AAAIAAkAAAD1//P/AAAFAAkAAAD1//T/AAAHAAkAAAD1//X/AAAAAAAAAAD1//b/AAAHAAkAAAD1/wIAAAAFAAoAAAD1/wMAAAAHAAoAAAD1/wQAAAAFAAkAAAD1/wUAAAAIAAkAAAD1/wYAAAAAAAMAAAD1/wcAAAABAAcAAAD1/wgAAAABAAQAAAD1/wkAAAABAAQAAAD1/woAAAABAAUAAAD1/wsAAAAAAAAAAAD1/wwAAAAIAAoAAAD1/w0AAAAIAAoAAAD1/w4AAAAIAAoAAAD1/w8AAAACAAMAAAD1/xAAAAAAAAcAAAD1/xEAAAABAAQAAAD1/xIAAAABAAQAAAD1/xMAAAABAAQAAAD1/xQAAAABAAQAAAD1/xUAAAABAAQAAAD1/xYAAAABAAQAAAD1/xcAAAABAAQAAAD1/xgAAAABAAYAAAD1/xkAAAAAAAQAAAD1/xoAAAAAAAUAAAD1/xsAAAAFAAkAAAD1/xwAAAAFAAoAAAD1/x0AAAAFAAkAAAD1/x4AAAAIAAkAAAD1/x8AAAAAAAAAAAD1/yAAAAAHAAoAAAD1/yEAAAAAAAAAAAD1/yIAAAAIAAoAAAD1/yMAAAAIAAkAAAD1/yQAAAAFAAoAAAD1/yUAAAAFAAkAAAD1/yYAAAAHAAoAAAD1/ycAAAAAAAAAAAD1/ygAAAAIAAkAAAD1/ykAAAAFAAkAAAD1/yoAAAAAAAMAAAD1/ysAAAABAAcAAAD1/ywAAAABAAQAAAD1/y0AAAABAAQAAAD1/y4AAAAAAAYAAAD1/y8AAAACAAUAAAD1/zAAAAAAAAAAAAD1/zEAAAAHAAoAAAD1/zIAAAAFAAoAAAD1/zMAAAAHAAoAAAD2//D/AAABAAsAAAD2//H/AAAAAAAAAAD2//L/AAAHAAoAAAD2//P/AAAAAAAAAAD2//T/AAAAAAAAAAD2//X/AAAHAAoAAAD2//b/AAAAAAAAAAD2/wIAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wQAAAAAAAMAAAD2/wUAAAAAAAQAAAD2/wYAAAABAAcAAAD2/wcAAAABAAQAAAD2/wgAAAABAAQAAAD2/wkAAAAAAAYAAAD2/woAAAACAAUAAAD2/wsAAAAAAAAAAAD2/wwAAAAIAAkAAAD2/w0AAAAFAAoAAAD2/w4AAAAFAAoAAAD2/w8AAAAFAAoAAAD2/xAAAAACAAMAAAD2/xEAAAACAAQAAAD2/xIAAAACAAQAAAD2/xMAAAACAAQAAAD2/xQAAAAAAAcAAAD2/xUAAAABAAQAAAD2/xYAAAABAAQAAAD2/xcAAAABAAQAAAD2/xgAAAABAAQAAAD2/xkAAAABAAQAAAD2/xoAAAABAAYAAAD2/xsAAAAAAAUAAAD2/xwAAAAFAAkAAAD2/x0AAAAFAAkAAAD2/x4AAAAHAAkAAAD2/x8AAAAFAAkAAAD2/yAAAAAFAAkAAAD2/yEAAAAFAAkAAAD2/yIAAAAIAAkAAAD2/yMAAAAFAAkAAAD2/yQAAAAFAAkAAAD2/yUAAAAFAAkAAAD2/yYAAAAAAAAAAAD2/ycAAAAIAAkAAAD2/ygAAAAHAAoAAAD2/ykAAAAAAAMAAAD2/yoAAAABAAcAAAD2/ysAAAABAAQAAAD2/ywAAAABAAQAAAD2/y0AAAAAAAYAAAD2/y4AAAACAAUAAAD2/y8AAAAFAAoAAAD2/zAAAAAFAAkAAAD2/zEAAAAFAAoAAAD2/zIAAAAFAAkAAAD2/zMAAAAHAAkAAAD3//D/AAABAAsAAAD3//H/AAAFAAoAAAD3//L/AAAFAAkAAAD3//P/AAAFAAkAAAD3//T/AAAIAAoAAAD3//X/AAAIAAoAAAD3//b/AAAIAAkAAAD3/wIAAAAAAAMAAAD3/wMAAAAAAAQAAAD3/wQAAAABAAcAAAD3/wUAAAABAAQAAAD3/wYAAAABAAQAAAD3/wcAAAABAAQAAAD3/wgAAAAAAAYAAAD3/wkAAAACAAUAAAD3/woAAAAHAAkAAAD3/wsAAAAIAAkAAAD3/wwAAAAIAAkAAAD3/w0AAAAIAAkAAAD3/w4AAAAHAAkAAAD3/w8AAAAHAAoAAAD3/xAAAAAIAAkAAAD3/xEAAAAIAAkAAAD3/xIAAAAAAAAAAAD3/xMAAAAHAAoAAAD3/xQAAAACAAMAAAD3/xUAAAACAAQAAAD3/xYAAAAAAAcAAAD3/xcAAAABAAQAAAD3/xgAAAABAAQAAAD3/xkAAAABAAQAAAD3/xoAAAABAAQAAAD3/xsAAAABAAYAAAD3/xwAAAAAAAUAAAD3/x0AAAAHAAoAAAD3/x4AAAAHAAkAAAD3/x8AAAAHAAoAAAD3/yAAAAAFAAoAAAD3/yEAAAAFAAoAAAD3/yIAAAAIAAkAAAD3/yMAAAAHAAkAAAD3/yQAAAAFAAkAAAD3/yUAAAAFAAkAAAD3/yYAAAAHAAoAAAD3/ycAAAAHAAkAAAD3/ygAAAAHAAoAAAD3/ykAAAABAAMAAAD3/yoAAAABAAQAAAD3/ysAAAABAAQAAAD3/ywAAAABAAQAAAD3/y0AAAABAAUAAAD3/y4AAAAHAAkAAAD3/y8AAAAFAAkAAAD3/zAAAAAHAAoAAAD3/zEAAAAIAAoAAAD3/zIAAAAIAAkAAAD3/zMAAAAAAAAAAAD4//D/AAABAAsAAAD4//H/AAAIAAoAAAD4//L/AAAIAAkAAAD4//P/AAAFAAkAAAD4//T/AAAFAAoAAAD4//X/AAAFAAkAAAD4//b/AAAHAAoAAAD4/wIAAAABAAcAAAD4/wMAAAABAAQAAAD4/wQAAAABAAQAAAD4/wUAAAAAAAYAAAD4/wYAAAACAAQAAAD4/wcAAAACAAQAAAD4/wgAAAACAAUAAAD4/wkAAAAHAAoAAAD4/woAAAAHAAkAAAD4/wsAAAAHAAoAAAD4/wwAAAAIAAkAAAD4/w0AAAAIAAkAAAD4/w4AAAAHAAkAAAD4/w8AAAAHAAoAAAD4/xAAAAAAAAAAAAD4/xEAAAAHAAkAAAD4/xIAAAAAAAAAAAD4/xMAAAAIAAkAAAD4/xQAAAAAAAAAAAD4/xUAAAAIAAkAAAD4/xYAAAACAAMAAAD4/xcAAAACAAQAAAD4/xgAAAAAAAcAAAD4/xkAAAABAAQAAAD4/xoAAAABAAQAAAD4/xsAAAABAAQAAAD4/xwAAAABAAYAAAD4/x0AAAAAAAUAAAD4/x4AAAAFAAkAAAD4/x8AAAAFAAkAAAD4/yAAAAAHAAkAAAD4/yEAAAAHAAkAAAD4/yIAAAAIAAkAAAD4/yMAAAAHAAkAAAD4/yQAAAAHAAkAAAD4/yUAAAAFAAkAAAD4/yYAAAAHAAoAAAD4/ycAAAAIAAkAAAD4/ygAAAAAAAMAAAD4/ykAAAABAAcAAAD4/yoAAAABAAQAAAD4/ysAAAABAAQAAAD4/ywAAAABAAQAAAD4/y0AAAABAAUAAAD4/y4AAAAIAAoAAAD4/y8AAAAIAAoAAAD4/zAAAAAHAAkAAAD4/zEAAAAFAAoAAAD4/zIAAAAFAAoAAAD4/zMAAAAAAAAAAAD5//D/AAABAAsAAAD5//H/AAAIAAkAAAD5//L/AAAFAAoAAAD5//P/AAAIAAkAAAD5//T/AAAFAAoAAAD5//X/AAAFAAkAAAD5//b/AAAFAAoAAAD5/wIAAAABAAQAAAD5/wMAAAAAAAYAAAD5/wQAAAACAAQAAAD5/wUAAAACAAUAAAD5/wYAAAAFAAkAAAD5/wcAAAAHAAkAAAD5/wgAAAAFAAkAAAD5/wkAAAAFAAkAAAD5/woAAAAIAAoAAAD5/wsAAAAFAAkAAAD5/wwAAAAFAAoAAAD5/w0AAAAHAAkAAAD5/w4AAAAHAAoAAAD5/w8AAAAAAAAAAAD5/xAAAAAIAAoAAAD5/xEAAAAIAAoAAAD5/xIAAAAHAAkAAAD5/xMAAAAHAAoAAAD5/xQAAAAFAAkAAAD5/xUAAAAHAAoAAAD5/xYAAAAIAAkAAAD5/xcAAAAIAAoAAAD5/xgAAAACAAMAAAD5/xkAAAAAAAcAAAD5/xoAAAABAAQAAAD5/xsAAAABAAQAAAD5/xwAAAABAAQAAAD5/x0AAAABAAYAAAD5/x4AAAAAAAUAAAD5/x8AAAAFAAkAAAD5/yAAAAAFAAkAAAD5/yEAAAAHAAkAAAD5/yIAAAAHAAoAAAD5/yMAAAAHAAkAAAD5/yQAAAAHAAkAAAD5/yUAAAAHAAoAAAD5/yYAAAAAAAAAAAD5/ycAAAAFAAkAAAD5/ygAAAABAAMAAAD5/ykAAAABAAQAAAD5/yoAAAABAAQAAAD5/ysAAAABAAQAAAD5/ywAAAAAAAYAAAD5/y0AAAACAAUAAAD5/y4AAAAHAAkAAAD5/y8AAAAHAAoAAAD5/zAAAAAFAAkAAAD5/zEAAAAAAAAAAAD5/zIAAAAFAAkAAAD5/zMAAAAHAAkAAAD6//D/AAABAAsAAAD6//H/AAAHAAoAAAD6//L/AAAIAAoAAAD6//P/AAAFAAkAAAD6//T/AAAHAAkAAAD6//X/AAAIAAoAAAD6//b/AAAIAAkAAAD6/wIAAAABAAQAAAD6/wMAAAABAAUAAAD6/wQAAAAIAAoAAAD6/wUAAAAIAAoAAAD6/wYAAAAFAAkAAAD6/wcAAAAIAAoAAAD6/wgAAAAHAAkAAAD6/wkAAAAFAAoAAAD6/woAAAAHAAoAAAD6/wsAAAAHAAkAAAD6/wwAAAAIAAoAAAD6/w0AAAAHAAoAAAD6/w4AAAAFAAoAAAD6/w8AAAAHAAkAAAD6/xAAAAAHAAoAAAD6/xEAAAAFAAkAAAD6/xIAAAAFAAkAAAD6/xMAAAAHAAkAAAD6/xQAAAAIAAkAAAD6/xUAAAAHAAkAAAD6/xYAAAAIAAoAAAD6/xcAAAAHAAkAAAD6/xgAAAAIAAkAAAD6/xkAAAACAAMAAAD6/xoAAAAAAAcAAAD6/xsAAAABAAQAAAD6/xwAAAABAAQAAAD6/x0AAAABAAQAAAD6/x4AAAABAAYAAAD6/x8AAAAAAAUAAAD6/yAAAAAIAAkAAAD6/yEAAAAFAAoAAAD6/yIAAAAIAAkAAAD6/yMAAAAHAAkAAAD6/yQAAAAFAAkAAAD6/yUAAAAFAAkAAAD6/yYAAAAAAAMAAAD6/ycAAAAAAAQAAAD6/ygAAAABAAcAAAD6/ykAAAABAAQAAAD6/yoAAAABAAQAAAD6/ysAAAAAAAYAAAD6/ywAAAACAAUAAAD6/y0AAAAFAAkAAAD6/y4AAAAIAAoAAAD6/y8AAAAHAAkAAAD6/zAAAAAIAAoAAAD6/zEAAAAIAAoAAAD6/zIAAAAIAAoAAAD6/zMAAAAHAAkAAAD7//D/AAABAAsAAAD7//H/AAAIAAkAAAD7//L/AAAFAAoAAAD7//P/AAAFAAkAAAD7//T/AAAFAAoAAAD7//X/AAAFAAkAAAD7//b/AAAIAAoAAAD7/wIAAAABAAQAAAD7/wMAAAABAAUAAAD7/wQAAAAHAAkAAAD7/wUAAAAFAAoAAAD7/wYAAAAIAAoAAAD7/wcAAAAAAAAAAAD7/wgAAAAHAAoAAAD7/wkAAAAIAAkAAAD7/woAAAAIAAkAAAD7/wsAAAAIAAoAAAD7/wwAAAAIAAkAAAD7/w0AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w8AAAAFAAkAAAD7/xAAAAAIAAkAAAD7/xEAAAAFAAoAAAD7/xIAAAAAAAAAAAD7/xMAAAAIAAoAAAD7/xQAAAAAAAAAAAD7/xUAAAAIAAoAAAD7/xYAAAAHAAoAAAD7/xcAAAAAAAAAAAD7/xgAAAAIAAkAAAD7/xkAAAAFAAkAAAD7/xoAAAACAAMAAAD7/xsAAAAAAAcAAAD7/xwAAAABAAQAAAD7/x0AAAABAAQAAAD7/x4AAAABAAQAAAD7/x8AAAABAAUAAAD7/yAAAAAFAAoAAAD7/yEAAAAFAAkAAAD7/yIAAAAIAAoAAAD7/yMAAAAFAAoAAAD7/yQAAAAHAAkAAAD7/yUAAAAAAAMAAAD7/yYAAAABAAcAAAD7/ycAAAABAAQAAAD7/ygAAAABAAQAAAD7/ykAAAABAAQAAAD7/yoAAAAAAAYAAAD7/ysAAAACAAUAAAD7/ywAAAAIAAkAAAD7/y0AAAAIAAkAAAD7/y4AAAAHAAoAAAD7/y8AAAAIAAoAAAD7/zAAAAAFAAoAAAD7/zEAAAAHAAkAAAD7/zIAAAAHAAkAAAD7/zMAAAAHAAoAAAD8//D/AAABAAsAAAD8//H/AAAHAAoAAAD8//L/AAAHAAoAAAD8//P/AAAFAAkAAAD8//T/AAAFAAkAAAD8//X/AAAIAAkAAAD8//b/AAAAAAAAAAD8/wIAAAAAAAYAAAD8/wMAAAACAAUAAAD8/wQAAAANABwAAAD8/wUAAAAFAAkAAAD8/wYAAAAFAAkAAAD8/wcAAAAIAAoAAAD8/wgAAAAHAAoAAAD8/wkAAAAHAAoAAAD8/woAAAAAAAAAAAD8/wsAAAAHAAkAAAD8/wwAAAAAAAAAAAD8/w0AAAAIAAkAAAD8/w4AAAAHAAkAAAD8/w8AAAAAAAAAAAD8/xAAAAAFAAkAAAD8/xEAAAAFAAkAAAD8/xIAAAAFAAoAAAD8/xMAAAAHAAoAAAD8/xQAAAAFAAkAAAD8/xUAAAAFAAkAAAD8/xYAAAAIAAkAAAD8/xcAAAAIAAkAAAD8/xgAAAAIAAoAAAD8/xkAAAAHAAoAAAD8/xoAAAAIAAkAAAD8/xsAAAABAAMAAAD8/xwAAAABAAQAAAD8/x0AAAABAAQAAAD8/x4AAAABAAQAAAD8/x8AAAABAAYAAAD8/yAAAAAAAAUAAAD8/yEAAAAFAAoAAAD8/yIAAAAFAAoAAAD8/yMAAAAFAAkAAAD8/yQAAAAAAAMAAAD8/yUAAAABAAcAAAD8/yYAAAABAAQAAAD8/ycAAAABAAQAAAD8/ygAAAABAAQAAAD8/ykAAAAAAAYAAAD8/yoAAAACAAUAAAD8/ysAAAAHAAkAAAD8/ywAAAAAAAAAAAD8/y0AAAAFAAoAAAD8/y4AAAAAAAAAAAD8/y8AAAAIAAkAAAD8/zAAAAAHAAoAAAD8/zEAAAAIAAkAAAD8/zIAAAAHAAkAAAD8/zMAAAAFAAoAAAD9//D/AAABAAsAAAD9//H/AAAIAAoAAAD9//L/AAAIAAkAAAD9//P/AAAAAAAAAAD9//T/AAAAAAAAAAD9//X/AAAIAAkAAAD9//b/AAAAAAAAAAD9/wIAAAABAAUAAAD9/wMAAAAAAAAAAAD9/wQAAAAHAAoAAAD9/wUAAAAHAAkAAAD9/wYAAAALABwAAAD9/wcAAAAIAAkAAAD9/wgAAAAIAAoAAAD9/wkAAAAIAAoAAAD9/woAAAAIAAoAAAD9/wsAAAAHAAoAAAD9/wwAAAAFAAkAAAD9/w0AAAAFAAoAAAD9/w4AAAAAAAAAAAD9/w8AAAAIAAkAAAD9/xAAAAAIAAoAAAD9/xEAAAAFAAkAAAD9/xIAAAAAAAAAAAD9/xMAAAAFAAkAAAD9/xQAAAAFAAkAAAD9/xUAAAAHAAkAAAD9/xYAAAAFAAoAAAD9/xcAAAAFAAoAAAD9/xgAAAAHAAkAAAD9/xkAAAAFAAoAAAD9/xoAAAAAAAAAAAD9/xsAAAACAAMAAAD9/xwAAAAAAAcAAAD9/x0AAAABAAQAAAD9/x4AAAABAAQAAAD9/x8AAAABAAQAAAD9/yAAAAABAAUAAAD9/yEAAAAHAAoAAAD9/yIAAAAFAAkAAAD9/yMAAAAIAAoAAAD9/yQAAAABAAMAAAD9/yUAAAABAAQAAAD9/yYAAAABAAQAAAD9/ycAAAABAAQAAAD9/ygAAAABAAQAAAD9/ykAAAABAAUAAAD9/yoAAAAIAAoAAAD9/ysAAAAHAAoAAAD9/ywAAAAHAAoAAAD9/y0AAAAHAAkAAAD9/y4AAAAHAAkAAAD9/y8AAAAAAAAAAAD9/zAAAAAIAAoAAAD9/zEAAAAIAAkAAAD9/zIAAAAAAAAAAAD9/zMAAAAFAAkAAAD+//D/AAABAAsAAAD+//H/AAAHAAoAAAD+//L/AAAHAAoAAAD+//P/AAAIAAkAAAD+//T/AAAFAAkAAAD+//X/AAAIAAkAAAD+//b/AAAIAAoAAAD+/wIAAAABAAUAAAD+/wMAAAANABwAAAD+/wQAAAAFAAkAAAD+/wUAAAAIAAkAAAD+/wYAAAAMABwAAAD+/wgAAAAHAAkAAAD+/wkAAAAIAAoAAAD+/woAAAAHAAoAAAD+/wsAAAAHAAkAAAD+/wwAAAAHAAoAAAD+/w0AAAAFAAoAAAD+/w4AAAAIAAoAAAD+/w8AAAAIAAkAAAD+/xAAAAAIAAkAAAD+/xEAAAAHAAkAAAD+/xIAAAAFAAoAAAD+/xMAAAAAAAAAAAD+/xQAAAAFAAoAAAD+/xUAAAAIAAkAAAD+/xYAAAAHAAkAAAD+/xcAAAAHAAkAAAD+/xgAAAAIAAkAAAD+/xkAAAAAAAAAAAD+/xoAAAAHAAkAAAD+/xsAAAAAAAAAAAD+/xwAAAABAAMAAAD+/x0AAAABAAQAAAD+/x4AAAABAAQAAAD+/x8AAAABAAQAAAD+/yAAAAABAAUAAAD+/yEAAAAAAAAAAAD+/yIAAAAFAAkAAAD+/yMAAAAAAAMAAAD+/yQAAAABAAcAAAD+/yUAAAABAAQAAAD+/yYAAAABAAQAAAD+/ycAAAAAAAYAAAD+/ygAAAACAAQAAAD+/ykAAAACAAUAAAD+/yoAAAAHAAoAAAD+/ysAAAAIAAoAAAD+/ywAAAAIAAkAAAD+/y0AAAAHAAkAAAD+/y4AAAAFAAoAAAD+/y8AAAAIAAoAAAD+/zAAAAAHAAkAAAD+/zEAAAAHAAkAAAD+/zIAAAAHAAkAAAD+/zMAAAAFAAoAAAD///D/AAABAAsAAAD///H/AAAFAAkAAAD///L/AAAFAAoAAAD///P/AAAIAAoAAAD///T/AAAAAAAAAAD///X/AAAIAAkAAAD///b/AAAHAAkAAAD//wIAAAABAAUAAAD//wMAAAAIAAoAAAD//wQAAAAIAAkAAAD//wUAAAAFAAoAAAD//wYAAAAHAAoAAAD//wcAAAAIAAoAAAD//wgAAAAFAAkAAAD//wkAAAAHAAoAAAD//woAAAAAAAAAAAD//wsAAAAHAAkAAAD//wwAAAAFAAkAAAD//w0AAAAIAAkAAAD//w4AAAAHAAkAAAD//w8AAAAFAAkAAAD//xAAAAAHAAoAAAD//xEAAAAHAAoAAAD//xIAAAAIAAkAAAD//xMAAAAFAAkAAAD//xQAAAAIAAoAAAD//xUAAAAAAAAAAAD//xYAAAAFAAkAAAD//xcAAAAAAAAAAAD//xgAAAAIAAoAAAD//xkAAAAHAAkAAAD//xoAAAAFAAoAAAD//xsAAAAFAAkAAAD//xwAAAACAAMAAAD//x0AAAACAAQAAAD//x4AAAAAAAcAAAD//x8AAAABAAQAAAD//yAAAAABAAYAAAD//yEAAAAAAAQAAAD//yIAAAAAAAQAAAD//yMAAAABAAcAAAD//yQAAAABAAQAAAD//yUAAAABAAQAAAD//yYAAAAAAAYAAAD//ycAAAACAAUAAAD//ygAAAAFAAkAAAD//ykAAAAAAAAAAAD//yoAAAAHAAoAAAD//ysAAAAAAAAAAAD//ywAAAAHAAkAAAD//y0AAAAFAAoAAAD//y4AAAAFAAoAAAD//y8AAAAIAAoAAAD//zAAAAAIAAkAAAD//zEAAAAIAAkAAAD//zIAAAAIAAkAAAD//zMAAAAHAAoAAAAAAPD/AAABAAsAAAAAAPH/AAAIAAoAAAAAAPL/AAAIAAkAAAAAAPP/AAAHAAoAAAAAAPT/AAAIAAoAAAAAAPX/AAAAAAAAAAAAAPb/AAAIAAoAAAAAAAIAAAABAAUAAAAAAAMAAAAHAAoAAAAAAAQAAAALABwAAAAAAAUAAAAIAAkAAAAAAAYAAAANABwAAAAAAAcAAAAAAAAAAAAAAAgAAAAHAAkAAAAAAAkAAAAAAAAAAAAAAAoAAAAFAAkAAAAAAAsAAAAHAAkAAAAAAAwAAAAIAAoAAAAAAA0AAAAIAAkAAAAAAA4AAAAIAAkAAAAAAA8AAAAFAAoAAAAAABAAAAAHAAkAAAAAABEAAAAIAAkAAAAAABIAAAAHAAoAAAAAABMAAAAFAAoAAAAAABQAAAAAAAAAAAAAABUAAAAHAAkAAAAAABYAAAAAAAAAAAAAABcAAAAFAAkAAAAAABgAAAAIAAkAAAAAABkAAAAIAAoAAAAAABoAAAAIAAkAAAAAABsAAAAFAAoAAAAAABwAAAAIAAoAAAAAAB0AAAAFAAkAAAAAAB4AAAABAAMAAAAAAB8AAAABAAQAAAAAACAAAAABAAQAAAAAACEAAAABAAQAAAAAACIAAAABAAQAAAAAACMAAAABAAQAAAAAACQAAAABAAQAAAAAACUAAAABAAQAAAAAACYAAAABAAUAAAAAACcAAAAFAAoAAAAAACgAAAAFAAoAAAAAACkAAAAIAAoAAAAAACoAAAAFAAkAAAAAACsAAAAIAAkAAAAAACwAAAAFAAkAAAAAAC0AAAAAAAAAAAAAAC4AAAAAAAAAAAAAAC8AAAAIAAkAAAAAADAAAAAHAAkAAAAAADEAAAAIAAoAAAAAADIAAAAAAAAAAAAAADMAAAAFAAkAAAABAPD/AAABAAsAAAABAPH/AAAFAAkAAAABAPL/AAAHAAoAAAABAPP/AAAAAAAAAAABAPT/AAAAAAAAAAABAPX/AAAHAAkAAAABAPb/AAAFAAkAAAABAAIAAAABAAUAAAABAAMAAAAAAAAAAAABAAQAAAAMABwAAAABAAUAAAAAAAAAAAABAAYAAAAFAAoAAAABAAcAAAAHAAoAAAABAAgAAAAAAAAAAAABAAkAAAAHAAoAAAABAAoAAAAIAAoAAAABAAsAAAAIAAkAAAABAAwAAAAIAAkAAAABAA0AAAAIAAoAAAABAA4AAAAHAAkAAAABAA8AAAAIAAoAAAABABAAAAAIAAkAAAABABEAAAAAAAAAAAABABIAAAAFAAkAAAABABMAAAAAAAAAAAABABQAAAAHAAoAAAABABUAAAAFAAkAAAABABYAAAAFAAkAAAABABcAAAAHAAkAAAABABgAAAAAAAAAAAABABkAAAAFAAoAAAABABoAAAAFAAkAAAABABsAAAAIAAoAAAABABwAAAAHAAkAAAABAB0AAAAIAAoAAAABAB4AAAABAAMAAAABAB8AAAABAAQAAAABACAAAAABAAQAAAABACEAAAABAAQAAAABACIAAAABAAQAAAABACMAAAABAAQAAAABACQAAAAAAAYAAAABACUAAAACAAQAAAABACYAAAACAAUAAAABACcAAAAFAAkAAAABACgAAAAIAAkAAAABACkAAAAIAAoAAAABACoAAAAFAAoAAAABACsAAAAFAAkAAAABACwAAAAFAAoAAAABAC0AAAAHAAoAAAABAC4AAAAFAAoAAAABAC8AAAAFAAoAAAABADAAAAAIAAoAAAABADEAAAAIAAkAAAABADIAAAAAAAAAAAABADMAAAAFAAoAAAACAPD/AAABAAsAAAACAPH/AAAAAAAAAAACAPL/AAAFAAkAAAACAPP/AAAIAAoAAAACAPT/AAAFAAoAAAACAPX/AAAFAAoAAAACAPb/AAAFAAkAAAACAAIAAAABAAUAAAACAAMAAAAIAAoAAAACAAQAAAAFAAoAAAACAAUAAAAIAAkAAAACAAYAAAAFAAkAAAACAAcAAAAIAAoAAAACAAgAAAAAAAAAAAACAAkAAAAIAAkAAAACAAoAAAAFAAkAAAACAAsAAAAIAAkAAAACAAwAAAAAAAAAAAACAA0AAAAFAAkAAAACAA4AAAAFAAkAAAACAA8AAAAFAAkAAAACABAAAAAFAAkAAAACABEAAAAIAAoAAAACABIAAAAAAAAAAAACABMAAAAHAAoAAAACABQAAAAAAAAAAAACABUAAAAFAAoAAAACABYAAAAIAAoAAAACABcAAAAHAAoAAAACABgAAAAFAAoAAAACABkAAAAHAAoAAAACABoAAAAFAAkAAAACABsAAAAIAAkAAAACABwAAAAIAAkAAAACAB0AAAAHAAkAAAACAB4AAAACAAMAAAACAB8AAAAAAAcAAAACACAAAAABAAQAAAACACEAAAABAAQAAAACACIAAAABAAQAAAACACMAAAAAAAYAAAACACQAAAACAAUAAAACACUAAAAFAAkAAAACACYAAAAHAAkAAAACACcAAAAAAAAAAAACACgAAAAFAAoAAAACACkAAAAIAAkAAAACACoAAAAFAAoAAAACACsAAAAAAAAAAAACACwAAAAAAAAAAAACAC0AAAAFAAkAAAACAC4AAAAHAAkAAAACAC8AAAAIAAoAAAACADAAAAAFAAoAAAACADEAAAAAAAAAAAACADIAAAAHAAkAAAACADMAAAAFAAkAAAADAPD/AAABAAsAAAADAPH/AAAFAAkAAAADAPL/AAAHAAoAAAADAPP/AAAFAAoAAAADAPT/AAAAAAAAAAADAPX/AAAIAAkAAAADAPb/AAAIAAkAAAADAAIAAAABAAUAAAADAAMAAAAFAAkAAAADAAQAAAANABwAAAADAAUAAAAFAAkAAAADAAYAAAAIAAkAAAADAAcAAAANABwAAAADAAgAAAAFAAoAAAADAAkAAAAFAAoAAAADAAoAAAAIAAoAAAADAAsAAAAHAAkAAAADAAwAAAAHAAoAAAADAA0AAAAFAAoAAAADAA4AAAAFAAoAAAADAA8AAAAFAAoAAAADABAAAAAIAAoAAAADABEAAAAHAAkAAAADABIAAAAAAAAAAAADABMAAAAHAAkAAAADABQAAAAIAAoAAAADABUAAAAIAAoAAAADABYAAAAFAAoAAAADABcAAAAFAAoAAAADABgAAAAHAAkAAAADABkAAAAIAAoAAAADABoAAAAFAAkAAAADABsAAAAFAAoAAAADABwAAAAHAAoAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAADAB8AAAABAAMAAAADACAAAAABAAQAAAADACEAAAABAAQAAAADACIAAAAAAAYAAAADACMAAAACAAUAAAADACQAAAAAAAAAAAADACUAAAAHAAoAAAADACYAAAAAAAAAAAADACcAAAAHAAoAAAADACgAAAAIAAkAAAADACkAAAAHAAkAAAADACoAAAAIAAkAAAADACsAAAAHAAoAAAADACwAAAAIAAkAAAADAC0AAAAHAAkAAAADAC4AAAAHAAoAAAADAC8AAAAHAAoAAAADADAAAAAIAAkAAAADADEAAAAIAAoAAAADADIAAAAHAAkAAAADADMAAAAFAAkAAAAEAPD/AAABAAsAAAAEAPH/AAAAAAAAAAAEAPL/AAAHAAkAAAAEAPP/AAAFAAoAAAAEAPT/AAAFAAoAAAAEAPX/AAAIAAkAAAAEAPb/AAAFAAoAAAAEAAIAAAABAAUAAAAEAAMAAAAHAAoAAAAEAAQAAAAIAAkAAAAEAAUAAAAAAAAAAAAEAAYAAAAFAAoAAAAEAAcAAAAHAAkAAAAEAAgAAAAFAAoAAAAEAAkAAAAIAAkAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAEAA4AAAAFAAkAAAAEAA8AAAAIAAkAAAAEABAAAAAFAAoAAAAEABEAAAAIAAkAAAAEABIAAAAIAAoAAAAEABMAAAAIAAoAAAAEABQAAAAFAAoAAAAEABUAAAAFAAkAAAAEABYAAAAHAAoAAAAEABcAAAAHAAoAAAAEABgAAAAFAAoAAAAEABkAAAAAAAAAAAAEABoAAAAHAAkAAAAEABsAAAAIAAoAAAAEABwAAAAFAAoAAAAEAB0AAAAFAAoAAAAEAB4AAAAFAAkAAAAEAB8AAAABAAMAAAAEACAAAAABAAQAAAAEACEAAAABAAQAAAAEACIAAAABAAUAAAAEACMAAAAHAAoAAAAEACQAAAAFAAkAAAAEACUAAAAAAAAAAAAEACYAAAAFAAoAAAAEACcAAAAIAAoAAAAEACgAAAAHAAkAAAAEACkAAAAHAAoAAAAEACoAAAAIAAkAAAAEACsAAAAFAAoAAAAEACwAAAAFAAkAAAAEAC0AAAAHAAkAAAAEAC4AAAAHAAkAAAAEAC8AAAAIAAkAAAAEADAAAAAFAAoAAAAEADEAAAAFAAoAAAAEADIAAAAFAAkAAAAEADMAAAAHAAkAAAAFAPD/AAABAAsAAAAFAPH/AAAHAAkAAAAFAPL/AAAHAAoAAAAFAPP/AAAFAAkAAAAFAPT/AAAIAAoAAAAFAPX/AAAHAAkAAAAFAPb/AAAFAAkAAAAFAAIAAAABAAUAAAAFAAMAAAAHAAoAAAAFAAQAAAAIAAoAAAAFAAUAAAAIAAoAAAAFAAYAAAAHAAoAAAAFAAcAAAAFAAoAAAAFAAgAAAAHAAkAAAAFAAkAAAAFAAkAAAAFAAoAAAAAAAAAAAAFAAsAAAAHAAkAAAAFAAwAAAAHAAoAAAAFAA0AAAAHAAkAAAAFAA4AAAAFAAoAAAAFAA8AAAAHAAkAAAAFABAAAAAHAAoAAAAFABEAAAAAAAAAAAAFABIAAAAAAAAAAAAFABMAAAAHAAkAAAAFABQAAAAHAAkAAAAFABUAAAAIAAkAAAAFABYAAAAHAAkAAAAFABcAAAAHAAkAAAAFABgAAAAIAAoAAAAFABkAAAAIAAkAAAAFABoAAAAHAAkAAAAFABsAAAAFAAoAAAAFABwAAAAFAAoAAAAFAB0AAAAIAAoAAAAFAB4AAAAHAAoAAAAFAB8AAAABAAMAAAAFACAAAAABAAQAAAAFACEAAAABAAQAAAAFACIAAAABAAUAAAAFACMAAAAIAAoAAAAFACQAAAAIAAkAAAAFACUAAAAHAAoAAAAFACYAAAAFAAoAAAAFACcAAAAFAAoAAAAFACgAAAAIAAoAAAAFACkAAAAFAAoAAAAFACoAAAAAAAAAAAAFACsAAAAFAAoAAAAFACwAAAAFAAkAAAAFAC0AAAAIAAkAAAAFAC4AAAAAAAAAAAAFAC8AAAAIAAoAAAAFADAAAAAAAAAAAAAFADEAAAAFAAkAAAAFADIAAAAAAAAAAAAFADMAAAAIAAoAAAAGAPD/AAABAAsAAAAGAPH/AAAIAAoAAAAGAPL/AAAHAAkAAAAGAPP/AAAFAAoAAAAGAPT/AAAFAAkAAAAGAPX/AAAHAAoAAAAGAPb/AAAFAAkAAAAGAAIAAAABAAYAAAAGAAQAAAAAAAUAAAAGAAUAAAAAAAAAAAAGAAYAAAAHAAoAAAAGAAcAAAAIAAoAAAAGAAgAAAAHAAkAAAAGAAkAAAAFAAoAAAAGAAoAAAAIAAkAAAAGAAsAAAAAAAAAAAAGAAwAAAAHAAoAAAAGAA0AAAAHAAkAAAAGAA4AAAAHAAoAAAAGAA8AAAAHAAkAAAAGABAAAAAHAAkAAAAGABEAAAAFAAkAAAAGABIAAAAHAAoAAAAGABMAAAAIAAoAAAAGABQAAAAFAAoAAAAGABUAAAAAAAAAAAAGABYAAAAFAAkAAAAGABcAAAAFAAoAAAAGABgAAAAIAAkAAAAGABkAAAAFAAoAAAAGABoAAAAHAAoAAAAGABsAAAAIAAoAAAAGABwAAAAFAAoAAAAGAB0AAAAHAAkAAAAGAB4AAAAIAAoAAAAGAB8AAAABAAMAAAAGACAAAAABAAQAAAAGACEAAAABAAQAAAAGACIAAAABAAUAAAAGACMAAAAIAAkAAAAGACQAAAAHAAkAAAAGACUAAAAFAAoAAAAGACYAAAAIAAoAAAAGACcAAAAFAAoAAAAGACgAAAAIAAkAAAAGACkAAAAFAAkAAAAGACoAAAAAAAAAAAAGACsAAAAIAAkAAAAGACwAAAAIAAoAAAAGAC0AAAAFAAkAAAAGAC4AAAAHAAoAAAAGAC8AAAAFAAoAAAAGADAAAAAHAAoAAAAGADEAAAAHAAkAAAAGADIAAAAAAAAAAAAGADMAAAAAAAAAAAAHAPD/AAABAAsAAAAHAPH/AAAHAAkAAAAHAPL/AAAHAAkAAAAHAPP/AAAAAAAAAAAHAPT/AAAHAAkAAAAHAPX/AAAHAAkAAAAHAPb/AAAHAAkAAAAHAAIAAAABAAQAAAAHAAMAAAABAAQAAAAHAAQAAAAGAAAAAAAHAAUAAAALAAIAAAAHAAYAAAAHAAoAAAAHAAcAAAAIAAoAAAAHAAgAAAAHAAkAAAAHAAkAAAAFAAoAAAAHAAoAAAAFAAoAAAAHAAsAAAAAAAAAAAAHAAwAAAAHAAoAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA8AAAAIAAkAAAAHABAAAAAIAAkAAAAHABEAAAAHAAkAAAAHABIAAAAHAAoAAAAHABMAAAAIAAkAAAAHABQAAAAIAAkAAAAHABUAAAAFAAoAAAAHABYAAAAIAAoAAAAHABcAAAAFAAkAAAAHABgAAAAAAAMAAAAHABkAAAAAAAQAAAAHABoAAAAAAAQAAAAHABsAAAAAAAQAAAAHABwAAAAAAAQAAAAHAB0AAAAAAAUAAAAHAB4AAAAHAAoAAAAHAB8AAAABAAMAAAAHACAAAAABAAQAAAAHACEAAAABAAQAAAAHACIAAAABAAUAAAAHACMAAAAIAAkAAAAHACQAAAAIAAkAAAAHACUAAAAHAAkAAAAHACYAAAAFAAoAAAAHACcAAAAIAAoAAAAHACgAAAAIAAoAAAAHACkAAAAAAAAAAAAHACoAAAAIAAkAAAAHACsAAAAHAAkAAAAHACwAAAAFAAoAAAAHAC0AAAAFAAkAAAAHAC4AAAAHAAkAAAAHAC8AAAAIAAkAAAAHADAAAAAAAAAAAAAHADEAAAAAAAAAAAAHADIAAAAHAAkAAAAHADMAAAAFAAkAAAAIAPD/AAABAAsAAAAIAPH/AAAIAAkAAAAIAPL/AAAFAAkAAAAIAPP/AAAIAAoAAAAIAPT/AAAIAAoAAAAIAPX/AAAAAAAAAAAIAPb/AAAFAAoAAAAIAAIAAAAAAAYAAAAIAAMAAAACAAQAAAAIAAQAAAABAAkAAAAIAAUAAAABAAoAAAAIAAYAAAAIAAoAAAAIAAcAAAAIAAoAAAAIAAgAAAAIAAkAAAAIAAkAAAAHAAoAAAAIAAoAAAAFAAkAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAIAAkAAAAIABAAAAAHAAoAAAAIABEAAAAFAAkAAAAIABIAAAAFAAkAAAAIABMAAAAFAAoAAAAIABUAAAAHAAkAAAAIABYAAAAFAAoAAAAIABcAAAAAAAMAAAAIABgAAAABAAcAAAAIABkAAAABAAQAAAAIABoAAAABAAQAAAAIABsAAAABAAQAAAAIABwAAAABAAQAAAAIAB0AAAABAAYAAAAIAB4AAAAAAAQAAAAIAB8AAAABAAcAAAAIACAAAAABAAQAAAAIACEAAAABAAQAAAAIACIAAAABAAUAAAAIACMAAAAIAAoAAAAIACQAAAAAAAAAAAAIACUAAAAIAAoAAAAIACYAAAAHAAkAAAAIACcAAAAAAAAAAAAIACgAAAAFAAkAAAAIACkAAAAFAAoAAAAIACoAAAAIAAoAAAAIACsAAAAHAAoAAAAIACwAAAAIAAoAAAAIAC0AAAAHAAkAAAAIAC4AAAAIAAkAAAAIAC8AAAAAAAAAAAAIADAAAAAAAAAAAAAIADEAAAAAAAAAAAAIADIAAAAHAAoAAAAIADMAAAAHAAoAAAAJAPD/AAABAAsAAAAJAPH/AAAIAAoAAAAJAPL/AAAAAAAAAAAJAPP/AAAFAAoAAAAJAPT/AAAFAAkAAAAJAPX/AAAHAAoAAAAJAPb/AAAIAAkAAAAJAAIAAAABAAUAAAAJAAMAAAAFAAkAAAAJAAQAAAAHAAkAAAAJAAUAAAAAAAAAAAAJAAYAAAAIAAoAAAAJAAcAAAAFAAoAAAAJAAgAAAAIAAoAAAAJAAkAAAAIAAkAAAAJAAoAAAAIAAkAAAAJAAsAAAAHAAkAAAAJAAwAAAAFAAkAAAAJAA0AAAAFAAoAAAAJAA4AAAAIAAkAAAAJAA8AAAAFAAkAAAAJABAAAAAIAAoAAAAJABEAAAAIAAkAAAAJABIAAAAFAAoAAAAJABMAAAAHAAkAAAAJABQAAAAAAAAAAAAJABUAAAAIAAkAAAAJABYAAAAAAAMAAAAJABcAAAABAAcAAAAJABgAAAABAAQAAAAJABkAAAABAAQAAAAJABoAAAAAAAYAAAAJABsAAAAAAAcAAAAJABwAAAABAAQAAAAJAB0AAAABAAQAAAAJAB4AAAABAAQAAAAJAB8AAAABAAQAAAAJACAAAAABAAQAAAAJACEAAAABAAQAAAAJACIAAAABAAUAAAAJACMAAAAAAAAAAAAJACQAAAAFAAkAAAAJACUAAAAIAAoAAAAJACYAAAAIAAoAAAAJACcAAAAHAAkAAAAJACgAAAAHAAoAAAAJACkAAAAFAAoAAAAJACoAAAAIAAkAAAAJACsAAAAFAAkAAAAJACwAAAAFAAoAAAAJAC0AAAAFAAoAAAAJAC4AAAAFAAkAAAAJAC8AAAAHAAoAAAAJADAAAAAIAAoAAAAJADEAAAAHAAoAAAAJADIAAAAIAAkAAAAJADMAAAAFAAkAAAAKAPD/AAABAAsAAAAKAPH/AAAIAAkAAAAKAPL/AAAHAAoAAAAKAPP/AAAIAAoAAAAKAPT/AAAIAAkAAAAKAPX/AAAFAAoAAAAKAPb/AAAIAAkAAAAKAAIAAAABAAUAAAAKAAMAAAAIAAkAAAAKAAQAAAAFAAoAAAAKAAUAAAAHAAoAAAAKAAYAAAAIAAkAAAAKAAcAAAAFAAoAAAAKAAgAAAAIAAoAAAAKAAkAAAAIAAoAAAAKAAoAAAAIAAkAAAAKAAsAAAAIAAoAAAAKAAwAAAAIAAkAAAAKAA0AAAAIAAoAAAAKAA4AAAAHAAoAAAAKAA8AAAAFAAkAAAAKABAAAAAIAAkAAAAKABEAAAAFAAoAAAAKABIAAAAHAAoAAAAKABMAAAAIAAoAAAAKABQAAAAHAAkAAAAKABUAAAAAAAMAAAAKABYAAAABAAcAAAAKABcAAAABAAQAAAAKABgAAAABAAQAAAAKABkAAAAAAAYAAAAKABoAAAACAAUAAAAKABsAAAACAAMAAAAKABwAAAACAAQAAAAKAB0AAAACAAQAAAAKAB4AAAACAAQAAAAKAB8AAAAAAAcAAAAKACAAAAABAAQAAAAKACEAAAABAAQAAAAKACIAAAABAAUAAAAKACMAAAAHAAoAAAAKACQAAAAAAAAAAAAKACUAAAAAAAAAAAAKACYAAAAHAAoAAAAKACcAAAAHAAkAAAAKACgAAAAHAAkAAAAKACkAAAAIAAoAAAAKACoAAAAFAAoAAAAKACsAAAAHAAkAAAAKACwAAAAAAAAAAAAKAC0AAAAHAAkAAAAKAC4AAAAIAAkAAAAKAC8AAAAHAAoAAAAKADAAAAAIAAkAAAAKADEAAAAHAAoAAAAKADIAAAAHAAoAAAAKADMAAAAIAAoAAAALAPD/AAABAAsAAAALAPH/AAAIAAkAAAALAPL/AAAHAAoAAAALAPP/AAAHAAkAAAALAPT/AAAIAAoAAAALAPX/AAAHAAkAAAALAPb/AAAAAAAAAAALAAIAAAABAAUAAAALAAMAAAAIAAoAAAALAAQAAAAAAAAAAAALAAUAAAAFAAkAAAALAAYAAAAHAAkAAAALAAcAAAAHAAoAAAALAAgAAAAFAAkAAAALAAkAAAAIAAoAAAALAAoAAAAIAAoAAAALAAsAAAAFAAoAAAALAAwAAAAIAAoAAAALAA0AAAAIAAkAAAALAA4AAAAFAAkAAAALAA8AAAAIAAkAAAALABAAAAAIAAkAAAALABEAAAAFAAkAAAALABIAAAAIAAkAAAALABMAAAAIAAoAAAALABQAAAAAAAMAAAALABUAAAABAAcAAAALABYAAAABAAQAAAALABcAAAAAAAYAAAALABgAAAACAAQAAAALABkAAAACAAUAAAALABoAAAAHAAoAAAALABsAAAAAAAAAAAALABwAAAAAAAAAAAALAB0AAAAFAAkAAAALAB4AAAAFAAkAAAALAB8AAAABAAMAAAALACAAAAABAAQAAAALACEAAAABAAQAAAALACIAAAABAAUAAAALACMAAAAFAAoAAAALACQAAAAHAAoAAAALACUAAAAHAAkAAAALACYAAAAHAAkAAAALACcAAAAAAAAAAAALACgAAAAFAAkAAAALACkAAAAIAAkAAAALACoAAAAFAAoAAAALACsAAAAAAAAAAAALACwAAAAHAAoAAAALAC0AAAAIAAkAAAALAC4AAAAAAAAAAAALAC8AAAAHAAkAAAALADAAAAAIAAoAAAALADEAAAAHAAoAAAALADIAAAAIAAoAAAALADMAAAAFAAoAAAAMAPD/AAABAAsAAAAMAPH/AAAFAAoAAAAMAPL/AAAIAAkAAAAMAPP/AAAAAAAAAAAMAPT/AAAIAAkAAAAMAPX/AAAHAAoAAAAMAPb/AAAAAAAAAAAMAAIAAAABAAUAAAAMAAMAAAAIAAoAAAAMAAQAAAAIAAkAAAAMAAUAAAAIAAkAAAAMAAcAAAAAAAAAAAAMAAgAAAAIAAoAAAAMAAkAAAAIAAkAAAAMAAoAAAAAAAAAAAAMAAsAAAAIAAoAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAHAAoAAAAMABAAAAAAAAAAAAAMABEAAAAFAAkAAAAMABIAAAAFAAkAAAAMABMAAAAFAAkAAAAMABQAAAABAAMAAAAMABUAAAABAAQAAAAMABYAAAABAAQAAAAMABcAAAABAAUAAAAMABgAAAAHAAkAAAAMABkAAAAIAAoAAAAMABoAAAAFAAoAAAAMABsAAAAAAAAAAAAMABwAAAAHAAkAAAAMAB0AAAAIAAoAAAAMAB4AAAAIAAkAAAAMAB8AAAABAAMAAAAMACAAAAABAAQAAAAMACEAAAABAAQAAAAMACIAAAABAAUAAAAMACMAAAAIAAoAAAAMACQAAAAIAAkAAAAMACUAAAAAAAAAAAAMACYAAAAHAAoAAAAMACcAAAAFAAkAAAAMACgAAAAIAAoAAAAMACkAAAAFAAoAAAAMACoAAAAFAAkAAAAMACsAAAAIAAoAAAAMACwAAAAAAAAAAAAMAC0AAAAFAAoAAAAMAC4AAAAHAAoAAAAMAC8AAAAAAAAAAAAMADAAAAAHAAkAAAAMADEAAAAFAAkAAAAMADIAAAAIAAkAAAAMADMAAAAFAAkAAAANAPD/AAABAAsAAAANAPH/AAAFAAkAAAANAPL/AAAFAAoAAAANAPP/AAAAAAAAAAANAPT/AAAIAAoAAAANAPX/AAAIAAoAAAANAPb/AAAAAAAAAAANAAIAAAABAAUAAAANAAMAAAAFAAkAAAANAAQAAAAHAAkAAAANAAUAAAAIAAoAAAANAAYAAAAAAAAAAAANAAcAAAAHAAkAAAANAAgAAAAAAAAAAAANAAkAAAAIAAkAAAANAAoAAAAIAAoAAAANAAsAAAAHAAoAAAANAAwAAAAAAAAAAAANAA0AAAAFAAkAAAANAA4AAAAHAAoAAAANAA8AAAAHAAoAAAANABAAAAAAAAAAAAANABEAAAAAAAAAAAANABIAAAAAAAAAAAANABMAAAAAAAMAAAANABQAAAABAAcAAAANABUAAAABAAQAAAANABYAAAAAAAYAAAANABcAAAACAAUAAAANABgAAAAFAAoAAAANABkAAAAIAAkAAAANABoAAAAIAAkAAAANABsAAAAAAAAAAAANABwAAAAIAAkAAAANAB0AAAAAAAAAAAANAB4AAAAHAAoAAAANAB8AAAABAAMAAAANACAAAAABAAQAAAANACEAAAABAAQAAAANACIAAAABAAUAAAANACMAAAAFAAoAAAANACQAAAAIAAkAAAANACUAAAAHAAkAAAANACYAAAAIAAkAAAANACcAAAAHAAoAAAANACgAAAAHAAoAAAANACkAAAAAAAAAAAANACoAAAAFAAkAAAANACsAAAAFAAkAAAANACwAAAAAAAAAAAANAC0AAAAIAAkAAAANAC4AAAAHAAoAAAANAC8AAAAHAAoAAAANADAAAAAHAAoAAAANADEAAAAFAAoAAAANADIAAAAAAAAAAAANADMAAAAHAAoAAAAOAPD/AAABAAsAAAAOAPH/AAAHAAkAAAAOAPL/AAAIAAkAAAAOAPP/AAAHAAkAAAAOAPT/AAAFAAkAAAAOAPX/AAAAAAAAAAAOAPb/AAAFAAkAAAAOAAIAAAABAAUAAAAOAAMAAAAAAAAAAAAOAAQAAAAHAAoAAAAOAAUAAAAIAAoAAAAOAAcAAAAFAAoAAAAOAAgAAAAIAAoAAAAOAAkAAAAFAAkAAAAOAAoAAAAFAAoAAAAOAAsAAAAFAAkAAAAOAAwAAAAFAAoAAAAOAA0AAAAIAAoAAAAOAA4AAAAFAAkAAAAOAA8AAAAIAAoAAAAOABAAAAAIAAoAAAAOABEAAAAGAAAAAAAOABIAAAAAAAAAAAAOABMAAAABAAQAAAAOABQAAAABAAQAAAAOABUAAAABAAQAAAAOABYAAAABAAUAAAAOABcAAAAFAAkAAAAOABgAAAAHAAkAAAAOABkAAAAHAAoAAAAOABoAAAAFAAoAAAAOABsAAAAIAAkAAAAOABwAAAAHAAkAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAOAB8AAAABAAMAAAAOACAAAAABAAQAAAAOACEAAAABAAQAAAAOACIAAAABAAUAAAAOACMAAAAHAAkAAAAOACQAAAAFAAkAAAAOACUAAAAFAAkAAAAOACYAAAAIAAkAAAAOACcAAAAAAAAAAAAOACgAAAAFAAoAAAAOACkAAAAFAAkAAAAOACoAAAAIAAoAAAAOACsAAAAFAAoAAAAOACwAAAAHAAkAAAAOAC0AAAAAAAAAAAAOAC4AAAAAAAAAAAAOAC8AAAAIAAkAAAAOADAAAAAIAAkAAAAOADEAAAAHAAoAAAAOADIAAAAAAAAAAAAOADMAAAAAAAAAAAAPAPD/AAABAAsAAAAPAPH/AAAFAAkAAAAPAPL/AAAFAAoAAAAPAPP/AAAHAAkAAAAPAPT/AAAFAAoAAAAPAPX/AAAHAAoAAAAPAPb/AAAAAAAAAAAPAAMAAAAIAAkAAAAPAAQAAAAIAAoAAAAPAAUAAAAHAAkAAAAPAAYAAAAFAAkAAAAPAAcAAAAFAAoAAAAPAAgAAAAFAAkAAAAPAAkAAAAFAAoAAAAPAAoAAAAFAAkAAAAPAAsAAAAIAAoAAAAPAAwAAAAIAAkAAAAPAA0AAAAAAAAAAAAPAA4AAAAIAAoAAAAPAA8AAAAIAAkAAAAPABAAAAAOAAAAAAAPABEAAAAFAAoAAAAPABIAAAACAAMAAAAPABMAAAACAAQAAAAPABQAAAAAAAcAAAAPABUAAAABAAQAAAAPABYAAAABAAUAAAAPABcAAAAHAAkAAAAPABgAAAAFAAkAAAAPABkAAAAFAAoAAAAPABoAAAAAAAAAAAAPABsAAAAFAAoAAAAPABwAAAAFAAoAAAAPAB0AAAAIAAkAAAAPAB4AAAAFAAoAAAAPAB8AAAABAAMAAAAPACAAAAABAAQAAAAPACEAAAABAAQAAAAPACIAAAABAAUAAAAPACMAAAAFAAkAAAAPACQAAAAFAAoAAAAPACUAAAAIAAoAAAAPACYAAAAFAAoAAAAPACcAAAAAAAAAAAAPACgAAAAHAAoAAAAPACkAAAAAAAAAAAAPACoAAAAIAAoAAAAPACsAAAAIAAkAAAAPACwAAAAIAAoAAAAPAC0AAAAFAAoAAAAPAC4AAAAHAAoAAAAPAC8AAAAIAAoAAAAPADAAAAAHAAkAAAAPADEAAAAIAAoAAAAPADIAAAAFAAoAAAAPADMAAAAFAAoAAAAQAPD/AAABAAsAAAAQAPH/AAAIAAoAAAAQAPL/AAAFAAkAAAAQAPP/AAAIAAkAAAAQAPT/AAAIAAkAAAAQAPX/AAAAAAAAAAAQAPb/AAAFAAoAAAAQAAMAAAAAAAAAAAAQAAQAAAAHAAkAAAAQAAUAAAAHAAoAAAAQAAYAAAAFAAkAAAAQAAcAAAAIAAoAAAAQAAgAAAAAAAAAAAAQAAkAAAAHAAoAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAHAAoAAAAQAA0AAAAIAAoAAAAQAA4AAAAFAAoAAAAQAA8AAAAFAAkAAAAQABAAAAAHAAoAAAAQABEAAAAHAAoAAAAQABIAAAAHAAkAAAAQABMAAAAAAAAAAAAQABQAAAABAAMAAAAQABUAAAABAAQAAAAQABYAAAABAAYAAAAQABcAAAAAAAUAAAAQABgAAAAIAAoAAAAQABkAAAAAAAAAAAAQABoAAAAHAAkAAAAQABsAAAAFAAkAAAAQABwAAAAFAAoAAAAQAB0AAAAIAAkAAAAQAB4AAAAHAAoAAAAQAB8AAAABAAMAAAAQACAAAAABAAQAAAAQACEAAAABAAQAAAAQACIAAAABAAUAAAAQACMAAAAFAAkAAAAQACQAAAAAAAAAAAAQACUAAAAFAAoAAAAQACYAAAAHAAkAAAAQACcAAAAIAAkAAAAQACgAAAAAAAAAAAAQACkAAAAAAAAAAAAQACoAAAAIAAoAAAAQACsAAAAAAAAAAAAQACwAAAAFAAoAAAAQAC0AAAAIAAoAAAAQAC4AAAAIAAkAAAAQAC8AAAAHAAkAAAAQADAAAAAFAAkAAAAQADEAAAAFAAoAAAAQADIAAAAAAAAAAAAQADMAAAAHAAoAAAARAPD/AAABAAsAAAARAPH/AAAIAAoAAAARAPL/AAAFAAoAAAARAPP/AAAIAAkAAAARAPT/AAAAAAAAAAARAPX/AAAAAAAAAAARAPb/AAAIAAoAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAFAAoAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAHAAkAAAARAAkAAAAAAAAAAAARAAoAAAAHAAkAAAARAAsAAAACAAYAAAARAAwAAAACAAcAAAARAA0AAAACAAgAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAIAAkAAAARABEAAAAIAAoAAAARABIAAAAAAAAAAAARABMAAAAFAAoAAAARABQAAAABAAMAAAARABUAAAABAAQAAAARABYAAAABAAQAAAARABcAAAABAAYAAAARABgAAAAAAAUAAAARABkAAAAHAAkAAAARABoAAAAAAAAAAAARABsAAAAIAAoAAAARABwAAAAIAAoAAAARAB0AAAAHAAoAAAARAB4AAAAFAAoAAAARAB8AAAABAAMAAAARACAAAAABAAQAAAARACEAAAABAAQAAAARACIAAAABAAUAAAARACMAAAAIAAoAAAARACQAAAAIAAkAAAARACUAAAAFAAoAAAARACYAAAAFAAkAAAARACcAAAAFAAkAAAARACgAAAAFAAkAAAARACkAAAAFAAkAAAARACoAAAAAAAAAAAARACsAAAAHAAoAAAARACwAAAAIAAkAAAARAC0AAAAIAAkAAAARAC4AAAAAAAAAAAARAC8AAAAAAAAAAAARADAAAAAAAAAAAAARADEAAAAFAAoAAAARADIAAAAHAAkAAAARADMAAAAIAAoAAAASAPD/AAABAAsAAAASAPH/AAAHAAoAAAASAPL/AAAHAAoAAAASAPP/AAAFAAoAAAASAPT/AAAFAAoAAAASAPX/AAAFAAkAAAASAPb/AAAIAAkAAAASAAIAAAABAAUAAAASAAMAAAAFAAoAAAASAAQAAAAHAAoAAAASAAUAAAAFAAoAAAASAAYAAAAHAAkAAAASAAcAAAAFAAoAAAASAAgAAAAHAAkAAAASAAkAAAAIAAoAAAASAAoAAAACAAYAAAASAAsAAAADAAoAAAASAAwAAAADAAcAAAASAA0AAAADAAkAAAASAA4AAAACAAcAAAASAA8AAAACAAgAAAASABAAAAAHAAkAAAASABEAAAAFAAkAAAASABIAAAAAAAAAAAASABMAAAAHAAoAAAASABQAAAACAAMAAAASABUAAAAAAAcAAAASABYAAAABAAQAAAASABcAAAABAAQAAAASABgAAAABAAYAAAASABkAAAAAAAUAAAASABoAAAAFAAoAAAASABsAAAAIAAoAAAASABwAAAAFAAoAAAASAB0AAAAFAAkAAAASAB4AAAAFAAkAAAASAB8AAAABAAMAAAASACAAAAABAAQAAAASACEAAAABAAQAAAASACIAAAABAAUAAAASACMAAAAIAAoAAAASACQAAAAFAAoAAAASACUAAAAHAAoAAAASACYAAAAIAAkAAAASACcAAAAFAAkAAAASACgAAAAHAAkAAAASACkAAAAAAAAAAAASACoAAAAHAAoAAAASACsAAAAAAAAAAAASACwAAAAAAAAAAAASAC0AAAAFAAkAAAASAC4AAAAFAAoAAAASAC8AAAAAAAAAAAASADAAAAAAAAAAAAASADEAAAAIAAoAAAASADIAAAAHAAoAAAASADMAAAAIAAkAAAATAPD/AAABAAsAAAATAPH/AAAAAAAAAAATAPL/AAAHAAoAAAATAPP/AAAHAAoAAAATAPT/AAAIAAkAAAATAPX/AAAIAAoAAAATAPb/AAAFAAkAAAATAAIAAAABAAYAAAATAAMAAAAAAAUAAAATAAQAAAAHAAoAAAATAAUAAAAFAAkAAAATAAYAAAAFAAoAAAATAAcAAAAFAAoAAAATAAgAAAAHAAoAAAATAAkAAAACAAYAAAATAAoAAAADAAoAAAATAAsAAAADAAcAAAATAAwAAAAAAAEAAAATAA0AAAADAAcAAAATAA4AAAAAAAEAAAATAA8AAAADAAkAAAATABAAAAACAAgAAAATABEAAAAIAAkAAAATABIAAAAIAAkAAAATABMAAAAAAAAAAAATABQAAAAIAAkAAAATABUAAAACAAMAAAATABYAAAAAAAcAAAATABcAAAABAAQAAAATABgAAAABAAQAAAATABkAAAABAAYAAAATABoAAAAAAAUAAAATABsAAAAFAAoAAAATABwAAAAHAAoAAAATAB0AAAAIAAoAAAATAB4AAAAIAAoAAAATAB8AAAABAAMAAAATACAAAAABAAQAAAATACEAAAABAAQAAAATACIAAAABAAUAAAATACMAAAAAAAAAAAATACQAAAAIAAoAAAATACUAAAAAAAAAAAATACYAAAAHAAoAAAATACcAAAAHAAoAAAATACgAAAAIAAoAAAATACkAAAAHAAkAAAATACoAAAAIAAkAAAATACsAAAAIAAkAAAATACwAAAAAAAAAAAATAC0AAAAFAAkAAAATAC4AAAAAAAAAAAATAC8AAAAAAAAAAAATADAAAAAHAAoAAAATADEAAAAAAAAAAAATADIAAAAAAAAAAAATADMAAAAHAAkAAAAUAPD/AAABAAsAAAAUAPH/AAAAAAAAAAAUAPL/AAAFAAoAAAAUAPP/AAAIAAkAAAAUAPT/AAAFAAoAAAAUAPX/AAAIAAkAAAAUAPb/AAACAAYAAAAUAPf/AAACAAcAAAAUAPj/AAACAAcAAAAUAPn/AAACAAcAAAAUAPr/AAACAAgAAAAUAPv/AAAIAAoAAAAUAPz/AAAHAAkAAAAUAP3/AAAFAAkAAAAUAP7/AAAIAAoAAAAUAP//AAAFAAoAAAAUAAAAAAACAAMAAAAUAAEAAAAAAAcAAAAUAAIAAAABAAQAAAAUAAMAAAABAAYAAAAUAAQAAAAAAAUAAAAUAAUAAAAFAAkAAAAUAAYAAAAHAAoAAAAUAAcAAAAAAAAAAAAUAAgAAAAFAAoAAAAUAAkAAAADAAYAAAAUAAoAAAADAAcAAAAUAAsAAAADAAcAAAAUAAwAAAADAAcAAAAUAA0AAAADAAcAAAAUAA4AAAADAAcAAAAUAA8AAAADAAcAAAAUABAAAAADAAkAAAAUABEAAAACAAgAAAAUABIAAAAFAAoAAAAUABMAAAAHAAkAAAAUABQAAAAAAAAAAAAUABUAAAAHAAoAAAAUABYAAAACAAMAAAAUABcAAAAAAAcAAAAUABgAAAABAAQAAAAUABkAAAABAAQAAAAUABoAAAABAAYAAAAUABsAAAAAAAUAAAAUABwAAAAAAAAAAAAUAB0AAAAFAAkAAAAUAB4AAAAFAAkAAAAUAB8AAAABAAMAAAAUACAAAAABAAQAAAAUACEAAAABAAQAAAAUACIAAAABAAUAAAAUACMAAAAHAAkAAAAUACQAAAAHAAoAAAAUACUAAAAAAAMAAAAUACYAAAAAAAQAAAAUACcAAAAAAAQAAAAUACgAAAAAAAQAAAAUACkAAAAAAAQAAAAUACoAAAAAAAUAAAAUACsAAAAIAAkAAAAUACwAAAAHAAkAAAAUAC0AAAAFAAoAAAAUAC4AAAAIAAkAAAAUAC8AAAAFAAoAAAAUADAAAAAHAAoAAAAUADEAAAAHAAoAAAAUADIAAAAHAAkAAAAUADMAAAAIAAoAAAAVAPD/AAABAAsAAAAVAPH/AAAHAAkAAAAVAPL/AAAIAAoAAAAVAPP/AAAIAAkAAAAVAPT/AAAFAAoAAAAVAPX/AAACAAYAAAAVAPb/AAADAAoAAAAVAPf/AAAAAAEAAAAVAPj/AAAAAAEAAAAVAPn/AAAAAAEAAAAVAPr/AAADAAkAAAAVAPv/AAACAAgAAAAVAPz/AAAHAAoAAAAVAP3/AAAIAAkAAAAVAP7/AAAFAAoAAAAVAP//AAAFAAkAAAAVAAAAAAAHAAoAAAAVAAEAAAACAAMAAAAVAAIAAAAAAAcAAAAVAAMAAAABAAQAAAAVAAQAAAABAAYAAAAVAAUAAAAAAAUAAAAVAAYAAAAFAAoAAAAVAAcAAAAHAAkAAAAVAAgAAAAFAAkAAAAVAAkAAAADAAYAAAAVAAoAAAADAAcAAAAVAAsAAAADAAcAAAAVAAwAAAACAAkAAAAVAA0AAAAEAAcAAAAVAA4AAAACAAoAAAAVAA8AAAADAAcAAAAVABAAAAADAAcAAAAVABEAAAADAAgAAAAVABIAAAAHAAkAAAAVABMAAAAHAAkAAAAVABQAAAAIAAkAAAAVABUAAAAFAAkAAAAVABYAAAAIAAkAAAAVABcAAAACAAMAAAAVABgAAAAAAAcAAAAVABkAAAABAAQAAAAVABoAAAABAAQAAAAVABsAAAABAAYAAAAVABwAAAAAAAUAAAAVAB0AAAAHAAkAAAAVAB4AAAAAAAAAAAAVAB8AAAABAAMAAAAVACAAAAABAAQAAAAVACEAAAABAAQAAAAVACIAAAABAAUAAAAVACMAAAAAAAAAAAAVACQAAAAFAAoAAAAVACUAAAABAAMAAAAVACYAAAABAAQAAAAVACcAAAABAAQAAAAVACgAAAABAAQAAAAVACkAAAABAAQAAAAVACoAAAABAAUAAAAVACsAAAAHAAoAAAAVACwAAAAAAAAAAAAVAC0AAAAIAAoAAAAVAC4AAAAAAAAAAAAVAC8AAAAIAAoAAAAVADAAAAAIAAoAAAAVADEAAAAHAAkAAAAVADIAAAAHAAkAAAAVADMAAAAFAAkAAAAWAPD/AAABAAsAAAAWAPH/AAAHAAoAAAAWAPL/AAAAAAAAAAAWAPP/AAAFAAkAAAAWAPT/AAACAAYAAAAWAPX/AAADAAoAAAAWAPb/AAAAAAEAAAAWAPf/AAADAAcAAAAWAPj/AAAAAAEAAAAWAPn/AAADAAcAAAAWAPr/AAAAAAEAAAAWAPv/AAADAAgAAAAWAPz/AAAIAAkAAAAWAP3/AAAFAAkAAAAWAP7/AAAHAAoAAAAWAP//AAAIAAkAAAAWAAAAAAAIAAkAAAAWAAEAAAAFAAkAAAAWAAIAAAABAAMAAAAWAAMAAAABAAQAAAAWAAQAAAABAAQAAAAWAAUAAAABAAYAAAAWAAYAAAAAAAQAAAAWAAcAAAAAAAUAAAAWAAgAAAAAAAMAAAAWAAkAAAABAAcAAAAWAAoAAAAPAAoAAAAWAAsAAAAAAAEAAAAWAA0AAAACAAcAAAAWAA4AAAADAAoAAAAWAA8AAAADAAcAAAAWABAAAAAAAAEAAAAWABEAAAADAAgAAAAWABIAAAAFAAoAAAAWABMAAAAFAAoAAAAWABQAAAAAAAAAAAAWABUAAAAHAAoAAAAWABYAAAAIAAoAAAAWABcAAAAFAAkAAAAWABgAAAACAAMAAAAWABkAAAAAAAcAAAAWABoAAAABAAQAAAAWABsAAAABAAQAAAAWABwAAAABAAYAAAAWAB0AAAAAAAUAAAAWAB4AAAAFAAkAAAAWAB8AAAABAAMAAAAWACAAAAABAAQAAAAWACEAAAABAAQAAAAWACIAAAABAAUAAAAWACMAAAAIAAoAAAAWACQAAAAHAAkAAAAWACUAAAABAAMAAAAWACYAAAABAAQAAAAWACcAAAABAAQAAAAWACgAAAABAAQAAAAWACkAAAABAAQAAAAWACoAAAABAAUAAAAWACsAAAAIAAkAAAAWACwAAAAFAAkAAAAWAC0AAAAIAAkAAAAWAC4AAAAHAAkAAAAWAC8AAAAAAAAAAAAWADAAAAAIAAkAAAAWADEAAAAIAAkAAAAWADIAAAAHAAkAAAAWADMAAAAFAAkAAAAXAPD/AAABAAsAAAAXAPH/AAAHAAkAAAAXAPL/AAACAAYAAAAXAPP/AAACAAcAAAAXAPT/AAADAAoAAAAXAPX/AAADAAcAAAAXAPb/AAADAAcAAAAXAPf/AAADAAcAAAAXAPj/AAAAAAEAAAAXAPn/AAADAAcAAAAXAPr/AAAAAAEAAAAXAPv/AAADAAkAAAAXAPz/AAACAAgAAAAXAP3/AAAFAAkAAAAXAP7/AAAAAAAAAAAXAP//AAAHAAoAAAAXAAAAAAAHAAkAAAAXAAEAAAAIAAkAAAAXAAIAAAACAAMAAAAXAAMAAAAAAAcAAAAXAAQAAAABAAQAAAAXAAUAAAABAAQAAAAXAAYAAAABAAQAAAAXAAcAAAABAAYAAAAXAAgAAAABAAcAAAAXAAkAAAABAAQAAAAXAAoAAAAQAAYAAAAXAAsAAAADAAcAAAAXAAwAAAADAAcAAAAXAA0AAAAAAAEAAAAXAA4AAAAAAAEAAAAXAA8AAAADAAcAAAAXABAAAAAAAAEAAAAXABEAAAADAAgAAAAXABIAAAAIAAkAAAAXABMAAAAIAAoAAAAXABQAAAAFAAoAAAAXABUAAAAIAAkAAAAXABYAAAAHAAoAAAAXABcAAAAFAAoAAAAXABgAAAAAAAAAAAAXABkAAAACAAMAAAAXABoAAAAAAAcAAAAXABsAAAABAAQAAAAXABwAAAABAAQAAAAXAB0AAAABAAYAAAAXAB4AAAAAAAUAAAAXAB8AAAABAAMAAAAXACAAAAABAAQAAAAXACEAAAABAAQAAAAXACIAAAABAAUAAAAXACMAAAAFAAkAAAAXACQAAAAFAAoAAAAXACUAAAABAAMAAAAXACYAAAABAAQAAAAXACcAAAABAAQAAAAXACgAAAABAAQAAAAXACkAAAABAAQAAAAXACoAAAABAAUAAAAXACsAAAAIAAoAAAAXACwAAAAIAAkAAAAXAC0AAAAHAAkAAAAXAC4AAAAHAAoAAAAXAC8AAAAHAAkAAAAXADAAAAAIAAkAAAAXADEAAAAHAAoAAAAXADIAAAAHAAoAAAAXADMAAAAHAAkAAAAYAPD/AAABAAsAAAAYAPH/AAAIAAkAAAAYAPL/AAADAAYAAAAYAPP/AAADAAcAAAAYAPT/AAADAAcAAAAYAPX/AAADAAcAAAAYAPb/AAADAAcAAAAYAPf/AAADAAcAAAAYAPn/AAADAAcAAAAYAPr/AAADAAcAAAAYAPv/AAADAAcAAAAYAPz/AAADAAgAAAAYAP3/AAAFAAkAAAAYAP7/AAAIAAkAAAAYAP//AAAFAAoAAAAYAAAAAAAIAAoAAAAYAAEAAAAIAAoAAAAYAAIAAAAFAAoAAAAYAAMAAAACAAMAAAAYAAQAAAACAAQAAAAYAAUAAAAAAAcAAAAYAAYAAAABAAQAAAAYAAcAAAABAAQAAAAYAAgAAAABAAQAAAAYAAkAAAABAAQAAAAYAAoAAAARAAYAAAAYAAsAAAAIAA0AAAAYAAwAAAAEAAcAAAAYAA0AAAAEAAcAAAAYAA4AAAACAAoAAAAYAA8AAAADAAcAAAAYABAAAAADAAcAAAAYABEAAAADAAkAAAAYABIAAAACAAgAAAAYABMAAAAFAAoAAAAYABQAAAAHAAoAAAAYABUAAAAFAAoAAAAYABYAAAAHAAoAAAAYABcAAAAFAAkAAAAYABgAAAAHAAkAAAAYABkAAAAHAAoAAAAYABoAAAACAAMAAAAYABsAAAAAAAcAAAAYABwAAAABAAQAAAAYAB0AAAABAAQAAAAYAB4AAAABAAUAAAAYAB8AAAABAAMAAAAYACAAAAABAAQAAAAYACEAAAABAAQAAAAYACIAAAABAAUAAAAYACMAAAAHAAkAAAAYACQAAAAIAAkAAAAYACUAAAABAAMAAAAYACYAAAABAAQAAAAYACcAAAABAAQAAAAYACgAAAABAAQAAAAYACkAAAABAAQAAAAYACoAAAABAAUAAAAYACsAAAAIAAkAAAAYACwAAAAHAAoAAAAYAC0AAAAHAAoAAAAYAC4AAAAIAAkAAAAYAC8AAAAAAAAAAAAYADAAAAAAAAAAAAAYADEAAAAFAAoAAAAYADIAAAAIAAoAAAAYADMAAAAFAAoAAAAZAPD/AAACAAYAAAAZAPH/AAACAAcAAAAZAPL/AAADAAoAAAAZAPP/AAADAAcAAAAZAPT/AAADAAcAAAAZAPX/AAAAAAEAAAAZAPb/AAADAAcAAAAZAPf/AAADAAcAAAAZAPj/AAADAAcAAAAZAPn/AAADAAcAAAAZAPr/AAADAAcAAAAZAPv/AAADAAcAAAAZAPz/AAADAAgAAAAZAP3/AAAIAAkAAAAZAP7/AAAAAAAAAAAZAP//AAAFAAoAAAAZAAAAAAAFAAkAAAAZAAEAAAAAAAAAAAAZAAIAAAAFAAkAAAAZAAMAAAAFAAkAAAAZAAQAAAAHAAoAAAAZAAUAAAACAAMAAAAZAAYAAAACAAQAAAAZAAcAAAACAAQAAAAZAAgAAAAAAAcAAAAZAAkAAAABAAQAAAAZAAoAAAABAAQAAAAZAAsAAAABAAUAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAADAAYAAAAZAA8AAAADAAcAAAAZABAAAAADAAcAAAAZABEAAAADAAcAAAAZABIAAAADAAgAAAAZABMAAAAHAAoAAAAZABQAAAAHAAoAAAAZABUAAAAIAAoAAAAZABYAAAAHAAoAAAAZABcAAAAIAAoAAAAZABgAAAAAAAAAAAAZABkAAAAIAAkAAAAZABoAAAAIAAoAAAAZABsAAAACAAMAAAAZABwAAAAAAAcAAAAZAB0AAAABAAQAAAAZAB4AAAABAAUAAAAZAB8AAAABAAMAAAAZACAAAAABAAQAAAAZACEAAAABAAQAAAAZACIAAAABAAUAAAAZACMAAAAHAAkAAAAZACQAAAAIAAkAAAAZACUAAAABAAMAAAAZACYAAAABAAQAAAAZACcAAAABAAQAAAAZACgAAAABAAQAAAAZACkAAAABAAQAAAAZACoAAAABAAUAAAAZACsAAAAIAAoAAAAZACwAAAAIAAkAAAAZAC0AAAAIAAoAAAAZAC4AAAAHAAoAAAAZAC8AAAAIAAoAAAAZADAAAAAAAAAAAAAZADEAAAAIAAkAAAAZADIAAAAIAAkAAAAZADMAAAAFAAoAAAAaAPD/AAADAAYAAAAaAPH/AAAAAAEAAAAaAPL/AAADAAcAAAAaAPP/AAADAAcAAAAaAPT/AAADAAcAAAAaAPX/AAAAAAEAAAAaAPb/AAADAAcAAAAaAPf/AAAAAAEAAAAaAPj/AAAAAAEAAAAaAPn/AAAAAAEAAAAaAPr/AAADAAcAAAAaAPv/AAAAAAEAAAAaAPz/AAADAAkAAAAaAP3/AAACAAcAAAAaAP7/AAACAAcAAAAaAP//AAACAAgAAAAaAAAAAAAIAAoAAAAaAAEAAAAHAAoAAAAaAAIAAAAIAAkAAAAaAAMAAAAHAAkAAAAaAAQAAAAIAAkAAAAaAAUAAAAHAAkAAAAaAAYAAAAAAAAAAAAaAAcAAAAFAAoAAAAaAAgAAAABAAMAAAAaAAkAAAABAAQAAAAaAAoAAAAAAAYAAAAaAAsAAAACAAUAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAEAAYAAAAaAA8AAAACAAoAAAAaABAAAAAAAAEAAAAaABEAAAADAAcAAAAaABIAAAADAAgAAAAaABMAAAAHAAkAAAAaABQAAAAHAAkAAAAaABUAAAAFAAkAAAAaABYAAAAAAAAAAAAaABcAAAAIAAoAAAAaABgAAAAIAAoAAAAaABkAAAAHAAkAAAAaABoAAAAFAAoAAAAaABsAAAAAAAMAAAAaABwAAAABAAcAAAAaAB0AAAABAAQAAAAaAB4AAAABAAUAAAAaAB8AAAABAAMAAAAaACAAAAABAAQAAAAaACEAAAABAAQAAAAaACIAAAABAAUAAAAaACMAAAAIAAkAAAAaACQAAAAHAAoAAAAaACUAAAABAAMAAAAaACYAAAABAAQAAAAaACcAAAABAAQAAAAaACgAAAABAAQAAAAaACkAAAABAAQAAAAaACoAAAABAAUAAAAaACsAAAAFAAkAAAAaACwAAAAFAAoAAAAaAC0AAAAAAAAAAAAaAC4AAAAHAAkAAAAaAC8AAAAHAAoAAAAaADAAAAAFAAkAAAAaADEAAAAIAAoAAAAaADIAAAAFAAkAAAAaADMAAAAAAAkAAAAbAPD/AAADAAoAAAAbAPH/AAAAAAEAAAAbAPL/AAADAAcAAAAbAPP/AAADAAcAAAAbAPT/AAAAAAEAAAAbAPX/AAADAAcAAAAbAPb/AAADAAcAAAAbAPf/AAADAAcAAAAbAPj/AAADAAcAAAAbAPn/AAADAAcAAAAbAPr/AAADAAcAAAAbAPv/AAADAAcAAAAbAPz/AAAAAAEAAAAbAP3/AAADAAcAAAAbAP7/AAADAAcAAAAbAP//AAADAAkAAAAbAAAAAAACAAgAAAAbAAEAAAAFAAoAAAAbAAIAAAAIAAoAAAAbAAMAAAAHAAoAAAAbAAQAAAAAAAAAAAAbAAUAAAAFAAkAAAAbAAYAAAAAAAMAAAAbAAcAAAAAAAQAAAAbAAgAAAABAAcAAAAbAAkAAAABAAQAAAAbAAoAAAABAAUAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAACAAYAAAAbAA8AAAADAAoAAAAbABAAAAADAAcAAAAbABEAAAACAAkAAAAbABIAAAAEAAgAAAAbABMAAAAIAAkAAAAbABQAAAAIAAoAAAAbABUAAAAHAAkAAAAbABYAAAAIAAkAAAAbABcAAAAFAAkAAAAbABgAAAAIAAoAAAAbABkAAAAAAAAAAAAbABoAAAAAAAAAAAAbABsAAAABAAMAAAAbABwAAAABAAQAAAAbAB0AAAAAAAYAAAAbAB4AAAACAAUAAAAbAB8AAAABAAMAAAAbACAAAAABAAQAAAAbACEAAAABAAQAAAAbACIAAAABAAUAAAAbACMAAAAHAAoAAAAbACQAAAAFAAkAAAAbACUAAAABAAMAAAAbACYAAAABAAQAAAAbACcAAAABAAQAAAAbACgAAAABAAQAAAAbACkAAAABAAQAAAAbACoAAAABAAUAAAAbACsAAAAIAAoAAAAbACwAAAAIAAoAAAAbAC0AAAAHAAkAAAAbAC4AAAAIAAkAAAAbAC8AAAAAAAAAAAAbADAAAAACAAYAAAAbADEAAAACAAcAAAAbADIAAAACAAcAAAAbADMAAAADAAoAAAAcAPD/AAADAAcAAAAcAPH/AAADAAcAAAAcAPL/AAADAAcAAAAcAPP/AAADAAcAAAAcAPT/AAADAAcAAAAcAPX/AAAAAAEAAAAcAPb/AAADAAcAAAAcAPf/AAADAAcAAAAcAPj/AAADAAcAAAAcAPn/AAADAAcAAAAcAPr/AAADAAcAAAAcAPv/AAADAAcAAAAcAPz/AAADAAcAAAAcAP3/AAADAAcAAAAcAP7/AAADAAcAAAAcAP//AAAAAAEAAAAcAAAAAAADAAkAAAAcAAEAAAACAAgAAAAcAAIAAAAFAAoAAAAcAAMAAAAAAAAAAAAcAAQAAAAFAAkAAAAcAAUAAAAIAAkAAAAcAAYAAAABAAMAAAAcAAcAAAABAAQAAAAcAAgAAAABAAQAAAAcAAkAAAAAAAYAAAAcAAoAAAACAAUAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAACAAYAAAAcAA4AAAADAAoAAAAcAA8AAAADAAcAAAAcABAAAAADAAcAAAAcABEAAAADAAgAAAAcABIAAAAFAAoAAAAcABMAAAAIAAoAAAAcABQAAAAFAAoAAAAcABUAAAAFAAkAAAAcABYAAAAHAAoAAAAcABcAAAAHAAkAAAAcABgAAAAIAAkAAAAcABkAAAAIAAkAAAAcABoAAAAAAAMAAAAcABsAAAABAAcAAAAcABwAAAABAAQAAAAcAB0AAAABAAUAAAAcAB4AAAAFAAoAAAAcAB8AAAABAAMAAAAcACAAAAABAAQAAAAcACEAAAABAAQAAAAcACIAAAABAAUAAAAcACMAAAAFAAkAAAAcACQAAAAIAAkAAAAcACUAAAABAAMAAAAcACYAAAABAAQAAAAcACcAAAABAAQAAAAcACgAAAABAAQAAAAcACkAAAABAAQAAAAcACoAAAABAAUAAAAcACsAAAAHAAkAAAAcACwAAAAFAAkAAAAcAC0AAAAAAAAAAAAcAC4AAAAIAAoAAAAcAC8AAAACAAYAAAAcADAAAAADAAoAAAAcADEAAAADAAcAAAAcADIAAAADAAcAAAAcADMAAAADAAcAAAAdAPD/AAADAAcAAAAdAPH/AAADAAcAAAAdAPL/AAAAAAEAAAAdAPP/AAAAAAEAAAAdAPT/AAADAAcAAAAdAPX/AAADAAcAAAAdAPb/AAADAAcAAAAdAPf/AAAAAAEAAAAdAPj/AAAAAAEAAAAdAPn/AAADAAcAAAAdAPr/AAADAAcAAAAdAPv/AAAAAAEAAAAdAPz/AAADAAcAAAAdAP3/AAADAAcAAAAdAP7/AAADAAcAAAAdAP//AAADAAcAAAAdAAAAAAADAAcAAAAdAAEAAAADAAgAAAAdAAIAAAAHAAoAAAAdAAMAAAAHAAkAAAAdAAQAAAAHAAoAAAAdAAUAAAAFAAoAAAAdAAYAAAABAAMAAAAdAAcAAAABAAQAAAAdAAgAAAAAAAYAAAAdAAkAAAACAAUAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAADAAYAAAAdAA4AAAADAAcAAAAdAA8AAAADAAcAAAAdABAAAAACAAkAAAAdABEAAAAEAAgAAAAdABIAAAAHAAkAAAAdABMAAAAHAAkAAAAdABQAAAAFAAoAAAAdABUAAAAHAAkAAAAdABYAAAAHAAoAAAAdABcAAAAIAAkAAAAdABgAAAAHAAkAAAAdABkAAAAAAAMAAAAdABoAAAABAAcAAAAdABsAAAABAAQAAAAdABwAAAABAAQAAAAdAB0AAAABAAUAAAAdAB4AAAAAAAAAAAAdAB8AAAABAAMAAAAdACAAAAABAAQAAAAdACEAAAABAAQAAAAdACIAAAABAAUAAAAdACMAAAAFAAkAAAAdACQAAAAIAAkAAAAdACUAAAACAAMAAAAdACYAAAACAAQAAAAdACcAAAACAAQAAAAdACgAAAACAAQAAAAdACkAAAACAAQAAAAdACoAAAACAAUAAAAdACsAAAAHAAoAAAAdACwAAAAIAAoAAAAdAC0AAAAAAAAAAAAdAC4AAAACAAYAAAAdAC8AAAADAAoAAAAdADAAAAADAAcAAAAdADEAAAADAAcAAAAdADIAAAADAAcAAAAdADMAAAADAAcAAAAeAPD/AAAAAAEAAAAeAPH/AAAAAAEAAAAeAPL/AAADAAcAAAAeAPP/AAADAAcAAAAeAPT/AAADAAcAAAAeAPX/AAAAAAEAAAAeAPb/AAADAAcAAAAeAPf/AAAAAAEAAAAeAPj/AAAAAAEAAAAeAPn/AAAAAAEAAAAeAPr/AAADAAcAAAAeAPv/AAADAAcAAAAeAPz/AAAAAAEAAAAeAP3/AAADAAcAAAAeAP7/AAAAAAEAAAAeAP//AAADAAcAAAAeAAAAAAADAAcAAAAeAAEAAAADAAgAAAAeAAIAAAAHAAkAAAAeAAMAAAAHAAkAAAAeAAQAAAAIAAoAAAAeAAUAAAAHAAkAAAAeAAYAAAABAAMAAAAeAAcAAAABAAQAAAAeAAgAAAABAAUAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAACAAYAAAAeAA0AAAADAAoAAAAeAA4AAAADAAcAAAAeAA8AAAACAAkAAAAeABAAAAAEAAgAAAAeABEAAAAFAAoAAAAeABIAAAAHAAoAAAAeABMAAAAIAAoAAAAeABQAAAAFAAkAAAAeABUAAAAAAAAAAAAeABYAAAAIAAkAAAAeABcAAAAIAAkAAAAeABgAAAAAAAMAAAAeABkAAAABAAcAAAAeABoAAAABAAQAAAAeABsAAAABAAQAAAAeABwAAAAAAAYAAAAeAB0AAAACAAUAAAAeAB4AAAAFAAoAAAAeAB8AAAABAAMAAAAeACAAAAABAAQAAAAeACEAAAABAAQAAAAeACIAAAABAAUAAAAeACMAAAAFAAkAAAAeACQAAAAIAAoAAAAeACUAAAAIAAkAAAAeACYAAAAHAAkAAAAeACcAAAAIAAoAAAAeACgAAAAHAAkAAAAeACkAAAAFAAkAAAAeACoAAAAFAAkAAAAeACsAAAAHAAkAAAAeACwAAAAHAAoAAAAeAC0AAAACAAYAAAAeAC4AAAADAAoAAAAeAC8AAAADAAcAAAAeADAAAAADAAcAAAAeADEAAAADAAcAAAAeADIAAAADAAcAAAAeADMAAAADAAcAAAAfAPD/AAADAAcAAAAfAPH/AAAAAAEAAAAfAPL/AAADAAcAAAAfAPP/AAADAAcAAAAfAPT/AAADAAcAAAAfAPX/AAAAAAEAAAAfAPb/AAADAAcAAAAfAPf/AAAAAAEAAAAfAPj/AAADAAcAAAAfAPn/AAAAAAEAAAAfAPr/AAADAAcAAAAfAPv/AAADAAcAAAAfAPz/AAADAAcAAAAfAP3/AAADAAcAAAAfAP7/AAADAAcAAAAfAP//AAAAAAEAAAAfAAAAAAADAAcAAAAfAAEAAAADAAgAAAAfAAIAAAAFAAoAAAAfAAMAAAAFAAoAAAAfAAQAAAAIAAoAAAAfAAUAAAAHAAkAAAAfAAYAAAABAAMAAAAfAAcAAAABAAQAAAAfAAgAAAABAAUAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAADAAYAAAAfAA0AAAADAAcAAAAfAA4AAAADAAcAAAAfAA8AAAADAAgAAAAfABAAAAAFAAkAAAAfABEAAAAFAAkAAAAfABIAAAAIAAkAAAAfABMAAAAHAAkAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAIAAkAAAAfABcAAAAAAAAAAAAfABgAAAABAAMAAAAfABkAAAABAAQAAAAfABoAAAABAAQAAAAfABsAAAAAAAYAAAAfABwAAAACAAUAAAAfAB0AAAAAAAAAAAAfAB4AAAAFAAoAAAAfAB8AAAABAAMAAAAfACAAAAABAAQAAAAfACEAAAABAAQAAAAfACIAAAABAAUAAAAfACMAAAAFAAkAAAAfACQAAAAAAAAAAAAfACUAAAAAAAAAAAAfACYAAAAHAAkAAAAfACcAAAAHAAoAAAAfACgAAAAIAAkAAAAfACkAAAAIAAoAAAAfACoAAAAIAAoAAAAfACsAAAACAAYAAAAfACwAAAACAAcAAAAfAC0AAAADAAoAAAAfAC4AAAADAAcAAAAfAC8AAAADAAcAAAAfADAAAAADAAcAAAAfADEAAAADAAcAAAAfADIAAAAAAAEAAAAfADMAAAACAAkAAAAgAPD/AAADAAcAAAAgAPH/AAAAAAEAAAAgAPL/AAADAAcAAAAgAPP/AAADAAcAAAAgAPT/AAADAAcAAAAgAPX/AAAAAAEAAAAgAPb/AAADAAcAAAAgAPf/AAADAAcAAAAgAPj/AAADAAcAAAAgAPn/AAAAAAEAAAAgAPr/AAAAAAEAAAAgAPv/AAADAAcAAAAgAPz/AAAAAAEAAAAgAP3/AAADAAcAAAAgAP7/AAADAAcAAAAgAP//AAAAAAEAAAAgAAAAAAADAAcAAAAgAAEAAAADAAgAAAAgAAIAAAAFAAkAAAAgAAMAAAAFAAkAAAAgAAQAAAAIAAkAAAAgAAUAAAAIAAkAAAAgAAYAAAABAAMAAAAgAAcAAAABAAQAAAAgAAgAAAABAAYAAAAgAAkAAAAAAAUAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAADAAYAAAAgAA0AAAADAAcAAAAgAA4AAAACAAkAAAAgAA8AAAAEAAgAAAAgABAAAAAFAAoAAAAgABEAAAAAAAAAAAAgABIAAAAHAAkAAAAgABMAAAAIAAoAAAAgABQAAAAIAAoAAAAgABUAAAAFAAoAAAAgABYAAAAAAAAAAAAgABcAAAAAAAMAAAAgABgAAAABAAcAAAAgABkAAAABAAQAAAAgABoAAAAAAAYAAAAgABsAAAACAAUAAAAgABwAAAAFAAkAAAAgAB0AAAAFAAoAAAAgAB4AAAAHAAoAAAAgAB8AAAABAAMAAAAgACAAAAABAAQAAAAgACEAAAABAAQAAAAgACIAAAABAAUAAAAgACMAAAAHAAkAAAAgACQAAAAIAAkAAAAgACUAAAAFAAkAAAAgACYAAAAFAAkAAAAgACcAAAAFAAoAAAAgACgAAAAHAAoAAAAgACkAAAAHAAoAAAAgACoAAAACAAYAAAAgACsAAAADAAoAAAAgACwAAAAAAAEAAAAgAC0AAAADAAcAAAAgAC4AAAAAAAEAAAAgAC8AAAAAAAEAAAAgADAAAAADAAcAAAAgADEAAAADAAcAAAAgADIAAAACAAkAAAAgADMAAAAEAAgAAAAhAPD/AAADAAcAAAAhAPH/AAADAAcAAAAhAPL/AAADAAcAAAAhAPP/AAAAAAEAAAAhAPT/AAADAAcAAAAhAPX/AAAAAAEAAAAhAPb/AAADAAcAAAAhAPf/AAAAAAEAAAAhAPj/AAADAAcAAAAhAPn/AAADAAcAAAAhAPr/AAADAAcAAAAhAPv/AAADAAcAAAAhAPz/AAADAAcAAAAhAP3/AAADAAcAAAAhAP7/AAADAAcAAAAhAP//AAADAAcAAAAhAAAAAAADAAcAAAAhAAEAAAADAAgAAAAhAAIAAAAFAAkAAAAhAAMAAAAIAAoAAAAhAAQAAAAHAAoAAAAhAAUAAAAAAAAAAAAhAAYAAAABAAMAAAAhAAcAAAABAAQAAAAhAAgAAAABAAQAAAAhAAkAAAABAAUAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAADAAYAAAAhAA0AAAADAAcAAAAhAA4AAAADAAgAAAAhAA8AAAAIAAoAAAAhABAAAAAHAAkAAAAhABEAAAAIAAoAAAAhABIAAAAHAAoAAAAhABMAAAAFAAoAAAAhABQAAAAHAAoAAAAhABUAAAAFAAkAAAAhABYAAAAAAAMAAAAhABcAAAABAAcAAAAhABgAAAABAAQAAAAhABkAAAAAAAYAAAAhABoAAAACAAUAAAAhABsAAAAIAAkAAAAhABwAAAAIAAoAAAAhAB0AAAAIAAkAAAAhAB4AAAAIAAoAAAAhAB8AAAABAAMAAAAhACAAAAABAAQAAAAhACEAAAABAAQAAAAhACIAAAABAAUAAAAhACMAAAAIAAkAAAAhACQAAAAFAAoAAAAhACUAAAAFAAoAAAAhACYAAAAFAAoAAAAhACcAAAAHAAoAAAAhACgAAAAAAAAAAAAhACkAAAACAAYAAAAhACoAAAADAAoAAAAhACsAAAADAAcAAAAhACwAAAAAAAEAAAAhAC0AAAADAAcAAAAhAC4AAAAAAAEAAAAhAC8AAAADAAcAAAAhADAAAAADAAcAAAAhADEAAAACAAkAAAAhADIAAAAEAAgAAAAhADMAAAAIAAoAAAAiAPD/AAADAAcAAAAiAPH/AAADAAcAAAAiAPL/AAADAAcAAAAiAPP/AAADAAcAAAAiAPT/AAAAAAEAAAAiAPX/AAADAAcAAAAiAPb/AAADAAcAAAAiAPf/AAAAAAEAAAAiAPj/AAADAAcAAAAiAPn/AAADAAcAAAAiAPr/AAAAAAEAAAAiAPv/AAADAAcAAAAiAPz/AAADAAcAAAAiAP3/AAADAAcAAAAiAP7/AAADAAcAAAAiAP//AAADAAcAAAAiAAAAAAAAAAEAAAAiAAEAAAADAAgAAAAiAAIAAAAIAAoAAAAiAAMAAAAAAAAAAAAiAAQAAAAIAAkAAAAiAAUAAAAFAAoAAAAiAAYAAAABAAMAAAAiAAcAAAABAAQAAAAiAAgAAAABAAQAAAAiAAkAAAABAAUAAAAiAAoAAAAAAAAAAAAiAAsAAAACAAYAAAAiAAwAAAADAAoAAAAiAA0AAAADAAcAAAAiAA4AAAADAAgAAAAiAA8AAAAFAAkAAAAiABAAAAAHAAoAAAAiABEAAAAFAAkAAAAiABIAAAAIAAkAAAAiABMAAAAIAAoAAAAiABQAAAAHAAkAAAAiABUAAAAAAAAAAAAiABYAAAABAAMAAAAiABcAAAABAAQAAAAiABgAAAABAAQAAAAiABkAAAABAAUAAAAiABoAAAAHAAkAAAAiABsAAAAFAAoAAAAiABwAAAAFAAkAAAAiAB0AAAAFAAoAAAAiAB4AAAAIAAoAAAAiAB8AAAABAAMAAAAiACAAAAABAAQAAAAiACEAAAABAAQAAAAiACIAAAABAAUAAAAiACMAAAAHAAoAAAAiACQAAAAHAAoAAAAiACUAAAAHAAoAAAAiACYAAAAFAAoAAAAiACcAAAAFAAkAAAAiACgAAAACAAYAAAAiACkAAAADAAoAAAAiACoAAAAAAAEAAAAiACsAAAADAAcAAAAiACwAAAAAAAEAAAAiAC0AAAADAAcAAAAiAC4AAAADAAcAAAAiAC8AAAACAAkAAAAiADAAAAAEAAcAAAAiADEAAAAEAAgAAAAiADIAAAAFAAoAAAAiADMAAAAFAAkAAAAjAPD/AAADAAcAAAAjAPH/AAADAAcAAAAjAPL/AAAAAAEAAAAjAPP/AAADAAcAAAAjAPT/AAAAAAEAAAAjAPX/AAAAAAEAAAAjAPb/AAADAAcAAAAjAPf/AAADAAcAAAAjAPj/AAADAAcAAAAjAPn/AAADAAcAAAAjAPr/AAADAAcAAAAjAPv/AAAAAAEAAAAjAPz/AAADAAcAAAAjAP3/AAADAAcAAAAjAP7/AAADAAcAAAAjAP//AAADAAcAAAAjAAAAAAADAAcAAAAjAAEAAAADAAgAAAAjAAIAAAAHAAoAAAAjAAMAAAAHAAkAAAAjAAQAAAAIAAkAAAAjAAUAAAAIAAkAAAAjAAYAAAACAAMAAAAjAAcAAAAAAAcAAAAjAAgAAAABAAQAAAAjAAkAAAABAAUAAAAjAAoAAAACAAcAAAAjAAsAAAADAAoAAAAjAAwAAAADAAcAAAAjAA0AAAADAAcAAAAjAA4AAAALAA0AAAAjAA8AAAAAAAQAAAAjABAAAAAAAAQAAAAjABEAAAAAAAUAAAAjABIAAAAFAAkAAAAjABMAAAAIAAkAAAAjABQAAAAIAAkAAAAjABUAAAAHAAkAAAAjABYAAAABAAMAAAAjABcAAAABAAQAAAAjABgAAAAAAAYAAAAjABkAAAACAAUAAAAjABoAAAAFAAkAAAAjABsAAAAHAAkAAAAjABwAAAAFAAkAAAAjAB0AAAAHAAoAAAAjAB4AAAAIAAoAAAAjAB8AAAABAAMAAAAjACAAAAABAAQAAAAjACEAAAABAAQAAAAjACIAAAABAAUAAAAjACMAAAAAAAAAAAAjACQAAAAAAAAAAAAjACUAAAAHAAkAAAAjACYAAAAAAAAAAAAjACcAAAAFAAoAAAAjACgAAAADAAYAAAAjACkAAAADAAcAAAAjACoAAAAAAAEAAAAjACsAAAADAAcAAAAjACwAAAADAAcAAAAjAC0AAAADAAcAAAAjAC4AAAACAAkAAAAjAC8AAAAEAAgAAAAjADAAAAAHAAoAAAAjADEAAAAIAAoAAAAjADIAAAAIAAkAAAAjADMAAAAFAAkAAAAkAPD/AAADAAcAAAAkAPH/AAADAAcAAAAkAPL/AAADAAcAAAAkAPP/AAAAAAEAAAAkAPT/AAAAAAEAAAAkAPX/AAADAAcAAAAkAPb/AAADAAcAAAAkAPf/AAAAAAEAAAAkAPj/AAADAAcAAAAkAPn/AAADAAcAAAAkAPr/AAADAAcAAAAkAPv/AAADAAcAAAAkAPz/AAADAAcAAAAkAP3/AAADAAcAAAAkAP7/AAADAAcAAAAkAP//AAADAAcAAAAkAAAAAAADAAcAAAAkAAEAAAADAAgAAAAkAAIAAAAHAAkAAAAkAAMAAAAAAAAAAAAkAAQAAAAIAAkAAAAkAAUAAAAIAAoAAAAkAAYAAAAIAAkAAAAkAAcAAAABAAMAAAAkAAgAAAABAAQAAAAkAAkAAAAQAAYAAAAkAAwAAAAAAAEAAAAkAA0AAAAAAAEAAAAkAA4AAAAQAAgAAAAkAA8AAAABAAQAAAAkABAAAAABAAQAAAAkABEAAAABAAYAAAAkABIAAAAAAAUAAAAkABMAAAAFAAoAAAAkABQAAAAFAAoAAAAkABUAAAAIAAkAAAAkABYAAAABAAMAAAAkABcAAAABAAQAAAAkABgAAAABAAUAAAAkABkAAAAFAAkAAAAkABoAAAAAAAAAAAAkABsAAAAHAAkAAAAkABwAAAAFAAoAAAAkAB0AAAAIAAoAAAAkAB4AAAAHAAoAAAAkAB8AAAABAAMAAAAkACAAAAABAAQAAAAkACEAAAABAAQAAAAkACIAAAABAAUAAAAkACMAAAAHAAkAAAAkACQAAAAHAAkAAAAkACUAAAAAAAAAAAAkACYAAAACAAYAAAAkACcAAAACAAcAAAAkACgAAAADAAoAAAAkACkAAAADAAcAAAAkACoAAAADAAcAAAAkACsAAAADAAcAAAAkACwAAAADAAcAAAAkAC0AAAADAAcAAAAkAC4AAAADAAgAAAAkAC8AAAAIAAoAAAAkADAAAAAIAAoAAAAkADEAAAAHAAkAAAAkADIAAAAFAAoAAAAkADMAAAAIAAoAAAAlAPD/AAADAAcAAAAlAPH/AAADAAcAAAAlAPL/AAADAAcAAAAlAPP/AAAAAAEAAAAlAPT/AAADAAcAAAAlAPX/AAADAAcAAAAlAPb/AAADAAcAAAAlAPf/AAADAAcAAAAlAPj/AAADAAcAAAAlAPn/AAADAAcAAAAlAPr/AAADAAcAAAAlAPv/AAADAAcAAAAlAPz/AAADAAcAAAAlAP3/AAADAAcAAAAlAP7/AAADAAcAAAAlAP//AAADAAcAAAAlAAAAAAACAAkAAAAlAAEAAAAEAAgAAAAlAAIAAAAHAAoAAAAlAAMAAAAIAAkAAAAlAAQAAAAFAAoAAAAlAAUAAAAFAAkAAAAlAAYAAAAAAAAAAAAlAAcAAAABAAMAAAAlAAgAAAABAAQAAAAlAAkAAAAQAAYAAAAlAA0AAAADAAcAAAAlAA4AAAAQAAgAAAAlAA8AAAABAAQAAAAlABAAAAABAAQAAAAlABEAAAABAAQAAAAlABIAAAABAAYAAAAlABMAAAAAAAQAAAAlABQAAAAAAAUAAAAlABUAAAAAAAMAAAAlABYAAAABAAcAAAAlABcAAAABAAQAAAAlABgAAAABAAUAAAAlABkAAAAHAAkAAAAlABoAAAAFAAoAAAAlABsAAAAIAAoAAAAlABwAAAAIAAkAAAAlAB0AAAAIAAkAAAAlAB4AAAAHAAkAAAAlAB8AAAABAAMAAAAlACAAAAABAAQAAAAlACEAAAABAAQAAAAlACIAAAABAAUAAAAlACMAAAAHAAoAAAAlACQAAAAIAAkAAAAlACUAAAACAAYAAAAlACYAAAADAAoAAAAlACcAAAAAAAEAAAAlACgAAAAAAAEAAAAlACkAAAADAAcAAAAlACoAAAADAAcAAAAlACsAAAADAAcAAAAlACwAAAADAAcAAAAlAC0AAAADAAcAAAAlAC4AAAADAAgAAAAlAC8AAAAHAAoAAAAlADAAAAAIAAkAAAAlADEAAAAHAAkAAAAlADIAAAAIAAkAAAAlADMAAAAFAAkAAAAmAPD/AAADAAcAAAAmAPH/AAADAAcAAAAmAPL/AAADAAcAAAAmAPP/AAADAAcAAAAmAPT/AAAAAAEAAAAmAPX/AAADAAcAAAAmAPb/AAAAAAEAAAAmAPf/AAADAAcAAAAmAPj/AAADAAcAAAAmAPn/AAAAAAEAAAAmAPr/AAAAAAEAAAAmAPv/AAADAAcAAAAmAPz/AAADAAcAAAAmAP3/AAADAAcAAAAmAP7/AAADAAcAAAAmAP//AAACAAkAAAAmAAAAAAAEAAgAAAAmAAEAAAAFAAoAAAAmAAIAAAAFAAkAAAAmAAMAAAAFAAkAAAAmAAQAAAAIAAkAAAAmAAUAAAAIAAkAAAAmAAYAAAAHAAkAAAAmAAcAAAABAAMAAAAmAAgAAAABAAQAAAAmAAkAAAAQAAYAAAAmAA0AAAADAAcAAAAmAA4AAAAKAA0AAAAmAA8AAAACAAQAAAAmABAAAAAAAAcAAAAmABEAAAABAAQAAAAmABIAAAABAAQAAAAmABMAAAABAAQAAAAmABQAAAABAAYAAAAmABUAAAABAAcAAAAmABYAAAABAAQAAAAmABcAAAABAAQAAAAmABgAAAABAAUAAAAmABkAAAAFAAoAAAAmABoAAAAHAAkAAAAmABsAAAAIAAoAAAAmABwAAAAFAAoAAAAmAB0AAAAFAAkAAAAmAB4AAAAAAAAAAAAmAB8AAAABAAMAAAAmACAAAAABAAQAAAAmACEAAAABAAQAAAAmACIAAAABAAUAAAAmACMAAAAIAAoAAAAmACQAAAACAAYAAAAmACUAAAADAAoAAAAmACYAAAAAAAEAAAAmACcAAAADAAcAAAAmACgAAAADAAcAAAAmACkAAAADAAcAAAAmACoAAAADAAcAAAAmACsAAAADAAcAAAAmACwAAAADAAcAAAAmAC0AAAACAAkAAAAmAC4AAAAEAAgAAAAmAC8AAAAFAAkAAAAmADAAAAAHAAkAAAAmADEAAAAHAAoAAAAmADIAAAAHAAkAAAAmADMAAAAIAAkAAAAnAPD/AAADAAcAAAAnAPH/AAADAAcAAAAnAPL/AAADAAcAAAAnAPP/AAAAAAEAAAAnAPT/AAAAAAEAAAAnAPX/AAADAAcAAAAnAPb/AAADAAcAAAAnAPf/AAADAAcAAAAnAPj/AAADAAcAAAAnAPn/AAADAAcAAAAnAPr/AAADAAcAAAAnAPv/AAADAAcAAAAnAPz/AAADAAcAAAAnAP3/AAADAAcAAAAnAP7/AAADAAcAAAAnAP//AAADAAgAAAAnAAAAAAAAAAAAAAAnAAEAAAAHAAkAAAAnAAIAAAAAAAAAAAAnAAMAAAAIAAkAAAAnAAQAAAAHAAoAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAMAAAAnAAcAAAABAAcAAAAnAAgAAAABAAQAAAAnAAkAAAAQAAYAAAAnAAwAAAAAAAEAAAAnAA0AAAACAAkAAAAnAA4AAAAEAAgAAAAnAA8AAAAAAAAAAAAnABAAAAACAAMAAAAnABEAAAACAAQAAAAnABIAAAAAAAcAAAAnABMAAAABAAQAAAAnABQAAAABAAQAAAAnABUAAAABAAQAAAAnABYAAAABAAQAAAAnABcAAAAAAAYAAAAnABgAAAACAAUAAAAnABkAAAAFAAkAAAAnABoAAAAIAAkAAAAnABsAAAAFAAkAAAAnABwAAAAHAAoAAAAnAB0AAAAFAAoAAAAnAB4AAAAIAAkAAAAnAB8AAAABAAMAAAAnACAAAAABAAQAAAAnACEAAAABAAQAAAAnACIAAAABAAUAAAAnACMAAAACAAcAAAAnACQAAAADAAoAAAAnACUAAAAAAAEAAAAnACYAAAADAAcAAAAnACcAAAADAAcAAAAnACgAAAADAAcAAAAnACkAAAADAAcAAAAnACoAAAADAAcAAAAnACsAAAADAAcAAAAnACwAAAAAAAEAAAAnAC0AAAADAAgAAAAnAC4AAAAAAAAAAAAnAC8AAAAIAAkAAAAnADAAAAAIAAkAAAAnADEAAAAFAAoAAAAnADIAAAAHAAoAAAAnADMAAAAAAAAAAAAoAPD/AAADAAcAAAAoAPH/AAAAAAEAAAAoAPL/AAADAAcAAAAoAPP/AAADAAcAAAAoAPT/AAADAAcAAAAoAPX/AAADAAcAAAAoAPb/AAADAAcAAAAoAPf/AAADAAcAAAAoAPj/AAAAAAEAAAAoAPn/AAAAAAEAAAAoAPr/AAAAAAEAAAAoAPv/AAADAAcAAAAoAPz/AAADAAcAAAAoAP3/AAAAAAEAAAAoAP7/AAADAAcAAAAoAP//AAADAAgAAAAoAAAAAAAIAAoAAAAoAAEAAAAHAAkAAAAoAAIAAAAFAAkAAAAoAAMAAAAAAAMAAAAoAAQAAAAAAAQAAAAoAAUAAAAAAAQAAAAoAAYAAAABAAcAAAAoAAcAAAABAAQAAAAoAAgAAAAPAAYAAAAoAAkAAAAQAAoAAAAoAAoAAAAAAAEAAAAoAAwAAAADAAcAAAAoAA0AAAADAAgAAAAoAA4AAAAHAAkAAAAoAA8AAAAFAAkAAAAoABAAAAAFAAoAAAAoABEAAAAFAAoAAAAoABIAAAACAAMAAAAoABMAAAACAAQAAAAoABQAAAACAAQAAAAoABUAAAACAAQAAAAoABYAAAACAAQAAAAoABcAAAACAAUAAAAoABgAAAAFAAkAAAAoABkAAAAIAAkAAAAoABoAAAAFAAkAAAAoABsAAAAFAAkAAAAoABwAAAAIAAoAAAAoAB0AAAAIAAkAAAAoAB4AAAAIAAkAAAAoAB8AAAABAAMAAAAoACAAAAABAAQAAAAoACEAAAAPAAYAAAAoACIAAAAJAA0AAAAoACMAAAADAAcAAAAoACQAAAAAAAEAAAAoACUAAAADAAcAAAAoACYAAAADAAcAAAAoACcAAAADAAcAAAAoACgAAAAAAAEAAAAoACkAAAADAAcAAAAoACoAAAADAAcAAAAoACsAAAADAAcAAAAoACwAAAACAAkAAAAoAC0AAAAEAAgAAAAoAC4AAAAHAAoAAAAoAC8AAAAFAAkAAAAoADAAAAAHAAkAAAAoADEAAAAHAAkAAAAoADIAAAAFAAoAAAAoADMAAAAFAAkAAAApAPD/AAAAAAEAAAApAPH/AAAAAAEAAAApAPL/AAADAAcAAAApAPP/AAADAAcAAAApAPT/AAADAAcAAAApAPX/AAADAAcAAAApAPb/AAADAAcAAAApAPf/AAADAAcAAAApAPr/AAADAAcAAAApAPv/AAADAAcAAAApAPz/AAADAAcAAAApAP3/AAADAAcAAAApAP7/AAADAAcAAAApAP//AAADAAkAAAApAAAAAAACAAgAAAApAAEAAAAFAAoAAAApAAIAAAAAAAAAAAApAAMAAAABAAMAAAApAAQAAAABAAQAAAApAAUAAAABAAQAAAApAAYAAAABAAQAAAApAAcAAAABAAQAAAApAAgAAAAQAAYAAAApAAkAAAAAAAEAAAApAAoAAAADAAcAAAApAAsAAAACAAkAAAApAAwAAAAEAAcAAAApAA0AAAAEAAgAAAApAA4AAAAIAAkAAAApAA8AAAAIAAoAAAApABAAAAAAAAAAAAApABEAAAAIAAkAAAApABIAAAAFAAoAAAApABMAAAAAAAAAAAApABQAAAAIAAkAAAApABUAAAAIAAoAAAApABYAAAAIAAkAAAApABcAAAAIAAoAAAApABgAAAAAAAAAAAApABkAAAAFAAoAAAApABoAAAAIAAkAAAApABsAAAAHAAoAAAApABwAAAAAAAAAAAApAB0AAAAHAAkAAAApAB4AAAAFAAoAAAApAB8AAAABAAMAAAApACAAAAABAAQAAAApACEAAAAQAAYAAAApACIAAAADAAcAAAApACMAAAADAAcAAAApACQAAAADAAcAAAApACUAAAADAAcAAAApACYAAAACAAkAAAApACcAAAACAAoAAAApACgAAAADAAcAAAApACkAAAADAAcAAAApACoAAAACAAkAAAApACsAAAAEAAcAAAApACwAAAAEAAgAAAApAC0AAAAIAAkAAAApAC4AAAAHAAkAAAApAC8AAAAIAAkAAAApADAAAAAHAAoAAAApADEAAAAIAAoAAAApADIAAAAHAAkAAAApADMAAAAAAAAAAAAqAPD/AAADAAcAAAAqAPH/AAADAAcAAAAqAPL/AAADAAcAAAAqAPP/AAAAAAEAAAAqAPT/AAADAAcAAAAqAPX/AAADAAcAAAAqAPb/AAADAAcAAAAqAPf/AAADAAcAAAAqAPr/AAAAAAEAAAAqAPv/AAADAAcAAAAqAPz/AAADAAcAAAAqAP3/AAADAAcAAAAqAP7/AAADAAcAAAAqAP//AAAAAAEAAAAqAAAAAAADAAgAAAAqAAEAAAAFAAkAAAAqAAIAAAAFAAoAAAAqAAMAAAABAAMAAAAqAAQAAAABAAQAAAAqAAUAAAAAAAYAAAAqAAYAAAAAAAcAAAAqAAcAAAABAAQAAAAqAAgAAAAQAAYAAAAqAAkAAAADAAcAAAAqAAoAAAADAAcAAAAqAAsAAAADAAgAAAAqAAwAAAAAAAAAAAAqAA0AAAAFAAoAAAAqAA4AAAAHAAoAAAAqAA8AAAAFAAoAAAAqABAAAAAHAAoAAAAqABEAAAAAAAAAAAAqABIAAAAHAAkAAAAqABMAAAAIAAkAAAAqABQAAAAIAAkAAAAqABUAAAAFAAkAAAAqABYAAAAAAAAAAAAqABcAAAAHAAoAAAAqABgAAAAIAAkAAAAqABkAAAAHAAkAAAAqABoAAAAFAAkAAAAqABsAAAAFAAoAAAAqABwAAAAHAAkAAAAqAB0AAAAAAAAAAAAqAB4AAAAIAAoAAAAqAB8AAAABAAMAAAAqACAAAAABAAQAAAAqACEAAAAQAAYAAAAqACIAAAADAAcAAAAqACMAAAADAAcAAAAqACQAAAAAAAEAAAAqACUAAAADAAcAAAAqACYAAAADAAgAAAAqACcAAAAEAAYAAAAqACgAAAAEAAcAAAAqACkAAAAEAAcAAAAqACoAAAAEAAgAAAAqACsAAAAFAAoAAAAqACwAAAAFAAkAAAAqAC0AAAAHAAkAAAAqAC4AAAAIAAkAAAAqAC8AAAAFAAoAAAAqADAAAAAIAAoAAAAqADEAAAAAAAAAAAAqADIAAAAHAAkAAAAqADMAAAAIAAoAAAArAPD/AAADAAcAAAArAPH/AAADAAcAAAArAPL/AAADAAcAAAArAPP/AAADAAcAAAArAPT/AAAAAAEAAAArAPX/AAADAAcAAAArAPb/AAAAAAEAAAArAPf/AAADAAcAAAArAPj/AAAAAAEAAAArAPn/AAAAAAEAAAArAPr/AAADAAcAAAArAPv/AAAAAAEAAAArAPz/AAADAAcAAAArAP3/AAAAAAEAAAArAP7/AAADAAcAAAArAP//AAADAAcAAAArAAAAAAADAAkAAAArAAEAAAACAAgAAAArAAIAAAAIAAkAAAArAAMAAAABAAMAAAArAAQAAAABAAQAAAArAAUAAAABAAYAAAArAAYAAAABAAcAAAArAAcAAAAPAAYAAAArAAgAAAAQAAoAAAArAAkAAAADAAcAAAArAAoAAAACAAkAAAArAAsAAAAEAAgAAAArAAwAAAAHAAoAAAArAA0AAAAHAAoAAAArAA4AAAAFAAoAAAArAA8AAAAFAAoAAAArABAAAAAHAAkAAAArABEAAAAIAAkAAAArABIAAAAAAAAAAAArABMAAAAAAAAAAAArABQAAAAIAAkAAAArABUAAAAAAAAAAAArABYAAAAAAAAAAAArABcAAAAHAAoAAAArABgAAAAAAAAAAAArABkAAAAHAAkAAAArABoAAAAAAAAAAAArABsAAAAHAAoAAAArABwAAAAFAAkAAAArAB0AAAAFAAoAAAArAB4AAAAIAAkAAAArAB8AAAABAAMAAAArACAAAAABAAQAAAArACEAAAAQAAYAAAArACIAAAADAAcAAAArACMAAAADAAcAAAArACQAAAACAAkAAAArACUAAAAEAAcAAAArACYAAAAEAAgAAAArACcAAAAHAAkAAAArACgAAAAIAAoAAAArACkAAAAIAAkAAAArACoAAAAFAAoAAAArACsAAAAIAAkAAAArACwAAAAFAAoAAAArAC0AAAAFAAkAAAArAC4AAAAHAAoAAAArAC8AAAAHAAkAAAArADAAAAAHAAkAAAArADEAAAAFAAkAAAArADIAAAAFAAkAAAArADMAAAAFAAoAAAAsAPD/AAADAAcAAAAsAPH/AAADAAcAAAAsAPL/AAADAAcAAAAsAPP/AAAAAAEAAAAsAPT/AAADAAcAAAAsAPX/AAADAAcAAAAsAPb/AAADAAcAAAAsAPf/AAADAAcAAAAsAPj/AAADAAcAAAAsAPn/AAADAAcAAAAsAPr/AAAAAAEAAAAsAPv/AAADAAcAAAAsAPz/AAADAAcAAAAsAP3/AAADAAcAAAAsAP7/AAAAAAEAAAAsAP//AAAAAAEAAAAsAAAAAAADAAcAAAAsAAEAAAADAAgAAAAsAAIAAAAIAAoAAAAsAAMAAAABAAMAAAAsAAQAAAABAAQAAAAsAAUAAAABAAQAAAAsAAYAAAAPAAYAAAAsAAcAAAAQAAoAAAAsAAgAAAADAAcAAAAsAAkAAAADAAcAAAAsAAoAAAADAAgAAAAsAAsAAAAFAAoAAAAsAAwAAAAHAAkAAAAsAA0AAAAFAAkAAAAsAA4AAAAIAAkAAAAsAA8AAAAIAAkAAAAsABAAAAAFAAoAAAAsABEAAAAFAAoAAAAsABIAAAAAAAAAAAAsABMAAAAFAAkAAAAsABQAAAAFAAoAAAAsABUAAAAHAAkAAAAsABYAAAAHAAoAAAAsABcAAAAIAAoAAAAsABgAAAAFAAoAAAAsABkAAAAAAAAAAAAsABoAAAAIAAoAAAAsABsAAAAFAAkAAAAsABwAAAAFAAkAAAAsAB0AAAAHAAoAAAAsAB4AAAAAAAAAAAAsAB8AAAABAAMAAAAsACAAAAABAAQAAAAsACEAAAARAAYAAAAsACIAAAAIAA0AAAAsACMAAAAEAAcAAAAsACQAAAAEAAgAAAAsACUAAAAHAAkAAAAsACYAAAAFAAoAAAAsACcAAAAFAAkAAAAsACgAAAAFAAkAAAAsACkAAAAFAAkAAAAsACoAAAAAAAAAAAAsACsAAAAFAAoAAAAsACwAAAAFAAoAAAAsAC0AAAAHAAoAAAAsAC4AAAAIAAoAAAAsAC8AAAAHAAoAAAAsADAAAAAFAAoAAAAsADEAAAAFAAkAAAAsADIAAAAHAAkAAAAsADMAAAAIAAkAAAAtAPD/AAADAAcAAAAtAPH/AAADAAcAAAAtAPL/AAADAAcAAAAtAPP/AAADAAcAAAAtAPT/AAADAAcAAAAtAPX/AAADAAcAAAAtAPb/AAADAAcAAAAtAPf/AAADAAcAAAAtAPj/AAADAAcAAAAtAPn/AAADAAcAAAAtAPr/AAADAAcAAAAtAPv/AAADAAcAAAAtAPz/AAADAAcAAAAtAP3/AAAAAAEAAAAtAP7/AAADAAcAAAAtAP//AAADAAcAAAAtAAAAAAADAAcAAAAtAAEAAAADAAgAAAAtAAIAAAAHAAkAAAAtAAMAAAACAAMAAAAtAAQAAAACAAQAAAAtAAUAAAAAAAcAAAAtAAYAAAAQAAoAAAAtAAcAAAADAAcAAAAtAAgAAAADAAcAAAAtAAkAAAACAAkAAAAtAAoAAAAEAAgAAAAtAAsAAAAIAAkAAAAtAAwAAAAHAAkAAAAtAA0AAAAFAAkAAAAtAA4AAAAIAAoAAAAtAA8AAAAIAAkAAAAtABAAAAAFAAoAAAAtABEAAAAFAAoAAAAtABIAAAAHAAoAAAAtABMAAAAFAAkAAAAtABQAAAAHAAkAAAAtABUAAAAIAAkAAAAtABYAAAAHAAoAAAAtABcAAAAHAAkAAAAtABgAAAAAAAAAAAAtABkAAAAAAAAAAAAtABoAAAAHAAkAAAAtABsAAAAHAAkAAAAtABwAAAAAAAAAAAAtAB0AAAAFAAoAAAAtAB4AAAAHAAkAAAAtAB8AAAABAAMAAAAtACAAAAABAAQAAAAtACEAAAABAAQAAAAtACIAAAABAAUAAAAtACMAAAAFAAkAAAAtACQAAAAIAAkAAAAtACUAAAAFAAoAAAAtACYAAAAHAAoAAAAtACcAAAAFAAoAAAAtACgAAAAIAAoAAAAtACkAAAAHAAoAAAAtACoAAAAHAAoAAAAtACsAAAAAAAAAAAAtACwAAAAFAAkAAAAtAC0AAAAHAAoAAAAtAC4AAAAHAAoAAAAtAC8AAAAHAAkAAAAtADAAAAAFAAkAAAAtADEAAAAIAAoAAAAtADIAAAAIAAoAAAAtADMAAAAIAAkAAAAuAPD/AAADAAcAAAAuAPH/AAADAAcAAAAuAPL/AAADAAcAAAAuAPP/AAADAAcAAAAuAPT/AAAAAAEAAAAuAPX/AAADAAcAAAAuAPb/AAAAAAEAAAAuAPf/AAADAAcAAAAuAPj/AAADAAcAAAAuAPn/AAAAAAEAAAAuAPr/AAADAAcAAAAuAPv/AAAAAAEAAAAuAPz/AAADAAcAAAAuAP3/AAADAAcAAAAuAP7/AAADAAcAAAAuAP//AAADAAcAAAAuAAAAAAADAAcAAAAuAAEAAAADAAgAAAAuAAIAAAAIAAoAAAAuAAMAAAACAAYAAAAuAAQAAAACAAcAAAAuAAUAAAAAAAEAAAAuAAYAAAADAAcAAAAuAAcAAAADAAcAAAAuAAgAAAACAAkAAAAuAAkAAAAEAAgAAAAuAAoAAAAIAAoAAAAuAAsAAAAIAAkAAAAuAAwAAAAFAAoAAAAuAA0AAAAHAAoAAAAuAA4AAAAHAAoAAAAuAA8AAAAIAAoAAAAuABAAAAAFAAkAAAAuABEAAAAIAAoAAAAuABIAAAAIAAoAAAAuABMAAAAFAAkAAAAuABQAAAAIAAkAAAAuABUAAAAIAAkAAAAuABYAAAAIAAoAAAAuABcAAAAHAAkAAAAuABgAAAAFAAoAAAAuABkAAAAIAAoAAAAuABoAAAAAAAAAAAAuABsAAAAFAAkAAAAuABwAAAAIAAoAAAAuAB0AAAAHAAoAAAAuAB4AAAAFAAkAAAAuAB8AAAABAAMAAAAuACAAAAABAAQAAAAuACEAAAABAAQAAAAuACIAAAABAAYAAAAuACMAAAAAAAQAAAAuACQAAAAAAAQAAAAuACUAAAAAAAQAAAAuACYAAAAAAAQAAAAuACcAAAAAAAQAAAAuACgAAAAAAAQAAAAuACkAAAAAAAQAAAAuACoAAAAAAAQAAAAuACsAAAAAAAQAAAAuACwAAAAAAAQAAAAuAC0AAAAAAAQAAAAuAC4AAAAAAAQAAAAuAC8AAAAAAAQAAAAuADAAAAAAAAQAAAAuADEAAAAAAAQAAAAuADIAAAAAAAQAAAAuADMAAAALAA4AAAAvAPD/AAADAAcAAAAvAPH/AAADAAcAAAAvAPL/AAAAAAEAAAAvAPP/AAAAAAEAAAAvAPT/AAADAAcAAAAvAPX/AAADAAcAAAAvAPb/AAADAAcAAAAvAPf/AAADAAcAAAAvAPj/AAADAAcAAAAvAPn/AAADAAcAAAAvAPr/AAADAAcAAAAvAPv/AAAAAAEAAAAvAPz/AAAAAAEAAAAvAP3/AAADAAcAAAAvAP7/AAADAAcAAAAvAP//AAADAAcAAAAvAAAAAAAAAAEAAAAvAAEAAAADAAkAAAAvAAIAAAACAAcAAAAvAAMAAAADAAoAAAAvAAQAAAADAAcAAAAvAAUAAAADAAcAAAAvAAYAAAACAAkAAAAvAAcAAAAEAAcAAAAvAAgAAAAEAAgAAAAvAAkAAAAFAAkAAAAvAAoAAAAHAAkAAAAvAAsAAAAIAAkAAAAvAAwAAAAIAAoAAAAvAA0AAAAAAAAAAAAvAA4AAAAFAAkAAAAvAA8AAAAFAAkAAAAvABAAAAAFAAkAAAAvABEAAAAFAAoAAAAvABIAAAAHAAoAAAAvABMAAAAHAAoAAAAvABQAAAAFAAkAAAAvABUAAAAIAAkAAAAvABYAAAAFAAoAAAAvABcAAAAFAAoAAAAvABgAAAAFAAoAAAAvABkAAAAHAAkAAAAvABoAAAAIAAoAAAAvABsAAAAIAAkAAAAvABwAAAAHAAkAAAAvAB0AAAAIAAkAAAAvAB4AAAAIAAoAAAAvAB8AAAABAAMAAAAvACAAAAABAAQAAAAvACEAAAABAAQAAAAvACIAAAABAAQAAAAvACMAAAABAAQAAAAvACQAAAABAAQAAAAvACUAAAABAAQAAAAvACYAAAABAAQAAAAvACcAAAABAAQAAAAvACgAAAABAAQAAAAvACkAAAABAAQAAAAvACoAAAABAAQAAAAvACsAAAABAAQAAAAvACwAAAABAAQAAAAvAC0AAAABAAQAAAAvAC4AAAABAAQAAAAvAC8AAAABAAQAAAAvADAAAAABAAQAAAAvADEAAAABAAQAAAAvADIAAAABAAQAAAAvADMAAAAQAAYAAAAwAPD/AAADAAcAAAAwAPH/AAADAAcAAAAwAPL/AAAAAAEAAAAwAPP/AAAAAAEAAAAwAPT/AAAAAAEAAAAwAPX/AAADAAcAAAAwAPb/AAADAAcAAAAwAPf/AAADAAcAAAAwAPj/AAADAAcAAAAwAPn/AAAAAAEAAAAwAPr/AAADAAcAAAAwAPv/AAAAAAEAAAAwAPz/AAAAAAEAAAAwAP3/AAADAAcAAAAwAP7/AAADAAcAAAAwAP//AAADAAcAAAAwAAAAAAADAAcAAAAwAAEAAAADAAcAAAAwAAIAAAAAAAEAAAAwAAMAAAADAAcAAAAwAAQAAAADAAcAAAAwAAUAAAACAAkAAAAwAAYAAAAEAAgAAAAwAAcAAAAIAAoAAAAwAAgAAAAFAAoAAAAwAAkAAAAAAAAAAAAwAAoAAAAIAAkAAAAwAAsAAAAIAAkAAAAwAAwAAAAIAAoAAAAwAA0AAAAHAAoAAAAwAA4AAAAFAAkAAAAwAA8AAAAIAAkAAAAwABAAAAAIAAkAAAAwABEAAAAFAAkAAAAwABIAAAAFAAkAAAAwABMAAAAHAAkAAAAwABQAAAAIAAkAAAAwABUAAAAFAAkAAAAwABYAAAAFAAoAAAAwABcAAAAFAAkAAAAwABgAAAAIAAoAAAAwABkAAAAAAAAAAAAwABoAAAAHAAkAAAAwABsAAAAFAAoAAAAwABwAAAAAAAAAAAAwAB0AAAAIAAoAAAAwAB4AAAAIAAkAAAAwAB8AAAABAAMAAAAwACAAAAABAAQAAAAwACEAAAABAAQAAAAwACIAAAABAAQAAAAwACMAAAABAAQAAAAwACQAAAABAAQAAAAwACUAAAABAAQAAAAwACYAAAABAAQAAAAwACcAAAABAAQAAAAwACgAAAABAAQAAAAwACkAAAABAAQAAAAwACoAAAABAAQAAAAwACsAAAABAAQAAAAwACwAAAABAAQAAAAwAC0AAAABAAQAAAAwAC4AAAABAAQAAAAwAC8AAAABAAQAAAAwADAAAAABAAQAAAAwADEAAAABAAQAAAAwADIAAAABAAQAAAAwADMAAAAQAAYAAAAxAPD/AAADAAcAAAAxAPH/AAADAAcAAAAxAPL/AAADAAcAAAAxAPP/AAADAAcAAAAxAPT/AAADAAcAAAAxAPX/AAADAAcAAAAxAPb/AAADAAcAAAAxAPf/AAADAAcAAAAxAPj/AAADAAcAAAAxAPn/AAADAAcAAAAxAPr/AAADAAcAAAAxAPv/AAADAAcAAAAxAPz/AAADAAcAAAAxAP3/AAADAAcAAAAxAP7/AAADAAcAAAAxAP//AAAAAAEAAAAxAAAAAAAAAAEAAAAxAAEAAAADAAcAAAAxAAIAAAAAAAEAAAAxAAMAAAADAAcAAAAxAAQAAAACAAkAAAAxAAUAAAAEAAgAAAAxAAYAAAAFAAoAAAAxAAcAAAAIAAoAAAAxAAgAAAAFAAoAAAAxAAkAAAAAAAAAAAAxAAoAAAAAAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAIAAoAAAAxAA0AAAAIAAkAAAAxAA4AAAAIAAkAAAAxAA8AAAAIAAkAAAAxABAAAAAFAAoAAAAxABEAAAAAAAAAAAAxABIAAAAFAAkAAAAxABMAAAAFAAoAAAAxABQAAAAFAAkAAAAxABUAAAAFAAoAAAAxABYAAAAHAAkAAAAxABcAAAAFAAoAAAAxABgAAAAHAAkAAAAxABkAAAAFAAoAAAAxABoAAAAHAAkAAAAxABsAAAAIAAoAAAAxABwAAAAIAAoAAAAxAB0AAAAIAAkAAAAxAB4AAAAFAAoAAAAxAB8AAAABAAMAAAAxACAAAAABAAQAAAAxACEAAAABAAQAAAAxACIAAAABAAQAAAAxACMAAAABAAQAAAAxACQAAAABAAQAAAAxACUAAAABAAQAAAAxACYAAAABAAQAAAAxACcAAAABAAQAAAAxACgAAAABAAQAAAAxACkAAAABAAQAAAAxACoAAAABAAQAAAAxACsAAAABAAQAAAAxACwAAAABAAQAAAAxAC0AAAABAAQAAAAxAC4AAAABAAQAAAAxAC8AAAABAAQAAAAxADAAAAABAAQAAAAxADEAAAABAAQAAAAxADIAAAABAAQAAAAxADMAAAAQAAYAAAAyAPD/AAADAAcAAAAyAPH/AAADAAcAAAAyAPL/AAAAAAEAAAAyAPP/AAAAAAEAAAAyAPT/AAADAAcAAAAyAPX/AAADAAcAAAAyAPb/AAADAAcAAAAyAPf/AAADAAcAAAAyAPj/AAAAAAEAAAAyAPn/AAAAAAEAAAAyAPr/AAAAAAEAAAAyAPv/AAAAAAEAAAAyAPz/AAADAAcAAAAyAP3/AAADAAcAAAAyAP7/AAADAAcAAAAyAP//AAADAAcAAAAyAAAAAAADAAcAAAAyAAEAAAADAAcAAAAyAAIAAAADAAcAAAAyAAMAAAACAAkAAAAyAAQAAAAEAAgAAAAyAAUAAAAAAAAAAAAyAAYAAAAFAAoAAAAyAAcAAAAIAAoAAAAyAAgAAAAIAAkAAAAyAAkAAAAIAAoAAAAyAAoAAAAIAAoAAAAyAAsAAAAIAAkAAAAyAAwAAAAFAAkAAAAyAA0AAAAAAAAAAAAyAA4AAAAHAAoAAAAyAA8AAAAIAAkAAAAyABAAAAAFAAkAAAAyABEAAAAHAAoAAAAyABIAAAAHAAoAAAAyABMAAAAFAAkAAAAyABQAAAAAAAAAAAAyABUAAAAIAAoAAAAyABYAAAAHAAoAAAAyABcAAAAAAAAAAAAyABgAAAAIAAoAAAAyABkAAAAHAAkAAAAyABoAAAAHAAoAAAAyABsAAAAHAAoAAAAyABwAAAAHAAkAAAAyAB0AAAAFAAkAAAAyAB4AAAAAAAMAAAAyAB8AAAABAAcAAAAyACAAAAABAAQAAAAyACEAAAABAAQAAAAyACIAAAABAAQAAAAyACMAAAAAAAYAAAAyACQAAAACAAQAAAAyACUAAAACAAQAAAAyACYAAAACAAQAAAAyACcAAAACAAQAAAAyACgAAAACAAQAAAAyACkAAAACAAQAAAAyACoAAAACAAQAAAAyACsAAAACAAQAAAAyACwAAAACAAQAAAAyAC0AAAACAAQAAAAyAC4AAAACAAQAAAAyAC8AAAACAAQAAAAyADAAAAACAAQAAAAyADEAAAACAAQAAAAyADIAAAACAAQAAAAyADMAAAAKAA4AAAAzAPD/AAADAAcAAAAzAPH/AAADAAcAAAAzAPL/AAAAAAEAAAAzAPP/AAADAAcAAAAzAPT/AAADAAcAAAAzAPX/AAAAAAEAAAAzAPb/AAAAAAEAAAAzAPf/AAADAAcAAAAzAPj/AAAAAAEAAAAzAPn/AAADAAcAAAAzAPr/AAADAAcAAAAzAPv/AAADAAcAAAAzAPz/AAADAAcAAAAzAP3/AAADAAcAAAAzAP7/AAADAAcAAAAzAP//AAADAAcAAAAzAAAAAAADAAcAAAAzAAEAAAAAAAEAAAAzAAIAAAACAAkAAAAzAAMAAAAEAAgAAAAzAAQAAAAIAAkAAAAzAAUAAAAFAAkAAAAzAAYAAAAHAAkAAAAzAAcAAAAHAAoAAAAzAAgAAAAFAAoAAAAzAAkAAAAHAAoAAAAzAAoAAAAHAAoAAAAzAAsAAAAFAAoAAAAzAAwAAAAFAAoAAAAzAA0AAAAIAAoAAAAzAA4AAAAHAAoAAAAzAA8AAAAHAAkAAAAzABAAAAAFAAkAAAAzABEAAAAHAAoAAAAzABIAAAAIAAoAAAAzABMAAAAFAAoAAAAzABQAAAAFAAkAAAAzABUAAAAHAAoAAAAzABYAAAAHAAkAAAAzABcAAAAIAAkAAAAzABgAAAAIAAkAAAAzABkAAAAHAAkAAAAzABoAAAAIAAoAAAAzABsAAAAFAAoAAAAzABwAAAAIAAoAAAAzAB0AAAAAAAMAAAAzAB4AAAABAAcAAAAzAB8AAAABAAQAAAAzACAAAAABAAQAAAAzACEAAAABAAQAAAAzACIAAAABAAQAAAAzACMAAAABAAUAAAAzACQAAAAIAAkAAAAzACUAAAAAAAAAAAAzACYAAAAIAAkAAAAzACcAAAAIAAoAAAAzACgAAAAHAAoAAAAzACkAAAAHAAoAAAAzACoAAAAAAAAAAAAzACsAAAAIAAoAAAAzACwAAAAHAAkAAAAzAC0AAAAIAAoAAAAzAC4AAAAIAAkAAAAzAC8AAAAFAAkAAAAzADAAAAAHAAoAAAAzADEAAAAIAAkAAAAzADIAAAAIAAkAAAAzADMAAAAAAAAAAAA0APD/AAADAAcAAAA0APH/AAADAAcAAAA0APL/AAADAAcAAAA0APP/AAADAAcAAAA0APT/AAADAAcAAAA0APX/AAAAAAEAAAA0APb/AAADAAcAAAA0APf/AAADAAcAAAA0APj/AAADAAcAAAA0APn/AAADAAcAAAA0APr/AAAAAAEAAAA0APv/AAADAAcAAAA0APz/AAADAAcAAAA0AP3/AAADAAcAAAA0AP7/AAADAAcAAAA0AP//AAADAAcAAAA0AAAAAAADAAcAAAA0AAEAAAADAAcAAAA0AAIAAAADAAgAAAA0AAMAAAAFAAoAAAA0AAQAAAAHAAoAAAA0AAUAAAAAAAAAAAA0AAYAAAAHAAkAAAA0AAcAAAAHAAoAAAA0AAgAAAAIAAkAAAA0AAkAAAAFAAoAAAA0AAoAAAAFAAkAAAA0AAsAAAAHAAoAAAA0AAwAAAAFAAoAAAA0AA0AAAAFAAkAAAA0AA4AAAAHAAkAAAA0AA8AAAAHAAkAAAA0ABAAAAAHAAoAAAA0ABEAAAAIAAoAAAA0ABIAAAAHAAoAAAA0ABMAAAAHAAoAAAA0ABQAAAAHAAoAAAA0ABUAAAAFAAoAAAA0ABYAAAAIAAkAAAA0ABcAAAAFAAkAAAA0ABgAAAAHAAoAAAA0ABkAAAAHAAoAAAA0ABoAAAAFAAoAAAA0ABsAAAAFAAkAAAA0ABwAAAAHAAoAAAA0AB0AAAABAAMAAAA0AB4AAAABAAQAAAA0AB8AAAABAAQAAAA0ACAAAAABAAQAAAA0ACEAAAABAAQAAAA0ACIAAAABAAQAAAA0ACMAAAABAAUAAAA0ACQAAAAFAAkAAAA0ACUAAAAIAAoAAAA0ACYAAAAAAAAAAAA0ACcAAAAIAAkAAAA0ACgAAAAHAAkAAAA0ACkAAAAHAAkAAAA0ACoAAAAHAAkAAAA0ACsAAAAIAAoAAAA0ACwAAAAIAAkAAAA0AC0AAAAFAAoAAAA0AC4AAAAFAAkAAAA0AC8AAAAHAAoAAAA0ADAAAAAHAAkAAAA0ADEAAAAIAAkAAAA0ADIAAAAIAAoAAAA0ADMAAAAAAAAAAAA1APD/AAADAAcAAAA1APH/AAADAAcAAAA1APL/AAADAAcAAAA1APP/AAADAAcAAAA1APT/AAAAAAEAAAA1APX/AAADAAcAAAA1APb/AAAAAAEAAAA1APf/AAAAAAEAAAA1APj/AAADAAcAAAA1APn/AAADAAcAAAA1APr/AAADAAcAAAA1APv/AAAAAAEAAAA1APz/AAADAAcAAAA1AP3/AAADAAcAAAA1AP7/AAADAAcAAAA1AP//AAAAAAEAAAA1AAAAAAAAAAEAAAA1AAEAAAADAAcAAAA1AAIAAAADAAgAAAA1AAMAAAAFAAoAAAA1AAQAAAAFAAkAAAA1AAUAAAAFAAoAAAA1AAYAAAAIAAoAAAA1AAcAAAAHAAoAAAA1AAgAAAAIAAoAAAA1AAkAAAAFAAkAAAA1AAoAAAAHAAkAAAA1AAsAAAAIAAkAAAA1AAwAAAAFAAkAAAA1AA0AAAAIAAkAAAA1AA4AAAAIAAkAAAA1AA8AAAAIAAoAAAA1ABAAAAAHAAoAAAA1ABEAAAAHAAkAAAA1ABIAAAAIAAkAAAA1ABMAAAAHAAoAAAA1ABQAAAAHAAoAAAA1ABUAAAAIAAkAAAA1ABYAAAAIAAkAAAA1ABcAAAAIAAoAAAA1ABgAAAAAAAAAAAA1ABkAAAAHAAoAAAA1ABoAAAAFAAkAAAA1ABsAAAAHAAoAAAA1ABwAAAAAAAMAAAA1AB0AAAABAAcAAAA1AB4AAAABAAQAAAA1AB8AAAABAAQAAAA1ACAAAAAAAAYAAAA1ACEAAAABAAQAAAA1ACIAAAABAAQAAAA1ACMAAAABAAUAAAA1ACQAAAAFAAkAAAA1ACUAAAAHAAkAAAA1ACYAAAAIAAkAAAA1ACcAAAAIAAoAAAA1ACgAAAAFAAkAAAA1ACkAAAAIAAkAAAA1ACoAAAAHAAkAAAA1ACsAAAAHAAkAAAA1ACwAAAAFAAkAAAA1AC0AAAAFAAkAAAA1AC4AAAAFAAoAAAA1AC8AAAAFAAkAAAA1ADAAAAAFAAkAAAA1ADEAAAAFAAkAAAA1ADIAAAAFAAkAAAA1ADMAAAAHAAkAAAA2APD/AAADAAcAAAA2APH/AAADAAcAAAA2APL/AAADAAcAAAA2APP/AAADAAcAAAA2APT/AAADAAcAAAA2APX/AAAAAAEAAAA2APb/AAADAAcAAAA2APf/AAAAAAEAAAA2APj/AAADAAcAAAA2APn/AAADAAcAAAA2APr/AAADAAcAAAA2APv/AAADAAcAAAA2APz/AAAAAAEAAAA2AP3/AAADAAcAAAA2AP7/AAADAAcAAAA2AP//AAADAAcAAAA2AAAAAAADAAcAAAA2AAEAAAADAAcAAAA2AAIAAAADAAgAAAA2AAMAAAAHAAoAAAA2AAQAAAAIAAkAAAA2AAUAAAAFAAoAAAA2AAYAAAAHAAoAAAA2AAcAAAAIAAoAAAA2AAgAAAAIAAoAAAA2AAkAAAAFAAkAAAA2AAoAAAAHAAoAAAA2AAsAAAAHAAoAAAA2AAwAAAAIAAoAAAA2AA0AAAAHAAoAAAA2AA4AAAAIAAoAAAA2AA8AAAAHAAoAAAA2ABAAAAAIAAkAAAA2ABEAAAAHAAkAAAA2ABIAAAAIAAkAAAA2ABMAAAAHAAkAAAA2ABQAAAAIAAkAAAA2ABUAAAAHAAkAAAA2ABYAAAAFAAoAAAA2ABcAAAAFAAoAAAA2ABgAAAAHAAkAAAA2ABkAAAAHAAoAAAA2ABoAAAAHAAkAAAA2ABsAAAAAAAMAAAA2ABwAAAABAAcAAAA2AB0AAAABAAQAAAA2AB4AAAABAAQAAAA2AB8AAAABAAQAAAA2ACAAAAABAAUAAAA2ACEAAAABAAQAAAA2ACIAAAABAAQAAAA2ACMAAAABAAUAAAA2ACQAAAAIAAoAAAA2ACUAAAAHAAkAAAA2ACYAAAAIAAkAAAA2ACcAAAAAAAAAAAA2ACgAAAAFAAoAAAA2ACkAAAAIAAoAAAA2ACoAAAAFAAkAAAA2ACsAAAAFAAkAAAA2ACwAAAAIAAoAAAA2AC0AAAAFAAoAAAA2AC4AAAAHAAkAAAA2AC8AAAAFAAkAAAA2ADAAAAAHAAoAAAA2ADEAAAAHAAoAAAA2ADIAAAAFAAoAAAA2ADMAAAAFAAoAAAA3APD/AAADAAcAAAA3APH/AAADAAcAAAA3APL/AAADAAcAAAA3APP/AAADAAcAAAA3APT/AAADAAcAAAA3APX/AAAAAAEAAAA3APb/AAADAAcAAAA3APf/AAADAAcAAAA3APj/AAADAAcAAAA3APn/AAADAAcAAAA3APr/AAADAAcAAAA3APv/AAAAAAEAAAA3APz/AAADAAcAAAA3AP3/AAADAAcAAAA3AP7/AAADAAcAAAA3AP//AAADAAcAAAA3AAAAAAADAAcAAAA3AAEAAAACAAkAAAA3AAIAAAAEAAgAAAA3AAMAAAAHAAoAAAA3AAQAAAAIAAkAAAA3AAUAAAAHAAkAAAA3AAYAAAAIAAkAAAA3AAcAAAAIAAkAAAA3AAgAAAAAAAAAAAA3AAkAAAAFAAoAAAA3AAoAAAAAAAAAAAA3AAsAAAAHAAkAAAA3AAwAAAAFAAkAAAA3AA0AAAAIAAkAAAA3AA4AAAAAAAAAAAA3AA8AAAAIAAoAAAA3ABAAAAAHAAkAAAA3ABEAAAAFAAoAAAA3ABIAAAAAAAAAAAA3ABMAAAAHAAoAAAA3ABQAAAAAAAAAAAA3ABUAAAAHAAoAAAA3ABYAAAAHAAkAAAA3ABcAAAAIAAkAAAA3ABgAAAAAAAAAAAA3ABkAAAAFAAkAAAA3ABoAAAAIAAkAAAA3ABsAAAABAAMAAAA3ABwAAAABAAQAAAA3AB0AAAABAAQAAAA3AB4AAAABAAQAAAA3AB8AAAAAAAYAAAA3ACAAAAACAAUAAAA3ACEAAAABAAQAAAA3ACIAAAABAAQAAAA3ACMAAAABAAUAAAA3ACQAAAAFAAoAAAA3ACUAAAAIAAkAAAA3ACYAAAAIAAkAAAA3ACcAAAAHAAkAAAA3ACgAAAAIAAoAAAA3ACkAAAAFAAkAAAA3ACoAAAAHAAkAAAA3ACsAAAAFAAoAAAA3ACwAAAAIAAkAAAA3AC0AAAAAAAAAAAA3AC4AAAAHAAkAAAA3AC8AAAAAAAAAAAA3ADAAAAAFAAkAAAA3ADEAAAAFAAkAAAA3ADIAAAAAAAAAAAA3ADMAAAAFAAkAAAA4APD/AAADAAcAAAA4APH/AAADAAcAAAA4APL/AAAAAAEAAAA4APP/AAAAAAEAAAA4APT/AAADAAcAAAA4APX/AAACAAkAAAA4APb/AAAEAAcAAAA4APf/AAAEAAcAAAA4APj/AAAEAAcAAAA4APn/AAAEAAcAAAA4APr/AAACAAoAAAA4APv/AAADAAcAAAA4APz/AAADAAcAAAA4AP3/AAADAAcAAAA4AP7/AAAAAAEAAAA4AP//AAACAAkAAAA4AAAAAAAEAAcAAAA4AAEAAAAEAAgAAAA4AAIAAAAFAAoAAAA4AAMAAAAIAAkAAAA4AAQAAAAFAAkAAAA4AAUAAAAFAAoAAAA4AAYAAAAIAAoAAAA4AAcAAAAHAAkAAAA4AAgAAAAHAAkAAAA4AAkAAAAFAAkAAAA4AAoAAAAFAAoAAAA4AAsAAAAFAAkAAAA4AAwAAAAIAAoAAAA4AA0AAAAIAAkAAAA4AA4AAAAFAAoAAAA4AA8AAAAFAAoAAAA4ABAAAAAHAAoAAAA4ABEAAAAIAAkAAAA4ABIAAAAIAAoAAAA4ABMAAAAIAAkAAAA4ABQAAAAAAAAAAAA4ABUAAAAHAAkAAAA4ABYAAAAAAAAAAAA4ABcAAAAHAAkAAAA4ABgAAAAIAAkAAAA4ABkAAAAIAAkAAAA4ABoAAAAAAAMAAAA4ABsAAAABAAcAAAA4ABwAAAABAAQAAAA4AB0AAAABAAQAAAA4AB4AAAAAAAYAAAA4AB8AAAACAAUAAAA4ACAAAAABAAMAAAA4ACEAAAABAAQAAAA4ACIAAAABAAQAAAA4ACMAAAABAAUAAAA4ACQAAAAHAAkAAAA4ACUAAAAIAAoAAAA4ACYAAAAFAAoAAAA4ACcAAAAHAAoAAAA4ACgAAAAHAAkAAAA4ACkAAAAFAAkAAAA4ACoAAAAFAAoAAAA4ACsAAAAAAAAAAAA4ACwAAAAIAAkAAAA4AC0AAAAIAAoAAAA4AC4AAAAIAAkAAAA4AC8AAAAFAAkAAAA4ADAAAAAFAAkAAAA4ADEAAAAHAAkAAAA4ADIAAAAHAAoAAAA4ADMAAAAFAAkAAAA5APD/AAADAAcAAAA5APH/AAADAAcAAAA5APL/AAADAAcAAAA5APP/AAADAAcAAAA5APT/AAACAAkAAAA5APX/AAAEAAgAAAA5APb/AAAFAAkAAAA5APf/AAAAAAAAAAA5APj/AAAIAAkAAAA5APn/AAAFAAkAAAA5APr/AAAEAAYAAAA5APv/AAAEAAcAAAA5APz/AAAEAAcAAAA5AP3/AAAEAAcAAAA5AP7/AAAEAAcAAAA5AP//AAAEAAgAAAA5AAAAAAAIAAkAAAA5AAEAAAAFAAkAAAA5AAIAAAAHAAkAAAA5AAMAAAAFAAkAAAA5AAQAAAAFAAkAAAA5AAUAAAAFAAoAAAA5AAYAAAAIAAoAAAA5AAcAAAAHAAoAAAA5AAgAAAAFAAoAAAA5AAkAAAAIAAoAAAA5AAoAAAAFAAkAAAA5AAsAAAAFAAoAAAA5AAwAAAAFAAkAAAA5AA0AAAAIAAoAAAA5AA4AAAAFAAkAAAA5AA8AAAAIAAoAAAA5ABAAAAAFAAoAAAA5ABEAAAAFAAkAAAA5ABIAAAAAAAAAAAA5ABMAAAAHAAoAAAA5ABQAAAAAAAAAAAA5ABUAAAAIAAoAAAA5ABYAAAAIAAoAAAA5ABcAAAAHAAkAAAA5ABgAAAAHAAkAAAA5ABkAAAAFAAoAAAA5ABoAAAABAAMAAAA5ABsAAAABAAQAAAA5ABwAAAABAAQAAAA5AB0AAAABAAQAAAA5AB4AAAABAAUAAAA5AB8AAAAIAAkAAAA5ACAAAAABAAMAAAA5ACEAAAABAAQAAAA5ACIAAAABAAQAAAA5ACMAAAABAAUAAAA5ACQAAAAAAAAAAAA5ACUAAAAFAAoAAAA5ACYAAAAFAAoAAAA5ACcAAAAIAAoAAAA5ACgAAAAIAAoAAAA5ACkAAAAHAAoAAAA5ACoAAAAFAAkAAAA5ACsAAAAHAAoAAAA5ACwAAAAFAAoAAAA5AC0AAAAHAAoAAAA5AC4AAAAIAAkAAAA5AC8AAAAFAAoAAAA5ADAAAAAFAAkAAAA5ADEAAAAFAAoAAAA5ADIAAAAHAAoAAAA5ADMAAAAIAAkAAAA6APD/AAAAAAEAAAA6APH/AAADAAcAAAA6APL/AAACAAkAAAA6APP/AAAEAAcAAAA6APT/AAAEAAgAAAA6APX/AAAHAAkAAAA6APb/AAAIAAoAAAA6APf/AAAIAAoAAAA6APj/AAAFAAkAAAA6APn/AAAAAAAAAAA6APr/AAAHAAkAAAA6APv/AAAHAAkAAAA6APz/AAAFAAoAAAA6AP3/AAAIAAoAAAA6AP7/AAAAAAAAAAA6AP//AAAIAAkAAAA6AAAAAAAHAAoAAAA6AAEAAAAFAAoAAAA6AAIAAAAHAAoAAAA6AAMAAAAAAAAAAAA6AAQAAAAHAAkAAAA6AAUAAAAIAAoAAAA6AAYAAAAFAAoAAAA6AAcAAAAHAAkAAAA6AAgAAAAFAAkAAAA6AAkAAAAHAAoAAAA6AAoAAAAHAAoAAAA6AAsAAAAIAAoAAAA6AAwAAAAAAAAAAAA6AA0AAAAIAAoAAAA6AA4AAAAFAAkAAAA6AA8AAAAIAAoAAAA6ABAAAAAAAAAAAAA6ABEAAAAIAAoAAAA6ABIAAAAHAAkAAAA6ABMAAAAFAAkAAAA6ABQAAAAFAAkAAAA6ABUAAAAIAAkAAAA6ABYAAAAIAAkAAAA6ABcAAAAIAAkAAAA6ABgAAAAHAAkAAAA6ABkAAAAAAAMAAAA6ABoAAAABAAcAAAA6ABsAAAABAAQAAAA6ABwAAAABAAQAAAA6AB0AAAAAAAYAAAA6AB4AAAACAAUAAAA6AB8AAAAIAAkAAAA6ACAAAAABAAMAAAA6ACEAAAABAAQAAAA6ACIAAAABAAQAAAA6ACMAAAABAAUAAAA6ACQAAAAIAAoAAAA6ACUAAAAIAAoAAAA6ACYAAAAIAAoAAAA6ACcAAAAAAAAAAAA6ACgAAAAIAAkAAAA6ACkAAAAFAAkAAAA6ACoAAAAAAAAAAAA6ACsAAAAHAAoAAAA6ACwAAAAIAAkAAAA6AC0AAAAIAAoAAAA6AC4AAAAHAAoAAAA6AC8AAAAFAAoAAAA6ADAAAAAIAAoAAAA6ADEAAAAAAAAAAAA6ADIAAAAAAAAAAAA6ADMAAAAFAAkAAAA7APD/AAAEAAcAAAA7APH/AAAEAAcAAAA7APL/AAAEAAgAAAA7APP/AAAHAAkAAAA7APT/AAAHAAoAAAA7APX/AAAIAAoAAAA7APb/AAAHAAoAAAA7APf/AAAHAAoAAAA7APj/AAAHAAoAAAA7APn/AAAAAAAAAAA7APr/AAAAAAAAAAA7APv/AAAFAAoAAAA7APz/AAAAAAAAAAA7AP3/AAAFAAoAAAA7AP7/AAAIAAkAAAA7AP//AAAFAAkAAAA7AAAAAAAIAAoAAAA7AAEAAAAIAAoAAAA7AAIAAAAIAAkAAAA7AAMAAAAFAAkAAAA7AAQAAAAAAAAAAAA7AAUAAAAHAAkAAAA7AAYAAAAFAAoAAAA7AAcAAAAFAAkAAAA7AAgAAAAIAAkAAAA7AAkAAAAFAAoAAAA7AAoAAAAHAAkAAAA7AAsAAAAHAAkAAAA7AAwAAAAHAAoAAAA7AA0AAAAHAAkAAAA7AA4AAAAHAAkAAAA7AA8AAAAHAAkAAAA7ABAAAAAHAAoAAAA7ABEAAAAFAAkAAAA7ABIAAAAIAAkAAAA7ABMAAAAFAAoAAAA7ABQAAAAIAAoAAAA7ABUAAAAAAAAAAAA7ABYAAAAFAAkAAAA7ABcAAAAHAAoAAAA7ABgAAAAAAAMAAAA7ABkAAAABAAcAAAA7ABoAAAABAAQAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAYAAAA7AB0AAAACAAUAAAA7AB4AAAAIAAoAAAA7AB8AAAAIAAkAAAA7ACAAAAABAAMAAAA7ACEAAAABAAQAAAA7ACIAAAABAAQAAAA7ACMAAAABAAUAAAA7ACQAAAAFAAkAAAA7ACUAAAAIAAoAAAA7ACYAAAAFAAkAAAA7ACcAAAAHAAoAAAA7ACgAAAAHAAoAAAA7ACkAAAAHAAoAAAA7ACoAAAAAAAAAAAA7ACsAAAAAAAAAAAA7ACwAAAAFAAkAAAA7AC0AAAAIAAoAAAA7AC4AAAAHAAoAAAA7AC8AAAAAAAAAAAA7ADAAAAAFAAkAAAA7ADEAAAAHAAoAAAA7ADIAAAAHAAoAAAA7ADMAAAAAAAkAAAA8APD/AAABAAsAAAA8APH/AAAFAAoAAAA8APL/AAAHAAoAAAA8APP/AAAFAAkAAAA8APT/AAAFAAoAAAA8APX/AAAHAAoAAAA8APb/AAAAAAAAAAA8APf/AAAFAAkAAAA8APj/AAAHAAkAAAA8APn/AAAHAAoAAAA8APr/AAAFAAkAAAA8APv/AAAIAAoAAAA8APz/AAAIAAkAAAA8AP3/AAAFAAkAAAA8AP7/AAAIAAkAAAA8AP//AAAHAAoAAAA8AAAAAAAIAAoAAAA8AAEAAAAIAAkAAAA8AAIAAAAIAAoAAAA8AAMAAAAIAAkAAAA8AAQAAAAAAAAAAAA8AAUAAAAHAAkAAAA8AAYAAAAFAAoAAAA8AAcAAAAHAAoAAAA8AAgAAAAAAAAAAAA8AAkAAAAIAAkAAAA8AAoAAAAHAAoAAAA8AAsAAAAFAAoAAAA8AAwAAAAAAAAAAAA8AA0AAAAHAAoAAAA8AA4AAAAIAAkAAAA8AA8AAAAIAAoAAAA8ABAAAAAAAAAAAAA8ABEAAAAHAAkAAAA8ABIAAAAHAAoAAAA8ABMAAAAHAAoAAAA8ABQAAAAAAAAAAAA8ABUAAAAFAAkAAAA8ABYAAAAHAAkAAAA8ABcAAAAAAAMAAAA8ABgAAAABAAcAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAAAAAYAAAA8ABwAAAACAAUAAAA8AB0AAAAFAAkAAAA8AB4AAAAIAAkAAAA8AB8AAAAIAAkAAAA8ACAAAAABAAMAAAA8ACEAAAABAAQAAAA8ACIAAAABAAQAAAA8ACMAAAABAAUAAAA8ACQAAAAFAAoAAAA8ACUAAAAAAAAAAAA8ACYAAAAHAAoAAAA8ACcAAAAFAAoAAAA8ACgAAAAFAAoAAAA8ACkAAAAFAAkAAAA8ACoAAAAIAAoAAAA8ACsAAAAIAAkAAAA8ACwAAAAIAAoAAAA8AC0AAAAFAAoAAAA8AC4AAAAFAAoAAAA8AC8AAAAFAAkAAAA8ADAAAAAFAAoAAAA8ADEAAAAFAAoAAAA8ADIAAAAHAAoAAAA8ADMAAAABAAkAAAA9APD/AAABAAsAAAA9APH/AAAFAAkAAAA9APL/AAAIAAkAAAA9APP/AAAIAAkAAAA9APT/AAAHAAoAAAA9APX/AAAHAAkAAAA9APb/AAAFAAoAAAA9APf/AAAIAAkAAAA9APj/AAAHAAoAAAA9APn/AAAHAAkAAAA9APr/AAAFAAkAAAA9APv/AAAHAAoAAAA9APz/AAAAAAAAAAA9AP3/AAAHAAkAAAA9AP7/AAAFAAoAAAA9AP//AAAAAAAAAAA9AAAAAAAHAAkAAAA9AAEAAAAAAAAAAAA9AAIAAAAAAAAAAAA9AAMAAAAFAAkAAAA9AAQAAAAIAAkAAAA9AAUAAAAFAAkAAAA9AAYAAAAHAAkAAAA9AAcAAAAFAAoAAAA9AAgAAAAAAAAAAAA9AAkAAAAHAAkAAAA9AAoAAAAHAAkAAAA9AAsAAAAFAAoAAAA9AAwAAAAFAAoAAAA9AA0AAAAAAAAAAAA9AA4AAAAIAAoAAAA9AA8AAAAIAAkAAAA9ABAAAAAFAAkAAAA9ABEAAAAHAAoAAAA9ABIAAAAIAAoAAAA9ABMAAAAHAAkAAAA9ABQAAAAHAAoAAAA9ABUAAAAHAAkAAAA9ABYAAAAAAAMAAAA9ABcAAAABAAcAAAA9ABgAAAABAAQAAAA9ABkAAAABAAQAAAA9ABoAAAAAAAYAAAA9ABsAAAACAAUAAAA9ABwAAAAFAAoAAAA9AB0AAAAFAAkAAAA9AB4AAAAFAAoAAAA9AB8AAAAIAAoAAAA9ACAAAAABAAMAAAA9ACEAAAABAAQAAAA9ACIAAAABAAQAAAA9ACMAAAABAAUAAAA9ACQAAAAIAAkAAAA9ACUAAAAFAAkAAAA9ACYAAAAHAAkAAAA9ACcAAAAAAAAAAAA9ACgAAAAHAAkAAAA9ACkAAAAHAAoAAAA9ACoAAAAIAAkAAAA9ACsAAAAAAAAAAAA9ACwAAAAFAAoAAAA9AC0AAAAIAAkAAAA9AC4AAAAHAAkAAAA9AC8AAAAFAAoAAAA9ADAAAAAIAAoAAAA9ADEAAAAIAAoAAAA9ADIAAAAAAAAAAAA9ADMAAAAHAAoAAAA+APD/AAABAAsAAAA+APH/AAAAAAAAAAA+APL/AAAAAAAAAAA+APP/AAAFAAoAAAA+APT/AAAFAAkAAAA+APX/AAAAAAAAAAA+APb/AAAAAAAAAAA+APf/AAAFAAoAAAA+APj/AAAHAAoAAAA+APn/AAAIAAkAAAA+APr/AAAHAAkAAAA+APv/AAAFAAoAAAA+APz/AAAIAAoAAAA+AP3/AAAHAAkAAAA+AP7/AAAIAAoAAAA+AP//AAAAAAAAAAA+AAAAAAAHAAoAAAA+AAEAAAAFAAkAAAA+AAIAAAAIAAkAAAA+AAMAAAAHAAoAAAA+AAQAAAAFAAkAAAA+AAUAAAAIAAkAAAA+AAYAAAAHAAoAAAA+AAcAAAAFAAoAAAA+AAgAAAAIAAkAAAA+AAkAAAAAAAAAAAA+AAoAAAAIAAoAAAA+AAsAAAAAAAAAAAA+AAwAAAAAAAAAAAA+AA0AAAAHAAoAAAA+AA4AAAAHAAkAAAA+AA8AAAAFAAoAAAA+ABAAAAAAAAAAAAA+ABEAAAAFAAkAAAA+ABIAAAAAAAAAAAA+ABMAAAAHAAoAAAA+ABQAAAAAAAAAAAA+ABUAAAAAAAMAAAA+ABYAAAABAAcAAAA+ABcAAAABAAQAAAA+ABgAAAAAAAYAAAA+ABkAAAACAAQAAAA+ABoAAAACAAUAAAA+ABsAAAAHAAkAAAA+ABwAAAAHAAoAAAA+AB0AAAAHAAoAAAA+AB4AAAAIAAoAAAA+AB8AAAAFAAkAAAA+ACAAAAABAAMAAAA+ACEAAAABAAQAAAA+ACIAAAABAAQAAAA+ACMAAAABAAUAAAA+ACQAAAAHAAoAAAA+ACUAAAAFAAkAAAA+ACYAAAAHAAoAAAA+ACcAAAAHAAkAAAA+ACgAAAAIAAkAAAA+ACkAAAAIAAkAAAA+ACoAAAAIAAoAAAA+ACsAAAAFAAoAAAA+ACwAAAAFAAkAAAA+AC0AAAAFAAoAAAA+AC4AAAAFAAoAAAA+AC8AAAAHAAkAAAA+ADAAAAAFAAkAAAA+ADEAAAAHAAkAAAA+ADIAAAAIAAkAAAA+ADMAAAAAAAAAAAA/APD/AAABAAsAAAA/APH/AAAFAAkAAAA/APL/AAAIAAkAAAA/APP/AAAIAAkAAAA/APT/AAAHAAoAAAA/APX/AAAFAAoAAAA/APb/AAAHAAkAAAA/APf/AAAHAAoAAAA/APj/AAAFAAkAAAA/APn/AAAHAAkAAAA/APr/AAAFAAkAAAA/APv/AAAFAAoAAAA/APz/AAAIAAoAAAA/AP3/AAAFAAkAAAA/AP7/AAAAAAAAAAA/AP//AAAIAAkAAAA/AAAAAAAFAAoAAAA/AAEAAAAHAAkAAAA/AAIAAAAFAAkAAAA/AAMAAAAAAAAAAAA/AAQAAAAFAAoAAAA/AAUAAAAFAAkAAAA/AAYAAAAAAAAAAAA/AAcAAAAAAAAAAAA/AAgAAAAIAAoAAAA/AAkAAAAHAAoAAAA/AAoAAAAHAAoAAAA/AAsAAAAHAAkAAAA/AAwAAAAIAAoAAAA/AA0AAAAFAAkAAAA/AA4AAAAHAAkAAAA/AA8AAAAFAAkAAAA/ABAAAAAHAAoAAAA/ABEAAAAIAAkAAAA/ABIAAAAIAAoAAAA/ABMAAAAHAAkAAAA/ABQAAAAIAAkAAAA/ABUAAAABAAMAAAA/ABYAAAABAAQAAAA/ABcAAAABAAQAAAA/ABgAAAABAAUAAAA/ABkAAAAFAAkAAAA/ABoAAAAFAAoAAAA/ABsAAAAIAAoAAAA/ABwAAAAIAAoAAAA/AB0AAAAHAAkAAAA/AB4AAAAAAAAAAAA/AB8AAAAIAAkAAAA/ACAAAAABAAMAAAA/ACEAAAABAAQAAAA/ACIAAAABAAQAAAA/ACMAAAABAAUAAAA/ACQAAAAIAAkAAAA/ACUAAAAIAAoAAAA/ACYAAAAAAAAAAAA/ACcAAAAIAAkAAAA/ACgAAAAIAAoAAAA/ACkAAAAIAAoAAAA/ACoAAAAIAAoAAAA/ACsAAAAHAAkAAAA/ACwAAAAIAAoAAAA/AC0AAAAHAAoAAAA/AC4AAAAHAAkAAAA/AC8AAAAFAAkAAAA/ADAAAAAFAAoAAAA/ADEAAAAHAAoAAAA/ADIAAAAFAAkAAAA/ADMAAAAFAAkAAABAAPD/AAABAAsAAABAAPH/AAAIAAkAAABAAPL/AAAFAAkAAABAAPP/AAAHAAkAAABAAPT/AAAAAAAAAABAAPX/AAAFAAkAAABAAPb/AAAIAAoAAABAAPf/AAAIAAoAAABAAPj/AAAHAAkAAABAAPn/AAAAAAAAAABAAPr/AAAFAAkAAABAAPv/AAAIAAkAAABAAPz/AAAHAAkAAABAAP3/AAAHAAoAAABAAP7/AAAAAAAAAABAAP//AAAIAAkAAABAAAAAAAAFAAoAAABAAAEAAAAIAAoAAABAAAIAAAAAAAAAAABAAAMAAAAHAAkAAABAAAQAAAAIAAoAAABAAAUAAAAAAAAAAABAAAYAAAAFAAoAAABAAAcAAAAIAAkAAABAAAgAAAAHAAoAAABAAAkAAAAAAAAAAABAAAoAAAAHAAkAAABAAAsAAAAAAAAAAABAAAwAAAAHAAkAAABAAA0AAAAIAAkAAABAAA4AAAAIAAoAAABAAA8AAAAFAAkAAABAABAAAAAHAAkAAABAABEAAAAIAAoAAABAABIAAAAHAAkAAABAABMAAAAIAAkAAABAABQAAAAAAAMAAABAABUAAAABAAcAAABAABYAAAABAAQAAABAABcAAAABAAQAAABAABgAAAABAAUAAABAABkAAAAHAAoAAABAABoAAAAIAAoAAABAABsAAAAFAAkAAABAABwAAAAAAAAAAABAAB0AAAAIAAoAAABAAB4AAAAAAAAAAABAAB8AAAAHAAkAAABAACAAAAABAAMAAABAACEAAAABAAQAAABAACIAAAABAAQAAABAACMAAAABAAUAAABAACQAAAAHAAkAAABAACUAAAAIAAoAAABAACYAAAAHAAoAAABAACcAAAAHAAoAAABAACgAAAAIAAkAAABAACkAAAAFAAoAAABAACoAAAAIAAkAAABAACsAAAAIAAoAAABAACwAAAAIAAkAAABAAC0AAAAIAAoAAABAAC4AAAAAAAAAAABAAC8AAAAFAAkAAABAADAAAAAHAAoAAABAADEAAAAHAAoAAABAADIAAAAFAAkAAABAADMAAAAFAAoAAABBAPD/AAABAAsAAABBAPH/AAAFAAoAAABBAPL/AAAIAAoAAABBAPP/AAAHAAkAAABBAPT/AAAIAAkAAABBAPX/AAAAAAAAAABBAPb/AAAIAAkAAABBAPf/AAAAAAAAAABBAPj/AAAAAAAAAABBAPn/AAAFAAkAAABBAPr/AAAFAAkAAABBAPv/AAAFAAoAAABBAPz/AAAIAAoAAABBAP3/AAAIAAoAAABBAP7/AAAIAAoAAABBAP//AAAFAAoAAABBAAAAAAAFAAkAAABBAAEAAAAHAAkAAABBAAIAAAAFAAkAAABBAAMAAAAHAAkAAABBAAQAAAAIAAkAAABBAAUAAAAIAAoAAABBAAYAAAAHAAoAAABBAAcAAAAHAAkAAABBAAgAAAAFAAkAAABBAAkAAAAFAAoAAABBAAoAAAAIAAkAAABBAAsAAAAFAAoAAABBAAwAAAAHAAoAAABBAA0AAAAHAAoAAABBAA4AAAAFAAkAAABBAA8AAAAFAAoAAABBABAAAAAFAAkAAABBABEAAAAHAAoAAABBABIAAAAFAAkAAABBABMAAAAAAAMAAABBABQAAAABAAcAAABBABUAAAABAAQAAABBABYAAAABAAQAAABBABcAAAAAAAYAAABBABgAAAACAAUAAABBABkAAAAHAAoAAABBABoAAAAHAAkAAABBABsAAAAFAAoAAABBABwAAAAIAAkAAABBAB0AAAAIAAoAAABBAB4AAAAAAAAAAABBAB8AAAAHAAkAAABBACAAAAABAAMAAABBACEAAAABAAQAAABBACIAAAABAAQAAABBACMAAAABAAUAAABBACQAAAAFAAkAAABBACUAAAAFAAoAAABBACYAAAAAAAAAAABBACcAAAAIAAkAAABBACgAAAAAAAAAAABBACkAAAAHAAkAAABBACoAAAAFAAoAAABBACsAAAAAAAAAAABBACwAAAAFAAoAAABBAC0AAAAAAAAAAABBAC4AAAAIAAkAAABBAC8AAAAFAAkAAABBADAAAAAAAAAAAABBADEAAAAHAAoAAABBADIAAAAAAAAAAABBADMAAAAIAAkAAABCAPD/AAACAAsAAABCAPH/AAAAAAQAAABCAPL/AAAAAAUAAABCAPP/AAAIAAoAAABCAPT/AAAIAAkAAABCAPX/AAAHAAoAAABCAPb/AAAFAAoAAABCAPf/AAAIAAoAAABCAPj/AAAFAAoAAABCAPn/AAAAAAAAAABCAPr/AAAFAAoAAABCAPv/AAAHAAkAAABCAPz/AAAFAAoAAABCAP3/AAAHAAkAAABCAP7/AAAHAAkAAABCAP//AAAAAAAAAABCAAAAAAAFAAkAAABCAAEAAAAAAAAAAABCAAIAAAAAAAAAAABCAAMAAAAFAAkAAABCAAQAAAAIAAoAAABCAAUAAAAFAAkAAABCAAYAAAAFAAoAAABCAAcAAAAHAAkAAABCAAgAAAAFAAoAAABCAAkAAAAFAAkAAABCAAoAAAAHAAkAAABCAAsAAAAFAAoAAABCAAwAAAAIAAoAAABCAA0AAAAIAAoAAABCAA4AAAAIAAkAAABCAA8AAAAIAAkAAABCABAAAAAHAAkAAABCABEAAAAIAAoAAABCABIAAAAAAAMAAABCABMAAAABAAcAAABCABQAAAABAAQAAABCABUAAAABAAQAAABCABYAAAAAAAYAAABCABcAAAACAAUAAABCABgAAAAIAAoAAABCABkAAAAFAAkAAABCABoAAAAFAAkAAABCABsAAAAIAAoAAABCABwAAAAHAAkAAABCAB0AAAAHAAoAAABCAB4AAAAFAAkAAABCAB8AAAAAAAAAAABCACAAAAABAAMAAABCACEAAAABAAQAAABCACIAAAABAAQAAABCACMAAAABAAUAAABCACQAAAAHAAoAAABCACUAAAAFAAkAAABCACYAAAAHAAoAAABCACcAAAAAAAAAAABCACgAAAAIAAkAAABCACkAAAAIAAkAAABCACoAAAAHAAkAAABCACsAAAAFAAkAAABCACwAAAAIAAkAAABCAC0AAAAHAAkAAABCAC4AAAAFAAoAAABCAC8AAAAHAAoAAABCADAAAAAAAAAAAABCADEAAAAIAAoAAABCADIAAAAFAAkAAABCADMAAAAIAAkAAABDAPD/AAARAAcAAABDAPH/AAABAAQAAABDAPL/AAABAAYAAABDAPP/AAAAAAUAAABDAPT/AAAFAAkAAABDAPX/AAAIAAkAAABDAPb/AAAFAAkAAABDAPf/AAAIAAkAAABDAPj/AAAFAAkAAABDAPn/AAAAAAAAAABDAPr/AAAHAAkAAABDAPv/AAAHAAkAAABDAPz/AAAHAAkAAABDAP3/AAAFAAkAAABDAP7/AAAHAAkAAABDAP//AAAIAAkAAABDAAAAAAAIAAoAAABDAAEAAAAAAAAAAABDAAIAAAAIAAoAAABDAAMAAAAIAAkAAABDAAQAAAAHAAoAAABDAAUAAAAIAAkAAABDAAYAAAAHAAkAAABDAAcAAAAFAAkAAABDAAgAAAAHAAkAAABDAAkAAAAIAAoAAABDAAoAAAAHAAoAAABDAAsAAAAFAAkAAABDAAwAAAAFAAoAAABDAA0AAAAAAAAAAABDAA4AAAAFAAkAAABDAA8AAAAIAAoAAABDABAAAAAHAAoAAABDABEAAAAAAAMAAABDABIAAAABAAcAAABDABMAAAABAAQAAABDABQAAAABAAQAAABDABUAAAAAAAYAAABDABYAAAACAAUAAABDABcAAAAIAAkAAABDABgAAAAHAAoAAABDABkAAAAAAAAAAABDABoAAAAIAAkAAABDABsAAAAAAAAAAABDABwAAAAIAAoAAABDAB0AAAAHAAkAAABDAB4AAAAFAAoAAABDAB8AAAAAAAAAAABDACAAAAABAAMAAABDACEAAAABAAQAAABDACIAAAABAAQAAABDACMAAAABAAUAAABDACQAAAAFAAkAAABDACUAAAAHAAkAAABDACYAAAAFAAoAAABDACcAAAAFAAoAAABDACgAAAAIAAkAAABDACkAAAAHAAoAAABDACoAAAAIAAoAAABDACsAAAAHAAoAAABDACwAAAAIAAoAAABDAC0AAAAAAAAAAABDAC4AAAAFAAoAAABDAC8AAAAIAAkAAABDADAAAAAAAAAAAABDADEAAAAHAAkAAABDADIAAAAIAAkAAABDADMAAAAFAAoAAABEAPD/AAABAAQAAABEAPH/AAABAAQAAABEAPL/AAABAAQAAABEAPP/AAABAAYAAABEAPT/AAAAAAQAAABEAPX/AAAAAAUAAABEAPb/AAAFAAoAAABEAPf/AAAHAAkAAABEAPj/AAAIAAoAAABEAPn/AAAIAAoAAABEAPr/AAAAAAAAAABEAPv/AAAIAAkAAABEAPz/AAAFAAoAAABEAP3/AAAAAAAAAABEAP7/AAAIAAkAAABEAP//AAAFAAoAAABEAAAAAAAIAAoAAABEAAEAAAAIAAoAAABEAAIAAAAFAAkAAABEAAMAAAAIAAkAAABEAAQAAAAAAAAAAABEAAUAAAAHAAkAAABEAAYAAAAIAAkAAABEAAcAAAAHAAoAAABEAAgAAAAFAAoAAABEAAkAAAAIAAkAAABEAAoAAAAFAAoAAABEAAsAAAAAAAAAAABEAAwAAAAAAAAAAABEAA0AAAAFAAkAAABEAA4AAAAHAAoAAABEAA8AAAAAAAMAAABEABAAAAAAAAQAAABEABEAAAABAAcAAABEABIAAAABAAQAAABEABMAAAABAAQAAABEABQAAAAAAAYAAABEABUAAAACAAUAAABEABYAAAAFAAkAAABEABcAAAAAAAAAAABEABgAAAAAAAAAAABEABkAAAAFAAoAAABEABoAAAAHAAkAAABEABsAAAAFAAkAAABEABwAAAAHAAkAAABEAB0AAAAIAAoAAABEAB4AAAAHAAoAAABEAB8AAAAHAAkAAABEACAAAAABAAMAAABEACEAAAABAAQAAABEACIAAAABAAQAAABEACMAAAABAAUAAABEACQAAAAIAAkAAABEACUAAAAFAAoAAABEACYAAAAIAAkAAABEACcAAAAAAAAAAABEACgAAAAFAAoAAABEACkAAAAFAAkAAABEACoAAAAAAAAAAABEACsAAAAHAAoAAABEACwAAAAIAAkAAABEAC0AAAAIAAoAAABEAC4AAAAAAAAAAABEAC8AAAAIAAkAAABEADAAAAAIAAkAAABEADEAAAAFAAkAAABEADIAAAAFAAkAAABEADMAAAAHAAoAAABFAPD/AAABAAQAAABFAPH/AAABAAQAAABFAPL/AAABAAQAAABFAPP/AAABAAQAAABFAPT/AAABAAQAAABFAPX/AAABAAYAAABFAPb/AAAAAAUAAABFAPf/AAAIAAoAAABFAPj/AAAAAAAAAABFAPn/AAAHAAoAAABFAPr/AAAAAAAAAABFAPv/AAAHAAkAAABFAPz/AAAIAAkAAABFAP3/AAAIAAoAAABFAP7/AAAFAAkAAABFAP//AAAAAAAAAABFAAAAAAAHAAkAAABFAAEAAAAFAAkAAABFAAIAAAAIAAoAAABFAAMAAAAAAAAAAABFAAQAAAAFAAkAAABFAAUAAAAFAAoAAABFAAYAAAAFAAoAAABFAAcAAAAFAAoAAABFAAgAAAAIAAkAAABFAAkAAAAAAAAAAABFAAoAAAAHAAkAAABFAAsAAAAIAAoAAABFAAwAAAAIAAkAAABFAA0AAAAHAAoAAABFAA4AAAAAAAMAAABFAA8AAAABAAcAAABFABAAAAABAAQAAABFABEAAAABAAQAAABFABIAAAABAAQAAABFABMAAAABAAQAAABFABQAAAABAAUAAABFABUAAAAFAAkAAABFABYAAAAFAAoAAABFABcAAAAIAAkAAABFABgAAAAAAAAAAABFABkAAAAHAAkAAABFABoAAAAIAAkAAABFABsAAAAAAAAAAABFABwAAAAFAAkAAABFAB0AAAAAAAAAAABFAB4AAAAAAAAAAABFAB8AAAAAAAAAAABFACAAAAABAAMAAABFACEAAAABAAQAAABFACIAAAABAAQAAABFACMAAAABAAUAAABFACQAAAAIAAkAAABFACUAAAAHAAoAAABFACYAAAAHAAoAAABFACcAAAAIAAkAAABFACgAAAAHAAoAAABFACkAAAAHAAoAAABFACoAAAAAAAAAAABFACsAAAAFAAkAAABFACwAAAAFAAkAAABFAC0AAAAAAAAAAABFAC4AAAAFAAoAAABFAC8AAAAHAAoAAABFADAAAAAFAAoAAABFADEAAAAFAAkAAABFADIAAAAAAAAAAABFADMAAAAHAAkAAABGAPD/AAAAAAsAAABGAPH/AAACAAQAAABGAPL/AAAAAAcAAABGAPP/AAABAAQAAABGAPT/AAABAAQAAABGAPX/AAABAAQAAABGAPb/AAABAAYAAABGAPf/AAAAAAUAAABGAPj/AAAHAAoAAABGAPn/AAAFAAoAAABGAPr/AAAIAAoAAABGAPv/AAAHAAkAAABGAPz/AAAHAAoAAABGAP3/AAAFAAkAAABGAP7/AAAIAAoAAABGAP//AAAAAAAAAABGAAAAAAAHAAoAAABGAAEAAAAFAAkAAABGAAIAAAAAAAAAAABGAAMAAAAFAAoAAABGAAQAAAAIAAoAAABGAAUAAAAFAAoAAABGAAYAAAAAAAAAAABGAAcAAAAAAAAAAABGAAgAAAAIAAoAAABGAAkAAAAIAAkAAABGAAoAAAAIAAkAAABGAAsAAAAAAAAAAABGAAwAAAAAAAAAAABGAA0AAAAAAAMAAABGAA4AAAABAAcAAABGAA8AAAABAAQAAABGABAAAAABAAQAAABGABEAAAABAAQAAABGABIAAAABAAQAAABGABMAAAAAAAYAAABGABQAAAACAAUAAABGABUAAAAHAAkAAABGABYAAAAHAAoAAABGABcAAAAFAAoAAABGABgAAAAAAAAAAABGABkAAAAAAAAAAABGABoAAAAIAAkAAABGABsAAAAIAAkAAABGABwAAAAHAAoAAABGAB0AAAAHAAkAAABGAB4AAAAAAAAAAABGAB8AAAAFAAkAAABGACAAAAABAAMAAABGACEAAAABAAQAAABGACIAAAABAAQAAABGACMAAAABAAUAAABGACQAAAAIAAkAAABGACUAAAAAAAAAAABGACYAAAAAAAAAAABGACcAAAAFAAkAAABGACgAAAAFAAoAAABGACkAAAAIAAkAAABGACoAAAAFAAoAAABGACsAAAAIAAoAAABGACwAAAAFAAoAAABGAC0AAAAIAAoAAABGAC4AAAAFAAkAAABGAC8AAAAFAAkAAABGADAAAAAAAAAAAABGADEAAAAIAAoAAABGADIAAAAIAAkAAABGADMAAAAIAAkAAABHAPD/AAABAAsAAABHAPH/AAAAAAAAAABHAPL/AAACAAMAAABHAPP/AAACAAQAAABHAPT/AAAAAAcAAABHAPX/AAABAAQAAABHAPb/AAABAAQAAABHAPf/AAABAAYAAABHAPj/AAAAAAUAAABHAPn/AAAIAAoAAABHAPr/AAAFAAkAAABHAPv/AAAHAAoAAABHAPz/AAAIAAkAAABHAP3/AAAFAAkAAABHAP7/AAAIAAkAAABHAP//AAAFAAkAAABHAAAAAAAAAAAAAABHAAEAAAAIAAkAAABHAAIAAAAHAAoAAABHAAMAAAAFAAkAAABHAAQAAAAIAAkAAABHAAUAAAAAAAAAAABHAAYAAAAIAAkAAABHAAcAAAAHAAoAAABHAAgAAAAFAAkAAABHAAkAAAAFAAkAAABHAAoAAAAIAAoAAABHAAsAAAAIAAkAAABHAAwAAAAAAAMAAABHAA0AAAABAAcAAABHAA4AAAABAAQAAABHAA8AAAABAAQAAABHABAAAAABAAQAAABHABEAAAAAAAYAAABHABIAAAACAAQAAABHABMAAAACAAUAAABHABQAAAAIAAoAAABHABUAAAAHAAkAAABHABYAAAAFAAkAAABHABcAAAAIAAoAAABHABgAAAAIAAoAAABHABkAAAAHAAkAAABHABoAAAAHAAoAAABHABsAAAAFAAoAAABHABwAAAAHAAoAAABHAB0AAAAHAAoAAABHAB4AAAAHAAoAAABHAB8AAAAHAAkAAABHACAAAAABAAMAAABHACEAAAABAAQAAABHACIAAAABAAQAAABHACMAAAABAAUAAABHACQAAAAIAAkAAABHACUAAAAFAAkAAABHACYAAAAFAAoAAABHACcAAAAHAAoAAABHACgAAAAFAAoAAABHACkAAAAAAAAAAABHACoAAAAAAAAAAABHACsAAAAHAAoAAABHACwAAAAIAAkAAABHAC0AAAAFAAoAAABHAC4AAAAFAAkAAABHAC8AAAAHAAkAAABHADAAAAAIAAkAAABHADEAAAAHAAkAAABHADIAAAAFAAoAAABHADMAAAAHAAkAAABIAPD/AAABAAsAAABIAPH/AAAIAAkAAABIAPL/AAAIAAoAAABIAPP/AAAAAAAAAABIAPT/AAACAAMAAABIAPX/AAAAAAcAAABIAPb/AAABAAQAAABIAPf/AAABAAQAAABIAPj/AAABAAYAAABIAPn/AAAAAAQAAABIAPr/AAAAAAUAAABIAPv/AAAHAAkAAABIAPz/AAAHAAkAAABIAP3/AAAHAAoAAABIAP7/AAAFAAkAAABIAP//AAAFAAoAAABIAAAAAAAHAAkAAABIAAEAAAAHAAkAAABIAAIAAAAIAAkAAABIAAMAAAAIAAoAAABIAAQAAAAHAAkAAABIAAUAAAAFAAoAAABIAAYAAAAIAAkAAABIAAcAAAAIAAoAAABIAAgAAAAAAAAAAABIAAkAAAAHAAkAAABIAAoAAAAAAAMAAABIAAsAAAAAAAQAAABIAAwAAAABAAcAAABIAA0AAAABAAQAAABIAA4AAAABAAQAAABIAA8AAAABAAQAAABIABAAAAAAAAYAAABIABEAAAACAAUAAABIABIAAAAHAAoAAABIABMAAAAIAAkAAABIABQAAAAFAAkAAABIABUAAAAIAAkAAABIABYAAAAHAAkAAABIABcAAAAFAAkAAABIABgAAAAIAAkAAABIABkAAAAFAAkAAABIABoAAAAIAAoAAABIABsAAAAFAAoAAABIABwAAAAFAAoAAABIAB0AAAAAAAAAAABIAB4AAAAIAAoAAABIAB8AAAAIAAoAAABIACAAAAABAAMAAABIACEAAAABAAQAAABIACIAAAABAAQAAABIACMAAAABAAUAAABIACQAAAAHAAkAAABIACUAAAAHAAoAAABIACYAAAAIAAkAAABIACcAAAAHAAoAAABIACgAAAAHAAkAAABIACkAAAAHAAkAAABIACoAAAAFAAkAAABIACsAAAAIAAkAAABIACwAAAAIAAkAAABIAC0AAAAHAAkAAABIAC4AAAAIAAoAAABIAC8AAAAFAAkAAABIADAAAAAFAAoAAABIADEAAAAHAAkAAABIADIAAAAAAAAAAABIADMAAAAHAAoAAABJAPD/AAABAAsAAABJAPH/AAAFAAoAAABJAPL/AAAIAAkAAABJAPP/AAAFAAoAAABJAPT/AAAIAAkAAABJAPX/AAABAAMAAABJAPb/AAABAAQAAABJAPf/AAABAAQAAABJAPj/AAABAAQAAABJAPn/AAABAAQAAABJAPr/AAABAAUAAABJAPv/AAAAAAAAAABJAPz/AAAIAAkAAABJAP3/AAAIAAkAAABJAP7/AAAFAAoAAABJAP//AAAHAAoAAABJAAAAAAAHAAkAAABJAAEAAAAFAAkAAABJAAIAAAAHAAkAAABJAAMAAAAAAAAAAABJAAQAAAAAAAAAAABJAAUAAAAHAAkAAABJAAYAAAAIAAoAAABJAAcAAAAFAAkAAABJAAgAAAAIAAkAAABJAAkAAAAAAAMAAABJAAoAAAABAAcAAABJAAsAAAABAAQAAABJAAwAAAABAAQAAABJAA0AAAABAAQAAABJAA4AAAABAAQAAABJAA8AAAAAAAYAAABJABAAAAACAAUAAABJABEAAAAFAAkAAABJABIAAAAIAAkAAABJABMAAAAIAAkAAABJABQAAAAHAAkAAABJABUAAAAFAAoAAABJABYAAAAFAAkAAABJABcAAAAAAAAAAABJABgAAAAAAAAAAABJABkAAAAHAAkAAABJABoAAAAAAAAAAABJABsAAAAHAAkAAABJABwAAAAFAAoAAABJAB0AAAAHAAoAAABJAB4AAAAHAAkAAABJAB8AAAAHAAoAAABJACAAAAABAAMAAABJACEAAAABAAQAAABJACIAAAABAAQAAABJACMAAAABAAUAAABJACQAAAAIAAkAAABJACUAAAAAAAAAAABJACYAAAAIAAkAAABJACcAAAAIAAkAAABJACgAAAAFAAkAAABJACkAAAAHAAkAAABJACoAAAAIAAkAAABJACsAAAAFAAoAAABJACwAAAAFAAoAAABJAC0AAAAAAAAAAABJAC4AAAAIAAoAAABJAC8AAAAFAAkAAABJADAAAAAHAAkAAABJADEAAAAFAAoAAABJADIAAAAHAAoAAABJADMAAAAIAAoAAABKAPD/AAABAAsAAABKAPH/AAAFAAoAAABKAPL/AAAIAAkAAABKAPP/AAAIAAkAAABKAPT/AAAIAAkAAABKAPX/AAACAAMAAABKAPb/AAAAAAcAAABKAPf/AAABAAQAAABKAPj/AAABAAQAAABKAPn/AAABAAQAAABKAPr/AAABAAYAAABKAPv/AAAAAAUAAABKAPz/AAAHAAkAAABKAP3/AAAIAAoAAABKAP7/AAAFAAoAAABKAP//AAAFAAoAAABKAAAAAAAFAAkAAABKAAEAAAAAAAAAAABKAAIAAAAHAAkAAABKAAMAAAAIAAkAAABKAAQAAAAFAAkAAABKAAUAAAAHAAoAAABKAAYAAAAAAAAAAABKAAcAAAAIAAoAAABKAAgAAAAAAAMAAABKAAkAAAABAAcAAABKAAoAAAABAAQAAABKAAsAAAABAAQAAABKAAwAAAABAAQAAABKAA0AAAABAAQAAABKAA4AAAAAAAYAAABKAA8AAAACAAUAAABKABAAAAAAAAAAAABKABEAAAAHAAoAAABKABIAAAAAAAAAAABKABMAAAAIAAoAAABKABQAAAAHAAoAAABKABUAAAAHAAkAAABKABYAAAAAAAAAAABKABcAAAAFAAkAAABKABgAAAAFAAkAAABKABkAAAAHAAoAAABKABoAAAAAAAAAAABKABsAAAAFAAkAAABKABwAAAAIAAkAAABKAB0AAAAFAAoAAABKAB4AAAAHAAoAAABKAB8AAAAHAAoAAABKACAAAAABAAMAAABKACEAAAABAAQAAABKACIAAAABAAQAAABKACMAAAABAAUAAABKACQAAAAFAAkAAABKACUAAAAFAAkAAABKACYAAAAAAAAAAABKACcAAAAFAAoAAABKACgAAAAFAAoAAABKACkAAAAHAAoAAABKACoAAAAFAAkAAABKACsAAAAHAAoAAABKACwAAAAIAAoAAABKAC0AAAAFAAoAAABKAC4AAAAFAAkAAABKAC8AAAAFAAkAAABKADAAAAAHAAoAAABKADEAAAAHAAkAAABKADIAAAAFAAoAAABKADMAAAAHAAoAAABLAPD/AAABAAsAAABLAPH/AAAHAAkAAABLAPL/AAAHAAoAAABLAPP/AAAHAAkAAABLAPT/AAAFAAkAAABLAPX/AAAFAAoAAABLAPb/AAACAAMAAABLAPf/AAAAAAcAAABLAPj/AAABAAQAAABLAPn/AAABAAQAAABLAPr/AAABAAQAAABLAPv/AAABAAYAAABLAPz/AAAAAAUAAABLAP3/AAAIAAkAAABLAP7/AAAFAAkAAABLAP//AAAHAAkAAABLAAAAAAAFAAkAAABLAAEAAAAAAAAAAABLAAIAAAAIAAoAAABLAAMAAAAIAAkAAABLAAQAAAAIAAkAAABLAAUAAAAAAAAAAABLAAYAAAAAAAMAAABLAAcAAAAAAAQAAABLAAgAAAABAAcAAABLAAkAAAABAAQAAABLAAoAAAABAAQAAABLAAsAAAABAAQAAABLAAwAAAABAAQAAABLAA0AAAAAAAYAAABLAA4AAAACAAUAAABLAA8AAAAFAAoAAABLABAAAAAHAAkAAABLABEAAAAHAAoAAABLABIAAAAHAAkAAABLABMAAAAHAAkAAABLABQAAAAAAAAAAABLABUAAAAHAAoAAABLABYAAAAHAAkAAABLABcAAAAFAAkAAABLABgAAAAAAAAAAABLABkAAAAHAAoAAABLABoAAAAFAAkAAABLABsAAAAIAAoAAABLABwAAAAFAAkAAABLAB0AAAAAAAAAAABLAB4AAAAFAAoAAABLAB8AAAAIAAoAAABLACAAAAABAAMAAABLACEAAAABAAQAAABLACIAAAABAAQAAABLACMAAAABAAUAAABLACQAAAAFAAoAAABLACUAAAAHAAoAAABLACYAAAAFAAkAAABLACcAAAAHAAoAAABLACgAAAAHAAoAAABLACkAAAAIAAkAAABLACoAAAAFAAkAAABLACsAAAAHAAkAAABLACwAAAAAAAAAAABLAC0AAAAFAAoAAABLAC4AAAAAAAAAAABLAC8AAAAAAAAAAABLADAAAAAHAAkAAABLADEAAAAIAAoAAABLADIAAAAHAAoAAABLADMAAAAFAAoAAABMAPD/AAABAAsAAABMAPH/AAAIAAkAAABMAPL/AAAIAAkAAABMAPP/AAAFAAoAAABMAPT/AAAFAAoAAABMAPX/AAAHAAoAAABMAPb/AAAIAAoAAABMAPf/AAABAAMAAABMAPj/AAABAAQAAABMAPn/AAABAAQAAABMAPr/AAABAAQAAABMAPv/AAABAAQAAABMAPz/AAABAAYAAABMAP3/AAAAAAUAAABMAP7/AAAFAAoAAABMAP//AAAIAAkAAABMAAAAAAAHAAoAAABMAAEAAAAIAAkAAABMAAIAAAAFAAkAAABMAAMAAAAHAAkAAABMAAQAAAAAAAMAAABMAAUAAAAAAAQAAABMAAYAAAABAAcAAABMAAcAAAABAAQAAABMAAgAAAABAAQAAABMAAkAAAABAAQAAABMAAoAAAABAAQAAABMAAsAAAABAAQAAABMAAwAAAAAAAYAAABMAA0AAAACAAUAAABMAA4AAAAHAAoAAABMAA8AAAAHAAoAAABMABAAAAAIAAoAAABMABEAAAAHAAoAAABMABIAAAAIAAoAAABMABMAAAAIAAoAAABMABQAAAAFAAoAAABMABUAAAAFAAoAAABMABYAAAAFAAoAAABMABcAAAAHAAoAAABMABgAAAAFAAkAAABMABkAAAAHAAoAAABMABoAAAAIAAkAAABMABsAAAAIAAkAAABMABwAAAAIAAkAAABMAB0AAAAHAAoAAABMAB4AAAAIAAkAAABMAB8AAAAAAAAAAABMACAAAAABAAMAAABMACEAAAABAAQAAABMACIAAAABAAQAAABMACMAAAABAAUAAABMACQAAAAFAAoAAABMACUAAAAFAAkAAABMACYAAAAIAAkAAABMACcAAAAFAAoAAABMACgAAAAIAAoAAABMACkAAAAIAAoAAABMACoAAAAHAAoAAABMACsAAAAFAAkAAABMACwAAAAFAAoAAABMAC0AAAAHAAoAAABMAC4AAAAFAAoAAABMAC8AAAAIAAkAAABMADAAAAAFAAoAAABMADEAAAAHAAoAAABMADIAAAAIAAoAAABMADMAAAAHAAoAAABNAPD/AAABAAsAAABNAPH/AAAIAAoAAABNAPL/AAAFAAkAAABNAPP/AAAAAAAAAABNAPT/AAAFAAoAAABNAPX/AAAFAAkAAABNAPb/AAAHAAoAAABNAPf/AAACAAMAAABNAPj/AAAAAAcAAABNAPn/AAABAAQAAABNAPr/AAABAAQAAABNAPv/AAABAAQAAABNAPz/AAABAAQAAABNAP3/AAABAAUAAABNAP7/AAAFAAkAAABNAP//AAAHAAoAAABNAAAAAAAFAAkAAABNAAEAAAAFAAoAAABNAAIAAAAHAAkAAABNAAMAAAAAAAMAAABNAAQAAAABAAcAAABNAAUAAAABAAQAAABNAAYAAAABAAQAAABNAAcAAAABAAQAAABNAAgAAAABAAQAAABNAAkAAAABAAQAAABNAAoAAAAAAAYAAABNAAsAAAACAAQAAABNAAwAAAACAAUAAABNAA0AAAAAAAAAAABNAA4AAAAHAAkAAABNAA8AAAAIAAkAAABNABAAAAAHAAoAAABNABEAAAAFAAoAAABNABIAAAAFAAoAAABNABMAAAAFAAoAAABNABQAAAAHAAkAAABNABUAAAAFAAkAAABNABYAAAAFAAkAAABNABcAAAAFAAoAAABNABgAAAAHAAoAAABNABkAAAAHAAkAAABNABoAAAAIAAkAAABNABsAAAAIAAoAAABNABwAAAAFAAkAAABNAB0AAAAAAAAAAABNAB4AAAAFAAkAAABNAB8AAAAHAAoAAABNACAAAAABAAMAAABNACEAAAABAAQAAABNACIAAAABAAQAAABNACMAAAABAAUAAABNACQAAAAFAAoAAABNACUAAAAHAAkAAABNACYAAAAFAAoAAABNACcAAAAHAAkAAABNACgAAAAHAAkAAABNACkAAAAFAAoAAABNACoAAAAHAAkAAABNACsAAAAHAAkAAABNACwAAAAHAAoAAABNAC0AAAAFAAoAAABNAC4AAAAHAAoAAABNAC8AAAAIAAkAAABNADAAAAAFAAkAAABNADEAAAAFAAoAAABNADIAAAAHAAkAAABNADMAAAAFAAoAAABOAPD/AAABAAsAAABOAPH/AAAIAAoAAABOAPL/AAAIAAkAAABOAPP/AAAFAAkAAABOAPT/AAAFAAoAAABOAPX/AAAIAAoAAABOAPb/AAAFAAkAAABOAPf/AAAFAAoAAABOAPj/AAACAAMAAABOAPn/AAAAAAcAAABOAPr/AAABAAQAAABOAPv/AAABAAQAAABOAPz/AAABAAQAAABOAP3/AAABAAYAAABOAP7/AAAAAAQAAABOAP//AAAAAAQAAABOAAAAAAAAAAQAAABOAAEAAAAAAAQAAABOAAIAAAAAAAQAAABOAAMAAAABAAcAAABOAAQAAAABAAQAAABOAAUAAAABAAQAAABOAAYAAAABAAQAAABOAAcAAAABAAQAAABOAAgAAAAAAAYAAABOAAkAAAACAAQAAABOAAoAAAACAAUAAABOAAsAAAAIAAoAAABOAAwAAAAFAAkAAABOAA0AAAAAAAAAAABOAA4AAAAIAAoAAABOAA8AAAAFAAoAAABOABAAAAAHAAkAAABOABEAAAAHAAoAAABOABIAAAAHAAoAAABOABMAAAAFAAoAAABOABQAAAAIAAoAAABOABUAAAAFAAoAAABOABYAAAAAAAAAAABOABcAAAAAAAAAAABOABgAAAAHAAkAAABOABkAAAAIAAoAAABOABoAAAAFAAoAAABOABsAAAAIAAkAAABOABwAAAAAAAAAAABOAB0AAAAAAAAAAABOAB4AAAAHAAkAAABOAB8AAAAIAAoAAABOACAAAAABAAMAAABOACEAAAABAAQAAABOACMAAAABAAUAAABOACQAAAAIAAkAAABOACUAAAAFAAoAAABOACYAAAAFAAoAAABOACcAAAAHAAoAAABOACgAAAAIAAoAAABOACkAAAAIAAkAAABOACoAAAAIAAkAAABOACsAAAAIAAoAAABOACwAAAAAAAAAAABOAC0AAAAIAAoAAABOAC4AAAAAAAAAAABOAC8AAAAIAAkAAABOADAAAAAFAAoAAABOADEAAAAHAAoAAABOADIAAAAFAAoAAABOADMAAAAAAAAAAABPAPD/AAABAAsAAABPAPH/AAAHAAoAAABPAPL/AAAAAAAAAABPAPP/AAAFAAoAAABPAPT/AAAHAAkAAABPAPX/AAAHAAoAAABPAPb/AAAFAAkAAABPAPf/AAAIAAkAAABPAPj/AAAIAAkAAABPAPn/AAACAAMAAABPAPr/AAACAAQAAABPAPv/AAAAAAcAAABPAPz/AAABAAQAAABPAP3/AAABAAQAAABPAP7/AAABAAQAAABPAP//AAABAAQAAABPAAAAAAABAAQAAABPAAEAAAABAAQAAABPAAIAAAABAAQAAABPAAMAAAABAAQAAABPAAQAAAABAAQAAABPAAUAAAABAAQAAABPAAYAAAAAAAYAAABPAAcAAAACAAQAAABPAAgAAAACAAUAAABPAAkAAAAIAAoAAABPAAoAAAAHAAoAAABPAAsAAAAFAAkAAABPAAwAAAAIAAoAAABPAA0AAAAFAAoAAABPAA4AAAAIAAoAAABPAA8AAAAHAAkAAABPABAAAAAIAAkAAABPABEAAAAAAAAAAABPABIAAAAHAAkAAABPABMAAAAFAAkAAABPABQAAAAFAAkAAABPABUAAAAFAAkAAABPABYAAAAIAAoAAABPABcAAAAFAAkAAABPABgAAAAHAAoAAABPABkAAAAFAAoAAABPABoAAAAHAAoAAABPABsAAAAHAAkAAABPABwAAAAHAAkAAABPAB0AAAAHAAkAAABPAB4AAAAFAAkAAABPAB8AAAAFAAoAAABPACAAAAABAAMAAABPACEAAAABAAQAAABPACQAAAAHAAkAAABPACUAAAAHAAoAAABPACYAAAAHAAkAAABPACcAAAAFAAoAAABPACgAAAAHAAoAAABPACkAAAAFAAkAAABPACoAAAAIAAoAAABPACsAAAAIAAkAAABPACwAAAAHAAkAAABPAC0AAAAHAAoAAABPAC4AAAAFAAkAAABPAC8AAAAHAAkAAABPADAAAAAIAAoAAABPADEAAAAAAAAAAABPADIAAAAIAAkAAABPADMAAAAAAAAAAABQAPD/AAABAAsAAABQAPH/AAAAAAkAAABQAPL/AAAAAAoAAABQAPP/AAAIAAkAAABQAPT/AAAIAAkAAABQAPX/AAAFAAoAAABQAPb/AAAFAAkAAABQAPf/AAAIAAoAAABQAPj/AAAIAAkAAABQAPn/AAAFAAkAAABQAPr/AAAAAAAAAABQAPv/AAABAAMAAABQAPz/AAABAAQAAABQAP3/AAAPAAYAAABQAP7/AAAPAAgAAABQAP//AAAPAAcAAABQAAAAAAAPAAYAAABQAAEAAAAPAAcAAABQAAIAAAAPAAcAAABQAAMAAAAAAAYAAABQAAQAAAACAAQAAABQAAUAAAACAAQAAABQAAYAAAACAAUAAABQAAcAAAAIAAoAAABQAAgAAAAHAAkAAABQAAkAAAAFAAoAAABQAAoAAAAFAAoAAABQAAsAAAAIAAoAAABQAAwAAAAHAAoAAABQAA0AAAAIAAkAAABQAA4AAAAFAAoAAABQAA8AAAAIAAoAAABQABAAAAAIAAkAAABQABEAAAAAAAkAAABQABIAAAAAAAoAAABQABMAAAAHAAoAAABQABQAAAAHAAkAAABQABUAAAAAAAAAAABQABYAAAAAAAAAAABQABcAAAAIAAoAAABQABgAAAAHAAkAAABQABkAAAAAAAAAAABQABoAAAAIAAkAAABQABsAAAAIAAkAAABQABwAAAAAAAAAAABQAB0AAAAAAAAAAABQAB4AAAAAAAkAAABQAB8AAAAAAAkAAABQACAAAAABAAMAAABQACEAAAABAAQAAABQACQAAAAAAAoAAABQACUAAAAAAAkAAABQACYAAAAAAAoAAABQACcAAAAAAAkAAABQACgAAAAAAAoAAABQACkAAAAAAAkAAABQACoAAAAAAAoAAABQACsAAAAAAAkAAABQACwAAAAAAAoAAABQAC0AAAAAAAkAAABQAC4AAAAAAAoAAABQAC8AAAAAAAkAAABQADAAAAAAAAoAAABQADEAAAAFAAkAAABQADIAAAAHAAkAAABQADMAAAAAAAkAAAAMAAYAAAAHAAoAAAAOAAYAAAAFAAoAAAAYAPj/AAADAAcAAAApAPj/AAADAAcAAAApAPn/AAADAAcAAAAqAPj/AAADAAcAAAAqAPn/AAADAAcAAAAPAAAAAAABAAMAAAAPAAEAAAABAAQAAAAPAAIAAAABAAUAAAAQAAAAAAABAAMAAAAQAAEAAAABAAQAAAAQAAIAAAABAAUAAAARAAAAAAABAAMAAAARAAEAAAABAAQAAAARAAIAAAABAAUAAAAlAAoAAAADAAcAAAAkAAoAAAADAAcAAAAkAAsAAAADAAcAAAAlAAwAAAADAAcAAAAlAAsAAAAAAAEAAAAmAAsAAAAAAAEAAAAmAAwAAAAAAAEAAAAnAAsAAAAAAAEAAAAoAAsAAAADAAcAAAAnAAoAAAAAAAEAAAAmAAoAAAAAAAEAAAAWAAwAAAADAAkAAAAEAP7/AAAAAAAAAAAIAPv/AAAIAAkAAAAKAP3/AAAIAAkAAAAHAP7/AAAAAAAAAAAHAP3/AAAGAAAAAAAIAPz/AAAOAAAAAAAGAPz/AAAAAAAAAAAKAP7/AAAIAAkAAAAHAP//AAABAAQAAAAGAAMAAAALAAAAAABOACIAAAABAAQAAABPACIAAAABAAQAAABQACIAAAAPAAcAAABPACMAAAABAAUAAABQACMAAAACAAsAAAD+/wcAAAAIAAkAAAD8////AAARACEAAAAIABQAAAAIAAkAAABSABYAAAACAAsAAABRABcAAAAAAAkAAABRABgAAAAAAAkAAABRABkAAAAAAAkAAABRABoAAAAAAAoAAABRABsAAAAHAAkAAABRABwAAAAAAAkAAABSABkAAAACAAsAAABSABgAAAACAAsAAABSABcAAAACAAsAAABSABUAAAAAAAkAAABSABQAAAACAAsAAABSABMAAAAAAAkAAABSABIAAAABAAsAAABRABUAAAAAAAkAAABRABYAAAAAAAkAAABRABMAAAAAAAkAAABRABQAAAAAAAoAAABRABIAAAABAAsAAABRAB0AAAAAAAoAAABRAB4AAAAAAAkAAABSABwAAAAAAAkAAABRADEAAAABAAsAAABRADIAAAAIAAoAAABRADMAAAABAAkAAAAbADQAAAADAAcAAAAbADUAAAADAAcAAAAbADYAAAADAAcAAAAaADYAAAADAAcAAAAaADcAAAADAAcAAAAaADgAAAAAAAEAAAAZADgAAAADAAcAAAAZADkAAAADAAcAAAAZADoAAAAAAAEAAAAZADsAAAADAAcAAAAaADkAAAADAAcAAAAbADgAAAAAAAEAAAAbADcAAAADAAcAAAAcADYAAAAAAAEAAAAcADUAAAAAAAEAAAAdADQAAAADAAcAAAAcADQAAAADAAcAAAA=") +tile_set = SubResource("TileSet_snsnx") + +[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_5ranr")] +position = Vector2(-34, 99) +player = NodePath("../Player") +_to_scene = 1 +push_direction = 1 + +[node name="DoorSceneManager2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_5ranr")] +position = Vector2(78, 419) +player = NodePath("../Player") +_to_scene = 1 +push_direction = 1 + +[node name="Player" parent="." instance=ExtResource("4_y0qys")] +z_index = 1 +motion_mode = 1 + +[node name="Camera2D" type="Camera2D" parent="Player"] +z_index = 4096 +zoom = Vector2(2, 2) + +[node name="PauseMenu" parent="Player/Camera2D" instance=ExtResource("5_06oyi")] +offset_left = -288.0 +offset_top = -162.0 +offset_right = 288.0 +offset_bottom = 162.0 + +[node name="InventoryMenu" parent="Player/Camera2D" instance=ExtResource("6_cymwe")] +process_mode = 3 diff --git a/scenes/main_level.tscn b/scenes/main_level.tscn deleted file mode 100644 index 831ac97..0000000 --- a/scenes/main_level.tscn +++ /dev/null @@ -1,1671 +0,0 @@ -[gd_scene load_steps=9 format=4 uid="uid://ds1fjw3marbia"] - -[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="1_6iuf6"] -[ext_resource type="Script" path="res://scripts/main_level.gd" id="1_fdviv"] -[ext_resource type="Texture2D" uid="uid://bj3fteudhyal6" path="res://assets/textures/Overworld.png" id="1_pt2os"] -[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="1_qqjfh"] -[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/interfaces/pause_menu.tscn" id="2_4k3ic"] -[ext_resource type="PackedScene" uid="uid://cjvtoi20cy8wi" path="res://scenes/interfaces/inventory.tscn" id="6_a0ayx"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_n0o3p"] -texture = ExtResource("1_pt2os") -0:0/0 = 0 -0:0/0/terrain_set = 0 -0:0/0/terrain = 0 -0:0/0/terrains_peering_bit/right_side = 0 -0:0/0/terrains_peering_bit/bottom_right_corner = 0 -0:0/0/terrains_peering_bit/bottom_side = 0 -0:0/0/terrains_peering_bit/bottom_left_corner = 0 -0:0/0/terrains_peering_bit/left_side = 0 -0:0/0/terrains_peering_bit/top_left_corner = 0 -0:0/0/terrains_peering_bit/top_side = 0 -0:0/0/terrains_peering_bit/top_right_corner = 0 -1:0/0 = 0 -2:0/0 = 0 -3:0/0 = 0 -4:0/0 = 0 -5:0/0 = 0 -25:0/0 = 0 -26:0/0 = 0 -27:0/0 = 0 -28:0/0 = 0 -29:0/0 = 0 -30:0/0 = 0 -31:0/0 = 0 -32:0/0 = 0 -33:0/0 = 0 -34:0/0 = 0 -35:0/0 = 0 -36:0/0 = 0 -37:0/0 = 0 -25:1/0 = 0 -26:1/0 = 0 -27:1/0 = 0 -28:1/0 = 0 -29:1/0 = 0 -30:1/0 = 0 -31:1/0 = 0 -32:1/0 = 0 -33:1/0 = 0 -34:1/0 = 0 -35:1/0 = 0 -36:1/0 = 0 -37:1/0 = 0 -38:1/0 = 0 -25:2/0 = 0 -26:2/0 = 0 -27:2/0 = 0 -28:2/0 = 0 -29:2/0 = 0 -30:2/0 = 0 -31:2/0 = 0 -32:2/0 = 0 -33:2/0 = 0 -34:2/0 = 0 -35:2/0 = 0 -36:2/0 = 0 -37:2/0 = 0 -38:2/0 = 0 -3:3/0 = 0 -4:3/0 = 0 -5:3/0 = 0 -25:3/0 = 0 -26:3/0 = 0 -27:3/0 = 0 -28:3/0 = 0 -29:3/0 = 0 -30:3/0 = 0 -31:3/0 = 0 -32:3/0 = 0 -33:3/0 = 0 -34:3/0 = 0 -35:3/0 = 0 -36:3/0 = 0 -37:3/0 = 0 -38:3/0 = 0 -3:4/0 = 0 -4:4/0 = 0 -5:4/0 = 0 -21:4/0 = 0 -25:4/0 = 0 -26:4/0 = 0 -27:4/0 = 0 -28:4/0 = 0 -29:4/0 = 0 -30:4/0 = 0 -31:4/0 = 0 -32:4/0 = 0 -33:4/0 = 0 -34:4/0 = 0 -35:4/0 = 0 -36:4/0 = 0 -37:4/0 = 0 -38:4/0 = 0 -6:5/0 = 0 -7:5/0 = 0 -8:5/0 = 0 -9:5/0 = 0 -10:5/0 = 0 -21:5/0 = 0 -25:5/0 = 0 -26:5/0 = 0 -27:5/0 = 0 -28:5/0 = 0 -29:5/0 = 0 -30:5/0 = 0 -31:5/0 = 0 -32:5/0 = 0 -33:5/0 = 0 -34:5/0 = 0 -35:5/0 = 0 -36:5/0 = 0 -37:5/0 = 0 -38:5/0 = 0 -39:5/0 = 0 -5:6/0 = 0 -6:6/0 = 0 -7:6/0 = 0 -8:6/0 = 0 -9:6/0 = 0 -10:6/0 = 0 -15:6/0 = 0 -15:6/0/terrain_set = 0 -15:6/0/terrain = 2 -15:6/0/terrains_peering_bit/right_side = 2 -15:6/0/terrains_peering_bit/bottom_right_corner = 1 -15:6/0/terrains_peering_bit/bottom_side = 2 -15:6/0/terrains_peering_bit/bottom_left_corner = 2 -15:6/0/terrains_peering_bit/left_side = 2 -15:6/0/terrains_peering_bit/top_left_corner = 2 -15:6/0/terrains_peering_bit/top_side = 2 -15:6/0/terrains_peering_bit/top_right_corner = 2 -16:6/0 = 0 -16:6/0/terrain_set = 0 -16:6/0/terrain = 2 -16:6/0/terrains_peering_bit/right_side = 2 -16:6/0/terrains_peering_bit/bottom_right_corner = 1 -16:6/0/terrains_peering_bit/bottom_side = 1 -16:6/0/terrains_peering_bit/bottom_left_corner = 1 -16:6/0/terrains_peering_bit/left_side = 2 -16:6/0/terrains_peering_bit/top_left_corner = 2 -16:6/0/terrains_peering_bit/top_side = 2 -16:6/0/terrains_peering_bit/top_right_corner = 2 -17:6/0 = 0 -17:6/0/terrain_set = 0 -17:6/0/terrain = 2 -17:6/0/terrains_peering_bit/right_side = 2 -17:6/0/terrains_peering_bit/bottom_right_corner = 2 -17:6/0/terrains_peering_bit/bottom_side = 2 -17:6/0/terrains_peering_bit/bottom_left_corner = 1 -17:6/0/terrains_peering_bit/left_side = 2 -17:6/0/terrains_peering_bit/top_left_corner = 2 -17:6/0/terrains_peering_bit/top_side = 2 -17:6/0/terrains_peering_bit/top_right_corner = 2 -18:6/0 = 0 -18:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -19:6/0 = 0 -19:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -20:6/0 = 0 -20:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -21:6/0 = 0 -22:6/0 = 0 -23:6/0 = 0 -24:6/0 = 0 -25:6/0 = 0 -26:6/0 = 0 -27:6/0 = 0 -28:6/0 = 0 -29:6/0 = 0 -30:6/0 = 0 -31:6/0 = 0 -32:6/0 = 0 -33:6/0 = 0 -34:6/0 = 0 -35:6/0 = 0 -36:6/0 = 0 -37:6/0 = 0 -38:6/0 = 0 -39:6/0 = 0 -5:7/0 = 0 -6:7/0 = 0 -7:7/0 = 0 -8:7/0 = 0 -9:7/0 = 0 -10:7/0 = 0 -11:7/0 = 0 -12:7/0 = 0 -15:7/0 = 0 -15:7/0/terrain_set = 0 -15:7/0/terrain = 2 -15:7/0/terrains_peering_bit/right_side = 1 -15:7/0/terrains_peering_bit/bottom_right_corner = 1 -15:7/0/terrains_peering_bit/bottom_side = 2 -15:7/0/terrains_peering_bit/bottom_left_corner = 2 -15:7/0/terrains_peering_bit/left_side = 2 -15:7/0/terrains_peering_bit/top_left_corner = 2 -15:7/0/terrains_peering_bit/top_side = 2 -15:7/0/terrains_peering_bit/top_right_corner = 1 -17:7/0 = 0 -17:7/0/terrain_set = 0 -17:7/0/terrain = 2 -17:7/0/terrains_peering_bit/right_side = 2 -17:7/0/terrains_peering_bit/bottom_right_corner = 2 -17:7/0/terrains_peering_bit/bottom_side = 2 -17:7/0/terrains_peering_bit/bottom_left_corner = 1 -17:7/0/terrains_peering_bit/left_side = 1 -17:7/0/terrains_peering_bit/top_left_corner = 1 -17:7/0/terrains_peering_bit/top_side = 2 -17:7/0/terrains_peering_bit/top_right_corner = 2 -18:7/0 = 0 -18:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -19:7/0 = 0 -19:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -20:7/0 = 0 -20:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -26:7/0 = 0 -27:7/0 = 0 -28:7/0 = 0 -29:7/0 = 0 -30:7/0 = 0 -35:7/0 = 0 -36:7/0 = 0 -37:7/0 = 0 -38:7/0 = 0 -39:7/0 = 0 -0:8/0 = 0 -1:8/0 = 0 -5:8/0 = 0 -6:8/0 = 0 -7:8/0 = 0 -8:8/0 = 0 -9:8/0 = 0 -10:8/0 = 0 -11:8/0 = 0 -12:8/0 = 0 -13:8/0 = 0 -14:8/0 = 0 -15:8/0 = 0 -15:8/0/terrain_set = 0 -15:8/0/terrain = 2 -15:8/0/terrains_peering_bit/right_side = 2 -15:8/0/terrains_peering_bit/bottom_right_corner = 2 -15:8/0/terrains_peering_bit/bottom_side = 2 -15:8/0/terrains_peering_bit/bottom_left_corner = 2 -15:8/0/terrains_peering_bit/left_side = 2 -15:8/0/terrains_peering_bit/top_left_corner = 2 -15:8/0/terrains_peering_bit/top_side = 2 -15:8/0/terrains_peering_bit/top_right_corner = 1 -16:8/0 = 0 -16:8/0/terrain_set = 0 -16:8/0/terrain = 2 -16:8/0/terrains_peering_bit/right_side = 2 -16:8/0/terrains_peering_bit/bottom_right_corner = 2 -16:8/0/terrains_peering_bit/bottom_side = 2 -16:8/0/terrains_peering_bit/bottom_left_corner = 2 -16:8/0/terrains_peering_bit/left_side = 2 -16:8/0/terrains_peering_bit/top_left_corner = 1 -16:8/0/terrains_peering_bit/top_side = 1 -16:8/0/terrains_peering_bit/top_right_corner = 1 -17:8/0 = 0 -17:8/0/terrain_set = 0 -17:8/0/terrain = 2 -17:8/0/terrains_peering_bit/right_side = 2 -17:8/0/terrains_peering_bit/bottom_right_corner = 2 -17:8/0/terrains_peering_bit/bottom_side = 2 -17:8/0/terrains_peering_bit/bottom_left_corner = 2 -17:8/0/terrains_peering_bit/left_side = 2 -17:8/0/terrains_peering_bit/top_left_corner = 1 -17:8/0/terrains_peering_bit/top_side = 2 -17:8/0/terrains_peering_bit/top_right_corner = 2 -18:8/0 = 0 -18:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -19:8/0 = 0 -19:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -20:8/0 = 0 -20:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -26:8/0 = 0 -26:8/0/z_index = 1 -28:8/0 = 0 -28:8/0/z_index = 1 -29:8/0 = 0 -29:8/0/z_index = 1 -31:8/0 = 0 -32:8/0 = 0 -33:8/0 = 0 -35:8/0 = 0 -36:8/0 = 0 -37:8/0 = 0 -38:8/0 = 0 -39:8/0 = 0 -0:9/0 = 0 -0:9/0/terrain_set = 0 -0:9/0/terrain = 0 -0:9/0/terrains_peering_bit/right_side = 0 -0:9/0/terrains_peering_bit/bottom_side = 0 -0:9/0/terrains_peering_bit/bottom_left_corner = 0 -0:9/0/terrains_peering_bit/left_side = 0 -0:9/0/terrains_peering_bit/top_left_corner = 0 -0:9/0/terrains_peering_bit/top_side = 0 -0:9/0/terrains_peering_bit/top_right_corner = 0 -1:9/0 = 0 -1:9/0/terrain_set = 0 -1:9/0/terrain = 0 -1:9/0/terrains_peering_bit/right_side = 0 -1:9/0/terrains_peering_bit/bottom_right_corner = 0 -1:9/0/terrains_peering_bit/bottom_side = 0 -1:9/0/terrains_peering_bit/left_side = 0 -1:9/0/terrains_peering_bit/top_left_corner = 0 -1:9/0/terrains_peering_bit/top_side = 0 -1:9/0/terrains_peering_bit/top_right_corner = 0 -2:9/0 = 0 -2:9/0/terrain_set = 0 -2:9/0/terrain = 0 -2:9/0/terrains_peering_bit/right_side = 0 -2:9/0/terrains_peering_bit/bottom_right_corner = 0 -2:9/0/terrains_peering_bit/bottom_side = 0 -2:9/0/terrains_peering_bit/bottom_left_corner = 1 -2:9/0/terrains_peering_bit/left_side = 1 -2:9/0/terrains_peering_bit/top_left_corner = 1 -2:9/0/terrains_peering_bit/top_side = 1 -2:9/0/terrains_peering_bit/top_right_corner = 1 -3:9/0 = 0 -3:9/0/terrain_set = 0 -3:9/0/terrain = 0 -3:9/0/terrains_peering_bit/right_side = 1 -3:9/0/terrains_peering_bit/bottom_right_corner = 1 -3:9/0/terrains_peering_bit/bottom_side = 0 -3:9/0/terrains_peering_bit/bottom_left_corner = 0 -3:9/0/terrains_peering_bit/left_side = 0 -3:9/0/terrains_peering_bit/top_left_corner = 1 -3:9/0/terrains_peering_bit/top_side = 1 -3:9/0/terrains_peering_bit/top_right_corner = 1 -4:9/0 = 0 -5:9/0 = 0 -5:9/0/terrain_set = 0 -5:9/0/terrain = 0 -5:9/0/terrains_peering_bit/right_side = 0 -5:9/0/terrains_peering_bit/bottom_right_corner = 0 -5:9/0/terrains_peering_bit/bottom_side = 0 -5:9/0/terrains_peering_bit/bottom_left_corner = 0 -5:9/0/terrains_peering_bit/left_side = 0 -5:9/0/terrains_peering_bit/top_left_corner = 0 -5:9/0/terrains_peering_bit/top_side = 0 -5:9/0/terrains_peering_bit/top_right_corner = 0 -6:9/0 = 0 -7:9/0 = 0 -7:9/0/terrain_set = 0 -7:9/0/terrain = 0 -7:9/0/terrains_peering_bit/right_side = 0 -7:9/0/terrains_peering_bit/bottom_right_corner = 0 -7:9/0/terrains_peering_bit/bottom_side = 0 -7:9/0/terrains_peering_bit/bottom_left_corner = 0 -7:9/0/terrains_peering_bit/left_side = 0 -7:9/0/terrains_peering_bit/top_left_corner = 0 -7:9/0/terrains_peering_bit/top_side = 0 -7:9/0/terrains_peering_bit/top_right_corner = 0 -8:9/0 = 0 -8:9/0/terrain_set = 0 -8:9/0/terrain = 0 -8:9/0/terrains_peering_bit/right_side = 0 -8:9/0/terrains_peering_bit/bottom_right_corner = 0 -8:9/0/terrains_peering_bit/bottom_side = 0 -8:9/0/terrains_peering_bit/bottom_left_corner = 0 -8:9/0/terrains_peering_bit/left_side = 0 -8:9/0/terrains_peering_bit/top_left_corner = 0 -8:9/0/terrains_peering_bit/top_side = 0 -8:9/0/terrains_peering_bit/top_right_corner = 0 -10:9/0 = 0 -11:9/0 = 0 -12:9/0 = 0 -13:9/0 = 0 -14:9/0 = 0 -15:9/0 = 0 -15:9/0/terrain_set = 0 -15:9/0/terrain = 2 -15:9/0/terrains_peering_bit/right_side = 2 -15:9/0/terrains_peering_bit/bottom_right_corner = 2 -15:9/0/terrains_peering_bit/bottom_side = 2 -15:9/0/terrains_peering_bit/bottom_left_corner = 1 -15:9/0/terrains_peering_bit/left_side = 1 -15:9/0/terrains_peering_bit/top_left_corner = 1 -15:9/0/terrains_peering_bit/top_side = 1 -15:9/0/terrains_peering_bit/top_right_corner = 1 -16:9/0 = 0 -16:9/0/terrain_set = 0 -16:9/0/terrain = 2 -16:9/0/terrains_peering_bit/right_side = 1 -16:9/0/terrains_peering_bit/bottom_right_corner = 1 -16:9/0/terrains_peering_bit/bottom_side = 2 -16:9/0/terrains_peering_bit/bottom_left_corner = 2 -16:9/0/terrains_peering_bit/left_side = 2 -16:9/0/terrains_peering_bit/top_left_corner = 1 -16:9/0/terrains_peering_bit/top_side = 1 -16:9/0/terrains_peering_bit/top_right_corner = 1 -17:9/0 = 0 -18:9/0 = 0 -19:9/0 = 0 -32:9/0 = 0 -34:9/0 = 0 -35:9/0 = 0 -36:9/0 = 0 -37:9/0 = 0 -0:10/0 = 0 -0:10/0/terrain_set = 0 -0:10/0/terrain = 0 -0:10/0/terrains_peering_bit/right_side = 0 -0:10/0/terrains_peering_bit/bottom_right_corner = 0 -0:10/0/terrains_peering_bit/bottom_side = 0 -0:10/0/terrains_peering_bit/bottom_left_corner = 0 -0:10/0/terrains_peering_bit/left_side = 0 -0:10/0/terrains_peering_bit/top_left_corner = 0 -0:10/0/terrains_peering_bit/top_side = 0 -1:10/0 = 0 -1:10/0/terrain_set = 0 -1:10/0/terrain = 0 -1:10/0/terrains_peering_bit/right_side = 0 -1:10/0/terrains_peering_bit/bottom_right_corner = 0 -1:10/0/terrains_peering_bit/bottom_side = 0 -1:10/0/terrains_peering_bit/bottom_left_corner = 0 -1:10/0/terrains_peering_bit/left_side = 0 -1:10/0/terrains_peering_bit/top_side = 0 -1:10/0/terrains_peering_bit/top_right_corner = 0 -2:10/0 = 0 -2:10/0/terrain_set = 0 -2:10/0/terrain = 0 -2:10/0/terrains_peering_bit/right_side = 0 -2:10/0/terrains_peering_bit/bottom_right_corner = 1 -2:10/0/terrains_peering_bit/bottom_side = 1 -2:10/0/terrains_peering_bit/bottom_left_corner = 1 -2:10/0/terrains_peering_bit/left_side = 1 -2:10/0/terrains_peering_bit/top_left_corner = 1 -2:10/0/terrains_peering_bit/top_side = 0 -2:10/0/terrains_peering_bit/top_right_corner = 0 -3:10/0 = 0 -3:10/0/terrain_set = 0 -3:10/0/terrain = 0 -3:10/0/terrains_peering_bit/right_side = 1 -3:10/0/terrains_peering_bit/bottom_right_corner = 1 -3:10/0/terrains_peering_bit/bottom_side = 1 -3:10/0/terrains_peering_bit/bottom_left_corner = 1 -3:10/0/terrains_peering_bit/left_side = 0 -3:10/0/terrains_peering_bit/top_left_corner = 0 -3:10/0/terrains_peering_bit/top_side = 0 -3:10/0/terrains_peering_bit/top_right_corner = 1 -4:10/0 = 0 -5:10/0 = 0 -5:10/0/terrain_set = 0 -5:10/0/terrain = 0 -5:10/0/terrains_peering_bit/right_side = 0 -5:10/0/terrains_peering_bit/bottom_right_corner = 0 -5:10/0/terrains_peering_bit/bottom_side = 0 -5:10/0/terrains_peering_bit/bottom_left_corner = 0 -5:10/0/terrains_peering_bit/left_side = 0 -5:10/0/terrains_peering_bit/top_left_corner = 0 -5:10/0/terrains_peering_bit/top_side = 0 -5:10/0/terrains_peering_bit/top_right_corner = 0 -6:10/0 = 0 -7:10/0 = 0 -7:10/0/terrain_set = 0 -7:10/0/terrain = 0 -7:10/0/terrains_peering_bit/right_side = 0 -7:10/0/terrains_peering_bit/bottom_right_corner = 0 -7:10/0/terrains_peering_bit/bottom_side = 0 -7:10/0/terrains_peering_bit/bottom_left_corner = 0 -7:10/0/terrains_peering_bit/left_side = 0 -7:10/0/terrains_peering_bit/top_left_corner = 0 -7:10/0/terrains_peering_bit/top_side = 0 -7:10/0/terrains_peering_bit/top_right_corner = 0 -8:10/0 = 0 -8:10/0/terrain_set = 0 -8:10/0/terrain = 0 -8:10/0/terrains_peering_bit/right_side = 0 -8:10/0/terrains_peering_bit/bottom_right_corner = 0 -8:10/0/terrains_peering_bit/bottom_side = 0 -8:10/0/terrains_peering_bit/bottom_left_corner = 0 -8:10/0/terrains_peering_bit/left_side = 0 -8:10/0/terrains_peering_bit/top_left_corner = 0 -8:10/0/terrains_peering_bit/top_side = 0 -8:10/0/terrains_peering_bit/top_right_corner = 0 -9:10/0 = 0 -10:10/0 = 0 -11:10/0 = 0 -12:10/0 = 0 -13:10/0 = 0 -14:10/0 = 0 -15:10/0 = 0 -15:10/0/terrain_set = 0 -15:10/0/terrain = 2 -15:10/0/terrains_peering_bit/right_side = 2 -15:10/0/terrains_peering_bit/bottom_right_corner = 1 -15:10/0/terrains_peering_bit/bottom_side = 1 -15:10/0/terrains_peering_bit/bottom_left_corner = 1 -15:10/0/terrains_peering_bit/left_side = 1 -15:10/0/terrains_peering_bit/top_left_corner = 1 -15:10/0/terrains_peering_bit/top_side = 2 -15:10/0/terrains_peering_bit/top_right_corner = 2 -16:10/0 = 0 -16:10/0/terrain_set = 0 -16:10/0/terrain = 2 -16:10/0/terrains_peering_bit/right_side = 1 -16:10/0/terrains_peering_bit/bottom_right_corner = 1 -16:10/0/terrains_peering_bit/bottom_side = 1 -16:10/0/terrains_peering_bit/bottom_left_corner = 1 -16:10/0/terrains_peering_bit/left_side = 2 -16:10/0/terrains_peering_bit/top_left_corner = 2 -16:10/0/terrains_peering_bit/top_side = 2 -16:10/0/terrains_peering_bit/top_right_corner = 1 -17:10/0 = 0 -18:10/0 = 0 -19:10/0 = 0 -32:10/0 = 0 -33:10/0 = 0 -34:10/0 = 0 -35:10/0 = 0 -36:10/0 = 0 -37:10/0 = 0 -0:11/0 = 0 -0:11/0/terrain_set = 0 -0:11/0/terrain = 0 -0:11/0/terrains_peering_bit/right_side = 0 -0:11/0/terrains_peering_bit/bottom_right_corner = 0 -0:11/0/terrains_peering_bit/bottom_side = 0 -1:11/0 = 0 -1:11/0/terrain_set = 0 -1:11/0/terrain = 0 -1:11/0/terrains_peering_bit/right_side = 0 -1:11/0/terrains_peering_bit/bottom_right_corner = 0 -1:11/0/terrains_peering_bit/bottom_side = 0 -1:11/0/terrains_peering_bit/bottom_left_corner = 0 -1:11/0/terrains_peering_bit/left_side = 0 -2:11/0 = 0 -2:11/0/terrain_set = 0 -2:11/0/terrain = 0 -2:11/0/terrains_peering_bit/bottom_side = 0 -2:11/0/terrains_peering_bit/bottom_left_corner = 0 -2:11/0/terrains_peering_bit/left_side = 0 -3:11/0 = 0 -4:11/0 = 0 -5:11/0 = 0 -6:11/0 = 0 -7:11/0 = 0 -8:11/0 = 0 -9:11/0 = 0 -10:11/0 = 0 -11:11/0 = 0 -12:11/0 = 0 -13:11/0 = 0 -14:11/0 = 0 -15:11/0 = 0 -16:11/0 = 0 -17:11/0 = 0 -18:11/0 = 0 -19:11/0 = 0 -20:11/0 = 0 -32:11/0 = 0 -34:11/0 = 0 -35:11/0 = 0 -36:11/0 = 0 -37:11/0 = 0 -0:12/0 = 0 -1:12/0 = 0 -2:12/0 = 0 -3:12/0 = 0 -4:12/0 = 0 -5:12/0 = 0 -6:12/0 = 0 -7:12/0 = 0 -9:12/0 = 0 -10:12/0 = 0 -11:12/0 = 0 -12:12/0 = 0 -13:12/0 = 0 -14:12/0 = 0 -15:12/0 = 0 -16:12/0 = 0 -17:12/0 = 0 -18:12/0 = 0 -19:12/0 = 0 -20:12/0 = 0 -22:12/0 = 0 -23:12/0 = 0 -25:12/0 = 0 -26:12/0 = 0 -27:12/0 = 0 -30:12/0 = 0 -32:12/0 = 0 -34:12/0 = 0 -35:12/0 = 0 -36:12/0 = 0 -37:12/0 = 0 -0:13/0 = 0 -1:13/0 = 0 -2:13/0 = 0 -3:13/0 = 0 -4:13/0 = 0 -5:13/0 = 0 -6:13/0 = 0 -7:13/0 = 0 -8:13/0 = 0 -8:13/0/terrain_set = 0 -8:13/0/terrain = 0 -8:13/0/terrains_peering_bit/right_side = 0 -8:13/0/terrains_peering_bit/bottom_right_corner = 0 -8:13/0/terrains_peering_bit/bottom_side = 0 -8:13/0/terrains_peering_bit/bottom_left_corner = 1 -8:13/0/terrains_peering_bit/left_side = 1 -8:13/0/terrains_peering_bit/top_left_corner = 1 -8:13/0/terrains_peering_bit/top_side = 2 -8:13/0/terrains_peering_bit/top_right_corner = 2 -9:13/0 = 0 -9:13/0/terrain_set = 0 -9:13/0/terrain = 0 -9:13/0/terrains_peering_bit/right_side = 1 -9:13/0/terrains_peering_bit/bottom_right_corner = 1 -9:13/0/terrains_peering_bit/bottom_side = 0 -9:13/0/terrains_peering_bit/bottom_left_corner = 0 -9:13/0/terrains_peering_bit/left_side = 0 -9:13/0/terrains_peering_bit/top_left_corner = 2 -9:13/0/terrains_peering_bit/top_side = 2 -9:13/0/terrains_peering_bit/top_right_corner = 1 -10:13/0 = 0 -10:13/0/terrain_set = 0 -10:13/0/terrain = 0 -10:13/0/terrains_peering_bit/right_side = 0 -10:13/0/terrains_peering_bit/bottom_right_corner = 0 -10:13/0/terrains_peering_bit/bottom_side = 0 -10:13/0/terrains_peering_bit/bottom_left_corner = 2 -10:13/0/terrains_peering_bit/left_side = 2 -10:13/0/terrains_peering_bit/top_left_corner = 1 -10:13/0/terrains_peering_bit/top_side = 1 -10:13/0/terrains_peering_bit/top_right_corner = 1 -11:13/0 = 0 -11:13/0/terrain_set = 0 -11:13/0/terrain = 0 -11:13/0/terrains_peering_bit/right_side = 2 -11:13/0/terrains_peering_bit/bottom_right_corner = 2 -11:13/0/terrains_peering_bit/bottom_side = 0 -11:13/0/terrains_peering_bit/bottom_left_corner = 0 -11:13/0/terrains_peering_bit/left_side = 0 -11:13/0/terrains_peering_bit/top_left_corner = 1 -11:13/0/terrains_peering_bit/top_side = 1 -11:13/0/terrains_peering_bit/top_right_corner = 1 -12:13/0 = 0 -13:13/0 = 0 -14:13/0 = 0 -15:13/0 = 0 -16:13/0 = 0 -17:13/0 = 0 -18:13/0 = 0 -19:13/0 = 0 -20:13/0 = 0 -23:13/0 = 0 -24:13/0 = 0 -25:13/0 = 0 -26:13/0 = 0 -27:13/0 = 0 -28:13/0 = 0 -29:13/0 = 0 -30:13/0 = 0 -32:13/0 = 0 -34:13/0 = 0 -35:13/0 = 0 -36:13/0 = 0 -0:14/0 = 0 -1:14/0 = 0 -2:14/0 = 0 -3:14/0 = 0 -4:14/0 = 0 -5:14/0 = 0 -6:14/0 = 0 -7:14/0 = 0 -8:14/0 = 0 -8:14/0/terrain_set = 0 -8:14/0/terrain = 0 -8:14/0/terrains_peering_bit/right_side = 0 -8:14/0/terrains_peering_bit/bottom_right_corner = 2 -8:14/0/terrains_peering_bit/bottom_side = 2 -8:14/0/terrains_peering_bit/bottom_left_corner = 1 -8:14/0/terrains_peering_bit/left_side = 1 -8:14/0/terrains_peering_bit/top_left_corner = 1 -8:14/0/terrains_peering_bit/top_side = 0 -8:14/0/terrains_peering_bit/top_right_corner = 0 -9:14/0 = 0 -9:14/0/terrain_set = 0 -9:14/0/terrain = 0 -9:14/0/terrains_peering_bit/right_side = 1 -9:14/0/terrains_peering_bit/bottom_right_corner = 1 -9:14/0/terrains_peering_bit/bottom_side = 2 -9:14/0/terrains_peering_bit/bottom_left_corner = 2 -9:14/0/terrains_peering_bit/left_side = 0 -9:14/0/terrains_peering_bit/top_left_corner = 0 -9:14/0/terrains_peering_bit/top_side = 0 -9:14/0/terrains_peering_bit/top_right_corner = 1 -10:14/0 = 0 -10:14/0/terrain_set = 0 -10:14/0/terrain = 0 -10:14/0/terrains_peering_bit/right_side = 0 -10:14/0/terrains_peering_bit/bottom_right_corner = 1 -10:14/0/terrains_peering_bit/bottom_side = 1 -10:14/0/terrains_peering_bit/bottom_left_corner = 1 -10:14/0/terrains_peering_bit/left_side = 2 -10:14/0/terrains_peering_bit/top_left_corner = 2 -10:14/0/terrains_peering_bit/top_side = 0 -10:14/0/terrains_peering_bit/top_right_corner = 0 -11:14/0 = 0 -11:14/0/terrain_set = 0 -11:14/0/terrain = 0 -11:14/0/terrains_peering_bit/right_side = 2 -11:14/0/terrains_peering_bit/bottom_right_corner = 1 -11:14/0/terrains_peering_bit/bottom_side = 1 -11:14/0/terrains_peering_bit/bottom_left_corner = 1 -11:14/0/terrains_peering_bit/left_side = 0 -11:14/0/terrains_peering_bit/top_left_corner = 0 -11:14/0/terrains_peering_bit/top_side = 0 -11:14/0/terrains_peering_bit/top_right_corner = 2 -12:14/0 = 0 -13:14/0 = 0 -14:14/0 = 0 -15:14/0 = 0 -16:14/0 = 0 -18:14/0 = 0 -19:14/0 = 0 -20:14/0 = 0 -21:14/0 = 0 -22:14/0 = 0 -23:14/0 = 0 -24:14/0 = 0 -25:14/0 = 0 -26:14/0 = 0 -27:14/0 = 0 -28:14/0 = 0 -29:14/0 = 0 -30:14/0 = 0 -32:14/0 = 0 -34:14/0 = 0 -35:14/0 = 0 -36:14/0 = 0 -0:15/0 = 0 -1:15/0 = 0 -2:15/0 = 0 -3:15/0 = 0 -4:15/0 = 0 -5:15/0 = 0 -6:15/0 = 0 -7:15/0 = 0 -8:15/0 = 0 -9:15/0 = 0 -11:15/0 = 0 -12:15/0 = 0 -13:15/0 = 0 -14:15/0 = 0 -15:15/0 = 0 -16:15/0 = 0 -17:15/0 = 0 -18:15/0 = 0 -23:15/0 = 0 -24:15/0 = 0 -25:15/0 = 0 -26:15/0 = 0 -27:15/0 = 0 -28:15/0 = 0 -29:15/0 = 0 -0:16/0 = 0 -1:16/0 = 0 -2:16/0 = 0 -3:16/0 = 0 -4:16/0 = 0 -5:16/0 = 0 -6:16/0 = 0 -7:16/0 = 0 -11:16/0 = 0 -12:16/0 = 0 -13:16/0 = 0 -14:16/0 = 0 -17:16/0 = 0 -18:16/0 = 0 -23:16/0 = 0 -24:16/0 = 0 -28:16/0 = 0 -29:16/0 = 0 -33:16/0 = 0 -0:17/0 = 0 -2:17/0 = 0 -3:17/0 = 0 -4:17/0 = 0 -5:17/0 = 0 -6:17/0 = 0 -7:17/0 = 0 -9:17/0 = 0 -10:17/0 = 0 -11:17/0 = 0 -12:17/0 = 0 -13:17/0 = 0 -14:17/0 = 0 -15:17/0 = 0 -16:17/0 = 0 -19:17/0 = 0 -20:17/0 = 0 -21:17/0 = 0 -22:17/0 = 0 -23:17/0 = 0 -24:17/0 = 0 -25:17/0 = 0 -27:17/0 = 0 -28:17/0 = 0 -29:17/0 = 0 -30:17/0 = 0 -31:17/0 = 0 -32:17/0 = 0 -33:17/0 = 0 -34:17/0 = 0 -35:17/0 = 0 -36:17/0 = 0 -37:17/0 = 0 -38:17/0 = 0 -39:17/0 = 0 -0:18/0 = 0 -2:18/0 = 0 -3:18/0 = 0 -4:18/0 = 0 -5:18/0 = 0 -6:18/0 = 0 -7:18/0 = 0 -8:18/0 = 0 -9:18/0 = 0 -10:18/0 = 0 -11:18/0 = 0 -12:18/0 = 0 -13:18/0 = 0 -14:18/0 = 0 -15:18/0 = 0 -16:18/0 = 0 -17:18/0 = 0 -18:18/0 = 0 -19:18/0 = 0 -20:18/0 = 0 -21:18/0 = 0 -22:18/0 = 0 -23:18/0 = 0 -24:18/0 = 0 -25:18/0 = 0 -27:18/0 = 0 -28:18/0 = 0 -29:18/0 = 0 -30:18/0 = 0 -31:18/0 = 0 -32:18/0 = 0 -33:18/0 = 0 -34:18/0 = 0 -35:18/0 = 0 -36:18/0 = 0 -37:18/0 = 0 -38:18/0 = 0 -39:18/0 = 0 -0:19/0 = 0 -1:19/0 = 0 -3:19/0 = 0 -4:19/0 = 0 -5:19/0 = 0 -6:19/0 = 0 -7:19/0 = 0 -8:19/0 = 0 -9:19/0 = 0 -10:19/0 = 0 -11:19/0 = 0 -12:19/0 = 0 -13:19/0 = 0 -14:19/0 = 0 -15:19/0 = 0 -16:19/0 = 0 -17:19/0 = 0 -18:19/0 = 0 -19:19/0 = 0 -20:19/0 = 0 -21:19/0 = 0 -22:19/0 = 0 -23:19/0 = 0 -24:19/0 = 0 -27:19/0 = 0 -28:19/0 = 0 -29:19/0 = 0 -30:19/0 = 0 -31:19/0 = 0 -32:19/0 = 0 -33:19/0 = 0 -34:19/0 = 0 -35:19/0 = 0 -36:19/0 = 0 -37:19/0 = 0 -38:19/0 = 0 -39:19/0 = 0 -0:20/0 = 0 -1:20/0 = 0 -2:20/0 = 0 -3:20/0 = 0 -4:20/0 = 0 -5:20/0 = 0 -6:20/0 = 0 -7:20/0 = 0 -9:20/0 = 0 -10:20/0 = 0 -11:20/0 = 0 -12:20/0 = 0 -13:20/0 = 0 -14:20/0 = 0 -15:20/0 = 0 -16:20/0 = 0 -17:20/0 = 0 -18:20/0 = 0 -19:20/0 = 0 -20:20/0 = 0 -21:20/0 = 0 -22:20/0 = 0 -23:20/0 = 0 -24:20/0 = 0 -25:20/0 = 0 -26:20/0 = 0 -27:20/0 = 0 -28:20/0 = 0 -29:20/0 = 0 -0:21/0 = 0 -1:21/0 = 0 -2:21/0 = 0 -3:21/0 = 0 -4:21/0 = 0 -5:21/0 = 0 -6:21/0 = 0 -7:21/0 = 0 -9:21/0 = 0 -10:21/0 = 0 -11:21/0 = 0 -12:21/0 = 0 -13:21/0 = 0 -14:21/0 = 0 -15:21/0 = 0 -16:21/0 = 0 -17:21/0 = 0 -18:21/0 = 0 -19:21/0 = 0 -20:21/0 = 0 -21:21/0 = 0 -22:21/0 = 0 -23:21/0 = 0 -24:21/0 = 0 -25:21/0 = 0 -26:21/0 = 0 -27:21/0 = 0 -28:21/0 = 0 -29:21/0 = 0 -0:22/0 = 0 -1:22/0 = 0 -2:22/0 = 0 -3:22/0 = 0 -4:22/0 = 0 -5:22/0 = 0 -6:22/0 = 0 -7:22/0 = 0 -8:22/0 = 0 -9:22/0 = 0 -10:22/0 = 0 -11:22/0 = 0 -12:22/0 = 0 -13:22/0 = 0 -15:22/0 = 0 -16:22/0 = 0 -17:22/0 = 0 -18:22/0 = 0 -19:22/0 = 0 -20:22/0 = 0 -21:22/0 = 0 -22:22/0 = 0 -23:22/0 = 0 -24:22/0 = 0 -25:22/0 = 0 -26:22/0 = 0 -28:22/0 = 0 -29:22/0 = 0 -0:23/0 = 0 -1:23/0 = 0 -2:23/0 = 0 -3:23/0 = 0 -4:23/0 = 0 -5:23/0 = 0 -6:23/0 = 0 -7:23/0 = 0 -8:23/0 = 0 -9:23/0 = 0 -10:23/0 = 0 -11:23/0 = 0 -12:23/0 = 0 -13:23/0 = 0 -15:23/0 = 0 -16:23/0 = 0 -18:23/0 = 0 -19:23/0 = 0 -20:23/0 = 0 -21:23/0 = 0 -22:23/0 = 0 -23:23/0 = 0 -24:23/0 = 0 -25:23/0 = 0 -26:23/0 = 0 -27:23/0 = 0 -28:23/0 = 0 -29:23/0 = 0 -0:24/0 = 0 -1:24/0 = 0 -2:24/0 = 0 -3:24/0 = 0 -4:24/0 = 0 -5:24/0 = 0 -8:24/0 = 0 -9:24/0 = 0 -10:24/0 = 0 -12:24/0 = 0 -13:24/0 = 0 -15:24/0 = 0 -16:24/0 = 0 -18:24/0 = 0 -19:24/0 = 0 -20:24/0 = 0 -21:24/0 = 0 -22:24/0 = 0 -25:24/0 = 0 -26:24/0 = 0 -27:24/0 = 0 -28:24/0 = 0 -29:24/0 = 0 -0:25/0 = 0 -1:25/0 = 0 -2:25/0 = 0 -3:25/0 = 0 -4:25/0 = 0 -5:25/0 = 0 -8:25/0 = 0 -9:25/0 = 0 -10:25/0 = 0 -11:25/0 = 0 -12:25/0 = 0 -13:25/0 = 0 -14:25/0 = 0 -15:25/0 = 0 -16:25/0 = 0 -17:25/0 = 0 -18:25/0 = 0 -19:25/0 = 0 -20:25/0 = 0 -21:25/0 = 0 -22:25/0 = 0 -25:25/0 = 0 -26:25/0 = 0 -27:25/0 = 0 -28:25/0 = 0 -29:25/0 = 0 -0:26/0 = 0 -1:26/0 = 0 -2:26/0 = 0 -3:26/0 = 0 -4:26/0 = 0 -5:26/0 = 0 -6:26/0 = 0 -7:26/0 = 0 -8:26/0 = 0 -9:26/0 = 0 -11:26/0 = 0 -12:26/0 = 0 -13:26/0 = 0 -14:26/0 = 0 -15:26/0 = 0 -16:26/0 = 0 -17:26/0 = 0 -18:26/0 = 0 -19:26/0 = 0 -20:26/0 = 0 -21:26/0 = 0 -22:26/0 = 0 -25:26/0 = 0 -26:26/0 = 0 -27:26/0 = 0 -28:26/0 = 0 -29:26/0 = 0 -0:27/0 = 0 -1:27/0 = 0 -2:27/0 = 0 -3:27/0 = 0 -4:27/0 = 0 -5:27/0 = 0 -6:27/0 = 0 -7:27/0 = 0 -8:27/0 = 0 -9:27/0 = 0 -10:27/0 = 0 -11:27/0 = 0 -12:27/0 = 0 -13:27/0 = 0 -14:27/0 = 0 -15:27/0 = 0 -16:27/0 = 0 -17:27/0 = 0 -18:27/0 = 0 -19:27/0 = 0 -20:27/0 = 0 -21:27/0 = 0 -22:27/0 = 0 -25:27/0 = 0 -26:27/0 = 0 -27:27/0 = 0 -28:27/0 = 0 -29:27/0 = 0 -0:28/0 = 0 -1:28/0 = 0 -2:28/0 = 0 -3:28/0 = 0 -4:28/0 = 0 -5:28/0 = 0 -6:28/0 = 0 -7:28/0 = 0 -8:28/0 = 0 -9:28/0 = 0 -10:28/0 = 0 -11:28/0 = 0 -12:28/0 = 0 -13:28/0 = 0 -14:28/0 = 0 -15:28/0 = 0 -16:28/0 = 0 -17:28/0 = 0 -19:28/0 = 0 -20:28/0 = 0 -21:28/0 = 0 -22:28/0 = 0 -23:28/0 = 0 -25:28/0 = 0 -26:28/0 = 0 -28:28/0 = 0 -29:28/0 = 0 -0:29/0 = 0 -1:29/0 = 0 -2:29/0 = 0 -3:29/0 = 0 -4:29/0 = 0 -5:29/0 = 0 -6:29/0 = 0 -7:29/0 = 0 -8:29/0 = 0 -9:29/0 = 0 -10:29/0 = 0 -11:29/0 = 0 -12:29/0 = 0 -14:29/0 = 0 -15:29/0 = 0 -16:29/0 = 0 -17:29/0 = 0 -18:29/0 = 0 -19:29/0 = 0 -20:29/0 = 0 -21:29/0 = 0 -22:29/0 = 0 -23:29/0 = 0 -0:30/0 = 0 -1:30/0 = 0 -2:30/0 = 0 -3:30/0 = 0 -4:30/0 = 0 -5:30/0 = 0 -6:30/0 = 0 -7:30/0 = 0 -8:30/0 = 0 -9:30/0 = 0 -10:30/0 = 0 -11:30/0 = 0 -12:30/0 = 0 -14:30/0 = 0 -15:30/0 = 0 -16:30/0 = 0 -17:30/0 = 0 -18:30/0 = 0 -19:30/0 = 0 -20:30/0 = 0 -21:30/0 = 0 -22:30/0 = 0 -23:30/0 = 0 -0:31/0 = 0 -1:31/0 = 0 -2:31/0 = 0 -3:31/0 = 0 -4:31/0 = 0 -5:31/0 = 0 -6:31/0 = 0 -7:31/0 = 0 -8:31/0 = 0 -9:31/0 = 0 -10:31/0 = 0 -11:31/0 = 0 -12:31/0 = 0 -13:31/0 = 0 -14:31/0 = 0 -15:31/0 = 0 -16:31/0 = 0 -19:31/0 = 0 -20:31/0 = 0 -21:31/0 = 0 -22:31/0 = 0 -23:31/0 = 0 -24:31/0 = 0 -25:31/0 = 0 -26:31/0 = 0 -27:31/0 = 0 -0:32/0 = 0 -1:32/0 = 0 -2:32/0 = 0 -3:32/0 = 0 -4:32/0 = 0 -5:32/0 = 0 -6:32/0 = 0 -7:32/0 = 0 -8:32/0 = 0 -9:32/0 = 0 -10:32/0 = 0 -11:32/0 = 0 -12:32/0 = 0 -13:32/0 = 0 -14:32/0 = 0 -15:32/0 = 0 -16:32/0 = 0 -17:32/0 = 0 -18:32/0 = 0 -19:32/0 = 0 -20:32/0 = 0 -21:32/0 = 0 -22:32/0 = 0 -23:32/0 = 0 -24:32/0 = 0 -27:32/0 = 0 -0:33/0 = 0 -1:33/0 = 0 -4:33/0 = 0 -5:33/0 = 0 -6:33/0 = 0 -7:33/0 = 0 -8:33/0 = 0 -9:33/0 = 0 -10:33/0 = 0 -11:33/0 = 0 -12:33/0 = 0 -13:33/0 = 0 -14:33/0 = 0 -15:33/0 = 0 -16:33/0 = 0 -17:33/0 = 0 -18:33/0 = 0 -24:33/0 = 0 -25:33/0 = 0 -26:33/0 = 0 -27:33/0 = 0 -0:34/0 = 0 -1:34/0 = 0 -4:34/0 = 0 -5:34/0 = 0 -6:34/0 = 0 -7:34/0 = 0 -0:35/0 = 0 -1:35/0 = 0 -6:0/size_in_atlas = Vector2i(5, 5) -6:0/0 = 0 -6:0/0/z_index = 1 -6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -24, 32, -24, 32, 12, 32, 24, -32, 24, -32, 12) -4:1/size_in_atlas = Vector2i(2, 2) -4:1/0 = 0 -4:1/0/z_index = 1 -16:0/size_in_atlas = Vector2i(2, 2) -16:0/0 = 0 -16:2/size_in_atlas = Vector2i(2, 2) -16:2/0 = 0 -18:2/size_in_atlas = Vector2i(2, 2) -18:2/0 = 0 -18:0/size_in_atlas = Vector2i(2, 2) -18:0/0 = 0 -20:0/size_in_atlas = Vector2i(2, 2) -20:0/0 = 0 -20:2/size_in_atlas = Vector2i(2, 2) -20:2/0 = 0 -22:0/size_in_atlas = Vector2i(3, 6) -22:0/0 = 0 -3:5/size_in_atlas = Vector2i(3, 1) -3:5/0 = 0 -11:5/size_in_atlas = Vector2i(2, 2) -11:5/0 = 0 -13:5/size_in_atlas = Vector2i(2, 3) -13:5/0 = 0 -13:5/0/z_index = 1 -22:9/size_in_atlas = Vector2i(3, 3) -22:9/0 = 0 -22:9/0/z_index = 1 -25:9/size_in_atlas = Vector2i(3, 3) -25:9/0 = 0 -25:9/0/z_index = 1 -28:9/size_in_atlas = Vector2i(3, 3) -28:9/0 = 0 -28:9/0/z_index = 1 -27:8/0 = 0 -27:8/0/z_index = 1 -21:7/size_in_atlas = Vector2i(1, 2) -21:7/0 = 0 -21:7/0/z_index = 1 -22:7/0 = 0 -22:7/0/z_index = 1 -22:8/0 = 0 -22:8/0/z_index = 1 -23:7/size_in_atlas = Vector2i(1, 2) -23:7/0 = 0 -23:7/0/z_index = 1 -24:7/size_in_atlas = Vector2i(1, 2) -24:7/0 = 0 -24:7/0/z_index = 1 -0:3/0 = 0 -0:3/0/terrain_set = 0 -0:3/0/terrain = 0 -0:3/0/terrains_peering_bit/right_side = 0 -0:3/0/terrains_peering_bit/bottom_right_corner = 2 -0:3/0/terrains_peering_bit/bottom_side = 0 -0:3/0/terrains_peering_bit/bottom_left_corner = 0 -0:3/0/terrains_peering_bit/left_side = 0 -0:3/0/terrains_peering_bit/top_left_corner = 0 -0:3/0/terrains_peering_bit/top_side = 0 -0:3/0/terrains_peering_bit/top_right_corner = 0 -1:3/0 = 0 -1:3/0/terrain_set = 0 -1:3/0/terrain = 0 -1:3/0/terrains_peering_bit/right_side = 0 -1:3/0/terrains_peering_bit/bottom_right_corner = 2 -1:3/0/terrains_peering_bit/bottom_side = 2 -1:3/0/terrains_peering_bit/bottom_left_corner = 2 -1:3/0/terrains_peering_bit/left_side = 0 -1:3/0/terrains_peering_bit/top_left_corner = 0 -1:3/0/terrains_peering_bit/top_side = 0 -1:3/0/terrains_peering_bit/top_right_corner = 0 -2:3/0 = 0 -2:3/0/terrain_set = 0 -2:3/0/terrain = 0 -2:3/0/terrains_peering_bit/right_side = 0 -2:3/0/terrains_peering_bit/bottom_right_corner = 0 -2:3/0/terrains_peering_bit/bottom_side = 0 -2:3/0/terrains_peering_bit/bottom_left_corner = 2 -2:3/0/terrains_peering_bit/left_side = 0 -2:3/0/terrains_peering_bit/top_left_corner = 0 -2:3/0/terrains_peering_bit/top_side = 0 -2:3/0/terrains_peering_bit/top_right_corner = 0 -2:4/0 = 0 -2:4/0/terrain_set = 0 -2:4/0/terrain = 0 -2:4/0/terrains_peering_bit/right_side = 0 -2:4/0/terrains_peering_bit/bottom_right_corner = 0 -2:4/0/terrains_peering_bit/bottom_side = 0 -2:4/0/terrains_peering_bit/bottom_left_corner = 2 -2:4/0/terrains_peering_bit/left_side = 2 -2:4/0/terrains_peering_bit/top_left_corner = 2 -2:4/0/terrains_peering_bit/top_side = 0 -2:4/0/terrains_peering_bit/top_right_corner = 0 -2:5/0 = 0 -2:5/0/terrain_set = 0 -2:5/0/terrain = 0 -2:5/0/terrains_peering_bit/right_side = 0 -2:5/0/terrains_peering_bit/bottom_right_corner = 0 -2:5/0/terrains_peering_bit/bottom_side = 0 -2:5/0/terrains_peering_bit/bottom_left_corner = 0 -2:5/0/terrains_peering_bit/left_side = 0 -2:5/0/terrains_peering_bit/top_left_corner = 2 -2:5/0/terrains_peering_bit/top_side = 0 -2:5/0/terrains_peering_bit/top_right_corner = 0 -1:5/0 = 0 -1:5/0/terrain_set = 0 -1:5/0/terrain = 0 -1:5/0/terrains_peering_bit/right_side = 0 -1:5/0/terrains_peering_bit/bottom_right_corner = 0 -1:5/0/terrains_peering_bit/bottom_side = 0 -1:5/0/terrains_peering_bit/bottom_left_corner = 0 -1:5/0/terrains_peering_bit/left_side = 0 -1:5/0/terrains_peering_bit/top_left_corner = 2 -1:5/0/terrains_peering_bit/top_side = 2 -1:5/0/terrains_peering_bit/top_right_corner = 2 -1:4/0 = 0 -1:4/0/terrain_set = 0 -1:4/0/terrain = 2 -1:4/0/terrains_peering_bit/right_side = 2 -1:4/0/terrains_peering_bit/bottom_right_corner = 2 -1:4/0/terrains_peering_bit/bottom_side = 2 -1:4/0/terrains_peering_bit/bottom_left_corner = 2 -1:4/0/terrains_peering_bit/left_side = 2 -1:4/0/terrains_peering_bit/top_left_corner = 2 -1:4/0/terrains_peering_bit/top_side = 2 -1:4/0/terrains_peering_bit/top_right_corner = 2 -0:4/0 = 0 -0:4/0/terrain_set = 0 -0:4/0/terrain = 0 -0:4/0/terrains_peering_bit/right_side = 2 -0:4/0/terrains_peering_bit/bottom_right_corner = 2 -0:4/0/terrains_peering_bit/bottom_side = 0 -0:4/0/terrains_peering_bit/bottom_left_corner = 0 -0:4/0/terrains_peering_bit/left_side = 0 -0:4/0/terrains_peering_bit/top_left_corner = 0 -0:4/0/terrains_peering_bit/top_side = 0 -0:4/0/terrains_peering_bit/top_right_corner = 2 -0:5/0 = 0 -0:5/0/terrain_set = 0 -0:5/0/terrain = 0 -0:5/0/terrains_peering_bit/right_side = 0 -0:5/0/terrains_peering_bit/bottom_right_corner = 0 -0:5/0/terrains_peering_bit/bottom_side = 0 -0:5/0/terrains_peering_bit/bottom_left_corner = 0 -0:5/0/terrains_peering_bit/left_side = 0 -0:5/0/terrains_peering_bit/top_left_corner = 0 -0:5/0/terrains_peering_bit/top_side = 0 -0:5/0/terrains_peering_bit/top_right_corner = 2 -1:6/0 = 0 -1:6/0/terrain_set = 0 -1:6/0/terrain = 0 -1:6/0/terrains_peering_bit/right_side = 2 -1:6/0/terrains_peering_bit/bottom_right_corner = 2 -1:6/0/terrains_peering_bit/bottom_side = 0 -1:6/0/terrains_peering_bit/bottom_left_corner = 0 -1:6/0/terrains_peering_bit/left_side = 0 -1:6/0/terrains_peering_bit/top_left_corner = 2 -1:6/0/terrains_peering_bit/top_side = 2 -1:6/0/terrains_peering_bit/top_right_corner = 2 -0:6/0 = 0 -0:6/0/terrain_set = 0 -0:6/0/terrain = 0 -0:6/0/terrains_peering_bit/right_side = 0 -0:6/0/terrains_peering_bit/bottom_right_corner = 0 -0:6/0/terrains_peering_bit/bottom_side = 0 -0:6/0/terrains_peering_bit/bottom_left_corner = 2 -0:6/0/terrains_peering_bit/left_side = 2 -0:6/0/terrains_peering_bit/top_left_corner = 2 -0:6/0/terrains_peering_bit/top_side = 2 -0:6/0/terrains_peering_bit/top_right_corner = 2 -0:7/0 = 0 -0:7/0/terrain_set = 0 -0:7/0/terrain = 0 -0:7/0/terrains_peering_bit/right_side = 0 -0:7/0/terrains_peering_bit/bottom_right_corner = 2 -0:7/0/terrains_peering_bit/bottom_side = 2 -0:7/0/terrains_peering_bit/bottom_left_corner = 2 -0:7/0/terrains_peering_bit/left_side = 2 -0:7/0/terrains_peering_bit/top_left_corner = 2 -0:7/0/terrains_peering_bit/top_side = 0 -0:7/0/terrains_peering_bit/top_right_corner = 0 -1:7/0 = 0 -1:7/0/terrain_set = 0 -1:7/0/terrain = 0 -1:7/0/terrains_peering_bit/right_side = 2 -1:7/0/terrains_peering_bit/bottom_right_corner = 2 -1:7/0/terrains_peering_bit/bottom_side = 2 -1:7/0/terrains_peering_bit/bottom_left_corner = 2 -1:7/0/terrains_peering_bit/left_side = 0 -1:7/0/terrains_peering_bit/top_left_corner = 0 -1:7/0/terrains_peering_bit/top_side = 0 -1:7/0/terrains_peering_bit/top_right_corner = 2 -2:6/0 = 0 -2:6/0/terrain_set = 0 -2:6/0/terrain = 0 -2:6/0/terrains_peering_bit/right_side = 0 -2:6/0/terrains_peering_bit/bottom_right_corner = 1 -2:6/0/terrains_peering_bit/bottom_side = 0 -2:6/0/terrains_peering_bit/bottom_left_corner = 0 -2:6/0/terrains_peering_bit/left_side = 0 -2:6/0/terrains_peering_bit/top_left_corner = 0 -2:6/0/terrains_peering_bit/top_side = 0 -2:6/0/terrains_peering_bit/top_right_corner = 0 -3:6/0 = 0 -3:6/0/terrain_set = 0 -3:6/0/terrain = 0 -3:6/0/terrains_peering_bit/right_side = 0 -3:6/0/terrains_peering_bit/bottom_right_corner = 1 -3:6/0/terrains_peering_bit/bottom_side = 1 -3:6/0/terrains_peering_bit/bottom_left_corner = 1 -3:6/0/terrains_peering_bit/left_side = 0 -3:6/0/terrains_peering_bit/top_left_corner = 0 -3:6/0/terrains_peering_bit/top_side = 0 -3:6/0/terrains_peering_bit/top_right_corner = 0 -4:6/0 = 0 -4:6/0/terrain_set = 0 -4:6/0/terrain = 0 -4:6/0/terrains_peering_bit/right_side = 0 -4:6/0/terrains_peering_bit/bottom_right_corner = 0 -4:6/0/terrains_peering_bit/bottom_side = 0 -4:6/0/terrains_peering_bit/bottom_left_corner = 1 -4:6/0/terrains_peering_bit/left_side = 0 -4:6/0/terrains_peering_bit/top_left_corner = 0 -4:6/0/terrains_peering_bit/top_side = 0 -4:6/0/terrains_peering_bit/top_right_corner = 0 -4:7/0 = 0 -4:7/0/terrain_set = 0 -4:7/0/terrain = 0 -4:7/0/terrains_peering_bit/right_side = 0 -4:7/0/terrains_peering_bit/bottom_right_corner = 0 -4:7/0/terrains_peering_bit/bottom_side = 0 -4:7/0/terrains_peering_bit/bottom_left_corner = 1 -4:7/0/terrains_peering_bit/left_side = 1 -4:7/0/terrains_peering_bit/top_left_corner = 1 -4:7/0/terrains_peering_bit/top_side = 0 -4:7/0/terrains_peering_bit/top_right_corner = 0 -3:7/0 = 0 -3:7/0/terrain_set = 0 -3:7/0/terrain = 1 -3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:7/0/terrains_peering_bit/right_side = 1 -3:7/0/terrains_peering_bit/bottom_right_corner = 1 -3:7/0/terrains_peering_bit/bottom_side = 1 -3:7/0/terrains_peering_bit/bottom_left_corner = 1 -3:7/0/terrains_peering_bit/left_side = 1 -3:7/0/terrains_peering_bit/top_left_corner = 1 -3:7/0/terrains_peering_bit/top_side = 1 -3:7/0/terrains_peering_bit/top_right_corner = 1 -2:7/0 = 0 -2:7/0/terrain_set = 0 -2:7/0/terrain = 0 -2:7/0/terrains_peering_bit/right_side = 1 -2:7/0/terrains_peering_bit/bottom_right_corner = 1 -2:7/0/terrains_peering_bit/bottom_side = 0 -2:7/0/terrains_peering_bit/bottom_left_corner = 0 -2:7/0/terrains_peering_bit/left_side = 0 -2:7/0/terrains_peering_bit/top_left_corner = 0 -2:7/0/terrains_peering_bit/top_side = 0 -2:7/0/terrains_peering_bit/top_right_corner = 1 -2:8/0 = 0 -2:8/0/terrain_set = 0 -2:8/0/terrain = 0 -2:8/0/terrains_peering_bit/right_side = 0 -2:8/0/terrains_peering_bit/bottom_right_corner = 0 -2:8/0/terrains_peering_bit/bottom_side = 0 -2:8/0/terrains_peering_bit/bottom_left_corner = 0 -2:8/0/terrains_peering_bit/left_side = 0 -2:8/0/terrains_peering_bit/top_left_corner = 0 -2:8/0/terrains_peering_bit/top_side = 0 -2:8/0/terrains_peering_bit/top_right_corner = 1 -3:8/0 = 0 -3:8/0/terrain_set = 0 -3:8/0/terrain = 0 -3:8/0/terrains_peering_bit/right_side = 0 -3:8/0/terrains_peering_bit/bottom_right_corner = 0 -3:8/0/terrains_peering_bit/bottom_side = 0 -3:8/0/terrains_peering_bit/bottom_left_corner = 0 -3:8/0/terrains_peering_bit/left_side = 0 -3:8/0/terrains_peering_bit/top_left_corner = 1 -3:8/0/terrains_peering_bit/top_side = 1 -3:8/0/terrains_peering_bit/top_right_corner = 1 -4:8/0 = 0 -4:8/0/terrain_set = 0 -4:8/0/terrain = 0 -4:8/0/terrains_peering_bit/right_side = 0 -4:8/0/terrains_peering_bit/bottom_right_corner = 0 -4:8/0/terrains_peering_bit/bottom_side = 0 -4:8/0/terrains_peering_bit/bottom_left_corner = 0 -4:8/0/terrains_peering_bit/left_side = 0 -4:8/0/terrains_peering_bit/top_left_corner = 1 -4:8/0/terrains_peering_bit/top_side = 0 -4:8/0/terrains_peering_bit/top_right_corner = 0 -0:1/animation_columns = 4 -0:1/animation_mode = 1 -0:1/animation_frame_0/duration = 0.5 -0:1/animation_frame_1/duration = 0.5 -0:1/animation_frame_2/duration = 0.5 -0:1/animation_frame_3/duration = 0.5 -0:1/animation_frame_4/duration = 0.5 -0:1/animation_frame_5/duration = 0.5 -0:1/animation_frame_6/duration = 0.5 -0:1/animation_frame_7/duration = 0.5 -0:1/0 = 0 -0:1/0/terrain_set = 0 -0:1/0/terrain = 1 -0:1/0/probability = 0.3 -0:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:1/0/terrains_peering_bit/right_side = 1 -0:1/0/terrains_peering_bit/bottom_right_corner = 1 -0:1/0/terrains_peering_bit/bottom_side = 1 -0:1/0/terrains_peering_bit/bottom_left_corner = 1 -0:1/0/terrains_peering_bit/left_side = 1 -0:1/0/terrains_peering_bit/top_left_corner = 1 -0:1/0/terrains_peering_bit/top_side = 1 -0:1/0/terrains_peering_bit/top_right_corner = 1 -11:0/size_in_atlas = Vector2i(2, 2) -11:0/0 = 0 -11:0/0/texture_origin = Vector2i(8, 8) -11:0/0/z_index = 2 -14:0/size_in_atlas = Vector2i(2, 2) -14:0/0 = 0 -14:0/0/texture_origin = Vector2i(-8, 8) -14:0/0/z_index = 2 -11:2/size_in_atlas = Vector2i(5, 3) -11:2/0 = 0 -11:2/0/z_index = 1 -25:7/size_in_atlas = Vector2i(1, 2) -25:7/0 = 0 -25:7/0/z_index = 1 -16:4/size_in_atlas = Vector2i(1, 2) -16:4/0 = 0 -16:4/0/texture_origin = Vector2i(0, 8) -16:4/0/z_index = 1 -17:4/size_in_atlas = Vector2i(1, 2) -17:4/0 = 0 -17:4/0/texture_origin = Vector2i(0, 8) -17:4/0/z_index = 1 -18:4/size_in_atlas = Vector2i(1, 2) -18:4/0 = 0 -18:4/0/texture_origin = Vector2i(0, 8) -18:4/0/z_index = 1 -19:4/size_in_atlas = Vector2i(1, 2) -19:4/0 = 0 -19:4/0/texture_origin = Vector2i(0, 8) -19:4/0/z_index = 1 -20:4/size_in_atlas = Vector2i(1, 2) -20:4/0 = 0 -20:4/0/texture_origin = Vector2i(0, 8) -20:4/0/z_index = 1 - -[sub_resource type="TileSet" id="TileSet_snsnx"] -physics_layer_0/collision_layer = 1 -terrain_set_0/mode = 0 -terrain_set_0/terrain_0/name = "Grass" -terrain_set_0/terrain_0/color = Color(0.34902, 0.890196, 0.352941, 1) -terrain_set_0/terrain_1/name = "Water" -terrain_set_0/terrain_1/color = Color(0.223529, 0.6, 0.882353, 1) -terrain_set_0/terrain_2/name = "Grass Paths" -terrain_set_0/terrain_2/color = Color(0.588235, 0.713726, 0.239216, 1) -sources/0 = SubResource("TileSetAtlasSource_n0o3p") - -[node name="MainLevel" type="Node2D"] -script = ExtResource("1_fdviv") - -[node name="TileMapLayer" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAAAAP//AAASACEAAAD/////AAARACEAAAD+////AAARACEAAAD9////AAARACEAAAD7////AAAQACEAAAD6////AAAHAAoAAAD5////AAAHAAkAAAD4////AAAHAAkAAAD5/wAAAAAFAAoAAAD6/wAAAAAAAAMAAAD7/wAAAAABAAMAAAD8/wAAAAABAAMAAAD9/wAAAAABAAMAAAD+/wAAAAABAAMAAAD//wAAAAABAAMAAAAAAAAAAAABAAMAAAABAAAAAAABAAMAAAACAAEAAAABAAQAAAADAAEAAAABAAQAAAAEAAEAAAABAAQAAAD4/wAAAAANABwAAAD3/wAAAAAIAAoAAAACAAAAAAABAAMAAAADAAAAAAABAAMAAAAEAAAAAAABAAMAAAAFAAAAAAABAAMAAAAGAAAAAAABAAcAAAAHAAAAAAABAAQAAAAIAAAAAAAAAAcAAAABAP//AAAIAAoAAAACAP//AAAIAAoAAAADAP//AAAFAAkAAAAEAP//AAAHAAoAAAAFAP//AAAFAAkAAAAGAP//AAAAAAMAAAD2/wAAAAAMABwAAAD1/wAAAAALABwAAAD9/wEAAAABAAQAAAD+/wEAAAABAAQAAAD//wEAAAABAAQAAAAAAAEAAAABAAQAAAABAAEAAAABAAQAAAAFAAEAAAABAAQAAAAGAAEAAAABAAQAAAAHAAEAAAABAAQAAAAIAAEAAAABAAQAAAAJAAEAAAABAAQAAAD8/wEAAAABAAQAAAD7/wEAAAABAAQAAAD6/wEAAAABAAcAAAD5/wEAAAABAAMAAAD4/wEAAAAAAAMAAAD3/wEAAAAHAAkAAAD2/wEAAAAFAAoAAAD1/wEAAAAFAAkAAAD0/wEAAAAHAAoAAAD5//7/AAAFAAkAAAD6//7/AAAIAAoAAAD7//7/AAAQACAAAAD8//7/AAARACAAAAD9//7/AAARACAAAAD+//7/AAARACAAAAD///7/AAARACAAAAAAAP7/AAASACAAAAABAP7/AAAFAAoAAAACAP7/AAAIAAoAAAADAP7/AAAFAAoAAAAFAP7/AAAFAAkAAAAGAP7/AAAAAAAAAAAIAP7/AAACAAMAAAAJAP7/AAAHAAkAAAALAP7/AAAFAAoAAAAMAP7/AAAAAAAAAAD4//7/AAAFAAoAAAD3//7/AAAAAAAAAAD3//3/AAANABwAAAD4//3/AAAHAAoAAAD5//3/AAAFAAoAAAD6//3/AAAHAAoAAAD7//3/AAAHAAoAAAD8//3/AAAIAAkAAAD9//3/AAAFAAkAAAD+//3/AAAAAAAAAAD///3/AAAIAAoAAAAAAP3/AAAIAAkAAAABAP3/AAAIAAoAAAACAP3/AAAHAAkAAAADAP3/AAANABwAAAAEAPz/AAAHAAkAAAAFAPz/AAAAAAAAAAAHAPz/AAAIAAoAAAADAPz/AAAFAAkAAAACAPz/AAAIAAoAAAABAPz/AAAIAAkAAAAAAPz/AAAHAAoAAAD///z/AAAHAAoAAAD+//z/AAAIAAoAAAD9//z/AAAFAAoAAAD8//z/AAAAAAAAAAD7//z/AAAFAAoAAAD6//z/AAAAAAAAAAD5//z/AAANABwAAAD4//z/AAAIAAkAAAD3//z/AAAFAAkAAAAEAP3/AAAAAAAAAAAFAP3/AAAFAAkAAAAGAP3/AAAAAAAAAAAIAP3/AAAFAAoAAAAJAP3/AAAHAAoAAAALAP3/AAAIAAkAAAAMAP3/AAAFAAoAAAANAP7/AAAHAAoAAAAJAPz/AAAHAAoAAAAKAPz/AAAIAAoAAAALAPz/AAAFAAoAAAD+//v/AAAHAAoAAAD9//v/AAAFAAkAAAD8//v/AAAHAAoAAAD7//v/AAAIAAoAAAD6//v/AAAAAAAAAAD5//v/AAAIAAkAAAD4//v/AAAFAAkAAAD3//v/AAAIAAkAAAD2//v/AAAAAAAAAAD///v/AAANABwAAAAAAPv/AAAHAAkAAAABAPv/AAAIAAkAAAACAPv/AAAHAAkAAAADAPv/AAAAAAAAAAAEAPv/AAAFAAoAAAAFAPv/AAAHAAoAAAAGAPv/AAAHAAoAAAAHAPv/AAAIAAoAAAAJAPv/AAAFAAkAAAAKAPv/AAAFAAoAAAALAPv/AAAFAAoAAAAMAPv/AAAAAAAAAAD1//v/AAAFAAkAAAD0//v/AAAIAAkAAADz//r/AAAFAAkAAADy//r/AAAFAAkAAADy//v/AAAHAAoAAADz//v/AAAAAAAAAAAAAPr/AAAFAAoAAAD///r/AAAFAAoAAAD+//r/AAAFAAoAAAD9//r/AAAHAAoAAAD8//r/AAAHAAkAAAD7//r/AAAAAAAAAAD6//r/AAAHAAoAAAD5//r/AAAAAAAAAAD4//r/AAAIAAkAAAD3//r/AAAHAAoAAAD2//r/AAAFAAkAAAD1//r/AAAIAAkAAAD0//r/AAAFAAkAAAABAPr/AAAIAAkAAAACAPr/AAAFAAoAAAADAPr/AAAHAAkAAAAEAPr/AAAFAAoAAAAFAPr/AAAIAAoAAAAGAPr/AAAIAAkAAAAHAPr/AAAIAAkAAAAIAPr/AAAFAAoAAAAJAPr/AAAFAAoAAAAKAPr/AAAIAAoAAAALAPr/AAAHAAkAAAD6//n/AAAHAAkAAAD5//n/AAAIAAkAAAD4//n/AAAAAAAAAAD3//n/AAAIAAkAAAD2//n/AAAFAAoAAAD1//n/AAAFAAoAAAD0//n/AAAHAAoAAAAMAPr/AAAFAAkAAAANAPr/AAAHAAoAAAAOAPr/AAAIAAoAAAAPAPr/AAAAAAAAAAAQAPr/AAAFAAkAAAAIAPn/AAAFAAkAAAAHAPn/AAAHAAkAAAAGAPn/AAAAAAAAAAAFAPn/AAAAAAAAAAAEAPn/AAAFAAkAAAADAPn/AAAFAAoAAAACAPn/AAAAAAAAAAABAPn/AAAFAAkAAAAAAPn/AAAIAAkAAAD///n/AAAHAAoAAAD+//n/AAAFAAkAAAD9//n/AAAHAAkAAAD8//n/AAAFAAkAAAD7//n/AAAFAAoAAAD2//j/AAAHAAoAAAD1//j/AAAHAAkAAAD0//j/AAAHAAoAAADz//j/AAAFAAoAAADy//j/AAAFAAkAAADx//j/AAAFAAoAAAAJAPn/AAAFAAkAAAD///j/AAAFAAkAAAD+//j/AAAIAAkAAAD9//j/AAAFAAkAAAD8//j/AAAIAAkAAAD7//j/AAAFAAoAAAD6//j/AAAFAAoAAAD5//j/AAAIAAoAAAD4//j/AAAIAAkAAAD3//j/AAAFAAkAAAAAAPj/AAAIAAoAAAABAPj/AAAHAAoAAAACAPj/AAAFAAoAAAADAPj/AAAHAAoAAAAEAPj/AAAIAAkAAAAFAPj/AAAHAAoAAAAGAPj/AAAAAAAAAAAHAPj/AAAIAAoAAAAIAPj/AAAHAAkAAAAJAPj/AAAFAAoAAAAKAPj/AAAAAAAAAAAEAPf/AAAHAAkAAAADAPf/AAAFAAkAAAACAPf/AAAHAAkAAAABAPf/AAAIAAoAAAAAAPf/AAAFAAkAAAD///f/AAAIAAoAAAD+//f/AAAHAAoAAAD9//f/AAAIAAoAAAD8//f/AAAIAAkAAAD7//f/AAAIAAoAAAD6//f/AAAIAAkAAAD5//f/AAAHAAoAAAD4//f/AAAIAAkAAAD3//f/AAAIAAoAAAD2//f/AAAIAAkAAAD1//f/AAAHAAkAAAD0//f/AAAFAAoAAADz//f/AAAFAAkAAAALAPj/AAAFAAoAAAAMAPj/AAAHAAoAAAANAPj/AAAFAAoAAAAOAPj/AAAHAAoAAAAPAPj/AAAHAAoAAAAQAPn/AAAIAAkAAAARAPn/AAAIAAkAAAASAPn/AAAFAAkAAAATAPn/AAAFAAoAAAAPAPn/AAAHAAoAAAAOAPn/AAAHAAoAAADx//7/AAADAAcAAADx//3/AAADAAcAAADx//z/AAADAAYAAADx//v/AAAFAAkAAADx//r/AAAFAAoAAADx//n/AAAAAAAAAADy//n/AAAFAAoAAADz//n/AAAAAAAAAADy//z/AAAEAAYAAADy//3/AAACAAoAAADy//7/AAAAAAEAAADy////AAADAAcAAADx////AAADAAcAAADx/wAAAAADAAcAAADx/wEAAAAAAAEAAADy/wEAAAACAAkAAADy/wAAAAADAAcAAADz/wAAAAACAAkAAADz////AAADAAcAAADz//7/AAADAAcAAADz//3/AAADAAYAAADz//z/AAAFAAoAAAD0//z/AAAIAAkAAAD0//3/AAAEAAYAAAD0//7/AAAEAAcAAAD0////AAAEAAcAAAD0/wAAAAAEAAgAAAD1////AAAAAAAAAAD1//7/AAAFAAoAAAD1//3/AAAFAAoAAAD1//z/AAAAAAAAAAD2//z/AAAIAAoAAAD2//3/AAAAAAAAAAD2//7/AAAHAAkAAAD2////AAAIAAkAAAD3////AAAHAAoAAADz/wEAAAAEAAgAAADy//f/AAAHAAoAAADx//f/AAAFAAoAAAAIAPf/AAAIAAoAAAAHAPf/AAAIAAoAAAAGAPf/AAAIAAkAAAAFAPf/AAAFAAkAAAAJAPf/AAAIAAoAAAAKAPf/AAAIAAkAAAALAPf/AAAHAAoAAAAMAPf/AAAHAAoAAAANAPf/AAAAAAAAAAAOAPf/AAAAAAAAAAAPAPf/AAAHAAkAAAAQAPf/AAAAAAAAAAAQAPj/AAAHAAkAAAARAPj/AAAHAAoAAAARAPf/AAAIAAkAAAASAPf/AAAAAAAAAAASAPj/AAAIAAoAAAATAPj/AAAFAAoAAAATAPf/AAAIAAoAAAAMAPn/AAAHAAkAAAALAPn/AAAIAAkAAAAKAPn/AAAFAAoAAAANAPn/AAAIAAkAAAASAPv/AAAFAAkAAAASAPr/AAAFAAoAAAARAPr/AAAHAAkAAAARAPv/AAAAAAAAAAAQAPv/AAAFAAkAAAAPAPv/AAAFAAkAAAAOAPv/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAHAAkAAAAMAPz/AAAFAAkAAAANAP3/AAAFAAoAAAAOAP3/AAANABwAAAAOAPz/AAAAAAAAAAAPAPz/AAAFAAkAAAAPAP3/AAAFAAoAAAAPAP7/AAAHAAkAAAAOAP7/AAAIAAkAAAAOAP//AAAHAAkAAAANAP//AAAIAAoAAAAMAP//AAAIAAoAAAALAP//AAAHAAkAAAAKAP//AAAIAAoAAAAJAP//AAAAAAAAAAAIAP//AAACAAQAAAAJAAAAAAABAAMAAAAKAAAAAAABAAMAAAAKAAEAAAABAAQAAAALAAEAAAABAAQAAAALAAAAAAABAAMAAAAMAAAAAAABAAMAAAAMAAEAAAABAAQAAAANAAEAAAABAAQAAAANAAAAAAABAAMAAAAOAAAAAAABAAMAAAAOAAEAAAABAAQAAAAPAP//AAAIAAkAAAAQAP//AAAIAAoAAAAQAP7/AAAIAAoAAAAQAP3/AAAHAAkAAAAQAPz/AAAHAAoAAAARAPz/AAAIAAoAAAARAP3/AAAHAAoAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAAEAAAABAAQAAAASAAAAAAABAAMAAAASAP//AAAFAAoAAAASAP7/AAAIAAkAAAASAP3/AAAAAAAAAAASAPz/AAAFAAoAAAATAPz/AAAAAAAAAAATAPv/AAAHAAoAAAATAPr/AAAIAAkAAAATAP3/AAAFAAoAAAATAP7/AAAAAAAAAAATAP//AAAHAAkAAAATAAAAAAABAAMAAAATAAEAAAABAAQAAADi//D/AAAAAAsAAADi//H/AAABAAoAAADi//L/AAABAAkAAADi//P/AAABAAoAAADi//T/AAABAAkAAADi//X/AAABAAoAAADi//b/AAABAAkAAADi//f/AAABAAoAAADi//j/AAABAAkAAADi//n/AAABAAoAAADi//r/AAABAAkAAADi//v/AAABAAoAAADi//z/AAABAAkAAADi//3/AAABAAkAAADi//7/AAABAAkAAADi////AAABAAkAAADi/wAAAAABAAMAAADi/wEAAAABAAQAAADi/wIAAAABAAUAAADi/wMAAAAHAAkAAADi/wQAAAABAAkAAADi/wUAAAABAAkAAADi/wYAAAABAAoAAADi/wcAAAABAAkAAADi/wgAAAABAAoAAADi/wkAAAABAAkAAADi/woAAAABAAoAAADi/wsAAAABAAkAAADi/wwAAAABAAoAAADi/w0AAAABAAkAAADi/w4AAAABAAoAAADi/w8AAAABAAkAAADi/xAAAAABAAoAAADi/xEAAAABAAkAAADi/xIAAAABAAoAAADi/xMAAAABAAkAAADi/xQAAAABAAoAAADi/xUAAAABAAkAAADi/xYAAAABAAoAAADi/xcAAAABAAkAAADi/xgAAAABAAoAAADi/xkAAAABAAkAAADi/xoAAAABAAoAAADi/xsAAAABAAkAAADi/xwAAAABAAoAAADi/x0AAAABAAkAAADi/x4AAAABAAoAAADi/x8AAAABAAkAAADi/yAAAAABAAoAAADi/yEAAAABAAkAAADi/yIAAAABAAoAAADi/yMAAAABAAkAAADi/yQAAAABAAoAAADi/yUAAAABAAkAAADi/yYAAAABAAoAAADi/ycAAAABAAkAAADi/ygAAAABAAoAAADi/ykAAAAIAA4AAADi/yoAAAARAAcAAADi/ysAAAABAAQAAADi/ywAAAABAAUAAADi/y0AAAABAAkAAADi/y4AAAABAAoAAADi/y8AAAABAAkAAADi/zAAAAABAAoAAADi/zEAAAABAAkAAADi/zIAAAABAAoAAADi/zMAAAABAAkAAADj//D/AAABAAsAAADj//H/AAAIAAoAAADj//L/AAAIAAoAAADj//P/AAAHAAoAAADj//T/AAAIAAkAAADj//X/AAAIAAoAAADj//b/AAAFAAkAAADj//f/AAAIAAoAAADj//j/AAAFAAkAAADj//n/AAAHAAoAAADj//r/AAAHAAkAAADj//v/AAAIAAkAAADj//z/AAAHAAkAAADj//3/AAAFAAoAAADj//7/AAAIAAoAAADj////AAAIAAoAAADj/wAAAAABAAMAAADj/wEAAAABAAQAAADj/wIAAAABAAUAAADj/wMAAAAHAAoAAADj/wQAAAAIAAoAAADj/wUAAAAAAAAAAADj/wYAAAAFAAoAAADj/wcAAAAFAAoAAADj/wgAAAAHAAoAAADj/wkAAAAAAAAAAADj/woAAAAFAAkAAADj/wsAAAAFAAoAAADj/wwAAAAFAAkAAADj/w0AAAAFAAoAAADj/w4AAAAHAAoAAADj/w8AAAAAAAAAAADj/xAAAAAHAAkAAADj/xEAAAAIAAoAAADj/xIAAAAAAAAAAADj/xMAAAAIAAoAAADj/xQAAAAFAAoAAADj/xUAAAAIAAkAAADj/xYAAAAFAAoAAADj/xcAAAAFAAoAAADj/xgAAAAAAAAAAADj/xkAAAAIAAkAAADj/xoAAAAIAAkAAADj/xsAAAAHAAoAAADj/xwAAAAHAAkAAADj/x0AAAAFAAkAAADj/x4AAAAHAAoAAADj/x8AAAAHAAoAAADj/yAAAAAHAAkAAADj/yEAAAAIAAoAAADj/yIAAAAIAAkAAADj/yMAAAAFAAkAAADj/yQAAAAHAAoAAADj/yUAAAAAAAAAAADj/yYAAAAFAAoAAADj/ycAAAAIAAoAAADj/ygAAAAFAAkAAADj/ykAAAABAAMAAADj/yoAAAABAAQAAADj/ysAAAABAAQAAADj/ywAAAABAAUAAADj/y0AAAAFAAkAAADj/y4AAAAIAAkAAADj/y8AAAAHAAoAAADj/zAAAAAIAAkAAADj/zEAAAAHAAkAAADj/zIAAAAIAAkAAADj/zMAAAAFAAkAAADk//D/AAABAAsAAADk//H/AAAHAAkAAADk//L/AAAHAAoAAADk//P/AAAIAAkAAADk//T/AAAFAAoAAADk//X/AAAIAAkAAADk//b/AAAHAAoAAADk//f/AAAFAAoAAADk//j/AAAIAAoAAADk//n/AAAHAAkAAADk//r/AAAIAAkAAADk//v/AAAFAAoAAADk//z/AAAFAAoAAADk//3/AAAIAAkAAADk//7/AAAIAAoAAADk////AAAAAAAAAADk/wAAAAABAAMAAADk/wEAAAABAAQAAADk/wIAAAABAAUAAADk/wMAAAAIAAkAAADk/wQAAAAAAAAAAADk/wUAAAAAAAAAAADk/wYAAAAIAAoAAADk/wcAAAAAAAAAAADk/wgAAAAAAAAAAADk/wkAAAAAAAAAAADk/woAAAAIAAkAAADk/wsAAAAHAAoAAADk/wwAAAAHAAoAAADk/w0AAAAFAAoAAADk/w4AAAAAAAAAAADk/w8AAAAAAAAAAADk/xAAAAAFAAoAAADk/xEAAAAFAAoAAADk/xIAAAAHAAoAAADk/xMAAAAAAAAAAADk/xQAAAAFAAoAAADk/xUAAAAIAAoAAADk/xYAAAAIAAoAAADk/xcAAAAFAAkAAADk/xgAAAAFAAoAAADk/xkAAAAAAAAAAADk/xoAAAAHAAoAAADk/xsAAAAHAAkAAADk/xwAAAAHAAkAAADk/x0AAAAFAAoAAADk/x4AAAAAAAAAAADk/x8AAAAFAAkAAADk/yAAAAAIAAkAAADk/yEAAAAHAAkAAADk/yIAAAAIAAoAAADk/yMAAAAFAAkAAADk/yQAAAAHAAkAAADk/yUAAAAIAAoAAADk/yYAAAAIAAoAAADk/ycAAAAFAAoAAADk/ygAAAAFAAoAAADk/ykAAAABAAMAAADk/yoAAAABAAQAAADk/ysAAAABAAQAAADk/ywAAAABAAUAAADk/y0AAAAHAAkAAADk/y4AAAAHAAoAAADk/y8AAAAHAAkAAADk/zAAAAAHAAkAAADk/zEAAAAHAAoAAADk/zIAAAAAAAAAAADk/zMAAAAHAAkAAADl//D/AAABAAsAAADl//H/AAAIAAkAAADl//L/AAAIAAoAAADl//P/AAAHAAkAAADl//T/AAAFAAoAAADl//X/AAAAAAAAAADl//b/AAAHAAoAAADl//f/AAAFAAoAAADl//j/AAAHAAoAAADl//n/AAAFAAkAAADl//r/AAAFAAkAAADl//v/AAAHAAkAAADl//z/AAAIAAkAAADl//3/AAAIAAoAAADl//7/AAAHAAoAAADl////AAAFAAoAAADl/wAAAAABAAMAAADl/wEAAAABAAQAAADl/wIAAAABAAUAAADl/wMAAAAFAAkAAADl/wQAAAAHAAoAAADl/wUAAAAHAAkAAADl/wYAAAAIAAoAAADl/wcAAAAIAAkAAADl/wgAAAAIAAoAAADl/wkAAAAIAAoAAADl/woAAAAHAAoAAADl/wsAAAAHAAkAAADl/wwAAAAIAAkAAADl/w0AAAAAAAAAAADl/w4AAAAIAAoAAADl/w8AAAAFAAoAAADl/xAAAAAIAAkAAADl/xEAAAAFAAoAAADl/xIAAAAFAAoAAADl/xMAAAAFAAoAAADl/xQAAAAFAAoAAADl/xUAAAAFAAkAAADl/xYAAAAHAAoAAADl/xcAAAAIAAkAAADl/xgAAAAIAAoAAADl/xkAAAAIAAoAAADl/xoAAAAFAAoAAADl/xsAAAAHAAkAAADl/xwAAAAHAAoAAADl/x0AAAAAAAAAAADl/x4AAAAIAAkAAADl/x8AAAAIAAoAAADl/yAAAAAIAAoAAADl/yEAAAAIAAkAAADl/yIAAAAHAAkAAADl/yMAAAAIAAoAAADl/yQAAAAFAAkAAADl/yUAAAAAAAAAAADl/yYAAAAHAAoAAADl/ycAAAAFAAkAAADl/ygAAAAAAAAAAADl/ykAAAABAAMAAADl/yoAAAABAAQAAADl/ysAAAABAAQAAADl/ywAAAABAAUAAADl/y0AAAAIAAkAAADl/y4AAAAAAAAAAADl/y8AAAAAAAAAAADl/zAAAAAHAAkAAADl/zEAAAAHAAkAAADl/zIAAAAFAAkAAADl/zMAAAAAAAAAAADm//D/AAABAAsAAADm//H/AAAIAAoAAADm//L/AAAFAAoAAADm//P/AAAHAAkAAADm//T/AAAIAAkAAADm//X/AAAHAAoAAADm//b/AAAFAAkAAADm//f/AAAFAAkAAADm//j/AAAHAAoAAADm//n/AAAHAAkAAADm//r/AAAAAAAAAADm//v/AAAHAAkAAADm//z/AAAAAAAAAADm//3/AAAIAAkAAADm//7/AAAAAAAAAADm////AAAIAAkAAADm/wAAAAABAAMAAADm/wEAAAABAAQAAADm/wIAAAABAAUAAADm/wMAAAAIAAkAAADm/wQAAAAHAAoAAADm/wUAAAAIAAoAAADm/wYAAAAHAAoAAADm/wcAAAAHAAkAAADm/wgAAAAIAAoAAADm/wkAAAAHAAoAAADm/woAAAAFAAoAAADm/wsAAAAIAAkAAADm/wwAAAAHAAkAAADm/w0AAAAIAAkAAADm/w4AAAAAAAAAAADm/w8AAAAIAAoAAADm/xAAAAAFAAkAAADm/xEAAAAFAAkAAADm/xIAAAAFAAoAAADm/xMAAAAIAAoAAADm/xQAAAAFAAkAAADm/xUAAAAFAAoAAADm/xYAAAAIAAoAAADm/xcAAAAFAAkAAADm/xgAAAAHAAoAAADm/xkAAAAIAAoAAADm/xoAAAAFAAkAAADm/xsAAAAFAAoAAADm/xwAAAAHAAoAAADm/x0AAAAIAAoAAADm/x4AAAAIAAoAAADm/x8AAAAIAAoAAADm/yAAAAAAAAAAAADm/yEAAAAFAAkAAADm/yIAAAAFAAoAAADm/yMAAAAHAAoAAADm/yQAAAAIAAoAAADm/yUAAAAFAAoAAADm/yYAAAAFAAoAAADm/ycAAAAAAAAAAADm/ygAAAAHAAkAAADm/ykAAAABAAMAAADm/yoAAAABAAQAAADm/ysAAAABAAQAAADm/ywAAAABAAYAAADm/y0AAAAAAAUAAADm/y4AAAAIAAoAAADm/y8AAAAIAAkAAADm/zAAAAAIAAoAAADm/zEAAAAHAAoAAADm/zIAAAAHAAkAAADm/zMAAAAIAAkAAADn//D/AAABAAsAAADn//H/AAAFAAoAAADn//L/AAAIAAoAAADn//P/AAAHAAkAAADn//T/AAAIAAkAAADn//X/AAAFAAoAAADn//b/AAAAAAAAAADn//f/AAAFAAoAAADn//j/AAAHAAkAAADn//n/AAAIAAkAAADn//r/AAAHAAoAAADn//v/AAAAAAAAAADn//z/AAAFAAkAAADn//3/AAAFAAkAAADn//7/AAAFAAoAAADn////AAAHAAoAAADn/wAAAAABAAMAAADn/wEAAAABAAQAAADn/wIAAAABAAUAAADn/wMAAAAFAAoAAADn/wQAAAAHAAoAAADn/wUAAAAHAAoAAADn/wYAAAAIAAoAAADn/wcAAAAAAAAAAADn/wgAAAAIAAoAAADn/wkAAAAHAAkAAADn/woAAAAHAAoAAADn/wsAAAAIAAoAAADn/wwAAAAHAAoAAADn/w0AAAAIAAoAAADn/w4AAAAFAAkAAADn/w8AAAAFAAoAAADn/xAAAAAFAAoAAADn/xEAAAAIAAoAAADn/xIAAAAHAAkAAADn/xMAAAAIAAoAAADn/xQAAAAAAAAAAADn/xUAAAAIAAkAAADn/xYAAAAFAAkAAADn/xcAAAAIAAoAAADn/xgAAAAHAAoAAADn/xkAAAAFAAkAAADn/xoAAAAHAAoAAADn/xsAAAAIAAkAAADn/xwAAAAFAAkAAADn/x0AAAAIAAoAAADn/x4AAAAHAAoAAADn/x8AAAAIAAoAAADn/yAAAAAHAAoAAADn/yEAAAAIAAoAAADn/yIAAAAIAAoAAADn/yMAAAAFAAoAAADn/yQAAAAIAAoAAADn/yUAAAAFAAoAAADn/yYAAAAHAAoAAADn/ycAAAAFAAoAAADn/ygAAAAIAAkAAADn/ykAAAABAAMAAADn/yoAAAABAAQAAADn/ysAAAABAAQAAADn/ywAAAABAAQAAADn/y0AAAABAAUAAADn/y4AAAAFAAkAAADn/y8AAAAHAAkAAADn/zAAAAAAAAAAAADn/zEAAAAFAAkAAADn/zIAAAAFAAoAAADn/zMAAAAFAAkAAADo//D/AAABAAsAAADo//H/AAAFAAkAAADo//L/AAAFAAkAAADo//P/AAAAAAAAAADo//T/AAAFAAoAAADo//X/AAAFAAoAAADo//b/AAAHAAkAAADo//f/AAAIAAkAAADo//j/AAAHAAkAAADo//n/AAAAAAAAAADo//r/AAAFAAkAAADo//v/AAAIAAkAAADo//z/AAAFAAkAAADo//3/AAAFAAoAAADo//7/AAAHAAkAAADo////AAAAAAAAAADo/wAAAAABAAMAAADo/wEAAAABAAQAAADo/wIAAAABAAYAAADo/wMAAAAAAAQAAADo/wQAAAAAAAQAAADo/wUAAAAAAAUAAADo/wYAAAAIAAkAAADo/wcAAAAFAAkAAADo/wgAAAAHAAkAAADo/wkAAAAFAAoAAADo/woAAAAHAAkAAADo/wsAAAAAAAAAAADo/wwAAAAFAAkAAADo/w0AAAAIAAoAAADo/w4AAAAIAAkAAADo/w8AAAAAAAAAAADo/xAAAAAAAAAAAADo/xEAAAAHAAoAAADo/xIAAAAHAAkAAADo/xMAAAAIAAoAAADo/xQAAAAFAAoAAADo/xUAAAAAAAAAAADo/xYAAAAIAAoAAADo/xcAAAAHAAkAAADo/xgAAAAFAAkAAADo/xkAAAAAAAAAAADo/xoAAAAFAAoAAADo/xsAAAAHAAoAAADo/xwAAAAAAAAAAADo/x0AAAAHAAoAAADo/x4AAAAFAAkAAADo/x8AAAAFAAkAAADo/yAAAAAIAAoAAADo/yEAAAAHAAoAAADo/yIAAAAFAAkAAADo/yMAAAAFAAkAAADo/yQAAAAIAAkAAADo/yUAAAAFAAoAAADo/yYAAAAAAAAAAADo/ycAAAAFAAkAAADo/ygAAAAHAAkAAADo/ykAAAABAAMAAADo/yoAAAABAAQAAADo/ysAAAABAAQAAADo/ywAAAABAAQAAADo/y0AAAABAAYAAADo/y4AAAAAAAUAAADo/y8AAAAHAAoAAADo/zAAAAAHAAoAAADo/zEAAAAAAAAAAADo/zIAAAAIAAoAAADo/zMAAAAAAAAAAADp//D/AAABAAsAAADp//H/AAAFAAoAAADp//L/AAAFAAkAAADp//P/AAAAAAAAAADp//T/AAAHAAkAAADp//X/AAAFAAoAAADp//b/AAAFAAoAAADp//f/AAAFAAkAAADp//j/AAAHAAoAAADp//n/AAAFAAkAAADp//r/AAAFAAoAAADp//v/AAAFAAoAAADp//z/AAAAAAAAAADp//3/AAAAAAAAAADp//7/AAAFAAkAAADp////AAAHAAoAAADp/wAAAAABAAMAAADp/wEAAAABAAQAAADp/wIAAAABAAQAAADp/wMAAAABAAQAAADp/wQAAAABAAQAAADp/wUAAAABAAYAAADp/wYAAAAAAAQAAADp/wcAAAAAAAUAAADp/wgAAAAFAAoAAADp/wkAAAAAAAAAAADp/woAAAAHAAkAAADp/wsAAAAFAAoAAADp/wwAAAAFAAoAAADp/w0AAAAFAAoAAADp/w4AAAAAAAAAAADp/w8AAAAIAAoAAADp/xAAAAAHAAoAAADp/xEAAAAFAAoAAADp/xIAAAAIAAkAAADp/xMAAAAFAAoAAADp/xQAAAAFAAkAAADp/xUAAAAFAAoAAADp/xYAAAAIAAoAAADp/xcAAAAHAAoAAADp/xgAAAAAAAAAAADp/xkAAAAFAAoAAADp/xoAAAAFAAkAAADp/xsAAAAAAAAAAADp/xwAAAAHAAkAAADp/x0AAAAFAAoAAADp/x4AAAAHAAkAAADp/x8AAAAIAAoAAADp/yAAAAAIAAkAAADp/yEAAAAAAAAAAADp/yIAAAAIAAkAAADp/yMAAAAIAAkAAADp/yQAAAAFAAoAAADp/yUAAAAAAAAAAADp/yYAAAAFAAkAAADp/ycAAAAIAAoAAADp/ygAAAAFAAoAAADp/ykAAAACAAMAAADp/yoAAAAAAAcAAADp/ysAAAABAAQAAADp/ywAAAABAAQAAADp/y0AAAABAAQAAADp/y4AAAABAAUAAADp/y8AAAAIAAoAAADp/zAAAAAFAAkAAADp/zEAAAAHAAkAAADp/zIAAAAFAAoAAADp/zMAAAAAAAAAAADq//D/AAABAAsAAADq//H/AAAFAAoAAADq//L/AAAIAAoAAADq//P/AAAAAAAAAADq//T/AAAIAAoAAADq//X/AAAHAAoAAADq//b/AAAFAAkAAADq//f/AAAHAAkAAADq//j/AAAAAAAAAADq//n/AAAHAAkAAADq//r/AAAAAAAAAADq//v/AAAFAAkAAADq//z/AAAFAAkAAADq//3/AAAFAAkAAADq//7/AAAFAAoAAADq////AAAIAAkAAADq/wAAAAACAAMAAADq/wEAAAACAAQAAADq/wIAAAACAAQAAADq/wMAAAACAAQAAADq/wQAAAAAAAcAAADq/wUAAAABAAQAAADq/wYAAAABAAQAAADq/wcAAAABAAYAAADq/wgAAAAAAAUAAADq/wkAAAAIAAoAAADq/woAAAAAAAAAAADq/wsAAAAIAAoAAADq/wwAAAAHAAoAAADq/w0AAAAIAAkAAADq/w4AAAAFAAoAAADq/w8AAAAIAAkAAADq/xAAAAAHAAoAAADq/xEAAAAHAAkAAADq/xIAAAAFAAkAAADq/xMAAAAHAAoAAADq/xQAAAAHAAoAAADq/xUAAAAFAAoAAADq/xYAAAAHAAoAAADq/xcAAAAIAAkAAADq/xgAAAAAAAAAAADq/xkAAAAHAAkAAADq/xoAAAAHAAkAAADq/xsAAAAHAAoAAADq/xwAAAAAAAAAAADq/x0AAAAHAAkAAADq/x4AAAAFAAoAAADq/x8AAAAIAAkAAADq/yAAAAAAAAAAAADq/yEAAAAAAAAAAADq/yIAAAAFAAoAAADq/yMAAAAIAAkAAADq/yQAAAAIAAkAAADq/yUAAAAIAAoAAADq/yYAAAAFAAkAAADq/ycAAAAIAAkAAADq/ygAAAAHAAoAAADq/ykAAAAFAAoAAADq/yoAAAACAAMAAADq/ysAAAAAAAcAAADq/ywAAAABAAQAAADq/y0AAAABAAQAAADq/y4AAAABAAYAAADq/y8AAAAAAAUAAADq/zAAAAAIAAoAAADq/zEAAAAHAAkAAADq/zIAAAAFAAkAAADq/zMAAAAAAAAAAADr//D/AAABAAsAAADr//H/AAAAAAAAAADr//L/AAAIAAkAAADr//P/AAAIAAkAAADr//T/AAAHAAoAAADr//X/AAAFAAkAAADr//b/AAAHAAkAAADr//f/AAAIAAoAAADr//j/AAAIAAkAAADr//n/AAAFAAoAAADr//r/AAAIAAkAAADr//v/AAAIAAoAAADr//z/AAAIAAoAAADr//3/AAAFAAkAAADr//7/AAAFAAkAAADr////AAAAAAAAAADr/wAAAAAHAAkAAADr/wEAAAAFAAoAAADr/wIAAAAIAAoAAADr/wMAAAAFAAoAAADr/wQAAAACAAMAAADr/wUAAAAAAAcAAADr/wYAAAABAAQAAADr/wcAAAABAAQAAADr/wgAAAABAAYAAADr/wkAAAAAAAUAAADr/woAAAAIAAoAAADr/wsAAAAIAAoAAADr/wwAAAAIAAkAAADr/w0AAAAFAAoAAADr/w4AAAAFAAoAAADr/w8AAAAIAAkAAADr/xAAAAAFAAkAAADr/xEAAAAFAAkAAADr/xIAAAAIAAoAAADr/xMAAAAFAAkAAADr/xQAAAAHAAoAAADr/xUAAAAHAAoAAADr/xYAAAAIAAkAAADr/xcAAAAIAAkAAADr/xgAAAAHAAoAAADr/xkAAAAIAAoAAADr/xoAAAAFAAoAAADr/xsAAAAIAAoAAADr/xwAAAAHAAkAAADr/x0AAAAAAAAAAADr/x4AAAAFAAoAAADr/x8AAAAAAAAAAADr/yAAAAAAAAAAAADr/yEAAAAHAAkAAADr/yIAAAAFAAkAAADr/yMAAAAAAAAAAADr/yQAAAAIAAkAAADr/yUAAAAIAAkAAADr/yYAAAAFAAkAAADr/ycAAAAAAAAAAADr/ygAAAAFAAkAAADr/ykAAAAHAAoAAADr/yoAAAAIAAoAAADr/ysAAAACAAMAAADr/ywAAAAAAAcAAADr/y0AAAABAAQAAADr/y4AAAABAAQAAADr/y8AAAABAAUAAADr/zAAAAAHAAoAAADr/zEAAAAFAAoAAADr/zIAAAAFAAoAAADr/zMAAAAAAAAAAADs//D/AAABAAsAAADs//H/AAAFAAkAAADs//L/AAAAAAAAAADs//P/AAAIAAkAAADs//T/AAAIAAoAAADs//X/AAAHAAoAAADs//b/AAAHAAoAAADs//f/AAAIAAoAAADs//j/AAAFAAkAAADs//n/AAAIAAoAAADs//r/AAAAAAAAAADs//v/AAAAAAAAAADs//z/AAAIAAkAAADs//3/AAAIAAkAAADs//7/AAAFAAkAAADs////AAAFAAkAAADs/wAAAAAFAAoAAADs/wEAAAAIAAoAAADs/wIAAAAIAAkAAADs/wMAAAAFAAoAAADs/wQAAAAIAAoAAADs/wUAAAACAAMAAADs/wYAAAAAAAcAAADs/wcAAAABAAQAAADs/wgAAAABAAQAAADs/wkAAAABAAYAAADs/woAAAAAAAUAAADs/wsAAAAFAAoAAADs/wwAAAAIAAoAAADs/w0AAAAIAAkAAADs/w4AAAAIAAoAAADs/w8AAAAHAAoAAADs/xAAAAAIAAoAAADs/xEAAAAHAAkAAADs/xIAAAAAAAAAAADs/xMAAAAHAAoAAADs/xQAAAAHAAkAAADs/xUAAAAHAAkAAADs/xYAAAAIAAkAAADs/xcAAAAAAAAAAADs/xgAAAAFAAoAAADs/xkAAAAHAAoAAADs/xoAAAAHAAkAAADs/xsAAAAHAAkAAADs/xwAAAAFAAoAAADs/x0AAAAHAAkAAADs/x4AAAAHAAoAAADs/x8AAAAHAAoAAADs/yAAAAAHAAkAAADs/yEAAAAIAAoAAADs/yIAAAAIAAoAAADs/yMAAAAFAAoAAADs/yQAAAAHAAkAAADs/yUAAAAHAAoAAADs/yYAAAAHAAkAAADs/ycAAAAIAAkAAADs/ygAAAAAAAAAAADs/ykAAAAIAAkAAADs/yoAAAAHAAoAAADs/ysAAAAHAAoAAADs/ywAAAABAAMAAADs/y0AAAABAAQAAADs/y4AAAABAAQAAADs/y8AAAABAAYAAADs/zAAAAAAAAUAAADs/zEAAAAIAAkAAADs/zIAAAAHAAkAAADs/zMAAAAIAAoAAADt//D/AAABAAsAAADt//H/AAAIAAoAAADt//L/AAAIAAoAAADt//P/AAAHAAoAAADt//T/AAAAAAAAAADt//X/AAAAAAAAAADt//b/AAAAAAAAAADt//f/AAAIAAkAAADt//j/AAAIAAkAAADt//n/AAAIAAkAAADt//r/AAAAAAAAAADt//v/AAAHAAoAAADt//z/AAAAAAAAAADt//3/AAAFAAkAAADt//7/AAAFAAkAAADt////AAAIAAoAAADt/wAAAAAFAAoAAADt/wEAAAAIAAoAAADt/wIAAAAIAAoAAADt/wMAAAAFAAoAAADt/wQAAAAIAAoAAADt/wUAAAAFAAoAAADt/wYAAAACAAMAAADt/wcAAAAAAAcAAADt/wgAAAABAAQAAADt/wkAAAABAAQAAADt/woAAAABAAYAAADt/wsAAAAAAAUAAADt/wwAAAAIAAoAAADt/w0AAAAIAAkAAADt/w4AAAAFAAoAAADt/w8AAAAIAAoAAADt/xAAAAAAAAAAAADt/xEAAAAHAAoAAADt/xIAAAAHAAkAAADt/xMAAAAFAAoAAADt/xQAAAAAAAAAAADt/xUAAAAFAAoAAADt/xYAAAAHAAoAAADt/xcAAAAAAAAAAADt/xgAAAAIAAoAAADt/xkAAAAIAAkAAADt/xoAAAAIAAoAAADt/xsAAAAHAAkAAADt/xwAAAAHAAkAAADt/x0AAAAHAAoAAADt/x4AAAAFAAoAAADt/x8AAAAAAAAAAADt/yAAAAAFAAoAAADt/yEAAAAHAAkAAADt/yIAAAAAAAAAAADt/yMAAAAIAAkAAADt/yQAAAAIAAoAAADt/yUAAAAFAAoAAADt/yYAAAAFAAoAAADt/ycAAAAFAAkAAADt/ygAAAAFAAoAAADt/ykAAAAFAAkAAADt/yoAAAAHAAkAAADt/ysAAAAIAAoAAADt/ywAAAABAAMAAADt/y0AAAABAAQAAADt/y4AAAABAAQAAADt/y8AAAABAAQAAADt/zAAAAABAAUAAADt/zEAAAAHAAoAAADt/zIAAAAIAAkAAADt/zMAAAAHAAoAAADu//D/AAABAAsAAADu//H/AAAIAAoAAADu//L/AAAIAAoAAADu//P/AAAFAAoAAADu//T/AAAHAAoAAADu//X/AAAIAAkAAADu//b/AAAIAAoAAADu//f/AAAFAAoAAADu//j/AAAFAAkAAADu//n/AAAHAAoAAADu//r/AAAFAAkAAADu//v/AAAHAAkAAADu//z/AAAIAAoAAADu//3/AAACAAYAAADu//7/AAACAAcAAADu////AAACAAcAAADu/wAAAAACAAgAAADu/wEAAAAAAAAAAADu/wIAAAAFAAkAAADu/wMAAAAIAAkAAADu/wQAAAAFAAkAAADu/wUAAAAFAAoAAADu/wYAAAAIAAoAAADu/wcAAAACAAMAAADu/wgAAAAAAAcAAADu/wkAAAABAAQAAADu/woAAAABAAQAAADu/wsAAAABAAUAAADu/wwAAAAFAAkAAADu/w0AAAAFAAkAAADu/w4AAAAIAAoAAADu/w8AAAAIAAoAAADu/xAAAAAHAAkAAADu/xEAAAAAAAAAAADu/xIAAAAAAAAAAADu/xMAAAAAAAAAAADu/xQAAAAFAAkAAADu/xUAAAAHAAkAAADu/xYAAAAHAAkAAADu/xcAAAAFAAkAAADu/xgAAAAIAAoAAADu/xkAAAAIAAoAAADu/xoAAAAFAAoAAADu/xsAAAAIAAkAAADu/xwAAAAHAAkAAADu/x0AAAAHAAkAAADu/x4AAAAFAAoAAADu/x8AAAAFAAkAAADu/yAAAAAFAAoAAADu/yEAAAAIAAoAAADu/yIAAAAAAAAAAADu/yMAAAAFAAoAAADu/yQAAAAFAAoAAADu/yUAAAAFAAoAAADu/yYAAAAFAAkAAADu/ycAAAAAAAAAAADu/ygAAAAHAAkAAADu/ykAAAAHAAoAAADu/yoAAAAIAAkAAADu/ysAAAAIAAkAAADu/ywAAAACAAMAAADu/y0AAAAAAAcAAADu/y4AAAABAAQAAADu/y8AAAABAAQAAADu/zAAAAABAAUAAADu/zEAAAAAAAAAAADu/zIAAAAAAAAAAADu/zMAAAAFAAoAAADv//D/AAABAAsAAADv//H/AAAFAAoAAADv//L/AAAHAAkAAADv//P/AAAIAAkAAADv//T/AAAIAAkAAADv//X/AAAAAAAAAADv//b/AAAFAAkAAADv//f/AAAHAAoAAADv//j/AAAFAAoAAADv//n/AAAIAAoAAADv//r/AAAAAAAAAADv//v/AAAFAAkAAADv//z/AAACAAYAAADv//3/AAADAAoAAADv//7/AAADAAcAAADv////AAAAAAEAAADv/wAAAAADAAkAAADv/wEAAAACAAgAAADv/wIAAAAIAAoAAADv/wMAAAAHAAkAAADv/wQAAAAFAAkAAADv/wUAAAAHAAoAAADv/wYAAAAFAAkAAADv/wcAAAAHAAoAAADv/wgAAAACAAMAAADv/wkAAAAAAAcAAADv/woAAAABAAQAAADv/wsAAAABAAYAAADv/wwAAAAAAAUAAADv/w0AAAAIAAkAAADv/w4AAAAFAAkAAADv/w8AAAAFAAoAAADv/xAAAAAFAAoAAADv/xEAAAAIAAoAAADv/xIAAAAAAAAAAADv/xMAAAAAAAAAAADv/xQAAAAFAAkAAADv/xUAAAAHAAoAAADv/xYAAAAHAAoAAADv/xcAAAAHAAkAAADv/xgAAAAHAAoAAADv/xkAAAAHAAoAAADv/xoAAAAFAAkAAADv/xsAAAAAAAAAAADv/xwAAAAFAAkAAADv/x0AAAAIAAkAAADv/x4AAAAHAAoAAADv/x8AAAAHAAoAAADv/yAAAAAIAAkAAADv/yEAAAAFAAkAAADv/yIAAAAAAAAAAADv/yMAAAAFAAoAAADv/yQAAAAAAAAAAADv/yUAAAAHAAoAAADv/yYAAAAIAAkAAADv/ycAAAAIAAoAAADv/ygAAAAHAAkAAADv/ykAAAAIAAkAAADv/yoAAAAFAAoAAADv/ysAAAAFAAoAAADv/ywAAAAAAAMAAADv/y0AAAABAAcAAADv/y4AAAABAAQAAADv/y8AAAABAAQAAADv/zAAAAABAAUAAADv/zEAAAAHAAoAAADv/zIAAAAIAAoAAADv/zMAAAAHAAoAAADw//D/AAABAAsAAADw//H/AAAIAAoAAADw//L/AAAHAAoAAADw//P/AAAHAAoAAADw//T/AAAHAAoAAADw//X/AAAIAAoAAADw//b/AAAHAAkAAADw//f/AAAFAAkAAADw//j/AAAAAAAAAADw//n/AAAHAAkAAADw//r/AAAIAAkAAADw//v/AAAIAAkAAADw//z/AAADAAYAAADw//3/AAAAAAEAAADw//7/AAADAAcAAADw////AAADAAcAAADw/wAAAAADAAcAAADw/wEAAAADAAkAAADw/wIAAAACAAgAAADw/wMAAAAHAAoAAADw/wQAAAAAAAAAAADw/wUAAAAHAAoAAADw/wYAAAAFAAkAAADw/wcAAAAHAAkAAADw/wgAAAAHAAkAAADw/wkAAAABAAMAAADw/woAAAABAAQAAADw/wsAAAABAAQAAADw/wwAAAABAAYAAADw/w0AAAAAAAQAAADw/w4AAAAAAAUAAADw/w8AAAAAAAAAAADw/xAAAAAFAAoAAADw/xEAAAAAAAAAAADw/xIAAAAAAAAAAADw/xMAAAAHAAoAAADw/xQAAAAFAAoAAADw/xUAAAAHAAkAAADw/xYAAAAFAAoAAADw/xcAAAAAAAAAAADw/xgAAAAIAAkAAADw/xkAAAAHAAkAAADw/xoAAAAAAAAAAADw/xsAAAAHAAoAAADw/xwAAAAAAAAAAADw/x0AAAAFAAkAAADw/x4AAAAIAAkAAADw/x8AAAAHAAoAAADw/yAAAAAIAAoAAADw/yEAAAAAAAAAAADw/yIAAAAFAAoAAADw/yMAAAAAAAAAAADw/yQAAAAHAAkAAADw/yUAAAAIAAkAAADw/yYAAAAFAAoAAADw/ycAAAAIAAoAAADw/ygAAAAIAAoAAADw/ykAAAAIAAkAAADw/yoAAAAHAAkAAADw/ysAAAAIAAkAAADw/ywAAAABAAMAAADw/y0AAAABAAQAAADw/y4AAAABAAQAAADw/y8AAAABAAQAAADw/zAAAAABAAUAAADw/zEAAAAIAAoAAADw/zIAAAAAAAAAAADw/zMAAAAIAAoAAADx//D/AAABAAsAAADx//H/AAAHAAkAAADx//L/AAAFAAkAAADx//P/AAAHAAoAAADx//T/AAAHAAkAAADx//X/AAAHAAkAAADx//b/AAAAAAAAAADx/wIAAAADAAgAAADx/wMAAAAIAAoAAADx/wQAAAAHAAoAAADx/wUAAAAHAAoAAADx/wYAAAAHAAkAAADx/wcAAAAHAAkAAADx/wgAAAAFAAkAAADx/wkAAAABAAMAAADx/woAAAABAAQAAADx/wsAAAABAAQAAADx/wwAAAABAAQAAADx/w0AAAABAAQAAADx/w4AAAABAAYAAADx/w8AAAAAAAQAAADx/xAAAAAAAAQAAADx/xEAAAAAAAUAAADx/xIAAAAIAAkAAADx/xMAAAAFAAkAAADx/xQAAAAIAAoAAADx/xUAAAAFAAkAAADx/xYAAAAIAAoAAADx/xcAAAAIAAkAAADx/xgAAAAAAAAAAADx/xkAAAAAAAAAAADx/xoAAAAAAAAAAADx/xsAAAAHAAkAAADx/xwAAAAIAAkAAADx/x0AAAAIAAkAAADx/x4AAAAIAAoAAADx/x8AAAAHAAkAAADx/yAAAAAIAAkAAADx/yEAAAAAAAAAAADx/yIAAAAIAAoAAADx/yMAAAAHAAoAAADx/yQAAAAIAAkAAADx/yUAAAAHAAoAAADx/yYAAAAIAAoAAADx/ycAAAAFAAkAAADx/ygAAAAHAAoAAADx/ykAAAAAAAAAAADx/yoAAAAFAAkAAADx/ysAAAAIAAoAAADx/ywAAAABAAMAAADx/y0AAAABAAQAAADx/y4AAAABAAQAAADx/y8AAAABAAQAAADx/zAAAAABAAUAAADx/zEAAAAIAAkAAADx/zIAAAAHAAoAAADx/zMAAAAAAAAAAADy//D/AAABAAsAAADy//H/AAAFAAoAAADy//L/AAAFAAkAAADy//P/AAAIAAkAAADy//T/AAAFAAoAAADy//X/AAAHAAkAAADy//b/AAAIAAkAAADy/wIAAAAEAAgAAADy/wMAAAAFAAoAAADy/wQAAAAIAAoAAADy/wUAAAAHAAoAAADy/wYAAAAHAAkAAADy/wcAAAAHAAoAAADy/wgAAAAAAAMAAADy/wkAAAABAAcAAADy/woAAAABAAQAAADy/wsAAAABAAQAAADy/wwAAAABAAQAAADy/w0AAAABAAQAAADy/w4AAAABAAQAAADy/w8AAAABAAQAAADy/xAAAAABAAQAAADy/xEAAAABAAYAAADy/xIAAAAAAAQAAADy/xMAAAAAAAQAAADy/xQAAAAAAAUAAADy/xUAAAAHAAkAAADy/xYAAAAHAAkAAADy/xcAAAAIAAkAAADy/xgAAAAIAAkAAADy/xkAAAAHAAkAAADy/xoAAAAIAAoAAADy/xsAAAAAAAAAAADy/xwAAAAFAAkAAADy/x0AAAAFAAkAAADy/x4AAAAAAAAAAADy/x8AAAAFAAoAAADy/yAAAAAFAAoAAADy/yEAAAAAAAAAAADy/yIAAAAFAAoAAADy/yMAAAAAAAAAAADy/yQAAAAIAAkAAADy/yUAAAAHAAoAAADy/yYAAAAAAAAAAADy/ycAAAAHAAkAAADy/ygAAAAIAAoAAADy/ykAAAAFAAkAAADy/yoAAAAIAAoAAADy/ysAAAAAAAAAAADy/ywAAAABAAMAAADy/y0AAAABAAQAAADy/y4AAAABAAQAAADy/y8AAAABAAQAAADy/zAAAAABAAUAAADy/zEAAAAIAAkAAADy/zIAAAAFAAoAAADy/zMAAAAIAAoAAADz//D/AAABAAsAAADz//H/AAAIAAoAAADz//L/AAAHAAoAAADz//P/AAAFAAkAAADz//T/AAAFAAoAAADz//X/AAAFAAoAAADz//b/AAAHAAoAAADz/wIAAAAAAAAAAADz/wMAAAAHAAoAAADz/wQAAAAIAAkAAADz/wUAAAAHAAkAAADz/wYAAAAIAAkAAADz/wcAAAAIAAkAAADz/wgAAAABAAMAAADz/wkAAAABAAQAAADz/woAAAABAAQAAADz/wsAAAAAAAYAAADz/wwAAAACAAQAAADz/w0AAAAAAAcAAADz/w4AAAABAAQAAADz/w8AAAABAAQAAADz/xAAAAABAAQAAADz/xEAAAABAAQAAADz/xIAAAABAAQAAADz/xMAAAABAAQAAADz/xQAAAABAAYAAADz/xUAAAAAAAQAAADz/xYAAAAAAAUAAADz/xcAAAAAAAAAAADz/xgAAAAHAAoAAADz/xkAAAAAAAAAAADz/xoAAAAFAAkAAADz/xsAAAAFAAkAAADz/xwAAAAHAAkAAADz/x0AAAAAAAAAAADz/x4AAAAFAAoAAADz/x8AAAAFAAkAAADz/yAAAAAIAAkAAADz/yEAAAAIAAkAAADz/yIAAAAAAAAAAADz/yMAAAAFAAoAAADz/yQAAAAFAAoAAADz/yUAAAAIAAkAAADz/yYAAAAIAAoAAADz/ycAAAAIAAkAAADz/ygAAAAIAAkAAADz/ykAAAAHAAoAAADz/yoAAAAIAAkAAADz/ysAAAAAAAMAAADz/ywAAAABAAcAAADz/y0AAAABAAQAAADz/y4AAAABAAQAAADz/y8AAAABAAQAAADz/zAAAAABAAUAAADz/zEAAAAHAAoAAADz/zIAAAAIAAkAAADz/zMAAAAHAAoAAAD0//D/AAABAAsAAAD0//H/AAAFAAoAAAD0//L/AAAFAAkAAAD0//P/AAAFAAkAAAD0//T/AAAAAAAAAAD0//X/AAAFAAkAAAD0//b/AAAHAAoAAAD0/wIAAAAFAAkAAAD0/wMAAAAHAAoAAAD0/wQAAAANABwAAAD0/wUAAAAHAAkAAAD0/wYAAAAFAAkAAAD0/wcAAAAAAAMAAAD0/wgAAAABAAcAAAD0/wkAAAABAAQAAAD0/woAAAAAAAYAAAD0/wsAAAACAAUAAAD0/wwAAAAHAAkAAAD0/w0AAAACAAMAAAD0/w4AAAACAAQAAAD0/w8AAAAAAAcAAAD0/xAAAAABAAQAAAD0/xEAAAABAAQAAAD0/xIAAAABAAQAAAD0/xMAAAABAAQAAAD0/xQAAAABAAQAAAD0/xUAAAABAAQAAAD0/xYAAAABAAYAAAD0/xcAAAAAAAQAAAD0/xgAAAAAAAUAAAD0/xkAAAAHAAkAAAD0/xoAAAAAAAAAAAD0/xsAAAAIAAkAAAD0/xwAAAAFAAoAAAD0/x0AAAAIAAoAAAD0/x4AAAAHAAkAAAD0/x8AAAAIAAkAAAD0/yAAAAAIAAkAAAD0/yEAAAAHAAoAAAD0/yIAAAAFAAkAAAD0/yMAAAAIAAkAAAD0/yQAAAAAAAAAAAD0/yUAAAAIAAoAAAD0/yYAAAAAAAAAAAD0/ycAAAAFAAkAAAD0/ygAAAAIAAoAAAD0/ykAAAAHAAkAAAD0/yoAAAAHAAoAAAD0/ysAAAABAAMAAAD0/ywAAAABAAQAAAD0/y0AAAABAAQAAAD0/y4AAAABAAQAAAD0/y8AAAAAAAYAAAD0/zAAAAACAAUAAAD0/zEAAAAFAAkAAAD0/zIAAAAIAAoAAAD0/zMAAAAIAAoAAAD1//D/AAABAAsAAAD1//H/AAAFAAkAAAD1//L/AAAIAAkAAAD1//P/AAAFAAkAAAD1//T/AAAHAAkAAAD1//X/AAAAAAAAAAD1//b/AAAHAAkAAAD1/wIAAAAFAAoAAAD1/wMAAAAHAAoAAAD1/wQAAAAFAAkAAAD1/wUAAAAIAAkAAAD1/wYAAAAAAAMAAAD1/wcAAAABAAcAAAD1/wgAAAABAAQAAAD1/wkAAAABAAQAAAD1/woAAAABAAUAAAD1/wsAAAAAAAAAAAD1/wwAAAAIAAoAAAD1/w0AAAAIAAoAAAD1/w4AAAAIAAoAAAD1/w8AAAACAAMAAAD1/xAAAAAAAAcAAAD1/xEAAAABAAQAAAD1/xIAAAABAAQAAAD1/xMAAAABAAQAAAD1/xQAAAABAAQAAAD1/xUAAAABAAQAAAD1/xYAAAABAAQAAAD1/xcAAAABAAQAAAD1/xgAAAABAAYAAAD1/xkAAAAAAAQAAAD1/xoAAAAAAAUAAAD1/xsAAAAFAAkAAAD1/xwAAAAFAAoAAAD1/x0AAAAFAAkAAAD1/x4AAAAIAAkAAAD1/x8AAAAAAAAAAAD1/yAAAAAHAAoAAAD1/yEAAAAAAAAAAAD1/yIAAAAIAAoAAAD1/yMAAAAIAAkAAAD1/yQAAAAFAAoAAAD1/yUAAAAFAAkAAAD1/yYAAAAHAAoAAAD1/ycAAAAAAAAAAAD1/ygAAAAIAAkAAAD1/ykAAAAFAAkAAAD1/yoAAAAAAAMAAAD1/ysAAAABAAcAAAD1/ywAAAABAAQAAAD1/y0AAAABAAQAAAD1/y4AAAAAAAYAAAD1/y8AAAACAAUAAAD1/zAAAAAAAAAAAAD1/zEAAAAHAAoAAAD1/zIAAAAFAAoAAAD1/zMAAAAHAAoAAAD2//D/AAABAAsAAAD2//H/AAAAAAAAAAD2//L/AAAHAAoAAAD2//P/AAAAAAAAAAD2//T/AAAAAAAAAAD2//X/AAAHAAoAAAD2//b/AAAAAAAAAAD2/wIAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wQAAAAAAAMAAAD2/wUAAAAAAAQAAAD2/wYAAAABAAcAAAD2/wcAAAABAAQAAAD2/wgAAAABAAQAAAD2/wkAAAAAAAYAAAD2/woAAAACAAUAAAD2/wsAAAAAAAAAAAD2/wwAAAAIAAkAAAD2/w0AAAAFAAoAAAD2/w4AAAAFAAoAAAD2/w8AAAAFAAoAAAD2/xAAAAACAAMAAAD2/xEAAAACAAQAAAD2/xIAAAACAAQAAAD2/xMAAAACAAQAAAD2/xQAAAAAAAcAAAD2/xUAAAABAAQAAAD2/xYAAAABAAQAAAD2/xcAAAABAAQAAAD2/xgAAAABAAQAAAD2/xkAAAABAAQAAAD2/xoAAAABAAYAAAD2/xsAAAAAAAUAAAD2/xwAAAAFAAkAAAD2/x0AAAAFAAkAAAD2/x4AAAAHAAkAAAD2/x8AAAAFAAkAAAD2/yAAAAAFAAkAAAD2/yEAAAAFAAkAAAD2/yIAAAAIAAkAAAD2/yMAAAAFAAkAAAD2/yQAAAAFAAkAAAD2/yUAAAAFAAkAAAD2/yYAAAAAAAAAAAD2/ycAAAAIAAkAAAD2/ygAAAAHAAoAAAD2/ykAAAAAAAMAAAD2/yoAAAABAAcAAAD2/ysAAAABAAQAAAD2/ywAAAABAAQAAAD2/y0AAAAAAAYAAAD2/y4AAAACAAUAAAD2/y8AAAAFAAoAAAD2/zAAAAAFAAkAAAD2/zEAAAAFAAoAAAD2/zIAAAAFAAkAAAD2/zMAAAAHAAkAAAD3//D/AAABAAsAAAD3//H/AAAFAAoAAAD3//L/AAAFAAkAAAD3//P/AAAFAAkAAAD3//T/AAAIAAoAAAD3//X/AAAIAAoAAAD3//b/AAAIAAkAAAD3/wIAAAAAAAMAAAD3/wMAAAAAAAQAAAD3/wQAAAABAAcAAAD3/wUAAAABAAQAAAD3/wYAAAABAAQAAAD3/wcAAAABAAQAAAD3/wgAAAAAAAYAAAD3/wkAAAACAAUAAAD3/woAAAAHAAkAAAD3/wsAAAAIAAkAAAD3/wwAAAAIAAkAAAD3/w0AAAAIAAkAAAD3/w4AAAAHAAkAAAD3/w8AAAAHAAoAAAD3/xAAAAAIAAkAAAD3/xEAAAAIAAkAAAD3/xIAAAAAAAAAAAD3/xMAAAAHAAoAAAD3/xQAAAACAAMAAAD3/xUAAAACAAQAAAD3/xYAAAAAAAcAAAD3/xcAAAABAAQAAAD3/xgAAAABAAQAAAD3/xkAAAABAAQAAAD3/xoAAAABAAQAAAD3/xsAAAABAAYAAAD3/xwAAAAAAAUAAAD3/x0AAAAHAAoAAAD3/x4AAAAHAAkAAAD3/x8AAAAHAAoAAAD3/yAAAAAFAAoAAAD3/yEAAAAFAAoAAAD3/yIAAAAIAAkAAAD3/yMAAAAHAAkAAAD3/yQAAAAFAAkAAAD3/yUAAAAFAAkAAAD3/yYAAAAHAAoAAAD3/ycAAAAHAAkAAAD3/ygAAAAHAAoAAAD3/ykAAAABAAMAAAD3/yoAAAABAAQAAAD3/ysAAAABAAQAAAD3/ywAAAABAAQAAAD3/y0AAAABAAUAAAD3/y4AAAAHAAkAAAD3/y8AAAAFAAkAAAD3/zAAAAAHAAoAAAD3/zEAAAAIAAoAAAD3/zIAAAAIAAkAAAD3/zMAAAAAAAAAAAD4//D/AAABAAsAAAD4//H/AAAIAAoAAAD4//L/AAAIAAkAAAD4//P/AAAFAAkAAAD4//T/AAAFAAoAAAD4//X/AAAFAAkAAAD4//b/AAAHAAoAAAD4/wIAAAABAAcAAAD4/wMAAAABAAQAAAD4/wQAAAABAAQAAAD4/wUAAAAAAAYAAAD4/wYAAAACAAQAAAD4/wcAAAACAAQAAAD4/wgAAAACAAUAAAD4/wkAAAAHAAoAAAD4/woAAAAHAAkAAAD4/wsAAAAHAAoAAAD4/wwAAAAIAAkAAAD4/w0AAAAIAAkAAAD4/w4AAAAHAAkAAAD4/w8AAAAHAAoAAAD4/xAAAAAAAAAAAAD4/xEAAAAHAAkAAAD4/xIAAAAAAAAAAAD4/xMAAAAIAAkAAAD4/xQAAAAAAAAAAAD4/xUAAAAIAAkAAAD4/xYAAAACAAMAAAD4/xcAAAACAAQAAAD4/xgAAAAAAAcAAAD4/xkAAAABAAQAAAD4/xoAAAABAAQAAAD4/xsAAAABAAQAAAD4/xwAAAABAAYAAAD4/x0AAAAAAAUAAAD4/x4AAAAFAAkAAAD4/x8AAAAFAAkAAAD4/yAAAAAHAAkAAAD4/yEAAAAHAAkAAAD4/yIAAAAIAAkAAAD4/yMAAAAHAAkAAAD4/yQAAAAHAAkAAAD4/yUAAAAFAAkAAAD4/yYAAAAHAAoAAAD4/ycAAAAIAAkAAAD4/ygAAAAAAAMAAAD4/ykAAAABAAcAAAD4/yoAAAABAAQAAAD4/ysAAAABAAQAAAD4/ywAAAABAAQAAAD4/y0AAAABAAUAAAD4/y4AAAAIAAoAAAD4/y8AAAAIAAoAAAD4/zAAAAAHAAkAAAD4/zEAAAAFAAoAAAD4/zIAAAAFAAoAAAD4/zMAAAAAAAAAAAD5//D/AAABAAsAAAD5//H/AAAIAAkAAAD5//L/AAAFAAoAAAD5//P/AAAIAAkAAAD5//T/AAAFAAoAAAD5//X/AAAFAAkAAAD5//b/AAAFAAoAAAD5/wIAAAABAAQAAAD5/wMAAAAAAAYAAAD5/wQAAAACAAQAAAD5/wUAAAACAAUAAAD5/wYAAAAFAAkAAAD5/wcAAAAHAAkAAAD5/wgAAAAFAAkAAAD5/wkAAAAFAAkAAAD5/woAAAAIAAoAAAD5/wsAAAAFAAkAAAD5/wwAAAAFAAoAAAD5/w0AAAAHAAkAAAD5/w4AAAAHAAoAAAD5/w8AAAAAAAAAAAD5/xAAAAAIAAoAAAD5/xEAAAAIAAoAAAD5/xIAAAAHAAkAAAD5/xMAAAAHAAoAAAD5/xQAAAAFAAkAAAD5/xUAAAAHAAoAAAD5/xYAAAAIAAkAAAD5/xcAAAAIAAoAAAD5/xgAAAACAAMAAAD5/xkAAAAAAAcAAAD5/xoAAAABAAQAAAD5/xsAAAABAAQAAAD5/xwAAAABAAQAAAD5/x0AAAABAAYAAAD5/x4AAAAAAAUAAAD5/x8AAAAFAAkAAAD5/yAAAAAFAAkAAAD5/yEAAAAHAAkAAAD5/yIAAAAHAAoAAAD5/yMAAAAHAAkAAAD5/yQAAAAHAAkAAAD5/yUAAAAHAAoAAAD5/yYAAAAAAAAAAAD5/ycAAAAFAAkAAAD5/ygAAAABAAMAAAD5/ykAAAABAAQAAAD5/yoAAAABAAQAAAD5/ysAAAABAAQAAAD5/ywAAAAAAAYAAAD5/y0AAAACAAUAAAD5/y4AAAAHAAkAAAD5/y8AAAAHAAoAAAD5/zAAAAAFAAkAAAD5/zEAAAAAAAAAAAD5/zIAAAAFAAkAAAD5/zMAAAAHAAkAAAD6//D/AAABAAsAAAD6//H/AAAHAAoAAAD6//L/AAAIAAoAAAD6//P/AAAFAAkAAAD6//T/AAAHAAkAAAD6//X/AAAIAAoAAAD6//b/AAAIAAkAAAD6/wIAAAABAAQAAAD6/wMAAAABAAUAAAD6/wQAAAAIAAoAAAD6/wUAAAAIAAoAAAD6/wYAAAAFAAkAAAD6/wcAAAAIAAoAAAD6/wgAAAAHAAkAAAD6/wkAAAAFAAoAAAD6/woAAAAHAAoAAAD6/wsAAAAHAAkAAAD6/wwAAAAIAAoAAAD6/w0AAAAHAAoAAAD6/w4AAAAFAAoAAAD6/w8AAAAHAAkAAAD6/xAAAAAHAAoAAAD6/xEAAAAFAAkAAAD6/xIAAAAFAAkAAAD6/xMAAAAHAAkAAAD6/xQAAAAIAAkAAAD6/xUAAAAHAAkAAAD6/xYAAAAIAAoAAAD6/xcAAAAHAAkAAAD6/xgAAAAIAAkAAAD6/xkAAAACAAMAAAD6/xoAAAAAAAcAAAD6/xsAAAABAAQAAAD6/xwAAAABAAQAAAD6/x0AAAABAAQAAAD6/x4AAAABAAYAAAD6/x8AAAAAAAUAAAD6/yAAAAAIAAkAAAD6/yEAAAAFAAoAAAD6/yIAAAAIAAkAAAD6/yMAAAAHAAkAAAD6/yQAAAAFAAkAAAD6/yUAAAAFAAkAAAD6/yYAAAAAAAMAAAD6/ycAAAAAAAQAAAD6/ygAAAABAAcAAAD6/ykAAAABAAQAAAD6/yoAAAABAAQAAAD6/ysAAAAAAAYAAAD6/ywAAAACAAUAAAD6/y0AAAAFAAkAAAD6/y4AAAAIAAoAAAD6/y8AAAAHAAkAAAD6/zAAAAAIAAoAAAD6/zEAAAAIAAoAAAD6/zIAAAAIAAoAAAD6/zMAAAAHAAkAAAD7//D/AAABAAsAAAD7//H/AAAIAAkAAAD7//L/AAAFAAoAAAD7//P/AAAFAAkAAAD7//T/AAAFAAoAAAD7//X/AAAFAAkAAAD7//b/AAAIAAoAAAD7/wIAAAABAAQAAAD7/wMAAAABAAUAAAD7/wQAAAAHAAkAAAD7/wUAAAAFAAoAAAD7/wYAAAAIAAoAAAD7/wcAAAAAAAAAAAD7/wgAAAAHAAoAAAD7/wkAAAAIAAkAAAD7/woAAAAIAAkAAAD7/wsAAAAIAAoAAAD7/wwAAAAIAAkAAAD7/w0AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w8AAAAFAAkAAAD7/xAAAAAIAAkAAAD7/xEAAAAFAAoAAAD7/xIAAAAAAAAAAAD7/xMAAAAIAAoAAAD7/xQAAAAAAAAAAAD7/xUAAAAIAAoAAAD7/xYAAAAHAAoAAAD7/xcAAAAAAAAAAAD7/xgAAAAIAAkAAAD7/xkAAAAFAAkAAAD7/xoAAAACAAMAAAD7/xsAAAAAAAcAAAD7/xwAAAABAAQAAAD7/x0AAAABAAQAAAD7/x4AAAABAAQAAAD7/x8AAAABAAUAAAD7/yAAAAAFAAoAAAD7/yEAAAAFAAkAAAD7/yIAAAAIAAoAAAD7/yMAAAAFAAoAAAD7/yQAAAAHAAkAAAD7/yUAAAAAAAMAAAD7/yYAAAABAAcAAAD7/ycAAAABAAQAAAD7/ygAAAABAAQAAAD7/ykAAAABAAQAAAD7/yoAAAAAAAYAAAD7/ysAAAACAAUAAAD7/ywAAAAIAAkAAAD7/y0AAAAIAAkAAAD7/y4AAAAHAAoAAAD7/y8AAAAIAAoAAAD7/zAAAAAFAAoAAAD7/zEAAAAHAAkAAAD7/zIAAAAHAAkAAAD7/zMAAAAHAAoAAAD8//D/AAABAAsAAAD8//H/AAAHAAoAAAD8//L/AAAHAAoAAAD8//P/AAAFAAkAAAD8//T/AAAFAAkAAAD8//X/AAAIAAkAAAD8//b/AAAAAAAAAAD8/wIAAAAAAAYAAAD8/wMAAAACAAUAAAD8/wQAAAANABwAAAD8/wUAAAAFAAkAAAD8/wYAAAAFAAkAAAD8/wcAAAAIAAoAAAD8/wgAAAAHAAoAAAD8/wkAAAAHAAoAAAD8/woAAAAAAAAAAAD8/wsAAAAHAAkAAAD8/wwAAAAAAAAAAAD8/w0AAAAIAAkAAAD8/w4AAAAHAAkAAAD8/w8AAAAAAAAAAAD8/xAAAAAFAAkAAAD8/xEAAAAFAAkAAAD8/xIAAAAFAAoAAAD8/xMAAAAHAAoAAAD8/xQAAAAFAAkAAAD8/xUAAAAFAAkAAAD8/xYAAAAIAAkAAAD8/xcAAAAIAAkAAAD8/xgAAAAIAAoAAAD8/xkAAAAHAAoAAAD8/xoAAAAIAAkAAAD8/xsAAAABAAMAAAD8/xwAAAABAAQAAAD8/x0AAAABAAQAAAD8/x4AAAABAAQAAAD8/x8AAAABAAYAAAD8/yAAAAAAAAUAAAD8/yEAAAAFAAoAAAD8/yIAAAAFAAoAAAD8/yMAAAAFAAkAAAD8/yQAAAAAAAMAAAD8/yUAAAABAAcAAAD8/yYAAAABAAQAAAD8/ycAAAABAAQAAAD8/ygAAAABAAQAAAD8/ykAAAAAAAYAAAD8/yoAAAACAAUAAAD8/ysAAAAHAAkAAAD8/ywAAAAAAAAAAAD8/y0AAAAFAAoAAAD8/y4AAAAAAAAAAAD8/y8AAAAIAAkAAAD8/zAAAAAHAAoAAAD8/zEAAAAIAAkAAAD8/zIAAAAHAAkAAAD8/zMAAAAFAAoAAAD9//D/AAABAAsAAAD9//H/AAAIAAoAAAD9//L/AAAIAAkAAAD9//P/AAAAAAAAAAD9//T/AAAAAAAAAAD9//X/AAAIAAkAAAD9//b/AAAAAAAAAAD9/wIAAAABAAUAAAD9/wMAAAAAAAAAAAD9/wQAAAAHAAoAAAD9/wUAAAAHAAkAAAD9/wYAAAALABwAAAD9/wcAAAAIAAkAAAD9/wgAAAAIAAoAAAD9/wkAAAAIAAoAAAD9/woAAAAIAAoAAAD9/wsAAAAHAAoAAAD9/wwAAAAFAAkAAAD9/w0AAAAFAAoAAAD9/w4AAAAAAAAAAAD9/w8AAAAIAAkAAAD9/xAAAAAIAAoAAAD9/xEAAAAFAAkAAAD9/xIAAAAAAAAAAAD9/xMAAAAFAAkAAAD9/xQAAAAFAAkAAAD9/xUAAAAHAAkAAAD9/xYAAAAFAAoAAAD9/xcAAAAFAAoAAAD9/xgAAAAHAAkAAAD9/xkAAAAFAAoAAAD9/xoAAAAAAAAAAAD9/xsAAAACAAMAAAD9/xwAAAAAAAcAAAD9/x0AAAABAAQAAAD9/x4AAAABAAQAAAD9/x8AAAABAAQAAAD9/yAAAAABAAUAAAD9/yEAAAAHAAoAAAD9/yIAAAAFAAkAAAD9/yMAAAAIAAoAAAD9/yQAAAABAAMAAAD9/yUAAAABAAQAAAD9/yYAAAABAAQAAAD9/ycAAAABAAQAAAD9/ygAAAABAAQAAAD9/ykAAAABAAUAAAD9/yoAAAAIAAoAAAD9/ysAAAAHAAoAAAD9/ywAAAAHAAoAAAD9/y0AAAAHAAkAAAD9/y4AAAAHAAkAAAD9/y8AAAAAAAAAAAD9/zAAAAAIAAoAAAD9/zEAAAAIAAkAAAD9/zIAAAAAAAAAAAD9/zMAAAAFAAkAAAD+//D/AAABAAsAAAD+//H/AAAHAAoAAAD+//L/AAAHAAoAAAD+//P/AAAIAAkAAAD+//T/AAAFAAkAAAD+//X/AAAIAAkAAAD+//b/AAAIAAoAAAD+/wIAAAABAAUAAAD+/wMAAAANABwAAAD+/wQAAAAFAAkAAAD+/wUAAAAIAAkAAAD+/wYAAAAMABwAAAD+/wgAAAAHAAkAAAD+/wkAAAAIAAoAAAD+/woAAAAHAAoAAAD+/wsAAAAHAAkAAAD+/wwAAAAHAAoAAAD+/w0AAAAFAAoAAAD+/w4AAAAIAAoAAAD+/w8AAAAIAAkAAAD+/xAAAAAIAAkAAAD+/xEAAAAHAAkAAAD+/xIAAAAFAAoAAAD+/xMAAAAAAAAAAAD+/xQAAAAFAAoAAAD+/xUAAAAIAAkAAAD+/xYAAAAHAAkAAAD+/xcAAAAHAAkAAAD+/xgAAAAIAAkAAAD+/xkAAAAAAAAAAAD+/xoAAAAHAAkAAAD+/xsAAAAAAAAAAAD+/xwAAAABAAMAAAD+/x0AAAABAAQAAAD+/x4AAAABAAQAAAD+/x8AAAABAAQAAAD+/yAAAAABAAUAAAD+/yEAAAAAAAAAAAD+/yIAAAAFAAkAAAD+/yMAAAAAAAMAAAD+/yQAAAABAAcAAAD+/yUAAAABAAQAAAD+/yYAAAABAAQAAAD+/ycAAAAAAAYAAAD+/ygAAAACAAQAAAD+/ykAAAACAAUAAAD+/yoAAAAHAAoAAAD+/ysAAAAIAAoAAAD+/ywAAAAIAAkAAAD+/y0AAAAHAAkAAAD+/y4AAAAFAAoAAAD+/y8AAAAIAAoAAAD+/zAAAAAHAAkAAAD+/zEAAAAHAAkAAAD+/zIAAAAHAAkAAAD+/zMAAAAFAAoAAAD///D/AAABAAsAAAD///H/AAAFAAkAAAD///L/AAAFAAoAAAD///P/AAAIAAoAAAD///T/AAAAAAAAAAD///X/AAAIAAkAAAD///b/AAAHAAkAAAD//wIAAAABAAUAAAD//wMAAAAIAAoAAAD//wQAAAAIAAkAAAD//wUAAAAFAAoAAAD//wYAAAAHAAoAAAD//wcAAAAIAAoAAAD//wgAAAAFAAkAAAD//wkAAAAHAAoAAAD//woAAAAAAAAAAAD//wsAAAAHAAkAAAD//wwAAAAFAAkAAAD//w0AAAAIAAkAAAD//w4AAAAHAAkAAAD//w8AAAAFAAkAAAD//xAAAAAHAAoAAAD//xEAAAAHAAoAAAD//xIAAAAIAAkAAAD//xMAAAAFAAkAAAD//xQAAAAIAAoAAAD//xUAAAAAAAAAAAD//xYAAAAFAAkAAAD//xcAAAAAAAAAAAD//xgAAAAIAAoAAAD//xkAAAAHAAkAAAD//xoAAAAFAAoAAAD//xsAAAAFAAkAAAD//xwAAAACAAMAAAD//x0AAAACAAQAAAD//x4AAAAAAAcAAAD//x8AAAABAAQAAAD//yAAAAABAAYAAAD//yEAAAAAAAQAAAD//yIAAAAAAAQAAAD//yMAAAABAAcAAAD//yQAAAABAAQAAAD//yUAAAABAAQAAAD//yYAAAAAAAYAAAD//ycAAAACAAUAAAD//ygAAAAFAAkAAAD//ykAAAAAAAAAAAD//yoAAAAHAAoAAAD//ysAAAAAAAAAAAD//ywAAAAHAAkAAAD//y0AAAAFAAoAAAD//y4AAAAFAAoAAAD//y8AAAAIAAoAAAD//zAAAAAIAAkAAAD//zEAAAAIAAkAAAD//zIAAAAIAAkAAAD//zMAAAAHAAoAAAAAAPD/AAABAAsAAAAAAPH/AAAIAAoAAAAAAPL/AAAIAAkAAAAAAPP/AAAHAAoAAAAAAPT/AAAIAAoAAAAAAPX/AAAAAAAAAAAAAPb/AAAIAAoAAAAAAAIAAAABAAUAAAAAAAMAAAAHAAoAAAAAAAQAAAALABwAAAAAAAUAAAAIAAkAAAAAAAYAAAANABwAAAAAAAcAAAAAAAAAAAAAAAgAAAAHAAkAAAAAAAkAAAAAAAAAAAAAAAoAAAAFAAkAAAAAAAsAAAAHAAkAAAAAAAwAAAAIAAoAAAAAAA0AAAAIAAkAAAAAAA4AAAAIAAkAAAAAAA8AAAAFAAoAAAAAABAAAAAHAAkAAAAAABEAAAAIAAkAAAAAABIAAAAHAAoAAAAAABMAAAAFAAoAAAAAABQAAAAAAAAAAAAAABUAAAAHAAkAAAAAABYAAAAAAAAAAAAAABcAAAAFAAkAAAAAABgAAAAIAAkAAAAAABkAAAAIAAoAAAAAABoAAAAIAAkAAAAAABsAAAAFAAoAAAAAABwAAAAIAAoAAAAAAB0AAAAFAAkAAAAAAB4AAAABAAMAAAAAAB8AAAABAAQAAAAAACAAAAABAAQAAAAAACEAAAABAAQAAAAAACIAAAABAAQAAAAAACMAAAABAAQAAAAAACQAAAABAAQAAAAAACUAAAABAAQAAAAAACYAAAABAAUAAAAAACcAAAAFAAoAAAAAACgAAAAFAAoAAAAAACkAAAAIAAoAAAAAACoAAAAFAAkAAAAAACsAAAAIAAkAAAAAACwAAAAFAAkAAAAAAC0AAAAAAAAAAAAAAC4AAAAAAAAAAAAAAC8AAAAIAAkAAAAAADAAAAAHAAkAAAAAADEAAAAIAAoAAAAAADIAAAAAAAAAAAAAADMAAAAFAAkAAAABAPD/AAABAAsAAAABAPH/AAAFAAkAAAABAPL/AAAHAAoAAAABAPP/AAAAAAAAAAABAPT/AAAAAAAAAAABAPX/AAAHAAkAAAABAPb/AAAFAAkAAAABAAIAAAABAAUAAAABAAMAAAAAAAAAAAABAAQAAAAMABwAAAABAAUAAAAAAAAAAAABAAYAAAAFAAoAAAABAAcAAAAHAAoAAAABAAgAAAAAAAAAAAABAAkAAAAHAAoAAAABAAoAAAAIAAoAAAABAAsAAAAIAAkAAAABAAwAAAAIAAkAAAABAA0AAAAIAAoAAAABAA4AAAAHAAkAAAABAA8AAAAIAAoAAAABABAAAAAIAAkAAAABABEAAAAAAAAAAAABABIAAAAFAAkAAAABABMAAAAAAAAAAAABABQAAAAHAAoAAAABABUAAAAFAAkAAAABABYAAAAFAAkAAAABABcAAAAHAAkAAAABABgAAAAAAAAAAAABABkAAAAFAAoAAAABABoAAAAFAAkAAAABABsAAAAIAAoAAAABABwAAAAHAAkAAAABAB0AAAAIAAoAAAABAB4AAAABAAMAAAABAB8AAAABAAQAAAABACAAAAABAAQAAAABACEAAAABAAQAAAABACIAAAABAAQAAAABACMAAAABAAQAAAABACQAAAAAAAYAAAABACUAAAACAAQAAAABACYAAAACAAUAAAABACcAAAAFAAkAAAABACgAAAAIAAkAAAABACkAAAAIAAoAAAABACoAAAAFAAoAAAABACsAAAAFAAkAAAABACwAAAAFAAoAAAABAC0AAAAHAAoAAAABAC4AAAAFAAoAAAABAC8AAAAFAAoAAAABADAAAAAIAAoAAAABADEAAAAIAAkAAAABADIAAAAAAAAAAAABADMAAAAFAAoAAAACAPD/AAABAAsAAAACAPH/AAAAAAAAAAACAPL/AAAFAAkAAAACAPP/AAAIAAoAAAACAPT/AAAFAAoAAAACAPX/AAAFAAoAAAACAPb/AAAFAAkAAAACAAIAAAABAAUAAAACAAMAAAAIAAoAAAACAAQAAAAFAAoAAAACAAUAAAAIAAkAAAACAAYAAAAFAAkAAAACAAcAAAAIAAoAAAACAAgAAAAAAAAAAAACAAkAAAAIAAkAAAACAAoAAAAFAAkAAAACAAsAAAAIAAkAAAACAAwAAAAAAAAAAAACAA0AAAAFAAkAAAACAA4AAAAFAAkAAAACAA8AAAAFAAkAAAACABAAAAAFAAkAAAACABEAAAAIAAoAAAACABIAAAAAAAAAAAACABMAAAAHAAoAAAACABQAAAAAAAAAAAACABUAAAAFAAoAAAACABYAAAAIAAoAAAACABcAAAAHAAoAAAACABgAAAAFAAoAAAACABkAAAAHAAoAAAACABoAAAAFAAkAAAACABsAAAAIAAkAAAACABwAAAAIAAkAAAACAB0AAAAHAAkAAAACAB4AAAACAAMAAAACAB8AAAAAAAcAAAACACAAAAABAAQAAAACACEAAAABAAQAAAACACIAAAABAAQAAAACACMAAAAAAAYAAAACACQAAAACAAUAAAACACUAAAAFAAkAAAACACYAAAAHAAkAAAACACcAAAAAAAAAAAACACgAAAAFAAoAAAACACkAAAAIAAkAAAACACoAAAAFAAoAAAACACsAAAAAAAAAAAACACwAAAAAAAAAAAACAC0AAAAFAAkAAAACAC4AAAAHAAkAAAACAC8AAAAIAAoAAAACADAAAAAFAAoAAAACADEAAAAAAAAAAAACADIAAAAHAAkAAAACADMAAAAFAAkAAAADAPD/AAABAAsAAAADAPH/AAAFAAkAAAADAPL/AAAHAAoAAAADAPP/AAAFAAoAAAADAPT/AAAAAAAAAAADAPX/AAAIAAkAAAADAPb/AAAIAAkAAAADAAIAAAABAAUAAAADAAMAAAAFAAkAAAADAAQAAAANABwAAAADAAUAAAAFAAkAAAADAAYAAAAIAAkAAAADAAcAAAANABwAAAADAAgAAAAFAAoAAAADAAkAAAAFAAoAAAADAAoAAAAIAAoAAAADAAsAAAAHAAkAAAADAAwAAAAHAAoAAAADAA0AAAAFAAoAAAADAA4AAAAFAAoAAAADAA8AAAAFAAoAAAADABAAAAAIAAoAAAADABEAAAAHAAkAAAADABIAAAAAAAAAAAADABMAAAAHAAkAAAADABQAAAAIAAoAAAADABUAAAAIAAoAAAADABYAAAAFAAoAAAADABcAAAAFAAoAAAADABgAAAAHAAkAAAADABkAAAAIAAoAAAADABoAAAAFAAkAAAADABsAAAAFAAoAAAADABwAAAAHAAoAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAADAB8AAAABAAMAAAADACAAAAABAAQAAAADACEAAAABAAQAAAADACIAAAAAAAYAAAADACMAAAACAAUAAAADACQAAAAAAAAAAAADACUAAAAHAAoAAAADACYAAAAAAAAAAAADACcAAAAHAAoAAAADACgAAAAIAAkAAAADACkAAAAHAAkAAAADACoAAAAIAAkAAAADACsAAAAHAAoAAAADACwAAAAIAAkAAAADAC0AAAAHAAkAAAADAC4AAAAHAAoAAAADAC8AAAAHAAoAAAADADAAAAAIAAkAAAADADEAAAAIAAoAAAADADIAAAAHAAkAAAADADMAAAAFAAkAAAAEAPD/AAABAAsAAAAEAPH/AAAAAAAAAAAEAPL/AAAHAAkAAAAEAPP/AAAFAAoAAAAEAPT/AAAFAAoAAAAEAPX/AAAIAAkAAAAEAPb/AAAFAAoAAAAEAAIAAAABAAUAAAAEAAMAAAAHAAoAAAAEAAQAAAAIAAkAAAAEAAUAAAAAAAAAAAAEAAYAAAAFAAoAAAAEAAcAAAAHAAkAAAAEAAgAAAAFAAoAAAAEAAkAAAAIAAkAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAEAA4AAAAFAAkAAAAEAA8AAAAIAAkAAAAEABAAAAAFAAoAAAAEABEAAAAIAAkAAAAEABIAAAAIAAoAAAAEABMAAAAIAAoAAAAEABQAAAAFAAoAAAAEABUAAAAFAAkAAAAEABYAAAAHAAoAAAAEABcAAAAHAAoAAAAEABgAAAAFAAoAAAAEABkAAAAAAAAAAAAEABoAAAAHAAkAAAAEABsAAAAIAAoAAAAEABwAAAAFAAoAAAAEAB0AAAAFAAoAAAAEAB4AAAAFAAkAAAAEAB8AAAABAAMAAAAEACAAAAABAAQAAAAEACEAAAABAAQAAAAEACIAAAABAAUAAAAEACMAAAAHAAoAAAAEACQAAAAFAAkAAAAEACUAAAAAAAAAAAAEACYAAAAFAAoAAAAEACcAAAAIAAoAAAAEACgAAAAHAAkAAAAEACkAAAAHAAoAAAAEACoAAAAIAAkAAAAEACsAAAAFAAoAAAAEACwAAAAFAAkAAAAEAC0AAAAHAAkAAAAEAC4AAAAHAAkAAAAEAC8AAAAIAAkAAAAEADAAAAAFAAoAAAAEADEAAAAFAAoAAAAEADIAAAAFAAkAAAAEADMAAAAHAAkAAAAFAPD/AAABAAsAAAAFAPH/AAAHAAkAAAAFAPL/AAAHAAoAAAAFAPP/AAAFAAkAAAAFAPT/AAAIAAoAAAAFAPX/AAAHAAkAAAAFAPb/AAAFAAkAAAAFAAIAAAABAAUAAAAFAAMAAAAHAAoAAAAFAAQAAAAIAAoAAAAFAAUAAAAIAAoAAAAFAAYAAAAHAAoAAAAFAAcAAAAFAAoAAAAFAAgAAAAHAAkAAAAFAAkAAAAFAAkAAAAFAAoAAAAAAAAAAAAFAAsAAAAHAAkAAAAFAAwAAAAHAAoAAAAFAA0AAAAHAAkAAAAFAA4AAAAFAAoAAAAFAA8AAAAHAAkAAAAFABAAAAAHAAoAAAAFABEAAAAAAAAAAAAFABIAAAAAAAAAAAAFABMAAAAHAAkAAAAFABQAAAAHAAkAAAAFABUAAAAIAAkAAAAFABYAAAAHAAkAAAAFABcAAAAHAAkAAAAFABgAAAAIAAoAAAAFABkAAAAIAAkAAAAFABoAAAAHAAkAAAAFABsAAAAFAAoAAAAFABwAAAAFAAoAAAAFAB0AAAAIAAoAAAAFAB4AAAAHAAoAAAAFAB8AAAABAAMAAAAFACAAAAABAAQAAAAFACEAAAABAAQAAAAFACIAAAABAAUAAAAFACMAAAAIAAoAAAAFACQAAAAIAAkAAAAFACUAAAAHAAoAAAAFACYAAAAFAAoAAAAFACcAAAAFAAoAAAAFACgAAAAIAAoAAAAFACkAAAAFAAoAAAAFACoAAAAAAAAAAAAFACsAAAAFAAoAAAAFACwAAAAFAAkAAAAFAC0AAAAIAAkAAAAFAC4AAAAAAAAAAAAFAC8AAAAIAAoAAAAFADAAAAAAAAAAAAAFADEAAAAFAAkAAAAFADIAAAAAAAAAAAAFADMAAAAIAAoAAAAGAPD/AAABAAsAAAAGAPH/AAAIAAoAAAAGAPL/AAAHAAkAAAAGAPP/AAAFAAoAAAAGAPT/AAAFAAkAAAAGAPX/AAAHAAoAAAAGAPb/AAAFAAkAAAAGAAIAAAABAAYAAAAGAAQAAAAAAAUAAAAGAAUAAAAAAAAAAAAGAAYAAAAHAAoAAAAGAAcAAAAIAAoAAAAGAAgAAAAHAAkAAAAGAAkAAAAFAAoAAAAGAAoAAAAIAAkAAAAGAAsAAAAAAAAAAAAGAAwAAAAHAAoAAAAGAA0AAAAHAAkAAAAGAA4AAAAHAAoAAAAGAA8AAAAHAAkAAAAGABAAAAAHAAkAAAAGABEAAAAFAAkAAAAGABIAAAAHAAoAAAAGABMAAAAIAAoAAAAGABQAAAAFAAoAAAAGABUAAAAAAAAAAAAGABYAAAAFAAkAAAAGABcAAAAFAAoAAAAGABgAAAAIAAkAAAAGABkAAAAFAAoAAAAGABoAAAAHAAoAAAAGABsAAAAIAAoAAAAGABwAAAAFAAoAAAAGAB0AAAAHAAkAAAAGAB4AAAAIAAoAAAAGAB8AAAABAAMAAAAGACAAAAABAAQAAAAGACEAAAABAAQAAAAGACIAAAABAAUAAAAGACMAAAAIAAkAAAAGACQAAAAHAAkAAAAGACUAAAAFAAoAAAAGACYAAAAIAAoAAAAGACcAAAAFAAoAAAAGACgAAAAIAAkAAAAGACkAAAAFAAkAAAAGACoAAAAAAAAAAAAGACsAAAAIAAkAAAAGACwAAAAIAAoAAAAGAC0AAAAFAAkAAAAGAC4AAAAHAAoAAAAGAC8AAAAFAAoAAAAGADAAAAAHAAoAAAAGADEAAAAHAAkAAAAGADIAAAAAAAAAAAAGADMAAAAAAAAAAAAHAPD/AAABAAsAAAAHAPH/AAAHAAkAAAAHAPL/AAAHAAkAAAAHAPP/AAAAAAAAAAAHAPT/AAAHAAkAAAAHAPX/AAAHAAkAAAAHAPb/AAAHAAkAAAAHAAIAAAABAAQAAAAHAAMAAAABAAQAAAAHAAQAAAAGAAAAAAAHAAUAAAALAAIAAAAHAAYAAAAHAAoAAAAHAAcAAAAIAAoAAAAHAAgAAAAHAAkAAAAHAAkAAAAFAAoAAAAHAAoAAAAFAAoAAAAHAAsAAAAAAAAAAAAHAAwAAAAHAAoAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA8AAAAIAAkAAAAHABAAAAAIAAkAAAAHABEAAAAHAAkAAAAHABIAAAAHAAoAAAAHABMAAAAIAAkAAAAHABQAAAAIAAkAAAAHABUAAAAFAAoAAAAHABYAAAAIAAoAAAAHABcAAAAFAAkAAAAHABgAAAAAAAMAAAAHABkAAAAAAAQAAAAHABoAAAAAAAQAAAAHABsAAAAAAAQAAAAHABwAAAAAAAQAAAAHAB0AAAAAAAUAAAAHAB4AAAAHAAoAAAAHAB8AAAABAAMAAAAHACAAAAABAAQAAAAHACEAAAABAAQAAAAHACIAAAABAAUAAAAHACMAAAAIAAkAAAAHACQAAAAIAAkAAAAHACUAAAAHAAkAAAAHACYAAAAFAAoAAAAHACcAAAAIAAoAAAAHACgAAAAIAAoAAAAHACkAAAAAAAAAAAAHACoAAAAIAAkAAAAHACsAAAAHAAkAAAAHACwAAAAFAAoAAAAHAC0AAAAFAAkAAAAHAC4AAAAHAAkAAAAHAC8AAAAIAAkAAAAHADAAAAAAAAAAAAAHADEAAAAAAAAAAAAHADIAAAAHAAkAAAAHADMAAAAFAAkAAAAIAPD/AAABAAsAAAAIAPH/AAAIAAkAAAAIAPL/AAAFAAkAAAAIAPP/AAAIAAoAAAAIAPT/AAAIAAoAAAAIAPX/AAAAAAAAAAAIAPb/AAAFAAoAAAAIAAIAAAAAAAYAAAAIAAMAAAACAAQAAAAIAAQAAAABAAkAAAAIAAUAAAABAAoAAAAIAAYAAAAIAAoAAAAIAAcAAAAIAAoAAAAIAAgAAAAIAAkAAAAIAAkAAAAHAAoAAAAIAAoAAAAFAAkAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAIAAkAAAAIABAAAAAHAAoAAAAIABEAAAAFAAkAAAAIABIAAAAFAAkAAAAIABMAAAAFAAoAAAAIABUAAAAHAAkAAAAIABYAAAAFAAoAAAAIABcAAAAAAAMAAAAIABgAAAABAAcAAAAIABkAAAABAAQAAAAIABoAAAABAAQAAAAIABsAAAABAAQAAAAIABwAAAABAAQAAAAIAB0AAAABAAYAAAAIAB4AAAAAAAQAAAAIAB8AAAABAAcAAAAIACAAAAABAAQAAAAIACEAAAABAAQAAAAIACIAAAABAAUAAAAIACMAAAAIAAoAAAAIACQAAAAAAAAAAAAIACUAAAAIAAoAAAAIACYAAAAHAAkAAAAIACcAAAAAAAAAAAAIACgAAAAFAAkAAAAIACkAAAAFAAoAAAAIACoAAAAIAAoAAAAIACsAAAAHAAoAAAAIACwAAAAIAAoAAAAIAC0AAAAHAAkAAAAIAC4AAAAIAAkAAAAIAC8AAAAAAAAAAAAIADAAAAAAAAAAAAAIADEAAAAAAAAAAAAIADIAAAAHAAoAAAAIADMAAAAHAAoAAAAJAPD/AAABAAsAAAAJAPH/AAAIAAoAAAAJAPL/AAAAAAAAAAAJAPP/AAAFAAoAAAAJAPT/AAAFAAkAAAAJAPX/AAAHAAoAAAAJAPb/AAAIAAkAAAAJAAIAAAABAAUAAAAJAAMAAAAFAAkAAAAJAAQAAAAHAAkAAAAJAAUAAAAAAAAAAAAJAAYAAAAIAAoAAAAJAAcAAAAFAAoAAAAJAAgAAAAIAAoAAAAJAAkAAAAIAAkAAAAJAAoAAAAIAAkAAAAJAAsAAAAHAAkAAAAJAAwAAAAFAAkAAAAJAA0AAAAFAAoAAAAJAA4AAAAIAAkAAAAJAA8AAAAFAAkAAAAJABAAAAAIAAoAAAAJABEAAAAIAAkAAAAJABIAAAAFAAoAAAAJABMAAAAHAAkAAAAJABQAAAAAAAAAAAAJABUAAAAIAAkAAAAJABYAAAAAAAMAAAAJABcAAAABAAcAAAAJABgAAAABAAQAAAAJABkAAAABAAQAAAAJABoAAAAAAAYAAAAJABsAAAAAAAcAAAAJABwAAAABAAQAAAAJAB0AAAABAAQAAAAJAB4AAAABAAQAAAAJAB8AAAABAAQAAAAJACAAAAABAAQAAAAJACEAAAABAAQAAAAJACIAAAABAAUAAAAJACMAAAAAAAAAAAAJACQAAAAFAAkAAAAJACUAAAAIAAoAAAAJACYAAAAIAAoAAAAJACcAAAAHAAkAAAAJACgAAAAHAAoAAAAJACkAAAAFAAoAAAAJACoAAAAIAAkAAAAJACsAAAAFAAkAAAAJACwAAAAFAAoAAAAJAC0AAAAFAAoAAAAJAC4AAAAFAAkAAAAJAC8AAAAHAAoAAAAJADAAAAAIAAoAAAAJADEAAAAHAAoAAAAJADIAAAAIAAkAAAAJADMAAAAFAAkAAAAKAPD/AAABAAsAAAAKAPH/AAAIAAkAAAAKAPL/AAAHAAoAAAAKAPP/AAAIAAoAAAAKAPT/AAAIAAkAAAAKAPX/AAAFAAoAAAAKAPb/AAAIAAkAAAAKAAIAAAABAAUAAAAKAAMAAAAIAAkAAAAKAAQAAAAFAAoAAAAKAAUAAAAHAAoAAAAKAAYAAAAIAAkAAAAKAAcAAAAFAAoAAAAKAAgAAAAIAAoAAAAKAAkAAAAIAAoAAAAKAAoAAAAIAAkAAAAKAAsAAAAIAAoAAAAKAAwAAAAIAAkAAAAKAA0AAAAIAAoAAAAKAA4AAAAHAAoAAAAKAA8AAAAFAAkAAAAKABAAAAAIAAkAAAAKABEAAAAFAAoAAAAKABIAAAAHAAoAAAAKABMAAAAIAAoAAAAKABQAAAAHAAkAAAAKABUAAAAAAAMAAAAKABYAAAABAAcAAAAKABcAAAABAAQAAAAKABgAAAABAAQAAAAKABkAAAAAAAYAAAAKABoAAAACAAUAAAAKABsAAAACAAMAAAAKABwAAAACAAQAAAAKAB0AAAACAAQAAAAKAB4AAAACAAQAAAAKAB8AAAAAAAcAAAAKACAAAAABAAQAAAAKACEAAAABAAQAAAAKACIAAAABAAUAAAAKACMAAAAHAAoAAAAKACQAAAAAAAAAAAAKACUAAAAAAAAAAAAKACYAAAAHAAoAAAAKACcAAAAHAAkAAAAKACgAAAAHAAkAAAAKACkAAAAIAAoAAAAKACoAAAAFAAoAAAAKACsAAAAHAAkAAAAKACwAAAAAAAAAAAAKAC0AAAAHAAkAAAAKAC4AAAAIAAkAAAAKAC8AAAAHAAoAAAAKADAAAAAIAAkAAAAKADEAAAAHAAoAAAAKADIAAAAHAAoAAAAKADMAAAAIAAoAAAALAPD/AAABAAsAAAALAPH/AAAIAAkAAAALAPL/AAAHAAoAAAALAPP/AAAHAAkAAAALAPT/AAAIAAoAAAALAPX/AAAHAAkAAAALAPb/AAAAAAAAAAALAAIAAAABAAUAAAALAAMAAAAIAAoAAAALAAQAAAAAAAAAAAALAAUAAAAFAAkAAAALAAYAAAAHAAkAAAALAAcAAAAHAAoAAAALAAgAAAAFAAkAAAALAAkAAAAIAAoAAAALAAoAAAAIAAoAAAALAAsAAAAFAAoAAAALAAwAAAAIAAoAAAALAA0AAAAIAAkAAAALAA4AAAAFAAkAAAALAA8AAAAIAAkAAAALABAAAAAIAAkAAAALABEAAAAFAAkAAAALABIAAAAIAAkAAAALABMAAAAIAAoAAAALABQAAAAAAAMAAAALABUAAAABAAcAAAALABYAAAABAAQAAAALABcAAAAAAAYAAAALABgAAAACAAQAAAALABkAAAACAAUAAAALABoAAAAHAAoAAAALABsAAAAAAAAAAAALABwAAAAAAAAAAAALAB0AAAAFAAkAAAALAB4AAAAFAAkAAAALAB8AAAABAAMAAAALACAAAAABAAQAAAALACEAAAABAAQAAAALACIAAAABAAUAAAALACMAAAAFAAoAAAALACQAAAAHAAoAAAALACUAAAAHAAkAAAALACYAAAAHAAkAAAALACcAAAAAAAAAAAALACgAAAAFAAkAAAALACkAAAAIAAkAAAALACoAAAAFAAoAAAALACsAAAAAAAAAAAALACwAAAAHAAoAAAALAC0AAAAIAAkAAAALAC4AAAAAAAAAAAALAC8AAAAHAAkAAAALADAAAAAIAAoAAAALADEAAAAHAAoAAAALADIAAAAIAAoAAAALADMAAAAFAAoAAAAMAPD/AAABAAsAAAAMAPH/AAAFAAoAAAAMAPL/AAAIAAkAAAAMAPP/AAAAAAAAAAAMAPT/AAAIAAkAAAAMAPX/AAAHAAoAAAAMAPb/AAAAAAAAAAAMAAIAAAABAAUAAAAMAAMAAAAIAAoAAAAMAAQAAAAIAAkAAAAMAAUAAAAIAAkAAAAMAAcAAAAAAAAAAAAMAAgAAAAIAAoAAAAMAAkAAAAIAAkAAAAMAAoAAAAAAAAAAAAMAAsAAAAIAAoAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAHAAoAAAAMABAAAAAAAAAAAAAMABEAAAAFAAkAAAAMABIAAAAFAAkAAAAMABMAAAAFAAkAAAAMABQAAAABAAMAAAAMABUAAAABAAQAAAAMABYAAAABAAQAAAAMABcAAAABAAUAAAAMABgAAAAHAAkAAAAMABkAAAAIAAoAAAAMABoAAAAFAAoAAAAMABsAAAAAAAAAAAAMABwAAAAHAAkAAAAMAB0AAAAIAAoAAAAMAB4AAAAIAAkAAAAMAB8AAAABAAMAAAAMACAAAAABAAQAAAAMACEAAAABAAQAAAAMACIAAAABAAUAAAAMACMAAAAIAAoAAAAMACQAAAAIAAkAAAAMACUAAAAAAAAAAAAMACYAAAAHAAoAAAAMACcAAAAFAAkAAAAMACgAAAAIAAoAAAAMACkAAAAFAAoAAAAMACoAAAAFAAkAAAAMACsAAAAIAAoAAAAMACwAAAAAAAAAAAAMAC0AAAAFAAoAAAAMAC4AAAAHAAoAAAAMAC8AAAAAAAAAAAAMADAAAAAHAAkAAAAMADEAAAAFAAkAAAAMADIAAAAIAAkAAAAMADMAAAAFAAkAAAANAPD/AAABAAsAAAANAPH/AAAFAAkAAAANAPL/AAAFAAoAAAANAPP/AAAAAAAAAAANAPT/AAAIAAoAAAANAPX/AAAIAAoAAAANAPb/AAAAAAAAAAANAAIAAAABAAUAAAANAAMAAAAFAAkAAAANAAQAAAAHAAkAAAANAAUAAAAIAAoAAAANAAYAAAAAAAAAAAANAAcAAAAHAAkAAAANAAgAAAAAAAAAAAANAAkAAAAIAAkAAAANAAoAAAAIAAoAAAANAAsAAAAHAAoAAAANAAwAAAAAAAAAAAANAA0AAAAFAAkAAAANAA4AAAAHAAoAAAANAA8AAAAHAAoAAAANABAAAAAAAAAAAAANABEAAAAAAAAAAAANABIAAAAAAAAAAAANABMAAAAAAAMAAAANABQAAAABAAcAAAANABUAAAABAAQAAAANABYAAAAAAAYAAAANABcAAAACAAUAAAANABgAAAAFAAoAAAANABkAAAAIAAkAAAANABoAAAAIAAkAAAANABsAAAAAAAAAAAANABwAAAAIAAkAAAANAB0AAAAAAAAAAAANAB4AAAAHAAoAAAANAB8AAAABAAMAAAANACAAAAABAAQAAAANACEAAAABAAQAAAANACIAAAABAAUAAAANACMAAAAFAAoAAAANACQAAAAIAAkAAAANACUAAAAIAAkAAAANACYAAAAFAAoAAAANACcAAAAIAAkAAAANACgAAAAHAAoAAAANACkAAAAIAAkAAAANACoAAAAHAAoAAAANACsAAAAHAAkAAAANACwAAAAAAAAAAAANAC0AAAAIAAkAAAANAC4AAAAHAAoAAAANAC8AAAAHAAoAAAANADAAAAAHAAoAAAANADEAAAAFAAoAAAANADIAAAAAAAAAAAANADMAAAAHAAoAAAAOAPD/AAABAAsAAAAOAPH/AAAHAAkAAAAOAPL/AAAIAAkAAAAOAPP/AAAHAAkAAAAOAPT/AAAFAAkAAAAOAPX/AAAAAAAAAAAOAPb/AAAFAAkAAAAOAAIAAAABAAUAAAAOAAMAAAAAAAAAAAAOAAQAAAAHAAoAAAAOAAUAAAAIAAoAAAAOAAcAAAAFAAoAAAAOAAgAAAAIAAoAAAAOAAkAAAAFAAkAAAAOAAoAAAAFAAoAAAAOAAsAAAAFAAkAAAAOAAwAAAAFAAoAAAAOAA0AAAAIAAoAAAAOAA4AAAAFAAkAAAAOAA8AAAAIAAoAAAAOABAAAAAIAAoAAAAOABEAAAAGAAAAAAAOABIAAAAAAAAAAAAOABMAAAABAAQAAAAOABQAAAABAAQAAAAOABUAAAABAAQAAAAOABYAAAABAAUAAAAOABcAAAAFAAkAAAAOABgAAAAHAAkAAAAOABkAAAAHAAoAAAAOABoAAAAFAAoAAAAOABsAAAAIAAkAAAAOABwAAAAHAAkAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAOAB8AAAABAAMAAAAOACAAAAABAAQAAAAOACEAAAABAAQAAAAOACIAAAABAAUAAAAOACMAAAAHAAkAAAAOACQAAAAFAAkAAAAOACUAAAAIAAoAAAAOACYAAAAFAAoAAAAOACcAAAAHAAoAAAAOACgAAAAHAAkAAAAOACkAAAAIAAoAAAAOACoAAAAIAAkAAAAOACsAAAAFAAkAAAAOACwAAAAHAAoAAAAOAC0AAAAIAAkAAAAOAC4AAAAAAAAAAAAOAC8AAAAIAAkAAAAOADAAAAAIAAkAAAAOADEAAAAHAAoAAAAOADIAAAAAAAAAAAAOADMAAAAAAAAAAAAPAPD/AAABAAsAAAAPAPH/AAAFAAkAAAAPAPL/AAAFAAoAAAAPAPP/AAAHAAkAAAAPAPT/AAAFAAoAAAAPAPX/AAAHAAoAAAAPAPb/AAAAAAAAAAAPAAMAAAAIAAkAAAAPAAQAAAAIAAoAAAAPAAUAAAAHAAkAAAAPAAYAAAAFAAkAAAAPAAcAAAAFAAoAAAAPAAgAAAAFAAkAAAAPAAkAAAAFAAoAAAAPAAoAAAAFAAkAAAAPAAsAAAAIAAoAAAAPAAwAAAAIAAkAAAAPAA0AAAAAAAAAAAAPAA4AAAAIAAoAAAAPAA8AAAAIAAkAAAAPABAAAAAOAAAAAAAPABEAAAAFAAoAAAAPABIAAAACAAMAAAAPABMAAAACAAQAAAAPABQAAAAAAAcAAAAPABUAAAABAAQAAAAPABYAAAABAAUAAAAPABcAAAAHAAkAAAAPABgAAAAFAAkAAAAPABkAAAAFAAoAAAAPABoAAAAAAAAAAAAPABsAAAAFAAoAAAAPABwAAAAFAAoAAAAPAB0AAAAIAAkAAAAPAB4AAAAFAAoAAAAPAB8AAAABAAMAAAAPACAAAAABAAQAAAAPACEAAAABAAQAAAAPACIAAAABAAUAAAAPACMAAAAFAAkAAAAPACQAAAAFAAoAAAAPACUAAAAHAAkAAAAPACYAAAAIAAkAAAAPACcAAAAHAAkAAAAPACgAAAAHAAkAAAAPACkAAAAFAAoAAAAPACoAAAAFAAkAAAAPACsAAAAFAAoAAAAPACwAAAAHAAoAAAAPAC0AAAAHAAoAAAAPAC4AAAAHAAoAAAAPAC8AAAAIAAoAAAAPADAAAAAHAAkAAAAPADEAAAAIAAoAAAAPADIAAAAFAAoAAAAPADMAAAAFAAoAAAAQAPD/AAABAAsAAAAQAPH/AAAIAAoAAAAQAPL/AAAFAAkAAAAQAPP/AAAIAAkAAAAQAPT/AAAIAAkAAAAQAPX/AAAAAAAAAAAQAPb/AAAFAAoAAAAQAAMAAAAAAAAAAAAQAAQAAAAHAAkAAAAQAAUAAAAHAAoAAAAQAAYAAAAFAAkAAAAQAAcAAAAIAAoAAAAQAAgAAAAAAAAAAAAQAAkAAAAHAAoAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAHAAoAAAAQAA0AAAAIAAoAAAAQAA4AAAAFAAoAAAAQAA8AAAAFAAkAAAAQABAAAAAHAAoAAAAQABEAAAAHAAoAAAAQABIAAAAHAAkAAAAQABMAAAAAAAAAAAAQABQAAAABAAMAAAAQABUAAAABAAQAAAAQABYAAAABAAYAAAAQABcAAAAAAAUAAAAQABgAAAAIAAoAAAAQABkAAAAAAAAAAAAQABoAAAAHAAkAAAAQABsAAAAFAAkAAAAQABwAAAAFAAoAAAAQAB0AAAAIAAkAAAAQAB4AAAAHAAoAAAAQAB8AAAABAAMAAAAQACAAAAABAAQAAAAQACEAAAABAAQAAAAQACIAAAABAAUAAAAQACMAAAAFAAkAAAAQACQAAAAAAAAAAAAQACUAAAAHAAoAAAAQACYAAAAIAAoAAAAQACcAAAAAAAAAAAAQACgAAAAFAAoAAAAQACkAAAAFAAoAAAAQACoAAAAAAAAAAAAQACsAAAAHAAkAAAAQACwAAAAFAAkAAAAQAC0AAAAFAAoAAAAQAC4AAAAIAAkAAAAQAC8AAAAHAAkAAAAQADAAAAAFAAkAAAAQADEAAAAFAAoAAAAQADIAAAAAAAAAAAAQADMAAAAHAAoAAAARAPD/AAABAAsAAAARAPH/AAAIAAoAAAARAPL/AAAFAAoAAAARAPP/AAAIAAkAAAARAPT/AAAAAAAAAAARAPX/AAAAAAAAAAARAPb/AAAIAAoAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAFAAoAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAHAAkAAAARAAkAAAAAAAAAAAARAAoAAAAHAAkAAAARAAsAAAACAAYAAAARAAwAAAACAAcAAAARAA0AAAACAAgAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAIAAkAAAARABEAAAAIAAoAAAARABIAAAAAAAAAAAARABMAAAAFAAoAAAARABQAAAABAAMAAAARABUAAAABAAQAAAARABYAAAABAAQAAAARABcAAAABAAYAAAARABgAAAAAAAUAAAARABkAAAAHAAkAAAARABoAAAAAAAAAAAARABsAAAAIAAoAAAARABwAAAAIAAoAAAARAB0AAAAHAAoAAAARAB4AAAAFAAoAAAARAB8AAAABAAMAAAARACAAAAABAAQAAAARACEAAAABAAQAAAARACIAAAABAAUAAAARACMAAAAIAAoAAAARACQAAAAIAAkAAAARACUAAAAFAAoAAAARACYAAAAIAAkAAAARACcAAAAIAAoAAAARACgAAAAIAAoAAAARACkAAAAHAAoAAAARACoAAAAFAAkAAAARACsAAAAFAAoAAAARACwAAAAFAAoAAAARAC0AAAAIAAoAAAARAC4AAAAAAAAAAAARAC8AAAAAAAAAAAARADAAAAAAAAAAAAARADEAAAAFAAoAAAARADIAAAAHAAkAAAARADMAAAAIAAoAAAASAPD/AAABAAsAAAASAPH/AAAHAAoAAAASAPL/AAAHAAoAAAASAPP/AAAFAAoAAAASAPT/AAAFAAoAAAASAPX/AAAFAAkAAAASAPb/AAAIAAkAAAASAAIAAAABAAUAAAASAAMAAAAFAAoAAAASAAQAAAAHAAoAAAASAAUAAAAFAAoAAAASAAYAAAAHAAkAAAASAAcAAAAFAAoAAAASAAgAAAAHAAkAAAASAAkAAAAIAAoAAAASAAoAAAACAAYAAAASAAsAAAADAAoAAAASAAwAAAADAAcAAAASAA0AAAADAAkAAAASAA4AAAACAAcAAAASAA8AAAACAAgAAAASABAAAAAHAAkAAAASABEAAAAFAAkAAAASABIAAAAAAAAAAAASABMAAAAHAAoAAAASABQAAAACAAMAAAASABUAAAAAAAcAAAASABYAAAABAAQAAAASABcAAAABAAQAAAASABgAAAABAAYAAAASABkAAAAAAAUAAAASABoAAAAFAAoAAAASABsAAAAIAAoAAAASABwAAAAFAAoAAAASAB0AAAAFAAkAAAASAB4AAAAFAAkAAAASAB8AAAABAAMAAAASACAAAAABAAQAAAASACEAAAABAAQAAAASACIAAAABAAUAAAASACMAAAAIAAoAAAASACQAAAAFAAoAAAASACUAAAAHAAkAAAASACYAAAAAAAAAAAASACcAAAAIAAkAAAASACgAAAAHAAkAAAASACkAAAAIAAkAAAASACoAAAAHAAkAAAASACsAAAAAAAAAAAASACwAAAAIAAkAAAASAC0AAAAIAAkAAAASAC4AAAAFAAoAAAASAC8AAAAAAAAAAAASADAAAAAAAAAAAAASADEAAAAIAAoAAAASADIAAAAHAAoAAAASADMAAAAIAAkAAAATAPD/AAABAAsAAAATAPH/AAAAAAAAAAATAPL/AAAHAAoAAAATAPP/AAAHAAoAAAATAPT/AAAIAAkAAAATAPX/AAAIAAoAAAATAPb/AAAFAAkAAAATAAIAAAABAAYAAAATAAMAAAAAAAUAAAATAAQAAAAHAAoAAAATAAUAAAAFAAkAAAATAAYAAAAFAAoAAAATAAcAAAAFAAoAAAATAAgAAAAHAAoAAAATAAkAAAACAAYAAAATAAoAAAADAAoAAAATAAsAAAADAAcAAAATAAwAAAAAAAEAAAATAA0AAAADAAcAAAATAA4AAAAAAAEAAAATAA8AAAADAAkAAAATABAAAAACAAgAAAATABEAAAAIAAkAAAATABIAAAAIAAkAAAATABMAAAAAAAAAAAATABQAAAAIAAkAAAATABUAAAACAAMAAAATABYAAAAAAAcAAAATABcAAAABAAQAAAATABgAAAABAAQAAAATABkAAAABAAYAAAATABoAAAAAAAUAAAATABsAAAAFAAoAAAATABwAAAAHAAoAAAATAB0AAAAIAAoAAAATAB4AAAAIAAoAAAATAB8AAAABAAMAAAATACAAAAABAAQAAAATACEAAAABAAQAAAATACIAAAABAAUAAAATACMAAAAAAAAAAAATACQAAAAIAAoAAAATACUAAAAAAAAAAAATACYAAAAHAAoAAAATACcAAAAIAAkAAAATACgAAAAHAAoAAAATACkAAAAAAAAAAAATACoAAAAFAAkAAAATACsAAAAHAAkAAAATACwAAAAHAAoAAAATAC0AAAAIAAkAAAATAC4AAAAAAAAAAAATAC8AAAAAAAAAAAATADAAAAAHAAoAAAATADEAAAAAAAAAAAATADIAAAAAAAAAAAATADMAAAAHAAkAAAAUAPD/AAABAAsAAAAUAPH/AAAAAAAAAAAUAPL/AAAFAAoAAAAUAPP/AAAIAAkAAAAUAPT/AAAFAAoAAAAUAPX/AAAIAAkAAAAUAPb/AAACAAYAAAAUAPf/AAACAAcAAAAUAPj/AAACAAcAAAAUAPn/AAACAAcAAAAUAPr/AAACAAgAAAAUAPv/AAAIAAoAAAAUAPz/AAAHAAkAAAAUAP3/AAAFAAkAAAAUAP7/AAAIAAoAAAAUAP//AAAFAAoAAAAUAAAAAAACAAMAAAAUAAEAAAAAAAcAAAAUAAIAAAABAAQAAAAUAAMAAAABAAYAAAAUAAQAAAAAAAUAAAAUAAUAAAAFAAkAAAAUAAYAAAAHAAoAAAAUAAcAAAAAAAAAAAAUAAgAAAAFAAoAAAAUAAkAAAADAAYAAAAUAAoAAAADAAcAAAAUAAsAAAADAAcAAAAUAAwAAAADAAcAAAAUAA0AAAADAAcAAAAUAA4AAAADAAcAAAAUAA8AAAADAAcAAAAUABAAAAADAAkAAAAUABEAAAACAAgAAAAUABIAAAAFAAoAAAAUABMAAAAHAAkAAAAUABQAAAAAAAAAAAAUABUAAAAHAAoAAAAUABYAAAACAAMAAAAUABcAAAAAAAcAAAAUABgAAAABAAQAAAAUABkAAAABAAQAAAAUABoAAAABAAYAAAAUABsAAAAAAAUAAAAUABwAAAAAAAAAAAAUAB0AAAAFAAkAAAAUAB4AAAAFAAkAAAAUAB8AAAABAAMAAAAUACAAAAABAAQAAAAUACEAAAABAAQAAAAUACIAAAABAAUAAAAUACMAAAAHAAkAAAAUACQAAAAHAAoAAAAUACUAAAAHAAkAAAAUACYAAAAHAAkAAAAUACcAAAAFAAoAAAAUACgAAAAFAAoAAAAUACkAAAAAAAAAAAAUACoAAAAAAAAAAAAUACsAAAAFAAkAAAAUACwAAAAHAAoAAAAUAC0AAAAFAAoAAAAUAC4AAAAIAAkAAAAUAC8AAAAFAAoAAAAUADAAAAAHAAoAAAAUADEAAAAHAAoAAAAUADIAAAAHAAkAAAAUADMAAAAIAAoAAAAVAPD/AAABAAsAAAAVAPH/AAAHAAkAAAAVAPL/AAAIAAoAAAAVAPP/AAAIAAkAAAAVAPT/AAAFAAoAAAAVAPX/AAACAAYAAAAVAPb/AAADAAoAAAAVAPf/AAAAAAEAAAAVAPj/AAAAAAEAAAAVAPn/AAAAAAEAAAAVAPr/AAADAAkAAAAVAPv/AAACAAgAAAAVAPz/AAAHAAoAAAAVAP3/AAAIAAkAAAAVAP7/AAAFAAoAAAAVAP//AAAFAAkAAAAVAAAAAAAHAAoAAAAVAAEAAAACAAMAAAAVAAIAAAAAAAcAAAAVAAMAAAABAAQAAAAVAAQAAAABAAYAAAAVAAUAAAAAAAUAAAAVAAYAAAAFAAoAAAAVAAcAAAAHAAkAAAAVAAgAAAAFAAkAAAAVAAkAAAADAAYAAAAVAAoAAAADAAcAAAAVAAsAAAADAAcAAAAVAAwAAAACAAkAAAAVAA0AAAAEAAcAAAAVAA4AAAACAAoAAAAVAA8AAAADAAcAAAAVABAAAAADAAcAAAAVABEAAAADAAgAAAAVABIAAAAHAAkAAAAVABMAAAAHAAkAAAAVABQAAAAIAAkAAAAVABUAAAAFAAkAAAAVABYAAAAIAAkAAAAVABcAAAACAAMAAAAVABgAAAAAAAcAAAAVABkAAAABAAQAAAAVABoAAAABAAQAAAAVABsAAAABAAYAAAAVABwAAAAAAAUAAAAVAB0AAAAHAAkAAAAVAB4AAAAAAAAAAAAVAB8AAAABAAMAAAAVACAAAAABAAQAAAAVACEAAAABAAQAAAAVACIAAAABAAUAAAAVACMAAAAAAAAAAAAVACQAAAAFAAoAAAAVACUAAAAIAAoAAAAVACYAAAAFAAoAAAAVACcAAAAFAAkAAAAVACgAAAAIAAoAAAAVACkAAAAHAAoAAAAVACoAAAAIAAkAAAAVACsAAAAHAAoAAAAVACwAAAAAAAAAAAAVAC0AAAAIAAoAAAAVAC4AAAAAAAAAAAAVAC8AAAAIAAoAAAAVADAAAAAIAAoAAAAVADEAAAAHAAkAAAAVADIAAAAHAAkAAAAVADMAAAAFAAkAAAAWAPD/AAABAAsAAAAWAPH/AAAHAAoAAAAWAPL/AAAAAAAAAAAWAPP/AAAFAAkAAAAWAPT/AAACAAYAAAAWAPX/AAADAAoAAAAWAPb/AAAAAAEAAAAWAPf/AAADAAcAAAAWAPj/AAAAAAEAAAAWAPn/AAADAAcAAAAWAPr/AAAAAAEAAAAWAPv/AAADAAgAAAAWAPz/AAAIAAkAAAAWAP3/AAAFAAkAAAAWAP7/AAAHAAoAAAAWAP//AAAIAAkAAAAWAAAAAAAIAAkAAAAWAAEAAAAFAAkAAAAWAAIAAAABAAMAAAAWAAMAAAABAAQAAAAWAAQAAAABAAQAAAAWAAUAAAABAAYAAAAWAAYAAAAAAAQAAAAWAAcAAAAAAAUAAAAWAAgAAAAAAAMAAAAWAAkAAAABAAcAAAAWAAoAAAAPAAoAAAAWAAsAAAAAAAEAAAAWAA0AAAACAAcAAAAWAA4AAAADAAoAAAAWAA8AAAADAAcAAAAWABAAAAAAAAEAAAAWABEAAAADAAgAAAAWABIAAAAFAAoAAAAWABMAAAAFAAoAAAAWABQAAAAAAAAAAAAWABUAAAAHAAoAAAAWABYAAAAIAAoAAAAWABcAAAAFAAkAAAAWABgAAAACAAMAAAAWABkAAAAAAAcAAAAWABoAAAABAAQAAAAWABsAAAABAAQAAAAWABwAAAABAAYAAAAWAB0AAAAAAAUAAAAWAB4AAAAFAAkAAAAWAB8AAAABAAMAAAAWACAAAAABAAQAAAAWACEAAAABAAQAAAAWACIAAAABAAUAAAAWACMAAAAIAAoAAAAWACQAAAAHAAkAAAAWACUAAAAAAAAAAAAWACYAAAAFAAkAAAAWACcAAAAAAAAAAAAWACgAAAAHAAoAAAAWACkAAAAHAAkAAAAWACoAAAAFAAoAAAAWACsAAAAIAAkAAAAWACwAAAAFAAkAAAAWAC0AAAAIAAkAAAAWAC4AAAAHAAkAAAAWAC8AAAAAAAAAAAAWADAAAAAIAAkAAAAWADEAAAAIAAkAAAAWADIAAAAHAAkAAAAWADMAAAAFAAkAAAAXAPD/AAABAAsAAAAXAPH/AAAHAAkAAAAXAPL/AAACAAYAAAAXAPP/AAACAAcAAAAXAPT/AAADAAoAAAAXAPX/AAADAAcAAAAXAPb/AAADAAcAAAAXAPf/AAADAAcAAAAXAPj/AAAAAAEAAAAXAPn/AAADAAcAAAAXAPr/AAAAAAEAAAAXAPv/AAADAAkAAAAXAPz/AAACAAgAAAAXAP3/AAAFAAkAAAAXAP7/AAAAAAAAAAAXAP//AAAHAAoAAAAXAAAAAAAHAAkAAAAXAAEAAAAIAAkAAAAXAAIAAAACAAMAAAAXAAMAAAAAAAcAAAAXAAQAAAABAAQAAAAXAAUAAAABAAQAAAAXAAYAAAABAAQAAAAXAAcAAAABAAYAAAAXAAgAAAABAAcAAAAXAAkAAAABAAQAAAAXAAoAAAAQAAYAAAAXAAsAAAADAAcAAAAXAAwAAAADAAcAAAAXAA0AAAAAAAEAAAAXAA4AAAAAAAEAAAAXAA8AAAADAAcAAAAXABAAAAAAAAEAAAAXABEAAAADAAgAAAAXABIAAAAIAAkAAAAXABMAAAAIAAoAAAAXABQAAAAFAAoAAAAXABUAAAAIAAkAAAAXABYAAAAHAAoAAAAXABcAAAAFAAoAAAAXABgAAAAAAAAAAAAXABkAAAACAAMAAAAXABoAAAAAAAcAAAAXABsAAAABAAQAAAAXABwAAAABAAQAAAAXAB0AAAABAAYAAAAXAB4AAAAAAAUAAAAXAB8AAAABAAMAAAAXACAAAAABAAQAAAAXACEAAAABAAQAAAAXACIAAAABAAUAAAAXACMAAAAFAAkAAAAXACQAAAAFAAoAAAAXACUAAAAAAAAAAAAXACYAAAAIAAoAAAAXACcAAAAIAAoAAAAXACgAAAAAAAAAAAAXACkAAAAFAAkAAAAXACoAAAAHAAkAAAAXACsAAAAIAAoAAAAXACwAAAAIAAkAAAAXAC0AAAAHAAkAAAAXAC4AAAAHAAoAAAAXAC8AAAAHAAkAAAAXADAAAAAIAAkAAAAXADEAAAAHAAoAAAAXADIAAAAHAAoAAAAXADMAAAAHAAkAAAAYAPD/AAABAAsAAAAYAPH/AAAIAAkAAAAYAPL/AAADAAYAAAAYAPP/AAADAAcAAAAYAPT/AAADAAcAAAAYAPX/AAADAAcAAAAYAPb/AAADAAcAAAAYAPf/AAADAAcAAAAYAPn/AAADAAcAAAAYAPr/AAADAAcAAAAYAPv/AAADAAcAAAAYAPz/AAADAAgAAAAYAP3/AAAFAAkAAAAYAP7/AAAIAAkAAAAYAP//AAAFAAoAAAAYAAAAAAAIAAoAAAAYAAEAAAAIAAoAAAAYAAIAAAAFAAoAAAAYAAMAAAACAAMAAAAYAAQAAAACAAQAAAAYAAUAAAAAAAcAAAAYAAYAAAABAAQAAAAYAAcAAAABAAQAAAAYAAgAAAABAAQAAAAYAAkAAAABAAQAAAAYAAoAAAARAAYAAAAYAAsAAAAIAA0AAAAYAAwAAAAEAAcAAAAYAA0AAAAEAAcAAAAYAA4AAAACAAoAAAAYAA8AAAADAAcAAAAYABAAAAADAAcAAAAYABEAAAADAAkAAAAYABIAAAACAAgAAAAYABMAAAAFAAoAAAAYABQAAAAHAAoAAAAYABUAAAAFAAoAAAAYABYAAAAHAAoAAAAYABcAAAAFAAkAAAAYABgAAAAHAAkAAAAYABkAAAAHAAoAAAAYABoAAAACAAMAAAAYABsAAAAAAAcAAAAYABwAAAABAAQAAAAYAB0AAAABAAQAAAAYAB4AAAABAAUAAAAYAB8AAAABAAMAAAAYACAAAAABAAQAAAAYACEAAAABAAQAAAAYACIAAAABAAUAAAAYACMAAAAHAAkAAAAYACQAAAAIAAkAAAAYACUAAAAIAAoAAAAYACYAAAAIAAoAAAAYACcAAAAHAAoAAAAYACgAAAAIAAoAAAAYACkAAAAFAAoAAAAYACoAAAAFAAoAAAAYACsAAAAIAAkAAAAYACwAAAAHAAoAAAAYAC0AAAAHAAoAAAAYAC4AAAAIAAkAAAAYAC8AAAAAAAAAAAAYADAAAAAAAAAAAAAYADEAAAAFAAoAAAAYADIAAAAIAAoAAAAYADMAAAAFAAoAAAAZAPD/AAACAAYAAAAZAPH/AAACAAcAAAAZAPL/AAADAAoAAAAZAPP/AAADAAcAAAAZAPT/AAADAAcAAAAZAPX/AAAAAAEAAAAZAPb/AAADAAcAAAAZAPf/AAADAAcAAAAZAPj/AAADAAcAAAAZAPn/AAADAAcAAAAZAPr/AAADAAcAAAAZAPv/AAADAAcAAAAZAPz/AAADAAgAAAAZAP3/AAAIAAkAAAAZAP7/AAAAAAAAAAAZAP//AAAFAAoAAAAZAAAAAAAFAAkAAAAZAAEAAAAAAAAAAAAZAAIAAAAFAAkAAAAZAAMAAAAFAAkAAAAZAAQAAAAHAAoAAAAZAAUAAAACAAMAAAAZAAYAAAACAAQAAAAZAAcAAAACAAQAAAAZAAgAAAAAAAcAAAAZAAkAAAABAAQAAAAZAAoAAAABAAQAAAAZAAsAAAABAAUAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAADAAYAAAAZAA8AAAADAAcAAAAZABAAAAADAAcAAAAZABEAAAADAAcAAAAZABIAAAADAAgAAAAZABMAAAAHAAoAAAAZABQAAAAHAAoAAAAZABUAAAAIAAoAAAAZABYAAAAHAAoAAAAZABcAAAAIAAoAAAAZABgAAAAAAAAAAAAZABkAAAAIAAkAAAAZABoAAAAIAAoAAAAZABsAAAACAAMAAAAZABwAAAAAAAcAAAAZAB0AAAABAAQAAAAZAB4AAAABAAUAAAAZAB8AAAABAAMAAAAZACAAAAABAAQAAAAZACEAAAABAAQAAAAZACIAAAABAAUAAAAZACMAAAAHAAkAAAAZACQAAAAIAAkAAAAZACUAAAAAAAAAAAAZACYAAAAAAAAAAAAZACcAAAAHAAoAAAAZACgAAAAIAAkAAAAZACkAAAAAAAAAAAAZACoAAAAIAAkAAAAZACsAAAAIAAoAAAAZACwAAAAIAAkAAAAZAC0AAAAIAAoAAAAZAC4AAAAHAAoAAAAZAC8AAAAIAAoAAAAZADAAAAAAAAAAAAAZADEAAAAIAAkAAAAZADIAAAAIAAkAAAAZADMAAAAFAAoAAAAaAPD/AAADAAYAAAAaAPH/AAAAAAEAAAAaAPL/AAADAAcAAAAaAPP/AAADAAcAAAAaAPT/AAADAAcAAAAaAPX/AAAAAAEAAAAaAPb/AAADAAcAAAAaAPf/AAAAAAEAAAAaAPj/AAAAAAEAAAAaAPn/AAAAAAEAAAAaAPr/AAADAAcAAAAaAPv/AAAAAAEAAAAaAPz/AAADAAkAAAAaAP3/AAACAAcAAAAaAP7/AAACAAcAAAAaAP//AAACAAgAAAAaAAAAAAAIAAoAAAAaAAEAAAAHAAoAAAAaAAIAAAAIAAkAAAAaAAMAAAAHAAkAAAAaAAQAAAAIAAkAAAAaAAUAAAAHAAkAAAAaAAYAAAAAAAAAAAAaAAcAAAAFAAoAAAAaAAgAAAABAAMAAAAaAAkAAAABAAQAAAAaAAoAAAAAAAYAAAAaAAsAAAACAAUAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAEAAYAAAAaAA8AAAACAAoAAAAaABAAAAAAAAEAAAAaABEAAAADAAcAAAAaABIAAAADAAgAAAAaABMAAAAHAAkAAAAaABQAAAAHAAkAAAAaABUAAAAFAAkAAAAaABYAAAAAAAAAAAAaABcAAAAIAAoAAAAaABgAAAAIAAoAAAAaABkAAAAHAAkAAAAaABoAAAAFAAoAAAAaABsAAAAAAAMAAAAaABwAAAABAAcAAAAaAB0AAAABAAQAAAAaAB4AAAABAAUAAAAaAB8AAAABAAMAAAAaACAAAAABAAQAAAAaACEAAAABAAQAAAAaACIAAAABAAUAAAAaACMAAAAIAAkAAAAaACQAAAAHAAoAAAAaACUAAAAHAAkAAAAaACYAAAAFAAoAAAAaACcAAAAIAAoAAAAaACgAAAAHAAoAAAAaACkAAAAFAAoAAAAaACoAAAAIAAoAAAAaACsAAAAFAAkAAAAaACwAAAAFAAoAAAAaAC0AAAAAAAAAAAAaAC4AAAAHAAkAAAAaAC8AAAAHAAoAAAAaADAAAAAFAAkAAAAaADEAAAAIAAoAAAAaADIAAAAFAAkAAAAaADMAAAAFAAkAAAAbAPD/AAADAAoAAAAbAPH/AAAAAAEAAAAbAPL/AAADAAcAAAAbAPP/AAADAAcAAAAbAPT/AAAAAAEAAAAbAPX/AAADAAcAAAAbAPb/AAADAAcAAAAbAPf/AAADAAcAAAAbAPj/AAADAAcAAAAbAPn/AAADAAcAAAAbAPr/AAADAAcAAAAbAPv/AAADAAcAAAAbAPz/AAAAAAEAAAAbAP3/AAADAAcAAAAbAP7/AAADAAcAAAAbAP//AAADAAkAAAAbAAAAAAACAAgAAAAbAAEAAAAFAAoAAAAbAAIAAAAIAAoAAAAbAAMAAAAHAAoAAAAbAAQAAAAAAAAAAAAbAAUAAAAFAAkAAAAbAAYAAAAAAAMAAAAbAAcAAAAAAAQAAAAbAAgAAAABAAcAAAAbAAkAAAABAAQAAAAbAAoAAAABAAUAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAACAAYAAAAbAA8AAAADAAoAAAAbABAAAAADAAcAAAAbABEAAAACAAkAAAAbABIAAAAEAAgAAAAbABMAAAAIAAkAAAAbABQAAAAIAAoAAAAbABUAAAAHAAkAAAAbABYAAAAIAAkAAAAbABcAAAAFAAkAAAAbABgAAAAIAAoAAAAbABkAAAAAAAAAAAAbABoAAAAAAAAAAAAbABsAAAABAAMAAAAbABwAAAABAAQAAAAbAB0AAAAAAAYAAAAbAB4AAAACAAUAAAAbAB8AAAABAAMAAAAbACAAAAABAAQAAAAbACEAAAABAAQAAAAbACIAAAABAAUAAAAbACMAAAAHAAoAAAAbACQAAAAFAAkAAAAbACUAAAAHAAkAAAAbACYAAAAHAAoAAAAbACcAAAAFAAkAAAAbACgAAAAHAAkAAAAbACkAAAAFAAoAAAAbACoAAAAAAAAAAAAbACsAAAAIAAoAAAAbACwAAAAIAAoAAAAbAC0AAAAHAAkAAAAbAC4AAAAIAAkAAAAbAC8AAAAAAAAAAAAbADAAAAAFAAoAAAAbADEAAAAFAAkAAAAbADIAAAAFAAoAAAAbADMAAAAIAAkAAAAcAPD/AAADAAcAAAAcAPH/AAADAAcAAAAcAPL/AAADAAcAAAAcAPP/AAADAAcAAAAcAPT/AAADAAcAAAAcAPX/AAAAAAEAAAAcAPb/AAADAAcAAAAcAPf/AAADAAcAAAAcAPj/AAADAAcAAAAcAPn/AAADAAcAAAAcAPr/AAADAAcAAAAcAPv/AAADAAcAAAAcAPz/AAADAAcAAAAcAP3/AAADAAcAAAAcAP7/AAADAAcAAAAcAP//AAAAAAEAAAAcAAAAAAADAAkAAAAcAAEAAAACAAgAAAAcAAIAAAAFAAoAAAAcAAMAAAAAAAAAAAAcAAQAAAAFAAkAAAAcAAUAAAAIAAkAAAAcAAYAAAABAAMAAAAcAAcAAAABAAQAAAAcAAgAAAABAAQAAAAcAAkAAAAAAAYAAAAcAAoAAAACAAUAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAACAAYAAAAcAA4AAAADAAoAAAAcAA8AAAADAAcAAAAcABAAAAADAAcAAAAcABEAAAADAAgAAAAcABIAAAAFAAoAAAAcABMAAAAIAAoAAAAcABQAAAAFAAoAAAAcABUAAAAFAAkAAAAcABYAAAAHAAoAAAAcABcAAAAHAAkAAAAcABgAAAAIAAkAAAAcABkAAAAIAAkAAAAcABoAAAAAAAMAAAAcABsAAAABAAcAAAAcABwAAAABAAQAAAAcAB0AAAABAAUAAAAcAB4AAAAFAAoAAAAcAB8AAAABAAMAAAAcACAAAAABAAQAAAAcACEAAAABAAQAAAAcACIAAAABAAUAAAAcACMAAAAFAAkAAAAcACQAAAAIAAkAAAAcACUAAAAIAAkAAAAcACYAAAAHAAkAAAAcACcAAAAIAAkAAAAcACgAAAAIAAkAAAAcACkAAAAHAAkAAAAcACoAAAAAAAAAAAAcACsAAAAHAAkAAAAcACwAAAAFAAkAAAAcAC0AAAAAAAAAAAAcAC4AAAAIAAoAAAAcAC8AAAAHAAkAAAAcADAAAAAHAAoAAAAcADEAAAAIAAoAAAAcADIAAAAHAAoAAAAcADMAAAAIAAoAAAAdAPD/AAADAAcAAAAdAPH/AAADAAcAAAAdAPL/AAAAAAEAAAAdAPP/AAAAAAEAAAAdAPT/AAADAAcAAAAdAPX/AAADAAcAAAAdAPb/AAADAAcAAAAdAPf/AAAAAAEAAAAdAPj/AAAAAAEAAAAdAPn/AAADAAcAAAAdAPr/AAADAAcAAAAdAPv/AAAAAAEAAAAdAPz/AAADAAcAAAAdAP3/AAADAAcAAAAdAP7/AAADAAcAAAAdAP//AAADAAcAAAAdAAAAAAADAAcAAAAdAAEAAAADAAgAAAAdAAIAAAAHAAoAAAAdAAMAAAAHAAkAAAAdAAQAAAAHAAoAAAAdAAUAAAAFAAoAAAAdAAYAAAABAAMAAAAdAAcAAAABAAQAAAAdAAgAAAAAAAYAAAAdAAkAAAACAAUAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAADAAYAAAAdAA4AAAADAAcAAAAdAA8AAAADAAcAAAAdABAAAAACAAkAAAAdABEAAAAEAAgAAAAdABIAAAAHAAkAAAAdABMAAAAHAAkAAAAdABQAAAAFAAoAAAAdABUAAAAHAAkAAAAdABYAAAAHAAoAAAAdABcAAAAIAAkAAAAdABgAAAAHAAkAAAAdABkAAAAAAAMAAAAdABoAAAABAAcAAAAdABsAAAABAAQAAAAdABwAAAABAAQAAAAdAB0AAAABAAUAAAAdAB4AAAAAAAAAAAAdAB8AAAABAAMAAAAdACAAAAABAAQAAAAdACEAAAABAAQAAAAdACIAAAABAAUAAAAdACMAAAAFAAkAAAAdACQAAAAIAAkAAAAdACUAAAAAAAAAAAAdACYAAAAHAAoAAAAdACcAAAAFAAkAAAAdACgAAAAIAAoAAAAdACkAAAAHAAoAAAAdACoAAAAFAAoAAAAdACsAAAAHAAoAAAAdACwAAAAIAAoAAAAdAC0AAAAAAAAAAAAdAC4AAAAIAAoAAAAdAC8AAAAHAAoAAAAdADAAAAAHAAkAAAAdADEAAAAIAAkAAAAdADIAAAAIAAoAAAAdADMAAAAFAAoAAAAeAPD/AAAAAAEAAAAeAPH/AAAAAAEAAAAeAPL/AAADAAcAAAAeAPP/AAADAAcAAAAeAPT/AAADAAcAAAAeAPX/AAAAAAEAAAAeAPb/AAADAAcAAAAeAPf/AAAAAAEAAAAeAPj/AAAAAAEAAAAeAPn/AAAAAAEAAAAeAPr/AAADAAcAAAAeAPv/AAADAAcAAAAeAPz/AAAAAAEAAAAeAP3/AAADAAcAAAAeAP7/AAAAAAEAAAAeAP//AAADAAcAAAAeAAAAAAADAAcAAAAeAAEAAAADAAgAAAAeAAIAAAAHAAkAAAAeAAMAAAAHAAkAAAAeAAQAAAAIAAoAAAAeAAUAAAAHAAkAAAAeAAYAAAABAAMAAAAeAAcAAAABAAQAAAAeAAgAAAABAAUAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAACAAYAAAAeAA0AAAADAAoAAAAeAA4AAAADAAcAAAAeAA8AAAACAAkAAAAeABAAAAAEAAgAAAAeABEAAAAFAAoAAAAeABIAAAAHAAoAAAAeABMAAAAIAAoAAAAeABQAAAAFAAkAAAAeABUAAAAAAAAAAAAeABYAAAAIAAkAAAAeABcAAAAIAAkAAAAeABgAAAAAAAMAAAAeABkAAAABAAcAAAAeABoAAAABAAQAAAAeABsAAAABAAQAAAAeABwAAAAAAAYAAAAeAB0AAAACAAUAAAAeAB4AAAAFAAoAAAAeAB8AAAABAAMAAAAeACAAAAABAAQAAAAeACEAAAABAAQAAAAeACIAAAABAAUAAAAeACMAAAAFAAkAAAAeACQAAAAIAAoAAAAeACUAAAAIAAkAAAAeACYAAAAHAAkAAAAeACcAAAAIAAoAAAAeACgAAAAHAAkAAAAeACkAAAAFAAkAAAAeACoAAAAFAAkAAAAeACsAAAAHAAkAAAAeACwAAAAHAAoAAAAeAC0AAAAIAAkAAAAeAC4AAAAAAAAAAAAeAC8AAAAHAAoAAAAeADAAAAAFAAkAAAAeADEAAAAIAAoAAAAeADIAAAAIAAoAAAAeADMAAAAHAAkAAAAfAPD/AAADAAcAAAAfAPH/AAAAAAEAAAAfAPL/AAADAAcAAAAfAPP/AAADAAcAAAAfAPT/AAADAAcAAAAfAPX/AAAAAAEAAAAfAPb/AAADAAcAAAAfAPf/AAAAAAEAAAAfAPj/AAADAAcAAAAfAPn/AAAAAAEAAAAfAPr/AAADAAcAAAAfAPv/AAADAAcAAAAfAPz/AAADAAcAAAAfAP3/AAADAAcAAAAfAP7/AAADAAcAAAAfAP//AAAAAAEAAAAfAAAAAAADAAcAAAAfAAEAAAADAAgAAAAfAAIAAAAFAAoAAAAfAAMAAAAFAAoAAAAfAAQAAAAIAAoAAAAfAAUAAAAHAAkAAAAfAAYAAAABAAMAAAAfAAcAAAABAAQAAAAfAAgAAAABAAUAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAADAAYAAAAfAA0AAAADAAcAAAAfAA4AAAADAAcAAAAfAA8AAAADAAgAAAAfABAAAAAFAAkAAAAfABEAAAAFAAkAAAAfABIAAAAIAAkAAAAfABMAAAAHAAkAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAIAAkAAAAfABcAAAAAAAAAAAAfABgAAAABAAMAAAAfABkAAAABAAQAAAAfABoAAAABAAQAAAAfABsAAAAAAAYAAAAfABwAAAACAAUAAAAfAB0AAAAAAAAAAAAfAB4AAAAFAAoAAAAfAB8AAAABAAMAAAAfACAAAAABAAQAAAAfACEAAAABAAQAAAAfACIAAAABAAUAAAAfACMAAAAFAAkAAAAfACQAAAAAAAAAAAAfACUAAAAAAAAAAAAfACYAAAAHAAkAAAAfACcAAAAHAAoAAAAfACgAAAAIAAkAAAAfACkAAAAIAAoAAAAfACoAAAAIAAoAAAAfACsAAAAHAAkAAAAfACwAAAAHAAoAAAAfAC0AAAAFAAoAAAAfAC4AAAAHAAoAAAAfAC8AAAAIAAkAAAAfADAAAAAIAAoAAAAfADEAAAAHAAkAAAAfADIAAAAFAAkAAAAfADMAAAAHAAkAAAAgAPD/AAADAAcAAAAgAPH/AAAAAAEAAAAgAPL/AAADAAcAAAAgAPP/AAADAAcAAAAgAPT/AAADAAcAAAAgAPX/AAAAAAEAAAAgAPb/AAADAAcAAAAgAPf/AAADAAcAAAAgAPj/AAADAAcAAAAgAPn/AAAAAAEAAAAgAPr/AAAAAAEAAAAgAPv/AAADAAcAAAAgAPz/AAAAAAEAAAAgAP3/AAADAAcAAAAgAP7/AAADAAcAAAAgAP//AAAAAAEAAAAgAAAAAAADAAcAAAAgAAEAAAADAAgAAAAgAAIAAAAFAAkAAAAgAAMAAAAFAAkAAAAgAAQAAAAIAAkAAAAgAAUAAAAIAAkAAAAgAAYAAAABAAMAAAAgAAcAAAABAAQAAAAgAAgAAAABAAYAAAAgAAkAAAAAAAUAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAADAAYAAAAgAA0AAAADAAcAAAAgAA4AAAACAAkAAAAgAA8AAAAEAAgAAAAgABAAAAAFAAoAAAAgABEAAAAAAAAAAAAgABIAAAAHAAkAAAAgABMAAAAIAAoAAAAgABQAAAAIAAoAAAAgABUAAAAFAAoAAAAgABYAAAAAAAAAAAAgABcAAAAAAAMAAAAgABgAAAABAAcAAAAgABkAAAABAAQAAAAgABoAAAAAAAYAAAAgABsAAAACAAUAAAAgABwAAAAFAAkAAAAgAB0AAAAFAAoAAAAgAB4AAAAHAAoAAAAgAB8AAAABAAMAAAAgACAAAAABAAQAAAAgACEAAAABAAQAAAAgACIAAAABAAUAAAAgACMAAAAHAAkAAAAgACQAAAAIAAkAAAAgACUAAAAFAAkAAAAgACYAAAAFAAkAAAAgACcAAAAFAAoAAAAgACgAAAAHAAoAAAAgACkAAAAHAAoAAAAgACoAAAAFAAkAAAAgACsAAAAIAAkAAAAgACwAAAAFAAkAAAAgAC0AAAAAAAAAAAAgAC4AAAAIAAoAAAAgAC8AAAAIAAoAAAAgADAAAAAFAAkAAAAgADEAAAAFAAoAAAAgADIAAAAIAAoAAAAgADMAAAAFAAoAAAAhAPD/AAADAAcAAAAhAPH/AAADAAcAAAAhAPL/AAADAAcAAAAhAPP/AAAAAAEAAAAhAPT/AAADAAcAAAAhAPX/AAAAAAEAAAAhAPb/AAADAAcAAAAhAPf/AAAAAAEAAAAhAPj/AAADAAcAAAAhAPn/AAADAAcAAAAhAPr/AAADAAcAAAAhAPv/AAADAAcAAAAhAPz/AAADAAcAAAAhAP3/AAADAAcAAAAhAP7/AAADAAcAAAAhAP//AAADAAcAAAAhAAAAAAADAAcAAAAhAAEAAAADAAgAAAAhAAIAAAAFAAkAAAAhAAMAAAAIAAoAAAAhAAQAAAAHAAoAAAAhAAUAAAAAAAAAAAAhAAYAAAABAAMAAAAhAAcAAAABAAQAAAAhAAgAAAABAAQAAAAhAAkAAAABAAUAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAADAAYAAAAhAA0AAAADAAcAAAAhAA4AAAADAAgAAAAhAA8AAAAIAAoAAAAhABAAAAAHAAkAAAAhABEAAAAIAAoAAAAhABIAAAAHAAoAAAAhABMAAAAFAAoAAAAhABQAAAAHAAoAAAAhABUAAAAFAAkAAAAhABYAAAAAAAMAAAAhABcAAAABAAcAAAAhABgAAAABAAQAAAAhABkAAAAAAAYAAAAhABoAAAACAAUAAAAhABsAAAAIAAkAAAAhABwAAAAIAAoAAAAhAB0AAAAIAAkAAAAhAB4AAAAIAAoAAAAhAB8AAAABAAMAAAAhACAAAAABAAQAAAAhACEAAAABAAQAAAAhACIAAAABAAUAAAAhACMAAAAIAAkAAAAhACQAAAAFAAoAAAAhACUAAAAFAAoAAAAhACYAAAAFAAoAAAAhACcAAAAHAAoAAAAhACgAAAAAAAAAAAAhACkAAAAHAAkAAAAhACoAAAAHAAoAAAAhACsAAAAAAAAAAAAhACwAAAAIAAoAAAAhAC0AAAAHAAoAAAAhAC4AAAAHAAkAAAAhAC8AAAAAAAAAAAAhADAAAAAHAAoAAAAhADEAAAAFAAkAAAAhADIAAAAFAAkAAAAhADMAAAAIAAoAAAAiAPD/AAADAAcAAAAiAPH/AAADAAcAAAAiAPL/AAADAAcAAAAiAPP/AAADAAcAAAAiAPT/AAAAAAEAAAAiAPX/AAADAAcAAAAiAPb/AAADAAcAAAAiAPf/AAAAAAEAAAAiAPj/AAADAAcAAAAiAPn/AAADAAcAAAAiAPr/AAAAAAEAAAAiAPv/AAADAAcAAAAiAPz/AAADAAcAAAAiAP3/AAADAAcAAAAiAP7/AAADAAcAAAAiAP//AAADAAcAAAAiAAAAAAAAAAEAAAAiAAEAAAADAAgAAAAiAAIAAAAIAAoAAAAiAAMAAAAAAAAAAAAiAAQAAAAIAAkAAAAiAAUAAAAFAAoAAAAiAAYAAAABAAMAAAAiAAcAAAABAAQAAAAiAAgAAAABAAQAAAAiAAkAAAABAAUAAAAiAAoAAAAAAAAAAAAiAAsAAAACAAYAAAAiAAwAAAADAAoAAAAiAA0AAAADAAcAAAAiAA4AAAADAAgAAAAiAA8AAAAFAAkAAAAiABAAAAAHAAoAAAAiABEAAAAFAAkAAAAiABIAAAAIAAkAAAAiABMAAAAIAAoAAAAiABQAAAAHAAkAAAAiABUAAAAAAAAAAAAiABYAAAABAAMAAAAiABcAAAABAAQAAAAiABgAAAABAAQAAAAiABkAAAABAAUAAAAiABoAAAAHAAkAAAAiABsAAAAFAAoAAAAiABwAAAAFAAkAAAAiAB0AAAAFAAoAAAAiAB4AAAAIAAoAAAAiAB8AAAABAAMAAAAiACAAAAABAAQAAAAiACEAAAABAAQAAAAiACIAAAABAAUAAAAiACMAAAAHAAoAAAAiACQAAAAHAAoAAAAiACUAAAAHAAoAAAAiACYAAAAFAAoAAAAiACcAAAAFAAkAAAAiACgAAAAIAAoAAAAiACkAAAAFAAkAAAAiACoAAAAAAAAAAAAiACsAAAAIAAoAAAAiACwAAAAAAAAAAAAiAC0AAAAHAAoAAAAiAC4AAAAFAAkAAAAiAC8AAAAFAAoAAAAiADAAAAAFAAkAAAAiADEAAAAHAAkAAAAiADIAAAAFAAoAAAAiADMAAAAFAAkAAAAjAPD/AAADAAcAAAAjAPH/AAADAAcAAAAjAPL/AAAAAAEAAAAjAPP/AAADAAcAAAAjAPT/AAAAAAEAAAAjAPX/AAAAAAEAAAAjAPb/AAADAAcAAAAjAPf/AAADAAcAAAAjAPj/AAADAAcAAAAjAPn/AAADAAcAAAAjAPr/AAADAAcAAAAjAPv/AAAAAAEAAAAjAPz/AAADAAcAAAAjAP3/AAADAAcAAAAjAP7/AAADAAcAAAAjAP//AAADAAcAAAAjAAAAAAADAAcAAAAjAAEAAAADAAgAAAAjAAIAAAAHAAoAAAAjAAMAAAAHAAkAAAAjAAQAAAAIAAkAAAAjAAUAAAAIAAkAAAAjAAYAAAACAAMAAAAjAAcAAAAAAAcAAAAjAAgAAAABAAQAAAAjAAkAAAABAAUAAAAjAAoAAAACAAcAAAAjAAsAAAADAAoAAAAjAAwAAAADAAcAAAAjAA0AAAADAAcAAAAjAA4AAAALAA0AAAAjAA8AAAAAAAQAAAAjABAAAAAAAAQAAAAjABEAAAAAAAUAAAAjABIAAAAFAAkAAAAjABMAAAAIAAkAAAAjABQAAAAIAAkAAAAjABUAAAAHAAkAAAAjABYAAAABAAMAAAAjABcAAAABAAQAAAAjABgAAAAAAAYAAAAjABkAAAACAAUAAAAjABoAAAAFAAkAAAAjABsAAAAHAAkAAAAjABwAAAAFAAkAAAAjAB0AAAAHAAoAAAAjAB4AAAAIAAoAAAAjAB8AAAABAAMAAAAjACAAAAABAAQAAAAjACEAAAABAAQAAAAjACIAAAABAAUAAAAjACMAAAAAAAAAAAAjACQAAAAAAAAAAAAjACUAAAAHAAkAAAAjACYAAAAAAAAAAAAjACcAAAAFAAoAAAAjACgAAAAHAAoAAAAjACkAAAAFAAoAAAAjACoAAAAIAAoAAAAjACsAAAAIAAoAAAAjACwAAAAFAAoAAAAjAC0AAAAFAAkAAAAjAC4AAAAHAAoAAAAjAC8AAAAFAAoAAAAjADAAAAAHAAoAAAAjADEAAAAIAAoAAAAjADIAAAAIAAkAAAAjADMAAAAFAAkAAAAkAPD/AAADAAcAAAAkAPH/AAADAAcAAAAkAPL/AAADAAcAAAAkAPP/AAAAAAEAAAAkAPT/AAAAAAEAAAAkAPX/AAADAAcAAAAkAPb/AAADAAcAAAAkAPf/AAAAAAEAAAAkAPj/AAADAAcAAAAkAPn/AAADAAcAAAAkAPr/AAADAAcAAAAkAPv/AAADAAcAAAAkAPz/AAADAAcAAAAkAP3/AAADAAcAAAAkAP7/AAADAAcAAAAkAP//AAADAAcAAAAkAAAAAAADAAcAAAAkAAEAAAADAAgAAAAkAAIAAAAHAAkAAAAkAAMAAAAAAAAAAAAkAAQAAAAIAAkAAAAkAAUAAAAIAAoAAAAkAAYAAAAIAAkAAAAkAAcAAAABAAMAAAAkAAgAAAABAAQAAAAkAAkAAAAQAAYAAAAkAAwAAAAAAAEAAAAkAA0AAAAAAAEAAAAkAA4AAAAQAAgAAAAkAA8AAAABAAQAAAAkABAAAAABAAQAAAAkABEAAAABAAYAAAAkABIAAAAAAAUAAAAkABMAAAAFAAoAAAAkABQAAAAFAAoAAAAkABUAAAAIAAkAAAAkABYAAAABAAMAAAAkABcAAAABAAQAAAAkABgAAAABAAUAAAAkABkAAAAFAAkAAAAkABoAAAAAAAAAAAAkABsAAAAHAAkAAAAkABwAAAAFAAoAAAAkAB0AAAAIAAoAAAAkAB4AAAAHAAoAAAAkAB8AAAABAAMAAAAkACAAAAABAAQAAAAkACEAAAABAAQAAAAkACIAAAABAAUAAAAkACMAAAAHAAkAAAAkACQAAAAHAAkAAAAkACUAAAAAAAAAAAAkACYAAAAIAAkAAAAkACcAAAAIAAoAAAAkACgAAAAHAAoAAAAkACkAAAAFAAoAAAAkACoAAAAHAAoAAAAkACsAAAAFAAoAAAAkACwAAAAHAAoAAAAkAC0AAAAHAAkAAAAkAC4AAAAFAAkAAAAkAC8AAAAIAAoAAAAkADAAAAAIAAoAAAAkADEAAAAHAAkAAAAkADIAAAAFAAoAAAAkADMAAAAIAAoAAAAlAPD/AAADAAcAAAAlAPH/AAADAAcAAAAlAPL/AAADAAcAAAAlAPP/AAAAAAEAAAAlAPT/AAADAAcAAAAlAPX/AAADAAcAAAAlAPb/AAADAAcAAAAlAPf/AAADAAcAAAAlAPj/AAADAAcAAAAlAPn/AAADAAcAAAAlAPr/AAADAAcAAAAlAPv/AAADAAcAAAAlAPz/AAADAAcAAAAlAP3/AAADAAcAAAAlAP7/AAADAAcAAAAlAP//AAADAAcAAAAlAAAAAAACAAkAAAAlAAEAAAAEAAgAAAAlAAIAAAAHAAoAAAAlAAMAAAAIAAkAAAAlAAQAAAAFAAoAAAAlAAUAAAAFAAkAAAAlAAYAAAAAAAAAAAAlAAcAAAABAAMAAAAlAAgAAAABAAQAAAAlAAkAAAAQAAYAAAAlAA0AAAADAAcAAAAlAA4AAAAQAAgAAAAlAA8AAAABAAQAAAAlABAAAAABAAQAAAAlABEAAAABAAQAAAAlABIAAAABAAYAAAAlABMAAAAAAAQAAAAlABQAAAAAAAUAAAAlABUAAAAAAAMAAAAlABYAAAABAAcAAAAlABcAAAABAAQAAAAlABgAAAABAAUAAAAlABkAAAAHAAkAAAAlABoAAAAFAAoAAAAlABsAAAAIAAoAAAAlABwAAAAIAAkAAAAlAB0AAAAIAAkAAAAlAB4AAAAHAAkAAAAlAB8AAAABAAMAAAAlACAAAAABAAQAAAAlACEAAAABAAQAAAAlACIAAAABAAUAAAAlACMAAAAHAAoAAAAlACQAAAAIAAkAAAAlACUAAAAHAAkAAAAlACYAAAAIAAoAAAAlACcAAAAFAAoAAAAlACgAAAAFAAoAAAAlACkAAAAFAAoAAAAlACoAAAAIAAkAAAAlACsAAAAHAAkAAAAlACwAAAAHAAoAAAAlAC0AAAAFAAoAAAAlAC4AAAAIAAkAAAAlAC8AAAAHAAoAAAAlADAAAAAIAAkAAAAlADEAAAAHAAkAAAAlADIAAAAIAAkAAAAlADMAAAAFAAkAAAAmAPD/AAADAAcAAAAmAPH/AAADAAcAAAAmAPL/AAADAAcAAAAmAPP/AAADAAcAAAAmAPT/AAAAAAEAAAAmAPX/AAADAAcAAAAmAPb/AAAAAAEAAAAmAPf/AAADAAcAAAAmAPj/AAADAAcAAAAmAPn/AAAAAAEAAAAmAPr/AAAAAAEAAAAmAPv/AAADAAcAAAAmAPz/AAADAAcAAAAmAP3/AAADAAcAAAAmAP7/AAADAAcAAAAmAP//AAACAAkAAAAmAAAAAAAEAAgAAAAmAAEAAAAFAAoAAAAmAAIAAAAFAAkAAAAmAAMAAAAFAAkAAAAmAAQAAAAIAAkAAAAmAAUAAAAIAAkAAAAmAAYAAAAHAAkAAAAmAAcAAAABAAMAAAAmAAgAAAABAAQAAAAmAAkAAAAQAAYAAAAmAA0AAAADAAcAAAAmAA4AAAAKAA0AAAAmAA8AAAACAAQAAAAmABAAAAAAAAcAAAAmABEAAAABAAQAAAAmABIAAAABAAQAAAAmABMAAAABAAQAAAAmABQAAAABAAYAAAAmABUAAAABAAcAAAAmABYAAAABAAQAAAAmABcAAAABAAQAAAAmABgAAAABAAUAAAAmABkAAAAFAAoAAAAmABoAAAAHAAkAAAAmABsAAAAIAAoAAAAmABwAAAAFAAoAAAAmAB0AAAAFAAkAAAAmAB4AAAAAAAAAAAAmAB8AAAABAAMAAAAmACAAAAABAAQAAAAmACEAAAABAAQAAAAmACIAAAABAAUAAAAmACMAAAAIAAoAAAAmACQAAAAIAAoAAAAmACUAAAAFAAoAAAAmACYAAAAFAAoAAAAmACcAAAAIAAoAAAAmACgAAAAIAAoAAAAmACkAAAAAAAAAAAAmACoAAAAHAAkAAAAmACsAAAAHAAoAAAAmACwAAAAAAAAAAAAmAC0AAAAFAAkAAAAmAC4AAAAFAAoAAAAmAC8AAAAFAAkAAAAmADAAAAAHAAkAAAAmADEAAAAHAAoAAAAmADIAAAAHAAkAAAAmADMAAAAIAAkAAAAnAPD/AAADAAcAAAAnAPH/AAADAAcAAAAnAPL/AAADAAcAAAAnAPP/AAAAAAEAAAAnAPT/AAAAAAEAAAAnAPX/AAADAAcAAAAnAPb/AAADAAcAAAAnAPf/AAADAAcAAAAnAPj/AAADAAcAAAAnAPn/AAADAAcAAAAnAPr/AAADAAcAAAAnAPv/AAADAAcAAAAnAPz/AAADAAcAAAAnAP3/AAADAAcAAAAnAP7/AAADAAcAAAAnAP//AAADAAgAAAAnAAAAAAAAAAAAAAAnAAEAAAAHAAkAAAAnAAIAAAAAAAAAAAAnAAMAAAAIAAkAAAAnAAQAAAAHAAoAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAMAAAAnAAcAAAABAAcAAAAnAAgAAAABAAQAAAAnAAkAAAAQAAYAAAAnAAwAAAAAAAEAAAAnAA0AAAACAAkAAAAnAA4AAAAEAAgAAAAnAA8AAAAAAAAAAAAnABAAAAACAAMAAAAnABEAAAACAAQAAAAnABIAAAAAAAcAAAAnABMAAAABAAQAAAAnABQAAAABAAQAAAAnABUAAAABAAQAAAAnABYAAAABAAQAAAAnABcAAAAAAAYAAAAnABgAAAACAAUAAAAnABkAAAAFAAkAAAAnABoAAAAIAAkAAAAnABsAAAAFAAkAAAAnABwAAAAHAAoAAAAnAB0AAAAFAAoAAAAnAB4AAAAIAAkAAAAnAB8AAAABAAMAAAAnACAAAAABAAQAAAAnACEAAAABAAQAAAAnACIAAAABAAUAAAAnACMAAAAAAAAAAAAnACQAAAAHAAkAAAAnACUAAAAFAAoAAAAnACYAAAAHAAkAAAAnACcAAAAAAAAAAAAnACgAAAAFAAkAAAAnACkAAAAFAAoAAAAnACoAAAAHAAkAAAAnACsAAAAIAAoAAAAnACwAAAAAAAAAAAAnAC0AAAAIAAkAAAAnAC4AAAAAAAAAAAAnAC8AAAAIAAkAAAAnADAAAAAIAAkAAAAnADEAAAAFAAoAAAAnADIAAAAHAAoAAAAnADMAAAAAAAAAAAAoAPD/AAADAAcAAAAoAPH/AAAAAAEAAAAoAPL/AAADAAcAAAAoAPP/AAADAAcAAAAoAPT/AAADAAcAAAAoAPX/AAADAAcAAAAoAPb/AAADAAcAAAAoAPf/AAADAAcAAAAoAPj/AAAAAAEAAAAoAPn/AAAAAAEAAAAoAPr/AAAAAAEAAAAoAPv/AAADAAcAAAAoAPz/AAADAAcAAAAoAP3/AAAAAAEAAAAoAP7/AAADAAcAAAAoAP//AAADAAgAAAAoAAAAAAAIAAoAAAAoAAEAAAAHAAkAAAAoAAIAAAAFAAkAAAAoAAMAAAAAAAMAAAAoAAQAAAAAAAQAAAAoAAUAAAAAAAQAAAAoAAYAAAABAAcAAAAoAAcAAAABAAQAAAAoAAgAAAAPAAYAAAAoAAkAAAAQAAoAAAAoAAoAAAAAAAEAAAAoAAwAAAADAAcAAAAoAA0AAAADAAgAAAAoAA4AAAAHAAkAAAAoAA8AAAAFAAkAAAAoABAAAAAFAAoAAAAoABEAAAAFAAoAAAAoABIAAAACAAMAAAAoABMAAAACAAQAAAAoABQAAAACAAQAAAAoABUAAAACAAQAAAAoABYAAAACAAQAAAAoABcAAAACAAUAAAAoABgAAAAFAAkAAAAoABkAAAAIAAkAAAAoABoAAAAFAAkAAAAoABsAAAAFAAkAAAAoABwAAAAIAAoAAAAoAB0AAAAIAAkAAAAoAB4AAAAIAAkAAAAoAB8AAAABAAMAAAAoACAAAAABAAQAAAAoACEAAAABAAQAAAAoACIAAAABAAUAAAAoACMAAAAIAAkAAAAoACQAAAAFAAkAAAAoACUAAAAFAAkAAAAoACYAAAAIAAkAAAAoACcAAAAHAAoAAAAoACgAAAAAAAAAAAAoACkAAAAHAAoAAAAoACoAAAAIAAoAAAAoACsAAAAFAAoAAAAoACwAAAAHAAkAAAAoAC0AAAAIAAkAAAAoAC4AAAAHAAoAAAAoAC8AAAAFAAkAAAAoADAAAAAHAAkAAAAoADEAAAAHAAkAAAAoADIAAAAFAAoAAAAoADMAAAAFAAkAAAApAPD/AAAAAAEAAAApAPH/AAAAAAEAAAApAPL/AAADAAcAAAApAPP/AAADAAcAAAApAPT/AAADAAcAAAApAPX/AAADAAcAAAApAPb/AAADAAcAAAApAPf/AAADAAcAAAApAPr/AAADAAcAAAApAPv/AAADAAcAAAApAPz/AAADAAcAAAApAP3/AAADAAcAAAApAP7/AAADAAcAAAApAP//AAADAAkAAAApAAAAAAACAAgAAAApAAEAAAAFAAoAAAApAAIAAAAAAAAAAAApAAMAAAABAAMAAAApAAQAAAABAAQAAAApAAUAAAABAAQAAAApAAYAAAABAAQAAAApAAcAAAABAAQAAAApAAgAAAAQAAYAAAApAAkAAAAAAAEAAAApAAoAAAADAAcAAAApAAsAAAACAAkAAAApAAwAAAAEAAcAAAApAA0AAAAEAAgAAAApAA4AAAAIAAkAAAApAA8AAAAIAAoAAAApABAAAAAAAAAAAAApABEAAAAIAAkAAAApABIAAAAFAAoAAAApABMAAAAAAAAAAAApABQAAAAIAAkAAAApABUAAAAIAAoAAAApABYAAAAIAAkAAAApABcAAAAIAAoAAAApABgAAAAAAAAAAAApABkAAAAFAAoAAAApABoAAAAIAAkAAAApABsAAAAHAAoAAAApABwAAAAAAAAAAAApAB0AAAAHAAkAAAApAB4AAAAFAAoAAAApAB8AAAABAAMAAAApACAAAAABAAQAAAApACEAAAABAAQAAAApACIAAAABAAUAAAApACMAAAAIAAoAAAApACQAAAAIAAoAAAApACUAAAAFAAkAAAApACYAAAAIAAoAAAApACcAAAAFAAoAAAApACgAAAAHAAoAAAApACkAAAAFAAoAAAApACoAAAAHAAoAAAApACsAAAAHAAkAAAApACwAAAAIAAoAAAApAC0AAAAIAAkAAAApAC4AAAAHAAkAAAApAC8AAAAIAAkAAAApADAAAAAHAAoAAAApADEAAAAIAAoAAAApADIAAAAHAAkAAAApADMAAAAAAAAAAAAqAPD/AAADAAcAAAAqAPH/AAADAAcAAAAqAPL/AAADAAcAAAAqAPP/AAAAAAEAAAAqAPT/AAADAAcAAAAqAPX/AAADAAcAAAAqAPb/AAADAAcAAAAqAPf/AAADAAcAAAAqAPr/AAAAAAEAAAAqAPv/AAADAAcAAAAqAPz/AAADAAcAAAAqAP3/AAADAAcAAAAqAP7/AAADAAcAAAAqAP//AAAAAAEAAAAqAAAAAAADAAgAAAAqAAEAAAAFAAkAAAAqAAIAAAAFAAoAAAAqAAMAAAABAAMAAAAqAAQAAAABAAQAAAAqAAUAAAAAAAYAAAAqAAYAAAAAAAcAAAAqAAcAAAABAAQAAAAqAAgAAAAQAAYAAAAqAAkAAAADAAcAAAAqAAoAAAADAAcAAAAqAAsAAAADAAgAAAAqAAwAAAAAAAAAAAAqAA0AAAAFAAoAAAAqAA4AAAAHAAoAAAAqAA8AAAAFAAoAAAAqABAAAAAHAAoAAAAqABEAAAAAAAAAAAAqABIAAAAHAAkAAAAqABMAAAAIAAkAAAAqABQAAAAIAAkAAAAqABUAAAAFAAkAAAAqABYAAAAAAAAAAAAqABcAAAAHAAoAAAAqABgAAAAIAAkAAAAqABkAAAAHAAkAAAAqABoAAAAFAAkAAAAqABsAAAAFAAoAAAAqABwAAAAHAAkAAAAqAB0AAAAAAAAAAAAqAB4AAAAIAAoAAAAqAB8AAAABAAMAAAAqACAAAAABAAQAAAAqACEAAAABAAQAAAAqACIAAAABAAUAAAAqACMAAAAFAAoAAAAqACQAAAAIAAoAAAAqACUAAAAFAAkAAAAqACYAAAAAAAAAAAAqACcAAAAFAAkAAAAqACgAAAAIAAkAAAAqACkAAAAHAAoAAAAqACoAAAAFAAoAAAAqACsAAAAFAAoAAAAqACwAAAAFAAkAAAAqAC0AAAAHAAkAAAAqAC4AAAAIAAkAAAAqAC8AAAAFAAoAAAAqADAAAAAIAAoAAAAqADEAAAAAAAAAAAAqADIAAAAHAAkAAAAqADMAAAAIAAoAAAArAPD/AAADAAcAAAArAPH/AAADAAcAAAArAPL/AAADAAcAAAArAPP/AAADAAcAAAArAPT/AAAAAAEAAAArAPX/AAADAAcAAAArAPb/AAAAAAEAAAArAPf/AAADAAcAAAArAPj/AAAAAAEAAAArAPn/AAAAAAEAAAArAPr/AAADAAcAAAArAPv/AAAAAAEAAAArAPz/AAADAAcAAAArAP3/AAAAAAEAAAArAP7/AAADAAcAAAArAP//AAADAAcAAAArAAAAAAADAAkAAAArAAEAAAACAAgAAAArAAIAAAAIAAkAAAArAAMAAAABAAMAAAArAAQAAAABAAQAAAArAAUAAAABAAYAAAArAAYAAAABAAcAAAArAAcAAAAPAAYAAAArAAgAAAAQAAoAAAArAAkAAAADAAcAAAArAAoAAAACAAkAAAArAAsAAAAEAAgAAAArAAwAAAAHAAoAAAArAA0AAAAHAAoAAAArAA4AAAAFAAoAAAArAA8AAAAFAAoAAAArABAAAAAHAAkAAAArABEAAAAIAAkAAAArABIAAAAAAAAAAAArABMAAAAAAAAAAAArABQAAAAIAAkAAAArABUAAAAAAAAAAAArABYAAAAAAAAAAAArABcAAAAHAAoAAAArABgAAAAAAAAAAAArABkAAAAHAAkAAAArABoAAAAAAAAAAAArABsAAAAHAAoAAAArABwAAAAFAAkAAAArAB0AAAAFAAoAAAArAB4AAAAIAAkAAAArAB8AAAABAAMAAAArACAAAAABAAQAAAArACEAAAABAAQAAAArACIAAAABAAUAAAArACMAAAAFAAoAAAArACQAAAAFAAoAAAArACUAAAAIAAoAAAArACYAAAAIAAoAAAArACcAAAAHAAkAAAArACgAAAAIAAoAAAArACkAAAAIAAkAAAArACoAAAAFAAoAAAArACsAAAAIAAkAAAArACwAAAAFAAoAAAArAC0AAAAFAAkAAAArAC4AAAAHAAoAAAArAC8AAAAHAAkAAAArADAAAAAHAAkAAAArADEAAAAFAAkAAAArADIAAAAFAAkAAAArADMAAAAFAAoAAAAsAPD/AAADAAcAAAAsAPH/AAADAAcAAAAsAPL/AAADAAcAAAAsAPP/AAAAAAEAAAAsAPT/AAADAAcAAAAsAPX/AAADAAcAAAAsAPb/AAADAAcAAAAsAPf/AAADAAcAAAAsAPj/AAADAAcAAAAsAPn/AAADAAcAAAAsAPr/AAAAAAEAAAAsAPv/AAADAAcAAAAsAPz/AAADAAcAAAAsAP3/AAADAAcAAAAsAP7/AAAAAAEAAAAsAP//AAAAAAEAAAAsAAAAAAADAAcAAAAsAAEAAAADAAgAAAAsAAIAAAAIAAoAAAAsAAMAAAABAAMAAAAsAAQAAAABAAQAAAAsAAUAAAABAAQAAAAsAAYAAAAPAAYAAAAsAAcAAAAQAAoAAAAsAAgAAAADAAcAAAAsAAkAAAADAAcAAAAsAAoAAAADAAgAAAAsAAsAAAAFAAoAAAAsAAwAAAAHAAkAAAAsAA0AAAAFAAkAAAAsAA4AAAAIAAkAAAAsAA8AAAAIAAkAAAAsABAAAAAFAAoAAAAsABEAAAAFAAoAAAAsABIAAAAAAAAAAAAsABMAAAAFAAkAAAAsABQAAAAFAAoAAAAsABUAAAAHAAkAAAAsABYAAAAHAAoAAAAsABcAAAAIAAoAAAAsABgAAAAFAAoAAAAsABkAAAAAAAAAAAAsABoAAAAIAAoAAAAsABsAAAAFAAkAAAAsABwAAAAFAAkAAAAsAB0AAAAHAAoAAAAsAB4AAAAAAAAAAAAsAB8AAAABAAMAAAAsACAAAAABAAQAAAAsACEAAAABAAQAAAAsACIAAAABAAUAAAAsACMAAAAAAAAAAAAsACQAAAAIAAoAAAAsACUAAAAHAAkAAAAsACYAAAAFAAoAAAAsACcAAAAFAAkAAAAsACgAAAAFAAkAAAAsACkAAAAFAAkAAAAsACoAAAAAAAAAAAAsACsAAAAFAAoAAAAsACwAAAAFAAoAAAAsAC0AAAAHAAoAAAAsAC4AAAAIAAoAAAAsAC8AAAAHAAoAAAAsADAAAAAFAAoAAAAsADEAAAAFAAkAAAAsADIAAAAHAAkAAAAsADMAAAAIAAkAAAAtAPD/AAADAAcAAAAtAPH/AAADAAcAAAAtAPL/AAADAAcAAAAtAPP/AAADAAcAAAAtAPT/AAADAAcAAAAtAPX/AAADAAcAAAAtAPb/AAADAAcAAAAtAPf/AAADAAcAAAAtAPj/AAADAAcAAAAtAPn/AAADAAcAAAAtAPr/AAADAAcAAAAtAPv/AAADAAcAAAAtAPz/AAADAAcAAAAtAP3/AAAAAAEAAAAtAP7/AAADAAcAAAAtAP//AAADAAcAAAAtAAAAAAADAAcAAAAtAAEAAAADAAgAAAAtAAIAAAAHAAkAAAAtAAMAAAACAAMAAAAtAAQAAAACAAQAAAAtAAUAAAAAAAcAAAAtAAYAAAAQAAoAAAAtAAcAAAADAAcAAAAtAAgAAAADAAcAAAAtAAkAAAACAAkAAAAtAAoAAAAEAAgAAAAtAAsAAAAIAAkAAAAtAAwAAAAHAAkAAAAtAA0AAAAFAAkAAAAtAA4AAAAIAAoAAAAtAA8AAAAIAAkAAAAtABAAAAAFAAoAAAAtABEAAAAFAAoAAAAtABIAAAAHAAoAAAAtABMAAAAFAAkAAAAtABQAAAAHAAkAAAAtABUAAAAIAAkAAAAtABYAAAAHAAoAAAAtABcAAAAHAAkAAAAtABgAAAAAAAAAAAAtABkAAAAAAAAAAAAtABoAAAAHAAkAAAAtABsAAAAHAAkAAAAtABwAAAAAAAAAAAAtAB0AAAAFAAoAAAAtAB4AAAAHAAkAAAAtAB8AAAABAAMAAAAtACAAAAABAAQAAAAtACEAAAABAAQAAAAtACIAAAABAAUAAAAtACMAAAAFAAkAAAAtACQAAAAIAAkAAAAtACUAAAAFAAoAAAAtACYAAAAHAAoAAAAtACcAAAAFAAoAAAAtACgAAAAIAAoAAAAtACkAAAAHAAoAAAAtACoAAAAHAAoAAAAtACsAAAAAAAAAAAAtACwAAAAFAAkAAAAtAC0AAAAHAAoAAAAtAC4AAAAHAAoAAAAtAC8AAAAHAAkAAAAtADAAAAAFAAkAAAAtADEAAAAIAAoAAAAtADIAAAAIAAoAAAAtADMAAAAIAAkAAAAuAPD/AAADAAcAAAAuAPH/AAADAAcAAAAuAPL/AAADAAcAAAAuAPP/AAADAAcAAAAuAPT/AAAAAAEAAAAuAPX/AAADAAcAAAAuAPb/AAAAAAEAAAAuAPf/AAADAAcAAAAuAPj/AAADAAcAAAAuAPn/AAAAAAEAAAAuAPr/AAADAAcAAAAuAPv/AAAAAAEAAAAuAPz/AAADAAcAAAAuAP3/AAADAAcAAAAuAP7/AAADAAcAAAAuAP//AAADAAcAAAAuAAAAAAADAAcAAAAuAAEAAAADAAgAAAAuAAIAAAAIAAoAAAAuAAMAAAACAAYAAAAuAAQAAAACAAcAAAAuAAUAAAAAAAEAAAAuAAYAAAADAAcAAAAuAAcAAAADAAcAAAAuAAgAAAACAAkAAAAuAAkAAAAEAAgAAAAuAAoAAAAIAAoAAAAuAAsAAAAIAAkAAAAuAAwAAAAFAAoAAAAuAA0AAAAHAAoAAAAuAA4AAAAHAAoAAAAuAA8AAAAIAAoAAAAuABAAAAAFAAkAAAAuABEAAAAIAAoAAAAuABIAAAAIAAoAAAAuABMAAAAFAAkAAAAuABQAAAAIAAkAAAAuABUAAAAIAAkAAAAuABYAAAAIAAoAAAAuABcAAAAHAAkAAAAuABgAAAAFAAoAAAAuABkAAAAIAAoAAAAuABoAAAAAAAAAAAAuABsAAAAFAAkAAAAuABwAAAAIAAoAAAAuAB0AAAAHAAoAAAAuAB4AAAAFAAkAAAAuAB8AAAABAAMAAAAuACAAAAABAAQAAAAuACEAAAABAAQAAAAuACIAAAABAAYAAAAuACMAAAAAAAQAAAAuACQAAAAAAAQAAAAuACUAAAAAAAQAAAAuACYAAAAAAAQAAAAuACcAAAAAAAQAAAAuACgAAAAAAAQAAAAuACkAAAAAAAQAAAAuACoAAAAAAAQAAAAuACsAAAAAAAQAAAAuACwAAAAAAAQAAAAuAC0AAAAAAAQAAAAuAC4AAAAAAAQAAAAuAC8AAAAAAAQAAAAuADAAAAAAAAQAAAAuADEAAAAAAAQAAAAuADIAAAAAAAQAAAAuADMAAAALAA4AAAAvAPD/AAADAAcAAAAvAPH/AAADAAcAAAAvAPL/AAAAAAEAAAAvAPP/AAAAAAEAAAAvAPT/AAADAAcAAAAvAPX/AAADAAcAAAAvAPb/AAADAAcAAAAvAPf/AAADAAcAAAAvAPj/AAADAAcAAAAvAPn/AAADAAcAAAAvAPr/AAADAAcAAAAvAPv/AAAAAAEAAAAvAPz/AAAAAAEAAAAvAP3/AAADAAcAAAAvAP7/AAADAAcAAAAvAP//AAADAAcAAAAvAAAAAAAAAAEAAAAvAAEAAAADAAkAAAAvAAIAAAACAAcAAAAvAAMAAAADAAoAAAAvAAQAAAADAAcAAAAvAAUAAAADAAcAAAAvAAYAAAACAAkAAAAvAAcAAAAEAAcAAAAvAAgAAAAEAAgAAAAvAAkAAAAFAAkAAAAvAAoAAAAHAAkAAAAvAAsAAAAIAAkAAAAvAAwAAAAIAAoAAAAvAA0AAAAAAAAAAAAvAA4AAAAFAAkAAAAvAA8AAAAFAAkAAAAvABAAAAAFAAkAAAAvABEAAAAFAAoAAAAvABIAAAAHAAoAAAAvABMAAAAHAAoAAAAvABQAAAAFAAkAAAAvABUAAAAIAAkAAAAvABYAAAAIAAkAAAAvABcAAAAFAAoAAAAvABgAAAAFAAoAAAAvABkAAAAHAAkAAAAvABoAAAAIAAoAAAAvABsAAAAIAAkAAAAvABwAAAAHAAkAAAAvAB0AAAAIAAkAAAAvAB4AAAAIAAoAAAAvAB8AAAABAAMAAAAvACAAAAABAAQAAAAvACEAAAABAAQAAAAvACIAAAABAAQAAAAvACMAAAABAAQAAAAvACQAAAABAAQAAAAvACUAAAABAAQAAAAvACYAAAABAAQAAAAvACcAAAABAAQAAAAvACgAAAABAAQAAAAvACkAAAABAAQAAAAvACoAAAABAAQAAAAvACsAAAABAAQAAAAvACwAAAABAAQAAAAvAC0AAAABAAQAAAAvAC4AAAABAAQAAAAvAC8AAAABAAQAAAAvADAAAAABAAQAAAAvADEAAAABAAQAAAAvADIAAAABAAQAAAAvADMAAAAQAAYAAAAwAPD/AAADAAcAAAAwAPH/AAADAAcAAAAwAPL/AAAAAAEAAAAwAPP/AAAAAAEAAAAwAPT/AAAAAAEAAAAwAPX/AAADAAcAAAAwAPb/AAADAAcAAAAwAPf/AAADAAcAAAAwAPj/AAADAAcAAAAwAPn/AAAAAAEAAAAwAPr/AAADAAcAAAAwAPv/AAAAAAEAAAAwAPz/AAAAAAEAAAAwAP3/AAADAAcAAAAwAP7/AAADAAcAAAAwAP//AAADAAcAAAAwAAAAAAADAAcAAAAwAAEAAAADAAcAAAAwAAIAAAAAAAEAAAAwAAMAAAADAAcAAAAwAAQAAAADAAcAAAAwAAUAAAACAAkAAAAwAAYAAAAEAAgAAAAwAAcAAAAIAAoAAAAwAAgAAAAFAAoAAAAwAAkAAAAAAAAAAAAwAAoAAAAIAAkAAAAwAAsAAAAIAAkAAAAwAAwAAAAIAAoAAAAwAA0AAAAHAAoAAAAwAA4AAAAFAAkAAAAwAA8AAAAIAAkAAAAwABAAAAAIAAkAAAAwABEAAAAFAAkAAAAwABIAAAAFAAkAAAAwABMAAAAHAAkAAAAwABQAAAAIAAkAAAAwABUAAAAFAAkAAAAwABYAAAAFAAoAAAAwABcAAAAHAAoAAAAwABgAAAAIAAoAAAAwABkAAAAAAAAAAAAwABoAAAAHAAkAAAAwABsAAAAFAAoAAAAwABwAAAAAAAAAAAAwAB0AAAAIAAoAAAAwAB4AAAAIAAkAAAAwAB8AAAABAAMAAAAwACAAAAABAAQAAAAwACEAAAABAAQAAAAwACIAAAABAAQAAAAwACMAAAABAAQAAAAwACQAAAABAAQAAAAwACUAAAABAAQAAAAwACYAAAABAAQAAAAwACcAAAABAAQAAAAwACgAAAABAAQAAAAwACkAAAABAAQAAAAwACoAAAABAAQAAAAwACsAAAABAAQAAAAwACwAAAABAAQAAAAwAC0AAAABAAQAAAAwAC4AAAABAAQAAAAwAC8AAAABAAQAAAAwADAAAAABAAQAAAAwADEAAAABAAQAAAAwADIAAAABAAQAAAAwADMAAAAQAAYAAAAxAPD/AAADAAcAAAAxAPH/AAADAAcAAAAxAPL/AAADAAcAAAAxAPP/AAADAAcAAAAxAPT/AAADAAcAAAAxAPX/AAADAAcAAAAxAPb/AAADAAcAAAAxAPf/AAADAAcAAAAxAPj/AAADAAcAAAAxAPn/AAADAAcAAAAxAPr/AAADAAcAAAAxAPv/AAADAAcAAAAxAPz/AAADAAcAAAAxAP3/AAADAAcAAAAxAP7/AAADAAcAAAAxAP//AAAAAAEAAAAxAAAAAAAAAAEAAAAxAAEAAAADAAcAAAAxAAIAAAAAAAEAAAAxAAMAAAADAAcAAAAxAAQAAAACAAkAAAAxAAUAAAAEAAgAAAAxAAYAAAAFAAoAAAAxAAcAAAAIAAoAAAAxAAgAAAAFAAoAAAAxAAkAAAAAAAAAAAAxAAoAAAAAAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAIAAoAAAAxAA0AAAAIAAkAAAAxAA4AAAAIAAkAAAAxAA8AAAAIAAkAAAAxABAAAAAFAAoAAAAxABEAAAAAAAAAAAAxABIAAAAFAAkAAAAxABMAAAAFAAoAAAAxABQAAAAFAAkAAAAxABUAAAAFAAoAAAAxABYAAAAHAAkAAAAxABcAAAAFAAoAAAAxABgAAAAFAAoAAAAxABkAAAAFAAoAAAAxABoAAAAHAAkAAAAxABsAAAAIAAoAAAAxABwAAAAIAAoAAAAxAB0AAAAIAAkAAAAxAB4AAAAFAAoAAAAxAB8AAAABAAMAAAAxACAAAAABAAQAAAAxACEAAAABAAQAAAAxACIAAAABAAQAAAAxACMAAAABAAQAAAAxACQAAAABAAQAAAAxACUAAAABAAQAAAAxACYAAAABAAQAAAAxACcAAAABAAQAAAAxACgAAAABAAQAAAAxACkAAAABAAQAAAAxACoAAAABAAQAAAAxACsAAAABAAQAAAAxACwAAAABAAQAAAAxAC0AAAABAAQAAAAxAC4AAAABAAQAAAAxAC8AAAABAAQAAAAxADAAAAABAAQAAAAxADEAAAABAAQAAAAxADIAAAABAAQAAAAxADMAAAAQAAYAAAAyAPD/AAADAAcAAAAyAPH/AAADAAcAAAAyAPL/AAAAAAEAAAAyAPP/AAAAAAEAAAAyAPT/AAADAAcAAAAyAPX/AAADAAcAAAAyAPb/AAADAAcAAAAyAPf/AAADAAcAAAAyAPj/AAAAAAEAAAAyAPn/AAAAAAEAAAAyAPr/AAAAAAEAAAAyAPv/AAAAAAEAAAAyAPz/AAADAAcAAAAyAP3/AAADAAcAAAAyAP7/AAADAAcAAAAyAP//AAADAAcAAAAyAAAAAAADAAcAAAAyAAEAAAADAAcAAAAyAAIAAAADAAcAAAAyAAMAAAACAAkAAAAyAAQAAAAEAAgAAAAyAAUAAAAAAAAAAAAyAAYAAAAFAAoAAAAyAAcAAAAIAAoAAAAyAAgAAAAIAAkAAAAyAAkAAAAIAAoAAAAyAAoAAAAIAAoAAAAyAAsAAAAIAAkAAAAyAAwAAAAFAAkAAAAyAA0AAAAAAAAAAAAyAA4AAAAHAAoAAAAyAA8AAAAIAAkAAAAyABAAAAAFAAkAAAAyABEAAAAHAAoAAAAyABIAAAAHAAoAAAAyABMAAAAFAAkAAAAyABQAAAAAAAAAAAAyABUAAAAIAAoAAAAyABYAAAAHAAoAAAAyABcAAAAAAAAAAAAyABgAAAAHAAoAAAAyABkAAAAAAAAAAAAyABoAAAAHAAoAAAAyABsAAAAHAAoAAAAyABwAAAAHAAkAAAAyAB0AAAAFAAkAAAAyAB4AAAAAAAMAAAAyAB8AAAABAAcAAAAyACAAAAABAAQAAAAyACEAAAABAAQAAAAyACIAAAABAAQAAAAyACMAAAAAAAYAAAAyACQAAAACAAQAAAAyACUAAAACAAQAAAAyACYAAAACAAQAAAAyACcAAAACAAQAAAAyACgAAAACAAQAAAAyACkAAAACAAQAAAAyACoAAAACAAQAAAAyACsAAAACAAQAAAAyACwAAAACAAQAAAAyAC0AAAACAAQAAAAyAC4AAAACAAQAAAAyAC8AAAACAAQAAAAyADAAAAACAAQAAAAyADEAAAACAAQAAAAyADIAAAACAAQAAAAyADMAAAAKAA4AAAAzAPD/AAADAAcAAAAzAPH/AAADAAcAAAAzAPL/AAAAAAEAAAAzAPP/AAADAAcAAAAzAPT/AAADAAcAAAAzAPX/AAAAAAEAAAAzAPb/AAAAAAEAAAAzAPf/AAADAAcAAAAzAPj/AAAAAAEAAAAzAPn/AAADAAcAAAAzAPr/AAADAAcAAAAzAPv/AAADAAcAAAAzAPz/AAADAAcAAAAzAP3/AAADAAcAAAAzAP7/AAADAAcAAAAzAP//AAADAAcAAAAzAAAAAAADAAcAAAAzAAEAAAAAAAEAAAAzAAIAAAACAAkAAAAzAAMAAAAEAAgAAAAzAAQAAAAIAAkAAAAzAAUAAAAFAAkAAAAzAAYAAAAHAAkAAAAzAAcAAAAHAAoAAAAzAAgAAAAFAAoAAAAzAAkAAAAHAAoAAAAzAAoAAAAHAAoAAAAzAAsAAAAFAAoAAAAzAAwAAAAFAAoAAAAzAA0AAAAIAAoAAAAzAA4AAAAHAAoAAAAzAA8AAAAHAAkAAAAzABAAAAAFAAkAAAAzABEAAAAHAAoAAAAzABIAAAAIAAoAAAAzABMAAAAFAAoAAAAzABQAAAAFAAkAAAAzABUAAAAHAAoAAAAzABYAAAAHAAkAAAAzABcAAAAIAAkAAAAzABgAAAAIAAkAAAAzABkAAAAIAAoAAAAzABoAAAAIAAoAAAAzABsAAAAFAAoAAAAzABwAAAAIAAoAAAAzAB0AAAAAAAMAAAAzAB4AAAABAAcAAAAzAB8AAAABAAQAAAAzACAAAAABAAQAAAAzACEAAAABAAQAAAAzACIAAAABAAQAAAAzACMAAAABAAUAAAAzACQAAAAIAAkAAAAzACUAAAAAAAAAAAAzACYAAAAIAAkAAAAzACcAAAAIAAoAAAAzACgAAAAHAAoAAAAzACkAAAAHAAoAAAAzACoAAAAAAAAAAAAzACsAAAAIAAoAAAAzACwAAAAHAAkAAAAzAC0AAAAIAAoAAAAzAC4AAAAIAAkAAAAzAC8AAAAFAAkAAAAzADAAAAAHAAoAAAAzADEAAAAIAAkAAAAzADIAAAAIAAkAAAAzADMAAAAAAAAAAAA0APD/AAADAAcAAAA0APH/AAADAAcAAAA0APL/AAADAAcAAAA0APP/AAADAAcAAAA0APT/AAADAAcAAAA0APX/AAAAAAEAAAA0APb/AAADAAcAAAA0APf/AAADAAcAAAA0APj/AAADAAcAAAA0APn/AAADAAcAAAA0APr/AAAAAAEAAAA0APv/AAADAAcAAAA0APz/AAADAAcAAAA0AP3/AAADAAcAAAA0AP7/AAADAAcAAAA0AP//AAADAAcAAAA0AAAAAAADAAcAAAA0AAEAAAADAAcAAAA0AAIAAAADAAgAAAA0AAMAAAAFAAoAAAA0AAQAAAAHAAoAAAA0AAUAAAAAAAAAAAA0AAYAAAAHAAkAAAA0AAcAAAAHAAoAAAA0AAgAAAAIAAkAAAA0AAkAAAAFAAoAAAA0AAoAAAAFAAkAAAA0AAsAAAAHAAoAAAA0AAwAAAAFAAoAAAA0AA0AAAAFAAkAAAA0AA4AAAAHAAkAAAA0AA8AAAAHAAkAAAA0ABAAAAAHAAoAAAA0ABEAAAAIAAoAAAA0ABIAAAAHAAoAAAA0ABMAAAAHAAoAAAA0ABQAAAAHAAoAAAA0ABUAAAAFAAoAAAA0ABYAAAAIAAkAAAA0ABcAAAAFAAkAAAA0ABgAAAAHAAoAAAA0ABkAAAAIAAoAAAA0ABoAAAAFAAoAAAA0ABsAAAAFAAkAAAA0ABwAAAAHAAoAAAA0AB0AAAABAAMAAAA0AB4AAAABAAQAAAA0AB8AAAABAAQAAAA0ACAAAAABAAQAAAA0ACEAAAABAAQAAAA0ACIAAAABAAQAAAA0ACMAAAABAAUAAAA0ACQAAAAFAAkAAAA0ACUAAAAIAAoAAAA0ACYAAAAAAAAAAAA0ACcAAAAIAAkAAAA0ACgAAAAHAAkAAAA0ACkAAAAHAAkAAAA0ACoAAAAHAAkAAAA0ACsAAAAIAAoAAAA0ACwAAAAIAAkAAAA0AC0AAAAFAAoAAAA0AC4AAAAFAAkAAAA0AC8AAAAHAAoAAAA0ADAAAAAHAAkAAAA0ADEAAAAIAAkAAAA0ADIAAAAIAAoAAAA0ADMAAAAAAAAAAAA1APD/AAADAAcAAAA1APH/AAADAAcAAAA1APL/AAADAAcAAAA1APP/AAADAAcAAAA1APT/AAAAAAEAAAA1APX/AAADAAcAAAA1APb/AAAAAAEAAAA1APf/AAAAAAEAAAA1APj/AAADAAcAAAA1APn/AAADAAcAAAA1APr/AAADAAcAAAA1APv/AAAAAAEAAAA1APz/AAADAAcAAAA1AP3/AAADAAcAAAA1AP7/AAADAAcAAAA1AP//AAAAAAEAAAA1AAAAAAAAAAEAAAA1AAEAAAADAAcAAAA1AAIAAAADAAgAAAA1AAMAAAAFAAoAAAA1AAQAAAAFAAkAAAA1AAUAAAAFAAoAAAA1AAYAAAAIAAoAAAA1AAcAAAAHAAoAAAA1AAgAAAAIAAoAAAA1AAkAAAAFAAkAAAA1AAoAAAAHAAkAAAA1AAsAAAAIAAkAAAA1AAwAAAAFAAkAAAA1AA0AAAAIAAkAAAA1AA4AAAAIAAkAAAA1AA8AAAAIAAoAAAA1ABAAAAAHAAoAAAA1ABEAAAAHAAkAAAA1ABIAAAAIAAkAAAA1ABMAAAAHAAoAAAA1ABQAAAAHAAoAAAA1ABUAAAAIAAkAAAA1ABYAAAAIAAkAAAA1ABcAAAAIAAoAAAA1ABgAAAAAAAAAAAA1ABkAAAAIAAkAAAA1ABoAAAAFAAkAAAA1ABsAAAAHAAoAAAA1ABwAAAAAAAMAAAA1AB0AAAABAAcAAAA1AB4AAAABAAQAAAA1AB8AAAABAAQAAAA1ACAAAAAAAAYAAAA1ACEAAAABAAQAAAA1ACIAAAABAAQAAAA1ACMAAAABAAUAAAA1ACQAAAAFAAkAAAA1ACUAAAAHAAkAAAA1ACYAAAAIAAkAAAA1ACcAAAAIAAoAAAA1ACgAAAAFAAkAAAA1ACkAAAAIAAkAAAA1ACoAAAAHAAkAAAA1ACsAAAAHAAkAAAA1ACwAAAAFAAkAAAA1AC0AAAAFAAkAAAA1AC4AAAAFAAoAAAA1AC8AAAAFAAkAAAA1ADAAAAAFAAkAAAA1ADEAAAAFAAkAAAA1ADIAAAAFAAkAAAA1ADMAAAAHAAkAAAA2APD/AAADAAcAAAA2APH/AAADAAcAAAA2APL/AAADAAcAAAA2APP/AAADAAcAAAA2APT/AAADAAcAAAA2APX/AAAAAAEAAAA2APb/AAADAAcAAAA2APf/AAAAAAEAAAA2APj/AAADAAcAAAA2APn/AAADAAcAAAA2APr/AAADAAcAAAA2APv/AAADAAcAAAA2APz/AAAAAAEAAAA2AP3/AAADAAcAAAA2AP7/AAADAAcAAAA2AP//AAADAAcAAAA2AAAAAAADAAcAAAA2AAEAAAADAAcAAAA2AAIAAAADAAgAAAA2AAMAAAAHAAoAAAA2AAQAAAAIAAkAAAA2AAUAAAAFAAoAAAA2AAYAAAAHAAoAAAA2AAcAAAAIAAoAAAA2AAgAAAAIAAoAAAA2AAkAAAAFAAkAAAA2AAoAAAAHAAoAAAA2AAsAAAAHAAoAAAA2AAwAAAAIAAoAAAA2AA0AAAAHAAoAAAA2AA4AAAAIAAoAAAA2AA8AAAAHAAoAAAA2ABAAAAAIAAkAAAA2ABEAAAAHAAkAAAA2ABIAAAAIAAkAAAA2ABMAAAAHAAkAAAA2ABQAAAAIAAkAAAA2ABUAAAAHAAkAAAA2ABYAAAAFAAoAAAA2ABcAAAAFAAoAAAA2ABgAAAAHAAkAAAA2ABkAAAAHAAoAAAA2ABoAAAAHAAkAAAA2ABsAAAAAAAMAAAA2ABwAAAABAAcAAAA2AB0AAAABAAQAAAA2AB4AAAABAAQAAAA2AB8AAAABAAQAAAA2ACAAAAABAAUAAAA2ACEAAAABAAQAAAA2ACIAAAABAAQAAAA2ACMAAAABAAUAAAA2ACQAAAAIAAoAAAA2ACUAAAAHAAkAAAA2ACYAAAAIAAkAAAA2ACcAAAAAAAAAAAA2ACgAAAAFAAoAAAA2ACkAAAAIAAoAAAA2ACoAAAAFAAkAAAA2ACsAAAAFAAkAAAA2ACwAAAAIAAoAAAA2AC0AAAAFAAoAAAA2AC4AAAAHAAkAAAA2AC8AAAAFAAkAAAA2ADAAAAAHAAoAAAA2ADEAAAAHAAoAAAA2ADIAAAAFAAoAAAA2ADMAAAAFAAoAAAA3APD/AAADAAcAAAA3APH/AAADAAcAAAA3APL/AAADAAcAAAA3APP/AAADAAcAAAA3APT/AAADAAcAAAA3APX/AAAAAAEAAAA3APb/AAADAAcAAAA3APf/AAADAAcAAAA3APj/AAADAAcAAAA3APn/AAADAAcAAAA3APr/AAADAAcAAAA3APv/AAAAAAEAAAA3APz/AAADAAcAAAA3AP3/AAADAAcAAAA3AP7/AAADAAcAAAA3AP//AAADAAcAAAA3AAAAAAADAAcAAAA3AAEAAAACAAkAAAA3AAIAAAAEAAgAAAA3AAMAAAAHAAoAAAA3AAQAAAAIAAkAAAA3AAUAAAAHAAkAAAA3AAYAAAAIAAkAAAA3AAcAAAAIAAkAAAA3AAgAAAAAAAAAAAA3AAkAAAAFAAoAAAA3AAoAAAAAAAAAAAA3AAsAAAAHAAkAAAA3AAwAAAAFAAkAAAA3AA0AAAAIAAkAAAA3AA4AAAAAAAAAAAA3AA8AAAAIAAoAAAA3ABAAAAAHAAkAAAA3ABEAAAAFAAoAAAA3ABIAAAAAAAAAAAA3ABMAAAAHAAoAAAA3ABQAAAAAAAAAAAA3ABUAAAAHAAoAAAA3ABYAAAAHAAkAAAA3ABcAAAAIAAkAAAA3ABgAAAAAAAAAAAA3ABkAAAAFAAkAAAA3ABoAAAAHAAkAAAA3ABsAAAABAAMAAAA3ABwAAAABAAQAAAA3AB0AAAABAAQAAAA3AB4AAAABAAQAAAA3AB8AAAAAAAYAAAA3ACAAAAACAAUAAAA3ACEAAAABAAQAAAA3ACIAAAABAAQAAAA3ACMAAAABAAUAAAA3ACQAAAAFAAoAAAA3ACUAAAAIAAkAAAA3ACYAAAAIAAkAAAA3ACcAAAAHAAkAAAA3ACgAAAAIAAoAAAA3ACkAAAAFAAkAAAA3ACoAAAAHAAkAAAA3ACsAAAAFAAoAAAA3ACwAAAAIAAkAAAA3AC0AAAAAAAAAAAA3AC4AAAAHAAkAAAA3AC8AAAAAAAAAAAA3ADAAAAAFAAkAAAA3ADEAAAAFAAkAAAA3ADIAAAAAAAAAAAA3ADMAAAAFAAkAAAA4APD/AAADAAcAAAA4APH/AAADAAcAAAA4APL/AAAAAAEAAAA4APP/AAAAAAEAAAA4APT/AAADAAcAAAA4APX/AAACAAkAAAA4APb/AAAEAAcAAAA4APf/AAAEAAcAAAA4APj/AAAEAAcAAAA4APn/AAAEAAcAAAA4APr/AAACAAoAAAA4APv/AAADAAcAAAA4APz/AAADAAcAAAA4AP3/AAADAAcAAAA4AP7/AAAAAAEAAAA4AP//AAACAAkAAAA4AAAAAAAEAAcAAAA4AAEAAAAEAAgAAAA4AAIAAAAFAAoAAAA4AAMAAAAIAAkAAAA4AAQAAAAFAAkAAAA4AAUAAAAFAAoAAAA4AAYAAAAIAAoAAAA4AAcAAAAHAAkAAAA4AAgAAAAHAAkAAAA4AAkAAAAFAAkAAAA4AAoAAAAFAAoAAAA4AAsAAAAFAAkAAAA4AAwAAAAIAAoAAAA4AA0AAAAIAAkAAAA4AA4AAAAFAAoAAAA4AA8AAAAFAAoAAAA4ABAAAAAHAAoAAAA4ABEAAAAIAAkAAAA4ABIAAAAIAAoAAAA4ABMAAAAIAAkAAAA4ABQAAAAAAAAAAAA4ABUAAAAHAAkAAAA4ABYAAAAAAAAAAAA4ABcAAAAHAAkAAAA4ABgAAAAIAAkAAAA4ABkAAAAIAAoAAAA4ABoAAAAAAAMAAAA4ABsAAAABAAcAAAA4ABwAAAABAAQAAAA4AB0AAAABAAQAAAA4AB4AAAAAAAYAAAA4AB8AAAACAAUAAAA4ACAAAAABAAMAAAA4ACEAAAABAAQAAAA4ACIAAAABAAQAAAA4ACMAAAABAAUAAAA4ACQAAAAHAAkAAAA4ACUAAAAIAAoAAAA4ACYAAAAFAAoAAAA4ACcAAAAHAAoAAAA4ACgAAAAHAAkAAAA4ACkAAAAFAAkAAAA4ACoAAAAFAAoAAAA4ACsAAAAAAAAAAAA4ACwAAAAIAAkAAAA4AC0AAAAIAAoAAAA4AC4AAAAIAAkAAAA4AC8AAAAFAAkAAAA4ADAAAAAFAAkAAAA4ADEAAAAHAAkAAAA4ADIAAAAHAAoAAAA4ADMAAAAFAAkAAAA5APD/AAADAAcAAAA5APH/AAADAAcAAAA5APL/AAADAAcAAAA5APP/AAADAAcAAAA5APT/AAACAAkAAAA5APX/AAAEAAgAAAA5APb/AAAFAAkAAAA5APf/AAAAAAAAAAA5APj/AAAIAAkAAAA5APn/AAAFAAkAAAA5APr/AAAEAAYAAAA5APv/AAAEAAcAAAA5APz/AAAEAAcAAAA5AP3/AAAEAAcAAAA5AP7/AAAEAAcAAAA5AP//AAAEAAgAAAA5AAAAAAAIAAkAAAA5AAEAAAAFAAkAAAA5AAIAAAAHAAkAAAA5AAMAAAAFAAkAAAA5AAQAAAAFAAkAAAA5AAUAAAAFAAoAAAA5AAYAAAAIAAoAAAA5AAcAAAAHAAoAAAA5AAgAAAAFAAoAAAA5AAkAAAAIAAoAAAA5AAoAAAAFAAkAAAA5AAsAAAAFAAoAAAA5AAwAAAAFAAkAAAA5AA0AAAAIAAoAAAA5AA4AAAAFAAkAAAA5AA8AAAAIAAoAAAA5ABAAAAAFAAoAAAA5ABEAAAAFAAkAAAA5ABIAAAAAAAAAAAA5ABMAAAAHAAoAAAA5ABQAAAAAAAAAAAA5ABUAAAAIAAoAAAA5ABYAAAAIAAoAAAA5ABcAAAAHAAkAAAA5ABgAAAAHAAkAAAA5ABkAAAAHAAkAAAA5ABoAAAABAAMAAAA5ABsAAAABAAQAAAA5ABwAAAABAAQAAAA5AB0AAAABAAQAAAA5AB4AAAABAAUAAAA5AB8AAAAIAAkAAAA5ACAAAAABAAMAAAA5ACEAAAABAAQAAAA5ACIAAAABAAQAAAA5ACMAAAABAAUAAAA5ACQAAAAAAAAAAAA5ACUAAAAFAAoAAAA5ACYAAAAFAAoAAAA5ACcAAAAIAAoAAAA5ACgAAAAIAAoAAAA5ACkAAAAHAAoAAAA5ACoAAAAFAAkAAAA5ACsAAAAHAAoAAAA5ACwAAAAFAAoAAAA5AC0AAAAHAAoAAAA5AC4AAAAIAAkAAAA5AC8AAAAFAAoAAAA5ADAAAAAFAAkAAAA5ADEAAAAFAAoAAAA5ADIAAAAHAAoAAAA5ADMAAAAIAAkAAAA6APD/AAAAAAEAAAA6APH/AAADAAcAAAA6APL/AAACAAkAAAA6APP/AAAEAAcAAAA6APT/AAAEAAgAAAA6APX/AAAHAAkAAAA6APb/AAAIAAoAAAA6APf/AAAIAAoAAAA6APj/AAAFAAkAAAA6APn/AAAAAAAAAAA6APr/AAAHAAkAAAA6APv/AAAHAAkAAAA6APz/AAAFAAoAAAA6AP3/AAAIAAoAAAA6AP7/AAAAAAAAAAA6AP//AAAIAAkAAAA6AAAAAAAHAAoAAAA6AAEAAAAFAAoAAAA6AAIAAAAHAAoAAAA6AAMAAAAAAAAAAAA6AAQAAAAHAAkAAAA6AAUAAAAIAAoAAAA6AAYAAAAFAAoAAAA6AAcAAAAHAAkAAAA6AAgAAAAFAAkAAAA6AAkAAAAHAAoAAAA6AAoAAAAHAAoAAAA6AAsAAAAIAAoAAAA6AAwAAAAAAAAAAAA6AA0AAAAIAAoAAAA6AA4AAAAFAAkAAAA6AA8AAAAIAAoAAAA6ABAAAAAAAAAAAAA6ABEAAAAIAAoAAAA6ABIAAAAHAAkAAAA6ABMAAAAFAAkAAAA6ABQAAAAFAAkAAAA6ABUAAAAIAAkAAAA6ABYAAAAIAAkAAAA6ABcAAAAIAAkAAAA6ABgAAAAHAAkAAAA6ABkAAAAAAAMAAAA6ABoAAAABAAcAAAA6ABsAAAABAAQAAAA6ABwAAAABAAQAAAA6AB0AAAAAAAYAAAA6AB4AAAACAAUAAAA6AB8AAAAIAAkAAAA6ACAAAAABAAMAAAA6ACEAAAABAAQAAAA6ACIAAAABAAQAAAA6ACMAAAABAAUAAAA6ACQAAAAIAAoAAAA6ACUAAAAIAAoAAAA6ACYAAAAIAAoAAAA6ACcAAAAAAAAAAAA6ACgAAAAIAAkAAAA6ACkAAAAFAAkAAAA6ACoAAAAAAAAAAAA6ACsAAAAHAAoAAAA6ACwAAAAIAAkAAAA6AC0AAAAIAAoAAAA6AC4AAAAHAAoAAAA6AC8AAAAFAAoAAAA6ADAAAAAIAAoAAAA6ADEAAAAAAAAAAAA6ADIAAAAAAAAAAAA6ADMAAAAFAAkAAAA7APD/AAAEAAcAAAA7APH/AAAEAAcAAAA7APL/AAAEAAgAAAA7APP/AAAHAAkAAAA7APT/AAAHAAoAAAA7APX/AAAIAAoAAAA7APb/AAAHAAoAAAA7APf/AAAHAAoAAAA7APj/AAAHAAoAAAA7APn/AAAAAAAAAAA7APr/AAAAAAAAAAA7APv/AAAFAAoAAAA7APz/AAAAAAAAAAA7AP3/AAAFAAoAAAA7AP7/AAAIAAkAAAA7AP//AAAFAAkAAAA7AAAAAAAIAAoAAAA7AAEAAAAIAAoAAAA7AAIAAAAIAAkAAAA7AAMAAAAFAAkAAAA7AAQAAAAAAAAAAAA7AAUAAAAHAAkAAAA7AAYAAAAFAAoAAAA7AAcAAAAFAAkAAAA7AAgAAAAIAAkAAAA7AAkAAAAFAAoAAAA7AAoAAAAHAAkAAAA7AAsAAAAHAAkAAAA7AAwAAAAHAAoAAAA7AA0AAAAHAAkAAAA7AA4AAAAHAAkAAAA7AA8AAAAHAAkAAAA7ABAAAAAHAAoAAAA7ABEAAAAFAAkAAAA7ABIAAAAIAAkAAAA7ABMAAAAFAAoAAAA7ABQAAAAIAAoAAAA7ABUAAAAAAAAAAAA7ABYAAAAFAAoAAAA7ABcAAAAIAAoAAAA7ABgAAAAAAAMAAAA7ABkAAAABAAcAAAA7ABoAAAABAAQAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAYAAAA7AB0AAAACAAUAAAA7AB4AAAAIAAoAAAA7AB8AAAAIAAkAAAA7ACAAAAABAAMAAAA7ACEAAAABAAQAAAA7ACIAAAABAAQAAAA7ACMAAAABAAUAAAA7ACQAAAAFAAkAAAA7ACUAAAAIAAoAAAA7ACYAAAAFAAkAAAA7ACcAAAAHAAoAAAA7ACgAAAAHAAoAAAA7ACkAAAAHAAoAAAA7ACoAAAAAAAAAAAA7ACsAAAAAAAAAAAA7ACwAAAAFAAkAAAA7AC0AAAAIAAoAAAA7AC4AAAAHAAoAAAA7AC8AAAAAAAAAAAA7ADAAAAAFAAkAAAA7ADEAAAAHAAoAAAA7ADIAAAAHAAoAAAA7ADMAAAAAAAkAAAA8APD/AAABAAsAAAA8APH/AAAFAAoAAAA8APL/AAAHAAoAAAA8APP/AAAFAAkAAAA8APT/AAAFAAoAAAA8APX/AAAHAAoAAAA8APb/AAAAAAAAAAA8APf/AAAFAAkAAAA8APj/AAAHAAkAAAA8APn/AAAHAAoAAAA8APr/AAAFAAkAAAA8APv/AAAIAAoAAAA8APz/AAAIAAkAAAA8AP3/AAAFAAkAAAA8AP7/AAAIAAkAAAA8AP//AAAHAAoAAAA8AAAAAAAIAAoAAAA8AAEAAAAIAAkAAAA8AAIAAAAIAAoAAAA8AAMAAAAIAAkAAAA8AAQAAAAAAAAAAAA8AAUAAAAHAAkAAAA8AAYAAAAFAAoAAAA8AAcAAAAHAAoAAAA8AAgAAAAAAAAAAAA8AAkAAAAIAAkAAAA8AAoAAAAHAAoAAAA8AAsAAAAFAAoAAAA8AAwAAAAAAAAAAAA8AA0AAAAHAAoAAAA8AA4AAAAIAAkAAAA8AA8AAAAIAAoAAAA8ABAAAAAAAAAAAAA8ABEAAAAHAAkAAAA8ABIAAAAHAAoAAAA8ABMAAAAHAAoAAAA8ABQAAAAAAAAAAAA8ABUAAAAFAAkAAAA8ABYAAAAHAAoAAAA8ABcAAAAAAAMAAAA8ABgAAAABAAcAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAAAAAYAAAA8ABwAAAACAAUAAAA8AB0AAAAFAAkAAAA8AB4AAAAIAAkAAAA8AB8AAAAIAAkAAAA8ACAAAAABAAMAAAA8ACEAAAABAAQAAAA8ACIAAAABAAQAAAA8ACMAAAABAAUAAAA8ACQAAAAFAAoAAAA8ACUAAAAAAAAAAAA8ACYAAAAHAAoAAAA8ACcAAAAFAAoAAAA8ACgAAAAFAAoAAAA8ACkAAAAFAAkAAAA8ACoAAAAIAAoAAAA8ACsAAAAIAAkAAAA8ACwAAAAIAAoAAAA8AC0AAAAFAAoAAAA8AC4AAAAFAAoAAAA8AC8AAAAFAAkAAAA8ADAAAAAFAAoAAAA8ADEAAAAFAAoAAAA8ADIAAAAHAAoAAAA8ADMAAAABAAkAAAA9APD/AAABAAsAAAA9APH/AAAFAAkAAAA9APL/AAAIAAkAAAA9APP/AAAIAAkAAAA9APT/AAAHAAoAAAA9APX/AAAHAAkAAAA9APb/AAAFAAoAAAA9APf/AAAIAAkAAAA9APj/AAAHAAoAAAA9APn/AAAHAAkAAAA9APr/AAAFAAkAAAA9APv/AAAHAAoAAAA9APz/AAAAAAAAAAA9AP3/AAAHAAkAAAA9AP7/AAAFAAoAAAA9AP//AAAAAAAAAAA9AAAAAAAHAAkAAAA9AAEAAAAAAAAAAAA9AAIAAAAAAAAAAAA9AAMAAAAFAAkAAAA9AAQAAAAIAAkAAAA9AAUAAAAFAAkAAAA9AAYAAAAHAAkAAAA9AAcAAAAFAAoAAAA9AAgAAAAAAAAAAAA9AAkAAAAHAAkAAAA9AAoAAAAHAAkAAAA9AAsAAAAFAAoAAAA9AAwAAAAFAAoAAAA9AA0AAAAAAAAAAAA9AA4AAAAIAAoAAAA9AA8AAAAIAAkAAAA9ABAAAAAFAAkAAAA9ABEAAAAHAAoAAAA9ABIAAAAIAAoAAAA9ABMAAAAHAAkAAAA9ABQAAAAHAAoAAAA9ABUAAAAHAAkAAAA9ABYAAAAAAAMAAAA9ABcAAAABAAcAAAA9ABgAAAABAAQAAAA9ABkAAAABAAQAAAA9ABoAAAAAAAYAAAA9ABsAAAACAAUAAAA9ABwAAAAFAAoAAAA9AB0AAAAFAAkAAAA9AB4AAAAFAAoAAAA9AB8AAAAIAAoAAAA9ACAAAAABAAMAAAA9ACEAAAABAAQAAAA9ACIAAAABAAQAAAA9ACMAAAABAAUAAAA9ACQAAAAIAAkAAAA9ACUAAAAFAAkAAAA9ACYAAAAHAAkAAAA9ACcAAAAAAAAAAAA9ACgAAAAHAAkAAAA9ACkAAAAHAAoAAAA9ACoAAAAIAAkAAAA9ACsAAAAAAAAAAAA9ACwAAAAFAAoAAAA9AC0AAAAIAAkAAAA9AC4AAAAHAAkAAAA9AC8AAAAFAAoAAAA9ADAAAAAIAAoAAAA9ADEAAAAIAAoAAAA9ADIAAAAAAAAAAAA9ADMAAAAHAAoAAAA+APD/AAABAAsAAAA+APH/AAAAAAAAAAA+APL/AAAAAAAAAAA+APP/AAAFAAoAAAA+APT/AAAFAAkAAAA+APX/AAAAAAAAAAA+APb/AAAAAAAAAAA+APf/AAAFAAoAAAA+APj/AAAHAAoAAAA+APn/AAAIAAkAAAA+APr/AAAHAAkAAAA+APv/AAAFAAoAAAA+APz/AAAIAAoAAAA+AP3/AAAHAAkAAAA+AP7/AAAIAAoAAAA+AP//AAAAAAAAAAA+AAAAAAAHAAoAAAA+AAEAAAAFAAkAAAA+AAIAAAAIAAkAAAA+AAMAAAAHAAoAAAA+AAQAAAAFAAkAAAA+AAUAAAAIAAkAAAA+AAYAAAAHAAoAAAA+AAcAAAAFAAoAAAA+AAgAAAAIAAkAAAA+AAkAAAAAAAAAAAA+AAoAAAAIAAoAAAA+AAsAAAAAAAAAAAA+AAwAAAAAAAAAAAA+AA0AAAAHAAoAAAA+AA4AAAAHAAkAAAA+AA8AAAAFAAoAAAA+ABAAAAAAAAAAAAA+ABEAAAAFAAkAAAA+ABIAAAAAAAAAAAA+ABMAAAAHAAoAAAA+ABQAAAAAAAAAAAA+ABUAAAAAAAMAAAA+ABYAAAABAAcAAAA+ABcAAAABAAQAAAA+ABgAAAABAAQAAAA+ABkAAAAAAAYAAAA+ABoAAAACAAUAAAA+ABsAAAAHAAkAAAA+ABwAAAAHAAoAAAA+AB0AAAAHAAoAAAA+AB4AAAAIAAoAAAA+AB8AAAAFAAkAAAA+ACAAAAABAAMAAAA+ACEAAAABAAQAAAA+ACIAAAABAAQAAAA+ACMAAAABAAUAAAA+ACQAAAAHAAoAAAA+ACUAAAAFAAkAAAA+ACYAAAAHAAoAAAA+ACcAAAAHAAkAAAA+ACgAAAAIAAkAAAA+ACkAAAAIAAkAAAA+ACoAAAAIAAoAAAA+ACsAAAAFAAoAAAA+ACwAAAAFAAkAAAA+AC0AAAAFAAoAAAA+AC4AAAAFAAoAAAA+AC8AAAAHAAkAAAA+ADAAAAAFAAkAAAA+ADEAAAAHAAkAAAA+ADIAAAAIAAkAAAA+ADMAAAAAAAAAAAA/APD/AAABAAsAAAA/APH/AAAFAAkAAAA/APL/AAAIAAkAAAA/APP/AAAIAAkAAAA/APT/AAAHAAoAAAA/APX/AAAFAAoAAAA/APb/AAAHAAkAAAA/APf/AAAHAAoAAAA/APj/AAAFAAkAAAA/APn/AAAHAAkAAAA/APr/AAAFAAkAAAA/APv/AAAFAAoAAAA/APz/AAAIAAoAAAA/AP3/AAAFAAkAAAA/AP7/AAAAAAAAAAA/AP//AAAIAAkAAAA/AAAAAAAFAAoAAAA/AAEAAAAHAAkAAAA/AAIAAAAFAAkAAAA/AAMAAAAAAAAAAAA/AAQAAAAFAAoAAAA/AAUAAAAFAAkAAAA/AAYAAAAAAAAAAAA/AAcAAAAAAAAAAAA/AAgAAAAIAAoAAAA/AAkAAAAHAAoAAAA/AAoAAAAHAAoAAAA/AAsAAAAHAAkAAAA/AAwAAAAIAAoAAAA/AA0AAAAFAAkAAAA/AA4AAAAHAAkAAAA/AA8AAAAFAAkAAAA/ABAAAAAHAAoAAAA/ABEAAAAIAAkAAAA/ABIAAAAIAAoAAAA/ABMAAAAHAAkAAAA/ABQAAAAIAAkAAAA/ABUAAAABAAMAAAA/ABYAAAABAAQAAAA/ABcAAAABAAQAAAA/ABgAAAAAAAYAAAA/ABkAAAACAAUAAAA/ABoAAAAFAAoAAAA/ABsAAAAIAAoAAAA/ABwAAAAIAAoAAAA/AB0AAAAHAAkAAAA/AB4AAAAAAAAAAAA/AB8AAAAIAAkAAAA/ACAAAAABAAMAAAA/ACEAAAABAAQAAAA/ACIAAAABAAQAAAA/ACMAAAABAAUAAAA/ACQAAAAIAAkAAAA/ACUAAAAIAAoAAAA/ACYAAAAAAAAAAAA/ACcAAAAIAAkAAAA/ACgAAAAIAAoAAAA/ACkAAAAIAAoAAAA/ACoAAAAIAAoAAAA/ACsAAAAHAAkAAAA/ACwAAAAIAAoAAAA/AC0AAAAHAAoAAAA/AC4AAAAHAAkAAAA/AC8AAAAFAAkAAAA/ADAAAAAFAAoAAAA/ADEAAAAHAAoAAAA/ADIAAAAFAAkAAAA/ADMAAAAFAAkAAABAAPD/AAABAAsAAABAAPH/AAAIAAkAAABAAPL/AAAFAAkAAABAAPP/AAAHAAkAAABAAPT/AAAAAAAAAABAAPX/AAAFAAkAAABAAPb/AAAIAAoAAABAAPf/AAAIAAoAAABAAPj/AAAHAAkAAABAAPn/AAAAAAAAAABAAPr/AAAFAAkAAABAAPv/AAAIAAkAAABAAPz/AAAHAAkAAABAAP3/AAAHAAoAAABAAP7/AAAAAAAAAABAAP//AAAIAAkAAABAAAAAAAAFAAoAAABAAAEAAAAIAAoAAABAAAIAAAAAAAAAAABAAAMAAAAHAAkAAABAAAQAAAAIAAoAAABAAAUAAAAAAAAAAABAAAYAAAAFAAoAAABAAAcAAAAIAAkAAABAAAgAAAAHAAoAAABAAAkAAAAAAAAAAABAAAoAAAAHAAkAAABAAAsAAAAAAAAAAABAAAwAAAAHAAkAAABAAA0AAAAIAAkAAABAAA4AAAAIAAoAAABAAA8AAAAFAAkAAABAABAAAAAHAAkAAABAABEAAAAIAAoAAABAABIAAAAHAAkAAABAABMAAAAIAAkAAABAABQAAAAAAAMAAABAABUAAAABAAcAAABAABYAAAABAAQAAABAABcAAAABAAQAAABAABgAAAABAAUAAABAABkAAAAHAAoAAABAABoAAAAIAAoAAABAABsAAAAFAAkAAABAABwAAAAAAAAAAABAAB0AAAAIAAoAAABAAB4AAAAAAAAAAABAAB8AAAAHAAkAAABAACAAAAABAAMAAABAACEAAAABAAQAAABAACIAAAABAAQAAABAACMAAAABAAUAAABAACQAAAAHAAkAAABAACUAAAAIAAoAAABAACYAAAAHAAoAAABAACcAAAAHAAoAAABAACgAAAAIAAkAAABAACkAAAAFAAoAAABAACoAAAAIAAkAAABAACsAAAAIAAoAAABAACwAAAAIAAkAAABAAC0AAAAIAAoAAABAAC4AAAAAAAAAAABAAC8AAAAFAAkAAABAADAAAAAHAAoAAABAADEAAAAHAAoAAABAADIAAAAFAAkAAABAADMAAAAFAAoAAABBAPD/AAABAAsAAABBAPH/AAAFAAoAAABBAPL/AAAIAAoAAABBAPP/AAAHAAkAAABBAPT/AAAIAAkAAABBAPX/AAAAAAAAAABBAPb/AAAIAAkAAABBAPf/AAAAAAAAAABBAPj/AAAAAAAAAABBAPn/AAAFAAkAAABBAPr/AAAFAAkAAABBAPv/AAAFAAoAAABBAPz/AAAIAAoAAABBAP3/AAAIAAoAAABBAP7/AAAIAAoAAABBAP//AAAFAAoAAABBAAAAAAAFAAkAAABBAAEAAAAHAAkAAABBAAIAAAAFAAkAAABBAAMAAAAHAAkAAABBAAQAAAAIAAkAAABBAAUAAAAIAAoAAABBAAYAAAAHAAoAAABBAAcAAAAHAAkAAABBAAgAAAAFAAkAAABBAAkAAAAFAAoAAABBAAoAAAAIAAkAAABBAAsAAAAFAAoAAABBAAwAAAAHAAoAAABBAA0AAAAHAAoAAABBAA4AAAAFAAkAAABBAA8AAAAFAAoAAABBABAAAAAFAAkAAABBABEAAAAHAAoAAABBABIAAAAFAAkAAABBABMAAAAAAAMAAABBABQAAAABAAcAAABBABUAAAABAAQAAABBABYAAAABAAQAAABBABcAAAAAAAYAAABBABgAAAACAAUAAABBABkAAAAHAAoAAABBABoAAAAHAAkAAABBABsAAAAFAAoAAABBABwAAAAIAAkAAABBAB0AAAAIAAoAAABBAB4AAAAAAAAAAABBAB8AAAAHAAkAAABBACAAAAABAAMAAABBACEAAAABAAQAAABBACIAAAABAAQAAABBACMAAAABAAUAAABBACQAAAAFAAkAAABBACUAAAAFAAoAAABBACYAAAAAAAAAAABBACcAAAAIAAkAAABBACgAAAAAAAAAAABBACkAAAAHAAkAAABBACoAAAAFAAoAAABBACsAAAAAAAAAAABBACwAAAAFAAoAAABBAC0AAAAAAAAAAABBAC4AAAAIAAkAAABBAC8AAAAFAAkAAABBADAAAAAAAAAAAABBADEAAAAHAAoAAABBADIAAAAAAAAAAABBADMAAAAIAAkAAABCAPD/AAACAAsAAABCAPH/AAAAAAQAAABCAPL/AAAAAAUAAABCAPP/AAAIAAoAAABCAPT/AAAIAAkAAABCAPX/AAAHAAoAAABCAPb/AAAFAAoAAABCAPf/AAAIAAoAAABCAPj/AAAFAAoAAABCAPn/AAAAAAAAAABCAPr/AAAFAAoAAABCAPv/AAAHAAkAAABCAPz/AAAFAAoAAABCAP3/AAAHAAkAAABCAP7/AAAHAAkAAABCAP//AAAAAAAAAABCAAAAAAAFAAkAAABCAAEAAAAAAAAAAABCAAIAAAAAAAAAAABCAAMAAAAFAAkAAABCAAQAAAAIAAoAAABCAAUAAAAFAAkAAABCAAYAAAAFAAoAAABCAAcAAAAHAAkAAABCAAgAAAAFAAoAAABCAAkAAAAFAAkAAABCAAoAAAAHAAkAAABCAAsAAAAFAAoAAABCAAwAAAAIAAoAAABCAA0AAAAIAAoAAABCAA4AAAAIAAkAAABCAA8AAAAIAAkAAABCABAAAAAHAAkAAABCABEAAAAIAAoAAABCABIAAAAAAAMAAABCABMAAAABAAcAAABCABQAAAABAAQAAABCABUAAAABAAQAAABCABYAAAAAAAYAAABCABcAAAACAAUAAABCABgAAAAIAAoAAABCABkAAAAFAAkAAABCABoAAAAFAAkAAABCABsAAAAIAAoAAABCABwAAAAHAAkAAABCAB0AAAAHAAoAAABCAB4AAAAFAAkAAABCAB8AAAAAAAAAAABCACAAAAABAAMAAABCACEAAAABAAQAAABCACIAAAABAAQAAABCACMAAAABAAUAAABCACQAAAAHAAoAAABCACUAAAAFAAkAAABCACYAAAAHAAoAAABCACcAAAAAAAAAAABCACgAAAAIAAkAAABCACkAAAAIAAkAAABCACoAAAAHAAkAAABCACsAAAAFAAkAAABCACwAAAAIAAkAAABCAC0AAAAHAAkAAABCAC4AAAAFAAoAAABCAC8AAAAHAAoAAABCADAAAAAAAAAAAABCADEAAAAIAAoAAABCADIAAAAFAAkAAABCADMAAAAIAAkAAABDAPD/AAARAAcAAABDAPH/AAABAAQAAABDAPL/AAABAAYAAABDAPP/AAAAAAUAAABDAPT/AAAFAAkAAABDAPX/AAAIAAkAAABDAPb/AAAFAAkAAABDAPf/AAAIAAkAAABDAPj/AAAFAAkAAABDAPn/AAAAAAAAAABDAPr/AAAHAAkAAABDAPv/AAAHAAkAAABDAPz/AAAHAAkAAABDAP3/AAAFAAkAAABDAP7/AAAHAAkAAABDAP//AAAIAAkAAABDAAAAAAAIAAoAAABDAAEAAAAAAAAAAABDAAIAAAAIAAoAAABDAAMAAAAIAAkAAABDAAQAAAAHAAoAAABDAAUAAAAIAAkAAABDAAYAAAAHAAkAAABDAAcAAAAFAAkAAABDAAgAAAAHAAkAAABDAAkAAAAIAAoAAABDAAoAAAAHAAoAAABDAAsAAAAFAAkAAABDAAwAAAAFAAoAAABDAA0AAAAAAAAAAABDAA4AAAAFAAkAAABDAA8AAAAIAAoAAABDABAAAAAHAAoAAABDABEAAAAAAAMAAABDABIAAAABAAcAAABDABMAAAABAAQAAABDABQAAAABAAQAAABDABUAAAAAAAYAAABDABYAAAACAAUAAABDABcAAAAIAAkAAABDABgAAAAHAAoAAABDABkAAAAAAAAAAABDABoAAAAIAAkAAABDABsAAAAAAAAAAABDABwAAAAIAAoAAABDAB0AAAAHAAkAAABDAB4AAAAFAAoAAABDAB8AAAAAAAAAAABDACAAAAABAAMAAABDACEAAAABAAQAAABDACIAAAABAAQAAABDACMAAAABAAUAAABDACQAAAAFAAkAAABDACUAAAAHAAkAAABDACYAAAAFAAoAAABDACcAAAAFAAoAAABDACgAAAAIAAkAAABDACkAAAAHAAoAAABDACoAAAAIAAoAAABDACsAAAAHAAoAAABDACwAAAAIAAoAAABDAC0AAAAAAAAAAABDAC4AAAAFAAoAAABDAC8AAAAIAAkAAABDADAAAAAAAAAAAABDADEAAAAHAAkAAABDADIAAAAIAAkAAABDADMAAAAFAAoAAABEAPD/AAABAAQAAABEAPH/AAABAAQAAABEAPL/AAABAAQAAABEAPP/AAABAAYAAABEAPT/AAAAAAQAAABEAPX/AAAAAAUAAABEAPb/AAAFAAoAAABEAPf/AAAHAAkAAABEAPj/AAAIAAoAAABEAPn/AAAIAAoAAABEAPr/AAAAAAAAAABEAPv/AAAIAAkAAABEAPz/AAAFAAoAAABEAP3/AAAAAAAAAABEAP7/AAAIAAkAAABEAP//AAAFAAoAAABEAAAAAAAIAAoAAABEAAEAAAAIAAoAAABEAAIAAAAFAAkAAABEAAMAAAAIAAkAAABEAAQAAAAAAAAAAABEAAUAAAAHAAkAAABEAAYAAAAIAAkAAABEAAcAAAAHAAoAAABEAAgAAAAFAAoAAABEAAkAAAAIAAkAAABEAAoAAAAFAAoAAABEAAsAAAAAAAAAAABEAAwAAAAAAAAAAABEAA0AAAAFAAkAAABEAA4AAAAHAAoAAABEAA8AAAAAAAMAAABEABAAAAAAAAQAAABEABEAAAABAAcAAABEABIAAAABAAQAAABEABMAAAABAAQAAABEABQAAAAAAAYAAABEABUAAAACAAUAAABEABYAAAAFAAkAAABEABcAAAAAAAAAAABEABgAAAAAAAAAAABEABkAAAAFAAoAAABEABoAAAAHAAkAAABEABsAAAAFAAkAAABEABwAAAAHAAkAAABEAB0AAAAIAAoAAABEAB4AAAAHAAoAAABEAB8AAAAHAAkAAABEACAAAAABAAMAAABEACEAAAABAAQAAABEACIAAAABAAQAAABEACMAAAABAAUAAABEACQAAAAIAAkAAABEACUAAAAFAAoAAABEACYAAAAIAAkAAABEACcAAAAAAAAAAABEACgAAAAFAAoAAABEACkAAAAFAAkAAABEACoAAAAAAAAAAABEACsAAAAHAAoAAABEACwAAAAIAAkAAABEAC0AAAAIAAoAAABEAC4AAAAAAAAAAABEAC8AAAAIAAkAAABEADAAAAAIAAkAAABEADEAAAAFAAkAAABEADIAAAAFAAkAAABEADMAAAAHAAoAAABFAPD/AAABAAQAAABFAPH/AAABAAQAAABFAPL/AAABAAQAAABFAPP/AAABAAQAAABFAPT/AAABAAQAAABFAPX/AAABAAYAAABFAPb/AAAAAAUAAABFAPf/AAAIAAoAAABFAPj/AAAAAAAAAABFAPn/AAAHAAoAAABFAPr/AAAAAAAAAABFAPv/AAAHAAkAAABFAPz/AAAIAAkAAABFAP3/AAAIAAoAAABFAP7/AAAFAAkAAABFAP//AAAAAAAAAABFAAAAAAAHAAkAAABFAAEAAAAFAAkAAABFAAIAAAAIAAoAAABFAAMAAAAAAAAAAABFAAQAAAAFAAkAAABFAAUAAAAFAAoAAABFAAYAAAAFAAoAAABFAAcAAAAFAAoAAABFAAgAAAAIAAkAAABFAAkAAAAAAAAAAABFAAoAAAAHAAkAAABFAAsAAAAIAAoAAABFAAwAAAAIAAkAAABFAA0AAAAHAAoAAABFAA4AAAAAAAMAAABFAA8AAAABAAcAAABFABAAAAABAAQAAABFABEAAAABAAQAAABFABIAAAABAAQAAABFABMAAAABAAQAAABFABQAAAABAAUAAABFABUAAAAFAAkAAABFABYAAAAFAAoAAABFABcAAAAIAAkAAABFABgAAAAAAAAAAABFABkAAAAHAAkAAABFABoAAAAIAAkAAABFABsAAAAAAAAAAABFABwAAAAFAAkAAABFAB0AAAAAAAAAAABFAB4AAAAAAAAAAABFAB8AAAAAAAAAAABFACAAAAABAAMAAABFACEAAAABAAQAAABFACIAAAABAAQAAABFACMAAAABAAUAAABFACQAAAAIAAkAAABFACUAAAAHAAoAAABFACYAAAAHAAoAAABFACcAAAAIAAkAAABFACgAAAAHAAoAAABFACkAAAAHAAoAAABFACoAAAAAAAAAAABFACsAAAAFAAkAAABFACwAAAAFAAkAAABFAC0AAAAAAAAAAABFAC4AAAAFAAoAAABFAC8AAAAHAAoAAABFADAAAAAFAAoAAABFADEAAAAFAAkAAABFADIAAAAAAAAAAABFADMAAAAHAAkAAABGAPD/AAAAAAsAAABGAPH/AAACAAQAAABGAPL/AAAAAAcAAABGAPP/AAABAAQAAABGAPT/AAABAAQAAABGAPX/AAABAAQAAABGAPb/AAABAAYAAABGAPf/AAAAAAUAAABGAPj/AAAHAAoAAABGAPn/AAAFAAoAAABGAPr/AAAIAAoAAABGAPv/AAAHAAkAAABGAPz/AAAHAAoAAABGAP3/AAAFAAkAAABGAP7/AAAIAAoAAABGAP//AAAAAAAAAABGAAAAAAAHAAoAAABGAAEAAAAFAAkAAABGAAIAAAAAAAAAAABGAAMAAAAFAAoAAABGAAQAAAAIAAoAAABGAAUAAAAFAAoAAABGAAYAAAAAAAAAAABGAAcAAAAAAAAAAABGAAgAAAAIAAoAAABGAAkAAAAIAAkAAABGAAoAAAAIAAkAAABGAAsAAAAAAAAAAABGAAwAAAAAAAAAAABGAA0AAAAAAAMAAABGAA4AAAABAAcAAABGAA8AAAABAAQAAABGABAAAAABAAQAAABGABEAAAABAAQAAABGABIAAAABAAQAAABGABMAAAAAAAYAAABGABQAAAACAAUAAABGABUAAAAHAAkAAABGABYAAAAHAAoAAABGABcAAAAFAAoAAABGABgAAAAAAAAAAABGABkAAAAAAAAAAABGABoAAAAIAAkAAABGABsAAAAIAAkAAABGABwAAAAHAAoAAABGAB0AAAAHAAkAAABGAB4AAAAAAAAAAABGAB8AAAAFAAkAAABGACAAAAABAAMAAABGACEAAAABAAQAAABGACIAAAABAAQAAABGACMAAAABAAUAAABGACQAAAAIAAkAAABGACUAAAAAAAAAAABGACYAAAAAAAAAAABGACcAAAAFAAkAAABGACgAAAAFAAoAAABGACkAAAAIAAkAAABGACoAAAAFAAoAAABGACsAAAAIAAoAAABGACwAAAAFAAoAAABGAC0AAAAIAAoAAABGAC4AAAAFAAkAAABGAC8AAAAFAAkAAABGADAAAAAAAAAAAABGADEAAAAIAAoAAABGADIAAAAIAAkAAABGADMAAAAIAAkAAABHAPD/AAABAAsAAABHAPH/AAAAAAAAAABHAPL/AAACAAMAAABHAPP/AAACAAQAAABHAPT/AAAAAAcAAABHAPX/AAABAAQAAABHAPb/AAABAAQAAABHAPf/AAABAAYAAABHAPj/AAAAAAUAAABHAPn/AAAIAAoAAABHAPr/AAAFAAkAAABHAPv/AAAHAAoAAABHAPz/AAAIAAkAAABHAP3/AAAFAAkAAABHAP7/AAAIAAkAAABHAP//AAAFAAkAAABHAAAAAAAAAAAAAABHAAEAAAAIAAkAAABHAAIAAAAHAAoAAABHAAMAAAAFAAkAAABHAAQAAAAIAAkAAABHAAUAAAAAAAAAAABHAAYAAAAIAAkAAABHAAcAAAAHAAoAAABHAAgAAAAFAAkAAABHAAkAAAAFAAkAAABHAAoAAAAIAAoAAABHAAsAAAAIAAkAAABHAAwAAAAAAAMAAABHAA0AAAABAAcAAABHAA4AAAABAAQAAABHAA8AAAABAAQAAABHABAAAAABAAQAAABHABEAAAAAAAYAAABHABIAAAACAAQAAABHABMAAAACAAUAAABHABQAAAAIAAoAAABHABUAAAAHAAkAAABHABYAAAAFAAkAAABHABcAAAAIAAoAAABHABgAAAAIAAoAAABHABkAAAAHAAkAAABHABoAAAAHAAoAAABHABsAAAAFAAoAAABHABwAAAAHAAoAAABHAB0AAAAHAAoAAABHAB4AAAAHAAoAAABHAB8AAAAHAAkAAABHACAAAAABAAMAAABHACEAAAABAAQAAABHACIAAAABAAQAAABHACMAAAABAAUAAABHACQAAAAIAAkAAABHACUAAAAFAAkAAABHACYAAAAFAAoAAABHACcAAAAHAAoAAABHACgAAAAFAAoAAABHACkAAAAAAAAAAABHACoAAAAAAAAAAABHACsAAAAHAAoAAABHACwAAAAIAAkAAABHAC0AAAAFAAoAAABHAC4AAAAFAAkAAABHAC8AAAAHAAkAAABHADAAAAAIAAkAAABHADEAAAAHAAkAAABHADIAAAAFAAoAAABHADMAAAAHAAkAAABIAPD/AAABAAsAAABIAPH/AAAIAAkAAABIAPL/AAAIAAoAAABIAPP/AAAAAAAAAABIAPT/AAACAAMAAABIAPX/AAAAAAcAAABIAPb/AAABAAQAAABIAPf/AAABAAQAAABIAPj/AAABAAYAAABIAPn/AAAAAAQAAABIAPr/AAAAAAUAAABIAPv/AAAHAAkAAABIAPz/AAAHAAkAAABIAP3/AAAHAAoAAABIAP7/AAAFAAkAAABIAP//AAAFAAoAAABIAAAAAAAHAAkAAABIAAEAAAAHAAkAAABIAAIAAAAIAAkAAABIAAMAAAAIAAoAAABIAAQAAAAHAAkAAABIAAUAAAAFAAoAAABIAAYAAAAIAAkAAABIAAcAAAAIAAoAAABIAAgAAAAAAAAAAABIAAkAAAAHAAkAAABIAAoAAAAAAAMAAABIAAsAAAAAAAQAAABIAAwAAAABAAcAAABIAA0AAAABAAQAAABIAA4AAAABAAQAAABIAA8AAAABAAQAAABIABAAAAAAAAYAAABIABEAAAACAAUAAABIABIAAAAHAAoAAABIABMAAAAIAAkAAABIABQAAAAFAAkAAABIABUAAAAIAAkAAABIABYAAAAHAAkAAABIABcAAAAFAAkAAABIABgAAAAIAAkAAABIABkAAAAFAAkAAABIABoAAAAIAAoAAABIABsAAAAFAAoAAABIABwAAAAFAAoAAABIAB0AAAAAAAAAAABIAB4AAAAIAAoAAABIAB8AAAAIAAoAAABIACAAAAABAAMAAABIACEAAAABAAQAAABIACIAAAABAAQAAABIACMAAAABAAUAAABIACQAAAAHAAkAAABIACUAAAAHAAoAAABIACYAAAAIAAkAAABIACcAAAAHAAoAAABIACgAAAAHAAkAAABIACkAAAAHAAkAAABIACoAAAAFAAkAAABIACsAAAAIAAkAAABIACwAAAAIAAkAAABIAC0AAAAHAAkAAABIAC4AAAAIAAoAAABIAC8AAAAFAAkAAABIADAAAAAFAAoAAABIADEAAAAHAAkAAABIADIAAAAAAAAAAABIADMAAAAHAAoAAABJAPD/AAABAAsAAABJAPH/AAAFAAoAAABJAPL/AAAIAAkAAABJAPP/AAAFAAoAAABJAPT/AAAIAAkAAABJAPX/AAABAAMAAABJAPb/AAABAAQAAABJAPf/AAABAAQAAABJAPj/AAABAAQAAABJAPn/AAABAAQAAABJAPr/AAABAAUAAABJAPv/AAAAAAAAAABJAPz/AAAIAAkAAABJAP3/AAAIAAkAAABJAP7/AAAFAAoAAABJAP//AAAHAAoAAABJAAAAAAAHAAkAAABJAAEAAAAFAAkAAABJAAIAAAAHAAkAAABJAAMAAAAAAAAAAABJAAQAAAAAAAAAAABJAAUAAAAHAAkAAABJAAYAAAAIAAoAAABJAAcAAAAFAAkAAABJAAgAAAAIAAkAAABJAAkAAAAAAAMAAABJAAoAAAABAAcAAABJAAsAAAABAAQAAABJAAwAAAABAAQAAABJAA0AAAABAAQAAABJAA4AAAABAAQAAABJAA8AAAAAAAYAAABJABAAAAACAAUAAABJABEAAAAFAAkAAABJABIAAAAIAAkAAABJABMAAAAIAAkAAABJABQAAAAHAAkAAABJABUAAAAFAAoAAABJABYAAAAFAAkAAABJABcAAAAAAAAAAABJABgAAAAAAAAAAABJABkAAAAHAAkAAABJABoAAAAAAAAAAABJABsAAAAHAAkAAABJABwAAAAFAAoAAABJAB0AAAAHAAoAAABJAB4AAAAHAAkAAABJAB8AAAAHAAoAAABJACAAAAABAAMAAABJACEAAAABAAQAAABJACIAAAABAAQAAABJACMAAAABAAUAAABJACQAAAAIAAkAAABJACUAAAAAAAAAAABJACYAAAAIAAkAAABJACcAAAAIAAkAAABJACgAAAAFAAkAAABJACkAAAAHAAkAAABJACoAAAAIAAkAAABJACsAAAAFAAoAAABJACwAAAAFAAoAAABJAC0AAAAAAAAAAABJAC4AAAAIAAoAAABJAC8AAAAFAAkAAABJADAAAAAHAAkAAABJADEAAAAFAAoAAABJADIAAAAHAAoAAABJADMAAAAIAAoAAABKAPD/AAABAAsAAABKAPH/AAAFAAoAAABKAPL/AAAIAAkAAABKAPP/AAAIAAkAAABKAPT/AAAIAAkAAABKAPX/AAACAAMAAABKAPb/AAAAAAcAAABKAPf/AAABAAQAAABKAPj/AAABAAQAAABKAPn/AAABAAQAAABKAPr/AAABAAYAAABKAPv/AAAAAAUAAABKAPz/AAAHAAkAAABKAP3/AAAIAAoAAABKAP7/AAAFAAoAAABKAP//AAAFAAoAAABKAAAAAAAFAAkAAABKAAEAAAAAAAAAAABKAAIAAAAHAAkAAABKAAMAAAAIAAkAAABKAAQAAAAFAAkAAABKAAUAAAAHAAoAAABKAAYAAAAAAAAAAABKAAcAAAAIAAoAAABKAAgAAAAAAAMAAABKAAkAAAABAAcAAABKAAoAAAABAAQAAABKAAsAAAABAAQAAABKAAwAAAABAAQAAABKAA0AAAABAAQAAABKAA4AAAAAAAYAAABKAA8AAAACAAUAAABKABAAAAAAAAAAAABKABEAAAAHAAoAAABKABIAAAAAAAAAAABKABMAAAAIAAoAAABKABQAAAAHAAoAAABKABUAAAAHAAkAAABKABYAAAAAAAAAAABKABcAAAAFAAkAAABKABgAAAAFAAkAAABKABkAAAAHAAoAAABKABoAAAAAAAAAAABKABsAAAAFAAkAAABKABwAAAAIAAkAAABKAB0AAAAFAAoAAABKAB4AAAAHAAoAAABKAB8AAAAHAAoAAABKACAAAAABAAMAAABKACEAAAABAAQAAABKACIAAAABAAQAAABKACMAAAABAAUAAABKACQAAAAFAAkAAABKACUAAAAFAAkAAABKACYAAAAAAAAAAABKACcAAAAFAAoAAABKACgAAAAFAAoAAABKACkAAAAHAAoAAABKACoAAAAFAAkAAABKACsAAAAHAAoAAABKACwAAAAIAAoAAABKAC0AAAAFAAoAAABKAC4AAAAFAAkAAABKAC8AAAAFAAkAAABKADAAAAAHAAoAAABKADEAAAAHAAkAAABKADIAAAAFAAoAAABKADMAAAAHAAoAAABLAPD/AAABAAsAAABLAPH/AAAHAAkAAABLAPL/AAAHAAoAAABLAPP/AAAHAAkAAABLAPT/AAAFAAkAAABLAPX/AAAFAAoAAABLAPb/AAACAAMAAABLAPf/AAAAAAcAAABLAPj/AAABAAQAAABLAPn/AAABAAQAAABLAPr/AAABAAQAAABLAPv/AAABAAYAAABLAPz/AAAAAAUAAABLAP3/AAAIAAkAAABLAP7/AAAFAAkAAABLAP//AAAHAAkAAABLAAAAAAAFAAkAAABLAAEAAAAAAAAAAABLAAIAAAAIAAoAAABLAAMAAAAIAAkAAABLAAQAAAAIAAkAAABLAAUAAAAAAAAAAABLAAYAAAAAAAMAAABLAAcAAAAAAAQAAABLAAgAAAABAAcAAABLAAkAAAABAAQAAABLAAoAAAABAAQAAABLAAsAAAABAAQAAABLAAwAAAABAAQAAABLAA0AAAAAAAYAAABLAA4AAAACAAUAAABLAA8AAAAFAAoAAABLABAAAAAHAAkAAABLABEAAAAHAAoAAABLABIAAAAHAAkAAABLABMAAAAHAAkAAABLABQAAAAAAAAAAABLABUAAAAHAAoAAABLABYAAAAHAAkAAABLABcAAAAFAAkAAABLABgAAAAAAAAAAABLABkAAAAHAAoAAABLABoAAAAFAAkAAABLABsAAAAIAAoAAABLABwAAAAFAAkAAABLAB0AAAAAAAAAAABLAB4AAAAFAAoAAABLAB8AAAAIAAoAAABLACAAAAABAAMAAABLACEAAAABAAQAAABLACIAAAABAAQAAABLACMAAAABAAUAAABLACQAAAAFAAoAAABLACUAAAAHAAoAAABLACYAAAAFAAkAAABLACcAAAAHAAoAAABLACgAAAAHAAoAAABLACkAAAAIAAkAAABLACoAAAAFAAkAAABLACsAAAAHAAkAAABLACwAAAAAAAAAAABLAC0AAAAFAAoAAABLAC4AAAAAAAAAAABLAC8AAAAAAAAAAABLADAAAAAHAAkAAABLADEAAAAIAAoAAABLADIAAAAHAAoAAABLADMAAAAFAAoAAABMAPD/AAABAAsAAABMAPH/AAAIAAkAAABMAPL/AAAIAAkAAABMAPP/AAAFAAoAAABMAPT/AAAFAAoAAABMAPX/AAAHAAoAAABMAPb/AAAIAAoAAABMAPf/AAABAAMAAABMAPj/AAABAAQAAABMAPn/AAABAAQAAABMAPr/AAABAAQAAABMAPv/AAABAAQAAABMAPz/AAABAAYAAABMAP3/AAAAAAUAAABMAP7/AAAFAAoAAABMAP//AAAIAAkAAABMAAAAAAAHAAoAAABMAAEAAAAIAAkAAABMAAIAAAAFAAkAAABMAAMAAAAHAAkAAABMAAQAAAAAAAMAAABMAAUAAAAAAAQAAABMAAYAAAABAAcAAABMAAcAAAABAAQAAABMAAgAAAABAAQAAABMAAkAAAABAAQAAABMAAoAAAABAAQAAABMAAsAAAABAAQAAABMAAwAAAAAAAYAAABMAA0AAAACAAUAAABMAA4AAAAHAAoAAABMAA8AAAAHAAoAAABMABAAAAAIAAoAAABMABEAAAAHAAoAAABMABIAAAAIAAoAAABMABMAAAAIAAoAAABMABQAAAAFAAoAAABMABUAAAAFAAoAAABMABYAAAAFAAoAAABMABcAAAAHAAoAAABMABgAAAAFAAkAAABMABkAAAAHAAoAAABMABoAAAAIAAkAAABMABsAAAAIAAkAAABMABwAAAAIAAkAAABMAB0AAAAHAAoAAABMAB4AAAAIAAkAAABMAB8AAAAAAAAAAABMACAAAAABAAMAAABMACEAAAABAAQAAABMACIAAAABAAQAAABMACMAAAABAAUAAABMACQAAAAFAAoAAABMACUAAAAFAAkAAABMACYAAAAIAAkAAABMACcAAAAFAAoAAABMACgAAAAIAAoAAABMACkAAAAIAAoAAABMACoAAAAHAAoAAABMACsAAAAFAAkAAABMACwAAAAFAAoAAABMAC0AAAAHAAoAAABMAC4AAAAFAAoAAABMAC8AAAAIAAkAAABMADAAAAAFAAoAAABMADEAAAAHAAoAAABMADIAAAAIAAoAAABMADMAAAAHAAoAAABNAPD/AAABAAsAAABNAPH/AAAIAAoAAABNAPL/AAAFAAkAAABNAPP/AAAAAAAAAABNAPT/AAAFAAoAAABNAPX/AAAFAAkAAABNAPb/AAAHAAoAAABNAPf/AAACAAMAAABNAPj/AAAAAAcAAABNAPn/AAABAAQAAABNAPr/AAABAAQAAABNAPv/AAABAAQAAABNAPz/AAABAAQAAABNAP3/AAABAAUAAABNAP7/AAAFAAkAAABNAP//AAAHAAoAAABNAAAAAAAFAAkAAABNAAEAAAAFAAoAAABNAAIAAAAHAAkAAABNAAMAAAAAAAMAAABNAAQAAAABAAcAAABNAAUAAAABAAQAAABNAAYAAAABAAQAAABNAAcAAAABAAQAAABNAAgAAAABAAQAAABNAAkAAAABAAQAAABNAAoAAAAAAAYAAABNAAsAAAACAAQAAABNAAwAAAACAAUAAABNAA0AAAAAAAAAAABNAA4AAAAHAAkAAABNAA8AAAAIAAkAAABNABAAAAAHAAoAAABNABEAAAAFAAoAAABNABIAAAAFAAoAAABNABMAAAAFAAoAAABNABQAAAAHAAkAAABNABUAAAAFAAkAAABNABYAAAAFAAkAAABNABcAAAAFAAoAAABNABgAAAAHAAoAAABNABkAAAAHAAkAAABNABoAAAAIAAkAAABNABsAAAAIAAoAAABNABwAAAAFAAkAAABNAB0AAAAAAAAAAABNAB4AAAAFAAkAAABNAB8AAAAHAAoAAABNACAAAAABAAMAAABNACEAAAABAAQAAABNACIAAAABAAQAAABNACMAAAABAAUAAABNACQAAAAFAAoAAABNACUAAAAHAAkAAABNACYAAAAFAAoAAABNACcAAAAHAAkAAABNACgAAAAHAAkAAABNACkAAAAFAAoAAABNACoAAAAHAAkAAABNACsAAAAHAAkAAABNACwAAAAHAAoAAABNAC0AAAAFAAoAAABNAC4AAAAHAAoAAABNAC8AAAAIAAkAAABNADAAAAAFAAkAAABNADEAAAAFAAoAAABNADIAAAAHAAkAAABNADMAAAAFAAoAAABOAPD/AAABAAsAAABOAPH/AAAIAAoAAABOAPL/AAAIAAkAAABOAPP/AAAFAAkAAABOAPT/AAAFAAoAAABOAPX/AAAIAAoAAABOAPb/AAAFAAkAAABOAPf/AAAFAAoAAABOAPj/AAACAAMAAABOAPn/AAAAAAcAAABOAPr/AAABAAQAAABOAPv/AAABAAQAAABOAPz/AAABAAQAAABOAP3/AAABAAYAAABOAP7/AAAAAAQAAABOAP//AAAAAAQAAABOAAAAAAAAAAQAAABOAAEAAAAAAAQAAABOAAIAAAAAAAQAAABOAAMAAAABAAcAAABOAAQAAAABAAQAAABOAAUAAAABAAQAAABOAAYAAAABAAQAAABOAAcAAAABAAQAAABOAAgAAAAAAAYAAABOAAkAAAACAAQAAABOAAoAAAACAAUAAABOAAsAAAAIAAoAAABOAAwAAAAFAAkAAABOAA0AAAAAAAAAAABOAA4AAAAIAAoAAABOAA8AAAAFAAoAAABOABAAAAAHAAkAAABOABEAAAAHAAoAAABOABIAAAAHAAoAAABOABMAAAAFAAoAAABOABQAAAAIAAoAAABOABUAAAAFAAoAAABOABYAAAAAAAAAAABOABcAAAAAAAAAAABOABgAAAAHAAkAAABOABkAAAAIAAoAAABOABoAAAAFAAoAAABOABsAAAAIAAkAAABOABwAAAAAAAAAAABOAB0AAAAAAAAAAABOAB4AAAAHAAkAAABOAB8AAAAIAAoAAABOACAAAAABAAMAAABOACEAAAABAAQAAABOACMAAAABAAUAAABOACQAAAAIAAkAAABOACUAAAAFAAoAAABOACYAAAAFAAoAAABOACcAAAAHAAoAAABOACgAAAAIAAoAAABOACkAAAAIAAkAAABOACoAAAAIAAkAAABOACsAAAAIAAoAAABOACwAAAAAAAAAAABOAC0AAAAIAAoAAABOAC4AAAAAAAAAAABOAC8AAAAIAAkAAABOADAAAAAFAAoAAABOADEAAAAHAAoAAABOADIAAAAFAAoAAABOADMAAAAAAAAAAABPAPD/AAABAAsAAABPAPH/AAAHAAoAAABPAPL/AAAAAAAAAABPAPP/AAAFAAoAAABPAPT/AAAHAAkAAABPAPX/AAAHAAoAAABPAPb/AAAFAAkAAABPAPf/AAAIAAkAAABPAPj/AAAIAAkAAABPAPn/AAACAAMAAABPAPr/AAACAAQAAABPAPv/AAAAAAcAAABPAPz/AAABAAQAAABPAP3/AAABAAQAAABPAP7/AAABAAQAAABPAP//AAABAAQAAABPAAAAAAABAAQAAABPAAEAAAABAAQAAABPAAIAAAABAAQAAABPAAMAAAABAAQAAABPAAQAAAABAAQAAABPAAUAAAABAAQAAABPAAYAAAAAAAYAAABPAAcAAAACAAQAAABPAAgAAAACAAUAAABPAAkAAAAIAAoAAABPAAoAAAAHAAoAAABPAAsAAAAFAAkAAABPAAwAAAAIAAoAAABPAA0AAAAFAAoAAABPAA4AAAAIAAoAAABPAA8AAAAHAAkAAABPABAAAAAIAAkAAABPABEAAAAAAAAAAABPABIAAAAHAAkAAABPABMAAAAFAAkAAABPABQAAAAFAAkAAABPABUAAAAFAAkAAABPABYAAAAIAAoAAABPABcAAAAFAAkAAABPABgAAAAHAAoAAABPABkAAAAFAAoAAABPABoAAAAHAAoAAABPABsAAAAFAAoAAABPABwAAAAHAAoAAABPAB0AAAAHAAoAAABPAB4AAAAIAAoAAABPAB8AAAAFAAoAAABPACAAAAABAAMAAABPACEAAAABAAQAAABPACQAAAAAAAoAAABPACUAAAAFAAkAAABPACYAAAAHAAkAAABPACcAAAAFAAkAAABPACgAAAAAAAAAAABPACkAAAAHAAkAAABPACoAAAAFAAoAAABPACsAAAAFAAoAAABPACwAAAAHAAkAAABPAC0AAAAIAAoAAABPAC4AAAAHAAoAAABPAC8AAAAFAAoAAABPADAAAAAFAAkAAABPADEAAAAAAAAAAABPADIAAAAHAAkAAABPADMAAAAAAAkAAABQAPD/AAABAAsAAABQAPH/AAAAAAkAAABQAPL/AAAAAAoAAABQAPP/AAAIAAkAAABQAPT/AAAIAAkAAABQAPX/AAAFAAoAAABQAPb/AAAFAAkAAABQAPf/AAAIAAoAAABQAPj/AAAIAAkAAABQAPn/AAAFAAkAAABQAPr/AAAAAAAAAABQAPv/AAABAAMAAABQAPz/AAABAAQAAABQAP3/AAAPAAYAAABQAP7/AAAPAAgAAABQAP//AAAPAAcAAABQAAAAAAAPAAYAAABQAAEAAAAPAAcAAABQAAIAAAAPAAcAAABQAAMAAAAAAAYAAABQAAQAAAACAAQAAABQAAUAAAACAAQAAABQAAYAAAACAAUAAABQAAcAAAAIAAoAAABQAAgAAAAHAAkAAABQAAkAAAAFAAoAAABQAAoAAAAFAAoAAABQAAsAAAAIAAoAAABQAAwAAAAHAAoAAABQAA0AAAAIAAkAAABQAA4AAAAFAAoAAABQAA8AAAAIAAoAAABQABAAAAAIAAkAAABQABEAAAAHAAkAAABQABIAAAAHAAkAAABQABMAAAAHAAoAAABQABQAAAAIAAkAAABQABUAAAAAAAkAAABQABYAAAAAAAkAAABQABcAAAAAAAkAAABQABgAAAAAAAkAAABQABkAAAAAAAkAAABQABoAAAAAAAkAAABQABsAAAAAAAkAAABQABwAAAAAAAkAAABQAB0AAAAAAAkAAABQAB4AAAAAAAkAAABQAB8AAAAAAAkAAABQACAAAAABAAMAAABQACEAAAABAAQAAABQACQAAAACAAsAAABQACUAAAAAAAkAAABQACYAAAAAAAoAAABQACcAAAAAAAkAAABQACgAAAAAAAoAAABQACkAAAAAAAkAAABQACoAAAAAAAoAAABQACsAAAAAAAkAAABQACwAAAAAAAoAAABQAC0AAAAAAAkAAABQAC4AAAAAAAoAAABQAC8AAAAAAAoAAABQADAAAAAAAAoAAABQADEAAAAAAAoAAABQADIAAAAAAAoAAABQADMAAAAAAAkAAAAMAAYAAAAHAAoAAAAOAAYAAAAFAAoAAAAYAPj/AAADAAcAAAApAPj/AAADAAcAAAApAPn/AAADAAcAAAAqAPj/AAADAAcAAAAqAPn/AAADAAcAAAAPAAAAAAABAAMAAAAPAAEAAAABAAQAAAAPAAIAAAABAAUAAAAQAAAAAAABAAMAAAAQAAEAAAABAAQAAAAQAAIAAAABAAUAAAARAAAAAAABAAMAAAARAAEAAAABAAQAAAARAAIAAAABAAUAAAAlAAoAAAADAAcAAAAkAAoAAAADAAcAAAAkAAsAAAADAAcAAAAlAAwAAAADAAcAAAAlAAsAAAAAAAEAAAAmAAsAAAAAAAEAAAAmAAwAAAAAAAEAAAAnAAsAAAAAAAEAAAAoAAsAAAADAAcAAAAnAAoAAAAAAAEAAAAmAAoAAAAAAAEAAAAWAAwAAAADAAkAAAAEAP7/AAAAAAAAAAAIAPv/AAAIAAkAAAAKAP3/AAAIAAkAAAAHAP7/AAAAAAAAAAAHAP3/AAAGAAAAAAAIAPz/AAAOAAAAAAAGAPz/AAAAAAAAAAAKAP7/AAAIAAkAAAAHAP//AAABAAQAAAAGAAMAAAALAAAAAABOACIAAAABAAQAAABPACIAAAABAAQAAABQACIAAAAPAAcAAABPACMAAAABAAUAAABQACMAAAACAAsAAAD+/wcAAAAIAAkAAAD8////AAARACEAAAAIABQAAAAIAAkAAAA=") -tile_set = SubResource("TileSet_snsnx") - -[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")] -position = Vector2(120, -15) -player = NodePath("../Player") -_to_scene = 1 -push_direction = 1 - -[node name="DoorSceneManager2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")] -position = Vector2(232, 305) -player = NodePath("../Player") -_to_scene = 1 -push_direction = 1 - -[node name="Player" parent="." instance=ExtResource("1_6iuf6")] -z_index = 1 -motion_mode = 1 - -[node name="Camera2D" type="Camera2D" parent="Player"] -z_index = 4096 -zoom = Vector2(2, 2) - -[node name="PauseMenu" parent="Player/Camera2D" instance=ExtResource("2_4k3ic")] -offset_left = -288.0 -offset_top = -162.0 -offset_right = 288.0 -offset_bottom = 162.0 - -[node name="InventoryMenu" parent="Player/Camera2D" instance=ExtResource("6_a0ayx")] -process_mode = 3 diff --git a/scenes/menu/inventory.tscn b/scenes/menu/inventory.tscn new file mode 100644 index 0000000..adb6fa7 --- /dev/null +++ b/scenes/menu/inventory.tscn @@ -0,0 +1,116 @@ +[gd_scene load_steps=8 format=3 uid="uid://cjvtoi20cy8wi"] + +[ext_resource type="Script" uid="uid://dleuvr2p33hex" path="res://scripts/inventory.gd" id="1_8uk8r"] +[ext_resource type="Script" uid="uid://bxtv6f17pkdmm" path="res://addons/gloot/core/inventory.gd" id="3_jjk0v"] +[ext_resource type="Script" uid="uid://rk48gcn3clet" path="res://addons/gloot/core/constraints/grid_constraint.gd" id="4_0ccc4"] +[ext_resource type="JSON" path="res://objects/item_protoset.json" id="4_bqieh"] +[ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="4_pbytw"] +[ext_resource type="Script" uid="uid://bd75talwyq73v" path="res://addons/gloot/ui/ctrl_inventory_grid.gd" id="6_cca0k"] +[ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="6_em7re"] + +[node name="InventoryMenu" type="Control"] +process_mode = 2 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_8uk8r") + +[node name="Inventory" type="Node" parent="."] +script = ExtResource("3_jjk0v") +protoset = ExtResource("4_bqieh") +_serialized_format = { +"constraints": { +"res://addons/gloot/core/constraints/grid_constraint.gd": { +"data": { +"insertion_priority": 0, +"item_positions": { +"1": "Vector2i(1, 0)", +"2": "Vector2i(2, 0)" +}, +"size": "Vector2i(10, 5)" +}, +"name": &"GridConstraint" +} +}, +"items": [{ +"protoset": "res://objects/item_protoset.json", +"prototype_id": "grid_item" +}, { +"protoset": "res://objects/item_protoset.json", +"prototype_id": "deck_of_cards" +}, { +"protoset": "res://objects/item_protoset.json", +"prototype_id": "base_item" +}], +"node_name": "Inventory", +"protoset": "res://objects/item_protoset.json" +} +metadata/_custom_type_script = "uid://bxtv6f17pkdmm" + +[node name="GridConstraint" type="Node" parent="Inventory"] +script = ExtResource("4_0ccc4") +size = Vector2i(10, 5) +insertion_priority = 0 + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="NinePatchRect" type="NinePatchRect" parent="CenterContainer/PanelContainer"] +modulate = Color(0.831856, 0.844692, 0.906161, 1) +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 +texture = ExtResource("4_pbytw") +patch_margin_left = 15 +patch_margin_top = 15 +patch_margin_right = 15 +patch_margin_bottom = 25 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 35 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="Row1Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +clip_contents = true +layout_mode = 2 +alignment = 1 + +[node name="CtrlInventoryGrid" type="Control" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container" node_paths=PackedStringArray("inventory")] +layout_mode = 2 +script = ExtResource("6_cca0k") +inventory = NodePath("../../../../../../Inventory") +metadata/_custom_type_script = "uid://bd75talwyq73v" + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 +alignment = 2 + +[node name="ReturnButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +modulate = Color(0.901197, 0.823165, 0.861526, 1) +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("6_em7re") +text = "Return" + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/ReturnButton" to="." method="_on_return_button_pressed"] diff --git a/scenes/menu/pause_menu.tscn b/scenes/menu/pause_menu.tscn new file mode 100644 index 0000000..9d68d1b --- /dev/null +++ b/scenes/menu/pause_menu.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=4 format=3 uid="uid://d11oo2pxcah1g"] + +[ext_resource type="Script" uid="uid://dhm3u3n5lqe1f" path="res://scripts/pause_menu.gd" id="1_aq3as"] +[ext_resource type="Script" uid="uid://bxml0kyjdhbw5" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_j81qh"] + +[sub_resource type="LabelSettings" id="LabelSettings_ux7g8"] +font_size = 50 + +[node name="PauseMenu" type="Control"] +process_mode = 3 +z_index = 4096 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_aq3as") + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="PauseLabel" type="Label" parent="CenterContainer/VBoxContainer"] +custom_minimum_size = Vector2(250, 100) +layout_mode = 2 +theme_override_font_sizes/font_size = 16 +text = "Pause" +label_settings = SubResource("LabelSettings_ux7g8") +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 3 +clip_text = true +script = ExtResource("2_j81qh") +_size_just_modified_by_autosizer = false +_set_defaults = true +_base_font_size = 50 +_current_font_size = 50 +_last_size_state = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="SaveButton" type="Button" parent="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer"] +layout_mode = 2 +text = "Save" + +[node name="MarginContainer2" type="MarginContainer" parent="CenterContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="LoadButton" type="Button" parent="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer2"] +layout_mode = 2 +text = "Load +" + +[connection signal="pressed" from="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer/SaveButton" to="." method="_on_save_button_pressed"] +[connection signal="pressed" from="CenterContainer/VBoxContainer/HBoxContainer/MarginContainer2/LoadButton" to="." method="_on_load_button_pressed"] diff --git a/scenes/menu/save_menu.tscn b/scenes/menu/save_menu.tscn new file mode 100644 index 0000000..57c9d94 --- /dev/null +++ b/scenes/menu/save_menu.tscn @@ -0,0 +1,124 @@ +[gd_scene load_steps=6 format=3 uid="uid://bsiy7irf1p5e1"] + +[ext_resource type="Script" uid="uid://dm2h8o2ppm2ou" path="res://scripts/save_menu.gd" id="1_47jxk"] +[ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="1_ejhmr"] +[ext_resource type="Script" uid="uid://bxml0kyjdhbw5" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_mvfow"] +[ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="3_n5hex"] + +[sub_resource type="LabelSettings" id="LabelSettings_q7utc"] +font_size = 32 +font_color = Color(0.900196, 0.84087, 0.882328, 1) +outline_size = 5 +outline_color = Color(0, 0, 0, 1) + +[node name="SaveMenu" type="Control"] +process_mode = 2 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_47jxk") + +[node name="CenterContainer" type="CenterContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] +layout_mode = 2 + +[node name="NinePatchRect" type="NinePatchRect" parent="CenterContainer/PanelContainer"] +modulate = Color(0.831856, 0.844692, 0.906161, 1) +custom_minimum_size = Vector2(100, 100) +layout_mode = 2 +texture = ExtResource("1_ejhmr") +patch_margin_left = 15 +patch_margin_top = 15 +patch_margin_right = 15 +patch_margin_bottom = 25 + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 35 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="LabelAutoSizer" type="Label" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 50) +layout_mode = 2 +theme_override_font_sizes/font_size = 8 +text = "Save" +label_settings = SubResource("LabelSettings_q7utc") +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 3 +clip_text = true +script = ExtResource("2_mvfow") +_size_just_modified_by_autosizer = false +_set_defaults = true +_base_font_size = 32 +_current_font_size = 32 +_last_size_state = 1 + +[node name="Row1Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Slot1Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("3_n5hex") +text = "Slot 1" + +[node name="Slot2Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("3_n5hex") +text = "Slot 2" + +[node name="Row2Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="Slot3Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("3_n5hex") +text = "Slot 3" + +[node name="Slot4Button" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container"] +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("3_n5hex") +text = "Slot 4" + +[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 20 + +[node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 +alignment = 2 + +[node name="ReturnButton" type="Button" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer"] +modulate = Color(0.901197, 0.823165, 0.861526, 1) +custom_minimum_size = Vector2(150, 0) +layout_mode = 2 +theme = ExtResource("3_n5hex") +text = "Return" + +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container/Slot1Button" to="." method="_on_slot1_button_pressed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container/Slot2Button" to="." method="_on_slot2_button_pressed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container/Slot3Button" to="." method="_on_slot3_button_pressed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row2Container/Slot4Button" to="." method="_on_slot4_button_pressed"] +[connection signal="pressed" from="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/MarginContainer/HBoxContainer/ReturnButton" to="." method="_on_return_button_pressed"] diff --git a/scripts/constants.gd b/scripts/constants.gd index 9dec28f..de443bc 100644 --- a/scripts/constants.gd +++ b/scripts/constants.gd @@ -8,7 +8,7 @@ enum LEVELS_NAMES { } const LEVELS_PATHS: Array[String] = [ - "res://scenes/main_level.tscn", - "res://scenes/house_template.tscn", + "res://scenes/level/main_level.tscn", + "res://scenes/level/house_template.tscn", "res://scenes/interfaces/save_menu.tscn", ] diff --git a/scripts/constants.gd.uid b/scripts/constants.gd.uid new file mode 100644 index 0000000..36a32f6 --- /dev/null +++ b/scripts/constants.gd.uid @@ -0,0 +1 @@ +uid://0wnia2p8acl5 diff --git a/scripts/door_scene_manager.gd b/scripts/door_scene_manager.gd index 696744a..04e75ea 100644 --- a/scripts/door_scene_manager.gd +++ b/scripts/door_scene_manager.gd @@ -85,5 +85,5 @@ func change_scene(): changing_scene = true - Globals.request_update_player_position.emit() + Events.request_update_player_position.emit() SceneManager.change_scene(to_scene, scene_manager_options) diff --git a/scripts/door_scene_manager.gd.uid b/scripts/door_scene_manager.gd.uid new file mode 100644 index 0000000..2c090ed --- /dev/null +++ b/scripts/door_scene_manager.gd.uid @@ -0,0 +1 @@ +uid://b5wo0m62qrv44 diff --git a/scripts/events.gd b/scripts/events.gd new file mode 100644 index 0000000..3cd09ee --- /dev/null +++ b/scripts/events.gd @@ -0,0 +1,5 @@ +extends Node + +signal request_update_player_position +signal game_paused(paused: bool) +signal inventory_open(open: bool) diff --git a/scripts/events.gd.uid b/scripts/events.gd.uid new file mode 100644 index 0000000..680aa6c --- /dev/null +++ b/scripts/events.gd.uid @@ -0,0 +1 @@ +uid://rcf2owkufplh diff --git a/scripts/globals.gd b/scripts/globals.gd index 6ce2d34..40573bc 100644 --- a/scripts/globals.gd +++ b/scripts/globals.gd @@ -17,10 +17,6 @@ var player_positions: Array[_PlayerPositionAt] var last_scene_updated: Constants.LEVELS_NAMES -@warning_ignore("unused_signal") # this signal is called by other classes, was never intended to be called from itself -signal request_update_player_position - - func update_player_position(scene: Constants.LEVELS_NAMES, new_position: Vector2): last_scene_updated = scene diff --git a/scripts/globals.gd.uid b/scripts/globals.gd.uid new file mode 100644 index 0000000..2c81bed --- /dev/null +++ b/scripts/globals.gd.uid @@ -0,0 +1 @@ +uid://d2ubolfbi143e diff --git a/scripts/house_template.gd b/scripts/house_template.gd index 456bf50..b5fa12c 100644 --- a/scripts/house_template.gd +++ b/scripts/house_template.gd @@ -8,9 +8,9 @@ const LEVEL_NAME = "house_template" func _ready(): - Globals.request_update_player_position.connect(update_player_position) - Globals.set_current_scene(Constants.LEVELS_NAMES[LEVEL_NAME]) + Events.request_update_player_position.connect(update_player_position) + Globals.set_current_scene(Constants.LEVELS_NAMES.get(LEVEL_NAME)) func update_player_position(): - Globals.update_player_position(Constants.LEVELS_NAMES[LEVEL_NAME], player.position) + Globals.update_player_position(Constants.LEVELS_NAMES.get(LEVEL_NAME), player.position) diff --git a/scripts/house_template.gd.uid b/scripts/house_template.gd.uid new file mode 100644 index 0000000..c6f6a81 --- /dev/null +++ b/scripts/house_template.gd.uid @@ -0,0 +1 @@ +uid://bv1k68dotk1b0 diff --git a/scripts/inventory.gd b/scripts/inventory.gd index 7a2457b..426070d 100644 --- a/scripts/inventory.gd +++ b/scripts/inventory.gd @@ -3,14 +3,17 @@ extends Control var inventory_open: bool = false var save_menu: Node +var game_paused: bool = false + func _ready(): visible = inventory_open + Events.game_paused.connect(_on_game_paused_signal) func _process(_delta): - if Input.is_action_just_pressed("ui_inventory"): + if Input.is_action_just_pressed("ui_inventory") && not game_paused: open_inventory() print("open inventory (", inventory_open, ")") @@ -19,7 +22,12 @@ func open_inventory(): inventory_open = !inventory_open visible = inventory_open get_tree().paused = inventory_open + Events.inventory_open.emit(inventory_open) func _on_return_button_pressed(): open_inventory() + + +func _on_game_paused_signal(paused: bool): + game_paused = paused diff --git a/scripts/inventory.gd.uid b/scripts/inventory.gd.uid new file mode 100644 index 0000000..74f2325 --- /dev/null +++ b/scripts/inventory.gd.uid @@ -0,0 +1 @@ +uid://dleuvr2p33hex diff --git a/scripts/main_level.gd b/scripts/main_level.gd index 75567bb..9036077 100644 --- a/scripts/main_level.gd +++ b/scripts/main_level.gd @@ -8,7 +8,7 @@ const LEVEL_NAME = "main_level" func _ready(): - Globals.request_update_player_position.connect(update_player_position) + Events.request_update_player_position.connect(update_player_position) Globals.set_current_scene(Constants.LEVELS_NAMES[LEVEL_NAME] as Constants.LEVELS_NAMES) # get player poss diff --git a/scripts/main_level.gd.uid b/scripts/main_level.gd.uid new file mode 100644 index 0000000..635b121 --- /dev/null +++ b/scripts/main_level.gd.uid @@ -0,0 +1 @@ +uid://2k5farej1c8m diff --git a/scripts/pause_menu.gd b/scripts/pause_menu.gd index 20df73a..20548a1 100644 --- a/scripts/pause_menu.gd +++ b/scripts/pause_menu.gd @@ -3,24 +3,29 @@ extends Control var paused: bool = false var save_menu: Node +var is_inventory_open: bool = false + func _ready(): visible = paused + Events.inventory_open.connect(_on_inventory_open) func _process(_delta): - if Input.is_action_just_pressed("ui_cancel"): + if Input.is_action_just_pressed("ui_cancel") && not is_inventory_open: pause_game() func pause_game(): # update player position before pausing the execution - Globals.request_update_player_position.emit() + Events.request_update_player_position.emit() paused = !paused get_tree().paused = paused visible = paused + Events.game_paused.emit(paused) + if !paused: close_save_menu() @@ -46,3 +51,7 @@ func _on_save_button_pressed(): func _on_load_button_pressed(): open_save_menu(false) + + +func _on_inventory_open(open: bool): + is_inventory_open = open diff --git a/scripts/pause_menu.gd.uid b/scripts/pause_menu.gd.uid new file mode 100644 index 0000000..0a70c02 --- /dev/null +++ b/scripts/pause_menu.gd.uid @@ -0,0 +1 @@ +uid://dhm3u3n5lqe1f diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..dd0d544 --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://dx15rxub22ius diff --git a/scripts/save_menu.gd.uid b/scripts/save_menu.gd.uid new file mode 100644 index 0000000..294551e --- /dev/null +++ b/scripts/save_menu.gd.uid @@ -0,0 +1 @@ +uid://dm2h8o2ppm2ou diff --git a/vfx/water.gdshader b/vfx/water.gdshader new file mode 100644 index 0000000..022d090 --- /dev/null +++ b/vfx/water.gdshader @@ -0,0 +1,134 @@ +// source: https://godotshaders.com/shader/pixel-art-water/ +shader_type canvas_item; + +uniform float aspectRatio = 1.0f; +uniform float pixelization = 2048.0f; + +uniform sampler2D waterDepthGradient : hint_default_black; + +uniform vec4 causticColor = vec4(0.455f, 0.773f, 0.765f, 1.0f); +uniform vec4 causticHighlightColor = vec4(0.741f, 0.894f, 0.898f, 1.0f); +uniform sampler2D causticTexture : hint_default_white, repeat_enable; +uniform sampler2D causticHighlightTexture : hint_default_white, repeat_enable; +uniform sampler2D causticNoiseTexture : hint_default_white, repeat_enable; +uniform sampler2D causticFadeNoiseTexture : hint_default_white, repeat_enable; +uniform float causticScale = 12.0f; +uniform float causticSpeed = 0.005f; +uniform float causticMovementAmount = 0.15f; +uniform float causticFaderMultiplier = 1.45f; + +uniform vec4 specularColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); +uniform sampler2D specularNoiseTexture : hint_default_white, repeat_enable; +uniform sampler2D specularMovementLeftNoiseTexture : hint_default_white, repeat_enable; +uniform sampler2D specularMovementRightNoiseTexture : hint_default_white, repeat_enable; +uniform float specularThreshold = 0.35f; +uniform float specularSpeed = 0.025f; +uniform float specularScale = 15.0f; + +uniform vec4 foamColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); +uniform sampler2D foamTexture : hint_default_white, repeat_enable; +uniform float foamIntensity = 0.2f; +uniform float foamScale = 15.0f; + +uniform vec4 outlineColor = vec4(0.675f, 0.86f, 1.0f, 1.0f); +uniform float generalTransparency = 1.0f; + + +// ------------------------------------------------------------------------------------ +// Helper functions + +// Blends two vec2's by subtracting them. Compare this to Photoshop blend mode "Subtract". +// Source: +// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html +vec2 blendSubtract_vec2(vec2 base, vec2 blend, float opacity) +{ + vec2 result = base - blend; + return mix(base, result, opacity); +} + +// Blends two floats by subtracting them. Compare this to Photoshop blend mode "Subtract". +// Source: +// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html +float blendSubtract_float(float base, float blend, float opacity) +{ + float result = base - blend; + return mix(base, result, opacity); +} + +// Blends two vec2's by overlaying them. Compare this to Photoshop blend mode "Overlay". +// Source: +// https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Blend-Node.html +float blendOverlay_float(float base, float blend, float opacity) +{ + float result1 = 1.0f - 2.0f * (1.0f - base) * (1.0f - blend); + float result2 = 2.0f * base * blend; + float zeroOrOne = step(0.5f, base); + float res = result2 * zeroOrOne + (1.0 - zeroOrOne) * result1; + return mix(base, res, opacity); +} + +// Pixelizes the given coordinate. +vec2 pixelizeCoordinates(vec2 coordinates) +{ + return floor(coordinates * pixelization) / pixelization; +} + +// Applies the aspect ratio to the coordinates. +vec2 applyAspectRatio(vec2 coordinates) +{ + return vec2(coordinates.x, coordinates.y * aspectRatio); +} + +// ------------------------------------------------------------------------------------ +// Shader layers + +vec4 caustics(vec2 pixelizedCoordinates) +{ + vec4 causticNoise = texture(causticNoiseTexture, TIME * causticSpeed + pixelizedCoordinates); + vec2 noiseCoordinates = blendSubtract_vec2(pixelizedCoordinates * causticScale, causticNoise.rg, causticMovementAmount); + vec4 causticHighlight = texture(causticHighlightTexture, noiseCoordinates) * causticHighlightColor; + vec4 caustic = texture(causticTexture, noiseCoordinates) * causticColor; + vec4 interpolatedCaustics = mix(caustic, causticHighlight, causticHighlight.a); + float fadeNoise = texture(causticFadeNoiseTexture, noiseCoordinates).r * causticFaderMultiplier; + return vec4(interpolatedCaustics.r, interpolatedCaustics.g, interpolatedCaustics.b, clamp(interpolatedCaustics.a - fadeNoise, 0.0, 1.0)); +} + +vec4 specular(vec2 pixelizedCoordinates) +{ + vec2 scaledCoordinates = pixelizedCoordinates * specularScale; + float specularNoise = texture(specularNoiseTexture, scaledCoordinates).r; + float leftScrollingNoise = texture(specularMovementLeftNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed, 0.0f)).r; + float rightScrollingNoise = texture(specularMovementRightNoiseTexture, scaledCoordinates + vec2(TIME * specularSpeed * -1.0f, 0.0f)).r; + return step(specularThreshold, blendSubtract_float(blendOverlay_float(leftScrollingNoise, rightScrollingNoise, 1.0f), specularNoise, 1.0f)) * specularColor; +} + +vec4 foam(vec2 pixelizedCoordinates, vec4 mainTexColor) +{ + vec4 colorizedFoam = texture(foamTexture, pixelizedCoordinates * foamScale) * foamColor; + float intensity = clamp(mainTexColor.g * mainTexColor.a - foamIntensity, 0.0f, 1.0f); + return vec4(colorizedFoam.r, colorizedFoam.g, colorizedFoam.b, colorizedFoam.a * intensity); +} + +// ------------------------------------------------------------------------------------ +// Fragment Shader code + +void fragment() +{ + vec2 pixelizedCoordinates = pixelizeCoordinates(applyAspectRatio(UV)); + vec4 mainTex = texture(TEXTURE, UV); + vec4 depthBasedWaterColor = texture(waterDepthGradient, vec2(1.0f - mainTex.b, 1.0f)); + + vec4 finalCaustics = caustics(pixelizedCoordinates); + vec4 finalSpecular = specular(pixelizedCoordinates); + vec4 finalFoam = foam(pixelizedCoordinates, mainTex); + + vec4 waterWithCausticLayer = mix(depthBasedWaterColor, finalCaustics, finalCaustics.a); + vec4 waterWithCausticAndSpecularLayer = mix(waterWithCausticLayer, finalSpecular, ceil(finalCaustics.a) * finalSpecular.a); + vec4 waterWithCausticAndSpecularAndFoamLayer = mix(waterWithCausticAndSpecularLayer, finalFoam, finalFoam.a); + + float outline = mainTex.a * mainTex.r; + vec4 finalOutlineColor = outline * outlineColor; + + vec4 finalRGBColor = mix(waterWithCausticAndSpecularAndFoamLayer, finalOutlineColor, outline); + COLOR = vec4(finalRGBColor.r, finalRGBColor.g, finalRGBColor.b, mainTex.b * generalTransparency); +} \ No newline at end of file diff --git a/vfx/water.gdshader.uid b/vfx/water.gdshader.uid new file mode 100644 index 0000000..4f15e88 --- /dev/null +++ b/vfx/water.gdshader.uid @@ -0,0 +1 @@ +uid://dsxkpfujpmsuo