From 9e97387a9685b3dce047faef9983b030c22014b0 Mon Sep 17 00:00:00 2001 From: dzhen Date: Thu, 19 May 2022 21:18:05 +0300 Subject: [PATCH 1/7] add customizable base classes --- CMakeLists.txt | 8 +- Controller/controller.cpp | 6 +- Controller/controller.h | 4 +- .../BasicObjects/Entities/Mobs/Basis/mob.h | 3 +- .../Projectiles/autoguided_projectile.cpp | 2 +- .../Projectiles/autoguided_projectile.h | 4 +- .../Entities/Projectiles/projectile.cpp | 4 + .../Entities/Projectiles/projectile.h | 10 +++ GameObjects/BasicObjects/Interface/entity.cpp | 6 +- GameObjects/BasicObjects/Interface/entity.h | 6 +- .../BasicObjects/Interface/graphics_item.cpp | 17 ++++ .../BasicObjects/Interface/graphics_item.h | 19 +++++ game_scene.cpp | 78 +++++++++++++++++++ game_scene.h | 30 +++++++ game_view.cpp | 6 ++ game_view.h | 4 + 16 files changed, 189 insertions(+), 18 deletions(-) create mode 100644 GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp create mode 100644 GameObjects/BasicObjects/Entities/Projectiles/projectile.h create mode 100644 GameObjects/BasicObjects/Interface/graphics_item.cpp create mode 100644 GameObjects/BasicObjects/Interface/graphics_item.h create mode 100644 game_scene.cpp create mode 100644 game_scene.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c6fcf02..588e14f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,9 @@ set(GAME_OBJECTS GameObjects/BasicObjects/Entities/Towers/TowerSlots/test_tower_slot.cpp GameObjects/BasicObjects/Entities/Towers/test_tower.cpp GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp - GameObjects/BasicObjects/Entities/Projectiles/test_projectile.cpp) + GameObjects/BasicObjects/Entities/Projectiles/test_projectile.cpp + GameObjects/BasicObjects/Interface/graphics_item.cpp + GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp) set(UTILITIES Utilities/damage.cpp @@ -42,6 +44,8 @@ add_executable(Game ${UTILITIES} main.cpp main_window.cpp - Controller/controller.cpp game_view.cpp game_view.h constants.cpp) + Controller/controller.cpp + game_view.cpp + constants.cpp game_scene.cpp game_scene.h) target_link_libraries(Game Qt::Core Qt::Gui Qt::Widgets) \ No newline at end of file diff --git a/Controller/controller.cpp b/Controller/controller.cpp index e8b5b76..1d40d80 100644 --- a/Controller/controller.cpp +++ b/Controller/controller.cpp @@ -12,7 +12,7 @@ Controller* Controller::instance; Controller::Controller() : - scene_(new QGraphicsScene(kSceneRect)), + scene_(new GameScene(kSceneRect)), view_(new GameView(scene_)), tick_timer_(new QTimer(this)) { SetupScene(); @@ -23,6 +23,10 @@ GameView* Controller::GetView() const { return view_; } +GameScene* Controller::GetScene() const { + return scene_; +} + void Controller::SetupScene() { { // temporary code QPushButton* close_button = new QPushButton(); diff --git a/Controller/controller.h b/Controller/controller.h index 662a639..0a1d680 100644 --- a/Controller/controller.h +++ b/Controller/controller.h @@ -6,6 +6,7 @@ #include "GameObjects/BasicObjects/Interface/entity.h" #include "game_view.h" +#include "game_scene.h" class Controller : public QObject { Q_OBJECT @@ -13,6 +14,7 @@ class Controller : public QObject { static Controller* Instance(); [[nodiscard]] GameView* GetView() const; + [[nodiscard]] GameScene* GetScene() const; public slots: void TickAllTickables(); @@ -25,7 +27,7 @@ class Controller : public QObject { void SetupScene(); void LaunchTickTimer(); - QGraphicsScene* scene_; + GameScene* scene_; GameView* view_; QTimer* tick_timer_; }; diff --git a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h index b9cee7f..2e3809e 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h +++ b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h @@ -1,9 +1,8 @@ #pragma once -#include "GameObjects/BasicObjects/Interface/entity.h" - #include +#include "GameObjects/BasicObjects/Interface/entity.h" #include "Utilities/vector_f.h" class Mob : public Entity { diff --git a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp index da0a0e7..fff2f2a 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp +++ b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp @@ -8,7 +8,7 @@ AutoguidedProjectile::AutoguidedProjectile( Entity* target, qreal speed, Damage damage) - : Entity(coordinates, pixmap), + : Projectile(coordinates, pixmap), target_(target), speed_(speed), damage_(damage) {} void AutoguidedProjectile::Tick(Time delta) { diff --git a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h index 0a70022..96b23dd 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h +++ b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h @@ -1,8 +1,8 @@ #pragma once -#include "GameObjects/BasicObjects/Interface/entity.h" +#include "GameObjects/BasicObjects/Entities/Projectiles/projectile.h" -class AutoguidedProjectile : public Entity { +class AutoguidedProjectile : public Projectile { public: AutoguidedProjectile(const VectorF& coordinates, QPixmap* pixmap, diff --git a/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp new file mode 100644 index 0000000..01b7ba4 --- /dev/null +++ b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp @@ -0,0 +1,4 @@ +#include "projectile.h" + +Projectile::Projectile( const VectorF& coordinates, QPixmap* pixmap) + : Entity(coordinates, pixmap) {} diff --git a/GameObjects/BasicObjects/Entities/Projectiles/projectile.h b/GameObjects/BasicObjects/Entities/Projectiles/projectile.h new file mode 100644 index 0000000..e0299e5 --- /dev/null +++ b/GameObjects/BasicObjects/Entities/Projectiles/projectile.h @@ -0,0 +1,10 @@ +#pragma once + +#include "GameObjects/BasicObjects/Interface/entity.h" + +class Projectile : public Entity { + public: + Projectile(const VectorF& coordinates, QPixmap* pixmap); +}; + + diff --git a/GameObjects/BasicObjects/Interface/entity.cpp b/GameObjects/BasicObjects/Interface/entity.cpp index 0a48275..11a3f85 100644 --- a/GameObjects/BasicObjects/Interface/entity.cpp +++ b/GameObjects/BasicObjects/Interface/entity.cpp @@ -4,7 +4,7 @@ Entity::Entity( const VectorF& coordinates, QPixmap* pixmap, int health) - : Damageable(health), QGraphicsItem(), + : Damageable(health), GraphicsItem(), pixmap(pixmap) { setPos(coordinates); setFlag(ItemSendsGeometryChanges); @@ -23,7 +23,3 @@ void Entity::paint(QPainter* painter, painter->drawPixmap(Entity::boundingRect().toRect(), *pixmap); painter->restore(); } - -void Entity::MoveBy(const VectorF& delta) { - setPos(pos() + delta); -} diff --git a/GameObjects/BasicObjects/Interface/entity.h b/GameObjects/BasicObjects/Interface/entity.h index a0efcda..e0fb9d6 100644 --- a/GameObjects/BasicObjects/Interface/entity.h +++ b/GameObjects/BasicObjects/Interface/entity.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -11,12 +10,13 @@ #include "tickable.h" #include "damageable.h" #include "Utilities/vector_f.h" +#include "GameObjects/BasicObjects/Interface/graphics_item.h" class Entity : public QObject, public Tickable, public Damageable, - public QGraphicsItem { + public GraphicsItem { Q_OBJECT public: Entity( @@ -29,8 +29,6 @@ class Entity const QStyleOptionGraphicsItem* option, QWidget* widget) override; - void MoveBy(const VectorF& delta); - protected: QPixmap* pixmap; }; diff --git a/GameObjects/BasicObjects/Interface/graphics_item.cpp b/GameObjects/BasicObjects/Interface/graphics_item.cpp new file mode 100644 index 0000000..2b80d7c --- /dev/null +++ b/GameObjects/BasicObjects/Interface/graphics_item.cpp @@ -0,0 +1,17 @@ +#include "graphics_item.h" + +GraphicsItem::GraphicsItem(QGraphicsItem* parent) : QGraphicsItem(parent) {} + +GameScene* GraphicsItem::scene() { + auto result = dynamic_cast(QGraphicsItem::scene()); + assert(result != nullptr); + return result; +} + +GameView* GraphicsItem::view() { + return scene()->view(); +} + +void GraphicsItem::MoveBy(const VectorF& delta) { + setPos(pos() + delta); +} diff --git a/GameObjects/BasicObjects/Interface/graphics_item.h b/GameObjects/BasicObjects/Interface/graphics_item.h new file mode 100644 index 0000000..b6b2739 --- /dev/null +++ b/GameObjects/BasicObjects/Interface/graphics_item.h @@ -0,0 +1,19 @@ +#pragma once + +#include "QGraphicsItem" + +#include "Utilities/vector_f.h" +#include "game_scene.h" +#include "game_view.h" + +class GraphicsItem : public QGraphicsItem { + public: + GraphicsItem(QGraphicsItem* parent = nullptr); + + GameScene* scene(); + GameView* view(); + + void MoveBy(const VectorF& delta); +}; + + diff --git a/game_scene.cpp b/game_scene.cpp new file mode 100644 index 0000000..6a43993 --- /dev/null +++ b/game_scene.cpp @@ -0,0 +1,78 @@ +#include "game_scene.h" + +#include "GameObjects/BasicObjects/Interface/graphics_item.h" +#include "game_view.h" +#include "GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h" +#include "GameObjects/BasicObjects/Entities/Towers/tower.h" +#include "GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.h" +#include "GameObjects/BasicObjects/Entities/Projectiles/projectile.h" + +GameScene::GameScene(const QRectF& scene_rect, QObject* parent) + : QGraphicsScene(scene_rect, parent), + mobs_(std::set()), + towers_(std::set()), + tower_slots_(std::set()), + projectiles_(std::set()) {} + +GameView* GameScene::view() { + auto result = dynamic_cast(QGraphicsScene::views().at(0)); + assert(result != nullptr); + return result; +} + +void GameScene::removeItem(GraphicsItem* item) { + auto mob = dynamic_cast(item); + if (mob != nullptr) { + mobs_.erase(mob); + } + + auto tower = dynamic_cast(item); + if (tower != nullptr) { + towers_.erase(tower); + } + + auto tower_slot = dynamic_cast(item); + if (tower_slot != nullptr) { + tower_slots_.erase(tower_slot); + } + + auto projectile = dynamic_cast(item); + if (projectile != nullptr) { + projectiles_.erase(projectile); + } + + QGraphicsScene::removeItem(item); +} + +void GameScene::clear() { + mobs_.clear(); + towers_.clear(); + tower_slots_.clear(); + projectiles_.clear(); + + QGraphicsScene::clear(); +} + +void GameScene::addItem(GraphicsItem* item) { + auto mob = dynamic_cast(item); + if (mob != nullptr) { + mobs_.erase(mob); + } + + auto tower = dynamic_cast(item); + if (tower != nullptr) { + towers_.erase(tower); + } + + auto tower_slot = dynamic_cast(item); + if (tower_slot != nullptr) { + tower_slots_.erase(tower_slot); + } + + auto projectile = dynamic_cast(item); + if (projectile != nullptr) { + projectiles_.erase(projectile); + } + + QGraphicsScene::addItem(item); +} diff --git a/game_scene.h b/game_scene.h new file mode 100644 index 0000000..69f79b6 --- /dev/null +++ b/game_scene.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include +#include + +class GraphicsItem; +class GameView; +class Mob; +class Tower; +class TowerSlot; +class Projectile; + +class GameScene : public QGraphicsScene { + public: + GameScene(const QRectF& scene_rect, QObject* parent = nullptr); + + GameView* view(); + + void removeItem(GraphicsItem* item); + void clear(); + void addItem(GraphicsItem* item); + + private: + std::set mobs_; + std::set towers_; + std::set tower_slots_; + std::set projectiles_; +}; diff --git a/game_view.cpp b/game_view.cpp index cc91884..59d7a58 100644 --- a/game_view.cpp +++ b/game_view.cpp @@ -18,3 +18,9 @@ GameView::GameView(QGraphicsScene* scene, QWidget* parent) centerOn(0, 0); } + +GameScene* GameView::scene() { + auto result = dynamic_cast(QGraphicsView::scene()); + assert(result != nullptr); + return result; +} diff --git a/game_view.h b/game_view.h index e3bc675..1cdcceb 100644 --- a/game_view.h +++ b/game_view.h @@ -2,7 +2,11 @@ #include +#include "game_scene.h" + class GameView : public QGraphicsView { public: explicit GameView(QGraphicsScene* scene, QWidget* parent = nullptr); + + GameScene* scene(); }; From 60152337f3d0d06d1e1e7ba3716626b86b748fd5 Mon Sep 17 00:00:00 2001 From: dzhen Date: Thu, 19 May 2022 21:56:21 +0300 Subject: [PATCH 2/7] add getters to scene --- game_scene.cpp | 16 ++++++++++++++++ game_scene.h | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/game_scene.cpp b/game_scene.cpp index 6a43993..5d28dcd 100644 --- a/game_scene.cpp +++ b/game_scene.cpp @@ -76,3 +76,19 @@ void GameScene::addItem(GraphicsItem* item) { QGraphicsScene::addItem(item); } + +const std::set& GameScene::Mobs() const { + return mobs_; +} + +const std::set& GameScene::Towers() const { + return towers_; +} + +const std::set& GameScene::TowerSlots() const { + return tower_slots_; +} + +const std::set& GameScene::Projectiles() const { + return projectiles_; +} diff --git a/game_scene.h b/game_scene.h index 69f79b6..f9d1472 100644 --- a/game_scene.h +++ b/game_scene.h @@ -22,6 +22,11 @@ class GameScene : public QGraphicsScene { void clear(); void addItem(GraphicsItem* item); + [[nodiscard]] const std::set& Mobs() const; + [[nodiscard]] const std::set& Towers() const; + [[nodiscard]] const std::set& TowerSlots() const; + [[nodiscard]] const std::set& Projectiles() const; + private: std::set mobs_; std::set towers_; From abf58151ece497b7e820fcda698ba67ae64c2d08 Mon Sep 17 00:00:00 2001 From: dzhen Date: Thu, 19 May 2022 22:17:58 +0300 Subject: [PATCH 3/7] fix cpplint --- GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp | 2 +- GameObjects/BasicObjects/Interface/graphics_item.h | 2 +- game_scene.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp index 01b7ba4..d4bd53b 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp +++ b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp @@ -1,4 +1,4 @@ #include "projectile.h" -Projectile::Projectile( const VectorF& coordinates, QPixmap* pixmap) +Projectile::Projectile(const VectorF& coordinates, QPixmap* pixmap) : Entity(coordinates, pixmap) {} diff --git a/GameObjects/BasicObjects/Interface/graphics_item.h b/GameObjects/BasicObjects/Interface/graphics_item.h index b6b2739..0255ceb 100644 --- a/GameObjects/BasicObjects/Interface/graphics_item.h +++ b/GameObjects/BasicObjects/Interface/graphics_item.h @@ -8,7 +8,7 @@ class GraphicsItem : public QGraphicsItem { public: - GraphicsItem(QGraphicsItem* parent = nullptr); + explicit GraphicsItem(QGraphicsItem* parent = nullptr); GameScene* scene(); GameView* view(); diff --git a/game_scene.h b/game_scene.h index f9d1472..28cbbd4 100644 --- a/game_scene.h +++ b/game_scene.h @@ -14,7 +14,7 @@ class Projectile; class GameScene : public QGraphicsScene { public: - GameScene(const QRectF& scene_rect, QObject* parent = nullptr); + explicit GameScene(const QRectF& scene_rect, QObject* parent = nullptr); GameView* view(); From 6f1825294252f394d2e1b3d12f9ef8b29eaf366e Mon Sep 17 00:00:00 2001 From: dzhen Date: Fri, 20 May 2022 19:21:15 +0300 Subject: [PATCH 4/7] test use of animations, many other fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Если кратко, то вот: 1)Тестовый моб теперь может чуть больше и у него есть анимации 2)Самонаводящиеся пули перескакивают на других мобов при смерти первоначальных --- CMakeLists.txt | 6 +- .../BasicObjects/Entities/Mobs/Basis/mob.cpp | 16 ++- .../BasicObjects/Entities/Mobs/Basis/mob.h | 6 ++ .../BasicObjects/Entities/Mobs/test_mob.cpp | 57 +++++++--- .../BasicObjects/Entities/Mobs/test_mob.h | 11 +- .../Projectiles/autoguided_projectile.cpp | 68 +++++++++++- .../Projectiles/autoguided_projectile.h | 6 ++ .../Entities/Projectiles/projectile.cpp | 5 +- .../Entities/Projectiles/projectile.h | 1 + .../Towers/TowerSlots/test_tower_slot.cpp | 2 - .../Entities/Towers/TowerSlots/tower_slot.cpp | 7 +- .../Entities/Towers/TowerSlots/tower_slot.h | 2 + .../Entities/Towers/test_tower.cpp | 5 + .../BasicObjects/Entities/Towers/tower.cpp | 5 +- .../BasicObjects/Entities/Towers/tower.h | 1 + .../BasicObjects/Interface/damageable.cpp | 4 + .../BasicObjects/Interface/damageable.h | 1 + GameObjects/BasicObjects/Interface/entity.cpp | 29 ++++- GameObjects/BasicObjects/Interface/entity.h | 9 +- Resources/images/fire_totem.png | Bin 0 -> 56556 bytes Resources/images/fire_totem2.png | Bin 0 -> 46781 bytes Resources/resources.qrc | 1 + Utilities/Resources/pixmap_loader.cpp | 86 +++++++++++++-- Utilities/Resources/pixmap_loader.h | 22 ++++ Utilities/animation.cpp | 80 ++++++++++++++ Utilities/animation.h | 35 ++++++ Utilities/time.cpp | 17 +++ Utilities/time.h | 7 ++ constants.cpp | 8 +- game_scene.cpp | 100 ++++++------------ game_scene.h | 21 ++-- 31 files changed, 488 insertions(+), 130 deletions(-) create mode 100644 Resources/images/fire_totem.png create mode 100644 Resources/images/fire_totem2.png create mode 100644 Utilities/animation.cpp create mode 100644 Utilities/animation.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 90a8521..aa74e70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,8 @@ set(UTILITIES Utilities/timer.cpp Utilities/route.cpp Utilities/wave.cpp - wave_manager.cpp) + wave_manager.cpp + Utilities/animation.cpp) add_executable(Game ${RESOURCES} @@ -49,6 +50,7 @@ add_executable(Game main_window.cpp Controller/controller.cpp game_view.cpp - constants.cpp game_scene.cpp game_scene.h) + constants.cpp + game_scene.cpp) target_link_libraries(Game Qt::Core Qt::Gui Qt::Widgets) \ No newline at end of file diff --git a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp index 7b75d16..f494d26 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp @@ -2,21 +2,27 @@ #include #include -std::vector - routes{Route({QPointF(50, 50), QPointF(150, 300), - QPointF(-100, -50)})}; // TODO(parfen01): move in level +std::vector routes{Route({ + QPointF(50, 50), + QPointF(300, 400), + QPointF(-100, -50)})}; // TODO(parfen01): move in level Mob::Mob(const VectorF& coordinates, - QPixmap* pixmap, + Animation* animation, int health, qreal speed) - : Entity(coordinates, pixmap, health), + : Entity(coordinates, animation, health), speed_(speed) { route_ = &routes[0]; route_->AddEntity(this); Entity::setPos(route_->GetStart()); } +Mob::Mob(const VectorF& coordinates, + QPixmap* pixmap, + int health, + qreal speed) : Mob(coordinates, new Animation(pixmap), health, speed) {} + qreal Mob::GetSpeed() const { return speed_; } diff --git a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h index df39368..9a13d04 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h +++ b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h @@ -12,6 +12,12 @@ class Mob : public Entity { QPixmap* pixmap, int health, qreal speed = 0); + + Mob(const VectorF& coordinates, + Animation* animation, + int health, + qreal speed = 0); + [[nodiscard]] qreal GetSpeed() const; void SetSpeed(qreal speed); diff --git a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp index 70086f2..350ac12 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp @@ -1,12 +1,23 @@ #include "test_mob.h" -#include +#include #include "Utilities/Resources/pixmap_loader.h" #include "constants.h" void TestMob::Tick(Time delta) { - if (!Mob::route_->isEnd(this)) { + Mob::Tick(delta); + if (is_creating_ && animation_->WasEndedDuringPreviousUpdate()) { + is_creating_ = false; + animation_ = idle_animation_; + } + if (is_destroying_ && animation_->WasEndedDuringPreviousUpdate()) { + animation_->SetIndex(animation_->FrameCount() - 1); + std::cout << "test mob will be destroyed" << std::endl; + deleteLater(); + } + + if (!is_creating_ && !Mob::route_->isEnd(this)) { Mob::route_->Move(this, Mob::speed_ * delta.seconds()); } } @@ -23,26 +34,46 @@ void TestMob::keyPressEvent(QKeyEvent* event) { setPos(pos() + velocity_vector); } else if (event->key() == Qt::Key::Key_Down) { setPos(pos() - velocity_vector); + } else if (event->key() == Qt::Key::Key_Space && !is_destroying_) { + health_ = 0; + is_destroying_ = true; + disappearing_animation_->Reset(); + animation_ = disappearing_animation_; } } void TestMob::mousePressEvent(QGraphicsSceneMouseEvent* event) { - scene()->addItem(new TestMob(pos() + VectorF{10, 30})); + scene()->addItem(new TestMob(pos() + VectorF{100, 100})); } TestMob::TestMob(const VectorF& coordinates) : Mob( - coordinates, - PixmapLoader::Pixmaps::kTestMob, - Entities::TestMob::kHealth) { + coordinates, + // TODO(jansenin): Было бы лучше инициализировать анимации отдельно от моба + new Animation(PixmapLoader::Pixmaps::kFireTotemAppearing, 50_ms), + Entities::TestMob::kHealth, + 100), + is_destroying_(false), + idle_animation_(new Animation(PixmapLoader::Pixmaps::kFireTotemIdle, 50_ms)), + disappearing_animation_(new Animation(PixmapLoader::Pixmaps::kFireTotemDisappear, 50_ms)), + appearing_animation_(animation_), + is_creating_(true) { setFlag(QGraphicsItem::ItemIsFocusable, true); + setScale(1.4); } -void TestMob::paint(QPainter* painter, - const QStyleOptionGraphicsItem* option, - QWidget* widget) { - Entity::paint(painter, option, widget); - if (health_ == 0) { - painter->drawLine(-50, -50, 50, 50); - painter->drawLine(50, -50, -50, 50); + +TestMob::~TestMob() { + delete idle_animation_; + delete disappearing_animation_; + delete appearing_animation_; +} + +void TestMob::ApplyDamage(Damage damage) { + Damageable::ApplyDamage(damage); + + if (health_ <= 0 && !is_destroying_) { + disappearing_animation_->Reset(); + is_destroying_ = true; + animation_ = disappearing_animation_; } } diff --git a/GameObjects/BasicObjects/Entities/Mobs/test_mob.h b/GameObjects/BasicObjects/Entities/Mobs/test_mob.h index 3f483bf..0c0db01 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/test_mob.h +++ b/GameObjects/BasicObjects/Entities/Mobs/test_mob.h @@ -10,12 +10,17 @@ class TestMob : public Mob { explicit TestMob(const VectorF& coordinates = VectorF{0, 0}); void Tick(Time delta) override; + void ApplyDamage(Damage damage) override; - void paint(QPainter* painter, - const QStyleOptionGraphicsItem* option, - QWidget* widget) override; + virtual ~TestMob(); protected: void keyPressEvent(QKeyEvent* event) override; void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + + bool is_destroying_; + bool is_creating_; + Animation* idle_animation_; + Animation* disappearing_animation_; + Animation* appearing_animation_; }; diff --git a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp index fff2f2a..3e690e6 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp +++ b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp @@ -1,6 +1,20 @@ #include #include "autoguided_projectile.h" +#include "GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h" + +AutoguidedProjectile::AutoguidedProjectile( + const VectorF& coordinates, + Animation* animation, + Entity* target, + qreal speed, + Damage damage) + : Projectile(coordinates, animation), + target_(target), speed_(speed), damage_(damage) { + connect(target_, &Entity::destroyed, this, + &AutoguidedProjectile::FindNewTargetOrDie); +} + AutoguidedProjectile::AutoguidedProjectile( const VectorF& coordinates, @@ -8,10 +22,21 @@ AutoguidedProjectile::AutoguidedProjectile( Entity* target, qreal speed, Damage damage) - : Projectile(coordinates, pixmap), - target_(target), speed_(speed), damage_(damage) {} + : AutoguidedProjectile( + coordinates,new Animation(pixmap), target, speed, damage) {} void AutoguidedProjectile::Tick(Time delta) { + Projectile::Tick(delta); + if (target_ == nullptr) { + return; + } + if (target_->GetHealth() <= 0) { + FindNewTargetOrDie(); + } + if (target_ == nullptr) { + return; + } + Move(delta); if (target_->collidesWithItem(this)) { @@ -21,9 +46,48 @@ void AutoguidedProjectile::Tick(Time delta) { } void AutoguidedProjectile::Move(Time delta) { + if (target_ == nullptr) { + return; + } VectorF target_point = target_->scenePos(); VectorF delta_pos = target_point - scenePos(); VectorF velocity = delta_pos.normalized() * speed_; MoveBy(velocity * delta.seconds()); } + +void AutoguidedProjectile::FindNewTargetOrDie() { + if (scene()->Mobs().empty()) { + SetTarget(nullptr); + deleteLater(); + } else { + auto old_target = target_; + for (auto new_target : scene()->Mobs()) { + if (new_target != target_ && VectorF(new_target->scenePos() - scenePos()).length() < 100) { + SetTarget(new_target); + break; + } + } + if (old_target == target_) { + SetTarget(nullptr); + deleteLater(); + } + } +} + +void AutoguidedProjectile::SetTarget(Entity* target) { + // TODO(jansenin): what if target_ is destroyed? + disconnect( + target_, + &Entity::destroyed, + this, + &AutoguidedProjectile::FindNewTargetOrDie); + target_ = target; + if (target_ != nullptr) { + connect( + target_, + &Entity::destroyed, + this, + &AutoguidedProjectile::FindNewTargetOrDie); + } +} diff --git a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h index 96b23dd..75c2b9a 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h +++ b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.h @@ -8,10 +8,16 @@ class AutoguidedProjectile : public Projectile { QPixmap* pixmap, Entity* target, qreal speed, Damage damage); + AutoguidedProjectile(const VectorF& coordinates, + Animation* animation, + Entity* target, qreal speed, Damage damage); + void SetTarget(Entity* target); + void Tick(Time delta) override; protected: void Move(Time delta); + void FindNewTargetOrDie(); Entity* target_; qreal speed_; diff --git a/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp index d4bd53b..6e3aa13 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp +++ b/GameObjects/BasicObjects/Entities/Projectiles/projectile.cpp @@ -1,4 +1,7 @@ #include "projectile.h" Projectile::Projectile(const VectorF& coordinates, QPixmap* pixmap) - : Entity(coordinates, pixmap) {} + : Projectile(coordinates, new Animation(pixmap)) {} + +Projectile::Projectile(const VectorF& coordinates, Animation* animation) + : Entity(coordinates, animation) {} diff --git a/GameObjects/BasicObjects/Entities/Projectiles/projectile.h b/GameObjects/BasicObjects/Entities/Projectiles/projectile.h index e0299e5..64e1870 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/projectile.h +++ b/GameObjects/BasicObjects/Entities/Projectiles/projectile.h @@ -5,6 +5,7 @@ class Projectile : public Entity { public: Projectile(const VectorF& coordinates, QPixmap* pixmap); + Projectile(const VectorF& coordinates, Animation* animation); }; diff --git a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/test_tower_slot.cpp b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/test_tower_slot.cpp index 2706df1..621fea4 100644 --- a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/test_tower_slot.cpp +++ b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/test_tower_slot.cpp @@ -1,7 +1,5 @@ #include "test_tower_slot.h" -#include - #include "GameObjects/BasicObjects/Entities/Towers/test_tower.h" #include diff --git a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.cpp b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.cpp index 4169abb..5f158a8 100644 --- a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.cpp +++ b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.cpp @@ -13,9 +13,14 @@ void TowerSlot::ClearArea() { } TowerSlot::TowerSlot(const VectorF& coordinates, QPixmap* pixmap) - : Entity(coordinates, pixmap), tower_(nullptr) {} + : TowerSlot(coordinates, new Animation(pixmap)) {} + +TowerSlot::TowerSlot(const VectorF& coordinates, Animation* animation) + : Entity(coordinates, animation), tower_(nullptr) {} void TowerSlot::Tick(Time time) { + Entity::Tick(time); + if (tower_ != nullptr) { tower_->Tick(time); } diff --git a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.h b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.h index e6dff12..d281e4f 100644 --- a/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.h +++ b/GameObjects/BasicObjects/Entities/Towers/TowerSlots/tower_slot.h @@ -6,6 +6,8 @@ class TowerSlot : public Entity { public: TowerSlot(const VectorF& coordinates, QPixmap* pixmap); + TowerSlot(const VectorF& coordinates, Animation* animation); + [[nodiscard]] bool IsTakenUp() const; void TakeUpArea(Tower* tower); void ClearArea(); diff --git a/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp b/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp index 5865452..b0a79b0 100644 --- a/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp +++ b/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp @@ -30,6 +30,8 @@ TestTower::TestTower(const VectorF& coordinates) } void TestTower::Tick(Time delta) { + Tower::Tick(delta); + attack_timer_.Tick(delta); if (attack_timer_.IsExpired()) { @@ -37,6 +39,9 @@ void TestTower::Tick(Time delta) { scene()->items(scene_attack_area_); for (QGraphicsItem* item : items_in_attack_area) { if (Mob* mob = dynamic_cast(item)) { + if (mob->GetHealth() <= 0) { + continue; + } scene()->addItem(new TestProjectile(scenePos(), mob)); attack_timer_.Start(Entities::TestTower::kAttackCooldown); break; diff --git a/GameObjects/BasicObjects/Entities/Towers/tower.cpp b/GameObjects/BasicObjects/Entities/Towers/tower.cpp index a5269ef..f92c0af 100644 --- a/GameObjects/BasicObjects/Entities/Towers/tower.cpp +++ b/GameObjects/BasicObjects/Entities/Towers/tower.cpp @@ -1,4 +1,7 @@ #include "tower.h" Tower::Tower(const VectorF& coordinates, QPixmap* pixmap, int health) - : Entity(coordinates, pixmap, health) {} + : Tower(coordinates, new Animation(pixmap), health) {} + +Tower::Tower(const VectorF& coordinates, Animation* animation, int health) + : Entity(coordinates, animation, health) {} diff --git a/GameObjects/BasicObjects/Entities/Towers/tower.h b/GameObjects/BasicObjects/Entities/Towers/tower.h index 81f2dd2..4a41492 100644 --- a/GameObjects/BasicObjects/Entities/Towers/tower.h +++ b/GameObjects/BasicObjects/Entities/Towers/tower.h @@ -5,4 +5,5 @@ class Tower : public Entity { public: Tower(const VectorF& coordinates, QPixmap* pixmap, int health = 0); + Tower(const VectorF& coordinates, Animation* animation, int health = 0); }; diff --git a/GameObjects/BasicObjects/Interface/damageable.cpp b/GameObjects/BasicObjects/Interface/damageable.cpp index 739c492..1f9c3a6 100644 --- a/GameObjects/BasicObjects/Interface/damageable.cpp +++ b/GameObjects/BasicObjects/Interface/damageable.cpp @@ -14,3 +14,7 @@ void Damageable::ApplyDamage(Damage damage) { void Damageable::SetHealth(int health) { health_ = health; } + +int Damageable::GetHealth() { + return health_; +} diff --git a/GameObjects/BasicObjects/Interface/damageable.h b/GameObjects/BasicObjects/Interface/damageable.h index 53527b3..daac308 100644 --- a/GameObjects/BasicObjects/Interface/damageable.h +++ b/GameObjects/BasicObjects/Interface/damageable.h @@ -6,6 +6,7 @@ class Damageable { public: explicit Damageable(int health); virtual void ApplyDamage(Damage damage); + int GetHealth(); protected: int health_; diff --git a/GameObjects/BasicObjects/Interface/entity.cpp b/GameObjects/BasicObjects/Interface/entity.cpp index 11a3f85..9fb111f 100644 --- a/GameObjects/BasicObjects/Interface/entity.cpp +++ b/GameObjects/BasicObjects/Interface/entity.cpp @@ -1,25 +1,44 @@ #include "entity.h" +#include + Entity::Entity( const VectorF& coordinates, QPixmap* pixmap, int health) - : Damageable(health), GraphicsItem(), - pixmap(pixmap) { + : Entity(coordinates, new Animation(pixmap), health) {} + +Entity::Entity(const VectorF& coordinates, Animation* animation, int health) + : Damageable(health), + GraphicsItem(), + animation_(animation) { + animation->Frame(); setPos(coordinates); setFlag(ItemSendsGeometryChanges); } QRectF Entity::boundingRect() const { + const QPixmap* frame = animation_->Frame(); return QRectF( - pixmap->rect().translated( - QPoint{ -pixmap->width()/2, -pixmap->height()/2 })); + frame->rect().translated( + QPoint{ -frame->width()/2, -frame->height()/2 })); } void Entity::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { painter->save(); - painter->drawPixmap(Entity::boundingRect().toRect(), *pixmap); + static QPen pen(QColor(0, 0, 255, 50)); + painter->setPen(pen); + //painter->drawRect(boundingRect()); + painter->drawPixmap(Entity::boundingRect().toRect(), *animation_->Frame()); painter->restore(); } + +void Entity::Tick(Time delta) { + QPixmap* previous_frame = animation_->Frame(); + animation_->Tick(delta); + if (previous_frame != animation_->Frame()) { + update(); + } +} diff --git a/GameObjects/BasicObjects/Interface/entity.h b/GameObjects/BasicObjects/Interface/entity.h index e0fb9d6..d6a8bc5 100644 --- a/GameObjects/BasicObjects/Interface/entity.h +++ b/GameObjects/BasicObjects/Interface/entity.h @@ -11,6 +11,7 @@ #include "damageable.h" #include "Utilities/vector_f.h" #include "GameObjects/BasicObjects/Interface/graphics_item.h" +#include "Utilities/animation.h" class Entity : public QObject, @@ -24,11 +25,17 @@ class Entity QPixmap* pixmap, int health = 0); + Entity( + const VectorF& coordinates, + Animation* animation, + int health = 0); + [[nodiscard]] QRectF boundingRect() const override; void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; + void Tick(Time delta) override; protected: - QPixmap* pixmap; + Animation* animation_; }; diff --git a/Resources/images/fire_totem.png b/Resources/images/fire_totem.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dc40a141417d65a34b71b8c604dcdec3be6159 GIT binary patch literal 56556 zcmd@6XH-+`7e0yx1lfRy8&njes6bS@^cso+p(;|OB?wBd(m@gg8zL=8k&g5(9Rf)# zARy99sEGnnq=XtuLUI=S_dg%bx!>-$J1!$*ID}-a`OZ1tIiGhv&q~Za6Fm+#UN#U2 z!~xa6V+I19iUffee*JSA_{}c-lrZoQgTI-cHmJJ)$_fZ11cKhtG7rgGn?=66vJ|m& zXu5?z^ZI&FtWMY~kJ=UCYusKc4a*ZUCQeW46Xkm*GG|2p9T!S{^^{EkRExZGSFkO(_Fx-PgWyEj~(QPR8_EKQfwXZcEi`gNYU23I3Rln*XE+>(>_^Gv;`$ z!%>EYl;`{{DX$1ayBz6R>{FP}6t|(#ZCHyji-G2xk{mroz|#M}`bp$^858xiKsoMA zg6q<<3G``K*LRVgIE^Nn+-@zCizk3Qzj z9?sq}Iv=&*y#1x;7jnjlQX_re_jrF_@=f5|SbK>MoD=2j&G}V_K?#BCWBCkh$irdT z3yR(_5J=_A${r(V*%ZN%Y74tzh!Pdd^86d&U-OeWft{P#BCXscuxu*n$=dt9@7|9i z_&repxy>^+nELWRDNoj~%$D&PD$Z=x`nhaPeH4R|ono(tt`1TaS7i(@avIL-iEYfS zJoC+&4f;$$lDfn;#&F%L!8L}N!O%8{g`bGqRsi8L?wkozmsCJ-D+A~_f$5wkxCNEg zzLq)ByutYap5Dw(w^oKViUeKvSp7U|S>4|J@weBv>g;x74W+VHtHr1nN=FkDwGprV zcgBsIrSA{^2p8+$YAD`CH`q$qg-bxolIYFKGUuD<0MRRR2&3 zq*i|w$-pVMQY1n6IVdv7AmS0DX45+$2%%3V;}mSgbJ3MO1IUlwv{or(h4&Hl>$3w4 z`x78aO1)ye>+oL+HezJpPh#oLjwTtFA(j2q1#N@&pMC@uUs8kO+}~ z9R4a~Yinj1F}{8N3Ha6b$6F5Tfsn(bg+k2f!uxB9)nwWCpvj(i z^ITAN#aJY?yn-R+_I-9<;m>~_q4dwY!Q7Y zgxI0+LHDz>{regMN?4*sTr7??FBimOtf|w8G27|M749qD`1odWV=){AdRSwOfq@*( zb;P~q*}?P76K5Zy|1D>z_rT1#e_neG_9lGYSf5g?HEkxg@vlqV4&?0=*tau?Cn9oE z0?!#6fn!|-MyFU&o^fpqW;M7gBh(CMRo6iaw zIdTU}W!ZNt?(D@*uE-KF-ko-?{1e)>dW(H;UDr!SvAp+g9yjLsv3`04{yc<>%3Ygm zd=)nya}v0RQe2vO^)r9X#!~)rV{YuAKXf7Cx7gdNZpRqcv)&s=2|{^$6UL0$xzJ_h z`*@)y=cQSVcJ;;C6>j_s*|O_b%CN;!E3(7xgWL`v&7efUO2-WM4;6bm>^p(;)0dsa zmBIyfu;TKEHnObl3JgCSw(C`Kws9MD+nVKwNb4!VcYw_jV<49;M$OSYkJvhBgtB@=kwxW-61w#} z-c#?ZzLE3fo_jq$cVbM~lL}#m$M0tE-}N0xkjGl@`psOR%YoJJdx&cFiE3UpLJ+XD zpi;M-$#^Y04oAhg#kdX5ArdsYB?De2YwS=IfM?Q60-XX4zk+E#KkF8%*3RU%u_yg^ zebuMU4_@4|`Cq_3Y7><~onOB&Vh^(pIzBwQ#@f&s_ZqynbP((zqE$tXPZxPPI~~2y z{BJmAIwRC)szV;hAwuJGW#qHUOmA}j6rBTjpzdY;KPvHln_oX>YwgY-1osJRL4oA> zu+V&;8h2X5N8!1VSpC|N@TU~sU%EYTUXC!J2zFoO(hT68|7DH({;hZWAlPr*Ac|K+ z)7k_f%q*Wv4)KltT78&ux`egT>%Vw4C4xRW*<5BB=sr>k(G{Ej{Un0grWBpUblF3s zuGm4)>T@&RHkE76(p`#D##*U$atlV_7UnZbA!bTLv4&^rRnF$r4w+m%DjIq1oS~(= zA6F>~xew)0<>g??3G9N2Y|NQmze%Q=48Hz(nVe~p)#Cr+*jcXx~! zF+LtpwN`tGuaxXt6BkI`HR`liYp-rT z1v)ygBbVHf{e94syxGV7G9?%)L<}7+v zm%B`kjArr=e^PiOyba{bx4ep2*VeXn@?*8EW8el>jO`&Rxktn^pu9GH&`@BsG~mVR zC=X!G634oH7fTHtlk;vO?Yb_HacL!=`%u`0%o$tgQm{fVbUxZ3?S_YrnOkIRxn$f= zJjb%?Qf@;LTMUECl8rjY@OJo!rY+An6-=#@bYoVa{AbJcW#G;d5d(9-H{nw929e3} ze$HWLU)u@u-3KqH1OZ?LEYMwj{#Qx@d^DKsyhMZ80y!jd;p`I7&dqq@W;8@E%FlxfUV&2+MpV`wVjgZAYmV_86vmOu_)x8Y?W9UOM} zZJq!LVK-M~aBAD^$82r6%0KU*k96}Ai4P7WA<*w(hL z2)2~RN!M(T*}|?Z__Tc`_?Ae$#JtvCy+#g%W|W`i|NT?yr^jBuJ6=_X7bnzOqikG7 znPBJdQ+S>dB|NC+{dcEoVC9j2*96nUBKJY6a?8PQI%fvNmgk?SJBJ2JeyMf%lM(?F zj$D58YW~+<_QRs1sGNu=cAZ(TZlkEetZdb?TTq7po5R0V_qMG<+BHs@7$z&))xSWuq3pQ{5hi+-V)kV&i^EknrS_yTURc#l(zxlo4eT?YCKH zMoD>$c!W(|INZw6_9}HAbsmq!Vb>U2ZoVLw_t+LhZQ4K+O>XT@jGp`O0_@c@pnGTj zO}zi*h%4)$8{X=>Hp9n3wek%^qMsC2a|S!`h3GpsHo}dfrVLPMfj$}`>P6#_dYXA{vq}JrI*qjVQ(*W(FeDg;yRw^K#?$(C`WmT4(i2F5IBmW(yq8 zz}^ykc&v78mHci@U}KE!@L}HeYWh0Hz6GMi#v-4G?o8C|d6dQgz2+oYgR}z6%9DQo zi$8Dkv4^-2ot%H?Q~SN~?#(y0_U_eAZ(#1lLIV6Ore>b?rq^9*H<@Gd4<#w8;Ym#I zXhxm<>T~EZdOJCII$It9IAs@hsf(~b^E^6zY9jJ>Qlf8(hW^0(keyWCA%uv5w*grBLu%?z^?=5%xi~}{kv@T{S;Kfr(aNof`c5>~kjJPNb z*eK=hhEn0DB^I@(^P41p0N_(9z0brkJ}bhgzH{dUWcJDWP0bkD4W(czSOz2O}9O@YtDGhE;LL%(ko2s(mebt!QnOg{_h?98;{~CAe7MDTuZ;k^wn0D zfGQ@Xb>ok~Awq|7;sjCyFq_?EuK2a0>QE*;y=HdjPo}uQnX&YukDmmcfOwjhpN2X# zoHJ8A3!Bj-T7KklKXMCW+=UajA544nz{{qRC5c^9`l^kHt7 zOjnQ$%P(xg5r1CS?ud%SI3spw!0$XZQd)zg+->h>;;Ku?vOnY^>ARNj6OYPU#tJ!B^%5v&AmQ%~MKJuL5S~F$8lcDL&n@X@v z)Jl4}no>CRnHL%={nM9$rZz;7YMW&G5jt%6%!gw= zSX=%+LgFFqQB6TQ2Qtb26z`;7P~)7L4XzW8d22%Fs38{OLpbxETx#vq;nK+QtZ z!s1icZoR5@jK`vqMT$ZBSkPs%x*zQxt1TA%hn~AR4L}Mz`(+a?S8CJ(q3lOQpWl^M z@0QG9pUG?%s@M23qB9xw*7#YzJzqH?Ayx_TMJh5g%0(NjiCp}tJOz$3rCU^y6&_ll zRt~^&v+Y5W)af@D$s<|R4~rQrLG%|3f&ZLuaS3=Rh1>piZ*Fs23^J--@U6eiP%M9- z6|w#bhC7Pxm-OVD$Y$sxgx<%A;$AydkoOBXX%A;9AF~OUoDr0d>29Yzf|LxYgj+5&(zpsO(T6()(o{(T1p$Mq6|r103Zhyj1N~|~X86YWyc~C>e5_pG zYPl9i{=%MiXd5=UJ4Yr)^RwLSuE&~l?9yu2R~4&@o(jYGweXqZ$`x5QuBacep)Org zA<45YMVU1rjRmudYAcHSamI`nOdQ^}`qo?CY=`~ya3;R7RlLc4D@2zqpP(UAQZ+wZ zttYnElWUIC@C-`+W!6|-+_|fg@%^ih()}t^0`Dj<^N3DNCw9|_>?0|$#Ufv4Y3A&% zV*Fpiizq%n{v5%5BiUb zz8(ZUx%Hd`jKa#mtPTa$)Dg41$v1hrp1K($?65}&UAD2H_tdHC%N3{2XS0G0{*5i! z>Gvw~=YQ$WFweAQGvKnoNf(lOB!^MW=^aD;y40W8u)RNA1;#A+?7mse2><$h`m#AU zSF+}H?{?L;Rwuck#>tpR9Y2UZ&n8txjws&BNma3}SOp~xR?RH*L~>=V35p=d>s=5l zPl!vOPqM#$C1CNvPbi&=fWo*ZnhCq2T_QR|#kD{x=wN6_+*N28#(b>hyyuRbJi}S{ zqxA^#&bn#j`ap2MMC;T|sL4Px1SAxW4%#mDzy>y8^}hW`IqqNgDJ%{C7HFg98EEB$ zXS}OQeRDCOfIs&VB5rDKr9F9kkE`QK)rt&%-g)lvZ>^{0b)0AK;tMdu^B#>+%~Jc` zIKSLIRNXp-y6zq8Z5SSA-}h?Q(w-YrJ&s=8p6P(zo4;+CZDK)&v=Z%6bHOeOL?l|nl zWDo%K8k4`C?0-E$YVAb04mUo=ng^%P_z%d{e&0l3AjE1-hxwbU6ncF z)eK$;OFolsV#F)*EROB#WqpuN^!u(0uQH&oOl@ki-+hoe5`Z@MtMtdwhbh7iD~i-9 z{hJywP#ds}4r~4-N#6OP7#2`_m zfmORg_?5v4o7%lk$r`vxr%iqd;mB;y+p8L4E736SK{U^F3P?{fscRDNtBJ zg?waS5Bxpc_Wk0W66@I4MR0%cEKvLI89L5!VRf02^N-OPY9eJ~2bmeFHv`}fn|9@J za8MlF?Dx^U?gx1 zMY|xJHs{#*YEZf{r)jGMvxqZOiRTM4d@Ti}=i!4M zt^EmIeUDRD33xPQf;a_*<~NWrHA4dll`L)%tJjn`T@DzUy4&s_I^=A=PJ z+Arz4jR?Pif)V4du3-$AI%1DH2Hu|Jw|Z>Kq)V;I*B5J*ip(w+;$YlpXv z`ddSD!F=YLzV2ASBvh@?Yx*Xw8aX)G9vr)YwKE<&_Kr)xGq`Iu^=YZAB?FtB6#6!4 zDv9DxgTut&HOpjtg@FgyplbIF`rv)Nv%g;3Y2T_)1`z0;4&$5ZhxN+oQ^C20880$! zDJYA7l?cYwAJ<5s@$|*${=dPPJ(&hL@6kOk&_QJl4?t7w0>|k==GyG&OU2FuH4IH2 zO{GKsKS%PocJ8P?9j>A0Q>gKFH9X9~y09mc<2-m02s%LjGh$Mc1~>?$$#Vw4kHC92 zPbiwa0nEcoD8w=6EDyVm1f~Yg1?CcxdwPtegk$~z{_a|`C#)%Yxbm85x$|q{uF(^F zR-qW~qscwW2AE;ZpX^sT>0}Mzr!#=`DY`TeC#-;^Zc3IipTFiG>|F!Jih~=`0Ul2C7j;H5%k-~XE@UZHl{UmWl(4aNHF=(ExW=Pu`chMJr8vyQ-IsKfEwZLVI zE`!{8UMz*-5SU-zPB1n*`2Ft#d@^X3l3870W)Zg1`V-6;#4!;|JVX^__F<$}{rJL3 z)+xf6?Y}(PB=^Fy{m06`nL$EgDnur^?+5p55>-oC6VD4$^1xj~OgC03uc49T_-gln z*M-0NYXd$Ij<>V4}YKGYJKr5~LVVfNp$VeRqgU>y9E zsQm01ERid(b0k!6U*EKS2=2!KN_?UY1@V|J@h3B#{iyrWK~)*1mbEUtdC0HKf5~=e zc)gF8AKm7hj1^+IH8$XcDignuxXvr29^l#cB4`yxqHinm`(RIH+ha|pRsW8GR`Q*~ zHuIgl8+2tiG`j!zsKjfC&(g=*P~O3QZquabaH}Fm6MRl!ma3)fftDL1p_I8hmDO!T zeRz<;ZGjWrW(NYDL05w#=Xu(-LGliJO-7>vdYNyWWf)KkBAT=aO%Hi5S=M{^T;tnm zK#czUHAPCvHb#9>zo!vS5fxz&JzRaQy@idgXgr8*&C?y}z}|vvg^y71oHEm|&K^wf zTyLB(T3g)D-iuYMdZ@N`eEPe_3Y;po=+2`GWHmlOj-eevJg(hW5xEeuCK`#y!o;pj z?sGl4$#7fV0X6PP14C`ew`xxt{eUq(&Y)io*Rv|hj3e!_v%L^3GyNxr-dmClR;eq@ zezfr%C49kuYS*i#fV*dPZGn*RIyn+y7)j=T$dS=tN$>D$68HzKi84Q4ZLg=6(PHh( z6IPBQ_B||om}(P%!wT8Y``o*Tx;X`v?+l>G{#94T7W5K_#Kx9@;)Bn%r02X3T271W zi{5?@f;RGga^7&UtvD_2!I~(%(wws`cx8lOg)3c3dm0uVVBLv43bJZ?jchTc#`swp*U21$H++lrpIgT%Cf z9s+hIi=nIEDqGMyrlmZK!4IKfq&-hKhzTTA1#GqqUQBAuHpS}oYk?jpPkUGKp+hQ{ zP}^zG9myK96IJ`!)h_*VhF-@nOB5>v@vvvO)`8!1nu^t^3%2g$r216PPWH^=N~-GRC~41!5>~hCx9n0PW8#OWx>{yj zW_~fo*sCJQw)8gH<2L%Yv0NHVFO3HjsWmvnG#Fv3r6sk0xu(pjf!r$>Q$dTFcioHM zeZtH3%ZIwWpS?flT*sB) z`3+W8yD)YIx3k_}f1_rzEg-zUTHLE|rZW;K7%n@KE7{0JbsTxGU6x$9YA_~5_F@4h z1xb)n`*YTqYZ%;ux`2vMij>z_+-l~oKe5|{@mz4tk}9!ZHJD~MwIc>I{uM|6rDS{d z1+jiT61k;6oXt!+OoW)GB6y0KJ5Jt6x>C9qGFi%9xgY$eVf~odO0RslHH#2BTOkpC z(9C0x+08QVhjBdIMVNjg5JlWZUI&G6{$&1~3`?E_OPV)^43gB*hP`J%nvj#dLU}NL zkF%(}>6s?lzsiyl7$HJhJJN$C175Y;|Bmcc6}{X--i9qL5(#VsfdGM|eBOL@9GAdf z$5oo|HW;e4M*rg1^bUF*LP9G_y;CuyJDaN_JnVcT)*P2*>(A3ShFivhUmRv&sO zp|!SwIC-^7!XrFQC9x3F-G3YvT+=g+-JY|iIUi^zKqHN|aqE$C<-Okb zRAJ@r(|SSr=rSJqUQ60PL6CQWu>hl}=g)hXsMsfWYId7_9`;qtt?Yep)Wq@r@+!^c z$#M$|NOLMsoMA?IC1R&TYLNJ#@`9&`8y?q?lU6>Z95yL$h3qnc`SH*dNOqazoHo)S z>z|jN0qN&DeAwy`4<-hUzNBoF2hrTu8~JUK3xCrac4tggGK24OtyF%OavQ)sbs{18 zF2jBIddhcO+jk#((PneE-A&DZLOV;SOgH%E$aIH9N^{lalJa4w*w!AB9rjaseK*r| z34xwVB^-Txu;zS@?-TSllfxQRst2=A>>b0WQbj*oc;V|RPN5J(#43QL=#*oIq>aqd z=k~9mt$0_0gjO4%G}5@IAv6;il=cd-j;^R_Z440s&Xx-X!x%bj*k|#4Ls)uJP?qge z;$ijt`nl0o5sw(7aJ;+q?2&#^xx(zcNRL>_->!E| zAkgYa64NK?`-#FS>-_?SHu>HLuzH+XRUS85@CWkBc_G5qwxjoTd~`u|`!>!x^F6lXp$QS6FzB#s%BC9lTjL|28Ct{=t@_R<87-=mIu9?4 zwDbcA)a+nisODa!qe*LSzoluC7S%Z_8-%oD8{1ANzRo^BNzp7Tx2JdWNj?&}-lz$k zMlM^?`}c-(+!L4M^JjsBz) zh`Tm-lsGZJrO)#+EvYoE|S z5BAMh?18?-TR=LHf1e81x(VGx+;r6rCE6E2;&Lx#x6;4~ z*54v;%zSz99#d67i9|A7_20@QV&AtP7f_zf0BI?X9Pz751T_WH)1m?sQvhXwew&GK zWc7kQvn0H=WxU;EhyB${?$_q9fBv2yw&NS79mFbM5FkR*w+x4S7zi}8rg=!3N7jM- zyxpsPy1$2TWMB7F>Uv_;$)zw&Ir@69^cvdh)-psjzlX6i0$kGH;uM}Az_{2CkS^f& zK4jmac9@>LqAx>0AnPG=I0#S@t!GY@03r%hA)s0T1QLL5rE`!~z4~6_?h!DOR$MQ~ zi!E>es2jEc2_fddz>D_foggSu+%=r>A?$_+u>pP}3*hSrv43kEr@yiz^<^>~n~XXe|fxYBBltTWBPeF|>_X2>J! z``)j+VhvdTvkx&R_!DqR_uF_5CaF&Nx_n>c94t07XY|Ys_BXi)^Tq!H1|jKPoFGk` z#>Ug1k^oskMz+TFGRuEHO@fi(1ccUqevt<|spMWzFY_J8kMWpWO9EEjYH4BFi+U4;L%vlf*D z6ocnCK>RS;IL(u(O|9yJWQO0-D<`_T6G{0F#QK!=I~j^pXBhe zK1bd$a_}6|WiGc*9TmfLLy{K6;ffhQu5&xbgS2A=SU6pPENW}An;rf^gDd%!j>L`x zMkA=FKtk*)<7q*%R=#}}#1@L$N9H$`_WybZQ>~$q@Ake!!l~`fB?F_Kki+O2=W7hN z$IBT|r-SLhZRR)*?0>qE4-TKl!ne78Y0c7fAty1*06JC{Jl*t}#L6pr5U0S5AzutK z=*Y;vYG{EIdrLi_GJ<{LQ4qDhYv47^;}Wv$R-bt+{w7FuR5s62X z=K8LF#HIZ>r2Ox3N_ouw*C*BmMEct9WgkJo$aTRkjs8w!;P{(8mc%r;fo_{5Y^>p3 z5_0ithq4*!2<-U%4i|X05yyn?T&_9-mT~`{rrZuskPm*rN@F(ZkC&n<4cIZTt3*@A z`8iIJH?k;`Bjh;M8ZA}oO-U=y$NvD-3M1nN@$~|@23_un4@dh`q@FNp?R5PzXMhHG zgbUq^UKn!XopGI?t3ylHZ-H1eOb_>S0wj>tqu>aC0slJ436ZwFaU9c17ij^z{*aQk zWnKaZs2w&?TeD(2ddARiD-F$4rhp+ov2KBQ{>7h_~-%y-#Kv^LY%W0g|W&^Hl9F z2q}1DU>**Vp2qpk-CO?%G%xL*Fq)pJ%PmA1?ZBn@G8rMz;e+~SW|5I9I-p@`YYG-H z_5ym+ApZYdeDUK z-&ic1d(g;KPL6Qn62zHL(~n+L|IQo)IeLps{sRaF& zIv1KlcGk>4FgCjXV9fV-Q&RV;^;@FnbR;y$rE;mrJ>o%&{%t#rK;;`o&Npd7wKA)p z6yNs&wU%yXVfe>z1jr}9vU#sAKb?5+EI=CRyEn+OdrZ$ zaXm_=0>Su3e5Li&!^el>cy9(_R{qNU%!t5$MPytwPoai9Z*)-TEjwU(%T6exoG$La zr&QhC(!jQHZ15JT%jT{Uz4SJ_tD5=e+d+(vs6zO(?tGl+9kUz%if1VaKaofD;5LVT zaV!$LUMvVDZwW%Uk@vyzF_0hLR};q$ioQ=nZeGnw3aI0K23thXTbBxnVYjH-Yb1?f z#%t)Dw=fBZ)H$G`^i5@eHm=NGmOF)7Q2cE@Zw!5zdpft)KcK|lX+?Jxr~|cI6)|5) zHrE;>C*LAZ8JV4f3f1u-lPQ{Zzm-I9{;;Ha2xFTHV;PeI6I%}yuQ>~L8&O^2L%X~m zRA9!L6AM=^E7O2ZbHU4l(FSPad;R4nY9?%0Z<~up4H8Z?ZzNCPf9yoTDOT7pLqOwq zA}t1FD{iPuI3!MRt45XvP#xJ?amd7G-05c&vH2}Sg2v2J7vRde!YcX5W=qG7fz4zb zz_|CQlqpiwrkot+_6tEk@8v(~(}HjQ*Q94p-5ARqjdn{~Di+&psV#{5s&o2(Wgc%F zs|KdgPS8e!d$?2{Ab%)Z&6&>nJa0m)GBQ1)%3VdwC74`C%r(<%g2RTF{!jC}*dWg! zF7;l%-AgHi;64!OXa6iS9P$oOCzoO9(f_q=q7d!NN!6)z4d=+~^CpZ`x?Xjt4!EfT z3UNO7Uyo^yI-r1o9yDBjo%Pq?xN(2j={2u_k5X_v zwL@#@u&s~ea+M+m>Sq<*2cSFJ(KJ#7V3TBHCuIQK!Z4QxAWMkSi5r~xJs5A@r2Y6r ziiF?z^dUK-(!cfKiN2rg4QR}29{<+93fV!Kw<^$QgI3TO$A%!9SA%(rzYP_5>~bfB7Sw2MFiG zisvK+Hug}UOXitjn3F3-KL(U5D|@$h*;u6q!-XS(sj|n6i%3LY;H*nHMi^5&|7{o$ ze5f`MO<$c(ghsN+BRqf3J(3jm1ax}9=q_!hO#jy6dt}Sp#({55S~2Cj)B!!ga)uzu zTIWf1?c`s`*p0i!0G!P1m(--w8zXJEQ3e)e=_8BJYSK=3ivrpVb~e|(RG1WC%;&t8 z!}5m0c3GPM7WCx90@Y(-d)HQKGi}H!D}VR)_fNTl7(kjt zHyo6m=W$0qw6)prFPQYE=bb(W0tIlq)OXu;xdlwl+^~4VVLrEVXZ zFDlPsIennfVrJ1y$Ku(a$JqeNg_Bbh0_rMrN&m#Ot_kM(eAC6k%XFwr+GadWp#eue zApapquqgCb|GOHnqn`o)nBBs1Vq)hexXO>S_`iXR?Pj>rmBivFI)bP)>RDf~^l|YB z#k(27S6qy^hlq`S$Eyhf4f>If?+0(hpH6s9K4UV{+WBp`_%}?7`CNi?Wpp&4zXk=2 z{ueIza6)Pr=7u_+#9Gt3BwMC)UN*;GHaFkpmbc9-%}Y#jviw(sBY|koXI0leW82Pdatwe6*Rge2i@c)M1b{Mt(W8#-k9e-cJlm%zIVz z`>WPe5{MBLnKPxL5qavX?Kg+r2fx)-#I-A+J{c&;&Et70picKm6Xrk4zwDt1sI@_n z@z#K^&CA1BO&4+?57=8)gO9>B4|G{!kc%_P-@khlhq?eCEeoHgRr0)L<2u6 ze+)FNYH;kZh1ON|M`u1G_}KlZQA9Zzl#;xGP{G^?X6%U zUu7?M0$ZoUbH8IUVbvA$^VnM$>3ZS650tJVceM1tm@Zq|9;(SR{_;8O$tFNv*v7Z( z^%~IX%&(9CRH%cSzODL@z7Bwb!1G-ZmNrKmZoLm{(wL&-{|oMmo9#7-{o?&!cKvNj zQeTRHdx~iHxyt8=3xDoA8|%=8RptqmG259eO_e&po)796E+4vHt*WrzDVvBPUc2zW z1bv|bv7XoXoUi`-aam2~ac5<0<>=E!74ffQ^z`5$`qR!h0_Db-;=hf#U3x0KXIh?eJi@w0CJt?1VWV-qcL4d5?+y%(~Z zC`fWLE}dX1;&$Nhw7&aZRQi{NflGie)dzd4O7e)C*V8|5d$_wYo@2{wr?r&FT6@|0z^W#3I0Zjd1SMpnJx4MB7bT2`04}zT1l!Ju4ik z3FZg^2spS#-1NE)}thIVEZFh3ytujZ%u&Pg?`qhUO7kyV@V<_y4 z#oXtPCcThuRm1xD`gtuMGn^be&ODYRpA(^FIg`6VI}OZ`TOaN1bhg*67}RvnADlVLTEk}VM55y++S zxkojka#f9a9v6xMekr?Zh;meEgH_55Hc*78WPz(lZgpKl4RvYZ12vX2Eq5kHLz*90 zs+`yM0Th;lu`jQ#;OT=AwbG-*l%tz|*BGub82sOK;#7xZVJ7Zgi9l!8Po>EFqE~0? zLdz_BZD8bNr%+mZ)!PI{Z$ zSX2mMc7C0iJY|hr8h8i3ouA`-J&VPz+562qjyJ2y@?NF+YnXV^$kmfU>WCC;qJT&_e;#Ah{a* z4th(GjzyTJuYLXhWJ=$H5i2*X{^mNVj4J@Xv80C+tdC%X%j#yiEuHf8cdN|1{nvvV z|L|q1Hs^Ug-LWV$>rtIfX!ZW1+~t<8blxA8p@f_66E10gAuXn`1e~FMRLsGugoTBm z#*S6Oe$>+3bIdx<3vzNq+MhW0{m7k-dYD9Qp?tXZEUoE1g&FFlzdNGg>=;nl)gbBe z-?To5sWcarTga~>r@*DE{%j~p2SVcW>&cCw|7f$_+X&Cx^*szqODjKKv#E5B_ZlE| zGeeVUyZd#ya_Rv_0J)k<(5_22R;4FBMq#rYPg50`4|TI~H-@j6H!^isFdMY2*_jE zI`bgu7~03W#+l>10#=8a?^g=7y|24f=a3o-GjdzRN{-RUj;iSY_+szu5Xr|#x~n_` zn@PKrIyj|17xdxrMknc6&rshY!HFvmtkV3@e(y&GJOEpfRJ^!e!X6pzOlg33H)e(@ zxRNhhq%l1y9ba9n7@n)JoZI}uzr}j*Ya-`wy#L-#N;!J=8`Gzhr?$HS8qnW`QfSD8 zd=~UnXKwEbxoBu&M{6+aQ{0o6K`DJe_V1ICPqU`kte)n{z0+A-F2YG`|_9y{kKSjcn(T5A0n7>{J?jy?17 zyZneN&kA<@u|CAqAM>4AK63WqXA{|dkmBV3n~l!Tp=8X@v|jZ(4l(l5lUbU@H|wtF z{#$-ruK}q7zu01@MK~eWhqgBpR5QvAiVhC>&OW~y%6h+WWofl63)3OvoZY37r435p@;eWh-TuY?0OUg!fFt%C+!S@ z1BgS{l2(oF>XLV-YeRpV%a1yhuP_9Z(D7bm%{Bg;nMU#xa03eqK!vRcj}w3JLzRnF zep-C7Ap-vOsm;~~?avXz9L2a)akSg#TGezNJP>nw5NmcZB5pCi2dHm8@=VY7Yz zQ1sZp%e?Oo49d#b1x2^`4x`UXJ#0?r{p4tJ)U@xLr}FvmZdc6NXy)DP``=6F*X*8J z@dT;Z#wxlyWv7%Ajy+i$VYUiVWB50BQMk&07mhy^8Ab~0FC;CP7P;Hs{`6otZckzk z-H|dqHDu_#hDrFJ#_wfs^w5IO$tmEobl5uH^~@byQvmSaAp{BWxnpVs;eeQD-GBaZ z2jH4vI1+6_8)oL{LOd0?zS>y+%aU~cua&h?q|K9DhmVw=9pqs{ax3Lybd6uV!5_;>U7`0J1E3@Y>`CMSpm+z+%u;psG+L*{{W+a4R?){zH3t| zcAAL`Ha+!)_6cO{K;-ga$d+%FRCMu?oPH?>2kLXWFr*sX+pw6-l}G`E%cqHKS8)5I^&U2mex+zW0W@Ea_G4ab0GqO)9*tC3o2C=~0`$&fg4q zqM*Tk3X7lMF)bu`5#tG`TGk_Z7B(Nb9kNTb58<|DcJ{Qpn(rJWq@Xd-3g}frro!x`m>o_+9xRHp8TxYsgmNn|J&U=T@kz9V~ z;Q!VFjQcbqzi8Bd_d(|-cLFCEOC08D4JmZZmE#wMWB{Bd#n9e+rdM1J+4q>WRArta zt*V1?k;44@v?nrKNtHGLeHi?brLDalExev+xo?+7*exzv(HuV;L`5|O2Uwt2#?Bx- zyG$Z{GlQK!Wim<9$#h;dfkQmqWmBnlUlWiHsRqlX%R7)s*~Phhu;XWhGU|hs@5q#0&Bwa+_67T&?-t7U zbJ!L@Lm-?3&6Up_Et)Ls)MDXGKali`i1X)0c#ZW@2IBA^Y&(3o8I+=)H*{duu4jZ1Cas z-qU}jld(s4)o}||3AqP6JB^{06YGToshu4I3J5JU0>0jAzr$zz?sR$bdC>9iIQM%1 zAjKC=H7JpHRfF{~+A;P@sfD(|HUekbY)>Aq(2cd^Eb`-j=2>`gL{Qr)ww-Bcl4^`U zu7OO}Gd{J~Q!H+E0V*u`ii;;Y2%ZPXHLDEp154TV+w7P=M1sY)hYupoO+qGA3h6~?_%zL0>qK)vBK>&c-PZJ#_J|a=!=aA5 zUXu2m>>fD4_XR$BB7W;#keZrNcH=$boa1C4iY?On6W z$4!%MJZNs{ZpFqj;=~nN)~eX5-5{Cuf{metMQ(6bU%_4=R!6h9DimH8?+dDa}53sb(CNYfm4p zdh)fXJSZL(B!AsamzT19p+<4gjpVaa?Rk8l2n7TnzyHjlAz4%?3X0I9X%dJ7ZPnoe zXC;m^{aS<1iZnepZ8Jt~H*buK0+awD!Y3I~ww>Cxz4x~13VPYSy!^g>P?uD9iaRo> z{r^1C##GCYDSSbcP30iW1VWyABkTrztAx5={a@Oh-*3N5bqlNx#ZjT#jssy-;1jy9 z^w!c&zQ>^_Veh#u>2yM0?q$JG#5tle`oY@{AILb!8%byUXBs!qgo6fc%iVeSJ=kQ1N5O|x_{USi-@GS96^%!gaAVO*}|9DcI{^7}4 zetKplK!_SyCLqaM#LCxI^DrN5pmAiZ@_JYU*Zb)8I-inxl0M_Z^c&0A813an2Ph#P z@?>`2#r?JOHNjta#*?R8fG>GyaWX}Fmnz8oi8>IOw7|3u+&Nvhmu#O>K8&{`nGVNS zL7wUXPxk~i*#$s?iq4%mlbgac(SZw1lixB$nsTQ3v?X(zxKrTp%1)W7;<3h9`O6V_xJpM?{lAf|GYdf)H(a?wbxpE z)n~6cG0kEhYy>(mR0^DQ{iY4v|E`+~O)qz8reo>?0#R4&^BKwTnuJ9(U?1qolO22SW!=y&b5uB82uG@*U+X=}*#_4;XbrM!_Yrr@3z7Vz`u zl}sATgN0>0i{7nu+VH>Li-~JZC>K*?71vXs|EeNEJ)v88TFV6K-QYcpvI-aH4uQM# zZB-%MTn>hYkb4p@Ege=pdOtLrez<%uq3Vry9y#>-*MO~KpP>%!liUeK8@C&4G*0FF z?Hq)2TGOnre+3posPS=G@Q3RJC*V-Y=mKGAt_FZdjAywxWI~E_G8O1^JZ4iD;X0M? z(XYxybb)&4CR4NXtK2f&i-7+|O-M4qPyZ}?V|Kqfj(;YHy-Cy;SuqX@L$ua5Y`r`E z>(bE${rF^Gq~N8%pmh+h3}I>BkUR}Iu&dz_j(dv;RegAWzJvFotI2iTcDp8qpkeU< z-3B?CWNr4?@`BddxL>qB8Kg%*7vzECwi@nRzim5^cM#p&*dZM8cc3`AZ6ICo!yeMX zt-H5zyPKll7Q0hRnV5KeD=%vY8xZCqnJ61`PxT>c6Q2jZw(}YZ_wzx#(J(hy9JDqtiojF~)qwj9F z6h6SQ#RhDtpLXXF!i$E|u)e=%MEulaBkrD;8~dzI4e#E<%TAGRQS;zc(_bJF_p=FX zK8v>G%5E1# zs%3$nW+AyczD2R-l1`Ji0*y_K!8geVPh(F9IuTy>&@GztnnI~jRu<{x*>#w%x*g)x zLXvM)Vm9Lx}R;oSnkI7!aG)(dKGeF(Hs05@taV0hs%|*@CsQh zm(n~na}@s~!2pJ5dNqT0CdfNQoHtsjR0iJ-*T!d*L(>YlUouYOn>BS&2 zvOsysr{NP%bnTq$5sf`p6pwX}oHRs^zxf)O_QQ3jp-B=<-J>u}jW_lnb}>!w>}sOi zm6LIu4+~zKNgTk*UjSjk{^_HY7oYh=XsPF;;GzoPtg1_}Q?PZxq;5w67*R&)Zp`HV z+}bU_H4zB`>jSg<{-u!R&y6M0s_;|G=kIYgrOoN#1wXiS8fIHTw*R~pO zZ;13H_%DHGuMz6Q*(m&$ivfI!z~joNy>3)K%l6j_zcN4nFI0_u;lMen<}1ma4sLeB zBF03uRU0b}!wPRehr_VKbY(zG0Qbl_t1I-fiOEmd-yET7nGloQZ&^vVjvR#baV&_- z1>j?UY^S%K>K%#-VzsT!jZ8F7C{lY3&3b)F566TUkV|E893&%pxTmyA>%X@s^h*JD zALtenTFZgJVdT%t=ZDnaP<4NW?Bo#fK%K5ENb)k`hM5xgfT9c&;&LsHx%ID|Fb(bt zPLow@OX&O9Zael^a~g_cKro!q<}5-HUWCgp3DfzYm#lr&v8>xF?*I&kZLC&wU4bDB z{iTEM#KRleHvsk#5{c3XC|oa!8^NY{>mGm<+UY21O@ad@Hx5GLqZ$Y+E4&P`m?ji@ zd;m*9coG^6kIls6^8by}>xlitMZk#R*H8p49BQ|F`y_9zb`il0|KiNQgN7JQBku-8 zpBzpf%TJG_NrzPT+i(NtRj1(H1a&0-x)`CMj&cn+TYghzmN~%7>nqdr*z4hDn}2o9 zt5b4IGqBzISs^**|A2b_L3=J<$A9;urxj^pIGgRvBD++wFH^Pt!UBCX>b&d=JQ0CP zFRT~-;hQcXPKH=H0Pb@Q_;Oy^)xvss5kE=pf5I;7m6SWDf9Z`WP%QHq`S+0Gf8WN> zQYv`xhuz4G$iIug$?9JKOhdQsg>7wg!|FEcKTr_kIp*aY_Hup;0)q@G&xE)DkZl965)AOBMK4QX$zuNE>XEeb zv(Jjfwm(N6nCJ|t*3Spadu&W?CmZnM#})y^%Uk|YFBw@cV@L-gBN!;hjl=*5BRbRx z;S}hG#kRJMEJsr_#TwJZO0J>wCROlt+h&Is;HAtddByYQD*$+jrY9j+zA`Xx?d0fD zG5YAYUo~oYg{usc2TOrG#!L$%Y^Ok--2W-c7A&k{yHCB+Pv8J6zH}k$BmV+Ow?Lrt z5Ws)4^L_^=uEG1}Ti?Y)$VBg1?K!J;>}xcBBAN8kDn`ryej#!}F(MUR%M4jXe4oSP zxZrkgd2~CF%VKy(d37^rwR5ZF7AP?R5DZ}+syK{mpTEJKDa?$1=( zH4or{O3d&X73s%Jtne91+w}U2*M&6c^Cn0$enqQYg&hTldFQ2T1%ea9D#HB@LGb~J zD}h_41NjQ=;+N*QKnftAnl2q$ZNiFV5|SZ1q>}$52#SM{fW$*wZxMX(wFJF90^{m3 zcHED1Q?KC_&6s10&$d;uh@_ht=@cj2^d6`yWbqtK1mKc377DQ6&7^&ZCC9!I3(@Z2 z0Tf#Y``(wF5uoh{2`gfW8Fa}X!wv}OF`RuBG6dHx$R^7p+#-Auq(uda5*>!FC%$;v z?$AVTxK)zc0Rj3X?0lU3e?mz4jea(Ji<+MHt9)AK`TEtIgg*8co6CpcAPmZQ6eD87 zv`f}gqm3Y(w^UM91p&a$@Vw;QIr?+br2qRxZ{)O!pR#b)|8Z>#ZlY?K3sN#F=}*R= zI>kG8cveDxUwe$vqw?qnTF2bT{&*wr){=*xUzDgxG!qo?*9K+L`7(E>@I|X*y@n6K zq4Ox*TytlhkfHL_=fbQP=xC2e0|0#S>C%?NoE(DDM%dXh*Wcv$1k=bg_IyqyWtVs8%L{Q84Dk4BA;+cTigKHRB$OZsWoe&9=r0}E=TM;-V zPqt02TL8$j~;%yH~JOtILqJx)a-gtWdP%~xT=6lW^MOOH4*2%xqb(eVPdXq z$oNX!-dM~wR!Z+x5W~Mg5er(*}+gtlYCo@(eu)fBfS#?ST8A zD0H71_H_Y5+O9^LCfx3E+;1j+$)g}z?GvrXE;h2~;ENea{DQpHZ3B~b$c{E&mCJQl ztp~}9Bg8>P!eld-Sc{6}yxS1>!1XAo@R<2axZybntMc&DFtbuxIJ1n1h6lmG{kT50i(Q5HP7#wGAe7h3 zQF^fNRo~eMTDU36yY;)^SpBdfxpNR!C2#K&?1RPaf~Ok)BM9pO$z^N9+q*YhS1u-N zxPTS*!CO+VBGBu31jP`%n;Y?0po@?Z?Ty~5A65V=iyiUZWs75Wea8ITuQTERb9d~M zg>J;l9+RK$od}|pLNK}N#xgP%>i9rOH`H5LW3Z465l3|AIeK>KsEgpdYI$j z+3d&iL96qhOo=4d5!Edgi5FQ3%oOuYb6zz`N6-M6uMU0G|ek0`%rTu=nbM*E!Csat`Qj zAvo|t{5HATAk9B2Oo4kY94o+9C!j~T;W~_M0KhBnh{k;4+E1W6)77bO*GESYmo8ia zcsXEVGygrt%dzoWEV`D75U2Vx-1IkjV9#XZk~TCKixt)&YQgr=AN?YSSL{dwoQhqM z9xgt}uA2KjlZ`Mz(8z0Z;?~~h3ClC~o(X=6_Ur&aP0`B<7Ub56aM|5kgm<)y`gM_* zQ6NrzQQ2AWae_PuL%+WZ|9QbBnF$R1GY3f+7BEh|Pb`?){|hV__u(R;uv>!m7|$)*4dN!y48gDVoI}tE zuv_@R{~01S`I&O;e@2J_T-h}M1S9SIOH~*@)P<}TDtx{m?SLeLmrUq?t{z%m$mZ=F zZF|l*uCBDO>%aBgSLPAlPuhlT(iV{{9FykDxV z8xnnhwDlyY<8deLD0sWc2O#{HsPOBoV0O(j&I8$#nsnUvNI{HOv-@loenKHwpq(oJ zD}L<%9*#Xa44Vlo?*7H%j-?Se-IS*H@7W>bJC#Cf6Cf}}6cgd~t{^~1s07O85~|w} zPzmTk%eh;R4meeK7;+^f7U;zS z0=1|SPw?;5K5t$5wo}_;^L%asW%u|TCpNV!tVz-%&=!3aBIk^fWMu?_)HZ=`ZA^hT zo+l|Rb60*S#Jd@l7wRBh6cSTQFZ`JLf$CE2?Bk2M*6uMfM(UQck*`N9}J)PBK!Nb@YHw8?yi()!7rO^p2S(`5NZB;;Fz8cv;;EJc4g0UVoE3d z((@kZPP8D5#NR*q2yF=&bp?&ij<(_QqN8^`ta^F9|=jKa;Lo^X3#d|E$DUjPabv>MuO> zwl6bQbqt2HEUQS$v+u20x$_$tz20o$p-{Qpb@zOEJM7~~ZCT1@R0l{liJBqLH?4aW zlCAfW6bd{k?`x?vJ*|&ijcPnqi#flP69Cof-*-LsXOXVISEfMll1k1yO;QUEhXlQIK5%8kJ4ivz zF4!@^%@{E$aJ6IqYUl_3eDbfx<~KMW^3JT>AO>(74}Kk3g}$q?UiDHM;jA+Nd?TzK3Obbnp+2McB~pghVh_uE`%>b)tFpT=avQ} zkm%NnOzYkoroyu&m;Tz9$C?Mv(HI!VJiJl8V1~hcgGMY!4IT|$+@y|X+Xp%4THJ&s zMeXSkU&k_;U*+OBnh+<;o!zVHh(#*Dzn~fnizO`_rl{ar>4&`7Y}w<|5r!V&#eO$N z5L>LRYe5y|`d{5*bzmQ4l|rU=aG%R9xMK^D8@_Szxvsq^)VH-giX`B$&U~@@pQ4X2bYWT)X zDQdy^XU@T@hWcX|Wzo}|a+On_h!L@5o@pC4V^w42g0kkYvE5TihJLH-$gbe8y`Nol zoe}?}xQ78?ag5k0P@n>llyBQVz8{Z!JjDlXw(=88_CE5`bRT7nZ&W;C@QzF9+x555 zJdm2XpVwZj(pE=^w%`k>cKOdhdrSf#X?;cBh^Y19K{g3z28!Th_v{-n>`afE$Y8AB zzu_Kae>&rTh<#jBK&(b;XIRa5x=7p&yez z7N+iKGk661$9*M0XsCakW@|-=qMt5QO^CX#=*&yAa$qFtz8~s0y4|TjlBI7X`Y|<` z5lmmzeqf4fp$zrta0TBkT9R|n(R7y@z>(zfR%U8;!4aXstklWN%6#XOw1)v~luHev zFN}5ti$EX)IPs{J)O&}${cqJt>)AAVccX0OBy4?TpT8Xz#E$S??U<<2a9?6`=yyxK zoh*ob=)H`H&za$hB>(DxFE&GHM*XII(SJ@nMHFda{6IEmX=5Ee;BdwTnxHHXgfv0dx_K^z6w=_~l{&m5*7=t#4|`3#8cllWw* z-J9D7u&-7%x?WP6Mb36M7Hf48|8%-{#J*G{a845+YdYuT)}$M=p1p5j!Bsy>oc4!UPZ~7za%-Z`^VsrJ(d^ri${aD zeaA+uAs}7rZE=93OhTJZ%d8ovO}xSWF56qSwu)Cq*#H6(Xld;x^ldccg3PEM0RfPT zV<%4c7b|uk$@DhR8~a~h07(gC*PBU+5wLW1|54tDS7F%LaFZ7@_<_QU-uqp z^f&la9-Ng0B*#eZH~;?9+(-4%Y;2gq3+Ux_L41w+{mMXFsp^W}%dWnqE=ivanRUe4 z9-clF2t6bQH}S-_&DGC<)r?4gx)XnuB2wee3T4XaDFPWQt(L{aD#p`Cs9+xo6L(ez zh+Kx>NJwn;{UllYgHq+Pl1-vo0P8AKm9(5xhq?N7qp+%ep19yQDL65QVuvn1sR-ZN z=<10sEZA?|Rw;YHk2l6nH3gh(hnmnmSIrm*FMVPBUV*gS5hO=?Yh>%EA>32Qf1R9i z6eC=}+xyHJ^y@M60T1=qr3XnZ7Srk!e7dBDRyJ!kL);833ajpUWgUnq)xK|X3}d-% ze++dzUa2qR_HH_k=a$8!YBIt5Nz+v;3VOYgtQV(zny0nrdV<6r$|#@mDAxmfZq_ z%W^{QS03KJ^pkl7TAx8(?IPf#iL}MGEB;acJpbTYXWSR;#cm~N8jCx!deou7IX$dRBgQYeL;q#cDFw{Fp7$8CEv!B zxfo3vM@!Pa1yc%jg~`FNTIctR4ClI@*neDa(pdnlwN|`iLh{Q>$emKTt?r1Jm3HBE zz$@|#$AC10@(w7Zch;^@D)PtLrKY`C4&6hHF+ZqXhZq(g;QyR8EXxPY?!D>Ni4?t}=H!{$u6P{mfVA?~yQKARbG17k zpOY7)_Ix_qA}`x6tfzzGjvTyFH4VkAz&U2m}w_h2UI%37iZDHumi zc%;IIiBE#;N;S+xhy{m7j|#34YnMgmP&G6LeMI+9cksSmv~CQ~slqn5#6jn#gw_2p z&pYIZgJ3x>&2s`5c9ib?;Y!Xgle{j^c!10pf zu>slIvi0lNn?I5E)m_|4q{|Dge20}1E*mjOjIyIS>li2wZ2j)1RYvw!c0khi1M>NQm1_m?1TTPkXN zuOYgLpM#dTDI%@;R{GY@!TVbZQ#w?c)F#k+|I2TZO`=YS?+7*;=X26R;eW&b``sq>3f}`N%riKZ6VU{rrqNgfQCCk=f30* z0KdP-S=PVTqr(1G1^$04DFl(J3V`$i58kt~u#d{R}=3Ibs!tuzQ~ zjGyBV+>f1jsD$@JQD~Qt-U21Tj9rmKb*SK-(!f&xGsf){=9fzCtRL*Vkj;`xecy)% zcqdc1?+=sttEpv!y30E>RP8FeJ*y|g(lsF_J=Ay3rEQYmf%r2>?cI$i+hDL$i4!P- zd07M$VHPJs6j5GP0s*OgR!#u^mGSY;`v7Ub9D5ysXoe_nIR=WhUsqO`O+>S~swM%$ zI73t6@+k6yg=*cut6_5I?cx1Lp7BCJZTt&-l%`mK+uxI6w$h-#3e= zb{z{+&sO7$T3`OHPF1rP_#VBiuBxi=?2d_mgd#C^bzp5vPDr%sMIMdNn{@eU#g&sW z?)@qpU`c+j$J~Ff@yYU9DD2(%$G_DtT7L#7-2P{A2r$qK*H6!o@!t)p&=nsinR<{Y}vT_XYPk^Y)P@p)# z-HP111b}GL40=Z`kdQVbs7+7rZZN?JQEkK$Tr*I;9c!TLp1mW|dlH&PyNz;7N>~`p<`T>#-oW%Z&%I8^v<8PYyp#}_h`WN_t zZOq9oY#Np}&Kpd;?EXy+Hg&;Om@w14BZs7RBqk8yLC|^%TDtFD_wesc4bM$|CuamJ z4S}w$)&AKbA$s96m^Y=#b`+hdsqtz2^%?vK+C)#HNz&SY>`=sSejFnL4dEw6)MOIQ zs%BkUUb@XIG{f(&BlhsJLLlb^UVJh|J16hww+*t80>7DIcw{c?Qr5~@x^4*gUyEcMj5 zeqk+wP|~lxYEloaw_v&TA@7ZS9qs-gEHXe+jT!W0)$Eb*1COAHv-q=WV%u?*SwF9w zT3m$YR=-E#LCEqp3cg-r@RP`!IilV_gsDED#}eajFS)_7W$~pO?!6N&yYRZfqr3Z< z36LPIR->h(OPxJ%$I+Xhw#hlw#pte>?MTl}@U=H#ZQ^X3#j;&B<=X0X)hH=+9ZBI7 zJ@4N?&nnnBvo$zBK;)y-sEcYb9$NX*t+~U;mfhUFbRLAAhQVi*0$3BTwCj09BY4-; zK^P5muvzMWhZ93Ih>8zy(`2DZUPn(~(z1y#T}yOB24JgiZLv;N68R7;x4Mzrcu4>1 zsUzgvDlCy)L4n4`$Arn!dx7cw(Q$LVjiKOI%hb+r8ifh4bU^vDlP z<7d6572_QVjI~h4CeWnev4j+cwHJ4h1lcDuB>S7R&-_)@cXk7`#J7P~V!i|Ll)Y5bln*B7YAoc1sxJ-`@kPDcFKyFP1$9+IxpnjkEjpvqkd}A5ibT zh!pHz_PDiZI__dX5=X*=e-prJnUemke!pm%0c~XB;fG*H{SP>SfrK%=up0Q||ENj3 zG!YwJY+e5+@(_m~Xg!o|LI1b@yV;MkSE+z&$JH-LT4?x366G-I-;Y0U^iYDHX5v_* zCi3r)8ks&?SwCi_`bRuu5+SpF9y2C{{iqd?Ty|QXTAo(q>XhP$H#uyQkM!V76Azk= zimEVx>QmRicaFKKVRX}skh^Zy%#ca$vLw;<#R3rwzX=00i`abQnB*ye|39OBSbO1S z=3dsgoQMZTBnx4>&b>xF`|aD7_r~t>YvbeMasxL)_1{&FX^WKOCQi5o)}sGqI!^Io z@rEH6n#5PIR{;)tcjL#n$tO)fZV#a?kEzKvs=USmj!o#(>1NxZmq~ZHH%`8!<23F# z5i}mW%EaLtAP<;{KsAv5V-j1~UWAxGCbA?P_fH4rgE>;Md*mq@wr_frrl(yjcjR0I zkQ-|2TjLq`BA1MjCnEphbJUq@s$51tAc>Zw9ro4#7L;h1tdNc99y#i#88?0%hD`ep z7yI80gd}!)5!~$xl6zt2fkO}Z%@v}&ZQdPIa;h9l;on}smGJjl{0)c;cHgkQpS5Xg#zsT8~s&)B3{vaJCq8;vkp!|nUt2LD( z)C1m1!Sg+A8&Z!k;c!#j`HaAu!LwP3??~p7Q<#5SJ?BMA6!I6(vu&7v?<74NaZni- z{JVYq1?5=%F4DqRCHIo2W8hWEB;QEH)YJE|tC!Vlvj>1(Z|5>OHJ^iV) zG_*W5eOHF~xsIpvG0Gq|Ke)^Rv_e5W)j8f`#iN(LPZhG)wsw&?xih$v!(RY%%Dl zX7L#H%0F=_$n4NCV+WJ+C2}vP;S9PXg$lU=Gn}$HW7W+80(V0Iv)rp52|TjpH-`>B zX)Gxj-l~I~$%9#ca<|YZ*U$A_btzz7Xy9vmg!x6vb5%ym(1BQu_?FX`cqh2S1N6k2 zfw{c`_jZFaWCaCbF$i!cx{W>-N>czGYBEv=KOq3hW*aDZJ?d?MSHUt-2(Mj}IKT#S zn^^yQ2@jBcRvO4@dY;LQcmd!IDBhYsLNZeQ;sJZ;Qk5r1x*1j9>Fd+kaQW=7Q^?Wx7VKwopsi@0RLWd1%K|d(xZicy@PO^nf~o491V~^P8}Fl+g-4%VuPS|n*ZbiHc9rRe-LjSvAq6e zPP6IR7TEx+yB{*fW53#D+k}k4mMJP@b%$tw6xPOpzJnr@I{9^*W2pq!l(tFk{}fQt zC5p(fI_^8+*jdtfagc;S#rE>-5w|-@K>Y;dr_IS-(wM1x_uHufdd|1im;#hBsPY=r zE|!Q$QZvZ;^tt7#aHpJUR+a6zPUUboxpc}H?A@=^H?*D9InZMX5HHnbq73-)hhVxj z#qO*3v!KVrd|^&Am&mf@dXzA%Q7arh?3grp_7l(f(R>e3hevS!%s;B3d!nRY;HBIT zM;@}VT~#BD=62KUlauna?e}7U%*f5}>p|yPy(ib>ySb3a#fa}2rPa*W~ z7S*qJ{hL4H=!koL>)qhD9mLP|eiYzEoZ&XiOm z00YcU`qxa3MWo`a-#T7%ETpH(=7c#kP{=Qil!}{SuYv#?A zhl#(1EI-i+@kD{fRj{iyGaeXN6foqd6L7HvpyRD>;=mK92ofZEC5gb&txMawxEyxQWAd(VFcbsj%m2q94U^Tt zQ4|06EkPh&GO}u0dH7j=G`ba79nvJ~eLigbe>{uIbX;=#h0WSiq7EtC-vxd3P?$(! zsDzmk>M-u~hXse&s|A&~90zusnb*`9)9&aIrfRNZ((8@SPWzE>+={kz+H*VpJ#CFW!8oBBzOMe}HvL~XE2#+A&}&?4O*kbtp(G49@*g)Xlgx?8DbQ!} zJF;{=CVVhxjpQ@e(nh-t4`hqK{N?12hz_~28JiLuXTXyf2Qtv-ycD{odUckq;kxZH z*xD42$T9ta)wH;6XS;IlF{bZWFbtc$e`I(9zc9guH%%`sY@M1t_cA4Lf&R9i#O=+8 zcJa-+eh!-G-<7aFy$<^Oz&SwL0a!Ey*(CirtFxc|AAz4>4Gz1}V717r#7{DKG2u=aMpeAt>DdR&KaL7h)8)=1 zeNJujIin}J4i$ZIdx35wB3gGlH8Fl3O={zp@}~%X;R)jp>X8!lBzhRM#PVjr&cB!s z?&v<(k*9QfKQMe|QjfI;ipT?|=zv-B-E@g zFBAVu(*Y@g_F=!Cgc-2XRePHtW)(lZi-H$WD$;liFf56Gvjm61)I265*nmLZC0IWNUZ`v;6z8fD83o( z;npM|z^XN8WAtyj$r&X(3ip*TYOnzG@?t4fVb~Y)w6KvH{x`Uj2Vd$W=oLF0ZR(2* zd5A8OFr@QLGe5YAHuhH7Yh0_v3W^I)l6hE;m+aN-%jlDWXk#P(%^Xe9J=35}6K!>8 zZPDJbsM}CQcq*IRkDu7@Dc260L1B2XqzeKuQKh77K2WBP%^T(@4P#ciSxfn{@$#3K!--5@9Jcc{ zkN?C7hh_6PRd&c-m7N7Dw)ztbW8(FG8jPc-Auw=bJSoow*A!gjP%fXch2J3c2Q2!s zYe2P>EW9vKapf!bzef2W z&8XJCGM2Sqm`=|pX>v^%q->Qr6IfSV#S~Jb297Pni4qfq?=!Y}Dy2_#nVsd4ki41w zq`(~Usz3l6oHe82-&_ED zYXgdME5RQ*A|K5TI@rn0!z#e+0bOE6{6@FaZ^;jZOUAyhg0(FV*VG(Ps|oCYw(@_P zoz0}>?nRVMr^g-&W)b(Kg0fII6^7q7=c{y-heX8?$?}~qh9l)H2X|d`*g`4^4XAz& z5#Jwm4M>9R_hO1~PB%-)l8V0oT}CS~bXD+vTB#l#BzmY~YtPQ1CXW~H3^T(BSwIM|fC$qYai3ex7anT!L@ZmAIQHk8LH3}t!EjMX}qemPg5fhV6y2^YB~^{S&SGZLn?%1?Tk#jNC*wgu?P*Bj#nANe!Z7xun@oh;} zg`vB8DH#tKqkx2n61A?g-6ptAm2bm^7sQ594Ju}n7orA%=AA|+K1&ao+$U*cRNNM( zuin_do<;5~x~tR9RNagUp>n2&L`h8ASW+q z5mZi@#@;>Gu^)1`<5`?JR5?P=XYsUZQ!*L3e?wHt`su;h%2{sN&B%?n{W3LLr*Z)?@xbL?TvO3WbDOIaeU(W`^?Sb3wC zo>_f-)_fKL|0+~u5RpMoZx>JTAU3uCrUhwSwgJDDT&7u~?aHG$B9N(gZhicZ8;4dC z{k|&XLxWAi%CBYTDZ9hEvZ0Wkok!u)*YN``tv5iUl0DzqJ9A#!eU-9^ActURc5l@d z$j+X8SzdpjC+Iju^77*lRMAG#ha0%&j{aqP#~RSM=hfQhe`typFq|*mH#ApXVNHv% zz&dACX%IVAae-p`ohybbHb=2u2U}yZB-S2d3Lc5=RR}LPBp@yo$DE-WrD2^ypr)z4 z{Y`QUd!SSq%2uj&loev(ENJ~;&}5L+m9Fq)uj3B!_kEr*Aj5&Uv2&FP#Hhv(oZof= z*;cy2KH%L>i0Y0&5s^hi0@{oV&grZ_R30#^+Y3aNJ?1A3xP3}x#oah0(*8n}MP566 zX`GR!5NsZ0o&vCFOcR>Gd8&RR)WCQ+9!%ls7lYM*v|v~$I*l@-hTv9I$M&>RPQvBg zDPz&*yi?iPnD->2Mz=%#PqS18Mq_PlyQrwi{=O!Ck6YpmpmR!JZF8C?amK}I|JecT zX<$IZqt((aq7+hL&IPZp(j75|?Hfj~yUpF(S5Aq48jlZ1a8cFRrk_|5$ZHUg&m>MHRlY#;1b&b{KYB7k>%s%wgFJ5Lr6^TWxGD^DCdB&KC4c4*TWZq9xdhPsnuL2Q9a3FNAD1cl8X zjRcq2v!_OifX4nZrysiZ+0PF~F87Ke`uurUu=(f}4;ql_)z?}c2h2O!-hmP;?-~bv zNLKuZ}{Bz~?5qfoieJ@k!E8q`!88NQRbWoOjBv0p@M&n}y2^IQEX&Fl}Y7vTH+ zjZQ$*vVT|ro#vKz0LOOnwAf*j=-%%+cJim>yIwItDIyV5Bo@y|6)46@kL(O<@qNQAwZ!Nc6R!t zetE8?-p@2f{aibsTeIz;zx&>8SJg69?lsmRYjDl-8b)1WOs=ZMLxCqFwMhU*g@WET z+@nPhMCKBTG2;GIOUd+qy)Vbcgb;=`%P`fTMe_{ zYG&+}fKJwzg$&GJ*&89bt$jq=TcDs-_+XRnPFzINuF{IJ?k1*=)}8ZqiL{&lnNyKV zr61s)4D3IDZ^72GH~^Eo^}yZoW$H6y#RJTl_>SE(_x$_1GE`}%--v&@X9AW@e<1!# z>+Ztiffx$oRc@kQg^&9oHLi&sq{N$%M(vXD1B7W!zO>JYcBC*zVN}#n$tc%tT?bo(EcJB z3+B}kqo6N(F>_}>>iEkiXOPi@AnF>{FThkyxpJy$MVB6c6fa4q&q?*h3Iml$4IXJf zvX&>^QL(#Jyw`5j7?x#q=7ar!(7hYk_A_F;rMdMRCx{}8w2)f*h{UNxTb;ie4rn}( zGiU?iRwB@OMQ79SZ@qq)*X+K-A!kB7a9$yC3zm1B&U@bU!oQ z$JLo>>I>s-LW^$T{AS$g6_SNOC&#axxLGxTEA(055jd-t467X-P7e9wEwZ0xgzy`$ zBfmK}W6#tB9BSIWN&E?$9Js8MtTuL=$&v9CZ8@LfKR7niiloVYr%Emu8iQtUzMt~U ztI8?dnWE$#)~PKkc)ngDQ<|*uWGf?4BNvT9z@MfQwXLs~pYy`TTFObO3M0N#-2q(= zHixhOY*lu}91x#2bhdoLbjs>eSaJfJZEyh~+`%9HrPbe8;-2=#j87%I@B-+LMxc~3 zk9*jeJ4BLmcdK_7h|leSJwadp9{L-TfHM3e`N3Ah5D$=~)Z((Fml1mYwn~afM(Dig zWpGHjQ7mh2R!0Z8g_LUczy96;%OsFb0D4-=sgCkKV&BjV?A8 z{fgN(+%7x;#18N)J>EF*Zrr7QVa>3rZI&y|aL>%LM&;Yo)?|ChcF5yt_jh^YPx8y_ z8(XP3kv4AZq#Mdsy+h$faemR-Uk?Ghh2PwCy_^0{Z|jMN;9u922UK;Z_>AV zghGM6WXz10=*|+qr=Q@AMkmNYJXI}*Iv?=*GTTY~{fxr&tflK;&(HHI+zFbL*+Ku7 zEvE%Ay}-L7H2|iwBT#2p#X&G~O%nvGh!<4s4EHH3ZFJ^h`Zncm|E>bfV*0{Bc>KjG zzW1xxxI5%S4rU_Ihdwzr)l+-RHGyo5q{w;52_=snwi|n4zA_Q>nwT4819>#abxWqp zXDR(iX;z}rE;_dJc*yVBG!V;zt8yF~_+l(*p>tSt{Bf{tAO7Pj-_E*4ZSftVkLX%P zd0qR@-@>S*4(@x-o(z#}_b31IafY~^ZICwu(GHU=${kV|1M!+W6!n4xC)7#E*OCk~ z{?6{*gD5E!Sfl6S6tgqXkYc;ix^aDVX&ZkTu@)8PBi*aP0Y> zFM2($ZrkFL($cEBivZvgI|O%;rU%0U!a~K^wW=2#>Xr<#&J0tAT=v;URBd13$-ZEa zsKkftC0|v$_f%g==B#!BU^U}^75shWvB=`;o>|n- zqPXC$ZmM5br1Fn_pLomazf+c6q+p#nJ30wA2;%sFoaz2K8aLGbLVtiA#r{pwa5Dcr zCV%A_xV2Jl236vAPW(fJv}*g$&y6qS-94AH7fM{AT!$}C9v&x{=TlpULlP0Ylfy$$ zSlp)@x!S-cfCpUBOb;PN!pH96nU%82aDD3)>UZHUT37+CKOMa3lD)Wri4920R;yWe zf!8J#mDAFP&0N+~vP^+Iyi7B9O*^dO=iK$z2G?9b3{M(-C%-HQuLG`hB3tuZBe0>1fS*mZpPeYW}pMcYavDb4+nk^0yEfO7(bzSGT^n)oN(uEe=x&v=1g zSzCx|wzJ@ihZJ~)WkJ*nDHT7}?!DG`&}F4+Hy*b}WOLt_Ivf=tH}gPMZvJNR?77jm zVajiN_KWn%58&OKmX!C#LYF7NDs2*-diOD9;n)Ywm%~vYMS8RMbah$z{Pq!|4=K|< z^;yghSmZx(`pveQY_u!K{jd}t0oJa(s8z9}db_ch?M;SSm*z}Mn@31@RQ-B}Sq6Zk zy*2i9hGIP7k_VrWHVb^?+iA?zOPeMX?yWHh#+VfG0YA;dh;6$MM(h~GhQ@9+vTY_ zIc*g<^q+2Mg@hw)sq1d8p4`$#3fdjS5@h=1Ju&HCFs$aYO1Ug%I(zY#CuY!`F_gK>edC|5lEB!9#T`2!m~)JZueSxcj8NX zdVZ> zJ@lJ%xZNwZ4eRYLnNMWPW@;@3l2O|tLzF1!04K+*Yk#JAAtW~I)NiF3+um^x^NwB_iz;7{s0B@a;rDMwPDs60 ztGHDEvstP2X=*nRXKNBj?Rg(NbwWVP`LD%Q) z*x!^V#wu`Y4w@xB0kcNuRUbv&HrWiBr zHOuV}$Ef4)n)U7(5%)#zg>oj>8$ZE^S1*%TZZ{X;25;ovVwoNjT)oipC=_+c+ohL+ zzvoU*A6D?$4h?_0!*z1Lqb7PIl-d{T4=lDmF!0@aDLQ|DJmp`81O%ikByZZ$keXx( zkZV5>?0P<|;IAUF%lc$(^IS5!1FaUFIvY|njz`rhesFC_AjtvTI1TgA1FHR1zQqqc z6k>PPfwz4FT;BKnq>rf~M{DNg34WU|S|@iU;=&)6z94tLTRy7S~zB+&uOIonfq7wF1fo~tTT)ZJw=uEN1d3bG0$p-66NUxG&g-Ys5U4P z^%%ZgpEyKV$*=slZQabc5$JE1|2m+_`Tfvv9J)3*WDv)s8*WUsT=Ha+eDvAn)pk~x z3w=W{(f>u&R|druEn5#Rf#47%xVr>*cXx-N!QGwU7Tn$4f@^Sx5Zv9}o$qk(`(D+n z`7t$96f<-7-rcL$THOcC!0eNn&v$4bL;*Wl%U8$%EcG(9kpZcP+NpZR>UUpNMmN+j zSZqQn@~%-OzULwPS*Iueyt`c4Xfa+EWjUw=1{R6nDDA7GTYu*;Q6>=h#c(AWL!Cvh z^3EJ5Yk-_VtHTz!HJN1;IcH#i*2=!}=9gd0Q6X|K>}^U@y7=Lp^gjfHsG3LXDV zKW>GBdi!_A#b8d(lk>RsN*anA4|ScE&B|)rxv&`E`*(S4l0e(&xIJ{@ryFRX&w&6# z{LIH5arvcrwU@-=xq$&@hZGKU6UIFgUDFb+Md?YOO2`sKNBVi7yOQRIAlW%2uH zKq_j}k_)}2Q2i?JEu)~& zd}IKhR?_D9-5``$ihXZKE`vS!p*{XlLvg$4Z68>$wC9>GC!nv@Elr{JQZ^>yUd{}C zOPTB-Gugs9OeMog&9+|cmnbV>N-fDf;Kzt9)@gC+cOgke>#zcR3tui}hz=lIot+m2 zXVhI$ZvdFt}| z3D&*pdcI#DR3|r?0ujnI0r9P36s1apBg*UkJ{(SS}tlG9t z);#{hz1RGz6T5pEb0!(w_cD$`x67$!^OM|sVc@_~$ex40}$SQjyJkEGp}Muv%Z$}S&?P%M~% zOWO-z4}f)Dptk7*kU5_7I0wL+6?tr&A;bvFx)}upgg@t?^X5q35UsQHy~`wWPQ@O% zvYkX;e-yPDR(~bC&>0%qU2FdmYp0k2iAfEBCOYWtSXm10ZC4xpy{u0TB#V)LzeckP z0^6&(Hi`Ep?^a@YVpfI*Nf{60%4lbFq{POd^n;LgS%BI}|D%Lb9i8&MEs}+#GsaH` zZd?9ey5&{)wUf)It7-FIK}%^wb(wAwpRpWvu9Bun5YWiKWaF9fcRc)yToOXo1IoS> zJSg8GzIADKYHHWdAH95!S~Z6B=kM~Ov{x{}$gOUqV*nG!iA&bNTQGgW_7d}^cGuR$ z?H|BQ$fOrKtY|>1=a*=2bn`MG0yg7-oD@Z$Tff+-O9QF&(;K{|-B;)Z10!0)aSJ3& z86$_ez#CGBW!|{X)Gs`k`f6oYz_Fd1QyZ1$5i;!q8t@BY`?qh^JSzklr#GWKz$EdT z<<3W*h)o2^+*jN!uU$ZA{y)g0A2WGMii{N9Zx!FfNB`qmE_(%O>wR;_&w+JMR9q5M z7nUQ%Nu^U1Z!Ot>M$+RRdVBa&+)N3j095F}W*AlwU&UiDr0dJzU%oH6mdqIRW2zw% zlJ=xOF#$3ZAqD2}LCf0^dkeLBrMm}E0KGWcTf+s_igexCQiz+yJvgL;p|_A3(Xcb(rHptw&~Hh zaq2__?TOgiGkexZLJ&Mn608A2dF-Q-Jj0q_*jpTS{M#;I%!zRx^dPK`I|9K1h+TDX ziVcv_?eE^}h%6u=EY`$zAIzcc*Cx874{$oz)F2?fqB-74jAJdLQAn{5J#%@}EUr1= z4$pruD<=cS{t9x$~eOYN=^SG~T+3UoL zF&W`^(nC5_I^u}VP`?m0N_N;j9-Kf73Vyc}a-KYfFJR)EgvH%qTv+VO7SNkNHs*qi zr4!+@?Uq>o{N*deELvW$ZPW{GpAK3etjr`BL-L-nQ-k~3rZ#e`F=d{ClWRH4tFJBi zfrapgRtA8NYeV({O|PIs%%lg6yINN(ubFl7w=vUM2hfw_&MV< z&aKJt<9K}YNCPvPcLt2XJ|OihhVn0I2;K1HJYWl1PyRGgnKsJls0TGRDQl9`pTAWd4_5Ho;VQ{i!XO z+!jX@C+=S(+s}dY+sceg{kQ{028(g2@cvzw&kuxrn+UZbs+0iaF?%=583iMEy)?vY&(-}b!`WQp5+hkR@M`m;UNF#6 zn*9fz{3vNuV{YAVyp*TM&ar8-ulchn+;ghs5A$y%97!$6Ii?Q@@AU~oJ7KV&#IVuu z8q5a}dMg?q;eq8HS1=@3)x!UMqSIo9vrE>*$lCiGE@b7*zonHuoC@j4Ua7;6I97H% zIsV>5rI~=lUKdcaYBrNuF1Us#l}Pi!r|2xBT6waKQdECl469%6K^?+t5Is5JPZh5C z^ljx9TeH$Ir2hG;-#S3B!fNcCh3~#WwdUR&$I64U4Ma>PRo&39>Dmtr;FF9%lN(6k z$$dhU{(z*xe@Un=QjSH3`B$0~-k=)(JW<8*JZOMyAF{7H>C#gzo-(!Uv z-aotq>6Sg(*TZREr%}FT+WVZ%D!I^^BALe3E1Fu^^%7Avf+h682pSyq!? z2iCCtIP4__w73$UJZGN{2C_E6k`er7kZX$bmL;;Bd?d+_ASYTh;A^zHQHh2lN12Lk zx}}lHIZ3iGlLhy=u&c%hj!CLaHVF_lF$dkPA{ZFwO;L~5LQMq={Et}1tX)$2d(G-J zx%|zE+P`Yf)Jeu$qPDsP|3Ev^cm;wI>jly;jyvj|;PKVa=k`2mH;Cr+7(7+dJxz8R zg{h~l@Yv znLU82hhHU0dLI8u)s@H;dEzG~F5x8i0T=%c3t3_Ix6iuUOPOgz;&*Y@tVo3u&Am3; z;BuPIJvz5~^E$x#C3N@E{Rug1<3gEA0U3~^D@s8-xir;D+g(<<`DN^~eM$L~=0KGo zn~W@WXIz-VV*VU$nt7d^ZHU__Lwo_+PnXi-JPR_h1*-X#6sj6$k&YY4qv#e6TY!Lp z$bs`bv4EJe!X1*N@;ORV4)GpYPK*X}5;~)WJYOC1vWfOT#HM&OPYp#R0CruDFE2Et zi!NME>4`6F0UnPJ1$!CZ&eVGKr~T4atF#19@u|ASHD!dFeKz(cJrYDZ#Nr^!kQhR{OC1LBYS+T*;_1weY81p zd8a|-Mb#5Zg_UdK{-41t@bI#Xe&*{iK);;_2)72hq(_?_D6%Bx@6#Q0h5@7PRoxyN z6TTSx(WFSFzqtRIUSVCfwFsg2VcvyLNHkkPs}F|LK3o6T(B0$w*h#hkafua1WJQ_v z3#hIu7_yd~Hnh&Ct=5`ILNXlRcdUo?YBd{866261)?cT_#15RF7k>J4P7ad4jjg+$ z#7mgxaj&mR=>X%*u1!*Kz~3&{lNY(}KX?&(&d_;DAtiTo>)cgSceEyjDPRLZ+oB); zYooa~HCeOPPt9PV_2^*zj*DQ(Ta#(o4u;j0j>JlNT_1AIGeyxwgmcIOMS1~O$YC%I^;-0YRmD5LaKYm} z>vsoussQeH%DdU!X6;dv>de-xR-Gys%FYPFixzB9_eKnVPucrMlbV{CQ-dIB>`-0k!8Yj@%Om@5H*^cuiajmtB1jj2+Gf3u z_4NgSxhr${MVb81i~mlxeckB_*>w=TGb+0qaqGkQn*@tL)FNWASW3Om^(+2o9@v0@ z^kIAYkm^Ux?u@<%Yhv^Fv+a1JnxK8hID1YSHyi!nDyhMn6dp~s`FH>WN>?gXZNqw) z?b-k+r+o(#e6`ZNxhXM!qU7(xrUcVR9-u!<#GG#UFg+}$ovEpWoE8%A%rAOC7aU_Z zer5mB@ueM3QC5{BGbJ+;w)?;ChjlkTa4*p^quGzf0ReDx$cuo-Al7x@y@== zN1}8Xl9iRJb1@EMKnq3I+(l;*y3uSnap^+jag8zRcuS@yxk^!7d<0fk`Av@RR~fHU zo^38G8r*ySS`F4Q;z}CKJ~_x(WwSW%b4F=aJ?+?i8Y0mfz<6jkREUHWw63_l4=JBt z)*jDRRM;$}w9V02cgqr%W=mG9du?GhRxDZ;>VB9;8c5iQ6$U>vHAY4wjKR4HXUAST z?V=+|3mH%mOik+nZnRazB0{ot>-mp2K=!GhWIi63Bo>=wW19sUcc`iL3X zK&Wi1{0`p`(`Lp#o`ih#VSNF6iDuBP$N0_9u95V+WuhdO!|flktM<8VEiV=T86{Ez zDVX#8yyD$`NXg+ZhZ<0F^h-lRP9|cMg}GPfq@7pYFEiBl-JkwK9Jw+Rfm*0Qf8VEf zjVrUnQivF)C5ifSPCLR#p@D9`s3Aw7UpWq$qMZQgTcCUH$XXZBx7*ICf~*aSm% zc-#H|y#Vp|pu0q?)72j2>yNS=S9487(V{;7DRBOCUF>j=@xH*_)gf1xl8cNbV0Scz z86yXTyV0_F@_zlTY@v!9B>yEO3cq#MyS56O$mOFZurtRF0D@h@7xchYYD&5lay5J>lPMwPu)GNqR$rcvJ#?sdwO4wse$z=$D%jI z{ZN0&_ohOP*aL)~J?O0)A1{#_@(el)L3=b=1XYsF6aF@3mU~Gd3aCO11nrr(iMWfu z8nV>t$N9B*4`phM8pE^#8RPH$zvjdJCNY=pB=f2EZm~ZRQOZecKr7*?M$+zZsi!PV z;R1*ZOv+Xh(t8|P`gzm0v1xBxw##H|iI;ICc_;(G<}xraSb?mtIetX&P4w5(hI~Ig zp_27|oM;*G0l`s|&tQysP&lX3GC_xx^Mh3nqeZw0X&mvCmo+X~$h#%vQM=C%PXXCn z24C?eZ(@F?BMCAVg3oJ|1LFCn;>VW=- z2McILk+c1q`d%Dv{V;$oZVPVvvQO>8t7m||#*s=A9uFGq~wxy3&RcuQ`8c631$ zeF6*qh6=eDcVu#yrVt-LWbJyNmafKJ@}cKdcihr?Do8!WrBHs@7k8;?T_VYEh>A_M zGkiMJ`f1?*zHZ^DJw7mgB-y!6p8AF@;1A;RD)co!oAcKnFdtEbKNrcV3=_9p+ZAH$ z(bw&l8*AObGdt_2(i|GcXUY@jFQ%No_E}=K5@b>MhpC9xR9Sol5};a$K5UD`E$>|R zT^oINgmq=PR)~ZuB;cFUJ8#_ASmXcuhub9h_(bT6-{9q3cA>wPN5~?)pGOkeNY@W& zKK2ESD>C+$Q}5Fz$1Ikqzq4L6`P}*8D86TC;c`QW7&5`4a;BA)$O&fWvo z`Hsigv*=epfx!Zi5D^NZ7TXfMr@s;$k0vENI#L`Fs9yX(s+30mndl%Si2l{r zaBo3>7Fw6GywCeM5)w5O+WuW1!Cv!)2uI|R&E^`ESB1SFQ)%dZ+1(Q*9j__gGs`H! zVjmNPhe^%AKAGzK24lpxQ2TG)Ao^T@iY#}-ghCeG4byk7<@BmeExlwo<|oJn7XfoV z+`~o$BPN$zzf0W9}`6uYgFn_>pQqp8F7b0a@bCa$w~S zkiDF;J%a&p_QOF35D)ZblaO&iYrBps@XAS5>I}moN`;Ti%b*aggthYZTj2mH-O~7$ ztrn0<{BPJx%+k)mtRsCC&$@&7`T23U>vE8eVrP##YB(~(Dug`k^6tw}W9Jp)%v*Gf zof}oYpg}VF)zKbU;yl{Abb~H2gB>Xx6Py)X-fy24U}8R!oWb$@dXtTLyxAAr)8VyF zddS6Xl4(~Y*Wlk@U13@wHT^m;Q@nUX@8iUWV+9BULsiZZ<@?-#@9imZ?!J+!4~gJu zmc9;K@YyjjK1gy{b_I3MO6Q%nYe!9mOSl=Bm*pG7PH}$7t&QNh^JrIw{B8bqm4bp3 zWVL)n5O)ph+PIL7^u0#G(Z@aW(E%`$+{u-=SID*7cN4`q_2)FKaS?fagMc*ZN~+4v zq&w5=X$9t)KL7b0VO%_#!QD1;PBHN5G`r=ejScYstmYN&BPv=_J=d1^E|j=K23+2T)Sk;k_|Yyc2s)d0z@C)>dxEa^W~qNURkq%HknTF{>v3u zRaPrD)PYD!N2p4dbBlkC5gAOg(nK5tn{CKW&()tTni1_n*^uuk8SD^Fc0z;B0*k?G zN`~+i%gV3GMKWI~B6xL8C1#&7DB&~=i+pnbPp?$4F3@5a#xKrc*?NwPrba&XR?g1E z_|32Mu(W+R_~^n9o~gn^0PIJnIq@SF;$FnPvh@GXi_lQ)1P8g9G@~-^MJ(w_`vP6; z!ZkbxZP#8^=KcELLbECE>SAo@AUtopmk}!%e;S(+2uPZz$XCM$$RFoJzXY&Sl>OI2 z+dKw4`H2zh9w1 zrZ42PSwGVdBO6stY zdiemz5%IqK@u7VTj=Wtne-u_b^?1I+wvNa6nkOUxv|>w&a-?yaJ`buXK*a(+_N366 z#2=~ghCc{D>8nDH1X$;xu|U1m`_s@Z)VUd3C}2`&;|n%$|MlsQp1yWWJ+GO&w>2-Qq`F_dB}JN> zjc=fDW!{UV5d~11m0x7rCp3n;ATO#<*Sh|=eqy>gCbr}iJZKs9DmZoZa_txeZ0i*` zvYX+lJ3~6(LU$#ScsO3~_!@Wd>*L8oJP0^{B2}SNh+{f$#{R{$)TMbGoxsfStWCHT z$mSqYUl2)|XoKMRlv2J(2zBHNbPPJej^DMt#UpE99vVvLsOT?P?qE+6woU{aea=9( zap*xKI+F2kf}3x#*2|GQVJ8Qr3~C>J1IFHH1nq?I(~5Z7I&?0z469*2#cOZ4dS(lh zwtgQ;3p94->j6Dw=1zewmOP&qN1A6IxyX2t3anB<1>0Fm5!Z)N&&~9n2ZLjrrUdUh zg8wmuHhxFltV@jy@7C-9tDBccd{*NL;ODU8erA;dk@Ak3^s_vmJ*Jk~Xm7$)e>KJ+ zYnp<*0K{9ypL>QXX`$P%;fu0p_k_24q-%o~V~#~KS9(KP4$5C_q1=GXp$b3t)Da)D z5M>AUq1pn4f}@+4KA#(Ro0d*OBBw>-KH_9SiT5Jlx#?$Vn5IH;E!FF zz-Zw@q01Ttat?3Dog?r44rtRD4Y zbkXu(uKTBVc=%fGvOkwbvAvy-UfSx@LA_51Ri@wqsQ;L2+J+1c>_k&e9;(vaGKoUL z>CI_N9Pxgp!ciIg*%QvI;&ew){yI2--uMH)UmIUl&=!23fxlO6 zpg69pqaG?9pJ1QheOoemIVtd6*Y3}LaEdK?&mG7UR!x5e_Af*NawlN4xwtES1W?ec z#H|%k503oYa`C*zGUqKpIW{Px>vwYLHB8e=TXNTJmVLB4+1pIZuV~`4L()#g^G~S0 zFB{4_a;Od4xtMPh+3|5=E!Nss^lz70_Yc(nmWj-uZgEzfe?>Qm<1$l`aiN?C6=VA) zGD3lHo+#`96$Q{jD~hcf#-GV84u{vwtM|L%zT=KBC7UjP7-0a87O9^k6!{q`L9f~hWR0JVRw@!ayry|to%GHKF{AV_XyT<|$3+DLW~3sa6W{pr|n=NeV5Z3lW}U3Ql+=KVLlo z&Rrh{-#oHL6iFgTQf@Kv&;F-7cpY#xl=~b|`DicTj8|X~7QgVwlJ}Zl_agc0-{314 zOQL|GTr~JRED@WN(Uqp>nTxh$6u>M*@xN6l8|W8*tUVW&-r2_GUw&{Z_vY#_?FTTm zkJ?kizNJzp+0Q43F->cq02>C)@CvVsBn0$3r-UgM-S3J=yqkA9pX+}7WnxG}Y>=s; zgk&0N{>w92I~b;7|Ff%<8w*-D%0KeWabAZZSggeM9zSCE7{QV^nd(?! z<{;P;ANwfY+$gbj9zak0d~O1GK@aPKxQIWI0(Ch>P?Wn(f@_o3dMSN&Pg3<~4}44= zz?Jnswp&ffO}da|-3HAy*A_J^t|1fknaK}_TrV0^XQwL?TjkgKBRj3!zWj8plQYvT<`# zcm+Fpi)Ot(iH1}nKo>$Rr4CHy!3Ks0P1e4B^fJ>XkLvCSKcan=Br1RdTY<`-Gy7&f z3zMmqJsDS=54hPTLKR8ihrFMD2ri**-LOqg{ja*E1WDL zcAEP2ZgVU#f8eG?9v#qhCDv?(v$38jM%y*A~n{Ai^i)k?0;i(%`nmqZLY2$iMzuNG-&EDQ1|8KSNll4d_q-nJa zqf@8iV=7Cd-j9HTrr|w__!hJt%f;REMiO#!9Wuk&P#n-ba$?$*5e29@VC5-# z+SAu2rXc8FzjYm}I8cX%Hh=Bi*~*x%k)+rJgpCsL?9zr9lK0kD!Dt@9ooAn=AqPm2 z2FJ#ShrVAmkn0@_Nn(YjKR|5IhJiNXV`NDuZEHJs5mh_W;dO^fGDyW?X|Fxf@#W_8 zZhqAVgfk-(qiaR{C}$HkDXU}1iz;|7PTUZE)A=`dSt~??BBjsstJbsdKxG|h3kA%{ zKmqp-?ZRoc1@H+@D480pxJ4?&0>QplXbA5KnHQ5zB|NrcvvA3>xD6G4 z#)lA8{)nLCF63UVonMOnMG)SAf_tLW{w*H@;Lp&TK8ph(w9;1v-Z4HXMF(pxYTzet zV2Q?FFfI7*tp{Lx9v9Z>&t8DR$ZVD-3s5paRQ)@vCQ}SK3|`7(YutX?Qp2u!uMjwN zkb>E2EfV;!+fdw)ssa?UQqm$HuB@l6Lga>vpIG#0^MOMbD}WK&b^*I-HJ%+XFkQT_ zuQkDlJ7>DTeYWU;T2&;0^Z{KOJfdv+S(BSs^>8g%eX(Vmh_+-?-mRQjqEcFt#K6~C zvmg0lglkdaOlM?KSB^8F7-d=FU^>6%w#`vf7Z%8L)yF|75X`y()5G+QuoCCSLUMeO z|LhfbwCt~S#Infx(T)3GNvNsmjlPu!ME z3N4>Q)A4WAsKAzjb0_h0X7%`S&cA;9%M!w1@&PK*IofO)o297poCN;P^-SD!##*n4 z@U3@Z^7k?fis({Syx-UXMisgy>X10}@0pyXTx2IqN-o?4!fBnzJBnCjB4o7X^~6yh zFTE-oA1x1B)CDB>?-Ljl2BfJMhXa+Cx~Z;pd=gcEOWclB7&&K@1mC#2Z=>rm7*!)* zd_ep9^i_+KGfL%f>r`P|i_*kwR@p`-uWy|Kw@fKdh49ZD5A8?rpjm>6RBzL|i!1|D zD`EjM4{Ak7VoiSzy}&HJ-X6pCJF(j1j{R4*FM|7AU0IIaO*wqsu&=expRG`LVv;$( zzA-(5Ou)Idac|VHMzwQLNns2jQv~kF9S1Y+^T$4MY1ucfW8_I9B|nake<}ordpJda zEzN}co8UA{t=g7wUhOe*+i+suk3jSXgRHdR{LT`(K`+ws%w3DV?N#&fNnf7^94hz= zydfM@{Z_cisC|fNkDXn26PPh}vI_1t3d5|i479d_CSyk( z`NtQx9qIkvG1-a0y}`T!?$39Lb+}YF!tf&qw;knjBKp&ERerH!I_KU8$UpoHa1B`q zLgosv(bi?id~)v(MdIeaM()xvMyjdv^Wwhcm4ZSW4uCchkS2SUR5(@O2%AM&B3wpe zJ)>OSP-}j#Rax;8d8y=T!LW&wcA%YLQ}5 zBtE}xWcDZHt?AZ|eAI*gOUiF5DfeylMxUf|QoNb4)!891d%s%$h&s2naJ2QYqL~ zHvE=UoXAy>RKbx4A~y@`oBMZ|fsY-pUX{AEz3vA48IH&90$b4ZbjKa*LCCX<*S}ng z-g;g5YdP9NhuNJA&jP{3-n*HS*~9pGTLPG4qggyb!q+Rxpd}x_=SKGMiC$c&q$WQ| z!7_@#M9pBXaLOz=7pjIRHLLa^Z})FMzRe4qDE@lVMdkOCP5=!qJ~j0I6b zQ(dp9T5LV@FK&qBAe{aXb7^(FN>k&M`Ckj;D`hA*_tBH_Ih|ospj~C!wif=mHjS3k zWcy}*mkR#g&)-U^?sJMgh{cRh=hZkgTfd($a`jgIRr~Uh!7@k~Z@DsSM7nrSX81gq zZ9@f4FNJKt!)^9EnCQ15XcS)Z*0|1Fs;0h$H|eUwc<<+{WW=eg`4Nw9uJfeVhjvmy zgZPJ2IJO_CkU_Mj1206Y#uD-hb5J$l&)zU>np+fKD-W!! zk&AuQ&XJo3LY|E$4Y0QoHP?^hSdGl3Ojp(<+=jF1hvey?;%1GquHQZmS=6xMjoC;> z-MsfQZoi$H8+!OG!j|!-;yPseYx79w^tR3*5xl?RsF-_j6nU3~PO(A{MN|lg$0qF4 z?o($BLV^Fh5An>}qL)|IpPg7&@DgfGXsB8XWIS~AECibl?~De+ z_uRfB@Xp5at9QW5)(Nkl6Tt0nNx??Mp>Hg};Bf3wA4bq@!KRjTbXXNU;~pGtYvq{! zo+Xzx|4>k4uRSd$`j;<+;g^%uEx&y9%6|v^U^(@T_(>Z3%^?~8JC5(3BRuIV7iJ_5 zm+UMLy7%Ps^N~>FSy$q6=t)fm{dKZ+Q?Is$8-IwQeEH1#>UuKKKxsx{3x8vwEpn0ABZSXDptY7#EaM#*054&~*(&-Av5fe3U-T|fHG|BNLP ze(J5~)|*^ct=gQ&a%w;3!ASCt0KJhmT#C>e+h1olYW$4T?~Y?auUXCse~psw6>2o) z(rUxPJIPLMx)o-KfrdBRn@rwO*pO60_uLAt;di|C;PB+uGK+buE9n$58KuzzKQqZM zbD5h?&tM84Le?HO`CylQw19mk|fH5+h zJB6PGhyWTsK=q0p1uXG<|8PY1!`o+{HxxO&7m*U*JBM}s((fO~RemB(1^PE1XL&(g zwjg1Uwj4Ov#-x7p`nAsLS((T$9Lii?KSuDO8+ErV^#oZ0U~&d5zTID|cSLsE*g@At zvP#d0M+t&oJ2DLW=UYdyDO(bm62)d|U(YOph~N>@Qj0DLSo1idfN& ztJ*>Tx`yuN)t`pR?Ytl}GSB7sad5NUor9YEhypK*2=0cAWic(40^M?`PEkaN>h@FW zH~bE%f@xuZ3Z;kvJk7U>>at9~ zP3Tks3~FH#?c!9rrY`DPR5s@qIaKS-TZaKcdZ% zYQ*GSI)+E7;lo~=gzd(lF(j+{hMzpC2iCf>YqZFf-8?)URl$(tNg;>kR?~VixK9RT zpn@fFzN*VaSFXM;ny3@9U6noWT$gnuQ!`Ew2v1K^L{Oy!=J?clj_(Jr9@5y;F^kP1 zD^1IonL10{s4lUwA3 z(yJ&z@$&hA{Co`C_UHD8@x~SpRO#m&nb7|C=1DSNtDcjY%VM7M`hz4o`c1vHfMkT71QvtuH5e`3Z-GnsNxSjf zV~V|nep5@V{b%I<>8*q>{`n6FV@OmD_v-!*IRBv+y-yfw1~Oh!S|JV}+G+TE4^y^3_68^I6l=~_FTA>$d425d>Z2bP` zXSeJf{P<6a*}6#n=RrD_0CEKvD=3$48e)hDl|mQtK43!DC%@#4U~C46i<@fbvbeh4 z)PDlI;5jz6tNbg81G(?4;{XFHyYMsKX|rTin7OUkyClfO)u_TojjBw z<}Bx__8b{odiVKN_xacJVmF&+V(hqAb#cVCl2$&D;;v9ZYtNe+l5^$P_vgfG8fcf z2&o21XQ}?4=Ufc@K_8;!G>Vy;su}!`fK+r5G4ae*?U`#<@-wOf(LYyQzE8hgxVg~{ zNEBNLeT{OGwhl*#g&`C>W6}`VK%{ETTZ-8ynbxuVtY~YA0~=&j?#=M#bh?cqOFGK3*n)E9vcrH@NElX61 z?v1Bw)Dw5fMxsq7a38o-c$k29?v;*{H9R7aiK2cXv#J}&5Pxra@k>pSBH$irh4pK# z;zh)1nupuDH3|##&hXk9$;*5fP-Yxwz50$y|XeXx^q&&;R#M9~o{e*XF>_ z^r6KK0m^mzkSd*c2&=NomVYTGeu47$9FpJd>W@rbOrztQw^B2lY)miifMTrAQyx_v z^Vb;<>g(C9GWMiM6h4p9;eTI#_CAIXG;zg2FGGk-77R`jp||}r4K+Ce6%#pp zWQ!mj@=~^*90NnajI`LNsZ1PUT{BmTtwP*0Zm+VIynfPhUPW@NTr$hZ9*mbWdOFS+2i-6N{_=PwXB=qCDi1Fe&dC0f0q}3 zbBJPhuLKuxZS5&#+axVd2_;mo%Al1{M5}%ksgOj(WXrd_U;u|A^3(aNK<1qLDxY@R zf|WK5j+20T;C1_8CuC{H*Vu;7yFwv}vtdN_85wU-G=qyHQ%7V~Vxp{ebwbCMmw~03XS&_xbOSrFg zoi#{-JzmZlx0|j0h$5J@fij(PI?oqMC4G9#qKiir4|l-lT!u`nSbqN7=vn@7pn(y5 zIA?SJBdfjn4{NM?T_1inFW=_Bzu_OT*B_03F-+a$E7VxYj&t2bqTQ0%ne1?6OhJW4 zqoh)i0*1$MVPhGp8&}cJ<9^F$S+=omLW(OXkh5mjS+cy5?>yYeIoD>WjuXFqpJov~ z#Z+rawvmB?%!UhPE9yQa8)c!n|5i!eAtYyjhu=WC$Ix1vE9JTMSbX4DkdKplzRAn@ zy=Fu2LJ^URi=XT39lbnqAB(RRzW}Z)FVhZmo-)E?-t9YXdPpHov+v6D@5yOHTJ4Zp zXJ<^JHR$6QgP44V<3gcJ3B1ucuw(zeE`lUsGx&5Uh3ACdJGQJOkYic?z3OvtZqgo$ zOfCcdLo5`XNDW&r3?4)bbIm?}w|bgSVM2+yNbpt57TX;6nqyCIB0jUn+%kk>y47l6 zB4C-GE{nJK>W|j2dBkIGX}$GPb-rF-De}A?quv|E&(q;^s4?GeE#ET{R&u6XC@l^R zt1SEgC?YzkFqSGYC7bs%s)^d_AFvW%CgAs32VF?}!?H%G>V26QDNT0bL0njs6wmXC zV)tm`Q?FM)?!|21&wU<$i#{#LW(^tMFOtk1pX~cpGt^L;z9Awwg~ru>t`lsb&iQ2O zhN&_zIZHGz1}=I-n;(vP}%kmlW*Qux7M^m?$c& zIok5u@uN7RMwJ^H&@$cl0_sI2#Nqa?W|o27SD3cvn7ET!x^REzsYNE~-#Jy-gr6v8 zgrqiAuUHb*CZ4kjL|vTMd1w5?Z$-wr)+OS|mmeOtsz~sr*T-!{kaHKKKsp5S1Pf=Ib+#2McFVs zqC#(>2%&>7$F1+4G8xg<$VUb0lryh&fxd}1{dWmOYIEnTv9{6MPF8`x%!=l)6g$m7 zMe(dq9Aj$xo1RyXwtN5jTA6bFT7mZS>FLX+=^38+!02__?UOYJHSQI`!&PLsoYx;B ze~ZTCPL>U2zNk|wM+(T9`JagqOFPLi((TjSwK?4E6agivj8}n<(fnUY+N_f_eQzdE-{7zG7r?i=l)=vlTtxlg>(J3y006bsAHU=zKF=9xYe*u z!QC{#Q#@pQTVpz&m-b9aMrq|DW`ZKkQU^%&K5;*!zbjx=Jw`X2sz7^(VbUCncSzh` zd+rwcBA@xtC*ePx##~y$z{qA{3m_N)Q-Kc`98j`Oa|P0ciH!eL^xq_A1j` zCuU=feYYWNp3YWq)(-Qk895<#LY+XPN=CziNn@1*%zn!JT3yt&%5NsuXqrF#3CAO3`5XC@dM@LxDp%wxpFUo z>lBT(^X*Gps1nb-ajc6!)P-mw+Q8KJzWpj~Rs#u)yB1d9JqA|1Mf{s)`D@ZEu9XnS z_gTI%rmp1Mj{!Xr{HMT*c802Rahh*w+mvSbCiQ2=*^~9$Cn=U;1`;mnWS)k79F4^Y z4drrj?g9&Lu#|1_vL0m$(bysKtGBZt)MkAD?S-0(&s$6!z5+f{p!{ES-a{2NVSMCC;5! zKSfc(BIE)cj(q5n*Vc|-2ouf=MaI@WcVRJKdFK;hnYVbhX_QIAh3Bv)uD69G^bE0z zo>~$8pHGbi21yVglObbc2!UCqor&)<<`XAJdCj&;|Af^JQ=q;+>#$)9`nVqZkAP+; zsWOpaxm=JMj#$!FCWdC{8Wh5a)`2^%v`%w8juw33u&N|RT>wHc$D*=d(G+Nh+8Tkb zR5gJQ>|vC5mZ@$q$PAyN3+o>Q4ug%SK#Vh*kC$$)H3I@d75R>{l$E(gd}Yn>`s%oB z3jaCVKEu)V&_}K_Cget!J8_8Rab7MTc@rV?5qS`T^@kXLx)Ni6OO>1PQXgsU_jb6! z%Q)xKcvPJqjXC+M;-9Rl$-bc;;4yfkLk2nXUW6Tg65<{E+&~T?egcL0hpVK0#y`P=U5C+o_EM`9-VY@jm^&=Tf`Z zch_6vXxLo`jznQZz?{f|#0u~;v*OrqYpd}l$OD1519B<|V!3Uidfp{oD2KoccTVI( zACSW~q0b>3zGc`-$GCS9dV0U=Lyu<5W4x_%!wIIsfWADwf|x0eAm<=h+3%zh+kcGW z3(M4H-imrQ9Y2|iHZgd0pTtx=W)pxS1?(|{`3@^@q0j(Z4tM(0@ zcTzmPm6jPi6SQQPWoC9EXrVSoy|O;nhqP?87YB2w)Av1$P&pEo6i*SQIb~g0@(#U` zNjxTW@rei~W)Zko3fg6Nl#boVLRy$!jHB7#ASAgra$YJaWpFeK(!TxeUm?rYJ@bxD zutkLX#>hAn)Q;92`~LjzGe3%e?yd6_>~&8C~zjUqmbv@+q1dXvrbJ%cyZ55K2B&+DLGN-dJI1 z`}LqT0+;qF7HpeTf=uX26x4yOzsIKVAa)8@@Fo`^^>WB6sF85NQ)p$($Ai)v*&1ek zmu-WL|9x;$^Q-^nJo_UwYIB&ELZjVjeDf*xs6$ZXUHg3B)de0}d`L8j^eTqV#V6@D==FeonMl>m01>qb?DJNrf@ zaFJiHDRraXKSEVSmFfR8D0=wLWgZMs2_Fw+Xg$rEE3@LIQU+SN5N@BJ0*45yeSo@* z5MSROcV+TfcBEo%{$%d+h4Mx?1VCIqX9aL`<90l^Y5NcWKM8V68sSi}X2&eS4ZovhqC3-uyx;}pd-pfW4MC;l1ih3*n z_dW7hCOq9(bI;Qf%Udk3z>Zdj_-V6v_IS1J-YR;BVo26xJ=?6@Tg;4OCqD|@ob!S=skm4@E^j}HI<4$SLD42&{=^0*M<7AZ$!*SVjy4Zu3KF+U$PaI$*M@LwMx zAQDOAbadf%G5o6`;BM>QQN3&;dzKrH{f90Qh3 z5He;|_Pbv1smPJ<-wNIXDSu#{2b2xQ>NL`C%oFjip7oHxqklJBEMEM)^a;Q;#{snX z?}tIQ2ZWARpjkr>OBDMKY!WjMZ^V+83$nAdL0mqt2}o)(tsSj+eeY(`J7k4zj|`;2 ze;!TQr-6aNcu)`mSXn+pbYC2j+Qc4 znvKWVk5Lcrk3j0>gy2N07|0NPA1&dVME{Ap?|>E972E!+I54kUG(LR9{q8gd6sQN8 zJ=6MaE?K0~(Eb16O#nb6P|(1BvdFxh1~O?Sn~`;bUtazPKp*T=FBD*{Q^{j<9B~w0 z=p+|n3HZz0R;MBGfuzR{n%#h2wK9lxdCvCk;f}ET4;MgTrJyLOo?QtsHmSXv9y~IT z1_taWk0-0w`YuaBVHbtbV!QUUv6i-DCZ? zvv(hMeug`jeAV|_HRDI1?Roa^H=EyemFF(i3H)JTTC-tV;**Q;1O+ugeJx6V2%i;9 z?R3e|bP%Bl?LUE!LzI2D!AW7?zJy4jxJY34xo%({F#m5`=zV_(snb@_ zob9t0=6Nh~-fMa@Oxy%+_MZ{j*!F%m^UZn%)r_Y0oZ?V2XL7*;q4oe467<_EUj*dL zxkB9Zv6PFxDXPEiwrK2|Ux@=hog#e&pQYh1b?J`!nrUnT_bD`V2*BJ{!I zNG%1f48t#KK_zf@*&^VQf*=wUwtQ-w?s7vs#;ykz0WPW^8+CLTcB=npF~$0eftt(>L?L_4^oh@%3=Xa ze5HDgl!F~LqWnSy${YG5)`w35Ip=t;-;6H1RJu71IhqjIorZX9>igrxV}KlMgv@@^ zIUm|;t$V=99^1^D$~M(=lN-Z3`vdPiMCW@*Wx5p_Lg0h8U**bt;U*uWP*rhYp7~FBayDTUR%B}++Vak;)Tb)MP&`j@mG*8WW zqRoWGjzsfi47wNcUPeVw#y5Ve(}=alL4w2)k2{E6(NSt0X4JEN;JSBw>mic8CEI6j(6`{2~lwrz%=)Uiyd9i>HV!x zOE`(Z(K33h{)Tp?arBi2v3S9A_WQBzVF{ufL=7G}RowRl0|NttVnSX5XI=v8TN&^} zc4NaGzGX!Av``4bbe4dI_Pha;%Z35oedRxf?1w*cA4;APCI#+69=)f0=t_G8Vv4B* zG_}+o8>M_}BISM_0?-~u|0_Za94@Z?#eWT%3}KnCu>E&R-}YEuSV2TFwx2{Jw0P1e-(!)x5h$u9LeZC zbh0A=zI_M0C6IPM+CZnZXgaSIBEkcm_V-XHhBPEMCv5U}@r{JYvY(FWz6Nxl44{Vu zsumBlEa4ranFNNvVJfyFfb?v$`}s){*XKm55Q<|ix$qnY{DVLAicTu3dovSEo8lOusD z`9oJ4{YMj`?jQ2`Z6}Y&<ssks1DsgZE{%IyRK?s}>TJJ6Kod^M>bsqA^d&meZ zLp+`1BRd))?)q4ItUDC&Ubm?hK(y)* zmi5Tf$N!9b$Yk5@tpYH_&%nUIV4^5!>0DqrPzW*95j{e&{kW@$;=L7> zAOWLAPLfB1%dF4mnXx+CIL!i z3;-Z@b2XB8o|R-{5lQ_~1C=1gw%g|g5kN)?ieY@@*lob>)1g^Fj$FhT2qAx@Kv~4U z3xNbsMJ~Y?jVBrBga5ce00s+rVf3AQRK+%-+jTezcf`Z0@W&51>oThT;$sk{)z`o2M zpzR4RCNjWV0;2SNas>6ss^kwS9RdhUqGX;tLDlyyqT@XosKl_XHja69qZSDSfaNWq zEGORJAWeqAafxht_%a2&w5902&w= z7#J878w>$7FfcGEFdQPd=pkHL+yY#?GFM-i$h`e3vY#Hq(BD5-)MU@Vz`(%3z`(%3 nz`(%3z`(%3z`($u2=V^`g$tNx>ZQGM00000NkvXXu0mjfwAz&b literal 0 HcmV?d00001 diff --git a/Resources/images/fire_totem2.png b/Resources/images/fire_totem2.png new file mode 100644 index 0000000000000000000000000000000000000000..014f8f228b40022b53d98ace2095cb1f51a621b2 GIT binary patch literal 46781 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/test_tower.png images/test_tower_gun.png images/test_tower_slot.png + images/fire_totem.png \ No newline at end of file diff --git a/Utilities/Resources/pixmap_loader.cpp b/Utilities/Resources/pixmap_loader.cpp index 15c8207..c4a0524 100644 --- a/Utilities/Resources/pixmap_loader.cpp +++ b/Utilities/Resources/pixmap_loader.cpp @@ -1,19 +1,89 @@ #include "pixmap_loader.h" -QPixmap* PixmapLoader::Pixmaps::kBackground; -QPixmap* PixmapLoader::Pixmaps::kTestBullet; -QPixmap* PixmapLoader::Pixmaps::kTestMob; -QPixmap* PixmapLoader::Pixmaps::kTestTower; -QPixmap* PixmapLoader::Pixmaps::kTestTowerGun; -QPixmap* PixmapLoader::Pixmaps::kTestTowerSlot; +using P = PixmapLoader::Pixmaps; -void PixmapLoader::LoadPixmaps() { - using P = PixmapLoader::Pixmaps; +QPixmap* P::kBackground; +QPixmap* P::kTestBullet; +QPixmap* P::kTestMob; +QPixmap* P::kTestTower; +QPixmap* P::kTestTowerGun; +QPixmap* P::kTestTowerSlot; + +QPixmap* P::kFireTotemAnimations; +std::vector P::kFireTotemIdle; +std::vector P::kFireTotemDisappear; +std::vector P::kFireTotemAppearing; +void PixmapLoader::LoadPixmaps() { P::kBackground = new QPixmap(":images/background.png"); P::kTestBullet = new QPixmap(":images/test_bullet.png"); P::kTestMob = new QPixmap(":images/test_mob.png"); P::kTestTower = new QPixmap(":images/test_tower.png"); P::kTestTowerGun = new QPixmap(":images/test_tower_gun.png"); P::kTestTowerSlot = new QPixmap(":images/test_tower_slot.png"); + + LoadFireTotemAnimations(); +} + +std::vector PixmapLoader::CreateHorizontalFramesVector( + QPixmap* source, + int frame_width, + int frame_height, + int frames_count, + int start_x, + int y) { + std::vector result; + + for (int i = 0 ; i < frames_count ; ++i) { + int x = i * frame_width + start_x; + QPixmap* frame = new QPixmap(std::move(source->copy( + QRect(x, y, frame_width, frame_height) + ))); + result.push_back(frame); + } + + return result; +} + +void PixmapLoader::LoadFireTotemAnimations() { + // file size - 896x480 + // 5 frame rows, 14 frame columns + const int frame_width = 896 / 14; + const int frame_height = 480 / 5; + const int idle_animation_frames_count = 7; + const int disappear_animation_frames_count = 14; + const int appear_animation_frames_count = 8; + // row and column start from 0 + const int idle_animation_row = 1; + const int idle_animation_column = 0; + const int disappear_animation_row = 4; + const int disappear_animation_column = 0; + const int appear_animation_row = 0; + const int appear_animation_column = 0; + + P::kFireTotemAnimations = new QPixmap(":images/fire_totem.png"); + + P::kFireTotemIdle = CreateHorizontalFramesVector( + P::kFireTotemAnimations, + frame_width, + frame_height, + idle_animation_frames_count, + idle_animation_column * frame_width, + idle_animation_row * frame_height); + + P::kFireTotemDisappear = CreateHorizontalFramesVector( + P::kFireTotemAnimations, + frame_width, + frame_height, + disappear_animation_frames_count, + disappear_animation_column * frame_width, + disappear_animation_row * frame_height); + + P::kFireTotemAppearing = CreateHorizontalFramesVector( + P::kFireTotemAnimations, + frame_width, + frame_height, + appear_animation_frames_count, + appear_animation_column * frame_width, + appear_animation_row * frame_height); } diff --git a/Utilities/Resources/pixmap_loader.h b/Utilities/Resources/pixmap_loader.h index d1f3a8d..dd8eb75 100644 --- a/Utilities/Resources/pixmap_loader.h +++ b/Utilities/Resources/pixmap_loader.h @@ -1,18 +1,40 @@ #pragma once +#include + #include +#include "Utilities/animation.h" + class PixmapLoader { public: class Pixmaps { public: + // TODO(jansenin): maybe make this readonly static QPixmap* kBackground; static QPixmap* kTestBullet; static QPixmap* kTestMob; static QPixmap* kTestTower; static QPixmap* kTestTowerGun; static QPixmap* kTestTowerSlot; + + // For animations test + static QPixmap* kFireTotemAnimations; + static std::vector kFireTotemIdle; + static std::vector kFireTotemDisappear; + static std::vector kFireTotemAppearing; }; static void LoadPixmaps(); + + private: + static std::vector CreateHorizontalFramesVector( + QPixmap* source, + int frame_width, + int frame_height, + int frames_count, + int start_x, + int y); + + static void LoadFireTotemAnimations(); }; diff --git a/Utilities/animation.cpp b/Utilities/animation.cpp new file mode 100644 index 0000000..c4d3623 --- /dev/null +++ b/Utilities/animation.cpp @@ -0,0 +1,80 @@ +#include "animation.h" + +Animation::Animation(std::vector frames, Time time_between_frames) + : frames_(std::move(frames)), + time_between_frames_(time_between_frames), + time_to_next_frame_(time_between_frames), + frame_index_(0), + was_ended_during_previous_update(false) { + assert(!frames_.empty()); +} + +Animation::Animation(QPixmap* pixmap) + // doesn't matter what time between frames is, it just must be non-zero + : Animation(std::vector{pixmap},1_ms) {} + +void Animation::Tick(Time delta) { + time_to_next_frame_ -= delta; + if (time_to_next_frame_ < 0_ms) { + int frames_passed = + abs(time_to_next_frame_.ms() / time_between_frames_.ms()); + ++frames_passed; + time_to_next_frame_ += time_between_frames_ * frames_passed; + bool animation_ended = false; + if (frame_index_ + frames_passed >= frames_.size()) { + animation_ended = true; + } + SetIndex(frame_index_ + frames_passed); + was_ended_during_previous_update = animation_ended; + } +} + +const QPixmap* Animation::Frame() const { + return frames_.at(frame_index_); +} + +QPixmap* Animation::Frame() { + return frames_.at(frame_index_); +} + +void Animation::SetIndex(int index) { + was_ended_during_previous_update = false; + if (index >= frames_.size()) { + was_ended_during_previous_update = true; + } + frame_index_ = ((index % frames_.size()) + frames_.size()) % frames_.size(); +} + +void Animation::SetTimeBetweenFrames(Time time) { + time_between_frames_ = time; +} + +Time Animation::TimeBetweenFrames() const { + return time_between_frames_; +} + +Time Animation::TimeToNextFrame() const { + return time_to_next_frame_; +} + +int Animation::FrameIndex() const { + return frame_index_; +} + +void Animation::NextFrame() { + SetIndex(frame_index_ + 1); +} + +void Animation::Reset() { + time_to_next_frame_ = time_between_frames_; + SetIndex(0); + was_ended_during_previous_update = false; +} + +bool Animation::WasEndedDuringPreviousUpdate() const { + return was_ended_during_previous_update; +} + +int Animation::FrameCount() const { + return frames_.size(); +} diff --git a/Utilities/animation.h b/Utilities/animation.h new file mode 100644 index 0000000..0489770 --- /dev/null +++ b/Utilities/animation.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include + +#include "Utilities/time.h" +#include "GameObjects/BasicObjects/Interface/tickable.h" + +class Animation : public Tickable { + public: + Animation(std::vector frames, Time time_between_frames); + explicit Animation(QPixmap* pixmap); + + void Tick(Time delta) override; + QPixmap* Frame(); + [[nodiscard]] const QPixmap* Frame() const; + void SetIndex(int index); + void SetTimeBetweenFrames(Time time); + void NextFrame(); + void Reset(); + + bool WasEndedDuringPreviousUpdate() const; + [[nodiscard]] int FrameCount() const; + [[nodiscard]] Time TimeBetweenFrames() const; + [[nodiscard]] Time TimeToNextFrame() const; + [[nodiscard]] int FrameIndex() const; + + protected: + std::vector frames_; + Time time_between_frames_; + Time time_to_next_frame_; + int frame_index_; + bool was_ended_during_previous_update; +}; diff --git a/Utilities/time.cpp b/Utilities/time.cpp index 513c71f..a90e7a6 100644 --- a/Utilities/time.cpp +++ b/Utilities/time.cpp @@ -48,3 +48,20 @@ Time& Time::operator-() { ms_ = -ms_; return *this; } + +Time Time::operator*(int rhs) const { + return Time(ms() * rhs); +} + +Time& Time::operator*=(int rhs) { + ms_ *= rhs; + return *this; +} + +Time operator*(int lhs, const Time& rhs) { + return rhs * lhs; +} + +Time operator "" _ms(unsigned long long ms) { + return Time(ms); +} diff --git a/Utilities/time.h b/Utilities/time.h index bbc0a9e..45164d0 100644 --- a/Utilities/time.h +++ b/Utilities/time.h @@ -17,12 +17,19 @@ class Time { Time operator+(const Time& rhs) const; // there is no check for negative time Time operator-(const Time& rhs) const; + Time operator*(int rhs) const; Time& operator+=(const Time& rhs); Time& operator-=(const Time& rhs); + Time& operator*=(int rhs); + friend Time operator*(int lhs, const Time& rhs); Time& operator-(); private: int ms_; }; + +Time operator*(int lhs, const Time& rhs); + +Time operator "" _ms(unsigned long long ms); diff --git a/constants.cpp b/constants.cpp index 844d05d..f8b336c 100644 --- a/constants.cpp +++ b/constants.cpp @@ -12,8 +12,8 @@ namespace Entities { const int kCircleAttackAreaApproximationPointsCount = 10; namespace TestTower { -const qreal kAttackRange = 200; -const Time kAttackCooldown = Time(1000); +const qreal kAttackRange = 300; +const Time kAttackCooldown = Time(100); } namespace TestMob { @@ -24,7 +24,7 @@ const int kHealth = 30; } namespace TestProjectile { -extern const Damage kDamage = Damage(10); -extern const qreal kSpeed = 100; +extern const Damage kDamage = Damage(3); +extern const qreal kSpeed = 500; } } // namespace Entities diff --git a/game_scene.cpp b/game_scene.cpp index 5d28dcd..fcbdf81 100644 --- a/game_scene.cpp +++ b/game_scene.cpp @@ -1,5 +1,7 @@ #include "game_scene.h" +#include + #include "GameObjects/BasicObjects/Interface/graphics_item.h" #include "game_view.h" #include "GameObjects/BasicObjects/Entities/Mobs/Basis/mob.h" @@ -8,11 +10,7 @@ #include "GameObjects/BasicObjects/Entities/Projectiles/projectile.h" GameScene::GameScene(const QRectF& scene_rect, QObject* parent) - : QGraphicsScene(scene_rect, parent), - mobs_(std::set()), - towers_(std::set()), - tower_slots_(std::set()), - projectiles_(std::set()) {} + : QGraphicsScene(scene_rect, parent) {} GameView* GameScene::view() { auto result = dynamic_cast(QGraphicsScene::views().at(0)); @@ -20,75 +18,43 @@ GameView* GameScene::view() { return result; } -void GameScene::removeItem(GraphicsItem* item) { - auto mob = dynamic_cast(item); - if (mob != nullptr) { - mobs_.erase(mob); - } - - auto tower = dynamic_cast(item); - if (tower != nullptr) { - towers_.erase(tower); - } - - auto tower_slot = dynamic_cast(item); - if (tower_slot != nullptr) { - tower_slots_.erase(tower_slot); - } - - auto projectile = dynamic_cast(item); - if (projectile != nullptr) { - projectiles_.erase(projectile); +std::vector GameScene::Mobs() const { + std::vector result; + for (auto item : items()) { + if (auto mob = dynamic_cast(item)) { + result.push_back(mob); + } } - - QGraphicsScene::removeItem(item); -} - -void GameScene::clear() { - mobs_.clear(); - towers_.clear(); - tower_slots_.clear(); - projectiles_.clear(); - - QGraphicsScene::clear(); + return result; } -void GameScene::addItem(GraphicsItem* item) { - auto mob = dynamic_cast(item); - if (mob != nullptr) { - mobs_.erase(mob); - } - - auto tower = dynamic_cast(item); - if (tower != nullptr) { - towers_.erase(tower); +std::vector GameScene::Towers() const { + std::vector result; + for (auto item : items()) { + if (auto tower = dynamic_cast(item)) { + result.push_back(tower); + } } - - auto tower_slot = dynamic_cast(item); - if (tower_slot != nullptr) { - tower_slots_.erase(tower_slot); - } - - auto projectile = dynamic_cast(item); - if (projectile != nullptr) { - projectiles_.erase(projectile); - } - - QGraphicsScene::addItem(item); -} - -const std::set& GameScene::Mobs() const { - return mobs_; + return result; } -const std::set& GameScene::Towers() const { - return towers_; +std::vector GameScene::TowerSlots() const { + std::vector result; + for (auto item : items()) { + if (auto tower_slot = dynamic_cast(item)) { + result.push_back(tower_slot); + } + } + return result; } -const std::set& GameScene::TowerSlots() const { - return tower_slots_; +std::vector GameScene::Projectiles() const { + std::vector result; + for (auto item : items()) { + if (auto projectile = dynamic_cast(item)) { + result.push_back(projectile); + } + } + return result; } -const std::set& GameScene::Projectiles() const { - return projectiles_; -} diff --git a/game_scene.h b/game_scene.h index 28cbbd4..55adcde 100644 --- a/game_scene.h +++ b/game_scene.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -11,6 +11,7 @@ class Mob; class Tower; class TowerSlot; class Projectile; +class Entity; class GameScene : public QGraphicsScene { public: @@ -18,18 +19,8 @@ class GameScene : public QGraphicsScene { GameView* view(); - void removeItem(GraphicsItem* item); - void clear(); - void addItem(GraphicsItem* item); - - [[nodiscard]] const std::set& Mobs() const; - [[nodiscard]] const std::set& Towers() const; - [[nodiscard]] const std::set& TowerSlots() const; - [[nodiscard]] const std::set& Projectiles() const; - - private: - std::set mobs_; - std::set towers_; - std::set tower_slots_; - std::set projectiles_; + [[nodiscard]] std::vector Mobs() const; + [[nodiscard]] std::vector Towers() const; + [[nodiscard]] std::vector TowerSlots() const; + [[nodiscard]] std::vector Projectiles() const; }; From 630638a81a47da790ac3d8d48b59385982c48815 Mon Sep 17 00:00:00 2001 From: dzhen Date: Fri, 20 May 2022 19:45:00 +0300 Subject: [PATCH 5/7] code style --- GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp | 2 +- GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp | 3 --- GameObjects/BasicObjects/Entities/Mobs/test_mob.h | 2 +- GameObjects/BasicObjects/Entities/Towers/test_tower.cpp | 1 - GameObjects/BasicObjects/Interface/damageable.cpp | 2 +- GameObjects/BasicObjects/Interface/damageable.h | 2 +- Utilities/animation.h | 2 +- Utilities/route.cpp | 1 + 8 files changed, 6 insertions(+), 9 deletions(-) diff --git a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp index f494d26..ec04a26 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp @@ -1,5 +1,5 @@ #include "mob.h" -#include + #include std::vector routes{Route({ diff --git a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp index 350ac12..d6238b3 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp @@ -1,7 +1,5 @@ #include "test_mob.h" -#include - #include "Utilities/Resources/pixmap_loader.h" #include "constants.h" @@ -13,7 +11,6 @@ void TestMob::Tick(Time delta) { } if (is_destroying_ && animation_->WasEndedDuringPreviousUpdate()) { animation_->SetIndex(animation_->FrameCount() - 1); - std::cout << "test mob will be destroyed" << std::endl; deleteLater(); } diff --git a/GameObjects/BasicObjects/Entities/Mobs/test_mob.h b/GameObjects/BasicObjects/Entities/Mobs/test_mob.h index 0c0db01..2cec260 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/test_mob.h +++ b/GameObjects/BasicObjects/Entities/Mobs/test_mob.h @@ -12,7 +12,7 @@ class TestMob : public Mob { void Tick(Time delta) override; void ApplyDamage(Damage damage) override; - virtual ~TestMob(); + ~TestMob() override; protected: void keyPressEvent(QKeyEvent* event) override; diff --git a/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp b/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp index b0a79b0..df287c7 100644 --- a/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp +++ b/GameObjects/BasicObjects/Entities/Towers/test_tower.cpp @@ -1,6 +1,5 @@ #include "test_tower.h" -#include #include #include "GameObjects/BasicObjects/Entities/Projectiles/test_projectile.h" diff --git a/GameObjects/BasicObjects/Interface/damageable.cpp b/GameObjects/BasicObjects/Interface/damageable.cpp index 1f9c3a6..ebfbd77 100644 --- a/GameObjects/BasicObjects/Interface/damageable.cpp +++ b/GameObjects/BasicObjects/Interface/damageable.cpp @@ -15,6 +15,6 @@ void Damageable::SetHealth(int health) { health_ = health; } -int Damageable::GetHealth() { +int Damageable::GetHealth() const { return health_; } diff --git a/GameObjects/BasicObjects/Interface/damageable.h b/GameObjects/BasicObjects/Interface/damageable.h index daac308..2b581d9 100644 --- a/GameObjects/BasicObjects/Interface/damageable.h +++ b/GameObjects/BasicObjects/Interface/damageable.h @@ -6,7 +6,7 @@ class Damageable { public: explicit Damageable(int health); virtual void ApplyDamage(Damage damage); - int GetHealth(); + [[nodiscard]] int GetHealth() const; protected: int health_; diff --git a/Utilities/animation.h b/Utilities/animation.h index 0489770..b4c624e 100644 --- a/Utilities/animation.h +++ b/Utilities/animation.h @@ -20,7 +20,7 @@ class Animation : public Tickable { void NextFrame(); void Reset(); - bool WasEndedDuringPreviousUpdate() const; + [[nodiscard]] bool WasEndedDuringPreviousUpdate() const; [[nodiscard]] int FrameCount() const; [[nodiscard]] Time TimeBetweenFrames() const; [[nodiscard]] Time TimeToNextFrame() const; diff --git a/Utilities/route.cpp b/Utilities/route.cpp index ec22f25..e0f491c 100644 --- a/Utilities/route.cpp +++ b/Utilities/route.cpp @@ -1,4 +1,5 @@ #include "route.h" + #include bool Route::isEnd(Entity* entity) { From 75266296579cba267afe2136f6dfc152257a1325 Mon Sep 17 00:00:00 2001 From: dzhen Date: Fri, 20 May 2022 20:12:30 +0300 Subject: [PATCH 6/7] more code style --- GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp | 3 ++- GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp | 9 ++++++--- .../Entities/Projectiles/autoguided_projectile.cpp | 5 +++-- GameObjects/BasicObjects/Interface/entity.cpp | 2 +- Utilities/Resources/pixmap_loader.cpp | 5 +++-- Utilities/animation.cpp | 4 +++- Utilities/time.cpp | 2 +- Utilities/time.h | 2 +- 8 files changed, 20 insertions(+), 12 deletions(-) diff --git a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp index ec04a26..65d3a29 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/Basis/mob.cpp @@ -21,7 +21,8 @@ Mob::Mob(const VectorF& coordinates, Mob::Mob(const VectorF& coordinates, QPixmap* pixmap, int health, - qreal speed) : Mob(coordinates, new Animation(pixmap), health, speed) {} + qreal speed) + : Mob(coordinates, new Animation(pixmap), health, speed) {} qreal Mob::GetSpeed() const { return speed_; diff --git a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp index d6238b3..583ffc0 100644 --- a/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp +++ b/GameObjects/BasicObjects/Entities/Mobs/test_mob.cpp @@ -46,13 +46,16 @@ void TestMob::mousePressEvent(QGraphicsSceneMouseEvent* event) { TestMob::TestMob(const VectorF& coordinates) : Mob( coordinates, - // TODO(jansenin): Было бы лучше инициализировать анимации отдельно от моба + // TODO(jansenin): Было бы лучше инициализировать анимации отдельно + // от моба new Animation(PixmapLoader::Pixmaps::kFireTotemAppearing, 50_ms), Entities::TestMob::kHealth, 100), is_destroying_(false), - idle_animation_(new Animation(PixmapLoader::Pixmaps::kFireTotemIdle, 50_ms)), - disappearing_animation_(new Animation(PixmapLoader::Pixmaps::kFireTotemDisappear, 50_ms)), + idle_animation_( + new Animation(PixmapLoader::Pixmaps::kFireTotemIdle, 50_ms)), + disappearing_animation_( + new Animation(PixmapLoader::Pixmaps::kFireTotemDisappear, 50_ms)), appearing_animation_(animation_), is_creating_(true) { setFlag(QGraphicsItem::ItemIsFocusable, true); diff --git a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp index 3e690e6..0788072 100644 --- a/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp +++ b/GameObjects/BasicObjects/Entities/Projectiles/autoguided_projectile.cpp @@ -23,7 +23,7 @@ AutoguidedProjectile::AutoguidedProjectile( qreal speed, Damage damage) : AutoguidedProjectile( - coordinates,new Animation(pixmap), target, speed, damage) {} + coordinates, new Animation(pixmap), target, speed, damage) {} void AutoguidedProjectile::Tick(Time delta) { Projectile::Tick(delta); @@ -63,7 +63,8 @@ void AutoguidedProjectile::FindNewTargetOrDie() { } else { auto old_target = target_; for (auto new_target : scene()->Mobs()) { - if (new_target != target_ && VectorF(new_target->scenePos() - scenePos()).length() < 100) { + if (new_target != target_ && + VectorF(new_target->scenePos() - scenePos()).length() < 100) { SetTarget(new_target); break; } diff --git a/GameObjects/BasicObjects/Interface/entity.cpp b/GameObjects/BasicObjects/Interface/entity.cpp index 9fb111f..2376443 100644 --- a/GameObjects/BasicObjects/Interface/entity.cpp +++ b/GameObjects/BasicObjects/Interface/entity.cpp @@ -30,7 +30,7 @@ void Entity::paint(QPainter* painter, painter->save(); static QPen pen(QColor(0, 0, 255, 50)); painter->setPen(pen); - //painter->drawRect(boundingRect()); + // painter->drawRect(boundingRect()); painter->drawPixmap(Entity::boundingRect().toRect(), *animation_->Frame()); painter->restore(); } diff --git a/Utilities/Resources/pixmap_loader.cpp b/Utilities/Resources/pixmap_loader.cpp index c4a0524..50f393d 100644 --- a/Utilities/Resources/pixmap_loader.cpp +++ b/Utilities/Resources/pixmap_loader.cpp @@ -1,5 +1,7 @@ #include "pixmap_loader.h" +#include + using P = PixmapLoader::Pixmaps; QPixmap* P::kBackground; @@ -37,8 +39,7 @@ std::vector PixmapLoader::CreateHorizontalFramesVector( for (int i = 0 ; i < frames_count ; ++i) { int x = i * frame_width + start_x; QPixmap* frame = new QPixmap(std::move(source->copy( - QRect(x, y, frame_width, frame_height) - ))); + QRect(x, y, frame_width, frame_height)))); result.push_back(frame); } diff --git a/Utilities/animation.cpp b/Utilities/animation.cpp index c4d3623..55b7a4c 100644 --- a/Utilities/animation.cpp +++ b/Utilities/animation.cpp @@ -1,5 +1,7 @@ #include "animation.h" +#include + Animation::Animation(std::vector frames, Time time_between_frames) : frames_(std::move(frames)), time_between_frames_(time_between_frames), @@ -11,7 +13,7 @@ Animation::Animation(std::vector frames, Time time_between_frames) Animation::Animation(QPixmap* pixmap) // doesn't matter what time between frames is, it just must be non-zero - : Animation(std::vector{pixmap},1_ms) {} + : Animation(std::vector{pixmap}, 1_ms) {} void Animation::Tick(Time delta) { time_to_next_frame_ -= delta; diff --git a/Utilities/time.cpp b/Utilities/time.cpp index a90e7a6..8f32cc7 100644 --- a/Utilities/time.cpp +++ b/Utilities/time.cpp @@ -62,6 +62,6 @@ Time operator*(int lhs, const Time& rhs) { return rhs * lhs; } -Time operator "" _ms(unsigned long long ms) { +Time operator "" _ms(uint64_t ms) { return Time(ms); } diff --git a/Utilities/time.h b/Utilities/time.h index 45164d0..4d73c1d 100644 --- a/Utilities/time.h +++ b/Utilities/time.h @@ -32,4 +32,4 @@ class Time { Time operator*(int lhs, const Time& rhs); -Time operator "" _ms(unsigned long long ms); +Time operator "" _ms(uint64_t ms); From da4e98655dcb4a30a3da8acc738147ffbaa68623 Mon Sep 17 00:00:00 2001 From: dzhen Date: Fri, 20 May 2022 20:38:02 +0300 Subject: [PATCH 7/7] fix custom literal error --- Utilities/time.cpp | 2 +- Utilities/time.h | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Utilities/time.cpp b/Utilities/time.cpp index 8f32cc7..d0c7b9a 100644 --- a/Utilities/time.cpp +++ b/Utilities/time.cpp @@ -62,6 +62,6 @@ Time operator*(int lhs, const Time& rhs) { return rhs * lhs; } -Time operator "" _ms(uint64_t ms) { +Time operator "" _ms(unsigned long long int ms) { // NOLINT return Time(ms); } diff --git a/Utilities/time.h b/Utilities/time.h index 4d73c1d..d19365b 100644 --- a/Utilities/time.h +++ b/Utilities/time.h @@ -32,4 +32,9 @@ class Time { Time operator*(int lhs, const Time& rhs); -Time operator "" _ms(uint64_t ms); +// cpplint говорит, что unsigned long long int(Тип из си) нужно поменять на +// int16/int32/int64...(тип из C++), но в документации к пользовательским +// литералам сказано, что в них могут использоваться только определённые +// типы(и записи unsigned long long int в C++ я не нашёл, а это единственный +// целочисленный тип) +Time operator "" _ms(unsigned long long int ms); // NOLINT