From f1f8ed176bd803614f0f30b113cbe4b3a51b6340 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Sun, 5 Feb 2023 11:16:11 +0100 Subject: [PATCH 01/32] init branch --- src/Collector.cpp | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Collector.cpp diff --git a/src/Collector.cpp b/src/Collector.cpp new file mode 100644 index 0000000..ac1229c --- /dev/null +++ b/src/Collector.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + std::cout << "i am garbage"; + return 0; +} \ No newline at end of file From 3852583f0885ea1a6825beacbb785c2e54ccc861 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Wed, 8 Feb 2023 14:10:16 +0100 Subject: [PATCH 02/32] A simple mark-sweep implementation --- src/MarkSweep.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/MarkSweep.cpp diff --git a/src/MarkSweep.cpp b/src/MarkSweep.cpp new file mode 100644 index 0000000..706f24f --- /dev/null +++ b/src/MarkSweep.cpp @@ -0,0 +1,84 @@ +#include +#include +#define HEAP_SIZE 65536 // Arbitrary for now, 2^16 +using namespace std; + +/* A simple mark and sweep algorithm */ + +// Shouldn't be exposed. For now, it is +struct ObjectHeader { + size_t size = sizeof(this); + bool marked = false; + +}; + +struct Object : ObjectHeader { + char name; // should be something like id, but for testing sake its char + Object* child; + //Object(char name) {} + //Object(char name, Object* child) {} +}; + +// Representing the heap as a simple struct for now +struct Heap { + Object heap_space[HEAP_SIZE]; +}; + +// For now it assumes that it is given root objects from the start, no root finding included +class MarkSweep { + public: + void mark(Object* obj) { + if (!markedBit(obj)) { + markBit(obj); + Object* ref = obj->child; + if (ref != nullptr) { + mark(ref); + } + } + } + + void sweep(vector worklist) { + for (Object* obj: worklist) { + if (!markedBit(obj) && obj != nullptr) { + delete obj; + } + } + } + + private: + bool markedBit(Object* obj) { + return obj->marked; + } + + void markBit(Object* obj) { + obj->marked = true; + } + +}; + +int main() { + Object* b = new Object(); + b->name = 'B'; + b->child = nullptr; + Object* c = new Object(); + c->name = 'C'; + c->child = b; // c -> d + Object* d = new Object(); + d->name = 'D'; + d->child = nullptr; + + //Heap* heap = new Heap{*c, *b, *d}; + vector worklist = {c, b, d}; + MarkSweep* gc = new MarkSweep(); + + gc->mark(c); + cout << "Expected 1, got: " << b->marked << '\n'; + cout << "Expected 1, got: " << c->marked << '\n'; + cout << "Expected 0, got: " << d->marked << '\n'; + + gc->sweep(worklist); + cout << b->name << '\n'; + cout << c->name << '\n'; + cout << d->name << '\n'; // The object at d is now deleted (freed) + return 0; +} \ No newline at end of file From 17d41a408dd7ae4604c030080beb3384d9a1184a Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Thu, 9 Feb 2023 13:18:58 +0100 Subject: [PATCH 03/32] Started with a rough structure --- src/GC/allocator.cpp | 0 src/GC/include/allocator.hpp | 27 ++++++++++++++++ src/GC/include/heap.hpp | 62 ++++++++++++++++++++++++++++++++++++ src/GC/include/heap_obj.hpp | 16 ++++++++++ src/GC/todo.md | 34 ++++++++++++++++++++ src/MarkSweep.cpp | 25 ++++++++------- 6 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 src/GC/allocator.cpp create mode 100644 src/GC/include/allocator.hpp create mode 100644 src/GC/include/heap.hpp create mode 100644 src/GC/include/heap_obj.hpp create mode 100644 src/GC/todo.md diff --git a/src/GC/allocator.cpp b/src/GC/allocator.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/GC/include/allocator.hpp b/src/GC/include/allocator.hpp new file mode 100644 index 0000000..bd30e17 --- /dev/null +++ b/src/GC/include/allocator.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include + +namespace GC { + +class Allocator { +public: + Allocator(size_t size) { + alloc_size = size; + } + + size_t getSize() { + return alloc_size; + } + + void *alloc(); + +private: + size_t alloc_size; + + +}; + +} \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp new file mode 100644 index 0000000..a8a1304 --- /dev/null +++ b/src/GC/include/heap.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "allocator.hpp" + +#define HEAP_SIZE 65536 + +namespace GC { + +class Heap { +public: + + static Heap &the() { + if (s_instance) + return *s_instance; + s_instance = new Heap(); + return *s_instance; + } + + ~Heap() { + + } + + size_t getHeapSize() { + return heap_size; + } + + Allocator *getAllocator(size_t size) { + for (auto *alloc : h_allocs) { + if (alloc->getSize() >= size) + return alloc; + } + std::cout << "Object too big" << std::endl; + assert(false); + } + + void collect(); + +private: + inline static Heap *s_instance = nullptr; + + Heap() { + h_allocs.push_back(new Allocator(16)); + h_allocs.push_back(new Allocator(32)); + h_allocs.push_back(new Allocator(64)); + h_allocs.push_back(new Allocator(128)); + h_allocs.push_back(new Allocator(256)); + h_allocs.push_back(new Allocator(512)); + h_allocs.push_back(new Allocator(1024)); + } + + char _heap[HEAP_SIZE] = {0}; + size_t heap_size = 0; + std::vector h_allocs; +}; + +} \ No newline at end of file diff --git a/src/GC/include/heap_obj.hpp b/src/GC/include/heap_obj.hpp new file mode 100644 index 0000000..21490ae --- /dev/null +++ b/src/GC/include/heap_obj.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +class HeapObj { +public: + HeapObj(size_t size_) { + size = size_; + } + + ~HeapObj() { } + +private: + size_t size { 0 }; + bool marked { false }; +}; \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md new file mode 100644 index 0000000..436ae30 --- /dev/null +++ b/src/GC/todo.md @@ -0,0 +1,34 @@ +# Garbage collection + +## Algorithm + +Potential algorithms: +- mark & sweep + - easy to implement + - slow +- mark & compact + - no memory fragmentation + - slow +- stop-copy algorithms (?) + - no memory fragmentation + - slow + - maybe good for FP langs? + +## Type hierarchy + +- Heap class + - Holds all memory + - Resizeable array? + - Singleton instance + +- Allocator class + - Allocates chunks of memory + - keeps track of chunks that are available and their sizes + - Several instances of allocator class with different sizes? + +- HeapObj class + - parent of all heap objects + - contains metadata + - size + - location + - marked bit \ No newline at end of file diff --git a/src/MarkSweep.cpp b/src/MarkSweep.cpp index 706f24f..ab219d2 100644 --- a/src/MarkSweep.cpp +++ b/src/MarkSweep.cpp @@ -15,8 +15,11 @@ struct ObjectHeader { struct Object : ObjectHeader { char name; // should be something like id, but for testing sake its char Object* child; - //Object(char name) {} - //Object(char name, Object* child) {} + // Object(char name_) {} + Object(char name_, Object* child_) { + name = name_; + child = child_; + } }; // Representing the heap as a simple struct for now @@ -57,15 +60,15 @@ class MarkSweep { }; int main() { - Object* b = new Object(); - b->name = 'B'; - b->child = nullptr; - Object* c = new Object(); - c->name = 'C'; - c->child = b; // c -> d - Object* d = new Object(); - d->name = 'D'; - d->child = nullptr; + Object* b = new Object('B', nullptr); + // b->name = 'B'; + // b->child = nullptr; + Object* c = new Object('C', b); + // c->name = 'C'; + // c->child = b; // c -> d + Object* d = new Object('D', nullptr); + // d->name = 'D'; + // d->child = nullptr; //Heap* heap = new Heap{*c, *b, *d}; vector worklist = {c, b, d}; From e52c38f5f7d603adaa10cabb168569d5d5be691d Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Fri, 10 Feb 2023 13:45:53 +0100 Subject: [PATCH 04/32] Worked a bit on the heap --- src/GC/include/allocator.hpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/GC/include/allocator.hpp b/src/GC/include/allocator.hpp index bd30e17..2f8a991 100644 --- a/src/GC/include/allocator.hpp +++ b/src/GC/include/allocator.hpp @@ -4,6 +4,8 @@ #include #include +#include "include/heap.hpp" + namespace GC { class Allocator { @@ -12,11 +14,18 @@ public: alloc_size = size; } + ~Allocator() { } + size_t getSize() { return alloc_size; } - void *alloc(); + void *alloc() { + auto heap = Heap::the(); + + assert(heap.getHeapSize() + alloc_size <= HEAP_SIZE); + + } private: size_t alloc_size; From 7d91cf871abf4ec2f6415469368b79336b9bc0ad Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Fri, 10 Feb 2023 13:47:09 +0100 Subject: [PATCH 05/32] Goal for next week --- src/GC/allocator.cpp | 15 +++++++++++++++ src/GC/include/heap.hpp | 17 ++++++++++++----- src/GC/include/heap_obj.hpp | 11 ++++++++++- src/GC/todo.md | 25 ++++++++++++++----------- 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/GC/allocator.cpp b/src/GC/allocator.cpp index e69de29..19face2 100644 --- a/src/GC/allocator.cpp +++ b/src/GC/allocator.cpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include +#include + +#include "include/allocator.hpp" + +namespace GC { + + + + +} \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index a8a1304..c957fa8 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -23,20 +23,27 @@ public: } ~Heap() { - + for (auto *alloc : h_allocs) + delete alloc; } size_t getHeapSize() { - return heap_size; + return size; } + // helt onödig Allocator *getAllocator(size_t size) { for (auto *alloc : h_allocs) { if (alloc->getSize() >= size) return alloc; } - std::cout << "Object too big" << std::endl; - assert(false); + // std::cout << "Object too big" << std::endl; + assert(false && "TODO: Object too big"); + } + + void *alloc(size_t size) { + auto allocator = getAllocator(size); + return allocator->alloc(); } void collect(); @@ -55,7 +62,7 @@ private: } char _heap[HEAP_SIZE] = {0}; - size_t heap_size = 0; + size_t size = 0; std::vector h_allocs; }; diff --git a/src/GC/include/heap_obj.hpp b/src/GC/include/heap_obj.hpp index 21490ae..db0b98c 100644 --- a/src/GC/include/heap_obj.hpp +++ b/src/GC/include/heap_obj.hpp @@ -4,13 +4,22 @@ class HeapObj { public: - HeapObj(size_t size_) { + HeapObj(void *start_, size_t size_) { + start = start_; size = size_; } ~HeapObj() { } + void *getAddr() { return start; } + + size_t getSize() { return size; } + + bool isMarked() { return marked; } + void mark() { marked = true; } + private: + void *start = 0; size_t size { 0 }; bool marked { false }; }; \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md index 436ae30..5e5f0b9 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -1,5 +1,14 @@ # Garbage collection +## Project + +Goal for next week (17/2): +- Functioning garbage collector +- Test it with valgrind + +TODO: +- Merge to main branch + ## Algorithm Potential algorithms: @@ -20,15 +29,9 @@ Potential algorithms: - Holds all memory - Resizeable array? - Singleton instance + - exposes alloc -- Allocator class - - Allocates chunks of memory - - keeps track of chunks that are available and their sizes - - Several instances of allocator class with different sizes? - -- HeapObj class - - parent of all heap objects - - contains metadata - - size - - location - - marked bit \ No newline at end of file +- Heap chunks + - size + - addr + - marked bit \ No newline at end of file From 920ae045956865ad17c777cc960c1d1440396bc3 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Tue, 14 Feb 2023 11:47:52 +0100 Subject: [PATCH 06/32] Almost finished with 1st impl of GC Co-authored-by: ValterMiari --- src/GC/allocator.cpp | 15 -------- src/GC/heap.cpp | 28 +++++++++++++++ src/GC/include/allocator.hpp | 36 ------------------- src/GC/include/heap.hpp | 67 +++++++++++------------------------- src/GC/include/heap_obj.hpp | 25 -------------- 5 files changed, 48 insertions(+), 123 deletions(-) delete mode 100644 src/GC/allocator.cpp create mode 100644 src/GC/heap.cpp delete mode 100644 src/GC/include/allocator.hpp delete mode 100644 src/GC/include/heap_obj.hpp diff --git a/src/GC/allocator.cpp b/src/GC/allocator.cpp deleted file mode 100644 index 19face2..0000000 --- a/src/GC/allocator.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "include/allocator.hpp" - -namespace GC { - - - - -} \ No newline at end of file diff --git a/src/GC/heap.cpp b/src/GC/heap.cpp new file mode 100644 index 0000000..194a553 --- /dev/null +++ b/src/GC/heap.cpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "include/heap.hpp" + +namespace GC { + + size_t Heap::getSize() { + return m_size; + } + + void *Heap::alloc(size_t size) { + auto heap = Heap::the(); + assert(heap.getSize() + size <= HEAP_SIZE); + + return m_heap + m_size; + } + + void Heap::collect() { + // TODO + } + +} diff --git a/src/GC/include/allocator.hpp b/src/GC/include/allocator.hpp deleted file mode 100644 index 2f8a991..0000000 --- a/src/GC/include/allocator.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "include/heap.hpp" - -namespace GC { - -class Allocator { -public: - Allocator(size_t size) { - alloc_size = size; - } - - ~Allocator() { } - - size_t getSize() { - return alloc_size; - } - - void *alloc() { - auto heap = Heap::the(); - - assert(heap.getHeapSize() + alloc_size <= HEAP_SIZE); - - } - -private: - size_t alloc_size; - - -}; - -} \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index c957fa8..16c4989 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -6,64 +6,37 @@ #include #include -#include "allocator.hpp" - #define HEAP_SIZE 65536 namespace GC { -class Heap { -public: + class Heap { + public: + // Singleton static Heap &the() { - if (s_instance) - return *s_instance; - s_instance = new Heap(); - return *s_instance; + if (m_instance) + return *m_instance; + m_instance = new Heap(); + return *m_instance; } - ~Heap() { - for (auto *alloc : h_allocs) - delete alloc; - } + size_t getSize(); + void *alloc(size_t size); - size_t getHeapSize() { - return size; - } + private: - // helt onödig - Allocator *getAllocator(size_t size) { - for (auto *alloc : h_allocs) { - if (alloc->getSize() >= size) - return alloc; - } - // std::cout << "Object too big" << std::endl; - assert(false && "TODO: Object too big"); - } - - void *alloc(size_t size) { - auto allocator = getAllocator(size); - return allocator->alloc(); + Heap() { + m_heap = reinterpret_cast(malloc(HEAP_SIZE)); + m_size = 0; + m_allocated_size = 0; } void collect(); - -private: - inline static Heap *s_instance = nullptr; - - Heap() { - h_allocs.push_back(new Allocator(16)); - h_allocs.push_back(new Allocator(32)); - h_allocs.push_back(new Allocator(64)); - h_allocs.push_back(new Allocator(128)); - h_allocs.push_back(new Allocator(256)); - h_allocs.push_back(new Allocator(512)); - h_allocs.push_back(new Allocator(1024)); - } - - char _heap[HEAP_SIZE] = {0}; - size_t size = 0; - std::vector h_allocs; -}; - + + inline static Heap *m_instance = nullptr; + char *m_heap; + size_t m_size; + size_t m_allocated_size; + } } \ No newline at end of file diff --git a/src/GC/include/heap_obj.hpp b/src/GC/include/heap_obj.hpp deleted file mode 100644 index db0b98c..0000000 --- a/src/GC/include/heap_obj.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include - -class HeapObj { -public: - HeapObj(void *start_, size_t size_) { - start = start_; - size = size_; - } - - ~HeapObj() { } - - void *getAddr() { return start; } - - size_t getSize() { return size; } - - bool isMarked() { return marked; } - void mark() { marked = true; } - -private: - void *start = 0; - size_t size { 0 }; - bool marked { false }; -}; \ No newline at end of file From b53f8923935f768b47993989f25e4db93bd6a20b Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Tue, 14 Feb 2023 11:48:04 +0100 Subject: [PATCH 07/32] Almost finished w/ 1st impl of GC --- .vscode/settings.json | 77 ++++++++++++++++++++++++++++ src/GC/heap.cpp | 108 +++++++++++++++++++++++++++++++++++---- src/GC/include/chunk.hpp | 15 ++++++ src/GC/include/heap.hpp | 20 ++++++-- 4 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 src/GC/include/chunk.hpp diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8057192 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,77 @@ +{ + "files.associations": { + "array": "cpp", + "bitset": "cpp", + "string_view": "cpp", + "initializer_list": "cpp", + "ranges": "cpp", + "span": "cpp", + "utility": "cpp", + "__hash_table": "cpp", + "__split_buffer": "cpp", + "deque": "cpp", + "queue": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "variant": "cpp", + "__bit_reference": "cpp", + "__config": "cpp", + "__debug": "cpp", + "__errc": "cpp", + "__locale": "cpp", + "__mutex_base": "cpp", + "__node_handle": "cpp", + "__threading_support": "cpp", + "__verbose_abort": "cpp", + "ios": "cpp", + "locale": "cpp", + "semaphore": "cpp" + } +} \ No newline at end of file diff --git a/src/GC/heap.cpp b/src/GC/heap.cpp index 194a553..7cdb7dc 100644 --- a/src/GC/heap.cpp +++ b/src/GC/heap.cpp @@ -1,6 +1,9 @@ #pragma once +#include #include +#include +#include #include #include #include @@ -10,19 +13,106 @@ namespace GC { - size_t Heap::getSize() { - return m_size; + // alloc assumes that after the collect phase, the aligned memory in the heap is compacted from the start, + void *Heap::alloc(size_t size) { + auto heap = Heap::the(); + assert(size > 0 && "Heap: Cannot alloc less than 0B"); + if (heap.m_size + size > HEAP_SIZE) { + // try collect + collect(); + assert(heap.m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); + } + + // kolla freed chunks innan + for (size_t i = 0; i < m_freed_chunks.size(); i++) { + auto cp = m_freed_chunks.at(i); + if (cp->size > size) + { + // dela upp chunken och sno ena delen + size_t diff = cp->size - size; + + auto chunk_complement = new Chunk; + chunk_complement->size = diff; + chunk_complement->start = cp->start + cp->size; + + m_freed_chunks.erase(m_freed_chunks.begin() + i); + m_freed_chunks.push_back(chunk_complement); + m_allocated_chunks.push_back(cp); + + return cp->start; + } + else if (cp->size == size) + { + // sno hela chunken + m_freed_chunks.erase(m_freed_chunks.begin()+i); + m_allocated_chunks.push_back(cp); + return cp->start; + } + } + + // Om inga free chunks finns, skapa ny chunk + auto new_chunk = new Chunk; + new_chunk->size = size; + new_chunk->start = (void *)m_heap + m_size; + + m_size += size; + + m_allocated_chunks.push_back(new_chunk); + + return new_chunk->start; } - void *Heap::alloc(size_t size) { - auto heap = Heap::the(); - assert(heap.getSize() + size <= HEAP_SIZE); - - return m_heap + m_size; + bool compareChunks(Chunk *c1, Chunk *c2) { + return c1->start < c2->start; } void Heap::collect() { - // TODO + // mark all objs + // compact(); + // free all unmarked (m_freed_chunks.add(jalkdsj)) + + // get the frame adress, whwere local variables and saved registers are located + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + auto stack_end = reinterpret_cast(0ul); + + + //release free chunks + while (m_freed_chunks.size()) { + auto chunk_pointer = m_freed_chunks.back(); + m_freed_chunks.pop_back(); + delete chunk_pointer; + } + } + + void Heap::compact() { + + // sort alloced_chunks by their start-addresses + std::sort(m_allocated_chunks.begin(), m_allocated_chunks.end(), compareChunks); + + // move all chunks to the start of the heap + auto heap_curr = (char *)m_heap; + for (auto space : m_allocated_chunks) { + if (space->start != heap_curr) { + memmove(heap_curr, space->start, space->size); + space->start = heap_curr; + heap_curr += space->size; + } else { + heap_curr += space->size; + } + } } -} + void Heap::mark(uintptr_t *start, uintptr_t *end) { + for (; start < end; start += 1) { // start < end??? + for (auto chunk : m_allocated_chunks) { + if (chunk->start <= start && start < chunk->start + chunk->size) { + if (!chunk->marked) { + chunk->marked = true; + //mark(chunk) // + //TODO + } + } + } + } + } +} \ No newline at end of file diff --git a/src/GC/include/chunk.hpp b/src/GC/include/chunk.hpp new file mode 100644 index 0000000..b0cd33d --- /dev/null +++ b/src/GC/include/chunk.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +#define CHUNK_LIST_CAP 1024 + +namespace GC { + + struct Chunk { + bool marked; + void *start; + size_t size; + }; + +} \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 16c4989..142af33 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -5,6 +5,9 @@ #include #include #include +using namespace std; + +#include "include/chunk.hpp" #define HEAP_SIZE 65536 @@ -21,7 +24,10 @@ namespace GC { return *m_instance; } - size_t getSize(); + ~Heap() { + free((char *)m_heap); + } + void *alloc(size_t size); private: @@ -33,10 +39,18 @@ namespace GC { } void collect(); + void compact(); + void mark(uintptr_t *start, uintptr_t *end); + + bool compareChunks(Chunk *c1, Chunk *c2); inline static Heap *m_instance = nullptr; - char *m_heap; + const char *m_heap; size_t m_size; size_t m_allocated_size; - } + + std::vector m_allocated_chunks; + std::vector m_freed_chunks; + + }; } \ No newline at end of file From 0260b2876cd34188c28e10b3c45ca9dffa84e85f Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Tue, 14 Feb 2023 15:11:58 +0100 Subject: [PATCH 08/32] Next up is tests Co-authored-by: ValterMiari --- .gitignore | 4 +++ src/GC/heap.cpp | 29 +++++++++++---------- src/GC/include/heap.hpp | 6 ++--- src/GC/tests/stack.cpp | 57 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 src/GC/tests/stack.cpp diff --git a/.gitignore b/.gitignore index 8d1bad3..d156fe8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,9 @@ dist-newstyle *.x *.bak src/Grammar + language llvm.ll +/language + +src/GC/tests/*.out diff --git a/src/GC/heap.cpp b/src/GC/heap.cpp index 7cdb7dc..9b03815 100644 --- a/src/GC/heap.cpp +++ b/src/GC/heap.cpp @@ -44,7 +44,7 @@ namespace GC { else if (cp->size == size) { // sno hela chunken - m_freed_chunks.erase(m_freed_chunks.begin()+i); + m_freed_chunks.erase(m_freed_chunks.begin() + i); m_allocated_chunks.push_back(cp); return cp->start; } @@ -67,14 +67,15 @@ namespace GC { } void Heap::collect() { - // mark all objs - // compact(); - // free all unmarked (m_freed_chunks.add(jalkdsj)) - // get the frame adress, whwere local variables and saved registers are located - auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - auto stack_end = reinterpret_cast(0ul); - + // get the frame adress, whwere local variables and saved registers are located + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + // looking at 10 stack frames back + auto stack_end = reinterpret_cast(__builtin_frame_address(10)); + auto work_list = m_allocated_chunks; + mark(stack_start, stack_end, work_list); + + compact(); //release free chunks while (m_freed_chunks.size()) { @@ -102,14 +103,16 @@ namespace GC { } } - void Heap::mark(uintptr_t *start, uintptr_t *end) { - for (; start < end; start += 1) { // start < end??? - for (auto chunk : m_allocated_chunks) { + void Heap::mark(uintptr_t *start, const uintptr_t *end, std::vector work_list) { + for (; start < end; start++) { // to find adresses thats in the worklist + for (size_t i = 0; i < work_list.size(); i++) { // fix this + auto chunk = work_list.at(i); if (chunk->start <= start && start < chunk->start + chunk->size) { if (!chunk->marked) { chunk->marked = true; - //mark(chunk) // - //TODO + work_list.erase(work_list.begin() + i); + mark(reinterpret_cast(chunk->start + chunk->size), end, work_list); // + return; } } } diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 142af33..59a78d7 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -40,7 +40,7 @@ namespace GC { void collect(); void compact(); - void mark(uintptr_t *start, uintptr_t *end); + void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); bool compareChunks(Chunk *c1, Chunk *c2); @@ -49,8 +49,8 @@ namespace GC { size_t m_size; size_t m_allocated_size; - std::vector m_allocated_chunks; - std::vector m_freed_chunks; + std::vector m_allocated_chunks; + std::vector m_freed_chunks; }; } \ No newline at end of file diff --git a/src/GC/tests/stack.cpp b/src/GC/tests/stack.cpp new file mode 100644 index 0000000..6cdf2d0 --- /dev/null +++ b/src/GC/tests/stack.cpp @@ -0,0 +1,57 @@ +#include +#include +#include +#include + +std::vector iv; + +void collect() { + std::cout << "in collect" << std::endl; + + uintptr_t *stack_start = reinterpret_cast(__builtin_frame_address(0)); + // uintptr_t *stack_end = reinterpret_cast(__builtin_frame_address(100)); + + std::cout << "SP1:\t" << stack_start << "\nSP2:\t" << (stack_start - 1*sizeof(int)) << std::endl; + std::cout << "SP-:\t" << --stack_start << std::endl; + + const uintptr_t *stack_end = (stack_start + 30*sizeof(int)); + int vars_found = 0; + + while (stack_start < stack_end) { + + if (std::find(iv.begin(), iv.end(), stack_start) != iv.end()) { + vars_found++; + std::cout << "Found " << *(reinterpret_cast(stack_start)) << " at " << stack_start << std::endl; + } + + // std::cout << "SP address:\t\t" << stack_start << "\nSP value:\t\t" << *(reinterpret_cast(stack_start)) << std::endl; + + stack_start++; + } + + if (vars_found == 0) { + std::cout << "Found nothing" << std::endl; + } +} + +int add(unsigned long a, unsigned long b) { + iv.push_back(reinterpret_cast(&a)); + iv.push_back(reinterpret_cast(&b)); + std::cout << "'a':\t" << &a << "\n'b':\t" << &b << std::endl; + collect(); + return a + b; +} + +int main() { + + unsigned long global_1 = 16; + unsigned long global_2 = 32; + + iv.push_back(&global_1); + iv.push_back(&global_2); + + std::cout << "'g1':\t" << &global_1 << "\n'g2':\t" << &global_2 << std::endl; + + add(3,2); + return 0; +} \ No newline at end of file From 16908048213735c9634590f70ef57885bf2f0570 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Wed, 15 Feb 2023 10:40:35 +0100 Subject: [PATCH 09/32] Some small test features --- src/GC/tests/h_test.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/GC/tests/h_test.cpp diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp new file mode 100644 index 0000000..914e65c --- /dev/null +++ b/src/GC/tests/h_test.cpp @@ -0,0 +1,16 @@ +#include "../include/heap.hpp" + +GC::Heap gc; + +void init() { + gc = GC::Heap::the(); // pointer to the heap + std::vector live_int_vec(100); + std::vector dead_int_vec(100); + gc.alloc(sizeof(live_int_vec)); + gc.alloc(sizeof(dead_int_vec)); +} + +int main() { + gc.print_contents(); + return 0; +} \ No newline at end of file From 30a3da3156f8119ef7afcae75788c549a96e7baa Mon Sep 17 00:00:00 2001 From: valtermiari Date: Wed, 15 Feb 2023 10:42:27 +0100 Subject: [PATCH 10/32] Some configurations --- .gitignore | 1 + src/GC/heap.cpp | 16 ++++++++++++++++ src/GC/include/heap.hpp | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d156fe8..934c3da 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,6 @@ src/Grammar language llvm.ll /language +.vscode/ src/GC/tests/*.out diff --git a/src/GC/heap.cpp b/src/GC/heap.cpp index 9b03815..8fca1b1 100644 --- a/src/GC/heap.cpp +++ b/src/GC/heap.cpp @@ -118,4 +118,20 @@ namespace GC { } } } + + // For testing purposes + void print_line(bool marked, void *start, size_t size) { + std::cout << "Marked: " << marked << "\nStart adr: " << start << "\nSize" << size << std::endl; + } + + void Heap::print_contents() { + std::cout << "ALLOCATED CHUNKS" << std::endl; + for (auto chunk : m_allocated_chunks) { + print_line(chunk->marked, chunk->start, chunk->size); + } + std::cout << "FREED CHUNKS" << std::endl; + for (auto fchunk : m_freed_chunks) { + print_line(fchunk->marked, fchunk->start, fchunk->size); + } + } } \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 59a78d7..14737ad 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -7,7 +7,7 @@ #include using namespace std; -#include "include/chunk.hpp" +#include "chunk.hpp" #define HEAP_SIZE 65536 @@ -29,6 +29,7 @@ namespace GC { } void *alloc(size_t size); + void print_contents(); private: From b168438c147669624ba985153ec5a93dd5ba7a79 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Wed, 15 Feb 2023 16:57:11 +0100 Subject: [PATCH 11/32] Started testing the GC Co-authored-by: ValterMiari --- src/GC/Makefile | 22 +++++++++ src/GC/include/chunk.hpp | 2 +- src/GC/include/heap.hpp | 48 ++++++++++-------- src/GC/{ => lib}/heap.cpp | 99 +++++++++++++++++++++++-------------- src/GC/tests/alloc_free.cpp | 29 +++++++++++ src/GC/tests/h_test.cpp | 23 ++++++--- src/GC/tests/linker.cpp | 30 +++++++++++ 7 files changed, 188 insertions(+), 65 deletions(-) create mode 100644 src/GC/Makefile rename src/GC/{ => lib}/heap.cpp (54%) create mode 100644 src/GC/tests/alloc_free.cpp create mode 100644 src/GC/tests/linker.cpp diff --git a/src/GC/Makefile b/src/GC/Makefile new file mode 100644 index 0000000..64d90d6 --- /dev/null +++ b/src/GC/Makefile @@ -0,0 +1,22 @@ +CC = clang++ +PWD = /home/virre/dev/systemF/org/language/src/GC/include +CFLAGS = -Wall -Wextra -v -std=gnu++20 -stdlib=libc++ -I + +heap: + $(CC) $(CFLAGS)$(PWD) lib/heap.cpp + +h_test: + rm -f tests/h_test.out + $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + +h_test_vg: + rm -f tests/h_test.out + $(CC) $(CFLAGS)$(PWD) -g tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + +linker: + rm -f tests/linker.out + $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out + +linker_vg: + rm -f tests/linker.out + $(CC) $(CFLAGS)$(PWD) -g tests/linker.cpp lib/heap.cpp -o tests/linker.out \ No newline at end of file diff --git a/src/GC/include/chunk.hpp b/src/GC/include/chunk.hpp index b0cd33d..7aa4fb7 100644 --- a/src/GC/include/chunk.hpp +++ b/src/GC/include/chunk.hpp @@ -8,7 +8,7 @@ namespace GC { struct Chunk { bool marked; - void *start; + uintptr_t *start; size_t size; }; diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 14737ad..8a9f828 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -5,7 +5,6 @@ #include #include #include -using namespace std; #include "chunk.hpp" @@ -14,22 +13,6 @@ using namespace std; namespace GC { class Heap { - public: - - // Singleton - static Heap &the() { - if (m_instance) - return *m_instance; - m_instance = new Heap(); - return *m_instance; - } - - ~Heap() { - free((char *)m_heap); - } - - void *alloc(size_t size); - void print_contents(); private: @@ -40,11 +23,11 @@ namespace GC { } void collect(); - void compact(); + void sweep(); + // void compact(); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); + void print_line(Chunk *chunk); - bool compareChunks(Chunk *c1, Chunk *c2); - inline static Heap *m_instance = nullptr; const char *m_heap; size_t m_size; @@ -53,5 +36,30 @@ namespace GC { std::vector m_allocated_chunks; std::vector m_freed_chunks; + public: + + // Singleton + static Heap &the() { + if (m_instance) + return *m_instance; + m_instance = new Heap(); + return *m_instance; + } + + static Heap *the2() { + if (m_instance) + return m_instance; + m_instance = new Heap(); + return m_instance; + } + + // BEWARE only for testing, this should be adressed +/* ~Heap() { + free((char *)m_heap); + } */ + + void *alloc(size_t size); + void print_contents(); + void force_collect(); }; } \ No newline at end of file diff --git a/src/GC/heap.cpp b/src/GC/lib/heap.cpp similarity index 54% rename from src/GC/heap.cpp rename to src/GC/lib/heap.cpp index 8fca1b1..8c296b5 100644 --- a/src/GC/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -1,5 +1,3 @@ -#pragma once - #include #include #include @@ -9,7 +7,7 @@ #include #include -#include "include/heap.hpp" +#include "heap.hpp" namespace GC { @@ -53,7 +51,7 @@ namespace GC { // Om inga free chunks finns, skapa ny chunk auto new_chunk = new Chunk; new_chunk->size = size; - new_chunk->start = (void *)m_heap + m_size; + new_chunk->start = (uintptr_t *)m_heap + m_size; m_size += size; @@ -62,47 +60,68 @@ namespace GC { return new_chunk->start; } - bool compareChunks(Chunk *c1, Chunk *c2) { - return c1->start < c2->start; - } - void Heap::collect() { // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); // looking at 10 stack frames back - auto stack_end = reinterpret_cast(__builtin_frame_address(10)); + const uintptr_t *stack_end = (uintptr_t *)0; //reinterpret_cast(__builtin_frame_address(10)); auto work_list = m_allocated_chunks; mark(stack_start, stack_end, work_list); - compact(); + sweep(); + // compact(); + + // BELOW SHOULD BE INCLUDED (commented only for tests, to see which objects freed) + //release free chunks - while (m_freed_chunks.size()) { + /* while (m_freed_chunks.size()) { auto chunk_pointer = m_freed_chunks.back(); m_freed_chunks.pop_back(); - delete chunk_pointer; + delete chunk_pointer; // deletes chunk object, doesn't free memory to the OS + } */ + } + + // Not optimal for now, it doesn't have to loop over all objects + // but mark needs some refinements before this can be optimised + void Heap::sweep() { + // assert(false && "NOT IMPLEMENTED"); + for (size_t i = 0; i < m_allocated_chunks.size(); i++) { + auto chunk = m_allocated_chunks.at(i); + if (chunk->marked == false) { + m_allocated_chunks.erase(m_allocated_chunks.begin() + i); + m_freed_chunks.push_back(chunk); + } } } + + void Heap::force_collect() { + Heap::collect(); + } - void Heap::compact() { + // dead code + // void Heap::compact() { - // sort alloced_chunks by their start-addresses - std::sort(m_allocated_chunks.begin(), m_allocated_chunks.end(), compareChunks); + // // sort alloced_chunks by their start-addresses + // std::sort(m_allocated_chunks.begin(), m_allocated_chunks.end(), [](Chunk *c1, Chunk *c2){ + // return c1->start < c2->start; + // }); - // move all chunks to the start of the heap - auto heap_curr = (char *)m_heap; - for (auto space : m_allocated_chunks) { - if (space->start != heap_curr) { - memmove(heap_curr, space->start, space->size); - space->start = heap_curr; - heap_curr += space->size; - } else { - heap_curr += space->size; - } - } - } + // // move all chunks to the start of the heap + // auto heap_curr = (uintptr_t *)m_heap; // (char *)m_heap + // for (auto space : m_allocated_chunks) { + // if (space->start != heap_curr) { + // memmove(heap_curr, space->start, space->size); + // space->start = heap_curr; + // heap_curr += space->size; + // } else { + // heap_curr += space->size; + // } + // } + // } + // return the worklist filtered on mark = true void Heap::mark(uintptr_t *start, const uintptr_t *end, std::vector work_list) { for (; start < end; start++) { // to find adresses thats in the worklist for (size_t i = 0; i < work_list.size(); i++) { // fix this @@ -120,18 +139,26 @@ namespace GC { } // For testing purposes - void print_line(bool marked, void *start, size_t size) { - std::cout << "Marked: " << marked << "\nStart adr: " << start << "\nSize" << size << std::endl; + void Heap::print_line(Chunk *chunk) { + std::cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B" << std::endl; } void Heap::print_contents() { - std::cout << "ALLOCATED CHUNKS" << std::endl; - for (auto chunk : m_allocated_chunks) { - print_line(chunk->marked, chunk->start, chunk->size); - } - std::cout << "FREED CHUNKS" << std::endl; - for (auto fchunk : m_freed_chunks) { - print_line(fchunk->marked, fchunk->start, fchunk->size); + if (m_allocated_chunks.size()) { + std::cout << "ALLOCATED CHUNKS" << std::endl; + for (auto chunk : m_allocated_chunks) { + print_line(chunk); + } + } else { + std::cout << "NO ALLOCATIONS" << std::endl; } + if (m_freed_chunks.size()) { + std::cout << "FREED CHUNKS" << std::endl; + for (auto fchunk : m_freed_chunks) { + print_line(fchunk); + } + } else { + std::cout << "NO FREED CHUNKS" << std::endl; + } } } \ No newline at end of file diff --git a/src/GC/tests/alloc_free.cpp b/src/GC/tests/alloc_free.cpp new file mode 100644 index 0000000..0e277dc --- /dev/null +++ b/src/GC/tests/alloc_free.cpp @@ -0,0 +1,29 @@ +#include + +#include "heap.hpp" + +struct Obj { + int a; + int b; + int c; +}; + +int main() { + GC::Heap *heap = GC::Heap::the2(); + Obj *obj; + + for (int i = 0; i < 4; i++) { + obj = static_cast(heap->alloc(sizeof(Obj))); + obj->a = i * i + 1; + obj->b = i * i + 2; + obj->c = i * i + 3; + } + + // heap->force_collect(); + + std::cout << obj->a << ", " << obj->b << ", " << obj->c << std::endl; + + //delete heap; + + return 0; +} \ No newline at end of file diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 914e65c..c88f0fa 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -1,16 +1,23 @@ -#include "../include/heap.hpp" +#include "heap.hpp" -GC::Heap gc; +GC::Heap *gc = GC::Heap::the2(); void init() { - gc = GC::Heap::the(); // pointer to the heap - std::vector live_int_vec(100); - std::vector dead_int_vec(100); - gc.alloc(sizeof(live_int_vec)); - gc.alloc(sizeof(dead_int_vec)); + std::vector live_int_vec{1, 2, 3, 4, 5}; + std::vector dead_int_vec(10, 1); + int *a_ptr; + int a = 10; + a_ptr = &a; + auto temp1 = gc->alloc(sizeof(a_ptr)); + auto temp2 = gc->alloc(sizeof(live_int_vec)); + auto temp3 = gc->alloc(sizeof(dead_int_vec)); + a_ptr = nullptr; } int main() { - gc.print_contents(); + init(); + gc->force_collect(); + gc->print_contents(); + //delete gc; return 0; } \ No newline at end of file diff --git a/src/GC/tests/linker.cpp b/src/GC/tests/linker.cpp new file mode 100644 index 0000000..f3b12f0 --- /dev/null +++ b/src/GC/tests/linker.cpp @@ -0,0 +1,30 @@ +#include + +#include "heap.hpp" + +struct Obj { + int a; + int b; + int c; +}; + +int main() { + auto heap = GC::Heap::the2(); + + std::cout << "heap:\t" << heap << std::endl; + + auto obj = static_cast(heap->alloc(sizeof(Obj))); + + std::cout << "obj: \t" << obj << std::endl; + + obj->a = 3; + obj->b = 4; + obj->c = 5; + + std::cout << obj->a << ", " << obj->b << ", " << obj->c << std::endl; + + heap->print_contents(); + //delete heap; + + return 0; +} \ No newline at end of file From 5ac9b665a18c0b33039d88dbc78f85526e6f2612 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Thu, 16 Feb 2023 15:22:26 +0100 Subject: [PATCH 12/32] Testing different stack pointers --- src/GC/Makefile | 12 ++--------- src/GC/lib/heap.cpp | 5 ++++- src/GC/tests/stack.cpp | 21 +++++++++++++++++++- src/GC/tests/stack2.cpp | 44 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 src/GC/tests/stack2.cpp diff --git a/src/GC/Makefile b/src/GC/Makefile index 64d90d6..7c0c38f 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,6 +1,6 @@ CC = clang++ PWD = /home/virre/dev/systemF/org/language/src/GC/include -CFLAGS = -Wall -Wextra -v -std=gnu++20 -stdlib=libc++ -I +CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I heap: $(CC) $(CFLAGS)$(PWD) lib/heap.cpp @@ -9,14 +9,6 @@ h_test: rm -f tests/h_test.out $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out -h_test_vg: - rm -f tests/h_test.out - $(CC) $(CFLAGS)$(PWD) -g tests/h_test.cpp lib/heap.cpp -o tests/h_test.out - linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out - -linker_vg: - rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) -g tests/linker.cpp lib/heap.cpp -o tests/linker.out \ No newline at end of file + $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 8c296b5..59f4e7d 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -65,7 +65,10 @@ namespace GC { // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); // looking at 10 stack frames back - const uintptr_t *stack_end = (uintptr_t *)0; //reinterpret_cast(__builtin_frame_address(10)); + const uintptr_t *stack_end = (uintptr_t *)0; + + // denna segfaultar om arg för __b_f_a är > 2 + // reinterpret_cast(__builtin_frame_address(10)); auto work_list = m_allocated_chunks; mark(stack_start, stack_end, work_list); diff --git a/src/GC/tests/stack.cpp b/src/GC/tests/stack.cpp index 6cdf2d0..8f8382e 100644 --- a/src/GC/tests/stack.cpp +++ b/src/GC/tests/stack.cpp @@ -3,13 +3,32 @@ #include #include +/* + * Stack.cpp + * - Tests stack scanning and stack pointers + * + * Goal: Find the values of the following variables + * and their position on the stack + * - unsigned long a + * - unsigned long b + * - unsigned long global_1 + * - unsigned long global_2 + * + * Result: Passed +*/ + + + + std::vector iv; void collect() { std::cout << "in collect" << std::endl; uintptr_t *stack_start = reinterpret_cast(__builtin_frame_address(0)); - // uintptr_t *stack_end = reinterpret_cast(__builtin_frame_address(100)); + + // denna orsakar segfault om man ger __b_f_a ett värde större än 2 + // uintptr_t *stack_end = reinterpret_cast(__builtin_frame_address(100)); std::cout << "SP1:\t" << stack_start << "\nSP2:\t" << (stack_start - 1*sizeof(int)) << std::endl; std::cout << "SP-:\t" << --stack_start << std::endl; diff --git a/src/GC/tests/stack2.cpp b/src/GC/tests/stack2.cpp new file mode 100644 index 0000000..0444e10 --- /dev/null +++ b/src/GC/tests/stack2.cpp @@ -0,0 +1,44 @@ +#include +#include + +void dummy1(); +void dummy2(); + +int main() { + + uintptr_t *prev1 = reinterpret_cast(__builtin_frame_address(0)); + uintptr_t *prev2 = static_cast(__builtin_frame_address(0)); + + std::cout << "reinterpret:\t" << prev1 << "\nstatic:\t\t" << prev2 << std::endl; + + std::cout << "Start:\t\t" << prev1 << std::endl; +#pragma clang diagnostic ignored "-Wframe-address" + uintptr_t *tmp = reinterpret_cast(__builtin_frame_address(1)); + std::cout << "Frame 1:\t" << tmp << "\t\tDiff:\t" << std::hex << "0x"<< prev1 - tmp << std::endl; + prev1 = tmp; + +#pragma clang diagnostic ignored "-Wframe-address" + tmp = reinterpret_cast(__builtin_frame_address(2)); + std::cout << "Frame 2:\t" << tmp << "\tDiff:\t" << std::hex << "0x" << prev1 - tmp << std::endl; + + dummy1(); + + return 0; +} + +void dummy1() { + std::cout << "Frame:\t\t" << __builtin_frame_address(0); +#pragma clang diagnostic ignored "-Wframe-address" + std::cout << "\t\tPrev:\t" << __builtin_frame_address(1) << std::endl; + dummy2(); + std::cout << "D1 RA:\t\t" << std::hex << __builtin_return_address(0) << std::endl; +} + +void dummy2() { + std::cout << "Frame:\t\t" << __builtin_frame_address(0); +#pragma clang diagnostic ignored "-Wframe-address" + std::cout << "\t\tPrev:\t" << __builtin_frame_address(1) << std::endl; + void *ra = __builtin_return_address(0); + std::cout << "D2 RA:\t\t" << std::hex << ra << std::endl; + std::cout << "D2 ERA:\t\t" << std::hex << __builtin_extract_return_addr(ra) << std::endl; +} \ No newline at end of file From 42c22bc1ebbdf6544c66b6beda85abd996461f6d Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Thu, 16 Feb 2023 16:23:35 +0100 Subject: [PATCH 13/32] Continued debugging Co-authored-by: ValterMiari --- src/GC/Makefile | 13 ++++++- src/GC/include/heap.hpp | 7 +++- src/GC/lib/heap.cpp | 83 +++++++++++++++++++++++++++-------------- src/GC/tests/h_test.cpp | 5 ++- src/GC/tests/stack2.cpp | 17 ++++++--- src/GC/todo.md | 27 ++++---------- 6 files changed, 95 insertions(+), 57 deletions(-) diff --git a/src/GC/Makefile b/src/GC/Makefile index 7c0c38f..3d57536 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,6 +1,9 @@ +mkfile_path = $(abspath $(lastword $(MAKEFILE_LIST))) +current_dir = $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) CC = clang++ PWD = /home/virre/dev/systemF/org/language/src/GC/include CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I +VGFLAGS = --leak-check=full --show-leak-kinds=all heap: $(CC) $(CFLAGS)$(PWD) lib/heap.cpp @@ -9,6 +12,14 @@ h_test: rm -f tests/h_test.out $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out +h_test_vg: + make h_test + valgrind $(VGFLAGS) tests/h_test.out + linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out \ No newline at end of file + $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out + +linker_vg: + make linker + valgrind $(VGFLAGS) tests/linker.out \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 8a9f828..e659598 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -10,6 +10,11 @@ #define HEAP_SIZE 65536 +#define MARK (uint) 0x1 +#define SWEEP (uint) 0x2 +#define FREE (uint) 0x4 +#define COLLECT_ALL (uint) 0x7 + namespace GC { class Heap { @@ -60,6 +65,6 @@ namespace GC { void *alloc(size_t size); void print_contents(); - void force_collect(); + void collect(uint flags); // DEBUG ONLY }; } \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 59f4e7d..c41c924 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -79,17 +79,47 @@ namespace GC { // BELOW SHOULD BE INCLUDED (commented only for tests, to see which objects freed) //release free chunks - /* while (m_freed_chunks.size()) { + while (m_freed_chunks.size()) { auto chunk_pointer = m_freed_chunks.back(); m_freed_chunks.pop_back(); delete chunk_pointer; // deletes chunk object, doesn't free memory to the OS - } */ + } + } + + void Heap::collect(uint flags) { + + std::cout << "DEBUG COLLECT\nFLAGS: " << flags << std::endl; + // get the frame adress, whwere local variables and saved registers are located + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + + const uintptr_t *stack_end = (uintptr_t *)0; // dummy value + + // denna segfaultar om arg för __b_f_a är > 2 + // reinterpret_cast(__builtin_frame_address(10)); + + auto work_list = m_allocated_chunks; + + if (flags & MARK) { + mark(stack_start, stack_end, work_list); + } + + if (flags & SWEEP) { + sweep(); + } + + //release free chunks + if (flags & FREE) { + while (m_freed_chunks.size()) { + auto chunk_pointer = m_freed_chunks.back(); + m_freed_chunks.pop_back(); + delete chunk_pointer; // deletes chunk object, doesn't free heap memory to the OS + } + } } // Not optimal for now, it doesn't have to loop over all objects // but mark needs some refinements before this can be optimised void Heap::sweep() { - // assert(false && "NOT IMPLEMENTED"); for (size_t i = 0; i < m_allocated_chunks.size(); i++) { auto chunk = m_allocated_chunks.at(i); if (chunk->marked == false) { @@ -99,32 +129,7 @@ namespace GC { } } - void Heap::force_collect() { - Heap::collect(); - } - - // dead code - // void Heap::compact() { - - // // sort alloced_chunks by their start-addresses - // std::sort(m_allocated_chunks.begin(), m_allocated_chunks.end(), [](Chunk *c1, Chunk *c2){ - // return c1->start < c2->start; - // }); - - // // move all chunks to the start of the heap - // auto heap_curr = (uintptr_t *)m_heap; // (char *)m_heap - // for (auto space : m_allocated_chunks) { - // if (space->start != heap_curr) { - // memmove(heap_curr, space->start, space->size); - // space->start = heap_curr; - // heap_curr += space->size; - // } else { - // heap_curr += space->size; - // } - // } - // } - - // return the worklist filtered on mark = true + // TODO: return the worklist filtered on mark = true void Heap::mark(uintptr_t *start, const uintptr_t *end, std::vector work_list) { for (; start < end; start++) { // to find adresses thats in the worklist for (size_t i = 0; i < work_list.size(); i++) { // fix this @@ -140,7 +145,27 @@ namespace GC { } } } + + /* Alternative marking, pseudocode + mark_from_roots(): + worklist <- empty + for fld in Roots + ref <- *fld + if ref ≠ null && !marked(ref) + set_marked(ref) + worklist.add(ref) + mark() + + mark(): + while size(worklist) > 0 + ref <- remove_first(worklist) + for fld in Pointers(ref) + child <- *fld + if child ≠ null && !marked(child) + set_marked(child) + worklist.add(child) + */ // For testing purposes void Heap::print_line(Chunk *chunk) { std::cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B" << std::endl; diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index c88f0fa..f785077 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -4,7 +4,8 @@ GC::Heap *gc = GC::Heap::the2(); void init() { std::vector live_int_vec{1, 2, 3, 4, 5}; - std::vector dead_int_vec(10, 1); + std::vector dead_int_vec(1000000, 1); + int *arr = static_cast(gc->alloc(sizeof(int) * 300)); int *a_ptr; int a = 10; a_ptr = &a; @@ -16,7 +17,7 @@ void init() { int main() { init(); - gc->force_collect(); + gc->collect(MARK | SWEEP); gc->print_contents(); //delete gc; return 0; diff --git a/src/GC/tests/stack2.cpp b/src/GC/tests/stack2.cpp index 0444e10..f1a78bc 100644 --- a/src/GC/tests/stack2.cpp +++ b/src/GC/tests/stack2.cpp @@ -14,12 +14,18 @@ int main() { std::cout << "Start:\t\t" << prev1 << std::endl; #pragma clang diagnostic ignored "-Wframe-address" uintptr_t *tmp = reinterpret_cast(__builtin_frame_address(1)); - std::cout << "Frame 1:\t" << tmp << "\t\tDiff:\t" << std::hex << "0x"<< prev1 - tmp << std::endl; + std::cout << "Frame 1:\t" << tmp << "\t\tDiff:\t" << std::hex << "0x"<< tmp - prev1 << std::endl; prev1 = tmp; #pragma clang diagnostic ignored "-Wframe-address" tmp = reinterpret_cast(__builtin_frame_address(2)); - std::cout << "Frame 2:\t" << tmp << "\tDiff:\t" << std::hex << "0x" << prev1 - tmp << std::endl; + std::cout << "Frame 2:\t" << tmp << "\tDiff:\t" << std::hex << "0x" << tmp - prev1 << std::endl; + prev1 = tmp; + +// arg > 2 for __builtin_frame_address() results in segfault +// #pragma clang diagnostic ignored "-Wframe-address" +// tmp = reinterpret_cast(__builtin_frame_address(3)); +// std::cout << "Frame 3:\t" << tmp << "\tDiff:\t" << std::hex << "0x" << prev1 - tmp << std::endl; dummy1(); @@ -27,11 +33,11 @@ int main() { } void dummy1() { - std::cout << "Frame:\t\t" << __builtin_frame_address(0); + std::cout << "D1 SFrame:\t" << __builtin_frame_address(0); #pragma clang diagnostic ignored "-Wframe-address" std::cout << "\t\tPrev:\t" << __builtin_frame_address(1) << std::endl; - dummy2(); std::cout << "D1 RA:\t\t" << std::hex << __builtin_return_address(0) << std::endl; + dummy2(); } void dummy2() { @@ -40,5 +46,6 @@ void dummy2() { std::cout << "\t\tPrev:\t" << __builtin_frame_address(1) << std::endl; void *ra = __builtin_return_address(0); std::cout << "D2 RA:\t\t" << std::hex << ra << std::endl; - std::cout << "D2 ERA:\t\t" << std::hex << __builtin_extract_return_addr(ra) << std::endl; + // gives same value as pure 'ra' + // std::cout << "D2 ERA:\t\t" << std::hex << __builtin_extract_return_addr(ra) << std::endl; } \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md index 5e5f0b9..939c6a0 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -13,25 +13,14 @@ TODO: Potential algorithms: - mark & sweep - - easy to implement - - slow -- mark & compact - - no memory fragmentation - - slow -- stop-copy algorithms (?) - - no memory fragmentation - - slow - - maybe good for FP langs? -## Type hierarchy +## Tests TODO +### Library linking +Compile the GC lib and a test separately, link them together +and evalutate the following: -- Heap class - - Holds all memory - - Resizeable array? - - Singleton instance - - exposes alloc + __builtin_frame_address(0) + __builtin_frame_address(1) + __builtin_return_address(0) + __builtin_return_address(1) -- Heap chunks - - size - - addr - - marked bit \ No newline at end of file From a375388591b0476bd6b2de7125f71212512d75cd Mon Sep 17 00:00:00 2001 From: valtermiari Date: Thu, 16 Feb 2023 18:37:02 +0100 Subject: [PATCH 14/32] More debugging --- src/GC/Makefile | 7 +++--- src/GC/lib/heap.cpp | 22 ++++++++++++++---- src/GC/tests/h_test.cpp | 9 +++++-- .../tests/h_test.out.dSYM/Contents/Info.plist | 20 ++++++++++++++++ .../Contents/Resources/DWARF/h_test.out | Bin 0 -> 230274 bytes 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 src/GC/tests/h_test.out.dSYM/Contents/Info.plist create mode 100644 src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out diff --git a/src/GC/Makefile b/src/GC/Makefile index 3d57536..f42d28c 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,16 +1,17 @@ mkfile_path = $(abspath $(lastword $(MAKEFILE_LIST))) current_dir = $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) +PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include CC = clang++ PWD = /home/virre/dev/systemF/org/language/src/GC/include CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I VGFLAGS = --leak-check=full --show-leak-kinds=all heap: - $(CC) $(CFLAGS)$(PWD) lib/heap.cpp + $(CC) $(CFLAGS)$(PWD_V) lib/heap.cpp h_test: rm -f tests/h_test.out - $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + $(CC) $(CFLAGS)$(PWD_V) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out h_test_vg: make h_test @@ -18,7 +19,7 @@ h_test_vg: linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out + $(CC) $(CFLAGS)$(PWD_V) tests/linker.cpp lib/heap.cpp -o tests/linker.out linker_vg: make linker diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index c41c924..19a1911 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -119,13 +119,25 @@ namespace GC { // Not optimal for now, it doesn't have to loop over all objects // but mark needs some refinements before this can be optimised + // sweep apparently only sweeps chunks of odd size, eventhough the're not marked void Heap::sweep() { - for (size_t i = 0; i < m_allocated_chunks.size(); i++) { +/* for (char i = 0; i < m_allocated_chunks.size();) { auto chunk = m_allocated_chunks.at(i); + std::cout << "Current chunk: " << chunk->start << std::endl; if (chunk->marked == false) { + std::cout << "The current chunk was removed" << std::endl; m_allocated_chunks.erase(m_allocated_chunks.begin() + i); m_freed_chunks.push_back(chunk); } + } */ + // This captures the wierd behavior or my lack of knowledge of vectors + for (auto chunk : m_allocated_chunks) { + if (!chunk->marked) { + auto it = std::find(m_allocated_chunks.begin(), m_allocated_chunks.end(), chunk); + if (it != m_allocated_chunks.end()) + m_allocated_chunks.erase(it); + m_freed_chunks.push_back(chunk); + } } } @@ -168,20 +180,20 @@ namespace GC { */ // For testing purposes void Heap::print_line(Chunk *chunk) { - std::cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B" << std::endl; + std::cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << std::endl; } void Heap::print_contents() { if (m_allocated_chunks.size()) { - std::cout << "ALLOCATED CHUNKS" << std::endl; + std::cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << std::endl; for (auto chunk : m_allocated_chunks) { print_line(chunk); } } else { - std::cout << "NO ALLOCATIONS" << std::endl; + std::cout << "NO ALLOCATIONS\n" << std::endl; } if (m_freed_chunks.size()) { - std::cout << "FREED CHUNKS" << std::endl; + std::cout << "\nFREED CHUNKS #" << m_freed_chunks.size() << std::endl; for (auto fchunk : m_freed_chunks) { print_line(fchunk); } diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index f785077..f26ed55 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -12,11 +12,16 @@ void init() { auto temp1 = gc->alloc(sizeof(a_ptr)); auto temp2 = gc->alloc(sizeof(live_int_vec)); auto temp3 = gc->alloc(sizeof(dead_int_vec)); - a_ptr = nullptr; + + // *arr, *temp1, *temp2 and *temp3 should all be on the stack + //a_ptr = nullptr; } int main() { - init(); + //init(); + for (int i = 1; i < 10; i++) { + gc->alloc(sizeof(i)); + } gc->collect(MARK | SWEEP); gc->print_contents(); //delete gc; diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Info.plist b/src/GC/tests/h_test.out.dSYM/Contents/Info.plist new file mode 100644 index 0000000..3db2218 --- /dev/null +++ b/src/GC/tests/h_test.out.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.h_test.out + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out b/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out new file mode 100644 index 0000000000000000000000000000000000000000..8e80ccda5106a84472f772e86f5ae8d9c27e311e GIT binary patch literal 230274 zcmX^A>+L@t1_nk31_lN$1_lOB1_p*393UP9OEWMqNH8!kXr7GGdt7YybgMo8^?MTE zj~PM5!5SHO7#P5qfq@As&LF_RV9dzCV4%#vP~ghIAj!bM;K9Ja5Fa1l=&r3=AL)^ICj-Noqw2L=A|Hk4H7{ zjw&QjT9Dic@*7Ak7_%_Ij0SV#jFG);7cb^8-JR2lK zkeD!I;BT|%)E4{D7twSQ1f)bkqlLY zM4`JiKE5=sJTosPJ~J;ZADr$`<99_h#COf+0LecYhkLkVkQ+>xfgynrQm6_*eFaSzP0SEJI|C$ra6@&( z$ETzwm8Qq%WafcWSbV$-R`X_>Ks7+kgYqyan0ZBsdFiR(@&nbpnNuL{O8|S8fnnwr z3?onkVCE%44Mca}gepv5l3&#frhF*q>upxKiF-Mq|c5cBT2KpdF44Z{c&0hoC? z`N?2$bo1PAGlAm+Rzkb~hL{UhjD>)imzb1Plv;)vzq_F3d2m8B?;_H?;*uh;26Xo^ zJ%zaMlsd#+Osue+1Xhkg#K$KV6y&7F=OyNXq8B6l&hW5+{hI))s2La-&gekW9fm?*UZ3PCRkul~fjBbsvud#JnJ7h=Du_#F>|$lm(7pboa$2L(Efw z7{?ITjNd${vQcU@1V%$(Gz3ONU^E0qWC(y-8FGvb3~$sS?OG=W1_lscLj%GG^_@Wc z6exctR9-+6BEJgCw}J9^L-}W*{7+E+4=7)g5n{fI7DPX&{RuL^2FgDMmEQs7--Ggx zK>3DD5dBx6{OM4>hBm~!%TT@zlrO;yQC|Y(XF>TLQ2se6e+!iV70Q1A&aT9|GmOu|o8BK>5v3{st)j5S0G`%2#27s29+Km=_P_TR{1< zp!@_V{{)m@0_97vL-ecYL-e~r`5sVy8I&IZ<*$bFXF&NEp!^?D{&y%}!T@5PH3!6e z4=BF?$}fQOH$eGwp!|nW{sAaoixZ;%36x(A<^O>4cSHFKh7kK$xFG6XpnP{IKLW~c zhw?RyAnG4L`6*Do8aG6L36$>z;CsLzM;PeA#Tp!^q5{%a`T#ss2Xl?Q4blwSws zFM#rALHTE({7X>2gDFJ6ATLCJ43r-L<##~&4N(3DD1Q@_e*?;Y4du6(LCoXegP3;% z%D05_8O$N_u~5DUl-~p8XF&ODp!_*d{skz11C-Cm4>5lSly3*+-+}U5q5Ka}{x&H8 z2b6ys%8#*txaS*`KLN@Y6o8n22g)~r@(nB@>La226ezz6%0B|-Z-??fK>1Ihd=V>% zenmlu`4&)qI+X7NY?E z_ki*hgdyhTK=~0+egl+07s}rQ<-djUZEPUs>xn@0XF&PIQ2rVye+!g<2Fkw&<@?w| z^h=3C^t0GO_+C)H4wT;qK=}`${0J!DSrMZD29!S$%4dm&=zk35dqDYyN)YuK zP<}0x-vZ??g7RNL`Fo*!nHY$9H=z6sC|_0?V%`iW-wVn=1Lc=P`EQ{7+fcqqEW|ts z6^Q->C_fp>KLF)Vgz`1wAnKn%`8H6#m?}hn2$UZL<+nijGokz~Q2uc!{{@u)70Ty` zhnR1t1~G37lwSblpMmlv)FJXV2@v%iP`*nNgnt3bkAU*|H6ZGjK>1cs{thU=7Rpaa zhUh;8?+@h*q(anBf%4Bl`Olzyjx>n8t`@{R11P@?%8!8Z zPeA#5pnQ34i24gqekqjClMXR&Ka_6*8LHPwx zzM3gSz6Hv!hw?W-`Lm(?J5c^*DE|YL{|(A#DT3JNVFocT0?MBT<@Z4OZ=w7xP`;}< zMExBoeoS%6|;ymq7X7p!^mnpVJ27zbR0@ zER??l$~T1aw?O%>Q2r4pKN8Bn0p;gH`7faSMkxOWls^^9*MZLeu7vVkp!~g1eh8F* z(T0J6pOJw9RBwQ0Qf`CzTn!8i(D}iyAU-1l!vSb}Ny-+Y-X{sMD%EQ(NtN`;F7+yfzpL?PF8{QE0m!SL*X#4Lal-~etpEB5i>~COr18v{f zL-`M&{l`KmUj&+-=Ro;3Q2t&h-ve4cK8EsZpzW_vdx-gepyLB8p!^JId*>IF&jPIv zV;msr1)%NqMNs|*X#eshl+Ob7uZ<%_eFC&Tu7dHQ<@s$WKLFaERdj-={{VGgGL+vF z1_`fUP`*MUgdgAxQQrbJe>If90$N{7xT} z4+8T+GwBe18i>!$zyO<1&I0in85kx&$G<=`fl+?JCC2gbhGu1{$tC$ko|%5Z@s^1> zIr+(nV6LmHtFxhNaEYNAXbneZVoqjNYEgVnW^svUrYl2yJaPJSgS<0|Q|w~sS_W2W zfhViZ@pvhU}1ZiZ15#;fyIjOm*;qH@Z;OdiP;OgoOa$6bL7Nn4aI{;)c z&S=2pEF)5!g_>rOW5m_fC)3c?C&>`xN>JLynjnx|jg)^;%t23-X7TZP`FZgrMVV!p zi8=9^X`UcU@Hxa4%?KhA5IFO>z_NokBt;Ud50uOj^YZdb5=&C!Q&MwMOH#?o{GjZY zlbTqBqS??4Ue3jr6eVVs6oc{vuE2A3H8e;`h3ZIk4GK1m4+u7i&qWG%Vtr*E9}hMM z>KYQm#3DJdATc?!q>?=C#)k3n@E}dj&nwAHFU>D41}%XrNzBYkEpiR;E(^AZhaj-; zNOYhHXtfl1jx#CFtU`@pL!4}n_T?0bmgH4f(C1PU$R5&Ch7K74M zaY<2Wa!Gt*NqlNvifcfyF|v7}C@(H4%CC%1EJ3jwRBm7vibkMvmU#8Jk{ZZXZ~{pz zNd>zIIgx=1^PJ42xCo?@SH6=bRzbHO0wcHg& znR$GCNo1)7v0B^M~=pcw?I zR`3;@@bcR72y8cItAl=8tfCW>Dm zfdk8a*cy>WL^L9?dIg(dh9ov5K$!-zCJ{#q2#Y14R0M1Ec;jdQBbQgW)R-ovrf23M z;tXp`+89*$Ah%D64hm4a1#jyF+DL@8sc^?~COm4fH->QPL{0jcl(bhe(OVdX#57Ve zLG61SO$;nCYh(}~Uy@OjUml;6nwMUZ5uaLAluu&Y0A!^FypRqGHp1Exz+yRC87G);K=Va!BT2MKz z#<__V(9{m`9K=RYcOyPNC$+fPGdI`O73u&}Pz4U@#YFkR3Pgmm9y;q?oe`*J}|Tx1PUONq^IsC5EVGZ{GpOX-Q*(K+ajh6F5*bR6KF435&^5m~ z0HWANu@Ray@e~up^#s5<6xPZnY$%?_KbA5Dy)OgtD_WaB(-qv%H-a?G2|EE-iAh%I zL#@M^!*K;a#3y({-^eiD8MNyN)cXi2O3W)xOfJdH&vQ0(4GK0!sZ5MaK_eM?(2fdt z&jP454;~o7NPga#nVFeouC8T4A@Knr2Jyk>@j(G0hLEr$*HJhI!LURqE?*g8_=@zP zfe#`O^afldH1_b=1xgg~?l7Ja1}uIhZ%_f$a6swcf!YoMnc$KYUIXGDj74s75)21W zs>R;TMIMa>xdz^81(zm-dbZdVq0|{5L*XSp%zFeK>}=#p{7^Ay7!15|50r&q9e6bD zhDOLLJTtw5yfa+`pe2fFyh{OE>li-Z2T}(bV#PJKXN+ZR&k{OHk)P%Xu^}iJoblq5 zD=OmCbMliCbK=Vqi@<}p4Ds>qKK@RQKJoFzrAhIg@fqmFJIRF{)Hcc%`EKUUv7#haMmlq`##AlYI7I_AEgXO{2pvDM66VbXd zpq7Fms@cd!xEAEN<{(*vrqmlnt+SygXz&HpF7yjFi1!SMcXbT_c`G$9F)1e%G&&hk zTx4jH2_C8{OD!tNOv*|147LQdAYENe%Mx=+Q(en22ZD(WF3W<_;*9vD#N=$(AW#T_ z9S(~I93>#K4?u2(ruh6KPjC=}rcQ#qgUzs&zJ#=zfL(&zmLk?876thQ5Pu-+HZ)F3 zEY3`h&o3@1N=?l5Oa^rt4U;nxi(rGF$*!)hImNC4ZlDS%*d!i#G@V$xG5WE2si*_) zuC7Tz-e9YdlO!mzgDoM!1TC}C5({#0xu&3w5t^iB=B0qfZt>}H1^LJ|1XLk{>O^l? zrvs7$@aZgo4YDRg`ng~y!w4e$OT4J&jmz;rwOQ%fcDv7o`lz-kN`?8BsCr( z`iM<9kT8Yj6sVJl)r+-D4XW7D2I^3KfIYu@y5t3$#e?U8;8g?EIb@kgNq-R~%_Am( zP@4IWP$tW1;87k7&q54@*Mq2`gz6%2DB-Fg&9GFEp!Nt_oRBbh>TKj0Y#NU=M+c1; zVv`Au?lMXtN#c|cqGt@64}!GeAOT3Mqi}Urh}DmGtOuz@h7xlKXCphAtVBdoR~6Y2 z@WDnb$(dNslrzMK@GfM6G*#-2*pOA^n_$`Zl-4dN-H?nG~U(KB_ua9 zIVYtgtsov!F+(^8P@XG}_7h0hJl-?JAl?cIeO#cA;|%0(H6LP z1X+*N;Y&;`E;7$7jxSEkO$9gbji8Hvz`c4<9}%+d2b}03UBKcZBa6&p*rJx4O0Y%o ziN(d4>EMnesK*HJE(Qc!!kQ@opfu+QMKn2Cg^it4SOeLwQ_?O@X zn}9+QKDA*P9|RjTf`o%fad~0^sykgl^eW-+8*0M{d+@ni5{B4`*2R*M*d zY7tN+g;IBbh6W%i;6sf;po#-Jb_H<;u~om3S$sTF;{~*Q7v6wD$#IajQxM8J99LI= zPz8j!8a4!$fc=Bbk?R)Hvn{;M5Ahc12AC!zExLr(7o?klW0H{MS_71(Q}8!ZNp~DB zLqTz4o|#vYnqHKc16o{JT#}eq;+X_qI)&0cC*4kr;uIFNWR<5VnHFXeQG>;1#i@BE zMU}~ANhqlmv}C6Mv@ReoB|g8jq@c6}$6zxkYZ_WY2c(lq)4;tiQ1jh0Bp%$N3pR@n z@CJ3h!OKxWMUF*gesMf_v=Y_~fu>EY#$X@g22HVoq6giN!A593C%9#%X*r4M#ZXT| zgUAvxoSvCqjKg;(X_+}WsCuw_7P~9W(h@UsQc)Kl6139-bigKPv9xOzxcY*+72%Qc z%#@N0sH31EXA1EMWLhApG!2J$Op6OjOY%U=L{O%5jNrO6^U|?vMXicKvkcCLuDP%^ zDxkiSAz7v%FExPp1>K)iaH$cROR;1zP+B6(1E!#EQvs+~=IU$+?%rVAVi4?zy)lPt zQwMp0iM-ko5}2Tp4ZR6K6|WkR>Q$W08%mwygV_B6E{m`QKR6#jLIj^XkoqXelq`Tu zCTjsCI8(tEKtddgwumMf+<6OzE~0@cAt&>Kdi&|ACGiFMpy~~_Y!X`1keB!@!K>AC z^7GPBizc#i6=+!i$bBH=&>TsTw=KbIx8sX5@{4eJo<@ZOwi+5=S|l$LprsK!PY~HF zpfnGHhCER`2#KVD@t+AaQNyOh1Cm`04d7z=u0hDP7SbpQBzHlVd%)IdkW$-&2JAs0 zNw7^qunAyVl#*1M2F*v%T#2X`u}Bg&u{<*+HP02r>!ro1@o9<4sU@JY+%y@q`OXtm z2!WRsgGQp`%|Kg7b5c>7x^RW2m`1|gh}?#8cXmcP=Q}6WkO5u92t&jIL&OkMn=z(7 zV>1kmrp6dTW|(G~W3kb|97Cre7H1e5V%lJUp%YUL7Hx)@t}wyWXl{vNx`io*kfEUo zrkD|CkQo|d(TgP<4Y7opp&1svW|*EZG{+2aBLi$=W}vFt1hhl848#HrB7%1i8ye(- zcDp+P}WW?l*Spla}9Bk2BNRP81ZMWDTMsd*)^ZUD>-2G*=PPO(2wkC!0ZgOi?!5k-B9S z9{4b4=2GfNOZbQx$eEzY1e17IWY=OWsU+xT(27{N-!q|R8O6i)UJ)6XAXAXMYZMPM z2;^PVCNH5>05S&2kB|kUAfw8_>vTgfCrd!>&C)#h>=$GX2xX`aJR1ZWN(apVp-llB znZ(Bzl$OMU7UCr)m!uZO7pE4Mrh>M$V;>iA1r39sFXn@dmzYDwOOR(*Oj7ewagf&%oXJQQRlanaGql?IiA_qJT zfnG;}_N-xRql0D*z$2BQ7IJPzd}>8%a%o9wd`4i=K>yOWN=g->7} z<6I`teSjeMFjfWlfOWCY_GDsU5CG}LW*!#xk}&lkb4KxK2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1Jh5&6tfJuabfrTNSoq>Uok?}VlFNgx2o6pF=z?hkroKu>T z%AlWLP@yw#O zlvq@$?~+=UngcqnOy4;_H#ada#V0c_H6%Yjr&vGO#k*MFH!;~iIKt3KuQ(-JzqGgr zW`cfkWwCxdXo|ZS%^@IHfnAZ5nWwL(2iK6St*u{Xs2?Ano0^+nR7sL927PL{mjQGv zO)=$WQEmb}&M3@=A`Er zWtL>*GB9MMCKl*r6cm7N(k?DZNl8u9%V1z)U`Pg?m=BYPFU`y=DJUt5FVV|jU}j(d z`w+AuUoV4!1&Iq?9|sYI99G4^%D{lOTo@t^O72kgAT{vSbl?-W5lV{nG8otx7?6%Z zVrO8;ODzZKft)P~Vx_{i41qYsB`FX-h!Y=QTvC*omkwehSfJHF$d?u%WaG;+A% z7pIk{fF$C<>)7-%7&sUhlEG}SXl7oC1uQ_4i%U{6^GaaihGsAc(Bc(iBV?YL37iKC zRfrLs3=H5fhH8Xyp*mq)s8&t}28eYKCqW7hy$l8}1_qFINbv;Xf>!2$q77yU5+CI1 zl+-k^tK%V&9}kj-9PSL#1WE|SB`GL_;i3M#Ln91rdg` zSs55oN{bRf2j}T!Fz_%i#3$$ECuhSfOD@UGO$C`44`RSXL2QUQVBz9|)MQ9%PfpB9 z%}Yrvf*J)1`+S%}(ADpd6bcH=%zTik$O_65!Ixq{42mxYFJ*#olFJcE36vK=37vz1 zA-+7h1a#~l*j1o7gD6AeLac{KLD%k0&AdCqL@Obb+#~=mJ+Y|IM7 z6SmAC5ftGp3=FxMd3qTPd?2aZ0tgFQ%dj#ql;vlpWTsU@@+bUUGYFS~fs+Y#XAH9` zBO9~VE>>K*T8*`}_s}LJAj~A;LTN881E>PD!}H&%DIcx-HX-Oi&dwI)xU|w4-|US>UXiq zay7Fuvw49uurW(Cv8r)#tY#GgX#iR715(JGhNjGxfcX$p6DvCx$5U3pc2;gSFXoRmpg?7w$n3?c(#&eg_KDTLiIwvcD?1w~ z)L0pqk1>5>Rp;U;Wz}c<#A@-0)$9|iI$JZV0ox~5y-%zbO{|WeSnWC1u(GpxvaE%Sa>1YKU96lSQzY2DSY^Ffc|j5C4T=)xZ_K+`MM3Hn z*t}Rdyg;g7*Y0A~0C~uUZ5OMF7c18;kmyy$U927;Q3mEqbxo|=AU%R?UaVYTJz=|8 z^|*Gi+Om1Enu2t&aDnt}tZicD;c8)JWrHTrFD&37UCYV~&Pv{_JZxU9QlJFLe6MmB zt0EioVm2>U2eu|won4?fVr6S&W4>4E1BlxW0hWAV>g|4w>~zn!4(NjPdiwfkYf*|oQ?Ts6(}+|;ObY^?_z~% z=;Uky<+4N7Oa_cd*^HHyjd>4C6DuDm(|Iv(FWbc`#m0P^6O=kZ(b5b~f7YK^IXP^= zWdox($S&qB<)7f$kHr@h<^7DH!0u!bW@TXBQwIv|U91|g=s(QX1WJc%S@}VXCgv9v zyIA?zm}jzku`xfd@M3jgW1hwC#p=)I#j5JXs=SL;q={9Y%^Mts8eXj2O|0Udz$Gvv zC|b`m>|#~tVp0)im1f(;s>9aIYR=Zg>fpud3r~^V)J7A%*w-I z&BlDOVi)szc94r%dB7R1t=@}``E(_y5a43o#?}N*>F2AxSOq{jLD^cwi>r*PpqD7O|0%stTs&$^L{bG%>yZ#T-U_v z#|4fvW>+s(J&?hy;8#^-(V}4$@i#3dmi+Ls^#}igBHZRubU92%) zpn?RP3wc3BsxVsF^?9EmDy%g|!J!!5#@NdrDa0bpfPgUst;e zwPb(CLSjj@k+q4{6;vIweq#w@WniAb2u{gsS>@QgSY^Ce`9aMQZ#FMhUAEn<7Hmzd zPF}2TpoGsV3aS7=l>w+0+s(=dsmNZ}?P8S!)laOQtPG$Q6(6XE0#yvsUaaz7tRmp* z-rNgRK-hV)f)WI%z-?v~<=PEy*$IP;1Ev1H+QC*y-(v)o=t$KoC=D%V8mx6GJE$GP z?ggr7uGcVWpjR}@nVVQSz1h5&&y??C6=h@I#sO}3v&yhFvnqm`TA+yVW(Ak=i|fJd zpQo(SY)z~xY~HNGY+m3h0n{er@?ur@Vl@DjPs|G|Km|MV19mS~54I*yvn5~`D<{aL zW>!xRR(G~fpjIv;n=jiZ=6MxO%#YZiZKGpV93`x>TpVTKM5Y988nUuMniAh?cd@E+ zaoDj0v-&d^H?i8Wd9nDj`mizcHnEz4ibjy3pf({Ja}lWChO`|+SQ*%wSrxdNK@~O= z2c%I7yDpuDN03#3tCf|3&7D;MMAb8iFfcNLZnBk~-1^JAs4>17yXO zR2VnZr^;X*6?_93exZUvkO37^;{`fy2pXY59m6I#bc`4TBvB)5&~ea=9by~JgKxZn zjLyK4FLcBaB8Y9wF&^d2F$Pu!2H4;XwsFVI{9=%j_;|>!RtOt133T1#3<}-+w;Ky}<)L}V71)>Tn z0a6nmk86Yu=5NrT6!PF4GiX>3SpYP`3mH9x7zklw9Z5tTiPg(s0FPyYL?L5+&>=pM zi6AD(JP-|22pWilCi=!tpu9|9nNHjhAGN$CP)Ek!B^T!^C} zQV=%ga3&`M1JZCNc-jJVDFQD81L&A{$T%hFp2eh6@K`@$kdq%Yl1b7aXKsF3D#Spf z4SWy*eB+P84Uak3{aE!85j@+gbgUf^XwpVo}5guTeVrjnfVx51wlhs zte@GK^EpbG1wkX6`JjH3AjcY3W;SM>U97CkAsi*FeBR*hj3}tJ&YZW4m7R@Q#H*Q& zIh*4NvnWVcb`vW*vnalZ|;@y%#GF^Cbo^R%wtYnAg=e zvC6P9UuN)P)dn@IK}p7&RgBGxm5;5Nm7T4Ld3Ajg^Hl~==+v_^`?In_JOeVFnT`26 zgBKg~%KA?r253-|jrk_mC&)mP0BEG5iTQj9c%W$$w-+1pImj6MW^ONVx`A}I8Q7Tn z7mCAwhlhEp?wjy-{08#5A#RgL-UVN<50{FpFl$sPrid( z&b*&{7b`y($68i-ki&N|x0mc7qc7t5U{I1T6Rf>5MqZg}26DxZY z^Se6Gh#&K0Mo=>L0u9sfvU!8ks;n2QvKOn`E|9}by;yC%SY5nWt--^|0&Kg%X^!8E z`E^|rD=!=KG)7SPHnFOMhfhC&vYjl44Xbz)s{z|*R&zElR(o)V-qwrNw~00A6Du!= z4fBh-CgvH8UTof=Nakg(`ozlF%F6D|YRFs$8lc(*8mHv;VwD5UlYr(XnAwrY*+=on19qYu`zctg2sF~Y*q>7FCHAuRdmD86E6s*l` z%oFOpSoxSgFn|*_yBG6>`X*L6Hs+5Epz#+kRz6U{1}X`?SOwUcLGwV&z4cAZpBX^f z>seX-*_gZQK|}M*-#~e>tNs&+!J+_4^{-ezvFd<|1S7U4R?jBTI64og-wcwwTLqqo zDgotj5PvlrD4l+0Ghvj1-bUJaxMCCY z5l~jx!w6#RV&22(#VYuTRgBFWGy?@1^<`r|Qs>1g4whkMYh`0TSmy;Y?*JpHfNNqt zPzMf~LyVxh0aR@=?}J!)m~j`YHrp;%D=${{U965xtWs>v;M#Hz$igFxP0V}hb}=8p zV&R@TP;C#A0b95eV&MtKU94)L!A;22BJ(MbXSq1murcQ_IWRJdcyT;|1pFh0Ppkr5 zU%|6ToNT*U8JKs~gU6R2Lkb~KIRP5UJIAn#HH~W*Ydjmc24n*zT2Q@E!p2boF{zUg zG>*w(%L#md?QNoJ4OKe6(1F?ZH5sW5u8vNL~W22DYIVh!|S4F%U- z?4YW1X0Nfb6#2Ik9^pIAA$ znn6}F?_kC7h;wLJkdLq4P4gKeIf-k<+`R4G?9Wi=FZB%ERS{iWEW_LH42pP zFlJcon^?6#GpwMho`nq(1lK@G7*t+RZIWan#v}4*GWh|X>77ysnzZI9 zWyL-Vzyb2K8h8X9>(Kiqq%rWgK{W<$-^9jz3_1t3o2`jOhLwT&Ts7(>%2&{YJaaed zB+4v|NtD~rNtC6ilPKVHe25b~=@z zstMGZTF2_eD$E9ISb2klS*5{M8n|`E%DIgto|S=lO0^eATLr5@Gq{y#z=lfmvVC9` z*a^}N%C>CGz5JkQPiBE#ATKa4Eo_39J79k{a5W(}2SLdq`x9vD8rA2saQhr$&2^S0 z&~gCGxjb;23^bSbiPagt9DpT(m4W$I6{v*U4H}CE`HYRZpb1nRm$I6&fjdG%pb7;v z&mzIL8#FHo>V4^hizpuGv=n%O2*@n9eXP=4pFxdA&{#SH8)%kAh3hjoB487eS6Fwk zN`oh5Rhz-Hcm|-xDyYc-3g3@x%-<@T*qD3RyjYn*<@P;RP+_77YVnGK@;#e3s|VXI zP&dr)6KmKmRzuJPun(&ZX!PHUHL{7-)r*z&6Z6CpP~U|419uZE>uxsY{u1z1?BDze-cO~s4Wf|)rZ8!T=phb z8Hm$C1wEw40;-Q8)7ra1)7nQXyjW$~nD?-Q+7%F0ps5S-CeY*rsMQSWovN`lv#NkP zOiiHXHY><8&7g@-=8sjN1wBkELL3etE17q*fZ9hK>sTF|S%cV`Sd+Y1v%vX+71Zx- zW>p1sKtO%sW^kKR8QjnphnfzW^4i5J0 zF@f7bvRads47*s77XC~Ja1?F`VO zo2LxBKvT1}pp_2Ltg*Cy7i$97F4joMwDctg!~`r$94HVcv4M*|r1?%r0~a*k&dJ6B zT1lhDwwu+5t%)_tN(O^n zAVnqMK8qPB5||e-g46F>Hs*V^pdo-oOz`DDwcuXoVkXeSn_Y4LLgu?4Fn}gTAxm8#y^WnLyI5^OYj`Z#nwZyBfxDuYS-sep*H-OfzRc>ys>asJ zs>B9bnWo&#s=@Y&c}3MORs-f6tWB&+AlcpEo|g`2HolQn&4*Q~fsJ_usC##twF%s7 z(*Q{|bJ((~vwdP-T(t|-RKCW_VZ+9}s*1yg`5J2zt3F#Gs~~fwR~KkSpbaFcGIM!> z<{;UaD?fqy7i_Jpd|-YvD-U>q6e}kibHy$;=7m+Df|B_mD`>p|BU>OV>vk3q&}xPn zjuKXRE@tjetbCwY_k#F$LH#aP9j;xVoX?U5N>~3mKur=*S07ZeKznQ8@gwNOx&Wwr z@CL6B6Mz&*ptdh3sL8(@Y&7RCRz5Z#R`F)oR6Il(8%V_-a6?uN9BcZZjx?(z+a6XC zZ|I^yAMnI3s}9>9RwFiWuRxFuR4O&G>h5Bd@?w5j0?PQ)xlwg~Vr66l^;21yOFpqN zKPmadJcrv0MzexCexO-jLGW5LPBu_oCCEm|A)ww(6Id@Rcx{z8E68*fc~%DI>7`Ae z#TRQ>71?&N2!X>l`FCX#t1ugL8yl#f1)5f7{#EJ4 z%EQLo4k~ZiygJ2KuKm#WRUJ%1qRqbLGgVeul z-r%SMg%xPA9a#TE?j}|aE+!2@PznPr)noMnmGjM@ti#-0h}5Tu1X%}Lxdm$Dqpp=~ zLS8EgQo5vm7pp#KSs=4IxFcP{N?`3HFDnD{V{p3-oYo=!yUEoAYO0m6G5;>!#VXI- z%Hzc<*u?z1*o)N+nZpIc#2<>drtHD7Dn?VzuVl1sZh%r>M;LfY=YKEcbP%!A~{MS%{6GsKUVjNl^e8-2{dpl25uEFvU!77 z(w<;~OaeTB(odi?3o}F<7kP&TBJ%=D^MFn>fe4|H6Eq;)H<}Ro3zYr?rFFC*;s#LK z0!rIJX^1R>?9qm>S#%(@4wN>4(hyMuS-=5dpWuYhFQD`XC=C%skaM8wcR=L{sfX#T zFov;EX&VLx21t-X42CUEhlL+(8MBHwsy-MGE>VrZ7@@0kY`|EFkoO{NCOEnFfbG|FfhPe0TO50z`(%Z&cMLH!_3Ldaex7|3x|O@ zkb!}LWitZ<11rlm1_lNXMiI8%P<4zd?8g`w7-lgtFfghzu%BgMU|0=et8uVjfw9#E z*q<^mFdPSoYf7;HfU&g>&< z1H)qw-wfnaM&1{U3=Drjd?%J91_nlmR*)|k_?Va&7!;To7#N))!VG-+Oi)Lz;Gggfq|Kefjx+cfdS-3W^NAl2qs9-F!Km7Ffh+&WMB|j z!pOiN7|X=Kz{V)Fjgf&NiHU)MNl!47iGhKggQc8_fkC*MiGe|cr5_iSHJC&f6NlJcCI*IkJPZu% z-An=!FF-217#TSuLBTEw=K4Xo+;Jc=agg!vLCP!{A@UJ0`AAR#7VqR?VE6};w}r|_ zAOXv3=B#jVMj(OZC0p~n~d@- zASGa(;-UNu3~3-GPK;8etPBimLF`+|rbums3ExK6DfNn#fkBmxfr0%VV*%Jeh@DaV z3=BFTVP{4uTQ;bYhm4cKN+5Q|^D{71f|R&0N=;y6U^oe4KS4G{>Ksh?IkHYE4t53x z7j^~)_SYy*@n&aWXaxzsLlN#`XJ9xE68?x{$a!`K1}+W;2KFx~!U7x&44@3k{(}(| zDU8sd_2OV)=m4qyjUqgegMr};NcbNkD5t|zU*ce35a48BU}s=LGDKRElYt==B+SSJ z$#UEvSqAA?P6mbrAaN$BID^zWP6mc2AR!i}GpwL^0tG8Xx%kvX28Q<_Icr9#pD=Z- zOrYcgaR5Y}lmQn5Lpm1&13Mdr8B$p=Id)8ai?|pV?tt`hBI#q0dIS^ZL(;+^CCkmg z5XQ~Gz%GoUIvOS{fuedUHv_{tkZO6RS@4X?Aaxlgti&`QEDTN}(!4wj4E~_P$^aTL zkUSzC2@^Mli7x?V0O?sg3=G#n>g}Q83{nqx7#PfW85r0dnGkt`81B06Y z0|R?46H+>s2^L^rSPT;GV*;0`3^Mx!7#M^E85r36AtKzM8izqfPmqBjA0#{hDhvu4 z2AOI>28Mkg;fWAo2H7)$3=Dii3=Hg(z&Qh)yC4pikrHBHNCHVshA4&#m%@anA_+sh zBXdZIf#E+$%UmQm1{n@vsPH@_VTcx4FJT6TK4At1_66Xe273$Q3E5dNsYOhn^Z{|3 zJ*dSezJZ5<;Q>gO1Eb74VFre15e5eK#Zc3CfYP39nFv&P2@@zxAO?e^Ag0Sa7hzy9 z5@lduUkcR*QU#U+6AUu;q6`d+K?;^Z6@a3K`#wJd1B1*)nA{3vxhT+ie=?$C3=HvN z3=Hh6p>iOD8Dt8@7#J>rgfB2bd~yxcIzlBFWIl;8Fqn%oFtA^Ns)9tEn>YhQA4vEX zM3_Nlfj9%hE0D+ohzK-x{)sa%xJfWDus=r@mW_~LV3-0D7GS=U$iM&&3OdOqnH;3=E$^ zA_@=@Xkc85lS? z(nUf1b@I?w@g{i&2Km#x3=9nN6Zsez7{(D3K>2e514FSA0|Ns%1}i`;l@28a22f~lI5IGEOa$pr0($wHkQhg7Tw*v(eCm+b!LM(|444}p;hq9WX zG6MsLKG*|s$_xxjU=z4O4rgFcXH8OOU|{5sQfDm%Go<-h+rSK0a8g3?1tZ)Sj2fVX z19QJOrv%7Oh|_(+9Bw4f_(Mb>o;jh+!0-~}nIur`fn^wkWTEXQ4tG@v6{vhNC>}X= zKn4pb!93%^pvju40*ZA}Cb;{+J)!9;3=Ev2Obl9cR2UevwtxcJnhZaIXYg1Bw+;zTj%t-l)pJAha%#fnhsHQ4fPA z>jjVzoQh1~FpyVcU|0w=&AURbyZfQ)gh{+>NAyK|D=>fk6=@e1%cGNPvMs2gC+h z?W~T=Y6fJh8Dx{x;Z|<~S$zh>>K=8t)d&>~x}bEwRh@x>g|A)jggOI5z204Q1_lPb z*C3lA(!apcb$UD+AZY~+khGBo0|TR;vj(V(9jU>)VVA!w0z#w1)3I@(-Q1@ORq)@<)kux<3lp{f7DGFdAd#F$rNEPpS4M=}fz#$(z zkN{Q5x%MsYtaNS|D2C6mrln9NzG1{h!z z+o;LF(5S`0ASA%dpvk%oYy%s!fxZv}gAfNZgCVPg5C^l^9!&;@IFJw*GlSRxO$LTJ zAPzS(gV+&G28PEV4iBi$s>yl+Y{Ee%vGbY?3==>ShnX0}u4^(dycJ|%5IVxdA$A|e zIm#r!APySP17!lCwM?3<&%nAbLv(KddE+V*gTWqUkpd<#7b%n`-bZ~=01FFp%CINCO*gOb zG++V_o=jvhs5AIL!I%S;V33m0VqmBP3FR}_i-7X~Y>?;0r|K{;%mfK9VUk*^1<4yi zh0F_*K}tXozzuRIgVbA?TqUv`H~^(gw4wTHkmbP6lj?)X)gj9*1=%fi1t!;oEO%Xq zfq_9vLI*M&A~cyOD+&4zf-uGhN7Vh|mJ&MPLI#{$~&`HGzzn2<>8$s)s3A%zPBA1Y&2E31q}X zXg8D8NnOZ@iO@1+Q=|m+pu#JWbxK9(K}Jl3)}lCNksf5kL}&ww@GCvYh>6f<6hln) zAtNS2+fan-^clb-CPF)zL8*|D6YN;2WBLpX0tO5WLc39f#SIw1LnA_aP=u2WAmb}S zdy$2u*Bd}Oxk3k_DGZW|!I3BZ6DD~GS&~88$q+KkB6I{*yvLA%;i(}5gV1?Y@!v4@ zm!RSd(ym635gDN?aG_~N3=E(yxX?A2kkmaR$moyI4Q5ac0rR=KF#~w)M(7rEhd3xv zfdT~Va0c=9$&dz<&>AMG9GJS>%p1V!KnVe=Zc8$x;U%=1Nos>JWE@B6E{1th-(Yh0 zFwBs$Heq0BHep~8dVrkpAsMX?Cifay4w_+La&M63z+o;WVG1?#9kLuG6Bd~=Fzh#F zU=aF*EC;dg7)-v zUHY3D1B1Ug1A`C`3#8PC8k%YjwN)KiBiK*UN6aB3P(oTTJrJ`5EFdFILOM`!2B~NZ z$gr7^E(;<$8Kf4&g!NbusewW2jRj=bOh_L^wXr2s*Z@U!wIyUASjZaLiIAW@0h6;s zmV=a;B34j+PRMc~ePF+X2?nWTm?|G+RY<|U9;Uz-T>*pCFPNMkvK%7VrCh9`Zb(E{ z01jTM#nzC)H=$HyIk0AsBN?PV!W2|uRRHz?m|&1{w1Jvcg`pJ5D}69k)mT+ANZo=d zsKHPGb{9DQrBrR9mesN#Dh_T?1p!HHQY|nA^%x3}jClf6H3>r%B!D9AAftvt)3CaR zL2409!3=a07^MEgrbLu-=}5L1->k)1j5}c9^Q=xK)AU08B7QaXLUv z-GE&^Qfx%Ply1bWltF44Ow}grs*nQoGfe3gWToJE0TYl^73BzZ;Q{QbkX(2Grt}bQ zr3_N4PEZ4nU{{6Y!cLgd^VpR_;+@Hvfx*|AfkEgp3rH`dYT@3Q%)kH+WH7-X739po zFc+liDhsH`096Ij08t>l#2GT$Aany-OmTzCRR*bd&X8`0&_foGUm+S9q|99)qw_+K zQH1MZ!p~ShE`SuC3{uBjAhS?HuUJflVf7q?l!Pk-L#itSgV0-Kr-K3>;wY&sn1b)f z3PA1vD*zJ=QrlpveqvR{AjRkgwdWVI0#NpZn&9Qez%av&fkEgmvH~QB%!4UlX9a~B zBow&O9r7BciW93U1}SrQs6AZB3XmMq=+3}!!<~Uah!28Ov_3=Bg0$O@1gvL2?u5?KMdLpZ&m##m!j#UPagQ(%j%0LdXcy%`vUeHa*o z9FP?tIYh+=s=y0b0lGtKVXAzvs$!733RB>RtN_U&+P(}7RlW=iLV>KHVGU?n1UZC3 zstG2ShAan4vfz{sEv7HSRHfrq1yK*u$sncX2eq*fSv|;S3{u4~xgumakUoeB5LJg@ zs)})|0;^|`67pwYsPkuF5GrRyG?lqQT|@?{E|^?3vK%OE7^H5&-AlB;yFfdFF zU|B1~v5k{p9{Pap%sqd*1*q4})P(ogzp zAOnMU5CenILZ}ebr*T0H468xnOOQ>F-5SKez!uEFAhZ!I3{fmA5)7Fq5!%kWFPVV> zG8Q2l2NT`J3L1!jbf{!j1~V}H1(|Sw6|4?w1YZaPLvjcMgU|_Z%7Q8`31MJ34ibHW zqWF3U1A}%b1B1|WWX0B@3=Ewh(O1ZdWu}BOFgybZze5(5{Tj-^;1R~aAoLO0jPNi9 zhIJs(uTaIHQ6L7{gJBE|;^7PoLO)nR0$_(T$ZCZ{MSrs{0gb4FI!FxSrCN|Nf1!0u zvW?*k3^zdf{vqpo0~2LrL+F!riC|!u8o|II#KMMT$6}Z$JCa(NuMrFkc99GWLfmXn zx41?^W+a6q*x>1#L1s!M1H(g*IwgoY^jbmY1x$eox&j6nlPIWWHK-ieU~uA-sf%J@ zxEIC1AY=fQ1Eo7iRLcB_Vqox$W?&FT5ThRK1qPW@(F_bS zF$@es{z#e_WVB-#7`i~h!AQbTcP)*9OnnK3LFK^3k_9mIKdh z$$W~1OmqrWLgheh5^jiGN*q+K23Za=33@FKGLt6Mh9t)zV-OD&?n4rWI%5S)ZYr`I z*eY3t1O|rk1O^77nQR~jfRh6xjAT1uQnS#cAORx#FoA&qGtRWJsS&(4UdJ88lMe0U9$D2MrKLB{MJxdN9hSBr`CyfY<@x zr7PTQ8Vn3zfH2^lel1gU=tvkx0yf+bhcLvtgL6#7#Jit(nV#2 z7#P4)v>@}qQ?zlQk$w4ZAd)vS9Xc7?e@YwFr4RxQ;qo4aiB5h678M7J>Se&DXft&X zYG=YkXLo`{A!=DOVNa?GN0wlavdo1{8;E!?rs{%{-b9f3;)S}9IROy{Mj?<1pcO+Rf2GQD zA=3jQ-pHz@Hs(UcE+JutNEAQ@#zpcN7wW-+jT>YQgU~eSz_`eNslWorc(+I~hBB${ z0>~h%NHvligVc!v$grtMBZ@FfA!Iy5q@58IH&Ay-I}|c7v=%Zjh;+lE73>D-$%PCI zH$dW(QN^DXLJ9@?nrtDS}i>BFh-7_2K>j6`5d9fe8k2P(1`%Y9qqJD3x5q z03NUr*}w>z5`#DhtPV^tNG&RY)UP7j!SyRt0Z1)_)MJ?3L1a0Q)4`g#A*$4hp(Y&1 ztqP(Zq?17^8>apovU*VRWsq6}le>Z}2hs;I0ixM`-4FQpd$RP%D zI8;FqOu6JppY(yBDkfILBA$c$b zoX8509I^(cKmb_*xyQ-f@EX`NDg7Igqo0rtN`61p)gfNSXD7dEvkeJ{fJZ}D?oC{JD7rIWCchL zv8aNY(1ol3-65?oRg<-le#Xl2weFle=dh}j@wD~Nbj z16mp-TMJnl1u7iDOQTF`VN0WynJ_SL9|l#R@YW`5X%r}=5^EV4xIjyzNh3=LKcR<}O1D1g8 zmJxNt*e#O+S}_9NLjv9{lfuBj9S0H<2N@4)BeSFImI2APn=&vki03*$8qVw}yJcYV z5JM!u27`CYz$G%krh|L|YWkq=mH|mY^niEEfb@X+L(m;G;N3DXG42|WVyU~ekaiIJ zOvbhpP`woiQvlTj-Yo+X;{mPvgcuIqEdvunb}4wb3`k-L$Z&{a@NOBH7}Qp-I;gE{ zk!=NQk}`wIZA6v>+b&&N2kG2FcFTYa1%)N|4Kq-Hf&vEAoMg9QlwJl?2;MCNQV2Fc z>QxhcxckZy}o^wHzjV8(F8+<$6dfj{P3vJg|WfJL{bxYd_eX8KoE- zph_Mx9t10a*xBL?S^L56!YF0X09oY0{sh?+sTi2>b7Y-Toehw7Ci`m?r|f8ev@_Y? zp$I>1fV39bKcW~S+6ZYavVTDlc5Z~U7TJF=f+B^H6YN;2f=0+{4))(D!V4QA%|dqA zZW)N`^No-tA?yrHNQOu=G(nbeu!DEYfT9y5%OI`a1X-KG4&E&Tj>^;~NW+qyh3S_C zEGoId%Ei~EK>ADU){IhpFm#jId)8ayv>jnDLW^U zJ_ac(m@prb76z$|W=KPoT^L366qv9Cit2;SkoGIPJkw@)MrDwC3lmmi+5r{@hoiJq z3uLVVJ9xJYD8N9TWRUiSiGz2`fW-HLLQT591+s>L9lToxBqX)I1v0J8?#P756WpM* z56N#*-(U({Fcg3dm9lPyn&63{02CikW13;Ak}y>9fQlTcyRDFUZ}v2F1q@R1ZBV&% zbUCm~8KhI%AWL=F!MkNZ9+RHf23bhN4&E&T3ImX97^L^Z#KF5|VB!#0N`GjBwENk? zyJbLR3NdVt10}g+g(00hE9y@5a49HfQ8SO~BWkC8t6$^vR-FBqiG9Y2F zTVw<~kao*}^vk+;K*pxoCxLSYICnvkt4vJ?(ry`q8QWpPpxrVsVTgBRzIH&j#ejCp zz~mTYR6C)<)}FM>?U~VnDlPK&BrD`%I||D!haVWE{j`kQBspnWiqJ-7+9;AXQ*FFu@?RuM09z z%nsTu15yBr8tAC6Xg5?2v|9!)2Ojm6$>~PgEd!DR8O$KFyc@Aw1{9mzs2gR#Tn3rn z-H6>XU{#QaGwwm`mH`Pf$mI1PcFTZ7ppmw^2eDfQAuRi>2Qmx9F2H;y1+-fR97LkM zP*GuKP~!p|zznjkz0iFzV$2s2YRh1vlFZjYq9DT=WLESd?Un(VDRaFSX}1i*_u_q! zk$muO8IUlz0U;CK2N_vs2kn*t34_9zL2gsFo29<|I5T67Bi870hAor z|1oihB~N5v2%Eyd!2X{}z#OEW{T&l$^b`gLZjgFNgj(c*to#BIXOIA^Vq#{7C`*_E zT4CBc5!&iuX3mX19?^f>{(D!!#PF`3Jv5j>R+JvMj4|9i$Df}^QJ)ufo(y7!wHgM5c&^Yy~?4a zx&$U~2MQ)mK9IA8SW;kP)L6C+fouag9Mo;RJqk3=u%7S+X9foDLttw_ zvY?Cw>j{HOu-P-9J>j(=BT#$7yPcsuVNm7(_k=+VuuDLjgx<~o6*jUn85kJ(PKbhL zEkLd{1uw<0_L>RV2gG-l$tDuUKF`Epn>>?&VL}Q61K$Ov0}R$#Fy2Kb>tY!D5|d5C zOa_JrAXS%{7{G^DfNbSEZPNx5zrqCDb@89kx(8;#O(yHjf|qZ!=jhgR$>3 zS#O51A23-Tg0UYmS)YfoA2C_qgPHS$$@(>n{glc2Cyf1!$(nl>1H)60E1xr2i_L<1 z_yv=-8jSsp$=U$Me$QlW4P$>`vUY{BzcE>R!`MHVtfOZ!FuVep`ICt!eHH`5^jQoH zd{;AE7#Ns%X3t_^I1S=ogYeJKVqjpJ&A`BS9m40F&A?y_;@^SrU1u{e)PeYSA^fh{ z3=I20{Fe~^iP;Pc|3Lg#5I)Bo1_tLj3=Dj)A^gBO3=Ewh{u?l#ft7X297t@xPhnsn z9NUb@v2BklvTZ?;{SD;h%ZTkn^+F&kAhB)>igmC8q*!Mdwz0lr4lLH=+(5DZVh$|U zA$*Csuvmxiz30MW9m21l3yXCKf5%){tV8&3=fYwg!dIRLi**P;ZXPVw!F&cg@$}y* z3=DSS83L&wDpM6qWm$o#Y=1D7lLDr4E5TG=ADGGq%|Y9V7wiP{3eSV7qNiZ0_&1m; z5lmxXu#=pj4yI;Wf~i^FU}|<4n3|gbrsfrcsrjv7YQY3BwP+ETTD%raE!hF4mL3LE z%g=$S6*s}u$|qoI)q60t<`X zRaOF~%3Hxy#cVKDxd=>E?F3WR$G}wWWiVCu1WYyj1XGR1Ss)vl{J~T+XvW%3qoowg zYi$ElZ41Cu`!+DuaRy9vJ_1u+oY^4l-SS|n#|lhMiU&~!8jaZu4E9DYjAy{KE8`?1}V0t0rY%slqaXXk^#&`})uV8!%rdKik0n=+3`SL;b ztYcIF(;FC#!1N|Y7cjkrF$_#^W6S{4I~c3L^e)C8FujLy9+=+CxB*NbU_1n-4>4W= z(?=LzgXv?8Oa&l&PB2P>=~IlRVEPQBJD5Jl7zw5?FcyI6ON{Mc`U>MrFnx`2HJHB6 zxED;{U_1||Z!$gv)3+FZfa%+eT!kQe?l8)L>AQ@2VEP^-X!_OO=ssf*nE!w=1x!C= ztOnDM7$<@0$BZk%^b^M2VEQTJSup*K@d=oI&iETlzhLAo0@?GDQ65acVl)KPZy24y z^jpSIF#V1(9ZbJxtOU~^7`wsrC&sy8`U~S0F#VPB7?}RXcmqs-XM6>we=z<5(?1!7 zi$V7NV$=uIzZu=Y^dH7pF#VUY1Wf;9Yy;E(8E1fL2BuYDnvrP_m}X)+2d0^s9)M{U zrcYp+m5HSUWIh{{7?@^f(g4#OOjcl;lPM5Pb1`LrX>O)^FwMg>8%*;utp(G3O#8t! zKhrfZEx_~^ObasoFJWM?GjRczb|$WZr68W04w!Ox2U8xgV9K)sOnLQzDeskF%I64} z^1TJ7{Jw%If9^7nDFJF=D$o^71;vA@;8HLZ(hsIWSAwaq{a`BmCYXwN52hly%0Z?? z$(J)QuuPlBz~EpW$8^?@fx*G{GYg1j5S}}afx&UvJO%~^J4<&1ka9~8utzLC-M~Dr z7%=7Y3QYO&RDe|aOM|HZLogNS4W@z;!BlV!m)JxrgAc> z7#Qpva>4dF5=pUFWma7J-EHMRBr9NP)EE7zXH-M>%>0qkzBABXr z3#O_$Ye4#Hw7^uYE10Sa15@>dV5$K$y=LdoxDd>1+61PWPk^bGdtj>dADC)ass$O= zX$z*hBfwN|1(@pV1XKOfz|@4rU~1wPFg58Yn3{44Oig_QrlxV%fef221EyvefvK6c zU~0A>n3^96rWRy_sYOj-YVi~>wPY!nTDlEHx!9ipQx1>7l;aODubD46Og08_o)V5)B!nCd?WrY2kmQxiXdsYx8oAX6qQgQ+Q&U}~yAn3|Rarlz-o zsTuRZ)Xbe=YSv{iH5)Y7VCOZ5rv+rnTqQ6y&lpV2_XJZ5Qoz(g&~$>G*P>Zq-r}ub zYRLsKwe$;^TE^N6GG)0Km|9^7rd9@msa1twYIP5oTC)*Mt-A)M);|PO8@_|7O`L5Y zQ#MP1sVxR=3=B@N^D;pPA~EJ~o5#SwF`t3KSCG+}X(C54gsC`#fkE^*BcwCL;GzLq zNyxy!Ai}`Fz?fe?pMhc1d`gHu)}KV5nNaz`(T%bPxzg(?U28e8dM>lbZ@?K@kH3 zg9^xbxl0!?FkD)|z~CR?%GA&C1Iz+xhih;Lb@v${s&?)FnD@EjRc(m z!kAmLh=E}PL?y@Tb7nGv>K>c&h(~J!MEoKk{AwKb0!oZNRgn=PI!*e1y z4Odhn@%jbo;XL@T5rYV8GsptI-Hf83ojArm5qKk}- zX7DkhON@+W@Ij)>jErXRQKGAijArm*qHBzdX7F*M>x_(M@PVQmjErVtv!EkIHyIht z;6p|C85zysV?_@b8O`8>MGqMn&ETU&j~N-w;KM~v7#Ypr<3&#y83Sf4fesxUVq6@~ zz`!UD>cN8|iElq+!0si`afHJV$$)!HpaTgvDJkga|0FfG0q(07K9ZXaWR{iZkZ=t$<8D3jB3tnpjb^f`LKcFKCe%LvV^Eq*Q~{ zU==GE7-p^QXC`>E&csJKuv;_{>CdA7!p=8Fz{kA389yP!G*^f;x$N1rFA6( z!}67&_5)~+090>6+7BQed}@rra}QKg132UET*<(|v5J8qsF^v0X<|iCGc#zO!^LdnN{|4O08PTE)P?w;HuQgH2ng@@fVK zht&)W!Q!A;LQDvT`GWWO(JU;7>w62FoZ~gj09=&0rNl}g4@i%pcSx&fguvq zlFD1dz`((~G>SK#fq|uJ4FiLKz!VM8COZa3eK2$+d<~cVPq0uU}T76U;rDyzyPshDo9SiM+0Ob10(o6HF-e>27y2heXvw8 zBWDR{&kMvpuuuq82x1>tC=4oe0%RZW!ZnaNbb;_o;B6aV1He+zyFu1Pf}H~L71(Ts zm=kLl7#@RUqCsXdG6^s-f@QCRjDtG#1t?_rlVd-vVPG%;d0qh|!k@;->5kx~LwMXi zAfafcwG0gWnPAI6-h(KN;av-{j6Vx*8CW(9q=$i(Rdp=`gMhFVc$16GS_TGo&_V4W zrNTB0?4TpkK=CAO%faEWmVrUokuw++9UytgG`<2@IDio>&cGYE7P8__I0U4Pkuw71 zCEk*?khP4$5g?5)(HUzYYZHZIkVF|+S$9EQ1nM)uT?8rtaJXnHXf7EfkLDtfI0Nqm zG#AYR71g|-;VuGcWaNa1im!vY2uYMd2-Lx{T*ttmYY}GvEhA09nbLV314H^c1_s`l z49wY}GxA&3F)%POGK0qSg+N7X=Q;)k7A0oT$*9br!y=hMXCubf@h~t5PF@GPrhplA z0BAg@(-Y5`$iN@~VlfMYSRe`JiF^zU@gR-y>L4)?i`fvw0!c7~4$5bC0CB-AunsT_ zBpVNAfjX4&$si@5li1^PL9FRa3=Hw*AQo7*5yW!lXJCj2aT7oUGe|Zbq>dR(fV3rm zSn+5185o#1gLHs>a*LmVK>*YWVm=NM1D);2d=bO~9ks}OJCT7QF&=C&=+NKz*B}`X z3w%)n^Dht=6jbqn44~CwpiQRJ*D)|~#|X|@$H2hOk{rdrz`)7O0KMK}BJF z1}&pzwoGDRNO4MHU^ujnfgu$v4ocYZfk_Mu0w5MMh{c=$;)3!xGl+->apOTOW>A)k zuLH@h7i3_F2W_5=?*(x|EM^dk8O#Fhh-3zBLK6UOb&hw|Vqi!EZI({olf=Lv&X93w z9RmXgyWler#h36-7sO(I4`P8Nm_a)V<3Z-eGlO=ef>_MF zAQni18Fc(1vkZs}W`T8pSs>YXFbj01O1wQt3Fv&2cux=uB$faom_Y}%Fvo(#Kr8{! zt{CLKKFk#$DbS*MX3(noc+jR=0Wb?hFoU@9pt~QKLB_^|O$2SO6#)4>9>j_Vv6w+b zJlOgdCJYSmXF-O70~SOugSgC~GC2MjNCL!S2CX1s2Ca#RPjX;jUhX7D$3w)RBRK*#X1_v%osQERbwGm<8%}#wUZ6 zfYw&W=Ym*AO+o1&!~)AUf>;^O3=HugE;FdTAOKEHprxM7^Fgv8RsvYIJcWTF9%KMB zm;jlV0Aj^|0vYfhM1U;Im6w~@G{F)*lYU|^7v6V%(lz`)8R1ah*;1_lOcIibWf1_qlA3=A@I zf-WFQ4k6IloPHY^7-Z#z>e3h(!Zt84$jJ-FZ(v|xXA%OHKY1G%806)JW~VVQly6{Q zP>>gF07-HPfo7E_Z(v|hlobNaEH3~t<%B@9%j-Z)c_GjY^BxdWK?pR+&p}LOA<&HTHxN?=Y%c3Y1_nh9u(^UDrY6{2IS^9|Y_2wlsSP&Q0>sn- zo9hZ<>VnM;1~K)(<|cxe`a-ek3=H`j85oomz{?*hHZm|MNrRbP8yOf>6u{Nf5NmIp_4_$CGhB{z#8xlIfV*FoB5fL2v-g9O0@L)LAO(y5>&7u+DdV1gm*0Z4Qvy4q(T(K%q} zg8T?}97EO{kmx+H=-(`8f`&*jGi5U{2!7rKY7S=o1}WPERt63_kQ_r6(`E(+&ADI? zqG`_J21)G(OMx|nX2a3|b5u41g8;~YERoF&3|dCuPzI|65ex-Nn;97F^o-|$4jJjm zW?(Sc%)p?pAT%AcoMJNrgOat-qHG3+KoHZikhMX{j6HTU1H*xA1_mW_2KJ223=E(U zQnFxRNCP#k@X-E8)T8KAQ1D~g!3=GB{2p!z% zU^!4=7Kwu7)*#7&L>Y>tK*AmfVTK}kkVpcuh$={A1G0!VNW=$O!~i6cf-GVN5(z*S zu?2~QAd9$wL?Vzyyg?#MkVOJPBL5L0(9n$r32#9NGZZC&M0OyHq=7_okVSGpA_d4I z#UK%WCQxXAO$HMTMU^07X*6M|TpdVG7)_3$s0Ab}jv?Fy5?+C@5^Bgqknj{pGY4cj zL(vS7$bN)EhN1-^k!Osc{07yv0wnSZS!5$fqybsi4v!Eg6i9%Pat6) zBwK_2_HrXGZdMFMBXEd*nvdM7(uQEXFG->7m$b*vWOQ*#12^`03_ms5P@n9 z2MM1<2s0GLf<)YqMUp@wamXSWAdxI&kzA0-B4m+bkjPnNkt&eLSA+=E2@N3ONl3zw zz-?73KI502s0F| z0*NFci);XiY(f^<1`_c@7TFCFNkbMn2oecG7C8YD2}2e+4-$z&7P$rzS%xff2PDGC z1adAo%)kUg(KC?nHe`jbK_a`5MLvQ=@{mQogG7puMgDSQI3@3SlMG5E+p0G)TDv@*6{uGDzegLLozuHb~?Jq?CcEF$Rge zK^CzAi8LYWat4XiA&Yo|MB0!={6Qi&A*Bq&xPLu8RSkO(WpKcJ=*Ls2qF; zc_0x^h#HVNP|sC@gn2Q9TS3A<5&EI3CxC?iq6tGwnHeCts|Y!UqIn>ZyT~F-K_c@I zBG6K19Y}ZZ377(MF=w#?E{H?L=wq5x{ZOs)C1gN0~6qeFK9@WA?plC$`dRK zCXl4AfTaAv?LaUA4z#S>Akk2;0GI%YLWWAS9)qO3!J=RSB*l>R3M3i~7620IPD1?al7F1JZN1_F-TTfU$j9*u!CL zKMwYI7~7wRJsrjl5Ma-Pu>(ce%V6vv3HCY|J6MLj4aN>pVDI0-zyNAfScht`&)mVl z0P>7=m;nPn>%twND{BUXFfc&+$IPG=phC=*3=B#;85r#5^0TV%WMG(KSI4fulY!xH zB?E(9Jp;SZPDqs5HE^(-!q|;G>=rv27(hc`c1;58_Aqv{5WDM61_mb38qXF9c2Ai4 zRt@%`oeT`1lxEjqz#g@efk6eNrqhBwaVGN?)G5M-O0ev31asI zu$REh?2llt*vY`K7$iO+gS{SR{=@?I=A8@-YeC{uO4vJhGBE4}v8R@^_rvtgs9>KA zQ$M?dea=n>2Jmv#ITIL|L4$JqtV?z>FbLSiu&;)BKbC=gBTP#i2LrQa6>Jm$r;T)=$qnh`qQP{NQU3Xot)460ioaQ#kH`1U7&ZCj-Z05T_5q$$A6gOn@83 zko6HHFcBfZ@dG5V5*%3!s{eN}FtF`rU~rrXG8ilfCKyzCb~7-Df@J2S%0TUr1xc*~ z8w(15hAb73zkOk0ma zVi!o8xa!f}3=EfcGcb4mVv$npnCRe+^XwL#@0LGmSFd5~c+M^2F0)=1!BqJAsL`%Vdf)<3Wxqk9NbU!l07)cF`xzL#r(+EiE|3(O z-=MA$0!hsTyAe!)4FuWBkR=V0ngtdG69_-3D(`1t&;?01fs{g$1egWZ4(@?unStaJ z!O0%vD26N>kN~9p2ohz;asmnDfh4)rTR~YsrTiI!>=17M1%{^}E(d6Aw1T<+ z1j9=ZmlMi8!tfr%YG!V`2V z6=SY&I|IWp7UlyC44P&P3{_1198L!q7(ja`K-*f}4=^yW&t(LyL}94Z09_Hwz`y{} z=+n-?V94TgfPrC+DM;hQ3S^BHAdNBLgYG~(Nk9uS*<%<%2NN<>r$EhttR0@z&cIM} zfPvv6*c62I3^fy=>L9CimmXkX;1L0N7Sx(#s9@^nSOpRi0|_xOR10WAyah4!MLPq- znga|B3mHIegP7_L+Hg~C162n)L5DF{po4*74_qC@4-j={pz0vzS#&TkoH@Y2AjX6+ z543lRq521kx`Yk}2Bw1y42v<;sc1pm7XeiX-c?qCpe+i&{Qq?t3 z9gy(e)xp4!caVW$0WZh}5FMa9wLyz=pB`jj;An(w((31U1?GWvUx6>4M!7kgq52Bc zRLJH9flda7_gGDxSb$=x1b$O(pnJe9z`jfCWMBw6#K4fmhj1(C`Uj9(XB+}ui4Afq z*mdA*u^Fm6p!y-9y{wagVa_22hSOmE{Q{tr1-dW1j%i{&hc75_7^=6R=(qtouMMPw z8)PFSz70SNn(H4x)j<{*GjuU9s2*luu;2lyn+Q(qrXY3IU!dwBsZFDcfg$}cEFLEo zfLs8Mp9aPf&5XDvt z=q^C8qWqcN3=EoJr$HhHWGh1hV+m9d=%#nZ+CeXkd(h z?$3h+o^=lc!xwN8gIEqqVxU9~($1O((hb`D0E#2lJWw^o(7<>AWp`Um4+DcCI0r+* z0hEIoni!uz6+sf|!X5^O_u!-t2?tQpXJ}yj0aXO?#IYU*hK=BGfS3dgECoYIF$39B z@VbYAK^nF%>{5Wx9SB|69*5&s)>mSpkx85 zCMISeR}gcB94I1(gUs1c4nHGk$}QY0Gl}nY^FC;zeYMp_AN7?J<`E@3{8xn zduu`20^*JCJ_d$DbZ;~ zfGS!8cHy=O3=D2yMUYGcav`YPTYi**f&B_N*)hal2c7r`TH)NtxB;7^IxLJduH+4qU=O+?)=I<0i&C zP(@(F@_$TZU@&n8I|iIyazKh&7(YN2K}=6~XJDv~0iBo3z`y|ZM6Sss28LZn85q># zzIqO?kgZc$lNcDT5Z2Yecn7Ktl9A_5Vqn;7kFW@o z_(9nXl*m}YhcPiUFoJF{21OXe^A{#DFk~Qk9#p(CG%;FOL9#N$^Is=1Fo+;|9(0Z( zLj$7^R1w4^smTlsHkc+AKovnuvY*Vr5DCuEklG1UATTsBwm=m@%B+;h3=9h3LtqIovzDN6fy6M#K!yg!Gf+j4>iO1W28KLvR!32!0NwTnG3ozg z28R1!r=ckFfGUE7gvt~Kh9IPnfF`IMs3J&6curwps6+~hGEjmN03G)WF81S7r!X)G zfGU7^5K-L#)eNZ^yQVNOygSOkV2>2p)ib~)ioj|$1_t(bOrSGWVQoJ4caSVzZDRw8 zR!EU_VG09-(J=;waIh&54}nZ!sLz0^1MLB3%>OZkfuZOa+%|A#1gUdonuu!KL=I3& zgV|QU25JfX{28n)^E4Kp@L z@DZ)BkYtmD6xB_P2~ZQj*5r#%V_*meCmx8$ped{astD3Ju$jidzz(h_APxq(1yl+{ zTc4n97f7v75SO8mQ2@GM6KqfJ0a#IN4X;7KuC!(Zb?o6A7QwC09H>r6^4>X(f#C)? zq9K;U$_9{j);y4IwAN?k8mRsrP|2D5e;TOEE`J=}We0a_pkBxT$2+{st^g{cVO{oS zMhgc>jGO@*Hwo2lOb+$OpU&K#g7lJ{{22KIZ* zpbX=c1GS)pfq}uBsb3)!BzK<~9D)q-pzSe@j4aU67D#A30*B+o3N{T`I6`7u100T^ z*aq!RWz%2;?Hh#$t0m~<3fSql4Dq1BgI2~XP=mqQIydz=0|PT?2!A&&?3 zIU#%Lz`N=|JJke0`|$hKI0F*ZU&hYJz{qofk%8ech;Ih=0q+Y& z28KT%zSC-uJVYzV7Yuw%ObiSPObiT+&WvDT20ncz1_rPrT_7Udte}0RZH!=_fYoqs z(EvNM=Q!xp53tu57?^j=U|?YWGn0WqfN>TBgJ3KZXgiN!CKCe#I|oZS69a>AH4_7a z2unQ^=qPL>Mp2O4L3@rxH*+K1k@A5NdPhnz59%E$UH4pI&=XFALRkQjF(NJ2`Q8M5b? zeI{c!8zTe6L&%yyccg#~`o+S?05u$RM+#gF*`=U6Qos@`L54$Y1>KPX7lYaw53_YG zvaMiEQZrz38}pb9~Eq<|HI4Un3^0>2{# zw4IcZa~;T`Qjb_5`-<6bF#3UxlZ8a9c-jiY9VyzZP$f4R3&BdjI>k*^A?`>iWrghe zWxs`NiquA!@NHzBQmf!L|B z260Eq1UC2`DM+SBor4KKN7gCD!4AJ81<4aq-t6!@Qjmqa*x`4iAXzVUo*jNi3bL>O z2V}=K`wvD?q`-pKivxZ~3bOD-4)`4@-&jHE4(v6lOC0b!Qjk5deT5G2;6n_%L_OweKw;Y#U4{E&m`!FQy9HGzst z1}SC%_#G)o=~yOM0C7hONHv4ZJ^{oXDIgJUP{qO^qbG>CBLyrBvXeokS`cwZ3P_ki z_KYC>juem*aKQy}xQvt#XxBRf1N&qqaKQx?E`nU;IE10X z^N@rgT4cS1;di8f(gVaMuqR|^!K4;3fzk)WZT6g?LU{uZm0*zhB!;*n1*{4bD-1Gj;)pv^K*9_%3&a^1 zUWqd>us>je1PnysKXJqzDIkTANRy3_fZm28z}(Ev$N&xu2H80uH!=7_uB#pX{XL3=A44z~j2$J5t!$7$JA0fPD$#af1nPJfPi? z0rM+zu4!tY3VWz2|rN6LF+Mh0$>dPvN{???fOGa&9r0dcv%7&9_3NO_)swzZg< z{~0qfFmod07-VLhU|{$Hay17tq(gH9R4_xL0L+w;KgqyQa*~08eH)V~NCY&`h9ocE zv5bLX9!TDfk%5)fR2Fm*N&vjMD-Y`BAZ}b?0-4SmCJVXpgf$ryB8;3MQOJ4)z8+b~ zjV7QQSHQv`6%aY38&`xtXC#3vWesECXH}7d+_(*D`hw0(l8u*xn9s%vp6%l1VPjsQSAKsMI# z5o%|_L}#mjMImY*E5NQ_@d7mvxc$Kd*%cyI;zLWzB0Dw{!p&cM&wrVP3C1f&EM zqRN77j10v}3=E8lpsKV2#L@ssA}&3V1vv+H=?RE~dg%#Rq=S!vfkE|zGVIb5PzZ5? zWEg~$pzS{ncU1`$sC+UgtT+up1`DaPF*1O95F8$AH$WZ<11AMgK2rjlzzuOaE9)E; z1_lmpX>g2+pJ8BNmp#M4(6WMofm;)jvK7xTFmTH$=z}P2M$XM3<9V&mFfgQnL_#*N z0L9u~kf;#}Cy$ush z2X$B=wsC_3lYy7@ECYl7Sq28~EMyHK14~tENu@F_f92a1*iEaR|$pu(!V(5y$ z0Ef?NcTO|Vx%;tUF)9L8-3iAqoggaku^79#_9supNuO_O!k z1!#1Gq6i$_pt2X#zXL@#NDy0eYh6=eV9?@KWnkcE(N$w$(BKn=*O8*20%8|vOy=GN z28NI|3=Di43__rK2V@eTGWbX{u&^cv`!y!05-kDtyG#rWuQo6+@M%jZJioxez$d}X zX#{FDnuA)nyx%TBDt=-k!TNu>997`~V8)O?)#2O+3GM@pW z!3H7{yOx208%%&z3xO(b(1;bEB1iHi1_nM`urjC~doYJP1>``8DUJvcZm{91#h0Mr z-~gfxTdwo8!F6+ZW~YZ(~8G7LhXkXB-4VBk|#{RNZvcngvTdrs)bTFBT7pPCS? zo581|YJV9r3d84#FiN!%Cg_FG&voQ7q;JUQ3$aj@;|c>q1QP=TpFhagoM2m2eXc-8 zD)<6GwGvct;uXlK245hO%9~dh7}T#aFz^K-37TGIU}ypf1|tdfUxf@5@P+PK2ls9! zJ7jc%PhJSr$N-J*@ky&*hA9nu4pItslTaQzq@vb?#cP~eM27QGHr z8wU}s0L4C+$_=R6cx2K18w?EFZ!j?MC4)s7xDMWcj5+Y7Km|B%Li(|MXBj`xXUw5JH$9_nwQUnx3yiWI^ zqR>{QBv`cj9;{XAya`mJLDXJ>iOx<2i$c`O-A8RzDuYcZy$@?uYJf)kxxu1*XYWIT z1JtSnnaQmSQmi2U0IjVE@&LH42v!7cRf2>-hbYH_)N&|*3uqi|MFy1)B?bnN2INcq zSV5&QXsU++(rnb=1dBi#iHjaU8-cbU4})cp8i`7(pJDQLAg^epV}TWFmwn#kL`cRz_1zQYnyow85oYSGcpLhWn>gu z!_LUC;voZr&>NeLF!6VcOg39#ocD|@HoIY*4~!f(`(d1qi~=?%V4P2k3N~k9oX?C7 zHWy)>FN_V0HrHXiuZ#^$HjiMuZ;TBrHm_m4?~Dx`HeX@9AB+tGHh*EfpNtI(HY|^z zF8{^Y;9$c8}PL9x*U5b}%wL zW?*1q5aWBy!0-*ExsuUAO#CrqN>HeZ(L+oX#;Ilu=wvi{%)k(`lYv2~o>9!^F$2SI zke+772r)O9vKGb!u}~PNl`%ss`7r|n0|z66P#a@`ST0Paov}i!2FB@NY>?`D%)qeh zF$05;3?nFj7&%!vKqDJ#V8XIcVSWxq25yiF2C3tZ85kadw8&w~J%h=~qsu`wOEW%U zV32*nz#yc+$jFIgsLB%t1{aXH5+f*XVD9jP2`fW|!CF8n7^HHaFfeq2w5UMkAWrXx z39CYdk+iIO!oYA5q(y@nQ`nGLV!REJW6AVPJrC5F|jwjgSRQVlpQvZgxC{G`fT=89#ywWw1Hi5V^}w85n+o z46|kg)k%!pAd*3f^BDt!`ZERwAzMaJ`i6$CwEi5daf9+YgOtk)28INX_Gm_s029Q&(rGZ^I27g5 zO)nT2HiML>z{GcLVPIg8KJtQr;VDQw6($ajEa|r|7#Q4B7#M`oVB(X#!t@N*X@K4#vor;F2cxCAg$n%L*!K7{KFti6G5S zwR2vA7ARD_WMJSBuCc9u$-p4O!N?%o#>gN9O2#cO85o3{ZF^zj?Tn1JQ(>GAMkd?Y zFis~UhwTy=r;Aa*7Iee{*sN|w1=}?+nI1+K+pRE8FQYyC&X)`fk{~NLGH4xs$-tlh za*OZ;Mou|UPK59#LU`QZ%&8AnFbOIIT0_AA5t6gYGK^26vFuQVgk}R}2gVAgMLrk_w`Mr~DNI!z7UC zTCn9@vtBVUoCEPUgToH2id&zPk%9XRX!N3+QTZ+d1Iyi4pw$$@do(~i21b1lU-%#s zr!Pn$c>PB7V~`<7KxGq?{cZ*ZuoOcN}{_Z7`)RM7=+Jr zu=T*$7ZpHig)cL57J&5fO?wRu>njiu?oyC2MA21bA+AlY85kZ$GB60=fN14C{~FR1 z6ut!t35Z$-2G!TE85jiLFfa&jtLJ27KyoL8P}v>^1~W|t2Jv4aEVh~q3=*OXm_$Kq zP&zdk7)0-=GcZg5F+j&LgN77zW@s`ngmN%4h@N3;U=;V$f(&$vu4K|#3X?gDxNMeD zY@;Rv1L$~WQ2}NKP1bE-8`zi)UhiRG5anQIFl3bw z0OlNJ5?~Ow(1MIqiLPbRWPJwKeHo%V3gnHeObiBlK*n5S5;tOH6urhI@1o7X05LKb zq~a!coeL;PKz&)!WlWl^@4&_|GK+oDWMC)(DPm@3U@-mz3jq;kM#Lq`5{z0545DJp zjGUV|K&x!PTuCUGdpk%>92C5uxdYMVOc3P?F!_TZd5D-IvKT}oL_!rNaT=jm7g-Eh zu_H_ZTuOk#i2-7YGlm3rE5bZim@G&KHz+iq+Pq;BAeVB3Wx)iJUO!AFNV4fLSsVgwKCS*C#ncxgk z5;~BfA<@aqufWa)xrITT|1M;0j_3|1sRWpkY0SI_5Iz#Q3mG30-N_`iQU@|BBsvq> z6sh+x;W@}UrOb383vWahFvo!ngxD#07qT`-bQhCUJxs}B=0>m*NGQtPg{;jH-OVI* zQkQ|@BpU;R=rUweq(IxKz``q$bxK9(LDuGou0?UmB0b339MKIZ!msooYjZ?5qZneU z4_TWdx(!9RP9HL`CAyOtl*AZ0!H$(Wrq942U;sKr14UTe0I~>2bPtMfvH@hwOLQ-? zu=IKZ$Z`tNgU}QPNy^~Jll}>lJcKOCAnjzxz!1vGz#w`ARlLWLf#Ink1B2*!RPo<1 z^_QUH4AQPfkbx`FD{!G{Mvw-o=rx#-)IB4}=$+^dW>8H7^SQb)WQ1Du7ITL`D-C?P=AiE%>4>qJ*GNrCnNrE@Vbh~C98PwJa7WHpiK zJq$CXtW6+8@1hTo6FwxP^}*y`Bg;WE3{36~vK%ST0KA5U%tg0BK zZow4PU?>2)3mpGasCj4fJ51Gb+^WEF045luI31v- zZosY{DK;WtN;l$G${@82rfL&*RY(E)8K!g#vQluofC)&digJXy@BnsING?18Q+f!u zQU)niC#Zo(u&Y9HVJA%KdF)Cd@y_JTz~Jl5z#w{=1*8{JwQx&=I!PctG^B%^85rh* zR9$5O^%$V45DKK1I77PcqBo$$6gQ|`WsrL3%)np(>OnkY0r?f8kwMDb1+orQ^f8KX zJxur+3&;hK!jnPjmS!Qn7#~Cm5y5#L_J6+gOr*d)W$+&^&p=yNEO56ijd_%`XDAiR2_n;D#on} zte!zi$e)3s&Yyunw44>uROSYC5gDYqU~<*Sa-gtbkh%qvt4EfDSg#Ynz%Vs{fkCtx zSq@_6e3)E2vK++BH!!(wWI2eL)`5_DRMELeatzWvfeZ|f0vQ-Y=d(gfKk2W53=G~u z3=E>=yp~G&=?S?2f!d3 z2NT`J3L1!jbf{!j1~V}H1(|Sw6+C7EHG(gMfgw4BfkE^HIAuWajlz~C?IkIBwPzHuhkmxI9#WGVu85o{{gx?_x%YF@IVDJcIU=aO?Y({t(1H(Fy z=vSy>&?pdt?7=Vw2JvtP2GJj^AOWz$8DzD>p`yQ8m#8o>K-?@|ss&kiDY}kHwlSQ6 z;RZGup!y87$(Y&q*mr@1OtOzBm;veHyhL~u91+n z@1hcH@bt|fGbIu-h9{~7QHNeD$h?3lP(fF~AY&2*)vN}U0~-uZd@^-W3=H?87#Kti zpmLye2Z>6VA5jbpp3w{pqE1jbus&P_gG_KV1H%@OdKY5UgT25Yb1IsFK_-TQLDU~f z6N8L)3ftMG^e2RrE zsTZw;%7NM>kcAI2pc~m1i!v~X)*#D)S3byGi-Rm#5N$(}V~{b3hYI&02}7N+0wy;V zSq|(BS%m}!hVldk2GN;pAP0bx10;-OJ7H3@(4-&%BKt6bfx#@1fkAXGc6rd@Me{)N z%aG(jO(%$cnN5k19UP)-A7*e21^+45>NEjoin&Nf?84f1EWB0OGKv(D)FffQjfNu!~ z%QMLSOolYoMA8|-YQY3Z12@=RvWh8?*(Z@qMsJXTU;?g)LDnY)(i#>iz%E~u0`+bc zl04XakgphIXQVJN>`7r@5NTu-(PUuY1`!P6AP*b?iFz{1o=st3_zq$>GlH~0RLHWV zGBD_-GBAj=LiB;87-TI|85oj5qV1620htETV3MB-nSK=M1Zxmaddk2c{f2=-#G6sP z=qUq(3W)6mS{HgYje$XeBV819-y(S3HfXRJyuv09G|(*%xZ%mZtv{=)5V; zeo!>>9)^idegzht0v6TFfUU5}1RXgARXYAl?zJGr3c7C~D{MgPUr^U=gB5|6Y(v&{K zpYRzBGtl7t1rA0AF*ZgAdi5RLgXOoC1L8pqwOH086Xm%NoJ6_ z;K@1$Da%~Q@UWN%V=CytE6&d#^Ti8wA!EN{42(h`6CMaNFo^w?D$9io1B-bhtCrfB z3mJPA^FtASp9>j#6$?ZW*3N^B4vU2_)?5P(9zv|-f)4$PF)>PI=0S#j#ln%5NG;8S zjM|Dtp$I?8gN)jW#i9r+=0iqp#S$4o{%3@EO)54YGHNT9f+9Q{B+SXcAeN3Id^;a9 z04kOR&IvF>Bnlt{pkjH93qdDofz9RyS;HXog99=ED)wJ0umCc4DOQZ3Oscy8GMFY- zjU>k)b)o<=JSNtNBFs_<>9>ltGlJp<>JDj#LI#G`LIwu0ZdiPS-5@==kb&U_NPIG? z__IPtN*9|269*+91}T*yNbw`KjIkPYz8Azl0ico!WFW+6@Ow+eSQw>}iy$3yu?>u% zsSk*Q!0NyRgVdrTNaI^83bGu+Mu@8SFjcp3tAbi)TmmWZ#U3Ju7|7vJ1w}9gFOe01@;p?* zdYFO_$O=FX0V@C#3{vl5s(xTq#UQ0u3hA4RF)|@V9g;)xUq6(Bie4NQRmvI2C6 zyoITfz^aNtO1BKsc^6YeR)FM?GMEBQWCchL*$Y#ki>v_MA?)Q)drYyaVvq_bhjj79 z?2r{8Ib;S*fg7>{B!}FCDeyv8fbJ0W3aC9nSXD7dRQ^WQKqfR;W;%-~?+07*+s;WPn_WmH8J!sK6(RL3L-I^iAjJ7A)^mAdp;vr9c0-FpTJuN2CKIW3=%6K!VJ9b zZy6X$K_Y7)p$xK*fw%1~1H)R7=vI(R896;bPGity+5VP+fkV=gsgLpCTLuQcdkhSc z9!w0(;vBOW7*4%qV32fSvH+=(v}NLq0qKG8>>xbuM39i|wYLx-O4>7JgS-e*2$5n4 zPRN3sl><7_gfaKiTLy-pcMJ>)rQbdJzk5cdod zD5ZhU&)E#&f?B?{p!4j!nI=Yn)@>+UV&Vp^#KLTVF|e}ke8<4RAuoj~r?K-s==dJ? zkM9^5mUA*P$Qv*Sy}ZxB@beu5gS?Ic$9o0_c_T*72cU?23i75U96tYB- zSMUP^L*NGn26=l(%ue9~?dIWUjrhR8z$hyr`rtkT!;B9M48EXc-oA@KtTiBF>jwq~ z26fg0AZ0v8{fr=AvRwJVz~CVF3el?)g{`}Z<@g9q+2HlJphZz~nv5J`avvEO)^IX1 z$Z0VOfZMO2zLs2*m>Nu6n^8hc56019R1h&KJ@NWDFSwJc`9U`?2tl{lP1_s?v3=DF! z4}ce5fQ;b=IhY%~ij~*=69YppNPa%sLr~KbEHC(wfq`3PCj$fb7tm=!LdI7hT^hMo zA^R(k9*tZZ?~G3j3?D#Rmmp~cF(JBme}7_NF#pWJAh#0K>w>tIf!F>s149i+bREb6 zFwxe}3=9WAqFd|W&R`G%^|C;{HMthvD50N7+!$H zxnSZTOTeyTn85h<2V_OHoFHgnGZPai7lXqZk|`!K8vkTq09|Y(C&CEM089eRNQ%Hl zf$f>dSn!j9;m}V8202kiP$Fhz5@116iIycMGM)k{{l&l_Ck|82iliK50wfzuWK{db zzz`2oDG6yqGYPOER5DCtO!>vYum~hC!w7N;Ba;9-iu{^i3=A(p^0F{_4um{7ARu{p zBIAc&3=Dd|85rc`7{LjZNq`ffl3^mF#cu|NB9Od1Or8rxzT!6n!#0q-5=@>OAvf`wwW5 zyH@BQ1_q&{oQw?VApYlmMo`_tQuv2~VS$1t3ua|CiE+kD1_pK^HUSA4HYG;J*u{UK zWwieGKMV{COBp$NxfmI^K@raoeH0|L99*D+%mqs^D1a5NVgmEHg+O%&@0CB09I3Dl zR2w5p@p1o!nB1*$PsEB31jBfnnEQ1_p(_AStLD)xf%r z!lVu&NtuDAg#STx9Yd0G14~80q)sA9foekr-aeSrDI}>du&zTesnbYOv0$lhFsU<0 zQs8XLtMwo1jI&5mpsgkhym2t8b4XI4h7|+vB$(8BBq>m9ih=hSOzHxX6etle@cx2H zT||;f0lQF-fe{jhmyo2g!BR;usmn-GMPR9EFsUm@Qk7t-Q!uHkNK&9PS{Qg47@>CE zLy`igDPDh=)I%hxd7x$(Zwp9@k&!{+DUwv^3(!_+Q2PheOi-B1yN{8P;U`GdGbB~5 zphOEQ3K)3*Gcq!mGchtKJV(eg@Y*slGL(WuU$1!qs`-D=grxW@2PG1yb-9 zp^Y1)mVx&IOzJ(7)TbBF3ZDU9!7D6;`r%*ded4U}j_p zWoBSdU|_7b1vL@Dn!$3D8Oxa&8SbkwFeorX2b)?zdKeh`89_T(Shg@TGR%;Bi>0}y z0g`866nn(X$nc7jkwIt~Q-|0~W=4ivpgjo7nI?$C+7?1lOp_TuLhTXCfcAXegX(4} zB^E}8AQnajp==c47#2pzc9t9_(0&d^POxg}Ni2*ER{RVMLb*(goIgQL0FW$$^idW@ z$aa=I6mhBFER2xtEcqy=>#;IIwzCwV2q&;ILbkIMq6klBWrS>JDMArG3OaBRv>BxY z#fkr6!lfuqk+fiAWDu%^iGkC07o!tMu!;#>VuA`OoR@~(6|CnLi@P`X+K z6Njju!pR8PkFx|O4h}j7J5>$PRXcWShM;39?9_}veM37n)6R4T20INGFi*pEDHkJy zorc>1Fy($5OnH0+Q=UBBAUQ83Fy(CvrhFp6ly4rG^6Las{`0|9z%DQqcoR$oeFjs( zoID^?LX^Q&s4bWZ3kFl+xnL@y8B9ga15;6(c^Db&bzB&afN598TVUFs@kcfTgS}1w zBXbUj4r2TO77t})!lv%SbR%OA zm~LU52d3K?H-PC*#zSDbhw%!S?qhrgrYA7|0MnBgx%ff$Ol6b-(=!;2!SpOfS1>(? zF&s?KW6T883mB`x^g_l-V0sDTIxxMA@hF&H!FUHuuVVZRrq?jC3V_UC$0!b_H!x~~ z=}nB*V0sIqFPPrO7!Rg*FcyO8U5w3OdJp4NFuj*?Iha1cxD!ktVmu9|k1#$0)5jQp zg6R{C0)im>PBH3$=`)OWVEP3fXkVER6zCzyV~7!9T$G8Td9M~t0d`Z41I zF#Uva6PSL=cmzy8W4sNfpEG^}(=QlVghBSaWE2C_uNXDJ^czMiF#VR%2TZ?Xj04l} z84JMl2gW8a{fTi3nEt}J8ccs>+zY0^F`ft0-x(i*=^u=r!Sqi?E)kG@zZliP^lwI6 zF#U%y1Wf;B%m&l{7;C}wf5v_=&A_w}OfxcV2GdMTN5M2R({(V-!t@eMvoie#(`-z< zq9A+NndHGV2a_R~=4A2!(_BpPV49n$3{3MdO#;)rOiREtAJaB4&ChfeObakQ0n>s^ z-$WT1>Gr-imVlXwo6-+Id0Hzi#0#l3Ef~h4t zz|_*iU~2g}Fty?)m|FP+Os#qkrq=udQ)^j4#hk%90Wh^*8cc0e15=v}!PI6OFtx=U zOl=DSQ`@g3fSkKC1I*i145F;Tr|H{Sr_2WPQjdVCw6|a?onMTR!Ol8E0Ze5Yf~hPg zFqIt)rgDnFRBjKL%3B1c^7n$Nf*W9}@H3by;u8lMRxAmoO4PtqsSTJa^8{1nQDCZ~ z08CYugQ==MFjYMpOx3OcQ*}GRRKqzi)yN?MGP(&=YT8*htAKeereLbo4NSEqfT{K} zFxAlmraBjasjib?s{1~e>iGqxCdo@OGO$dW$H3rV7sq7rnSsH<^)m~IW)Pk`kAcB) z**pdY20I6L&`sHP4j$k-$H5bHceR~^7wC3tI|m=oMbmZ;ex{O)40aCwE?_Dk3QPr- zfT^G^FcrKMOobc(Q=u2ZRM;ah6~QLO$YAH5t_Y?w%)nHpH<-#w08`neU@E5zOy$l8 zQ+Zp!RQ^dYRd63n6@CR%McmRLGm90$REar=^2+uFQ#qjPY3;mn!9McJzb?bbVCPlv z7EBfX15-r;vLL}?129$M4yH=uz*Jc^m@1zHrYcr~smdc@s_Frls{R9}YGma=rqo)1 zsX9+ERi6T;8mhol;}kH}v=mG=?*>yX7r|8PM=;ecDi1QH(*R6$dxNRoY%tYV1E%^r z!PJClU~1xWFg0lhn3{4FOijHHrl$P^Q`7ksKxWQR1yeH(z|?FJ`=%|?=mpuw;N3PUjhAtm6r4JidD(~vT-J44FB(H~M_4pv#|2d1i0!Bll4n5vlrrfTUs*Mx_^VI9x)Y= znZ1T!s?P^Z^{0cW3AJEq;tVh~X&soFd=gAexeunMeg#w01XMw$OxFfeGhD&c%y=+0 zs}fAjo(!huYywkrPk^a;H^J2W_h4!Pmm0{Fg{oj`kpq}o91W(Hl!2+Gv%u7{)nID* z9x%1yI+$Ad9ZanfR|lE0+6YXo2?tZ_YQWU`b}+SJE|}W19!zaM0H(HFQ)grdzT*d( zRPg}KVB|jIWMt6bVq{Q=X9o2|;S(t^ZodF{A|;*~G?4-y=4S{F@Q0WJxr8r}i;-a( z$dngQQ~Ei;(=iY(=8zPF{|%^q$ej~MxEL9JgSzv3K>cOV-3vZz7#O(sfDRsWW$I@D z-D?Bkfe)Dz;bvrD@K*_dIH3mY5ovBlhFES!h6wQS;h>9NK$lFxc^sfSrrWj+ z5RP+M5)Lr}d=WxEsHyM4!^jXN0XoVMbW_iz`3wwE5}-3{z=s`z?e&a^f@p%={ZY)r z$Z&;+ks+>`IfQ9qMO-s8NI7V3t85hmNECFmo-upbf&6U}FT`|G?1?;tglV)I$;a~)% zlcE)1CMaPr_`ivPsDuPr9xo%qMP5b*?ysPMEmtOJkbNz2VPpVB4LHcaJWN8{0lM*6tQq#0VrZ&yncxYxJqzjfFl;9FOiRt zfx%@>3{< zLoGieL%iuj7Ld0lR)8I53Nj4jNwC9UJPwe7@nBvBQ$P5ot9bKe&Pd4)94Dajj2QfF z5+Kfm+@Q0RpOHaCfRQ1=7HTpF=-5jL59~P5;fbQXzZn=nJrM?e)^Y(x2F3(KxSS~{ z-7>1q6JTVx4Kl|VWDfW+UIqpimn4W?kc9eJfRRB<5R_0sc>|G9K|Jv3x8Q^t>L$p@ zkSEBY&5GBO+%WMqg|0oe`;pB<|i5Ihdh z6(i9qAbY|;{AOS%fokSqU|@(=6OLe-Si$*+0h(YzjzBsH)(T`IgUb@A7Kl&&3o8eIB8!+op#v{O;9P+u5k`i%Ma(FL$YLyo2*^$)2LB&WOCbeCrU)a$dl5#4 z6vcPYoB;~^6h)9}pqK|`e+UnB`7Fp6Das&sfKx2UL=$lxZ*$dD>w z0WLu%a)30YN`MR$1rcCP!5ukJO`t1Ia-&2U89;rmw0c(1QUOrG37YXoa5IF(7#Y$U zSV1M2Gtc^gE@%b4d&NwfZWWZVFMDI#tPb>#(<@cbP_0pct-$K+~hloF)}O^V`PXF1eLxV z#q$|J%ndG#45AI-Ntl7o9XYg{fkF5q6Ql7 z5R)5B9B~E>$s0;AGK7MR+<>eKY$R9}h+vS4m0)CO0;$@GPgS=BBLnva1_t3nOd#hl za)NCHF&U&*!sJdMn{X23eux#PB^VjLuLm92f~ol>OzsK}&D@fZky_zf$eKa%%pj!> zlY0POM+0>gD7%1H0ds@gz#!!%2^kC)eg+*3hPxdy;475@Q}71a7?9f`!3naA8 zqvQ2Muvd(l8g+OLBc;F!d;9HK|Bs-(5O2TD1Curona#53rR)> zE-6L^VNPaH=rMvOvcd9jM=?xf6qSN1;$jB50z8L}Pz3T7*kKG48Lg!l8Dc@kal?#b zg;_1UQfsp@sfL z#ye7s41Ymp@-u@BUx_&I9LAY2?hQu91_$GO822W~EEeN382=%N z&tY5x<3D0#Y+y9*gmD#^7#p~Z`(a!~CdLLY36ST6m6;eh=YVoFgC^@#kZ(CpGeVk7 z@cIaRiuH8Reyr1s3__sm4K_4r>`0xEwiWfzILw$wLYz1+Z`cBUqe)_o6f-_$XYi5Rf)T&iSD8p?LpG zGcw4qGB9vOfHcBH^<)?sK<9>W#UP0?MDfNmFt9|+Ffs_pEYJXL8e(A72XSSVFmlcS zO}Bv#)M9`LErkk!5*332Sk(%s&|J{eUUY^GBZJIJP%dNaVP#|h8^FN8z?{vbbf9;=&*mm$?HIem&JoBb!N~x`|+Ry<>PhO7#RdWEM_wh3nak| zy4#D{6~qOzKu7aK#6Ys~U@_2TXz>{!C6-JK4Dm%E)^rf72E+o(wt-mA{0t27ATIM% z5EtYcX3$+W%u7IA5Gw&J3)036>h{Hhl^g=eg1I0<@C(T49L%7Dx8p(PFh2sxgSlV= zWHU3E068Q9#EREl!@$6NeIo+{Ge0{cg8-NXI+&VS4#WkszywGl9?Syih_?aBf?3Db zFfhb>gSa3TGe{yHbgXWCJV*@0N&u@nzK($*z8EA1VkLkG<|cMVhQxSq(15Pah@S+K z2C*QQv@Ha2L2(ohy0a}waLzgg26h(a9qfz@DF@jZ84j&uU`Pe6S`Yvo94P>rj1>T_ zXJZB(aL9b0osnTGBlj-QVTYim4`exEJZRpS8Kj9B)WKs0^#Yi=I2aiOz!D%r0CXxF z^TVAC49uYE!*~slESO~kVu6lciwA8QigyHYK`dqviy6!U6=VXS-F<1Gt%2!j9E=R& z3>lZ!F)(nj3qAu;jA6=|3QYzEX3+Uv%rik;FbgCL5d&=G4BRRfLS0y&}9Py11ksfMUW^+Q9MXK9wfyKYCp#-fpmk`1TlXBDFMxO zGlPhDFaZ)v0I`@sN)kXsJeW}AVq_2iv6!{F7#Z?GqfC%R56speK4_Ab8$>WLdxQAk zLO&CfK`v)doxYucVLM1B8X*HQX+OxM z2y~Nm5ja6uRhFkf;|{PyE@=z`(YHfk876tO;T(KS&@5ZYzUq z(PjpQn#~Lh+Dzac0ylWUlWfyw28JGxs1cH=>h?_x4Er}RFz7XcR6&#$E#Az)pliYi zT3*EsA{dHRf-8^f@3`IXc zA{9s?vi~QV9%py^c+!`b~kSIfu z6iCY(Ns9}ix_}JQjkT=Kq3LiBDNrr5M&V-kVpiwh&M=N z39?8aNaR041RA>0AmJ?tVTPgvkjM^Xku;D<4zfrNNTdK+q!=W^&jbn$u*qP8p{Noh zER7}%m8%2E38Tp|6t#ea#W94tK*B2!RzeM#2ojzGUaAWfnE?{nk5I@^v;ZXXj1ja< z5vpbdNaPi=$VQMz1G26iAdwnmk$oVM7G#klAd%~gpz024@@bIBePof#AQ2WO(3(a_ z=~Q$bB*F~wA-F6lx&sn9k8JXDkO(_O4Lnd8iavpad60xb37DbiA4vE+LO;|ooLdb3^ivAV}^qLXM$G93*lZSws#bG6x|7*|1Zj4icV$Bn-)V`XJ%M2w{dIbCAe; zWDz@%h#4cu)zIR~1temHEaC+cu|pOK0EsvuM4(#3LBb~y!VE>RAQ3lYktC2v9I{9T zNF)ncBo`#I2w9{UBytv6qzWYR6(It3LIX&65|S_^aN9w`eMrKP5b6U7mm!21iY9|Z zs*puyfke6xB9MZqXaPug9g;982pNi&f`q*g!VE>LKq5)VA{#&=n~+7efkga}MRtQk z(vU?Cf<%IlMNWW3!jMJIgG8c`MXrHFmLZGW0f{g&ft(8tGcdtW^b91t4O!u9kjO4% zk&hseJYy&DiK59d6!C+EB{76WLBgvLRzeMt z0SQlolsh25F%&6-L=GYpG8AcpL|#Bj8HgHVkjNWk5gU+56S6L6kVqY}h$l#-4Ozq= zBytl{%0NsG1BpCD7KsCiutNL;DP@vDA{UX($peXSLezlFfqJeIB+QE;+zJx@iO>&K zJpm;A7fl#i%FF=CT}8+-6wL#P+(i~y3KE%z5P_C5>p;S@kc1(5Xd6iQC_@7$XA%GpG@#%CU)oK>#GZ3|vTq^gyJuWI>`U!GVe-stOWa4!01j z7Sfl^(g8`Wfm@9%Wdf2~51Q%$yBk@`1|+o!w9Fn|D%%w#wFu-}4lfXM2{(AE(zU}eau1{vF&)d-?m zK^Ad$fX3IEd&LW4TZLq1p&SQ!C8Q^dS5e%y5HZd?<2eqnafR>JNg9O0@L)LAO(y5?zW#BXlCK$3FfJA4a zt9=F%odb3m$U9(nFl4;}iOvIy?v-F<0DB)I#e7JDkwNhDCeVOY)^CuqJz!hBpDe5Kn7%qY-V7vH3A1HSS5&HDBih) zf#JXo1_q~G(DJXWV<2WeII)8kfN_He2G#RB7#OaDWQsw2?tDp54gf8=$pW3??^FgB zZ3T;hm|2fOYIDF&nGF_Q0CELb!)uUK9$0D{SZX&&3aslRNU9KII5$`->jy}n2qB=# zw3C5>XD0)LQ%PVZ0|TTR31)%A7;IIRC`kS|IPheo7@?PAFoV{wss02Fs;y^WaJvGQ z1`!OZyz3blBte3=Kzv9NRaIQiz@Q5fe1Ifqx}Jf-5hVBwNzijW14AfC@GX*H?0N=< zOpxGbB*DV<3=Fj(!JkNit?L;WCV~Y2BLrn9feo`K;JNK^t@^!0iM@Dz=k3bN?`^$g%yA2%%|QK1NFMh2yw3=AG~ z`B~L>GBC{WsAJdP$-odK!^q%K&%kc9lYs%`E{_Hdc2gL;k%!%4Cj$d$&yq)z0J}Ym z-7LiJx|4x{sfvNYqeX%pG(QQ}+p57Hv=ee$jz@<9d(=(_hH#MiofhngI~f?#LF_IE z_Vk?$42>Xmw+DOfP6meAAa+jxdkM_U{s{JpoeT_HLE;lK*y~~LnOMNyypw@pKS+E^ z347;G28Poh_SACrewf}F73`B?>SuSb&)Lbq09rQaF=qk;Gw39H<`@}R83W2Y49qzw zd`Kb$`G$eH4I~573@LlSEQrhkkPL_kkpU-H5SM{@mkc9=_Vt|%3~34oM>5>Xi5QXUXn(B%?9a^4U*xN%T@86Y_?h#c4jaMwW; zWEFuF901!1mIoUEwlk|5BsCc<1+tPMs}UqH6|4+QAW5}@q#)%wLR7VP7X!l-kjz}L zAlPh(QL{jz%fO-#f%zbT)nEZI0TEpS65R_H022_=)gaM%V4r}J9yr<{1Xx~m<1Pk< zogg(!!D>LYA4D3=1*^$A0Fs{qHf~80*&+lPixC;_=g$r_nRv9y7Jp+l(1+gK4r}}me1H&(nU^U1*ZVL0~TfLr^1#4-w3g+{?faTnQK82CZIZ$WjK0R)g3O1GBXEGBAXugY5++3vN*3 zse~cR1SFh+A#4K@E(QyOTVdd=2G!yUk}Ctt!A;`c3o6&L{6SI`U@25>Q29uZdOwa$3nT?eW^f%)!-_#tNnnqIbTMRAfdrDl7J~_}JrJozkW>m-EvS_U z%}gC2QSf{m*dNTT~eqLabp5nL4Nykj7#E#PK6y3{$4 z)KqZC3SH_NNNO9nV}&ktA0*WPaw0dF0Le3CJp+lhg9X3@NEBQcGi1F3N!5Tw!30Q( zA?qthv=uA>CP1Q44SzvWb>MIYi-HJ-ES7x?459VtqC6ncHdIllF(M$TK5zm>vq4p6 z9|ME+J_d%ciC`Hp0g5XIRi}Ln3@IR)8DK#$0k&T?XCDJY4@hP{SP)D=^i0{uz_1l0 zvkWW|_U)wa9U%?dJ7V5fr~O^eE|vdzy+Yn zeuG4j+z&PZoPM&H_A@YqPRAN3Tp%elzd>Ci1d^Hwb|aVo8wj$MAxj!0H47{XCJ=s5 zRo>6QpbL_20x5+g2`~$+9nvQ;1IZ_XlRd~$3|TfH0Z5w;B+8KG1QN&tNphc617(3r zYK#m5pgj&*ULdJ#u#w<;2h92eRs@z01j*-sMZs=EQf@0Hg$}aXv^C(n=}pfq^l% zv7dnH0(6~oI6tVLTfsbWLVcMGBSW|VX#GJ2bN>T| zY7o~1wD`hH!Wm*92NMHB1@puob*m0AFoa8jbb5I}BK;_;r zfaPA)b%5mLK>8|}CqAg_1#uNXRxmIyFqH3bg;+BMw3IRzw5TS2rv@Vf*h$kFecT|j zkj)6u6Brm6MdrycGF+U=z);0Bu>$6^8H`N*0$Vf~85pK9HbC|0fR-%gc28hn2)AFy zfU3TNX=1@9kVBmQvNAGMFip(Z2jaQRVF&X9PJnnGpfxF8GVTy3*ns@Q)NgPJBoz$u zDg#3^;~J=J4A}WUCNMCpXZ^y8u*}_sk-?d%U!dXu0|Pr7QzYmHux3UM4~Usdz`FD% zGB7x>HL-(rWq`Z{(KWH)fea%9dm2;W90t&a0fpBft{dB*C19=qXvrwMI~!<0i8s^4 z3ef##>|Shsa~Qx5gIZw#wqoK$28KG;r_3NL`WawWFf=gUfhq&}jxl%JL~WB>(K#RnNi2JRBjk{pJ3&=MVH(6Xy)2~UWhASSU)Vqo|p!^m)Q zHOMqbL0j;Wu6+X!@jJ$OMEc#VBCV+hnF$Swn)Nem3%S+}tv z%z=bXzW`|UE4u;HD$sRq(;4?bbwQTBwoL*hl}uSihR5Kf($4|%4=58bRK9?!ge0mB zlNcE4SSn>188$KDuwxoyIVfRHW0diN_;C+7X+4|7zz{y+0$S2?WtvzJ!~~K7B`sH` zi5Y8IK|D~>nh9Es&Hzqa6F`Zp_5nCiO-umitx2FfQY!$;Q%n;hHp?fgv1x09+Ll#FdcX>1P0^nysMNW0=P169|c)2jDQB3evRG5iLx;jzATG zavLaR6r4g%GoUR?pkxA)NdRp<0CBt+f*=NiBEABaR`-ByW$>B-m4q1>fMj651(JdN z25`)cRk;W3uF8mzP2)B-lVZe!Q9b6+oV4Z(;#gM-1^=28;{>bvz6Vvl(lk3L!fi zM3ylyI5SP;0Bw|Ei)K_cU}OOAR4bj#z@VhW(7@OORSpi?+^^Fa7+SeN2^^9roj_?f zVKX-aL-iJ@LWmcYW-u^ZmSbdSSPoJQsU7^;K>K?71)d%RozV@t>>jk+@D-Q`+M6c| zN(JCUyFmszD1mFa4^U%4bsl4G`3wezY0U8)2t%P^Q2_Su1X%Uk69x$l$VQyCGZ+|N zGqWtg)CJl##y*D$v{n`rprCDI2yOz{%sF5)y_xzo(vL7Ou)k$CTEf5puFMQ3GB7YS zFp5C88$x!BiO*zUaOVZt1PP%8PzW_KT0j*+_IcRMWMJUu2PuN2&{UA3Y9FW?$iB{$ znG6id@)U<)^$w`1kh*Z!Oa_Kxc}50LNC5RT8W{V5p=x; zs8$1=8O50Ub0!1BTIM{Y1`s$6G%)%^K!O~U!5MSqW-&0xaf5sa2?nsDM#c=NB1l0T z!2?Qs{gA}R%E-e8Zb^YR=&`Xfc7pbwH84(rYJnucvRMoavyl=YDEb*1823OGtpVqn z*|QiJB*2Ow2@hmBXbaNvqYMn}SHSVf(8!n(32`vQVAEv`3?WSY9Bh6VnIJyHn2|vM z)M0L5oB-7X*>J`(n}Ojb*q0ECqM_{{P{LsapUl9}!1x5J1(H6@XEQLcBBc*dreJ7d z-@gSmF2C5m7_2$lIU^p(% z$dHVb-m{>M)YWPX4D9ciKn(_GrhX2PJK5hs0;Ku|)D%eEJf6+KAfdp>04f+@RS?J& zhI$t0##9$jSm$%kVPHsAfZHYkDxW~=oS7yHpx8DM#kP76s40*-F>nq8!#22W5Kn_l zVQ65?fGUKftFk!^3AiBq(sfjrRpipvF5x z^$e&chzlL&GBB7cGBUh`)D+-c2&ttYZC>t)Eh`up80ybJbwL8DY%T*sGC~))g#pnu zkpWZ{Ky@`Rnm{-4LSk~|Tn2`-NG%soZeVC&On@qaWb1Qt85nMZJpoC{P)`WVJD~ZenmzG_H~d1Glx+l4w8c)iB@e1Y(Y^rbshsl5vvN=8<4mF z`4t`)ihi9sBB<=!`jRa-tBGx&hBqnL7OGO`;|cz2ty+y3v_QVq^T7K zE@vlJuxY@`dvGt8O@k3q3HO6{BeQ8Rf-DgQwGTmi9+8}@1gevEK+S}NYVQIDhV9H9 zkdy~*AwlAOVuqp;BLn*+aJYgRMLHnvPUbonu!AKGLEJrHE<q8vpo$>Dx^D>sgE~^M_JZ8r$mjvx z#ST%Fp#f>1f*K7X5#URr7??pv*2h=bGBOB&Ss;QL#BE~CfocY~RPq&;GBDJ=1bZAD zBa=WjRL{wS1T&=W@mR{hV5h>!z<(dC4qW$42bVGZ0w7D}jld_^&tbd()dop8wM!Wo zPBA8I1#1EuJ_lrYGvf=WGDzN7vXp^=nR)7KkTOU#E(9rSV)V&}I0Ed;{F6%=7#2Ys z05)qGNKpf00aOtr8s9BtU~qYbFljZULCG>vg^@uh4}5|r!yLvrP(2W5sw`t*;9!#8 z2GRv-(t(}Xz_Q169w*pf`Xq3w9LnwX(9(` zuvSPA%w?!-fSLj6HaIQ^x%esRF0Q@;H3t%M?aLV$v{V@x_^yH+4ar}iJF`Hc2PynO z_g#TP4^sGnc%qiXfSob0q^qmNG~YB-tE+nA8JR1W8+Z zppkX3Nf1R)leVBJ3SP;;umMxi9jGF3cFnC=$-uBr3t`Cj3Bh80LAfszhG6Qc!G5hSdhuVi4@iewTf&KMdQeV~dUCQUQ} zw}ilHo_CrmX!~+?3seOpB#l-vFyyKeEa{pVZ$Py{3{GFgz;Knx4YLUQ162koX?j*M zFx2h_$_t6BE<`a292XcwDgKxqEjeH$dXJmkK8Cn=^pjtRU zSs_1N6V!-vfr>$D(O;_=7=AMez5&|?F0eqQsx#BXa!}bKGzEMR1A_qQEDGjZ%!~}o zppE+ipn-p8(9rqfRL#(L&PW?9~hmicF>3K@NoIf|OAGkiuFKQdlQ|n%nUp$1sEU zWP?W0nZa{CpqE!vQc<)HoH;63BuegiXTGiy9(TQ+2GHfVg28Pwtj@0$kixdzvU z;BBkmZOPyrtKc1>;2o>X;N7~QUCPYh{lX7Hn}$K#c)^>7nHxA58R9`(kip@^@E;05 z_nm{rpmIR*0-DBv(##C~3TzcnP6L!?Vkl;Sv3a;abC3)SV1)uu4rpu$Bn%b=F_1B% zAfqauFe@`(Qw`tydOiVhX+A;5P;mwZCKCo`K2HIANh@w^ZYBxPhI0l_0R{#ZOGais z1_o9pMl)_^K5lN1Gy?-0FIY8*V=rkV$-uyl5U}88VBpYWWab0O+DO_R=`rTezK|X{aOdY>4irWO#zz!EwVPNL7 zy|0CJfE)NXE& z6ez?L4ZvQI;b&k_(q~{`P=@k(85mUHp5nIP2B}qro6HTfObyvQkWbWw8IWUL17a~q zw3=%907*njGc^RI7}*L6(`oQxr537#K`Jp#hRJL)XB- zU=DQyI9@?6us{}IV6bd&VgzRdD}8Y4vW6SM4e}l+NNmuBKvvme2=X#8*l{p`@`i)} z1A{%7$qHgRSb;>rOh-!wWAdLumVqrI9wOl30~Y_r!g>io1nPG zr@e`h0aRxA>VqjiF$Rc385sQ0%z?Tw06nfi!5Ih-IdB3p;szy^Aan!lCBa!D7)_iN z;`tDe=RwKHQ-FaX6gk1$ODb?PFodx}oCXe>a9Kt}0Z?E^a7S{7b2BhRfOH!QFfc^2 zFn9{&N+OECC?-Z(0py$!4NWcFKHR<%klZLMz`ziLY$d8xEW~>j+@NAHPLBa(F+6;^ zq27uY04KHtCoq+$#=yXk#LvLMkZi)>F2E#_$H%~s!Vk{!3=FBFU`1(+j3CdZD>8Tr zm~%5QWPpl6Zf-kn28K*fo&{$jZU%-dn2TYVKU)tT79bBWFyz1lKwNMr=ZZ2gFyz5B z!iDoi!B!SngQL4poDrH;xfvLWpo-ynuoxcI@KUD))XFJ^6tWBqWw4-N<^zRHIgINr zz`#%ePiWu>tAs^*im)|n9v?_W6)4I;^%zKRH9{UDTLTjSr$=bwtK|mQe{~?8pj-(G zy?Tg3a6U*8hG=eJga|rFqzHqoYJ~Gaye23Qss$v}3>5-tux15`v@k+^16BkQXoU)Z zA|B-8Hbzi**+`m5+Dn4+KszH+k;%%y(7^~UGx-@9IvFA92b8!$1rP&67g#TdkDAcB z84-!q2wHvjFd`BrOf@LI_Ag_&l=4Ki;cl8mPS zs@x<-aBU)C#O=e)z%Us_B`9e@DuOBSKtz;&;IufEQ53we01+vm$O8rHbhwrjVUQRk z`erbKA{Z38GeInISQ21hn8gT5R*)9TY^ZK{9L+%%0HrjL9SjT}`MIe{MXBWq$vKI6 z=?Z13Ma7xCB^y~@gQ0+xuAeS-zPJvD6yzg-zBvyH7CCywMgGN zKQ}iqFU2P_FEu1TKc`qf*u}e8-#0PYKRCkBNUu00n*oKRA6lGRRIFc?m{XEkl$)7Y zl&SBMTAW>yU!d<2rtg%PoRON7UsSB0oS%}a4{}s#VtT56aZ$3qyEEu2XLn}?kJQ8h zhTQnfyyB9?yyR4d-1rQLNO5Krh?kg?lb@VelA02aA&{I=nwMS7kQ<*?l$x3n59P*3 z`5C!8n}EzUPtMQDNlh+sEn|SP7?5O5i_23}3tY<>z%;UqNp50MwrfCcfOoE6aEWnz zyrEfHYH~?_k!OHkaJ;EA$X-{!V3T-DsO$2JJcG^SU0q#W89-W*%`!A7D9X$$iO5hM%K)a4WeiOq<|pUpm89mC z6uXu|ErbamD~5+t76aICU{9o`Fcg<07L_o7!#z18u?WnHFJUOnE6z;MOHEP8$tg9fP|2ZyR(%Q*boIR9fjhO6f3Lvcta~IumclI@{5oa*eTdC#D^3x#5+PF zIlqV@K0YZmJu@$!p&&mquOt;DkeZhg&k!FEqLLE};-MBnybLlizNE4s73ww+t1L06 zG!-IP2XPe0ujuh;#__JCJHsro7!+Nuxk28+#_Kt;W485ue)k`oIOlQT;yLAFDgWEf+bnp*%i15A@)fJJU%1-PN$TE+ll zf{Y<8A(|JZ7N-`KrMl)aKv|@lVQ5^OQIwgN9bb|kpOy(~f}rq8H!!opH5XnTMaMFr zl-(pIc(7R{mm)@qC7`B83CQgvS_sifvW=!`MfrK4umjU%*b6s+WUEb*5|gt*HAiA{ zHW?Pfw3BXcN@7W(YZ(KGBFA2kK1dcOEzMgNlon^igFOvtD8Tt3SCDO%Kd8+?av)d~ zVVU%qvSQ%1ngx5|Oze z^GJ(*BQuEpoXnKOl2lMr9-QMqjc!mE6t^T9R+*!i25ZR{#}_0Pm$(Li%N?-Spl(4` zK)QXPBBTu3HvzQ_;^W~wG7K}0k1tC}g&SAKfWikENNPkH#>W?>CgM za1ccUt!*>_+emU~na9Vcq!yPT=X^-GqYH!FPhzq*HjIx?%*)F!0aXs5k;u&S()`k5 zP(YO=X6B_9xdwQb1zW^J5CZ|lWH`Xk1j)?2)N*j426s_jYB@P(nj@K+lA4oR0vf@^ z5F^KAOC(b=^OB2FK}{=AISh9)Oq3kck=+gHoT3H?L=0pyX*nEZE@(g()C~bO0rHbU zW{{XvkPRU<4O_xTi@{ESjvSNW2vmbeb%uF-JgkKYWr3VPT38wx#m6Tl7N??TK5#Jx z8ZE~nN4hPBmZ18+pfVm(ltCg5Is%SGhCB<9%1W38poS|-nFx^pnNMPJF*1mcFUcs% zFOSbj%}X!Ih)*pl$_KUWu?bUTKB)T4PlHw_pmrO?T4Z66`J_cNo(LdRrI4B`$+C*f zy2KJoE(Us9A=mYJ9npP6P;QdF8s+;p0AK4@kkG%vHTG!?@fgumiT ziV`zRifxFQp##s(A-rU02K8os5!4hbroW0Jda@y zk}!o9!A5_;J(*KJL&neXvG;`yWSPUw3AT#hd3`2Mt z)V4u$HrP7UWbcz{;OdiP;Oc4$jy-UTEnUb1U zl37wo&|3<24B*unNTcs4i3wDc!pG&2WxxYX3R-p;Gu22|;xtr&9BnWg73^SZPoT9M zva_`87~%s;iV$&RXaXIOfhtB#yRL=?aOr&4Akdg3f)A>l6H6G1Qj;?CQjjeHyTlGO z-jkA9l9`{Em}3LZZ^)S#ZVaRvM_P5GWd~Yvlb2Ycqktr8#}MySz!2}5#t-I;UzJ*v&j1sN&r3}#N-Zvd3xJhm=B0s3wMtac zywvn~xJ-O}PG(YaK>=tXQE^F8W?ni&e0*kZ0eCV77E~6Pstirz<4cQEi$VI5^Gm@~ zyl5hz7=~8DSPX!y&oYQ-sKYcIq!W+brpfWeC7_-mm}Y=FJ1Ma^6D*LKmu>@E?1r2T zKzwNa2FuwYOCs_JNEvuZn{!5DQ3ykP2sm$ovRX!dQAvDmVsSP@d^~8;9E@EA8iOoK z1=TD$Aa$Tod#DmnWs_Kv2vSg-S(OT+!K>fmjPXTcX=P+Y*lO#%fKB^eKC*&v0UGXhWMgX{g2R777LJUs(hG7^t0PBn*vmwr+b z1emKHDGUiy_zVh#We0p|DWz!`b?qd1nG|LQMHLv@no9CqLKQ;_d_Z$Wrik4V+P0J? z$pRl&DztwJd|W9m9twP1Y1GCugDhBqh8=`MX}F=7nTtF)PF^VsaTO>osA(3pe3?se z?1D;Kh#yf(RB%a)MVwj=r%{SRTEt6n$RMx5rL+(SFW;s@!wqveH+iKV(&}uAieMyj zD5*7Jd#QrFsn92d8Agr%EzB&i!>Cc3K(?XV!Q5+U`VQOOCK5^oSKa1r=q@x#awU zO4oqo+*}3_3l#4ZnP*m9ngp6_%FShfus|kK(olr0_<&UY6uHe5JljQuHn|DAMlBg8~d;Rr^rpFMWA4U z1sRw_vE!g-QYX-m45OCAs1R(1#-Lz}hb&LaPlJUYiXg?#MYn`H0gBC3syme$L2LvL z&78#Il6bTbhKf<{YE&zz6uy{-Qrn@_2wih<=t2^3UOq+;BTG>3d@PnxDX?*vOcN(l zBiPNr!46KqSVA31oN^yvT1BNW$8In!9884}HwP^oO)N@<6wwS&9>tD@8w=|rQrdJu zHxSY}q^NF(8ws7Bp^jm>pg|*Qh94+ZQf!`~A@~He;`s8+k_^zQC_|hppde?ZK~z%N zUhqghMZt{f4{Ai5Wolju#Ipo~1+I?bKtZyS@(@8Xj2giK+G31)iUMWJ+`#+qL5EVr zCxVuAf)5e`b=4sI36TUrp-M@I5@Zo%n`eA}QG9Ae32ZMtx**6RiqfEEe0*jxc=03H zBTzQTSc=?l91l8OsW?6}FTS`qA3SZBmRSPhQ))cwCRB?2k7^V}em0AbFHS9itOJD{ zb_LoJj4A~3IYsV;ZI%JAHig(y#sJ=dfn+hr7K*%L3h@efO)O}+3pfHnK7osXtf0&z zkc|-Fq=)Jc6gw#Lh5^JIC_VsjK#r%#V9=2asU;A%Cnpx522XNg0muT%LdOIWr{J&v z*#L`Vm;lHIio9R}2^+9^&|M3z0me9+&>6m*(XW=T9~;5{C6 z)-t#?Qk0jN19d56w<4xArG5bA1kkwwNtLd-U;wJ+AOe&c4O(234lxScW`j=oLG1xI zJmay*Q)(^fkQ4ARYoN0yVGTND0ZJ_Z9pM8p57c4=#SyrN1U?PN71YO!$0bXt%{UJ) zfXs+clyz~PfngdCnzzHgjSF(B4`rDgkDqW`3_iSo!pS_$1B~!_mHswTD{!$L3_+dr zg56}?u|``T;kK75aR=(bfEP-kl+2(*novb4&g0lE0#B7ul)*t~KS7)dZcM@I73i5a zU@?l_ZW$jB+H@Ze-?e1U#bA6d~rB zgMy8aS1_Tg1C?X00mi8RMkV?2@Cb3uWI*QPcDJEnNq#)&9uClP1g^;-T`(R#O{s+lO_`YtNL<{y zj6q&1V@S212*BO_#n;q(7`Hb9MQ-o zlv8_PH3dEFqOG@JuBUh?8gdOAQ$U2vKhAO3}jb)L1Ib@;*12t zP#@3{E@*ibe2NcJ`9g~fi*yJPtgOO!ybXDa(x7=1%MnEIHVQp0jVBP!XhjzVX9^`# zcMc){AmJ0m<&ha+mbwFogZE=mRUm*NYGQq#a;hQcSORDv5>T$+YrB!o|nk+Axk%%Tp~Q1=#2Wnc6{JSTfQQ#BR_q1to3==?CQ_lHCqnHcqzRq58@6JXANx_2l^;$pEsv zkG{y8>~KIgh|B;%H-`L>!DbS9L4>+aoBR+$HHX{)LN$eg@WC{Qyx_sIvYPxb!eSV? z0fogV3PKBqY2*bN=E7+5Lk!a_asv$0BnrX{yJ6%77s`@daw~k)1+ys2O^L2+QOzK? z(nngTO0H*+j3Cb^NCtqsfqr+a4fwoT1<+tC=)hj&Q+ct9fo>j#tHv-4G0cm_AmR`9 zMR616k-l(;!Q1>M&^1cXv18AGWVFM3lVKOj9#dnpdn}Q>AWDm9rQM9o6J0v zGrAEYIhlDSpwWByya4Pb@=Vk-n=@Te2Q(mqp!gMIzoHPk!C1H4W+EMPiN`9~Y*22H zcP1!P6LcF)10GAEZ8to&V%-Qz&}uB>I(Y0rR!z`oj8Pvv1|!rGG#1;q3?7qFloK=@ zbJzxt(IhFxHjstSY>bgBJc_Xn7~xTmWrPTiYRn-aJc`jyJS3cKu?*YbGah!yG4l8Y z9`)FcD8!>2&vAZubb$v#5M6a5R1!>w=)+2Q%!Df?XegEuCp_jNt0rhP=6DnylaUk? zHW)EjMK~>CY|Y2x2&ALKh%Kg(wD=QOuwy+_43DGmoQIPMy1y5B6&KmY5b1XOZpj7R z9Yb8@hWiMiOjqnj4H8+;;y%JA6Lg0otf_-1pzxXizAA+nLy(T_B$%GD9KMRjeQ?#p zCQ+6cbDB4A|@Nqdj?gd$e za@#C1R^hl*mTaxWCIY1UU5Uz}Na~5T0u&xd_qBrKi*Wgjri;kdF(|p=x{ek5MXs5k zRW(Ew0c4v_Y$7#+-U$c2jWsjaBtF;#JPAv%umB}i@N^4g$)+plLKV=w3^8l7@g-)A zi(HNIEcr%VON-A~Y&WSAnKFpGDAhDR7>q!vnuyc}TK@{Wd=+~4DN%VHv>q3x4{^UK zQCe|bU`mu`WP2g|QHd4Ps(OOS5dBtA!aHSf zBbAwXCE$TdH;7@LP_r1~ok2sBAoU?diFw6|$)L-(KsUUBF5fB0F9uP0spavY`-Bcl1V($s$tOJA1DVwG9c2D;7p`jHNlgCSX7{_s}0Bm1xOyTw~B%+ zR4+Mj*9E96IlD913Y2Gu_ zE66+371}f# zf)=f!En4&pz%s&2bQg093xlo%it!~{RAn+$RV_C=snm1BeS&#E_Dio>@{1 zr3?+gl?6o1(10O6J~tC|v1V>!1xO3{Hp|o^5HqzRF}Z}HC^03of+06EFFv)RAU_Xu zaU(JZY8*l?u>!8p(10N$5p<{x^hQPyr?50LwItpz(GM&I@K98*boNsI?YoH ziZgTaL9T?dh}Uaq2)R8owWuf`bekj+k9b2YU^i*HmNCGX#Ot<%Cjr+o1~{8|{f5RU zsm8U80fkS3K?cwi28nS52XvPuvXUNF}^|Eq`86f<4I3I2nt5s%?IP}>-hOU$92Q%{#XS6Ba#_#n{uff;l`cu{IvYEf!la;j&rVLY^> z$^g{>aUE#eIQXu1JD4~_d_2-#VYu-iV=X|QL|hC9y2RZTucb!VEd}35j%gNh^==do zIz}WhB?Yt@(-S!oTwMb~KqHVKcjm`KRUn5fsOeGymtlyHNA4>bq@)&?6y;aOCzha? z3TiY$V-leP*;E|`13LzU6sU~JPew!oXbJ}*i_2(`pJCQx7>+E7WUwW?zDr4kHaJsV z1Ij?_!D06xBP2k+1zi*#pO}-G4r&&F>G-n59E6ERCg4Ny^2<_-z_O_+paG6}=-4di zygV#YNZLUI%=z&MJL5AF^HOqB!Ka*gdIgsl8iI`lSsGsg&K_mCE(IZ=af}pP`XGrB zNgpT@ajFKL{s8VI!g~Yw-9)S-kP;v$kf66r=NCXmec~ab(4JlaWmr53^&xgWHlVIG zy!VRcP3&5b0^9_i02F{oIBkG0u=Zf=Kn{bBJ5 zYQ%Zwy1E8=hr|aPgAk}eXM@sg2BnZhhWPj-1}wEavTsdLsuUEep1Gi^Gd?~iwYb3lfV`K}B(DaWQ^vpzH*j zF@abEa$a(dYmhg1gAQsMK{X3sV#+0)m_SMhB&J+fViHrXD^ZCl*OmChli* z=l~s%hF<9ArIveopev3J5U-Rqi;&v0RbaXcRP3jwXXY6) z#DnHVKvWWlZ^RJqSHKV-oL^d$oXQaIl3HBC5FeCS4igAUEQg4}DjHDogEh!J!6S#5 zjX-d1W`Go6Xl*@YZOCmnkSD>dMtBKn86OYwSY}$KCn#n>VF;S&$51c@ck(e(h3Zg3+QeQZ5Gu>@oeQqU@>fddyb^@MB^sL;$$PK3-g!9oMx z*ar>a}E(mg}9fHdcA78-$I&2a$ z1XdKElUZDX+)M^d4P~b1L0Xp3o5mrNwhVR1#RNl6etKpyR0bUShK5K&kSVWthB_oM zP^R<-Wq%|wlk$wj64x>Y5XF#Mk(^op39hn&k|GrZzYf8KEI+k`3&2dk@DyYfe!Ob| zhJRrWF+8zaB#GN^nxN2tN|W{ zkc09-;$W>H23Rj#0Vq-+hJcRP%1KQuE&-VY=YWla^T39{c@UG}T#!DH1@T~0z#0); zuucRQtQDj)4aq_f8>|f`0oDZLfVF^40I7pp2I7DE;C@jq{VJJ$? zWypc>bD(r$Nq!mwRApjGekMa=Nq!EP$YF>tE-5O>Pho&k5N;ZTo5qlqlb=`u;p9No zx5-2exmZVl> zmN0;ccvlcJJ+&k?uZ$tSxU#q;HJ1TOB^9S87A0pe6c&SY#YY(@CKabLBqkLzo7QJei>!R0zbEFq9{kR0VEc+Q^D@#HiVKTM(ip&2mn4D&Ku*elxCul-1e23Msz68m zfo25K7*dPUz(g|GVMbsw*D#GCEhRG-ORXqL zOe;w(f-p<+LCxbdP@YN5%u4|Y7p3MFmgc81K+J*~Rh*odla!N}#sFsIr7@I1omEm) znwOjgj+z{B)PS;8VjhGv$^l1B4k&8CL`DuMYI49)lLLz2{GuFi)Z{>-CWiqWH94SI z0TYG>IpCx8Z zpo26)DnZgvm3R#XNrKcv3fE`kjpAB++acT*;3INYUf{cMPKqX~z zPJVJWa`^@mD9Ox4DfgiKl3a$8-1y?uWDo_K&@Rc1&&V$=0&`OmE5USr9*C+;O#};< zLxn4$bY^i%aS2F4dTvR6S{jH|m7kZ&0I~rzug*|X2C<+lJ`ZG3JlIJL5E4{Nf)p~u z=VpUxC=H%ojC+2`zpqeiY%qlJ^f-pclke#4A6d2q*eL#)OVhCNp z5MRU)U(OJpmXiot=aiP2lgbdEl*SOBlavOk>=@#c^YgPaQyD-GEKX&JFG@{JVTdnI zP0ePAFE7e0No9yHO=18Yhg_7%5MNpZ;+Cc{#OEb}$ebjG_@ta{h)MZrY2bK@F9yqj z7V9#A$LSf;Kr0JN5Y=oxxRn4p4Zj53&WMi(yElR%EjcH@IF%tSEvK|NgP}OJ1Y}Zi zYDpQ0P6IbJ(-_i8T~j3?QcI zFi}vS1|kY#K}Es68n7ss1r-JNOu(XG7DIfLWoB_Xq+`{i$TqG za3eJh(pJq$fznVa2SS&^X)ps+1(qilgR8>w0km0)!sNl>L)o?MK* zHiH=ms?Fk~%*%0B(&gp33{Y9HOF`9Sd2%tRb^{q+kOvY4Rfb?iAYX%wDyRf&0yiT- z65!&uJh>QBFTfeFjzmd5xc>keiebo2Dgqgvn^Xi!It=B>MWEgUsIveT0QWDzLg1ne z+zDYQgC-Iv1&(o0xlsm7Sui?2KDnYIK0PNtDKRI$EU^fDuL-F24ze1w3@EdNAt$pe z71W)KFH22kNJ&jhfpZdziWm|>BP0xo3?-?#1%_bK2uvD-Myw!1@vt=$SmqC%4RLNV zEy>6Pt@q7Dnxe*U5adLMcu;f5kD$dahTxT5nRyK0O)0P;AZL(pe3T!YZ-hMi0J9%? z-2vL-4`a~c511*at{|if>?H88q;Y(_A<=fBxDe|aTS68)8+y9r;a$i9Ua1|AzU~z? z`UVp){A%k3MVToWI8;zU|!CUh{J!8V9HV!kemz*TH z!H5cO0B0;%#N){{kQ_*aLT4jaSd|9Z=LK5Dm0t{6tq$2S!w~Q8sZ0_ci@TE#1c^P z;28jx11U$0UXZmf&M`jN5p<_WJh~OgGkaP{)2px`CFE=zX#_I6XO3lWH$elzwM`x* z%;WR(Qsbdv;T7Z!4h`2b(0nWETsJ})vVXvSMVSgE!B_DGrNtTXNr}nX@x?j$DiI)j7^gaoZ20IiP# zEu2kFi7!aZEP{kDbowD4$B}PHrh-=JVQ+XrOhQ}Cfvgkm2GIUihWPkQ2JjN>lKdiQ z0z_;y0u@xyC0U>&Dd4+}JOfaoEhW{pi~+XrQHw}T1)zC*m?mB1Bx8tlz#p1T1qDbp zX={V5f;8;$Ij^9=72L5PtTHzj$#`8|;*8JDg&0pnKo#V;=D-7rSl9cwg1cQr7@wPo zWIVC1_e9oX3-U4%Hf2^2?I;t_kfv)H1BgOOX+?>kT~&r%?FmF#`48HQ zfz&UAv>`CtC!m{CkxeIT2J+D%kXh#VBG6otA1rl~>?&jvVNF)j-GzSQ2-(g-F{lo8 z+a-m8?~ih#80mgQTVVw*AV>~wWJAbJNYHguNI8ULXCRCq*Ab@R$q~rd8QHOox~`4P z5KYZ3D5<2-A=uB&Bt4CQj*Lnx$_MqfK`Ycju8K$EgHkZrfdyK93h5ibjYe=mCX*eN zU>Abi3P1jabf06MS4p}VNGDU09ZE=MkQ*M@PAw(fGk6X&CBrZSaK{f4QQ#gS144k3 zxJNov6Jji)iYB>GF+_GG>S@oU`xwb#lpB>_0Lg`}Wef!{HYK5k^$a;pnalFiL8OO1yd6A5XSy9NcD<2lul(qJIRPDo^< zPw^p-9^yD<38_16hcdJYN^oc+PN*X*So=Z59=?R!Gbd;eH1e<=#YE5?GsuZXkW>Im zQk0uSiIYHcJfO3dAe~UqAO{iGzM>4DVGS`*gn^8OcsQPF=E8C%_{vta6ag7IBxMXz z4a-O-c=i`!6rMpy(4Hql9fh>SoZ?iZu|J%%z-WPloKj%Zzy_|artzTVd??9-Y9^v* zN84U6NRm3c9u#@g z%mLBq`T1b!#DW6Qh-O}Heo86>NL^B9USd%tLuMXBerXA0^)5qvJj`#PVVZ)X)a1Dd6=gzp zI)MhtAuQ0kO^_0(1XM!-L=rSF2w}mLK_wu{;N3P0Sp1uUqujNO0ZbzrWatXAut=E{ zr7I0o&~1I0BK1E31Pn$gTQ1xKW7kT+=4I(R{Esw*UNLFS-4*(^P^Bqu-FwG6bp zE(iJW54dB@D!@BbT+0|B43IGxc9!QCrMPA?WP)gH3JO3Hu9*yAnxPIBmspeGhIPPp`oe6Vj5&%(g11V6z(rW)8fj! zoPdVoMikgz2ri{jK0aK42kLogF$ z0=hjWpz;C~FZuZ?*yN2<^V3kuZMerwKqU?+eIP=2#eXEzAG%2;`8z$&ddVcm<^3Om>?FtCZM&4t^vpw6~iOO6kITa z6AoyhIea(*T>(TldRUvq$AgM*FagRH#jZ$s0(5>-VonZ15{uK!p~bpukasY6BDSD1 zEf>6p6wN9VP?H~=&9ImPYY$<~QQq^9Q=RWg8fpn$4L@cLzj-2A-M5>RysJ=}sJ zH?_DpF+CNuK`jTgunM$=Ar)NP~#E&(wx78M{h97o^)axG&3#SNIv zke`>F3f_VQDypGP<6tli+Ajh!50bqs;R@m515YAGCh_qFr6uv8?XZc-pjJq6YGEn( zxVdD|(2pTV0(yqGXEOLKAds*zkT7V@*5-c?X zwL8FNCxpQOj}yfCy7{FgpvZ;EfQ}!8EH}a=?HJ;nVU=RMOJ*_ns0W7lfPB#TxJ3-{ zL9l}nLH$T{LqR>(%w*8EzEp4o6PGN&r4J-&LsB-l-4dUanFsFkM4AMeRZ0T2jq=mdTr2#7&LH@7I12s~hEYiclA~P>Ou`Dq&2Yh%h zgh{$7X2qbE0>~i{2011qmF5`%&dPyv9OjAKo0_snLXppl>G{7XipagU{Hi#layJ;#&BglRb4KjeV zlFBq4lp$O*8Nf8@`avUW>8=6E&@0M{Q%ll8hL9KtrUjreThQPdh$h1TlLAO6f+#Yy zo2G&^fDndRZMcd zVTM$NlB^kAJ>si0LDeT&H73|({Iw;>Y_h6K6VUJ?sBWmtBcm|11kG9GCgxRwi{y;_ zaxk0p1YlMHu35l!41`I#8J4Bs^I>xG%RwD57@Kr+OiRH zW0P)WD02pL%UEU zH_f5?pp_$x2W@u4xQIN4)>p;ZNkdzkM3gqvN)lSG5Tz4K#Y~jGoMP7iH_-K!prh+S z6Kmkx%xr9s;*SJ#KzqX=k&&5S?3o;F1nR|`#k-Pi8oWjC8f;3IF-c@tjWkwoNUZ0P z27-y!1MV1;63IEmu1M1aMB9Tj&qcHzq&=BL>p|X)OKiA7_nd+k_!6rJY3`9|w}B^X zNDS*#GSW_fH+b%XM4JLYgJ77gdT{N5p)As6S(|E&vfw8m)HacpP(ioxq&BmUBUJf zEdL4m1$l}ZWt@eeP7_c@29?2?IY_MqBDEp)#t7=by1s^lI5x{mEGo(`cTG-afUrm@ z5kTvHQuADs89*muA=QxtT@78904mWak0sdp07wi$S_*_+0A5sp+NU6_skl6`z!lWG z2Za)mHX$!UAj-oz#h^O@3^9s&&;)QiMpXp5Cpp+G9&~F1tW>wLL7MZ$I)ewx%_gaN zDLFW1Ij~xXm`P*+X(g(111Us=S6(XW!ev+2B=F)e&@2FAe>&J#mhtcol%g%l>S;TM zc+lo|Lxiy=X_3L%m2valrUE(_#!@hA~NGzYSV7haJd?mhv{3FfCk?&JWqx)D*C zo9P*VvaK1^Wp;H5$<0j8NhwJyh==TQhHwm^JjhB%%)|^zs@6pgcIbv^ z6dyswK*_BnwFv2GFmRcNn$jR?+aNw9KG+O=c^jyNL$*K*#c1%(>!Q@+(wq{8cz^J; zFJ@{6ZL%y%MPy5qb?>gAoCLmgh#@{6NfnBnpd}`(9-z7o)d@sMlc!C?%!I=;Bb$Re{izN9F# zEHg1DrxI)tboU78CVJ0cOT;zv0U!>@@MSMJxe0*kZL5^pzNj&)6VpmsJmyqO~;-V0Pc+h_Ff`XjN&2npp6c&BFz$UMGR`0 z6@YeI43a5GTO81?i$OL5bj*x#Ja~7REBFdUi+J>7WaTDTpL=e99)1CST@K=h$npre3t zp9DDd!F-5_eNf(q*G_2O#hVz+Nw4mZ6NiZzXaODUfGW@sKIjyB$g*tsO62(T(!`>~ zypq&Za8nKG{0ZdL;0j9NXmww(C1{WW9MRyDzzAD_)HZ>K2Xa2NLrE@>Wjdfji4;2+ z;z8$;Ay+S;hAwLL;tCqou|zA5jSMr3A!RDuy3C}URB$;3D}fC`B`~OnL@9U85an(e z^w!iMP@!uX&j7L;*@wtk08;M-p_D4FuKu866|-Onfh7g-c@!WgpcsoB?Vu%q1)y7T z@>1d$igEfHt3@+x} zKue$*kOV=ez9uGtiiDKZoOp&3P@4q2p9$n*=r9S~R-?>f*Q{g)&`G}Vkx3NE0Po~r zc!X0w_$+W&ociH|5LnEH%0YY)03KICcOcRL2o?iivJexJu^V9u zjyKmbNc@4K4l*?sDw)=kK%`32xJ?xDxjLl51LFG@{M zt%wJ07-ImR-p>FzOCMenLa*0FYH@)otawl@7GDJJU&WW8)H~o77WRwdP?`^@NA_U3 z=M6u5VGNep|}KmvSvwQ5$J*{5IZ$5g`qsZC>wI~1jG>VM%UCL(3Z>m;!McJfAIyN ziVNuiPt>k7YKPp_*${e&DyS$nhzGYjKx4ni?UdpoLzB#6P$#i0wWtK#JPEc0b&y?M zAx#ulSOWxwhvZ~pPZk9o!0R1s77qy}P`5ZSFFnvfxfLLhj@d+kFJ3vSfyM zaMKY{IvSE^mXT{NxP1@JVpx(0$UkJ6Z3-IRE&ydqP=fkK4&0h*<_STln8TC^g^yUYlL4ZhpMilvkb!|ggn@xUoPmKsl7WFi8meB7fq_Ah zfq_AVfq_ATfq_Abfq_Arfq_Anfq_Avfq}u0fq}t@fq}u4fq}t{fq}u2fq}u6fq}t} zfq}u1fq}spYK{v71A`j_1A_+x1A`X>1A{LE149r414A$a14AeS149@C14ASO14A?e z149f0149y2UkU>QLplQkLnf3D@-14BNPU&O$`P|U!9ARK!ILg4laGZgG;UohC!)XQvhO-O|43`)f7%np~FkAt} zA5{M>1_p-P3=9l+7#J8HFfcGYWME);#K6GtjDdmS1p@=a8wLi3cMJ>+9~l@JzA-Q` zd}m-__`|@!@E5B8KLY~;BO?O?DY-eO(*Z~y-*|iJG-owbiu#b^};Q*9>n2~|uC?f;I2}TBnlZ*@uXBZh6 z&M`7DoM&WUxWdT5aFvmP;myAIwzQ*cD(d^}Y+m-VX*oT4vOf8B$3<21$$^%wGin}h zy?6JHMVYDM?xo=`Zv|9}A6uTndO{=J==`zm&ujVZce4NR+R-5{c=FViZAY(FUfr>h zPbts*sLtiNkHef^y=FHTf3e%wIne&;vco@qIk~ehZNCwba7QaT$g!xH%g>~)<@KEH z{0(>b5~}68f{hZF|Gs#xpxwQ*He;g8ksVs{&%66OxV4o<7sT|~W^ds-=9e+CeOvCl zQ!+tm3xhPyK3CP>|P`@5Tc(4yRg%g-;io@S6q+Ap|W zYd(+3-BxzjoG&}v99r9Jb{q=Q%Gl6l7{1Tq=ZuAFOq~-txSLgC{hs$<3So;p__`!5 zUv87ytIR#IGq=9~SjBm~(J&>2NvuJpgLzs{t~Ec?f>#CKCi=zC_dI6wqVhq~nfklc z*T3IA`op>8w#k9;r(M45^j#I->Pwv9)QEN4Yq9V!`?JS|uPWYGY&sD3si?syb>`}S z`78dM6yh;4p82<<>Td3v`ML1|LeqW-S-bmO{n>vhq?bJSvQ~k*S299@A1=?O9PIoHbo1pd0oY=HzAXad*PF|P*ZvLIs82Hxn2l$v)rnF z!F0ICEH~itsyDn}vtB*^Gg&j^pqYLf_3HR+u|JpDuuBx&-~z9b<IX?08|9`9*#qZPw1M2hBT6w>isw*)QMC zoPQ>>qvzi76^j|3UB3NmLSL)Y!Q>h1uQpF=Io)oaS3cK4-TUhKGjV-p3T_I2XD1|o zKXR>WAH%FU=BA3?62+x_L+AqxdrDSr~wD2Dm3$=bpJ-(tL5F^g-%jd6oA%(x3Phx4C#uSq)HtauTW9`b!R+z`l5_q}SyMVv` zpuO8-y=ftn7Bi)J&wRaa&3&;nsk1Y-zG_$H*PL`It-QGdB&lfHDOkPX9@{byC9+&1kp*HSszP%)+E_06^W8c)B!-MVL9 z>0157#`oos4AJXixcbg`2hNR|H?8!a_ndO=$>z3)jx}3%EOgLvdNJ{FTidjx%SV4U zx(W!|bS!k>+DWnhOu__$9lx)u=tL(eBu()qP!d z)Bitt&-Ax{DJn}lJ*|dKV(o^fHyUnOY);p&>MPKYG+Pk9An1^MQ~#w9tyM*psdZ^9 z_AGXOevuF9tm<3j{QAgQr!QY+ z@;kUCD|a4dd;Ds4aEw!{&h>NMjz4AY?Pq0S@Sb!jWY43BB_njRl{xtmpLqVwH z4UU;7LN&7&^O%%vi*eR7%Bw2t zcl+*yzF-bZI29iDDmhh=OPt3fZO!Q>M}-<`nTJtlXXQ$LxwF*h?^ExqM|TuBF@I+9 zVSicLEt)HrmQ(AOmo4C+5H>>hU2K)RD?hE&21_?0+1`RO=1`9C;1|Km7h8Qshh8!^lh6XVP zh6!Q}3=6~<7&eG8FdPtLV7Ma2z`!HUz#t>ez+fZJz~Cd!zz`$Oz>p)(z)&O3z|bSk zz%WOgfnkj}1H&G128J`@3=DU~85rJ(Gcf!SXJFuwU|>*?U|=wiU|?{NU|j) zU|=YaU|?vFU|^Uc!N9OYf`MU+1Ovkn2?mBM5)2GaBp4XJNH8$4NHQ>pNHQ>}NHQ>( zNHQ?ENHQ>lNHQ>_NHQ>#NHQ?ANHQ?YkYr%kAj!aRK$3ysiX;QW6G;Y!FOm!lEK&>% zB2o+tDpCv#CQ=LxE>a8(5mF2c8Bz=k6;ccg9a0PobEFs;)<`ih?2%$%xFE&A@IZ=z z;e!;U^CBS4z@Q+_z+fQFz~CUwzz`tKz>px#z)&E~z|bJgz%W6YfnkX>1H%?+28JWj z3=CJK85o{OGca(-Ffd5SFfi!IFfiE2FfjPYFfhc(FfioEFfi1}FfjDUFfh!KVPIGz z!@zJthJoRU3WEmKC$TBdTkY!-FA=CK3=)bA3>u0I3>JzE3?7OM3^9rf3^|Gn3^j@j3_Xer409A27}h8< zFziueU^t`5z;H*Af#HoJ1H&Ih1_mA_1_l`=1_m7^1_m1?1_mD`28I|V28J9Z28J3X z28JFb28KCG3=C_O7#Q{_F)*A_VqmzV#K7=IiGhJZnSnt-nSnt;nSsGTnSsGUnSmid znSmienSr4|nSr4}nSo(~G6TZ`Wd?>V$_xxglo=SVC^IlTQD$KHqRha+qr$)-qr$+T zqr$-8pu)fqpu)hApu)gVpu)h=pu)f~L4|=~feHh|1{DT|11by*7gQJ+9;h%dd;oQb zRT&rrR2di)R2diyR2di?R2dioR2di&R2djbR2djrR2dkis4_4tQDtD*qRPNzU05t}N1T_YR0yPGP1~mqT8EOm+Yt$GR_NXy1oKa(7 zxTD6v@J5Y+fkB;tK|-B@K|`H^!9tyZ!9$&aAwr#jAxE8oVS+jX!vb{%hArw03`f)% z7_O)@Fg#IbVECfWz`&xxz#yW*z@VYQz+j`nz~H07z!0Osz>uTCz)+*Xz%W6Bfnk9L z1H%Rl28JUV3=CH^7#N;tFfe@4U|z;Hr~f#Hu91A~Az1A~G#1A~D!1A~J$14Do|14D{7 z14D^614D~81H%+;28Jct3=CVe85oXeGca7yW?*;$8j#RoU=Yw@U{KIuU@*{OU~tf3 zUQ8$AYwKY9!dJo*d_GWrY*I{FL@Hu?+<*iXj6- zi6H|+iy;HU6hj7vC58+PTMQW(juMqcS6+vx(nf7um+jJ zz#w%A!e_FD@EMmu_!bcm^~d%@_!(^wzP>ob{7%ro2WYHF1j1+h2a%t#0;2w56oh|U z03v_M9AbW<7(|}C8zP@`1j66j2jK^DLDYW&4YYu=A=H2FQ2%kvhp4{~8qflbL!sHX zO#z~RJ7}tSH1oWQ{Fd@=*WeIrJO(^iZOurQ6E&%gj069l<=S11ER z7&Po$A|Ph@Izr5zsKmg)!N9=a-O0cJiZ9`Q28Q5%1_lKqMg}))MuwRVj0~q8AZj16 zK=l65gzy)NLHrFfyIGcjfdw?4IDvtobrJ)^8Y4!ATw{n@&;S{T6$TodV_;yYoD4B5 zeHtW;eoch%7ee{^Xlde|EW|D|eUK>(3^yep>OuYnnIHhw&kl{#4t9uoZqQ&AXgqEf zB+PUsGB8Y;$iT3CA_D{KBnF0Ee;62G={5|S&PAZlPGMkBp31=BX~M_=OB3SZ5WUl(;qCyVyV7NPpfkAyT1B2ld28N}Ej0{JO85ux+ z1%-70G`#ts@v{RofD9Vrm0(~1jdvgHVqgfFz`(#hk%1x3fRSOD6~t|;p!w7qH0TT( z=T(BZ9b`7hb?nNJFb;sKFMzszE!6E1=OF6qp=mA?ng(Bj21^+j7>uFiP!DKemVtr6 zToGd4GSGl2Xlxjo@2kup?pcf$r@qi~23C%0oPgLTVhB-xw;jU22+cFoXF}Ftq<<-5DAZqqP4}`MNWTf#FX-14FwJ zM0_e*`KtQ{qW7&mBZD)v98DI6_#c*T=E*?#`=D`fZV|+ON6^FxXkG&9|FfWp4h9B> zt!Uvrj~}A{`7e-b85pK~h3MY|E&DQ_LEI2-$H>6s0&yoVG+n^#Xf}c9VTPu4r+W~- zI<(I5S_m-%6vnXpcV7*nrW2~h0$T6oLhHTf7a)2(EEyU8fF=(Z7#KvM<%KykPw?_U z%-9SKdvhg-UqE_5zWD+Tn=Gh&Ike0Yg2r{%V~GAIP&b%E!!{h6CtpFs3g%{iH2XB5 z`C$#T?mrAIV_FfZs{;%(1U{LO1U;vd53!(M7Ff*iXEN^FEaP44V0F^JW^5J(k z#2k=cK<-e5mPseHL7~LJAb%Vp{|IUp$9qT|tg~fgm;rTbekw$bFVwBi(8~UJIfy){ zO#-q*@C}6j8CpiH=!NiSK+CLBRtP@~T8(KVmdT9MV53No6A6oA3g|@Me%R}Od8QNBH zSPTgxQ2uU*mLtW`^l%=U$K9aiuphMD4w?f4h4^u(pXWf^SfDx;~5;V>biCnqCHm|IqZs3r!EO zJ`HHT5ES+cp>;qwS{Z(H3d9~BXjqp)-3@B{gKWM8tphhg%f)oGa9R${V?L8Xsu>v0 zL*uF?1i}}Gs-FQZvwmbj?1QzvPAEh8pf(#wM;Ka}CJT)xD`*|Q46PlK2Q4F+pmh|e zIso|>mdBrQLeej+99{~o^X5bAyu)e`d01a00~+t3wh+iYQD|)fE<9I;K>8J+eTP5L@}&?OM=PLd;_U)R9D&j>tSu=IEoWhMnDH8jnLD9< zv~|!hgUQE0-2m%XZ9;1=7(>e!Soxy~jdNHzy8_zp42I@s5j6XRpnY>#n?7F<;$~1A z{T{TQb%N$?So`xaTDUVo!yQx)g2H7PR6VS2n6dy;W`OzypmGpaM$|y_1gH)L>H7># zKd|sGlZLnj)DF21tq0u1A>jq;e}VL9sY2om)E))#k3icuu>QcrD-iYB&^&Sh+Li&8 zT_E*`q2-$>G>*-oaR|$2Gofv1SUd6$)bB6ULAjlQVHUKH^A*~z*(MLMZvnI(EoX+f z57wsq4UPW=&^*x(%@YaGde(poqCXy*=Cz^q_El(_zXk2Ho!5idzaQ#fSbHw|I3&zK z@ei{@S{>qszp(Z?wC?qX_E(mn<+DZ5Fo31w5@?!)<>PR)d;?m41L~WD`dqMn^k2|8 zJ!q{^4+8_J`~j8opfCZAnSt8i4;>j9w4rSs(3m=CoCTC`L1RpyF%{TY7B{s0472+N zblhPNblkxWTBpy0hW{*R-|G)Fyv{(=m@KqRkYR>i9w4El1);>&z))An#EhsJdLEC7cJ`{*QM+IUgtQ`yzJI4*NAJi9|JDGt2*1i&* z4vBZrxB*DrVW_`h{fu4EwuvOPjeQ{wgO>4a=OE^Q#t2~L>tBP`P=RtItgZ77Di3QLI6}wKK<&!AQy3UPZQ4R;c_v^02@BX*s1I5@0JIJa zWVSD~?_g33Q4j0WfY$MW@(!pk{k5He0o3P)l?@Tlya5_d0)qc{O%0s}+B z3y7X`PK*p+p=Azey(1`G#X$=KD8jlB=?FMbGjhfQ`E+L;HNNyl9E$w}W92x537xYoKKnEWK}rwijS=k|YFiCur;pH1-TDvz|iR zim>sqx6Kf9L1i|`-OSK3?=rN^ixz>%!{Y59bc_%-r}G}#c7}~xxeY~V2aWB+^e{mC*mt1m-Uiyo0L^)T^mIOf=mE9AVeJho z=-41^jCuAfh(AE{2_QXuLJ&S|?j|k>!Y_i>zn`J`5tPara{aEjg^D=lNBK2;Gp^h)DH!XD>WE0GQjGn7trIb zSx6cJja`7|31IE4Mzpp{F|)Lkr76+yNTT0FC*>^v#5(WzcvpNZ(#)KMOV=`30>F+YK!bVB;p~Xl>Gd zXr6(ZH;}r= zP&b3xX(0Y;v^>WQ4L?xZ2qeD&t&DpQoyUQdJ(bWtg9x+@u@r4=WjQoIfcj=2^CF>j zG^~C858CH~wXyS{`4u$31ya8c+75&D7aXAR?+fkIUV-+jVdKlnX!45C`U*7v3o`Eo z6J!n-G(Q4rcYxaNpfPyRSS4u86yy)sm|roP*|7a3pq(TjjK04FwB{XT2WT!C#0IsU zK=k_JNCs6mu?uS(*8j_s%=lIk+`(P2x`R7|fq?xg7#MI0L^DZ_fmlRJU$>c zw49kc50aKn_%SdTe+JpYz_1J|cGi!9!2&8a4Jx+DkAXoJDpt(|(R+xIfk6bc!GnQ; zp&Tl<7qtHYDhBgk7IY7W1jHKfJT++l3^M~O11keJ0~-U#_mI61pmq$%zo5BA(A+p^ zt`fF~MwEep0b~Yr85)Bu0|NtSi54hK6hL#|3=9m=WlP{aHPB@}D0^xQKy!x-3=AgF zeKi&g3=CEb3=B4)cGds?|LqwV7#yH%Ck6%vR|W-CL8)z`y|7Ta(HF*;|tfTBpIlz);8l*-KN#z`#(&z`#(=z`#%o z-A~iXz`y_+8Ui(KLDe*9C=k?L0u6CWjw6KeTfnhHL1H%F6z8O%s9b#Z$I0iKX#0Tx6Il;ida0*H63`6NnBsnL2Zsk48^p~?A7V^9Ql9PL>YiYG? z{WPv!Q!c0f>JQ5Xt?j)V(80|vv0JYy_JP*4d;hgE9;v3;6>MA>_k5m zUwrVKueCY(+UK=whi{y;@_FTLv_m)`_l?#|kNF&x8O!_>pDcbkaeG^q(i=X|TI64` zYc<8@=k4FTC)4^um<@F49O>Zh} znhXQFKb&koe|73(nKYRL0?Ah}T^)ao3;qlV$i07Hr<@T_IPjJE>|}WhBD~ zO(FeP{Y>sm(?SK4CEiK$FXH~$9w^DZcaeo=_G!)rgN6?7roD2;Qjf&#?<}{Bz4{?a z;NVI5&`t44CMryG3j{2V{|Gqv?eA|5AAWwf6|I*&&+Ro`QhHp#ezzECUH9voE0*S* z{n2||KsaK;VC)m1Jfm7L90-*|X-Q5k2=bcWZ8kv5#o4QMaBUoQjXw{c(yMpAtFWuBq^YoSe zE`~9sSh4ki+WSQ}r*3%sHG?T|CTmr6anGHnD_=aB#Q8E- z`s`&E&-}1*FS{mbsla&wIY<|AOysuf9E5GJAu`hLcYMOD4{a^O`fSIcvtU))m#<8@KC-+Fw}5qY}|S zXP({Do9{11{pU?qm|A0*@~6kBB9dXvgr%()^{ui%YvLUDQ1C_|VB72^@7!)`%W$hs+&rab;^PzDj*18O7HB;+eXIC} zFHq#TP3DV|k0l%o4BZ?I3_+X>44Iq^4BI&w7@lx4FtBkkFvxN-Fqm*LFobb2FywME zF!XaVFf8L@VA#vWz;K0&f#Ee50|OH`1A`;A3Fe#K*vJl8=Gm z0UraycRmINK7Iy3_*en3?+gL4BdhZ42uLA7>)=s zFx(boVE8M@z#t;Tz@RO}z~Cgrzz`|Kz)&E>z|bzlz%WmUf#JIl0|TEh1B0qC1A~n) z14EoJ14F4W14EB61H)or28Lb23=9{A85mv&Gcf!ItvwfEV3;k!z_3?@f#He>1H)?( z1_oYH1_l*T1_os!z_6QhK=$J4435@7+!(KU!ZH8?}OUm(6!C_iVO^HiVO^~ ziVO@TiVO_hiVO^k6d4$fC^9hIR%BrKq{zU)sl>pbt;E3Kq{P4wsl>ogt;E2vS&4z+ zsuBakcO?b}No58GYh?z8ozQunYxlry6f3_<&~93Wb4-wJxF0~8wX0Ba)H{L=E%se3=(7Vh8%>0_c7a(T}W}b+hZXE6aW={Qh zB5i{+n7K%I$w#MIU?#|lRZGE4?KQvtU0DHU`aCvSBfSdDbo6?rx(LDyZn+}JwFWH8 z(f@6A2!wg+%bZ(Sjr27gk_1E$(8g+pxf>yVuS*9DSG(td+L8>~ zP+@6^aNda>pzYfXE1)i6t_Q2;a=Q8wR)MK;XC`1z;kwXk054m*bEkqtTrwO zsor$~BK&$a*xj2=x*vmtyP$?-K&ZM?n_tXeX0CpZ>NHb4yVhFBT1 z`4DLTH$xkAVMRA2lFsyIgSJvL$j*eQW^n1cJ;sp$RsUAx;SFzFne>aZ-EXOpppSs8cN= zPMx>3Y|*tfF#!swNLXv!n>d|Z9EBJ>oP>^K>NrUwn1%| zf!J>7zpL%W9WLqf}9jb#8x_%bx*t=j@top<{XI8~cLrvu)Gf`jM^gEgpA z#xNB+i<<(;G1eagLHq6*)FlI|xbK<6SbtepW7KI05_iGpf%CCJ^6Hi9)Xs6)yYk@;&=iXdeR zhzU|L3z}+}bHL^uKQIw&O*M4ElJZ@!0ZVpV1E;YCP%o^7c;VYGQ?M6`H6XUjL#C&N zt_OkF%cQYFMhfIvz-BMz)7upYDWq$JW*MgHf<^mz4t@58l-K4A7pw~BfJH%S-$Kgk zpHpXE;XMEr1!?2F24;e^f!v=9T@`pAlB_(u4}%gYg9SA6t3fh<;P(PQkm>+v%=}^j zkBRRye+JICpCP%MfhikY1TW0unsP`2Tm*xdAdP0we6d~-Y`a{Q!{O{ba3)B_BxpeX zfMma>=9i#OEkiwYl;AicI3VvUc7B$GEUX1FK^mVyjh+L^a=(_(lZ$|4cn}k$!VOxC z$CQI3ch=)t(3l5=~psfIY`x zlm-qz!}`*_9Ae<`12IA7O_hcWrk-G71XY^8@~q%hD3jMgG=5G1Yh0pX#UscD)(B#P zG&Vquo((a&tbf6o6i5mNF+nQ6K|S^!;xWEk+ctrORiOo3RXo@V>)98;HtIpmbAg!W z*(Sjf1~CuB1Znhwu1iee2Zvv>raovyh9MrRu@0hfSvcd0Scpat6QofQI zNQ4TzLxh|8`(!|d6#ju2Qu`Ea_Ex8F;Ig9}Iz-v~8|;PfG9%DH8ABx-0|V%!mdTL( zcyFmf{!vJN++GxY^adn9o;ol2>L4UP7QGg!e+tQuAhnHmjwomvXQf3~!)==?^u*hRoFT1q~lDY=h1Pm_XL&&MUkG z&P>x)AX^QbA%&6c>w1>65ayzef0tiCn$&+@E_{&zskfd_e-rl!!VG&;us_2E?DOt9 zFP-Atz)Ze#MSGdTz)Y_F(bL zy$g2o(rIhKlgXfIZcx3=XAc(M=%%Y+6XV(asoB+zj`3|FD%y@i;^ z?#BY&NM$MuP9zMQxxsYuT;naAOW{nAd3n&n`%5f%!a=2a8n}+DgsvTo(*`>`p|;`! zNcAabv2YGjEY!$|f)+Y3WXpriWVpuzrcDk{T`*-CoC(s{49%~TBEaUwn1D9AF)%3Y z1gm2BQ2`G4nVH#>eWk$x4`PBeWY@@(0+z?>QM5 zgh0d9tYBfKX8)(=kXF(mg@gwzkYw}v%CFTMAg!e6YORJ-kX8~i&!*j(kXF)*#3_4! zS%6J2)3DaegEWoK2!9UOgruvhYqyBX%>yd{Ss@2$8iCB+3}Nn)3$W*hbjsd~eSg&m zVK&OfbpKlo)>gJs+iVY{8MR}MY=Sc+gUEEvWyygwqd+bL`Ck`W73;162b}5NH)$Z@ zEzmVqGhTuN@M&-exOx7b336nVB@@_|uaAmc>mdEpo~@Z5OohRs=bqi$;|%GPcB-dc zNQd-9JFkcwOM>)7x7AC9bwj$JAQQGix}P8uK0^ADAQM2Y2;T%Li()dt25Vklat$PW zUK~;{X)u5r1T3BkPe8&P%nac51Jfan+i3op-CO{yQHxW)1~h^r#=x*u#eUv(NavZ$ zT=m~6NQ}&tH+^sv;!f9k?~^Yfjsux+91@7^Ej4#0LmUUvmUk6wE=U{5=55eU;#U)J zXccE40*(DMT!QAdJ&@dXzS(108YH)Ym>`Yi(9nMkNjb-@+0TN6e?d#ZF9P69Q}Rm` z+;j8?%)@60ar?v(6l-al2$!xz^7#~$U>u#8xn=@;)6jG4GagM1;ztNfl(t= z3toy<1ntyahjcGLsC>Q;a>+yJeztFre46?IbT|?NLlU%s1Uec?jDexu%&|QX5=S5= zNTVCH$$J9Q-23%aZKr7@#NQFEzTxG>kPH+JPVuCbIhI(=l#FOb)?LlW@F=Rq* z+{Oqlxt`T;o4_#(&ID?q?O zaD6889+Kje?t>%v)#pI4unrq!`n&*A30tshPXmpzi7_w)rY@f`4^s1 zDTssAydVW2=beI<@O+T2_bs0TpmWj~rb8o-H3@8?LVOprAx(1O|pk^qY4JqJy_FepMpH42i!ic3wv6>=gp4m=?Z zQ@`W2paaqv@}P0r3W?LepP(Zi7#JL&?aMFB;38S=rEw$3%Dd2Y9QM1xxyg^o>N-gH z5wy#-YYRA2BrQ<}ueF>F?L-}b6rG8lYe92w3|FAZ{N;VHA&)2If_Lu(LLI2G6KqI3 z=Mr$I=YcTf7(9DUa4gJvDe!Frq+APhos+*r1uPmIw*F@+q+DC~dU0MMr0Ksd&y z4Oqdt9~&M`ffRApMbEt_E(D8$40{eK;y{M|fOL=y?%n;Ca2~7xWUeTrZ3Z$7s~FPS()`Y!4YD#Ex(-^@5$w1Xiy1&OhYV54kWoE0 z4X|(0lJ&PAx&&wHJpeP!5@vFSLWWXKaD}W{^BOGr z42_V6rBGzEy3ZA`5QqtK#tUeRf)~<9D4ypE?j>G;_5hYcD)O8PA8^Yt7}{{Lfizt1 zC4x@xU|?7d74C!x%S3p9W>6V!Km+6^BtTZHYyk(K4m7o=K~nptn!ljAUWPD{SOTZx? zf9UdtLP(-aHtTKZSOylo_I$~%n3Z7W_w@#c)FI7^H`WZfT99VNzjTk2Vvr(abNB^t zgn?F-g1Qkstl-MnX0HY~RcwQ9=zj$%@NcR4flC56=sE``CvYH~l#mCVe8{jJ8hNuJ z^uPLRkj4^dIz9v$<93U401rO=gw9d0K3=ET@y{ig{xeX54;6Ut!Hf6p;^4|?pi5noZH$%(#caZ+hG`UF7as`Gd(0w1D zT){56A;SWm|F{iJ9@`+vqe!p+J;;zR(Aw~Q3b@ACeAY1e3}nOs#006B4=vz+Kx)Gm zAK1Y4b_Fy6#X=I0|FLM$;u3}>&;pLB3YgIaoqYl_P|})JJ^33exDp33K`M@< zfU6+}5lCth-hJlmh0EYb1u^R&!_bdon^xX>2^LND-UJ@_R@w{>Hipt{1_o;ehOI5r zY8tp0VN8(8if14yS|A+;vCNAPgCN;Cws@~CNX0uy{4qR+3}J2Y+toH7GK2+Uf>a!W zy5BO1fq|ca;V74@$_{o$7!#zz4BA@^gv?dkz4r+m>97?wpmG7Ej0Z$OSFAHKuz^pZ F1pv2Jc~JlW literal 0 HcmV?d00001 From 5fcab54fe464f5e87e2baf39df920e75beecfe60 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Thu, 16 Feb 2023 22:40:43 +0100 Subject: [PATCH 15/32] Fixed sweep --- src/GC/lib/heap.cpp | 42 ++++++++---------- .../Contents/Resources/DWARF/h_test.out | Bin 230274 -> 229833 bytes 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 19a1911..299fe85 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -8,6 +8,7 @@ #include #include "heap.hpp" +using namespace std; namespace GC { @@ -57,6 +58,7 @@ namespace GC { m_allocated_chunks.push_back(new_chunk); + // new_chunk should probably be a unique pointer, if that isn't implicit already return new_chunk->start; } @@ -76,8 +78,8 @@ namespace GC { // compact(); - // BELOW SHOULD BE INCLUDED (commented only for tests, to see which objects freed) - + // We shouldn't do this, since then m_freed_chunks doesnt' have any real purpose, + // it should be used in alloc, it isn't if we delete *all* of its contentes //release free chunks while (m_freed_chunks.size()) { auto chunk_pointer = m_freed_chunks.back(); @@ -88,7 +90,7 @@ namespace GC { void Heap::collect(uint flags) { - std::cout << "DEBUG COLLECT\nFLAGS: " << flags << std::endl; + cout << "DEBUG COLLECT\nFLAGS: " << flags << endl; // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); @@ -119,30 +121,21 @@ namespace GC { // Not optimal for now, it doesn't have to loop over all objects // but mark needs some refinements before this can be optimised - // sweep apparently only sweeps chunks of odd size, eventhough the're not marked void Heap::sweep() { -/* for (char i = 0; i < m_allocated_chunks.size();) { - auto chunk = m_allocated_chunks.at(i); - std::cout << "Current chunk: " << chunk->start << std::endl; - if (chunk->marked == false) { - std::cout << "The current chunk was removed" << std::endl; - m_allocated_chunks.erase(m_allocated_chunks.begin() + i); - m_freed_chunks.push_back(chunk); - } - } */ - // This captures the wierd behavior or my lack of knowledge of vectors - for (auto chunk : m_allocated_chunks) { + for (auto it = m_allocated_chunks.begin(); it != m_allocated_chunks.end();) { + auto chunk = *it; if (!chunk->marked) { - auto it = std::find(m_allocated_chunks.begin(), m_allocated_chunks.end(), chunk); - if (it != m_allocated_chunks.end()) - m_allocated_chunks.erase(it); m_freed_chunks.push_back(chunk); + it = m_allocated_chunks.erase(it); + } + else { + ++it; } } } // TODO: return the worklist filtered on mark = true - void Heap::mark(uintptr_t *start, const uintptr_t *end, std::vector work_list) { + void Heap::mark(uintptr_t *start, const uintptr_t *end, vector work_list) { for (; start < end; start++) { // to find adresses thats in the worklist for (size_t i = 0; i < work_list.size(); i++) { // fix this auto chunk = work_list.at(i); @@ -178,27 +171,28 @@ namespace GC { set_marked(child) worklist.add(child) */ + // For testing purposes void Heap::print_line(Chunk *chunk) { - std::cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << std::endl; + cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << endl; } void Heap::print_contents() { if (m_allocated_chunks.size()) { - std::cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << std::endl; + cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << endl; for (auto chunk : m_allocated_chunks) { print_line(chunk); } } else { - std::cout << "NO ALLOCATIONS\n" << std::endl; + cout << "NO ALLOCATIONS\n" << endl; } if (m_freed_chunks.size()) { - std::cout << "\nFREED CHUNKS #" << m_freed_chunks.size() << std::endl; + cout << "\nFREED CHUNKS #" << m_freed_chunks.size() << endl; for (auto fchunk : m_freed_chunks) { print_line(fchunk); } } else { - std::cout << "NO FREED CHUNKS" << std::endl; + cout << "NO FREED CHUNKS" << endl; } } } \ No newline at end of file diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out b/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out index 8e80ccda5106a84472f772e86f5ae8d9c27e311e..af32e3755bea1e884d6eb74432a0fd04882ea23e 100644 GIT binary patch delta 57690 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 z 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 AegFUf delta 58208 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 From fb5f283dfde01185cd793b8ec53066a0009b2c69 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Fri, 17 Feb 2023 10:29:48 +0100 Subject: [PATCH 16/32] Some progress on marking --- src/GC/lib/heap.cpp | 35 +++++++++++++++-- src/GC/tests/h_test.cpp | 36 ++++++++++-------- .../Contents/Resources/DWARF/h_test.out | Bin 229833 -> 204968 bytes 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 299fe85..3016159 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -67,7 +67,7 @@ namespace GC { // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); // looking at 10 stack frames back - const uintptr_t *stack_end = (uintptr_t *)0; + const uintptr_t *stack_end = (uintptr_t *)0; // temporary // denna segfaultar om arg för __b_f_a är > 2 // reinterpret_cast(__builtin_frame_address(10)); @@ -93,8 +93,9 @@ namespace GC { cout << "DEBUG COLLECT\nFLAGS: " << flags << endl; // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + cout << "Stack start:\t" << stack_start << endl; - const uintptr_t *stack_end = (uintptr_t *)0; // dummy value + const uintptr_t *stack_end = (uintptr_t *) stack_start - 40; // dummy value // denna segfaultar om arg för __b_f_a är > 2 // reinterpret_cast(__builtin_frame_address(10)); @@ -136,9 +137,12 @@ namespace GC { // TODO: return the worklist filtered on mark = true void Heap::mark(uintptr_t *start, const uintptr_t *end, vector work_list) { - for (; start < end; start++) { // to find adresses thats in the worklist + for (; start > end; start--) { // to find adresses thats in the worklist + cout << "Value of start pointer:\t" << start << endl; for (size_t i = 0; i < work_list.size(); i++) { // fix this auto chunk = work_list.at(i); + cout << "Chunk value:\t" << chunk->start << endl; + cout << "Chunk pointer value:\t" << &chunk << endl; if (chunk->start <= start && start < chunk->start + chunk->size) { if (!chunk->marked) { chunk->marked = true; @@ -150,7 +154,30 @@ namespace GC { } } } - + +/* void mark_test(vector worklist) { + while (worklist.size() > 0) { + Chunk *ref = worklist.pop_back(); + Chunk *child = (Chunk*) *ref; + if (child != NULL && !child->marked) { + child->marked = true; + worklist.push_back(child); + mark_test(worklist); + } + } + } + + void mark_from_roots(uintptr_t *start, const uintptr_t *end) { + vector worklist; + for (;start > end; start--) { + Chunk *ref = *start; + if (ref != NULL && !ref->marked) { + ref->marked = true; + worklist.push_back(ref); + mark_test(worklist); + } + } + } */ /* Alternative marking, pseudocode mark_from_roots(): diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index f26ed55..2f605ca 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -1,27 +1,31 @@ -#include "heap.hpp" +#include "../include/heap.hpp" GC::Heap *gc = GC::Heap::the2(); void init() { - std::vector live_int_vec{1, 2, 3, 4, 5}; - std::vector dead_int_vec(1000000, 1); - int *arr = static_cast(gc->alloc(sizeof(int) * 300)); - int *a_ptr; - int a = 10; - a_ptr = &a; - auto temp1 = gc->alloc(sizeof(a_ptr)); - auto temp2 = gc->alloc(sizeof(live_int_vec)); - auto temp3 = gc->alloc(sizeof(dead_int_vec)); - // *arr, *temp1, *temp2 and *temp3 should all be on the stack - //a_ptr = nullptr; + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + auto stack_end = stack_start - 160; + std::cout << "Stack start from init:\t" << stack_start << std::endl; + std::cout << "Imaginary stack end:\t" << stack_end << std::endl; + int *arr = static_cast(gc->alloc(sizeof(int) * 300)); + for (int i = 0; i < (sizeof(int) * 300); i++) { + arr[i] = i; + } + std::cout << "First stack pointer:\t" << &arr << std::endl; + long *l = static_cast(gc->alloc(sizeof(long))); + *l = 20; + // This doesn't get allocated on our heap, but how is it viewed on valgr? + int *arr2 = new int[1000]; + for (int i = 0; i < 1000; i++) { + arr2[i] = i; + } } int main() { - //init(); - for (int i = 1; i < 10; i++) { - gc->alloc(sizeof(i)); - } + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + std::cout << "Stack start from main:\t" << stack_start << std::endl; + init(); gc->collect(MARK | SWEEP); gc->print_contents(); //delete gc; diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out b/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out index af32e3755bea1e884d6eb74432a0fd04882ea23e..d3ad3e76a59e30d8544efb36f9e28d362fbec250 100644 GIT binary patch literal 204968 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 Date: Fri, 17 Feb 2023 12:14:11 +0100 Subject: [PATCH 17/32] Debugged mark() Co-authored-by: ValterMiari --- src/GC/Makefile | 10 ++++++--- src/GC/include/heap.hpp | 1 + src/GC/lib/heap.cpp | 47 +++++++++++++++++++++++++++++------------ src/GC/tests/h_test.cpp | 18 +++++++--------- src/GC/todo.md | 23 ++++++++++++++------ 5 files changed, 66 insertions(+), 33 deletions(-) diff --git a/src/GC/Makefile b/src/GC/Makefile index f42d28c..6ca9320 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -7,19 +7,23 @@ CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I VGFLAGS = --leak-check=full --show-leak-kinds=all heap: - $(CC) $(CFLAGS)$(PWD_V) lib/heap.cpp + $(CC) $(CFLAGS)$(PWD) lib/heap.cpp h_test: rm -f tests/h_test.out - $(CC) $(CFLAGS)$(PWD_V) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out h_test_vg: make h_test valgrind $(VGFLAGS) tests/h_test.out +h_test_dbg: + make h_test + lldb tests/h_test.out launch + linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD_V) tests/linker.cpp lib/heap.cpp -o tests/linker.out + $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out linker_vg: make linker diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index e659598..be1b12e 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -32,6 +32,7 @@ namespace GC { // void compact(); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); void print_line(Chunk *chunk); + void print_worklist(std::vector list); inline static Heap *m_instance = nullptr; const char *m_heap; diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 3016159..f01233b 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -23,6 +23,7 @@ namespace GC { } // kolla freed chunks innan + // denna är helt onödig just nu, freed chunks kommer alltid va tom for (size_t i = 0; i < m_freed_chunks.size(); i++) { auto cp = m_freed_chunks.at(i); if (cp->size > size) @@ -80,7 +81,7 @@ namespace GC { // We shouldn't do this, since then m_freed_chunks doesnt' have any real purpose, // it should be used in alloc, it isn't if we delete *all* of its contentes - //release free chunks + // release free chunks while (m_freed_chunks.size()) { auto chunk_pointer = m_freed_chunks.back(); m_freed_chunks.pop_back(); @@ -90,7 +91,14 @@ namespace GC { void Heap::collect(uint flags) { - cout << "DEBUG COLLECT\nFLAGS: " << flags << endl; + cout << "DEBUG COLLECT\nFLAGS: "; + if (flags & MARK) + cout << "\n - MARK"; + if (flags & SWEEP) + cout << "\n - SWEEP"; + if (flags & FREE) + cout << "\n - FREE"; + cout << endl; // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); cout << "Stack start:\t" << stack_start << endl; @@ -101,6 +109,7 @@ namespace GC { // reinterpret_cast(__builtin_frame_address(10)); auto work_list = m_allocated_chunks; + // print_worklist(work_list); if (flags & MARK) { mark(stack_start, stack_end, work_list); @@ -136,19 +145,23 @@ namespace GC { } // TODO: return the worklist filtered on mark = true - void Heap::mark(uintptr_t *start, const uintptr_t *end, vector work_list) { + // This assumes that there are no chains of pointers, will be fixed later on + void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { for (; start > end; start--) { // to find adresses thats in the worklist - cout << "Value of start pointer:\t" << start << endl; - for (size_t i = 0; i < work_list.size(); i++) { // fix this - auto chunk = work_list.at(i); - cout << "Chunk value:\t" << chunk->start << endl; - cout << "Chunk pointer value:\t" << &chunk << endl; - if (chunk->start <= start && start < chunk->start + chunk->size) { - if (!chunk->marked) { - chunk->marked = true; - work_list.erase(work_list.begin() + i); - mark(reinterpret_cast(chunk->start + chunk->size), end, work_list); // - return; + if (*start % 8 == 0) { // all pointers must be aligned as double words + for (size_t i = 0; i < worklist.size(); i++) { // fix this + auto chunk = worklist.at(i); + uintptr_t c_start = reinterpret_cast(chunk->start); + uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); + if (c_start <= *start && *start < c_end) { + uintptr_t c_start = reinterpret_cast(chunk->start); + if (!chunk->marked) { + chunk->marked = true; + worklist.erase(worklist.begin() + i); + auto new_stack_start = reinterpret_cast(start); + mark(new_stack_start, end, worklist); // + return; + } } } } @@ -204,6 +217,12 @@ namespace GC { cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << endl; } + void Heap::print_worklist(std::vector list) { + for (auto cp : list) { + cout << "Chunk at:\t" << cp->start << "\nSize:\t\t" << cp->size << endl; + } + } + void Heap::print_contents() { if (m_allocated_chunks.size()) { cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << endl; diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 2f605ca..76e2434 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -5,28 +5,26 @@ GC::Heap *gc = GC::Heap::the2(); void init() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - auto stack_end = stack_start - 160; + auto stack_end = stack_start - 40; std::cout << "Stack start from init:\t" << stack_start << std::endl; std::cout << "Imaginary stack end:\t" << stack_end << std::endl; - int *arr = static_cast(gc->alloc(sizeof(int) * 300)); - for (int i = 0; i < (sizeof(int) * 300); i++) { + int *arr = static_cast(gc->alloc(sizeof(int) * 100)); + std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; + for (int i = 0; i < (sizeof(int) * 100); i++) { arr[i] = i; } std::cout << "First stack pointer:\t" << &arr << std::endl; + long a = 20; long *l = static_cast(gc->alloc(sizeof(long))); - *l = 20; - // This doesn't get allocated on our heap, but how is it viewed on valgr? - int *arr2 = new int[1000]; - for (int i = 0; i < 1000; i++) { - arr2[i] = i; - } + l = &a; + //*l = 20; } int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; init(); - gc->collect(MARK | SWEEP); + gc->collect(MARK | SWEEP | FREE); gc->print_contents(); //delete gc; return 0; diff --git a/src/GC/todo.md b/src/GC/todo.md index 939c6a0..a327d71 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -6,16 +6,13 @@ Goal for next week (17/2): - Functioning garbage collector - Test it with valgrind -TODO: +## GC TODO: - Merge to main branch - -## Algorithm - -Potential algorithms: -- mark & sweep +- Don't empty m_free_chunks, reuse in a better way **Victor fixes this** ## Tests TODO ### Library linking +**Victor fixes this** Compile the GC lib and a test separately, link them together and evalutate the following: @@ -24,3 +21,17 @@ and evalutate the following: __builtin_return_address(0) __builtin_return_address(1) +### GC Init and __b_f_a +1. Save the first stack fram globally as the stack start +2. For each call to collect, save the prev stack frame as the stack end +3. Scan through the span + + gc_init() + global stack_end = __builtin_frame_address(1) + + collect() + global stack_start = __builtin_frame_address(1) + + sweep() + for all addr in range(stack_end, stack_start) + mark if chunk From 99c69dbd57c8a0b1073d1ffe948a354f4372b065 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Sat, 18 Feb 2023 13:31:16 +0100 Subject: [PATCH 18/32] Implemented free chunk swaps and filtering --- src/GC/include/heap.hpp | 4 ++++ src/GC/lib/heap.cpp | 52 +++++++++++++++++++++++++++++++++-------- src/GC/todo.md | 7 +++--- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index be1b12e..0bd3d36 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -15,6 +15,8 @@ #define FREE (uint) 0x4 #define COLLECT_ALL (uint) 0x7 +#define FREE_THRESH (uint) 20 + namespace GC { class Heap { @@ -29,6 +31,8 @@ namespace GC { void collect(); void sweep(); + void free(); + void free_overlap(); // void compact(); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); void print_line(Chunk *chunk); diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index f01233b..480fc3b 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -79,16 +79,44 @@ namespace GC { // compact(); + free(); + // We shouldn't do this, since then m_freed_chunks doesnt' have any real purpose, // it should be used in alloc, it isn't if we delete *all* of its contentes // release free chunks - while (m_freed_chunks.size()) { - auto chunk_pointer = m_freed_chunks.back(); - m_freed_chunks.pop_back(); - delete chunk_pointer; // deletes chunk object, doesn't free memory to the OS + // while (m_freed_chunks.size()) { + // auto chunk_pointer = m_freed_chunks.back(); + // m_freed_chunks.pop_back(); + // delete chunk_pointer; // deletes chunk object, doesn't free memory to the OS + // } + } + + void Heap::free() { + if (m_freed_chunks.size() > FREE_THRESH) { + while (m_freed_chunks.size()) { + auto chunk = m_freed_chunks.back(); + m_freed_chunks.pop_back(); + delete chunk; + } + } else { + free_overlap(); } } + void Heap::free_overlap() { + std::vector filtered; + size_t i = 0; + filtered.push_back(m_freed_chunks.at(i++)); + for (; i < m_freed_chunks.size(); i++) { + auto prev = filtered.back(); + auto next = m_freed_chunks.at(i); + if (next->start > (prev->start + prev->size)) { + filtered.push_back(next); + } + } + m_freed_chunks.swap(filtered); + } + void Heap::collect(uint flags) { cout << "DEBUG COLLECT\nFLAGS: "; @@ -119,14 +147,18 @@ namespace GC { sweep(); } - //release free chunks if (flags & FREE) { - while (m_freed_chunks.size()) { - auto chunk_pointer = m_freed_chunks.back(); - m_freed_chunks.pop_back(); - delete chunk_pointer; // deletes chunk object, doesn't free heap memory to the OS - } + free(); } + + //release free chunks + // if (flags & FREE) { + // while (m_freed_chunks.size()) { + // auto chunk_pointer = m_freed_chunks.back(); + // m_freed_chunks.pop_back(); + // delete chunk_pointer; // deletes chunk object, doesn't free heap memory to the OS + // } + // } } // Not optimal for now, it doesn't have to loop over all objects diff --git a/src/GC/todo.md b/src/GC/todo.md index a327d71..3386d65 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -2,9 +2,8 @@ ## Project -Goal for next week (17/2): -- Functioning garbage collector -- Test it with valgrind +Goal for next week (24/2): +- Debug ## GC TODO: - Merge to main branch @@ -30,7 +29,7 @@ and evalutate the following: global stack_end = __builtin_frame_address(1) collect() - global stack_start = __builtin_frame_address(1) + local stack_start = __builtin_frame_address(1) sweep() for all addr in range(stack_end, stack_start) From 518940ab153caf9df70d5f7b68ac5cf984290f25 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Sat, 18 Feb 2023 15:05:02 +0100 Subject: [PATCH 19/32] clean up --- src/GC/docs/heap.md | 47 +++++++++++ src/GC/include/heap.hpp | 20 ++--- src/GC/lib/heap.cpp | 176 ++++++++++++++++++---------------------- src/GC/todo.md | 2 +- 4 files changed, 135 insertions(+), 110 deletions(-) create mode 100644 src/GC/docs/heap.md diff --git a/src/GC/docs/heap.md b/src/GC/docs/heap.md new file mode 100644 index 0000000..5db98e6 --- /dev/null +++ b/src/GC/docs/heap.md @@ -0,0 +1,47 @@ +## Heap Documentation + +### Algorithm notes + + void mark_test(vector worklist) { + while (worklist.size() > 0) { + Chunk *ref = worklist.pop_back(); + Chunk *child = (Chunk*) *ref; + if (child != NULL && !child->marked) { + child->marked = true; + worklist.push_back(child); + mark_test(worklist); + } + } + } + + void mark_from_roots(uintptr_t *start, const uintptr_t *end) { + vector worklist; + for (;start > end; start--) { + Chunk *ref = *start; + if (ref != NULL && !ref->marked) { + ref->marked = true; + worklist.push_back(ref); + mark_test(worklist); + } + } + } + +Alternative marking, pseudocode + + mark_from_roots(): + worklist <- empty + for fld in Roots + ref <- *fld + if ref ≠ null && !marked(ref) + set_marked(ref) + worklist.add(ref) + mark() + + mark(): + while size(worklist) > 0 + ref <- remove_first(worklist) + for fld in Pointers(ref) + child <- *fld + if child ≠ null && !marked(child) + set_marked(child) + worklist.add(child) \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 0bd3d36..0962c9f 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -31,9 +31,9 @@ namespace GC { void collect(); void sweep(); + uintptr_t *try_recycle_chunks(size_t size); void free(); void free_overlap(); - // void compact(); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); void print_line(Chunk *chunk); void print_worklist(std::vector list); @@ -42,21 +42,14 @@ namespace GC { const char *m_heap; size_t m_size; size_t m_allocated_size; + uintptr_t *m_stack_end = nullptr; std::vector m_allocated_chunks; std::vector m_freed_chunks; public: - // Singleton - static Heap &the() { - if (m_instance) - return *m_instance; - m_instance = new Heap(); - return *m_instance; - } - - static Heap *the2() { + static Heap *the() { if (m_instance) return m_instance; m_instance = new Heap(); @@ -64,10 +57,11 @@ namespace GC { } // BEWARE only for testing, this should be adressed -/* ~Heap() { - free((char *)m_heap); - } */ + ~Heap() { + std::free((char *)m_heap); + } + void init(); void *alloc(size_t size); void print_contents(); void collect(uint flags); // DEBUG ONLY diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 480fc3b..d6ac52d 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -12,45 +12,50 @@ using namespace std; namespace GC { - // alloc assumes that after the collect phase, the aligned memory in the heap is compacted from the start, - void *Heap::alloc(size_t size) { - auto heap = Heap::the(); - assert(size > 0 && "Heap: Cannot alloc less than 0B"); - if (heap.m_size + size > HEAP_SIZE) { - // try collect - collect(); - assert(heap.m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); + /** + * Initialises the heap singleton and saves the address + * of the calling stack frame as the stack_end. Presumeably + * this address points to the stack frame of the compiled + * LLVM executable after linking. (NOT CONFIRMED) + */ + void Heap::init() { + Heap *heap = Heap::the(); + heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); + } + + /** + * Allocates a given amount of bytes on the heap. + * + * @param size The amount of bytes to be allocated. + * + * @return A pointer to the address where the memory + * has been allocated. This pointer is supposed + * to be casted to and object pointer. + */ + void *Heap::alloc(size_t size) { + + // Singleton + Heap *heap = Heap::the(); + + if (size < 0) { + cout << "Heap: Cannot alloc less than 0B. No bytes allocated." << endl; + return nullptr; } - // kolla freed chunks innan - // denna är helt onödig just nu, freed chunks kommer alltid va tom - for (size_t i = 0; i < m_freed_chunks.size(); i++) { - auto cp = m_freed_chunks.at(i); - if (cp->size > size) - { - // dela upp chunken och sno ena delen - size_t diff = cp->size - size; - - auto chunk_complement = new Chunk; - chunk_complement->size = diff; - chunk_complement->start = cp->start + cp->size; + if (heap->m_size + size > HEAP_SIZE) { + collect(); + // If collect failed, crash with OOM error + assert(heap->m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); + } - m_freed_chunks.erase(m_freed_chunks.begin() + i); - m_freed_chunks.push_back(chunk_complement); - m_allocated_chunks.push_back(cp); - - return cp->start; - } - else if (cp->size == size) - { - // sno hela chunken - m_freed_chunks.erase(m_freed_chunks.begin() + i); - m_allocated_chunks.push_back(cp); - return cp->start; - } + // If a chunk was recycled, return the old chunk address + uintptr_t *reused_chunk = try_recycle_chunks(size); + if (reused_chunk != nullptr) { + return (void *)reused_chunk; } - // Om inga free chunks finns, skapa ny chunk + // If no free chunks was found (reused_chunk is a nullptr), + // then create a new chunk auto new_chunk = new Chunk; new_chunk->size = size; new_chunk->start = (uintptr_t *)m_heap + m_size; @@ -63,32 +68,55 @@ namespace GC { return new_chunk->start; } - void Heap::collect() { + uintptr_t *Heap::try_recycle_chunks(size_t size) { + auto heap = Heap::the(); + // Check if there are any freed chunks large enough for current request + for (size_t i = 0; i < heap->m_freed_chunks.size(); i++) { + auto cp = heap->m_freed_chunks.at(i); + if (cp->size > size) + { + // Split the chunk, use one part and add the remaining part to + // the list of freed chunks + size_t diff = cp->size - size; + + auto chunk_complement = new Chunk; + chunk_complement->size = diff; + chunk_complement->start = cp->start + cp->size; + + heap->m_freed_chunks.erase(m_freed_chunks.begin() + i); + heap->m_freed_chunks.push_back(chunk_complement); + heap->m_allocated_chunks.push_back(cp); + + return cp->start; + } + else if (cp->size == size) + { + // Reuse the whole chunk + m_freed_chunks.erase(m_freed_chunks.begin() + i); + m_allocated_chunks.push_back(cp); + return cp->start; + } + } + } + + void Heap::collect() { + // Get the adress of the current stack frame + auto heap = Heap::the(); + + uintptr_t *stack_end; - // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - // looking at 10 stack frames back - const uintptr_t *stack_end = (uintptr_t *)0; // temporary - - // denna segfaultar om arg för __b_f_a är > 2 - // reinterpret_cast(__builtin_frame_address(10)); + if (heap->m_stack_end != nullptr) + stack_end = heap->m_stack_end; + else + stack_end = (uintptr_t *)0; // temporary + auto work_list = m_allocated_chunks; mark(stack_start, stack_end, work_list); sweep(); - // compact(); - free(); - - // We shouldn't do this, since then m_freed_chunks doesnt' have any real purpose, - // it should be used in alloc, it isn't if we delete *all* of its contentes - // release free chunks - // while (m_freed_chunks.size()) { - // auto chunk_pointer = m_freed_chunks.back(); - // m_freed_chunks.pop_back(); - // delete chunk_pointer; // deletes chunk object, doesn't free memory to the OS - // } } void Heap::free() { @@ -200,50 +228,6 @@ namespace GC { } } -/* void mark_test(vector worklist) { - while (worklist.size() > 0) { - Chunk *ref = worklist.pop_back(); - Chunk *child = (Chunk*) *ref; - if (child != NULL && !child->marked) { - child->marked = true; - worklist.push_back(child); - mark_test(worklist); - } - } - } - - void mark_from_roots(uintptr_t *start, const uintptr_t *end) { - vector worklist; - for (;start > end; start--) { - Chunk *ref = *start; - if (ref != NULL && !ref->marked) { - ref->marked = true; - worklist.push_back(ref); - mark_test(worklist); - } - } - } */ - - /* Alternative marking, pseudocode - mark_from_roots(): - worklist <- empty - for fld in Roots - ref <- *fld - if ref ≠ null && !marked(ref) - set_marked(ref) - worklist.add(ref) - mark() - - mark(): - while size(worklist) > 0 - ref <- remove_first(worklist) - for fld in Pointers(ref) - child <- *fld - if child ≠ null && !marked(child) - set_marked(child) - worklist.add(child) - */ - // For testing purposes void Heap::print_line(Chunk *chunk) { cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << endl; diff --git a/src/GC/todo.md b/src/GC/todo.md index 3386d65..009ab51 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -7,7 +7,7 @@ Goal for next week (24/2): ## GC TODO: - Merge to main branch -- Don't empty m_free_chunks, reuse in a better way **Victor fixes this** +- Fix singleton references ## Tests TODO ### Library linking From 3473c953b5c4d247c81e36ecd246855c9a6ed3fb Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Sun, 19 Feb 2023 21:02:08 +0100 Subject: [PATCH 20/32] Wrote a test for shared library linking --- src/GC/Makefile | 31 ++++++++--- src/GC/include/heap.hpp | 17 +++--- src/GC/lib/heap.cpp | 106 ++++++++++++++++++------------------ src/GC/lib/heap.o | Bin 0 -> 137120 bytes src/GC/lib/libheap.so | Bin 0 -> 82728 bytes src/GC/tests/extern_lib.cpp | 52 ++++++++++++++++++ src/GC/tests/h_test.cpp | 2 +- 7 files changed, 139 insertions(+), 69 deletions(-) create mode 100644 src/GC/lib/heap.o create mode 100755 src/GC/lib/libheap.so create mode 100644 src/GC/tests/extern_lib.cpp diff --git a/src/GC/Makefile b/src/GC/Makefile index 6ca9320..b99d2a4 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,17 +1,23 @@ mkfile_path = $(abspath $(lastword $(MAKEFILE_LIST))) current_dir = $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) -PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include -CC = clang++ -PWD = /home/virre/dev/systemF/org/language/src/GC/include -CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I -VGFLAGS = --leak-check=full --show-leak-kinds=all +CC = clang++ + +PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include +LIB_INCL = -I/home/virre/dev/systemF/org/language/src/GC/include +LIB_SO = -L/home/virre/dev/systemF/org/language/src/GC/lib/libheap.so + +CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I +VGFLAGS = --leak-check=full --show-leak-kinds=all +STDFLAGS = -std=gnu++20 -stdlib=libc++ +WFLAGS = -Wall -Wextra +DBGFLAGS = -g heap: - $(CC) $(CFLAGS)$(PWD) lib/heap.cpp + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) lib/heap.cpp h_test: rm -f tests/h_test.out - $(CC) $(CFLAGS)$(PWD) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) tests/h_test.cpp lib/heap.cpp -o tests/h_test.out h_test_vg: make h_test @@ -23,8 +29,15 @@ h_test_dbg: linker: rm -f tests/linker.out - $(CC) $(CFLAGS)$(PWD) tests/linker.cpp lib/heap.cpp -o tests/linker.out + $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) tests/linker.cpp lib/heap.cpp -o tests/linker.out linker_vg: make linker - valgrind $(VGFLAGS) tests/linker.out \ No newline at end of file + valgrind $(VGFLAGS) tests/linker.out + +extern_lib: + rm -f lib/heap.o + rm -f lib/libheap.so + $(CC) $(STDFLAGS) -c -fPIC -o lib/heap.o lib/heap.cpp + $(CC) $(STDFLAGS) -shared -o lib/libheap.so lib/heap.o + $(CC) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp \ No newline at end of file diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 0962c9f..d0f805d 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -29,11 +29,11 @@ namespace GC { m_allocated_size = 0; } - void collect(); - void sweep(); - uintptr_t *try_recycle_chunks(size_t size); - void free(); - void free_overlap(); + void collect(Heap *heap); + void sweep(Heap *heap); + uintptr_t *try_recycle_chunks(Heap *heap, size_t size); + void free(Heap *heap); + void free_overlap(Heap *heap); void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); void print_line(Chunk *chunk); void print_worklist(std::vector list); @@ -61,9 +61,12 @@ namespace GC { std::free((char *)m_heap); } - void init(); void *alloc(size_t size); + void init(); + + // DEBUG ONLY + void check_init(); + void collect(uint flags); void print_contents(); - void collect(uint flags); // DEBUG ONLY }; } \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index d6ac52d..a222833 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -7,7 +7,7 @@ #include #include -#include "heap.hpp" +#include "../include/heap.hpp" using namespace std; namespace GC { @@ -18,6 +18,13 @@ namespace GC { * this address points to the stack frame of the compiled * LLVM executable after linking. (NOT CONFIRMED) */ + void Heap::check_init() { + auto heap = Heap::the(); + cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + cout << "GC stack_start:\t" << stack_start << endl; + } + void Heap::init() { Heap *heap = Heap::the(); heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); @@ -43,13 +50,13 @@ namespace GC { } if (heap->m_size + size > HEAP_SIZE) { - collect(); + collect(heap); // If collect failed, crash with OOM error assert(heap->m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); } // If a chunk was recycled, return the old chunk address - uintptr_t *reused_chunk = try_recycle_chunks(size); + uintptr_t *reused_chunk = try_recycle_chunks(heap, size); if (reused_chunk != nullptr) { return (void *)reused_chunk; } @@ -58,18 +65,17 @@ namespace GC { // then create a new chunk auto new_chunk = new Chunk; new_chunk->size = size; - new_chunk->start = (uintptr_t *)m_heap + m_size; + new_chunk->start = (uintptr_t *)(heap->m_heap + m_size); - m_size += size; + heap->m_size += size; - m_allocated_chunks.push_back(new_chunk); + heap->m_allocated_chunks.push_back(new_chunk); // new_chunk should probably be a unique pointer, if that isn't implicit already return new_chunk->start; } - uintptr_t *Heap::try_recycle_chunks(size_t size) { - auto heap = Heap::the(); + uintptr_t *Heap::try_recycle_chunks(Heap *heap, size_t size) { // Check if there are any freed chunks large enough for current request for (size_t i = 0; i < heap->m_freed_chunks.size(); i++) { auto cp = heap->m_freed_chunks.at(i); @@ -92,16 +98,16 @@ namespace GC { else if (cp->size == size) { // Reuse the whole chunk - m_freed_chunks.erase(m_freed_chunks.begin() + i); - m_allocated_chunks.push_back(cp); + heap->m_freed_chunks.erase(m_freed_chunks.begin() + i); + heap->m_allocated_chunks.push_back(cp); return cp->start; } } + return nullptr; } - void Heap::collect() { + void Heap::collect(Heap *heap) { // Get the adress of the current stack frame - auto heap = Heap::the(); uintptr_t *stack_end; @@ -111,38 +117,38 @@ namespace GC { else stack_end = (uintptr_t *)0; // temporary - auto work_list = m_allocated_chunks; + auto work_list = heap->m_allocated_chunks; mark(stack_start, stack_end, work_list); - sweep(); + sweep(heap); - free(); + free(heap); } - void Heap::free() { - if (m_freed_chunks.size() > FREE_THRESH) { - while (m_freed_chunks.size()) { - auto chunk = m_freed_chunks.back(); - m_freed_chunks.pop_back(); + void Heap::free(Heap *heap) { + if (heap->m_freed_chunks.size() > FREE_THRESH) { + while (heap->m_freed_chunks.size()) { + auto chunk = heap->m_freed_chunks.back(); + heap->m_freed_chunks.pop_back(); delete chunk; } } else { - free_overlap(); + free_overlap(heap); } } - void Heap::free_overlap() { + void Heap::free_overlap(Heap *heap) { std::vector filtered; size_t i = 0; - filtered.push_back(m_freed_chunks.at(i++)); - for (; i < m_freed_chunks.size(); i++) { + filtered.push_back(heap->m_freed_chunks.at(i++)); + for (; i < heap->m_freed_chunks.size(); i++) { auto prev = filtered.back(); - auto next = m_freed_chunks.at(i); + auto next = heap->m_freed_chunks.at(i); if (next->start > (prev->start + prev->size)) { filtered.push_back(next); } } - m_freed_chunks.swap(filtered); + heap->m_freed_chunks.swap(filtered); } void Heap::collect(uint flags) { @@ -155,16 +161,20 @@ namespace GC { if (flags & FREE) cout << "\n - FREE"; cout << endl; + + auto heap = Heap::the(); + // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); cout << "Stack start:\t" << stack_start << endl; + uintptr_t *stack_end; - const uintptr_t *stack_end = (uintptr_t *) stack_start - 40; // dummy value - - // denna segfaultar om arg för __b_f_a är > 2 - // reinterpret_cast(__builtin_frame_address(10)); + if (heap->m_stack_end != nullptr) + stack_end = heap->m_stack_end; + else + stack_end = (uintptr_t *) stack_start - 40; // dummy value - auto work_list = m_allocated_chunks; + auto work_list = heap->m_allocated_chunks; // print_worklist(work_list); if (flags & MARK) { @@ -172,31 +182,22 @@ namespace GC { } if (flags & SWEEP) { - sweep(); + sweep(heap); } if (flags & FREE) { - free(); + free(heap); } - - //release free chunks - // if (flags & FREE) { - // while (m_freed_chunks.size()) { - // auto chunk_pointer = m_freed_chunks.back(); - // m_freed_chunks.pop_back(); - // delete chunk_pointer; // deletes chunk object, doesn't free heap memory to the OS - // } - // } } // Not optimal for now, it doesn't have to loop over all objects // but mark needs some refinements before this can be optimised - void Heap::sweep() { - for (auto it = m_allocated_chunks.begin(); it != m_allocated_chunks.end();) { + void Heap::sweep(Heap *heap) { + for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { auto chunk = *it; if (!chunk->marked) { - m_freed_chunks.push_back(chunk); - it = m_allocated_chunks.erase(it); + heap->m_freed_chunks.push_back(chunk); + it = heap->m_allocated_chunks.erase(it); } else { ++it; @@ -240,17 +241,18 @@ namespace GC { } void Heap::print_contents() { - if (m_allocated_chunks.size()) { - cout << "\nALLOCATED CHUNKS #" << m_allocated_chunks.size() << endl; - for (auto chunk : m_allocated_chunks) { + auto heap = Heap::the(); + if (heap->m_allocated_chunks.size()) { + cout << "\nALLOCATED CHUNKS #" << heap->m_allocated_chunks.size() << endl; + for (auto chunk : heap->m_allocated_chunks) { print_line(chunk); } } else { cout << "NO ALLOCATIONS\n" << endl; } - if (m_freed_chunks.size()) { - cout << "\nFREED CHUNKS #" << m_freed_chunks.size() << endl; - for (auto fchunk : m_freed_chunks) { + if (heap->m_freed_chunks.size()) { + cout << "\nFREED CHUNKS #" << heap->m_freed_chunks.size() << endl; + for (auto fchunk : heap->m_freed_chunks) { print_line(fchunk); } } else { diff --git a/src/GC/lib/heap.o b/src/GC/lib/heap.o new file mode 100644 index 0000000000000000000000000000000000000000..2f2a154ff8b4dc0a38c5b68f34e79b2532e61b68 GIT binary patch literal 137120 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 W!E9tA02==npc}|Q`fRYQe*^$yer1UO literal 0 HcmV?d00001 diff --git a/src/GC/lib/libheap.so b/src/GC/lib/libheap.so new file mode 100755 index 0000000000000000000000000000000000000000..83a12f5ef67d8631d46ad720d2011d668f3603a9 GIT binary patch literal 82728 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 XgiZegD~Jo3ArwS0)UR+30|Ns93Oj=B literal 0 HcmV?d00001 diff --git a/src/GC/tests/extern_lib.cpp b/src/GC/tests/extern_lib.cpp new file mode 100644 index 0000000..5f3e0c7 --- /dev/null +++ b/src/GC/tests/extern_lib.cpp @@ -0,0 +1,52 @@ +#include +#include + +#include "heap.hpp" + +// using namespace std; + +// GC::Heap *singleton_test(); +// void init_gc(GC::Heap *heap); +// void frame_test(GC::Heap *heap); + +GC::Heap *singleton_test() { + std::cout << "TESTING SINGLETON INSTANCES" << std::endl; + std::cout << "===========================" << std::endl; + std::cout << "Call 1:\t" << GC::Heap::the() << std::endl; + GC::Heap *heap = GC::Heap::the(); + std::cout << "Call 2:\t" << heap << std::endl; + std::cout << "===========================" << std::endl; + return heap; +} + +void init_gc(GC::Heap *heap){ + std::cout << "\n\n INITIALIZING THE HEAP" << std::endl; + std::cout << "===========================" << std::endl; + heap->init(); + std::cout << "===========================" << std::endl; +} + +void frame_test(GC::Heap *heap) { + std::cout << "\n\n TESTING FRAME ADDRESSES" << std::endl; + std::cout << "===========================" << std::endl; + +#pragma clang diagnostic ignored "-Wframe-address" + auto curr_frame = reinterpret_cast(__builtin_frame_address(0)); + std::cout << "Current stack frame:\t" << curr_frame << std::endl; +#pragma clang diagnostic ignored "-Wframe-address" + auto prev_frame = reinterpret_cast(__builtin_frame_address(1)); + std::cout << "Previous stack frame:\t" << prev_frame << std::endl; + + heap->check_init(); + + std::cout << "===========================" << std::endl; +} + +int main() { + auto heap = singleton_test(); + + init_gc(heap); + frame_test(heap); + + return 0; +} \ No newline at end of file diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 76e2434..774f091 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -1,6 +1,6 @@ #include "../include/heap.hpp" -GC::Heap *gc = GC::Heap::the2(); +GC::Heap *gc = GC::Heap::the(); void init() { From 6cd6edb594202216eb101f539e82c4225af9d6d1 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Mon, 20 Feb 2023 11:45:07 +0100 Subject: [PATCH 21/32] Fixed mark skipping Co-authored-by: ValterMiari --- src/GC/Makefile | 3 +- src/GC/lib/heap.cpp | 56 ++++++++++++++++++++++++++++++------ src/GC/lib/heap.o | Bin 137120 -> 138408 bytes src/GC/lib/libheap.so | Bin 82728 -> 82920 bytes src/GC/tests/extern_lib.cpp | 10 +++---- src/GC/tests/h_test.cpp | 25 ++++++++++++---- 6 files changed, 73 insertions(+), 21 deletions(-) diff --git a/src/GC/Makefile b/src/GC/Makefile index b99d2a4..00389c3 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -36,8 +36,7 @@ linker_vg: valgrind $(VGFLAGS) tests/linker.out extern_lib: - rm -f lib/heap.o - rm -f lib/libheap.so + rm -f lib/heap.o lib/libheap.so tests/extern_lib.out $(CC) $(STDFLAGS) -c -fPIC -o lib/heap.o lib/heap.cpp $(CC) $(STDFLAGS) -shared -o lib/libheap.so lib/heap.o $(CC) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index a222833..d13cec6 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -20,6 +20,7 @@ namespace GC { */ void Heap::check_init() { auto heap = Heap::the(); + cout << "Heap addr:\t" << heap << endl; cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; auto stack_start = reinterpret_cast(__builtin_frame_address(0)); cout << "GC stack_start:\t" << stack_start << endl; @@ -172,10 +173,11 @@ namespace GC { if (heap->m_stack_end != nullptr) stack_end = heap->m_stack_end; else - stack_end = (uintptr_t *) stack_start - 40; // dummy value + stack_end = (uintptr_t *) stack_start - 80; // dummy value + cout << "Stack end in collect: " << stack_end << endl; auto work_list = heap->m_allocated_chunks; - // print_worklist(work_list); + //print_worklist(work_list); if (flags & MARK) { mark(stack_start, stack_end, work_list); @@ -210,20 +212,58 @@ namespace GC { void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { for (; start > end; start--) { // to find adresses thats in the worklist if (*start % 8 == 0) { // all pointers must be aligned as double words - for (size_t i = 0; i < worklist.size(); i++) { // fix this - auto chunk = worklist.at(i); + for (auto it = worklist.begin(); it != worklist.end();) { + //for (size_t i = 0; i < worklist.size(); i++) { // fix this + //auto chunk = worklist.at(i); + auto chunk = *it; uintptr_t c_start = reinterpret_cast(chunk->start); uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); if (c_start <= *start && *start < c_end) { uintptr_t c_start = reinterpret_cast(chunk->start); if (!chunk->marked) { chunk->marked = true; - worklist.erase(worklist.begin() + i); - auto new_stack_start = reinterpret_cast(start); - mark(new_stack_start, end, worklist); // - return; + //worklist.erase(worklist.begin() + i); + it = worklist.erase(it); + //auto new_stack_start = reinterpret_cast(start); + //mark(new_stack_start, end, worklist); // + //return; + } + else { + ++it; } } + else { + ++it; + } + } + } + } + } + + // Mark child references from the root references + void mark_test(vector worklist) { + while (worklist.size() > 0) { + Chunk *ref = worklist.back(); + worklist.pop_back(); + Chunk *child = (Chunk*) ref; // this is probably not correct + if (child != nullptr && !child->marked) { + child->marked = true; + worklist.push_back(child); + mark_test(worklist); + } + } + } + + // Mark the root references and look for child references to them + void mark_from_roots(uintptr_t *start, const uintptr_t *end) { + vector worklist; + for (;start > end; start --) { + if (*start % 8 == 0) { // all pointers must be aligned as double words + Chunk *ref = (Chunk*) *start; + if (ref != nullptr && !ref->marked) { + ref->marked = true; + worklist.push_back(ref); + //mark_test(worklist) } } } diff --git a/src/GC/lib/heap.o b/src/GC/lib/heap.o index 2f2a154ff8b4dc0a38c5b68f34e79b2532e61b68..0e5421d2990b2561b9577b4d3ef9c10913213458 100644 GIT binary patch delta 30176 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 TIy0JcJ+OkbqnQ~&VI~Iv15=k% diff --git a/src/GC/tests/extern_lib.cpp b/src/GC/tests/extern_lib.cpp index 5f3e0c7..2d47576 100644 --- a/src/GC/tests/extern_lib.cpp +++ b/src/GC/tests/extern_lib.cpp @@ -3,11 +3,9 @@ #include "heap.hpp" -// using namespace std; - -// GC::Heap *singleton_test(); -// void init_gc(GC::Heap *heap); -// void frame_test(GC::Heap *heap); +GC::Heap *singleton_test(); +void init_gc(GC::Heap *heap); +void frame_test(GC::Heap *heap); GC::Heap *singleton_test() { std::cout << "TESTING SINGLETON INSTANCES" << std::endl; @@ -38,11 +36,13 @@ void frame_test(GC::Heap *heap) { std::cout << "Previous stack frame:\t" << prev_frame << std::endl; heap->check_init(); + // auto alloced = heap->alloc(sizeof(unsigned long)); std::cout << "===========================" << std::endl; } int main() { + std::cout << "in main" << std::endl; auto heap = singleton_test(); init_gc(heap); diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 774f091..65f51d6 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -2,21 +2,34 @@ GC::Heap *gc = GC::Heap::the(); +/* void assign(int *dst) { + int *local = static_cast(gc->alloc(sizeof(int))); + *local = 10; + dst = reinterpret_cast(dst); + *dst = local; +} */ + void init() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - auto stack_end = stack_start - 40; + //auto stack_end = stack_start - 40; std::cout << "Stack start from init:\t" << stack_start << std::endl; - std::cout << "Imaginary stack end:\t" << stack_end << std::endl; + //std::cout << "Imaginary stack end:\t" << stack_end << std::endl; int *arr = static_cast(gc->alloc(sizeof(int) * 100)); - std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; + //std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; for (int i = 0; i < (sizeof(int) * 100); i++) { arr[i] = i; } - std::cout << "First stack pointer:\t" << &arr << std::endl; + for (int i = 0; i < (sizeof(int) * 20); i++) { + gc->alloc(sizeof(int)); + } + std::cout << "Pointer for arr:\t" << &arr << std::endl; long a = 20; long *l = static_cast(gc->alloc(sizeof(long))); - l = &a; + std::cout << "Pointer for l:\t\t" << &l << std::endl; + int *i = static_cast(gc->alloc(sizeof(int))); + std::cout << "Pointer for i:\t\t" << &i << std::endl; + //l = &a; //*l = 20; } @@ -24,7 +37,7 @@ int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; init(); - gc->collect(MARK | SWEEP | FREE); + gc->collect(MARK | SWEEP); // some bug in free (vector out of range) gc->print_contents(); //delete gc; return 0; From 3860d0ec4f04ed1307631574d96cf2634bdacb2f Mon Sep 17 00:00:00 2001 From: valtermiari Date: Mon, 20 Feb 2023 14:34:57 +0100 Subject: [PATCH 22/32] Tweaked sweeping, test with detached pointers --- src/GC/lib/heap.cpp | 42 +++++++++++++++++++++-------------------- src/GC/tests/h_test.cpp | 32 ++++++++++++++++++------------- src/GC/todo.md | 1 + 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index d13cec6..f2d04ee 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -192,49 +192,51 @@ namespace GC { } } - // Not optimal for now, it doesn't have to loop over all objects - // but mark needs some refinements before this can be optimised + /** + * Sweeps the heap, unmarks the marked chunks for the next cycle, + * adds the unmarked nodes to the vector of freed chunks; to be freed. + * + * @param *heap The heap to oporate on. + */ void Heap::sweep(Heap *heap) { for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { auto chunk = *it; - if (!chunk->marked) { + + // Unmark the marked chunks for the next iteration. + if (chunk->marked) { + chunk->marked = false; + ++it; + } + else { + // Add the unmarked chunks to freed chunks and remove from + // the list of allocated chunks heap->m_freed_chunks.push_back(chunk); it = heap->m_allocated_chunks.erase(it); } - else { - ++it; - } } } - // TODO: return the worklist filtered on mark = true // This assumes that there are no chains of pointers, will be fixed later on void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { for (; start > end; start--) { // to find adresses thats in the worklist if (*start % 8 == 0) { // all pointers must be aligned as double words for (auto it = worklist.begin(); it != worklist.end();) { - //for (size_t i = 0; i < worklist.size(); i++) { // fix this - //auto chunk = worklist.at(i); auto chunk = *it; uintptr_t c_start = reinterpret_cast(chunk->start); uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); - if (c_start <= *start && *start < c_end) { - uintptr_t c_start = reinterpret_cast(chunk->start); - if (!chunk->marked) { + // Check if the stack pointer aligns with the chunk + if ((c_start <= *start && *start < c_end) && chunk != nullptr) { + cout << "Chunk start:\t" << c_start << endl; + cout << "Chunk end:\t" << c_end << endl; + if (!chunk->marked) { chunk->marked = true; - //worklist.erase(worklist.begin() + i); it = worklist.erase(it); - //auto new_stack_start = reinterpret_cast(start); - //mark(new_stack_start, end, worklist); // - //return; } - else { + else ++it; - } } - else { + else ++it; - } } } } diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 65f51d6..cd93f7e 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -9,36 +9,42 @@ GC::Heap *gc = GC::Heap::the(); *dst = local; } */ +void create_array(size_t size) { + int *arr = static_cast(gc->alloc(sizeof(int) * size)); +} + +void detach_pointer(long **ptr) { + long dummy = 10; // dummy value + long *dummy_ptr = &dummy; + *ptr = dummy_ptr; + std::cout << "Dummy pointer: \t" << dummy_ptr << std::endl; + std::cout << "Detach pointer result:\t" << ptr << std::endl; +} + void init() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - //auto stack_end = stack_start - 40; std::cout << "Stack start from init:\t" << stack_start << std::endl; - //std::cout << "Imaginary stack end:\t" << stack_end << std::endl; int *arr = static_cast(gc->alloc(sizeof(int) * 100)); + create_array(100); + //arr = create_array(100); //std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; for (int i = 0; i < (sizeof(int) * 100); i++) { arr[i] = i; } - for (int i = 0; i < (sizeof(int) * 20); i++) { - gc->alloc(sizeof(int)); - } std::cout << "Pointer for arr:\t" << &arr << std::endl; - long a = 20; long *l = static_cast(gc->alloc(sizeof(long))); - std::cout << "Pointer for l:\t\t" << &l << std::endl; - int *i = static_cast(gc->alloc(sizeof(int))); - std::cout << "Pointer for i:\t\t" << &i << std::endl; - //l = &a; - //*l = 20; + std::cout << "l points to:\t\t" << l << std::endl; + detach_pointer(&l); + std::cout << "l points to:\t\t" << l << std::endl; + // l still gets marked, which is not supposed to happen } int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; init(); - gc->collect(MARK | SWEEP); // some bug in free (vector out of range) + gc->collect(MARK); // some bug in free (vector out of range) gc->print_contents(); - //delete gc; return 0; } \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md index 009ab51..f1e60a2 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -8,6 +8,7 @@ Goal for next week (24/2): ## GC TODO: - Merge to main branch - Fix singleton references +- Think about how we want to determine if some object is a pointer or not, probably will have to discuss that with Samuel. Since it is not ideal to determine in the GC if an object is a pointer or not. It should preferably be done in a previous stage. ## Tests TODO ### Library linking From 6679fb6bb736f4a62f9178ffcdaa5b55c974c3c9 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Mon, 20 Feb 2023 18:15:58 +0100 Subject: [PATCH 23/32] Fixed heap DLL linking --- src/GC/Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/GC/Makefile b/src/GC/Makefile index 00389c3..1039403 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -4,7 +4,8 @@ CC = clang++ PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include LIB_INCL = -I/home/virre/dev/systemF/org/language/src/GC/include -LIB_SO = -L/home/virre/dev/systemF/org/language/src/GC/lib/libheap.so +LIB_SO = -L/home/virre/dev/systemF/org/language/src/GC/lib +LIB_LINK = /home/virre/dev/systemF/org/language/src/GC/lib CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I VGFLAGS = --leak-check=full --show-leak-kinds=all @@ -39,4 +40,6 @@ extern_lib: rm -f lib/heap.o lib/libheap.so tests/extern_lib.out $(CC) $(STDFLAGS) -c -fPIC -o lib/heap.o lib/heap.cpp $(CC) $(STDFLAGS) -shared -o lib/libheap.so lib/heap.o - $(CC) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp \ No newline at end of file + $(CC) $(STDFLAGS) $(WFLAGS) $(LIB_INCL) -v tests/extern_lib.cpp lib/heap.cpp -o tests/extern_lib.out + $(CC) $(STDFLAGS) $(LIB_INCL) $(LIB_SO) -v -Wall -o tests/extern_lib.out tests/extern_lib.cpp -lheap + LD_LIBRARY_PATH=$(LIB_LINK) tests/extern_lib.out \ No newline at end of file From 79886e70de48404ab939d2024d405e32c24c02a2 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Tue, 21 Feb 2023 17:38:45 +0100 Subject: [PATCH 24/32] Some tweaks in mark. Testing of chain references --- src/GC/lib/heap.cpp | 54 +++++++++++++++++++-------------- src/GC/tests/h_test.cpp | 66 +++++++++++++++++++++++++++-------------- 2 files changed, 76 insertions(+), 44 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index f2d04ee..e178a38 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -200,46 +200,56 @@ namespace GC { */ void Heap::sweep(Heap *heap) { for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { - auto chunk = *it; + Chunk *chunk = *it; - // Unmark the marked chunks for the next iteration. - if (chunk->marked) { - chunk->marked = false; - ++it; - } - else { - // Add the unmarked chunks to freed chunks and remove from - // the list of allocated chunks - heap->m_freed_chunks.push_back(chunk); - it = heap->m_allocated_chunks.erase(it); - } + // Unmark the marked chunks for the next iteration. + if (chunk->marked) { + chunk->marked = false; + ++it; + } + else { + // Add the unmarked chunks to freed chunks and remove from + // the list of allocated chunks + heap->m_freed_chunks.push_back(chunk); + it = heap->m_allocated_chunks.erase(it); + } } } // This assumes that there are no chains of pointers, will be fixed later on void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { - for (; start > end; start--) { // to find adresses thats in the worklist - if (*start % 8 == 0) { // all pointers must be aligned as double words + int counter = 0; + // To find adresses thats in the worklist + for (; start > end; start--) { + counter++; + // all pointers must be aligned as double words + if (*start % 8 == 0) { + for (auto it = worklist.begin(); it != worklist.end();) { - auto chunk = *it; + Chunk *chunk = *it; uintptr_t c_start = reinterpret_cast(chunk->start); uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); + // Check if the stack pointer aligns with the chunk - if ((c_start <= *start && *start < c_end) && chunk != nullptr) { - cout << "Chunk start:\t" << c_start << endl; - cout << "Chunk end:\t" << c_end << endl; - if (!chunk->marked) { + //if ((c_start <= *start && *start < c_end) && chunk != nullptr) { + if (c_start == *start) { + cout << "Start points to:\t" << hex << *start << endl; + cout << "Chunk start:\t\t" << hex << c_start << endl; + cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; + + if (!chunk->marked) { chunk->marked = true; it = worklist.erase(it); } else ++it; - } + } else ++it; - } + } } } + cout << "Counter: " << counter << endl; } // Mark child references from the root references @@ -265,7 +275,7 @@ namespace GC { if (ref != nullptr && !ref->marked) { ref->marked = true; worklist.push_back(ref); - //mark_test(worklist) + mark_test(worklist); } } } diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index cd93f7e..ddbf29f 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -2,48 +2,70 @@ GC::Heap *gc = GC::Heap::the(); -/* void assign(int *dst) { - int *local = static_cast(gc->alloc(sizeof(int))); - *local = 10; - dst = reinterpret_cast(dst); - *dst = local; -} */ +struct Node { + int id; + Node *child; +}; + +Node *create_chain(int depth) { + Node* nodes[depth]; + if (depth > 0) { + Node *last_node = static_cast(gc->alloc(sizeof(Node))); + last_node->id = depth; + last_node->child = nullptr; + nodes[0] = last_node; + for (int i = 1; i < depth; i++) { + Node *node = static_cast(gc->alloc(sizeof(Node))); + node->id = depth-i; + node->child = nodes[i-1]; + nodes[i] = node; + } + return nodes[depth]; + } + else + return 0; +} void create_array(size_t size) { int *arr = static_cast(gc->alloc(sizeof(int) * size)); } void detach_pointer(long **ptr) { - long dummy = 10; // dummy value - long *dummy_ptr = &dummy; + long *dummy_ptr = nullptr; *ptr = dummy_ptr; - std::cout << "Dummy pointer: \t" << dummy_ptr << std::endl; - std::cout << "Detach pointer result:\t" << ptr << std::endl; } -void init() { - +void test_chain(int depth, bool detach) { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - std::cout << "Stack start from init:\t" << stack_start << std::endl; - int *arr = static_cast(gc->alloc(sizeof(int) * 100)); - create_array(100); - //arr = create_array(100); - //std::cout << "Arr_ptr" << std::hex << arr << "\n\n\n" << std::endl; - for (int i = 0; i < (sizeof(int) * 100); i++) { - arr[i] = i; - } - std::cout << "Pointer for arr:\t" << &arr << std::endl; + std::cout << "Stack start from test_chain:\t" << stack_start << std::endl; + + Node *node_chain = create_chain(depth); + // This generates a segmentation fault (should be investigated further) + if (detach) + node_chain->child = nullptr; + +} + +void test_some_types() { + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + std::cout << "Stack start from test_some_types:\t" << stack_start << std::endl; + long *l = static_cast(gc->alloc(sizeof(long))); std::cout << "l points to:\t\t" << l << std::endl; detach_pointer(&l); std::cout << "l points to:\t\t" << l << std::endl; // l still gets marked, which is not supposed to happen + + // Some more dummy values of different sizes, to test stack pointer alignment + int *i = static_cast(gc->alloc(sizeof(int))); + char *c = static_cast(gc->alloc(sizeof(int))); + short *s = static_cast(gc->alloc(sizeof(short))); } int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; - init(); + test_chain(10, false); gc->collect(MARK); // some bug in free (vector out of range) gc->print_contents(); return 0; From 07bf2c8f4896e389b91a81ce0dad31bc3a75fbe5 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Wed, 22 Feb 2023 12:12:43 +0100 Subject: [PATCH 25/32] Fixed bug in free and some small testing additions --- src/GC/lib/heap.cpp | 15 ++++++++++++--- src/GC/tests/h_test.cpp | 21 +++++++++++++++++++-- src/GC/todo.md | 3 +++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index e178a38..efc7c80 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -133,18 +133,27 @@ namespace GC { heap->m_freed_chunks.pop_back(); delete chunk; } - } else { + } + else if (heap->m_freed_chunks.size()) { free_overlap(heap); } + // No freed chunks, nothing to free + else { + return; + } } void Heap::free_overlap(Heap *heap) { std::vector filtered; size_t i = 0; filtered.push_back(heap->m_freed_chunks.at(i++)); + //cout << filtered.back()->start << endl; for (; i < heap->m_freed_chunks.size(); i++) { auto prev = filtered.back(); + cout << "Previous start:\t" << prev->start << endl; + cout << "Previous end:\t" << prev->start + prev->size << endl; auto next = heap->m_freed_chunks.at(i); + cout << "Next start:\t" << next->start << endl; if (next->start > (prev->start + prev->size)) { filtered.push_back(next); } @@ -167,7 +176,7 @@ namespace GC { // get the frame adress, whwere local variables and saved registers are located auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - cout << "Stack start:\t" << stack_start << endl; + cout << "Stack start in collect:\t" << stack_start << endl; uintptr_t *stack_end; if (heap->m_stack_end != nullptr) @@ -175,7 +184,7 @@ namespace GC { else stack_end = (uintptr_t *) stack_start - 80; // dummy value - cout << "Stack end in collect: " << stack_end << endl; + cout << "Stack end in collect:\t " << stack_end << endl; auto work_list = heap->m_allocated_chunks; //print_worklist(work_list); diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index ddbf29f..97ebdec 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -65,8 +65,25 @@ void test_some_types() { int main() { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; - test_chain(10, false); - gc->collect(MARK); // some bug in free (vector out of range) + // This is allocated outside of the scope of the GC, thus garbage + for (int i = 0; i < 10; i++) { + gc->alloc(sizeof(int)); + } + /* int depth = 10; + Node* nodes[depth]; + Node *last_node = static_cast(gc->alloc(sizeof(Node))); + last_node->id = depth; + last_node->child = nullptr; + nodes[0] = last_node; + for (int i = 1; i < depth; i++) { + Node *node = static_cast(gc->alloc(sizeof(Node))); + node->id = depth-i; + node->child = nodes[i-1]; + nodes[i] = node; + } */ + //test_chain(10, false); + //test_some_types(); + gc->collect(MARK | SWEEP | FREE); // free misses some chunks gc->print_contents(); return 0; } \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md index f1e60a2..7011610 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -8,6 +8,9 @@ Goal for next week (24/2): ## GC TODO: - Merge to main branch - Fix singleton references +- Get a good grasp of how the adressing of stack frames actually works. +- Debug "free()", sometimes it skips chunks that should be freed. +- Check alignment of chunks. - Think about how we want to determine if some object is a pointer or not, probably will have to discuss that with Samuel. Since it is not ideal to determine in the GC if an object is a pointer or not. It should preferably be done in a previous stage. ## Tests TODO From ea6eab0bcf2d3f9f8b70d083f86dce806a6fd08a Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Wed, 22 Feb 2023 18:30:15 +0100 Subject: [PATCH 26/32] Fixed bugs on freeing chunks and stack-scanning Co-authored-by: ValterMiari --- .gitignore | 2 ++ src/GC/Makefile | 15 +++++------ src/GC/include/heap.hpp | 1 + src/GC/lib/heap.cpp | 57 ++++++++++++++++++++-------------------- src/GC/lib/heap.o | Bin 138408 -> 0 bytes src/GC/lib/libheap.so | Bin 82920 -> 0 bytes src/GC/tests/h_test.cpp | 31 ++++++++++------------ 7 files changed, 53 insertions(+), 53 deletions(-) delete mode 100644 src/GC/lib/heap.o delete mode 100755 src/GC/lib/libheap.so diff --git a/.gitignore b/.gitignore index 934c3da..1daddd6 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ llvm.ll /language .vscode/ +src/GC/lib/*.o +src/GC/lib/*.so src/GC/tests/*.out diff --git a/src/GC/Makefile b/src/GC/Makefile index 1039403..354adad 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -1,18 +1,17 @@ -mkfile_path = $(abspath $(lastword $(MAKEFILE_LIST))) -current_dir = $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) CC = clang++ - -PWD_V = /Users/valtermiari/Desktop/DV/Bachelors/code/language/src/GC/include -LIB_INCL = -I/home/virre/dev/systemF/org/language/src/GC/include -LIB_SO = -L/home/virre/dev/systemF/org/language/src/GC/lib -LIB_LINK = /home/virre/dev/systemF/org/language/src/GC/lib - +CWD = $(shell pwd) +LIB_INCL = -I$(CWD)/include +LIB_SO = -L$(CWD)/lib +LIB_LINK = $(CWD)/lib CFLAGS = -Wall -Wextra -v -g -std=gnu++20 -stdlib=libc++ -I VGFLAGS = --leak-check=full --show-leak-kinds=all STDFLAGS = -std=gnu++20 -stdlib=libc++ WFLAGS = -Wall -Wextra DBGFLAGS = -g +test_test: + echo "$(shell pwd)" + heap: $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) lib/heap.cpp diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index d0f805d..575d6f7 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -44,6 +44,7 @@ namespace GC { size_t m_allocated_size; uintptr_t *m_stack_end = nullptr; + // maybe change to std::list std::vector m_allocated_chunks; std::vector m_freed_chunks; diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index efc7c80..58c4966 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -147,14 +147,14 @@ namespace GC { std::vector filtered; size_t i = 0; filtered.push_back(heap->m_freed_chunks.at(i++)); - //cout << filtered.back()->start << endl; + cout << filtered.back()->start << endl; for (; i < heap->m_freed_chunks.size(); i++) { auto prev = filtered.back(); - cout << "Previous start:\t" << prev->start << endl; - cout << "Previous end:\t" << prev->start + prev->size << endl; auto next = heap->m_freed_chunks.at(i); - cout << "Next start:\t" << next->start << endl; - if (next->start > (prev->start + prev->size)) { + auto p_start = (uintptr_t)(prev->start); + auto p_size = (uintptr_t)(prev->size); + auto n_start = (uintptr_t)(next->start); + if (n_start >= (p_start + p_size)) { filtered.push_back(next); } } @@ -186,7 +186,6 @@ namespace GC { cout << "Stack end in collect:\t " << stack_end << endl; auto work_list = heap->m_allocated_chunks; - //print_worklist(work_list); if (flags & MARK) { mark(stack_start, stack_end, work_list); @@ -229,33 +228,35 @@ namespace GC { void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { int counter = 0; // To find adresses thats in the worklist - for (; start > end; start--) { + for (; start < end; start++) { counter++; // all pointers must be aligned as double words - if (*start % 8 == 0) { - for (auto it = worklist.begin(); it != worklist.end();) { - Chunk *chunk = *it; - uintptr_t c_start = reinterpret_cast(chunk->start); - uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); - - // Check if the stack pointer aligns with the chunk - //if ((c_start <= *start && *start < c_end) && chunk != nullptr) { - if (c_start == *start) { - cout << "Start points to:\t" << hex << *start << endl; - cout << "Chunk start:\t\t" << hex << c_start << endl; - cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; - - if (!chunk->marked) { - chunk->marked = true; - it = worklist.erase(it); - } - else - ++it; - } - else + for (auto it = worklist.begin(); it != worklist.end();) { + Chunk *chunk = *it; + if (chunk == nullptr) { + assert(false && "EPIC FAIL"); + } + uintptr_t c_start = reinterpret_cast(chunk->start); + uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); + // Check if the stack pointer aligns with the chunk + if (c_start <= *start && *start < c_end) { + //if (c_start == *start) { + cout << "Start points to:\t" << hex << *start << endl; + cout << "Chunk start:\t\t" << hex << c_start << endl; + cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; + + if (!chunk->marked) { + chunk->marked = true; + it = worklist.erase(it); + } + else { ++it; } + } + else { + ++it; + } } } cout << "Counter: " << counter << endl; diff --git a/src/GC/lib/heap.o b/src/GC/lib/heap.o deleted file mode 100644 index 0e5421d2990b2561b9577b4d3ef9c10913213458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138408 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%0Av*y6I=cpVDWzh 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�Pb?Upj#KTp&KEEB(>{%x41eK|^LQ6~O#o^B5R1KwadQ0$~0p5Fa#j z_L2e2e+A-$y2>v<`~~^{5r_}!BENh9=HCMGL0#aN7r^{WAU>$;`|<#oe+tA0b!}g6 z0P_!l_@FN8%LQQmE)X9y^!9QBn7;|c2X#GPHh}r7KzvXa@?`;-zX-$!bsb+OfcdjP zd{Ec$WdN8z3B(6=312#Z`CTABsLS`#0L*U!@j*j+FBQQ2Di9wul=o5q%r64*L0!0) z3}Aj1hz}Z~d->rH$p1+oK4=K*5no;a^MgQq(2&y017N-vhz}aFc)0=0 zcLMQ2LnJR3fcaJ+K4|FT!o`|<&pUo@M6Aq}<*hry%Q_U2p$29I9WOCZYfM~SFM zH>=rfNb$n?{{g>z1E}yg45dAKZC8R6_L?pNQJVieIzM;GF25|g;kj5|X!oUF2-(Z_Lmw|zyR6o?C+4k8i&Nqw}~&cj<>0HGe=#j(hZ)J`!YLc(E5G)onWsqIxw* zbrwhnq#9&Sfy4_hxQ-1V9o=B*7apCiFFd+!V<8%wK^hIgG9YVSyby(Jss?Ea14%U> zQHVVZb*})}z4yVYTt9epzVPVg@aP7yJS04tj|jm14OQ>p(OLV!qqFn{M3L)>7mFc! zA9ys^zF^>Q1|@ipZrign!QN&8xo4pO#M`~5-vt;LUR(lkkGuW=h1*LJMg|6tZr2AM z-3}Zc%&spyY#A6B8Ti{ktDZf&YfpG|mp*t=@caLNh$0UT4`$yNh6g+ve}dF?xE|+k z2Nl^H7&}~#zXX}s<$8PtBY!KnUH}uI63C<1_HZQFLEj=77q>2R*u7 zPk40tUI6Lz==Qzf(HSV<(e3-dqnp!%*#i`u7d$#av@a;s9)QKb{MrW|&BqlydP^_7 z&;tP~J4k>M$V*VQ=W*Qi1t^3-$TkQkOQe(BLs@b+8H3zU;IZ3 zREWsj9|*-KUetpWHy#0bCibvL=fTbk9-Y1`I$f8%1l4EA0$?`;fRy*vo_OI7VszK8 zc%k?6|Nk@)fM-B(`fPl&0GyGbNwhQc0XP&oTPyzm|L<|!^#;WMponY*H3~esYhQRY zAGdhH#}7)P2R*tW!j>oao0o%ACPdz&yY$8jE|8jT29HiqEP=3tfQPl~1OB$FAUh#( zC*Yy&`oN>p^#mk=lz#^$+`VAiJ6#WWbo-w0=ypBe(di-J0oDLY6;PuNK4A7>1f?aA zG$_%$@Mu0@;nCR&Duuv~>;yTW({%;NH6FdSD_*RC2yF1^t=-|#Te`vUK8Dz^;1@v8My-x(-Nqb-IF*(F~8?(g|SKu|ix2*414) zI|kee0L2|NCA!}5XgV1KX_QXzTj`u07p8gz-91ge!%Y0{DXnN6|`jvltpphu;6=|7P+;}e-gp7Ziyq)q1B&_+(ENP>TxNjEJaCfm6!19sklBOr zgh!|A4sZ(T_Wj^t&B)&lDF-1AvUc6U-y91v7*ybZGNrDIUJcR;}d zl*2$}T5stKu+L|H2K)SgM|bIo7i+k|KED7?)19s_V19k^f(hi;I8XtBQQkJcF@UEP zP=O3`HN+bhFK&aZZvG*{-v-(#0}Udu7cE}whsZJTw}7V1U@m@f0-UZvB?v4uEM8mz zi-8N=8{p*D0*-|4+8Zxce*XXe6DUHPj~IZHIBNL^PT#eV@CQZe za**N2UBOdzFjshVmtFw1mHr<9rQR1NAg6Y^u7G-=bOksy%;SWX`cPrl3m%=|A_Nqt z7BB8|f&vp%SS|1Xm6f2)8DM?SK#>iOv>nLyy*LNf;5q|l+zd#T0Hxjy;4IPYyThZ~ zlf$DsbcaWGkbuX*N6a3K7eR)%fttu5!$Bq73s$(pKs^;$O>v^r^$1AG3pE}FhL@n6 z0JG=SG3feZ{U4zn{bbi00Oe!vJSELuPvHcAu85`RMf*% zupq1Ggs7MfQW47zO6ay_5TW(#3=A*2K!hqNjf0wiouDfFfk(G(FhoffNS8WD7pMtY z`rrlkCs1Pr)Zi=xY4ia}fs1kE7Q+hddOHfA^+#p~D^`<~&g-5sT_kOUyWk6=1 zW&@=GP%HDsi}fF2W{ZN%{s5BdE`0%QWgK`>&xsO7rJy_xYV>uwf*Kv5W>p8MLIYP# z!LS(i=ne%{CZMWef=93KiWe_GLCYhM+85Sb3=A(p-7{DsSkUP@=Ot*D6|w+WsQ^f6 z90Sx1kXQh9j6J$*K~0($FZ@43O$H|$aBMAQ|Mt3($T}NF&De z1*D1H0vbdCwb8&uB519IM|Ul#)_4If`b%HDc)$uuETua>~t}ZJLh+#2yA`j;-(i{|EP@Fv@#SPBI63-t~uv zwd)7|wr;SWKy6v1$`rI66P%O4rNjk~=GqGk{4Jmva!|<(_7b>x-tBq;>>X(3%F7BX zkg&M-#tS`=d%=BoyQ)sKPU#a(7-YIpt6#h}8-zwN_|taq?PuLDxC8==CZyMW`xY`C-(NO}&6w7`oy z?_s)`LDIEQ>0Z;z%nS@K)`7Ut?iZwk33VT$J_7f_YG1r421PccVtVo78OVE`t~We- zYaf6MxuqOPbt`C(B}nGQdyq0{1a#Xf_JI9a@5{jO;wux(pBKQsxcV06%xsYKH56%q z7h-T<$bg*v9VFdb`{2boP<)hw0v%jY@yjzn-CqDn`>vp7#EKW`;4lKUZon0%!izSr zzke|Bx2y*z9^2M#u-m@-FfhD`1euPgh7?{zfK+$aF7W6)_M!)D6sUNc#KgexA{V3< z)Q@cjHw-}a?TZ&4EFjOhJ^(c~U+f0u3FM%vVn+%paKQrd$q|sU?%EZQ{CELWd%m~; zvI``6oSlK;$hoUPZOKlMi$IGDU)%<9q4m#;c_8P3GCs_o zb0HdyK^hA|Dnb1^nCb$MYEZYU^Vo|e@CX5!|DqM77UE9}P`?A5suMur0%{F)*PeKB z8C1rAnw7n^2RwR9cf6RyhUw1(FYbVp!Tq_xqq}s&ix(ifK!w_UHZ*^}>je9AiZ=tp zi$kE80{c^fk%8gGXAl=$n<5(Di1=6V=w@9A(%fvpzz?k~Sto!5z{&B)OVC=A{h);< zFRWfcl3ph$tvq<~`wg`8g>3~4Vkzd{Qw(7fu(8JJU!t@sbwJjEg9fQQ>;$>b_lHNfBL`?OL-Pb^bPd$zcYyf^DZF6zg9eXW zU%UWi3y)5S{gx;Ao1o3w2QQ4|L7oKVLIw{|HwW7Df!K{+Upj!}qO%s9fjv5FPrP7O z0B2%Q5%&RH#BBnZ2et?_3iALwfED@x)`A3&%hX=*XggcL9PLf)J#!>R@~qmw+u3_w!x#hb^`-{8)(6n z2e{BF-SDCcNhPR*`oW{yz@s~W!=u}G!;8I7p}8NWy>g(_br0COK6M6$m!L5@FfTzJ zR65mOcu@{wG#^O-H(n0B`0)%Qzk}lMhevnm50Bp34=<*}YytB!bzn{h*Tf#3$6rk2 zWMDwgAD{+~0|%(7fgESh_=1`b%17lK9^mvP3obKI5(jem2+niRyacLWKyl*^jho{F z9>-ljfSNcSy`>*KdPCp85CP?6ut<09gBNP5V8azaqiV-ryx;)My`iL6MEe0$_H=^E zi_#A-^g#njpt1p+OG-a@G#}%5Aq5qDkqD||z@uKZA6|rjINhLj<*^q(K;t1GYvUmm z4rpNH!;2sgr@QtBs8%l10i|fDEtN>&X#jDd8wW~wqLrWE?ryLS1B1zbP?PHbq%cJa ze~5Z${wwEraa;ymHo!(tL1BzCJ^>C}P<$~UM-`$y3zz5cXgrlcE5uc!O z@Z;{FG{*oQ=dcD1iNI=X(5TdY&i@xuCm>FD?E#O@ zV;W`X5O7kG3Y^62(`0q#$wfm=G@ z(U27$APZF?I#$4(fAkUD`Jf>!S5W^R(O0%;Ds@$Aq^gL`S9X7 zybX51qto|d=Nzr@Mehr#lBk^aIks@QWWH<3J;2 z;QBoP*-w!20Wn?$ZZ<)R_!Tc6K>IK+wu7r*P+_zJJPzJnzyS)h7x%&aLD0;C0XTb{ zhwwjuTTGzYoqb>dP>w4FO>^Dw==MF}0~&?yb=~08&EeC@qXHhr>vU1!c%cYV42oe; zkb=5N8$be}Y98D?`2d*=gVr)zU~-76N8rVLsNjodzd)rYWaRP1Pf&h_cK2$bD!@Y{ z;N%TT!W=JLzk(VewV?9i#Z0K07Y?9d3D_tNbp9AxKSSz6NI-pfF&#V;1{zKV^-e%@ z=ipXL0>t7EkWnypk51PIFZO_xg2s^{b#Lek&`hNVXxO$0Bm?gDf?5nIjG#IgUcN)} zJE&PN4Jz3>kH6S_AMC{sFSNh{uAqVt)UbW=VkIbdce*}+lxU#wvTjg?0j=D*85tN5 z859!#u>9F;%Vo#F@Ztv8Zrt_Pi*!(41QlA{42bqUq|k$g55&EoG7c0*psqtRNDo@; z621L`tiBlJ3!Lh~n6{r>_qNe!Q>ftD%Y@l(h|DX2dUO242W2fG~R zKT!D!@*5~&gA{>+%@^Fgnsfl%LIF7j5#BFAtB*iJQ1^Kp2d``bi9pIxdrp6&oG zEc*Zde?4mbu^&_zz4&z-l#q^lK>Ev|Hth@0#sp~U0ky$Q-&cZ~W1<>W3=A)_?|^d( zYEQZB7Fh7Zi?g?pS2w`?4+&35eFcgWaKEhd!wY|~Hc%&-cMr&l=7R#D#tt;>5cLg` ze?36)2?`&i`1C-MCn`K3?t#Vc2k-{c2wxbY3@q=91f0HT%g;)N4J-H8`pK|_FG6F}-tAk=+$A%#$P;l(I%3fCiaDD;hw@%*+KA>h_XYC1o z0oMoonywr81za!iYq~Dr7hvGmbe-VQT?-nU+~Lt3y1=8`cZE;4>ja-}-x)8~fGhxI zv(8XZRD;R_P!=nQJ&e>}1cfg+Eu1wuL~N@<^T^gf?9dtB|jjGuM@q2Q;QY zYb_u%B*-BGsjoU~L46BEdV~2N5_b5BPNY!jixQXcB1P7jQkmuL)V9(_K2jqdRnlN4IZ-Pq%9azXn9O^8vpg z18Dif3(!JUegW4F{F%!2ME02*b*| z!R4ODHv!;mwf6*QaHDfCXrVGBq*_61l);@0lmG)Y!oh1&Kx6ixIZ4oBs0Gkc8nkd} z17wEZcYzNm5I}Pai$OMYL(J>;J>b#V3t74Z>Mr#{7HNT&)b&PyW|O*oZ+LX}LRJrP zcy#t!fCU{mJUUxJi?%(w_d-Orf_N`HKqXXXs|QF?=Ty)tZ;$S&5YxdX`*gR0O!eu8 znAls};L*Fa9;CV#tjVWaz^79Lsb`aZ8I%J-o@|u>DFc-aovond;2zzs4IZ7X91zhC zkIq)mqHvGyy%2RV*I*#%x0FqyJ;D~zA@)}UogO==oq8?PTfEw1Ib(|<2#}{wF zHoETc0FO99%L7P%`~Ya2ACk;Ko#fCD9-Y2Fd^%kp_;mV$+E%ck{|Dgu4c;CAch^9p zxC_CauDt*r@^IbpVk4OEy93lD1<79o^J_1>IKjlg@NzvU)Vo0)bMXAwhZmqz13(L@ zATC2|4}kiM;KB-8KV1M9)u82pt3jq>RzL=z);_F00k^L};REu<50B1J&~VQW@VMNa zOW>sS0zn@;nV;B(EcQ7yl{d?XYC9e2?&&6Kml|D z=C2pc;6w{f2(VOzRG`!@@aQgG@gfeS2(+35v?8uE6to)hf=6%Yh8L|D!NEGi18aGU zTz`S`GN>`oE$GoHfHZvf!UH4{027kHh)+--0kjym_Q#9kp!J@h)i~X?A71PNb3n}| zaHDxDq=|_Zzu@*FWV{bFC;-~N0%;I}!wcj-u)9Dd9HS>J`3qEDK>IJCAOX#Kg4dhA@UV6i;BNtKuK-QT zzW57XK?O=IpeDu*kM0TqkLKe)JUS}`UMPa5X2EUnV=tzjg^qu}+zcwW;KNLRK?_;n zfrYRi5??pAM%W?kM{xNE3hPo(Lkpz;#f#!kNPTs*J{@Rg4wNDvya4Yrg7)daqA$Qf2et*# z9>p{tr1k}Pya$@`(8_b<@cHoqT!o;dClq<`eAMDouznr3_=czlW#!i=Vd{|G2bTx; z-|>!rfR@&P-GZsV*H%l5fdMqV$AIP^aQcUg2fYG0pcC(S(D8I||NBQe1H+4GkiS54 zfY8Yw@XCp_6QJU=_QQ+4Cy{&Si1Y=v51bxAc?~umWDnK`9uLX^S%G^z2u1%3b5I_I zm7kFDP*9e5;Q?8B0FOdMeF_Rs&>;GU7m)E(P)7qi;t!hp!;&9R?DGJXKcF#9(Anwm zak3YTpb=ScNPv7$`r(BG$XOtP?$Q@8HiJ0ebO%b^t*=3;8{r;Me#c(^NQ252aOXA@ zw5a5P2RQGdjyHhH@6OT>NaZicz0mRlQjU3m77FNt<`_T~1K1si^a0Wj62?D%01hwE zdIiwrC1|lfxVH*UYKSBat{))z3DbViu12UP1?2h=WIw2^0hhg?r~tLsz;jNp{ErA9 zkUPPHtl+v0v@-^>2EPTg#SL60ay|tO8o7dIl|dU7et2}&zIY)55`-3p9VcLg;XY7d z2pX;h72cp}H*nyBBIwCWPz1rp=OE)FAU8tN>xCD=ppqBT#lG>v4Z%6^;^Yf(;>XtC zmV>DS*$11qaeeWE4JO{{dg8^-JK!-9P*Vo9ZVcYxhV`^}egKyc;4u;8@BuXrA9!?v zdXk`ZFQBo+&>JtLL3JI$_9ZBMDbWvVpJC{K(GRg3I)Me+?F1T$0kz3oXMpEC-hmXr z`sAGlJ$h@mzkuwibKT+58F~P;;?4uK8$}e9d%$~Gz~e**UYI}x7JwG&di0hqfQ)}& z`V%yegCjpf+zZ;u(_Q-Dg)+oIPz8hB6a~$tV$qKpUf|9?XrvrGI&$GfICirPVDqiW z_2+MpT5u*p4fWG_M332;+n_NRh(_lpi7C15WSY_7S|ehpagPjVHbUt=j_4pTAIn zH~=)ta>1jQ1+-%ZwBiUfKYQW@c)2!a+HpX{7pOdi*aup41sVYZ^$7VPhJu^ZDfa1#-)O7);8v^kQUXKVVC&A@r?T;7iAUiFI?p_%)g+r8CJ3}L)O87>jRKHSPsYdH2U}; zB>h9uGuTd0+Yg+-KD=0c5R?bNoEI#$xH3Ucn0PLC~JU9 zeXviFgAZEXgWL-aYj9lz8HPok|HX7KC_O^l3(9|;pg{z1yZy!sYtY<3Xt>7p26zqx zx@zIVizbi+Xst@*Jy3lG+7a>L#al=<1==qkxae|4%ZbgPJtMZ zg$U5m_zN$tfy(Jl*A39dj_U@{9w5+0&=+Swsv%3|pbbFi;<^(rHiD!;OB;6V2i2uW z@dFCqZr2~j95@(}`u2TGKn zt*{SXG=ruAyK6gOE0iYhg*HmS6Mc{cR-hj30}lxM0c6Ap8pty`U8i{T*6w(r!^pt! z5_DPtnD-B2Cuj(*0W81^N$L&oA#Cs-MD=~32tky;;Q0iQ({4b9&p^u#IUqY6LEZvQ zMu2?f`oW_YRMO(|G3bsy@WLAKhBz$qC-Aff&sX3TT%d**xHJMSa6-~Y-dr6A=A$ox)M=!5}ikGBA5 zZ7XP(V=B0u07*G;K*Vmm2n36PiXL#2;e$uF?+u@B*9YMK9&~C3l0U%v6Ty9H&;$i! z(xMZzW2P2VV?THi{uZfk4c^iKT2KY5RzbBM=ey;t2b-Vys9&BBw>jy~SgYtVMeC8As3*PsTdz3K$AjL-o$3F17M)1OQaO5G9 z6nwlGo}M-^f){3WxW4D_1FfY8oe1zAYa>9xa35am-U+UkZa~5x+&{yx50ZYs{ZoSJ3&;9Ql<_KPcq4^B z*lln=EWE*OgxVi3#KA+hpk9CNhZkI64rKhn@&x}BEaSJ0Z$Rglz}qIEViB|~7qrnV zW+$u~0P)^2GB9+wZignB?eIB^Sa7ipu9kMZ_z7ON2rgPci(kQ8L%JPacrYG+p~u3& z0IRmUT{ozLcIP+$P~dNcpY#AaJEPNe0rCPS&@ee@m>#sp5>$x1fNU@aRa;1Advw-L zc=3)I>xc=hqa9pIF6;RVMw zFayc)FH~W{{Nnd^kfbYUk{1*yv451m4`>&2<<&=`U!1hwFi>Xx*B4&AhKw(PCS7-U zSi2tJ?*p9`1zM=-(e1heG=kRYx&x9tj=Syvx41w}XSgZQJsEwV6NRA5X+XWM4KFr< z47PUNz~2I%yoPN+02Mo+g*LjNh6~uZ=Gq+${Czt?b$NH`4*q?i=RJBs6FqxDv$!v2 zgN*40v%xJRNGf`91tJVNA_KHUea8z&kWi;<12kS-8$3WKAGCnBb;GwmKy5$n+5xH~ zUV@I1f<^9xPS+lg#V;&D5j>lLf#J9-_;y9Gpvw0D|GQl~S`YBIfJ$<(9WOIsEd_9^ z2h@ZC2P~E#c>tPcdjYxx(gSypfL2C<4F=V&pt|RU9LP&hH-iVx8jnB{DQFAwi-axE z^ny|zf!oZWbz~pFOMxK;!B8@|3m%}#3tFC{l-H2*{|9)peeI9#(l0MUK}&BTRSeST4b1&e|A98G zBWEt8{s+8$-~le2L4^^hZU-&bW&as>M7lGQ< z9uklm8?;WzLjtsh0@;t?{y4b(2W_vw{0Cb11wQi#v=$k392%q{2Ud?>pLf=R#+uRH zOU?Qh+(yQzZy|kaNc#$27ed-)wI5ytf2>Xdq4^7{s>i6h&&_GTru>8k`VmCNNz{(G(`LOb)T!Fjv%Zs3O;6WFZ2_$%b0}+4K zaAgc0ptCShPQL`zhog8j1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz5l62zaC>7APd9 zq!d|kGPpY{E=f$z1_>6GSaC9dR9h)HC+6klmneWQ(pJbxEiP6l z$wV+U0^T^j6ST z0Nv}YU}LM`;p!L=AM6?Bs-UK(paiiEMWYhvworYLZoTA!0*12u%oGJJcV{aruv#my zlQcl4#g}L@xVSonx+^&Q`}nvzhj6+1IJyU0DKKy;=qmU+26=-S!Qrm10brI}kgF?0 zFvzzG#U+Vg-$Hn)c_|8+c?!w-IXS7xB~}UyzKKQIsVN|nftx6oXo0JD+LAx zCoTr(jMBVpg+x$@aRq~fIXM})9DRKJogG75T@;)>LjAmh6_gqL{1u?0p8kHpTntCYR(FF)&IqTVG&jVEDqWV|Nl4a3=BPs{{I)@U|@(@{QtiW2Ll7o zlK=nLa4;~~EcyTc37X1_qtg z|NrZ7F)-X&{r~>~Wd;VFwg3NHs4y_ptpEQ%L4|?AXT$&h9V!eAG8_N@=iz2x*t7Bf ze;sZHhMG|Nj@t3=DsE{{Jta!oVpkN|3B!AS)0B8|DWMzVDQ=d|Nk3q28N!!|NrywFfi=d`~SZV4+F!Uz5oCF z@GvmE+57*04i5tZ&%Xcvdw3WaZ1(;CzlMi_A!gtI|7Um@7;^Ug|NjOgzyJS#9$p59 zJNy6t*WqPg;5qpJKZ7a*L(Ree|20$@815YW|KEp~f#J`=|Nk?185nd9{r}&=%fJwG z=>Pu}ybKIIhyMQuojbec(EtB0co`VZ9QywsbdK?xL;wG4@G&shfL7k{F)-vD{{KIN zkAb1)@c;iEd<+adhyVXy!NW=>Z z{{p1$=>Pv50t^gyj{g6zA;7@!=ji|c9s&#uGROY^&k$f>$T{}^e}@1A! zVBk6a|NjvI1_qtu|NlP`U|@(j{{KIVAOl0q@&Er-1Q{6S9RL5{MUa7E&+-5NQv?|p z?i~OBA9VI|&x!y4mk2U2{5kReKj`^8f!4kh&}X{~rLk>&pNCPeA5e z`Tw6qjDdmY>i_>LVhjvASO5Qa5o2J8x%&TqiWmb!&DH<^Tf`U`=3M>%e~B0a!=9`E z{~r-!V7PPj|Nj@N3=BTk{{Md<#=y{X?f-uUaR!Dn*Z%)k5NBZcbM60s4mAdbnCt)l zJBTwd%(?#me}Xsz!{|_V>7;}|6f6xfkEc}|Njos3=Dhj|Nq~h#=zk7;Q#*wX$FRz2mk-CP-9?N z^Wgvg29W%N|Nj?AGceqF@c;h>H3o(|5C8u^AkDyF^XUKo2ht1-HIM%PXOLlFSo7%r ze+3x^hBJ@;|NjB<-{b%P9b_07Y##srpCH4)kn{Ne{|1o!&|9e+F3w2AQY-|0~EcFyuV_|KCBDfuZK<|NjZH3=DIg{{P<~ z%fO)X?En7-vJ4D1&;I{EAj`lI^X&is2O#-p|Nk?{F)-|T_W!?v90S9hXaD~@$T2Xy zdG`N*f*b?GpJ)I7H^?zC@I3$je}NnWgAeE^IdujGo0tFp7pOBZQ_4@z+1L_P6Z(jfZ{{W=#&Hw)l@(c_$Z~p&RkY`|+^XC752YCjDGjIO?PmpI| zc=P7}{|0#m2AQ}2|1XedV90s<|NjAyy0`!TKLDwF`~N?K0t3UJxBveuC@?Vay!-#( zL4kom=H37Q2?`7hHt+ubZ%|-hh6F))D6fmKjqVE6;luf)J0^Wp#h1SJLroe%&2zffmjSo7ik z{|1n{5C8u!P-0-<`S}0;0VM_on~(qhKTu*|08R3OT9k}cK@5x)0*ul;>>Lvq85lqp z<$(4;S4{i=Ux9^zfq_rJjZeahpSzr+fx%wNTFY1kbY>}7zY7BcL&2>7|3O=LKxTn3 zNN)`2e(Kr(|AST=FgWrFv@tpJvN5gZVdr1~B{hZ`1_p)`YySTSUGf5#uL4VhRWENb1I9M7iUjvl~-){}q9|%?e(ldvVfx%+!|Nk>U0ScF&442;n zvVZOW|DahqxcP}-X|VZs7#SE&to{EVbSV&AJ{KYX2jsuC|Nn!g?BVhS2zePM1_qA# z|NlpzgikO$d~86o(hL6oKZ)YLBVYqS?vG(&VED1%|9{Z&?r`&&=ELP{K=SMU{|D{* zg3Cj^4|e|?s66OM0l0h|SUXsL56FER{{IIZ+zgjbMabV_VqlQi@c%z(StMLO2_gT7 ziGe|5!~g%FMKExAAA~&UOk$8cXrBvQJ{Tcy!_2_Iu?%l(-g3f$CvHt&mP(Fg&&jd+8ApLtl_HX$AA2eMHmyZG)4-TI@ z%nS?}8~^_YZT*1Dhau$uK;`+6-RFsrmtkRGh}ii5Kj_jWxc+K{ybTKjL&Zki;Tyxk zz|gS~xBF_K^0@4u12rGCFb-~i2*Un7PU1(%OU$lrmQkJJB9d0h6(utNMd5jlLA zdcYQd!rz9Kf#Ju-|NoDo$RB{q$FMRmtl0Gbza~ojs(|Acl%{G}85laY{QnPP!`;sS zDH~_7GBEUP`Trku;TK#k8*DTxUQ*)_;SIf#D7w|NVf<6&cNWa6?fXNfXd@an=_#DxZJmcoq@q->;M0_!uJL{14GW%|NlW3 zuEE_`j&R=(P~Uy)|No#Zt8n=uguDa?1H&3T?zbQy9|4uem3J!$$j^YvgO2!xyN?M{ zIDzuZ4h{x}J6qA}E@1 zHv@yh&j0_JP}+rm!R0#0{19#i27%rG|AVd!fxC|h;y{pm2{!{nz;4{_hAG?(3>S9) z{}0-t4%c4>b{@q4+zbpKcK`nmx-1edpNWva0xC53{Qn<};y*vI0+9V*K>pi<$NxMG z3<`U3+i$|dz~Hd=|9{YBjd1%b!N!B#7sA89kg)gvf6zKVxO_B1z62@{?m)oWwXq2K zDLf1e1$*(tKUAI#*?*1*{a2vo<4PZ2pz^rFM}(JwVZmP9?P?QV28IoLahL5OP+j4|lsSgpYyY0Ur02K;?0juT%IK7(VR7UA}IC%Ht|uuR!Io`5#nwe1Xb? z*zoiTtvdwx85mOb)i?b z3=Ad*{{P2S?{DB|U{E>m|39v@bpfg$SKaafDvztrC?LSV;DX0|0|5qxkOR2;|%CZhjWR`~X1)hLS^g;$M(~;mD!? z|2>h*1|}D<0if`iAjrV*N1sa`^v$(2`QP{Y(%Cfb?GwWMBw6{Qo~L_k94l z|1fUz1%wzFN)F@kKU5x9-UZ#Y*#epqK=B`9Or}7Hfnm#G-05cmR32B|u>mTND}7&p z%Ht~AJ_s=|EIIuDKj@Muc=#2AgCCqe1cVtFjvU54W?~@B!0_bo|Npq!wE<9hT=o|T zGca5^{Qo~_%Oc!_WwVwKK%v}28JicaJQ{4h%hjy9RL3xbhH!Pd?v`C4=8*;fZTr^cls6( zWnkC>niE1!zer;W2BHiMM~>qja|{q=VEA$zcfYJalz~Cz1n&5oAj-fXasqeTX#-Rq zyek6Mc4Ddr2O!9Q7epBtT2A0@TYnH`U?@59|39v_k$@OP9(0NdJpA&(#zW#?jDcaw z3EbfqKtR3#Dvv9FOb~;(A7}jsbssMI3t|imDJO8ZO+Sb+Ff2Ls|37Fi65M|Q2>%I) zGcd56#XTly0F}p;z5>J<7(&kCZo3vh<#F}BCWtdIq@2Z_e>Onnapj*2;tUKWXaE2A zLQcO-kj@n-eS8pSU|4b%cl{(F!N9QPEbg|ifdm7?k+Znlt^pDZ3|G$LPJabZ{W#+v zYCpEN8_4||2*_W6%HuNsg9OC?xYCb+Bm={gv;Y75qlBLqIDvrdH;{z*AJ?2hfF#8K zxZ0)#PZ7@nNPoxe6f<#DwPf0Z@5d zV+RFLd0c(_2~c@Z7Z#pBk;WA_NHH*|ocsSDSKsl16a$0FIo$1=4^j*aE}%Jg_k}x25ICuGf=%1G7-|ZXL-zmm^WhT;$i1-;M|S0ILM~;SB==!I&0h#w2Ssf@5AZHEk@{k<>B0Mu~UOT-ll3Q1cEWsY5eQg@u8^WG`e~ngw*GFDyPY z;KqUN^XU$>ou>-UD7|IwJ%9PhKGR$NI4|9Xfv}a9$=>YS!czxk~P&lYC zFsQJ)GH6;cK-^%#ngN#wxgm@-8-=gHWeVqG(=Wps43`J#4`wYv;Y+X@!1@0fIb2z@ z7`#C42dS0gG)IyXU;u4&?_gwI&&bfrm;-emvKo*c0ajhOp4oOhquESv>cHQ;9aXB1?Z#l*lci;49T z6T^I_kB|rfhn*U$E0Q`M26YAob?JBpC-9&*)WA`S@(=(o?qFaz0PfHsBI`Qn3{D0F z|1lc>6B?fpJQ0de&yB{Hgz|Y{E(T9rGcbVXXBik6c$y&+;Bgbsx|_2QKDZspz`y{S zvIB{L+l8R@L{NE99SIVL$$$L^8Tv{9&Al)%Fn~@30m)ZDEe6jCFfcIOU1R;-878*%b@f&D18h{UxU)mp!7E=%?7Sj7#PH$v>KE)gVJtL zIt)suLFqCm-3FznLFr{sdK;8J2Boh->1R;-878*%b@f&D18h{UxU)mp!7E=%?2%x#Gteqls1FX3YSn*hP$(~m4b##YEoum zo`Ru)o{^rRu9+s3rC?-WWN2V$Xutqfkerj4m#$EjT2!2wpQm7Gu4kZUprE0xZDe3% zY+z()W?*h;X=6K?6skBgynI3xXJLSqW2oY+46yP5Rh*3hR*s;GvopZTBUEt?c)5it z4q6a^ECOLOGjK5|K=TVk1VS=1a5FeS;|U@HA(CeC5NAM7zaTkg1_=fOv~&#-ht-N89t4Bx0~Usl z{~iNAn~ z|3EVbbbJm2gCIi=ntDF4#|0T`(8Lv?;v8t=p!23d=4haayF=C6povF8#V4SN=R(Ej zpoup?#W$ddPlk#gKoegE6~BNcz7s0`08Jcpks8STAJD`>{ZNoN!)|Z@!ild?a|F=D zIl<+fAcF#$xGYrM08QKwD(-+L4jK;v*&Bc+9tl++gC?E}70*EvZ-k0Bpovd~icdfj zUkMdofF`~dDt-k`9CYaq$emBn#GgXd|3MS~2^Hr7EmDVvCZzq0Eno98gX9Dlj-aJm zkXCH!rI{HRK>1MsJQ2(Q+7bd%%8&#VX8?7s85kJAYjhYG7&e2=7iZ9bmOrre^m(ZI z1r=cJpb{C(uwa3huMhy{GQf)CW|(**L>yG^fLM&I5cLm0cZNdOQh>x=pyCRk)BG41 z7{K!`pre+c;vYZ*oX{~PkopTy@c=aQec2%9e@F$XVqgG`Ux8R%P;r4s5DyU!2cY5s zpaXXq7#P57y%-o6O4%Xi7$iZ|!^E#c#Sef6_81r#z$dGcbU*ih&(m0Tp+E zhBK^xc?v3CkOEc)+WG@#i1R_r|4<6%!t>E~sJH>tUhsMcP+i9lQGWnx4y<_;1nw_m zwp&u6>K{PUGc27ff{ITlg4hche+0331wiIwwwHv#;yeru&~S#uS3gwz05n2i>Fpg< zya9ZA83O~X5ewSm2r4%gfDYbbU|;}^1A^?W76jSL!;kflNiDH*cu80MuTXIiU3*Aoo0g=2P&RN(Kf7GhtA9 zh}pjK5r&x003JpfjTthb;t!zd6XxG_Q1J=SaDbJc zN1@^Y&;kIKZpFkP=5K(S4;?mO@PmniCXyIHH50@iO;GU((C`PZ6JuatSPm5zfTjnS z`=3L_8=&PLw0p*&A`Y?F0dy1_0|NupdWK4T|O_ytfy7b(B|fr@{KhnNFi z>&w8v5GV~X=R!C{99qmVv_r)oK=T(Yy}g8rZ$PVmon;{A9Do)W&|;LK9x8qT8lK>J zWCjL?`%v)>pu30|5aV7RvJi6;py>^kPy3+a0Z{d@c-#aPH-MH`uy9tDgP79*O`p(g z&kzF@{{XFbVCBz3sCWX@99Xoot07dGDa1S&oOntovJky3!z%K)vfVdIZ2Q1JuM@PXwQ z5k*kBB#zOK1MT4im16?Xh=PS%Bvd_me=toEV($ZJdj@9yJgE2u(1afY0|R)S7-*j( zRD1(8Kf>}$j1t703!w8W85kJAYwkhuuM83208MDHdMXeqegJAO%$@B}@d?oQf|Yw~ zpyD5(^&PAn<5Yo~4-J1<`tgN|2SC#;ES;=`iWfl5huQlKDjon$Kj3vu3=9nBsu1%( zKnou5dOrpRhCHY^1L$;q1_lO5zlDL}I#gT$>K;)47L=}d)gb0HK7~BZ6Ct?6=(o4 ze*(0B1l}{mz`(EwDh_LC!`elLh7k1$(DnnY9heUlp8yRXSiQ3wDsBLE4{W~Y3sk%S z8eg#T*4_wWegia}z|3iYiZejl!?5xPw0Rj+u5N%P5b(Nk1_p)zV~9BgX!&9xRQv$c zov`q~2NMTf&kH)g29(Gd7#QSCAm)64x*t}*I6}n}palbX4>kh>!)&N{09w9gH-(rJ z0F7VJ96HDf2befCy}{Z=^)PX0c?AofJ5X^0Xh8*Yzn&Sy{03+}2up{>Q1K7Y`VPFG z668*(cmvcuP;W38n?uaG04*P2<yONW zia&ss=dkkg3sgJ->R(tsb+m+-697%0uzWfjDn0>pnll3f19%TDXr9mtqTT_T@L~PI zcTn*S&~gSAZobwK^$F1Ug@yBSsJH^O{DkGlD^T$OXnhK6ADY@g%sBwf7qIY&fr=YI z>shEZ46~r(2cYQ$HV$(ODy{&nf1%X?L#Qppd+(Q$B)Ma^H^ZF)bj%7!2?{QEhuCWXt?yv<2x$BfR)!#J_=>}Peh-kn zJPZ%O8>JZ-z-Lu3Ffgb>#SI)GrhwKXf>`NbaS#g?S9u`%;K(xl9uRjnK=UcA9j@pJ zvKLt;gstHTQNID2&SB{!2#5MysCoxzyu-rbI#m1u)Erp5;yYAa02*Jgd|K#*J)C>J zu={I~7k2kw!y*0>hd7frc6(*Kv75h(8N0Xytq$B*Dp&*ukG9{?S1fwiM1 z`e9F3EBrw2=V6!t9pDG8QwF)$#{4noe_!J;ha-T2L6Jd%!2)f*Mlk^5P6udv4^}T!L&XLrNfa^)+B|9tH*{P$)7mfYx1uShJww2cY=~HqN{j zYW@ba^voTE-F!E&I1j@HXh#Zs<`4q|LvIkoogbk61!y(QFc+*IX+#%T0t#k;~zf};m zu=)ZN-vSJn<4*1&Ab0XGJb*SZA@ivW46!)OuY#(d04^RyS`=TB8=st$pO;$95FekCAD^C+pOlyrpHh-vR2-jJTEUQ8ypp0yhP0x@+|>A#(%jrihWL0SUVLU=W(kT?_<64G&d%|v70Iau zCGjPRNja&84Co@}7$Sydm_im9LPo}zLME6(rkFyQ#v5Zg%h(7*qcNreQ7UM8Tq@Y6#FG3X&yaXmSCE`(yl03(ysImNOSoQ9YMNere0oJi zd_ihaaeiK6PG(7Ee3=1~o6X|mi^~%W;=xBCgA77g?iUNd~U2t{{uNA)#XiIfWR-98?>EjpJQiT@4N6 zbro8T|M+slw_ zC)Oh-p!1}$8)0Y+ab$jRNl|KIE_PSCniYdf#N@IhG*ch}YG?!w?V{4;lK4b~TTueo zD+m;*0U*LP032T~1^yuhNU3dr!V=;IT*=GOASD%=@(`K9732+YGJt3{GK`PU$xKQv zD2UH5NG$@T-T1uJa(GyIdgZ#hx(1ZF6oerA*El{tC9}97u_QSoJ~_XjGCsd3J~zJ% zVGlSJna4ZlBo-HECOhV&2ju5uCRc(|4Jd7b)W+xJ=NEVe8^(jvlA%dF*o63!qRg_) z#2m0n%nXWB61chsJH`h)LJTkgrC`qxqxcX|4i9#Y4>67pc0qEqp(VUzDN4*sPmKo` zEuf@L*c!8VtR;?Fe6ShV259y~_e63IA|R2oey~ZrPbMg9`vu2C+#L`S9{?_Kg3Un% zLa-&+SV$aM#Cw*c7Wo$x;|f$)Bh&c!vc#Osl*AH9VHRJMnwDCWnwN|eBSA!Y)z!5O zoKGQEn}8w;;Rm8j2sVp%bqz6y4~Y-90QrTST%VFyk_flf70E$H#_;r-SDKqzl$ji# zlbH)Dl5)WHf^lwQ1y+s37C1(UC6Hng5&)nWEiTB(EQwDlO-oBHLMa$PA&Qjyzy*Y> zvyp3VE;Ly{%*f4zyT~)Z8zmi>#=E+@gyd!>=cJUR6~vn)B^IZ;LO2Fc9=JY=2W1*~ zr3kO4%wg3Oy!y0^k55b~OGJryv^)ctJHD9SI7 z&o3>B&rgd77ZeDkP!l21YGe@)Z7*l$=f$U&CKjb2_~5*1WEt<6larqe3S^hm;*z5L z${cS$wFRgh2r8@) zo(wjLhc?e)5n&P^Pg=QZk(^kNn4DQsi7>T{AwJ&SFErlO1KOAHa0vpX4X7QKkoI9_ zeld==A*dus%|n<6E-oMm%h&+aSO9gFGZS+%t5Q=CZF_Ko2d;@gCN=@J5Fj<8QG8HH zJg8nYgw%?lPCLl85DV#2nz$Ij-HlxAVeNB)%3Feo4xIn7^~F$|MPzj+EWuejCqFM8 ztD}u`GZ9hend=uEZx$a9x)8@R7t~~R4e}0&4>koMXj2`UDzNnWP*SjK3Zl(~97rfF z3(s6oKQSae*cgNmu}ExTY#9%_h;zKoJ7&m!wt{6oGnSImpQrr4~X92JFrP zweq1EH!&{--gJlC4NAnIng&#k=Hw@)fcb{d206Hy4oVGJn)Bc?2UG@v+KKR{J4BRV z;t6(+4|Yax2!k?+QM{{buxosXVSKP#JVU&@kH3?nPrSdITd-?Le2Alyk1JB4L~M{7 z8OA$wX9ddid1XPJ) zOTH*2E~w4m>XHbq96`Ygi8@eY13a_<9S{Jg0(g2v>4$-vX;`|_;N%}{K}KO=nv|N3 zRJ|aleuDJ}a$rE?3F;#p&AVh*@UW5*k~=MP6SGsnV{%A7M(!Yh!wl|aQ0WY>g+YD) zct|raBp%v~^9weEbQK}3I#*Z!VDor?l*SzqxfL?BXdWM*0_w~_hRi_q7~GBE(IuoP zBqxL5Yi;8jXT#Z(^2s!Wj2Yt_k3`FRD7|!7+(n_GF+7EXN-B6jfQmnY2?f-(##+<` zo5h10R^Xvj&;S9bogQKk507FHAGO^M>hgkz!w{iQS?|*%-W53^2L+qPgQ`cAfhlwR zLk&4OWsnhWXafwI3vd<+pj1q#R&oWmr7;Q%T#;{qIRJ`W!BadU2&tUm(GGGQ%FvIY zDJZi*t4h!m0bD64g%FYDkSj=N*h33&g1sA)v`nN58Knp#t6>8wkkeC3;)^r#i%Q}P z@}qHL7t2S4V-UEB zOPbXtpq$_eDozlk6jgUv^kV`6P?})?%0cnO>S-S`3;zEJ@7F zOGV0=p!T8#crYHhDTJ>sB`66f3=$g!@j zWzbRuqL0`d1WGeycqL2ig93)iX z-h%h(ok5*Y=%gHp=^gvyTJNXTXz6)4*d3py>u2Bc8}v66@4SFlg)rR4PN=N3fM)iaX?p^&6<02@bFP z%6Q272BdjYNRbM44JgNfyOW?&8f^##cOxBCniQ0l#Df+vBqoCvl@zBImZqZ2kzrlp zfPH!i+)s6N4K|Mt@D4UX9xy_iEk(^3pq3mcBY+2lAw@nU!-CpX&{8D72-3C6M+|a< z+KISYx8M#0mKHO(a|j;C2hH_?EHy+bAWTy8Qji8}$nrTTg&#RD zRr26w4P;>-$ZqgNCA_2qxq-5dB4`R5>_-AK7@!_1SpyC@yapN@C9Pb>+X(;_+R!Ek zG)9o70Z?Ws$!hYO;9SvwR;HnjJRtiW)Qm$ZH;iHPY~WHK5vAzm4r&Gf6`kO*G*8ef z6wq2aS65f?swR|fIuW@R+_SPQC@s#2PfASAhC9GD2(8sjD8piD--DI{;#|WAU%-bl z?g>s{$m?dvYsDHGgO{!0?ckaifrfps&kllTLNe3h^YS5i4jwF^tcEN55-Q1qP2$U3 zT|*3^Q;49M6BM7~N(!K;ClvaiK?{&NL>Y;cL|`LP;3Q%Rn!W@T{m|-|=rlrLwhOZi zL>*#AE!|zQFKh#iPzAv1W2gfW?Yp#`#B{`rI;2qnt-wqn)5MTfgh{1oIGRqT#Ra7$ zh#5!M0Pkd^@c~d916q9G>#<-?HlVGnBQ{7a3i1oUxenPY#A?Pd4NRc)Y|IWqT|0dQqCa7f>a^(qMF_V*;mtK+)pITIu zkJ7J38v7tn`}qaOQ=ytgt`4B{8qkzZtZzZp9DLXStxJuZl)ytY@OVILYJ*BE%hWv3 zCIQf#P()&4agmW>W-(*|CwSr-G|QTql#>cxs%Bc2m{XcsTx4hgQv+HRnhrL=6WmyX zsBkTVPFH}2hM=RJkchV|El!P3OH4*uP7Eqe;geXPhLU$kJZR~5ycuZ4RZc2+VH!lY z5opRHKOV6H2|82|kFvPf(+f-P3@FQmj4;4@nz$Dr=7Q$Nu%$<66oJ}eSQlKQ)YqV{ zGkEYH>ud$YKg341G0Ng^VncQ?$S&+deo=nVEJ1LJtN{DEP=ccp7R9M0#U+U)NM6qZHC!NmBqDKx z+qR%ofV92=)GPvxtrW)>Aou>@lb$e7Q7&uJ7Zezp$7kk&hFM_2gjDo{nwZd{J=hGq+XZv+u^G0-$A~y1 zGF>LSx{{n2A&G*xogm=s0@_0XnX|WuN8btp8YzITT>&rIfpoP{ig?iQ47{-o4{Ff< zC6wg?gj*CuqzjydG>$ePXg(S~oC7XA&}Qz4wG&)2A}{J8LL)fSf%?PXAq!ACLWB+| z%!x=1pg~QXoh(SoFaYmV!rYkzNe09^(+IZb3p5XvoLQ7ynv+-r-6Q~6m5yEv1RKYL z`Y6bSE#aLVpwIvX1h{Dh4-HR{HwhM=uHa!AOQeQcagm`>W-(|C46-@I(j5c^i)`$rxC4#1#K?^`}bjG128<9l= zYA+I!77Vech2RoU=7a16NJ>nB?w8F=EsuxP&hUspYEzj(mP^8=KSH6eHb z8KTqyHSCJ8F2_U(D#&7Y$g)dQ(2N(t1SH=lqpYt%N=TpqC?tR2h!0Sxz$+2(03f8M zfe-3|IuazU9YUELro#q5)Gz~2P$Opq*hW4_@J2r58BS1&LF-7Nc2KdVGdwFTFg6f@ z0vBVi5z=NP*8n%ro={Llj)+@OSEv9~SmdREwhtAQBHFGvhLk}4XhTbEvv;sLCeS7( zP;vr?4#->ZLIBiUK(#xM&`M3@tmx{BEBO&yd^j7SkIsO~Ovsoge4YVqLlhBa<7}`X zcP&uLMIsCZH!MKa1Ze*kWQq+}X#)yVXhDiCoq zc1}V0($y7|AHfw1d|DaOAR>@VL2Vz@c`70+c2LqFIK~Ot-iut$8N`QxD||~(O#!yp zCDPB)*VCB+yh;W+Jz^~?u+QI`r6p$Oq#|wo2Zu5=`iM;up!yCzSctqU9I~el5@!UH zELz-v^CF(Y7_@#RIX|xqv}mv-KOVHo5OgX6JP9E0k090~IQD+v=mQaJDyYE$AM6Cp z3a93!c!K&VkgB&VBtF;@dF~d}mPcB>fODn~YzAl}k6*AsJh&Gf0189YcDzX@c&!&G zn84$#!Iq${POh$KBdHAW@yQj5@o7b=sfe-|l%_yqojLjGnaPk*ZD%9Uga$+c)D9#% z49q}_y1-jop=&ol^#XVeEZAc3fJA&U=%4`74F?qmhyc#d15dppk7;^(fu|ZleN9k5 z95i8{SDwodAD^C^pBG_rU=t(G`^np8Ei}&TNVbDW|UTR zNL4ntH-v38Fc@@vgMUao^gxZ2oB(i11ua|98exWpsfC~t0kShaGZPeq5S8$D5oCL< zE7E8mmL(RT>;w)Z&~P3~MdIq}iZj+ht9@LtMmsc$4AGoxoSL78+_@svCC28(sX3|1 zCGq)rh;^Od?WZ7aaS3>mB_A;-=^1Pq4{{%9t-g0KXsv)}h;KaNq^S^JXV5uQA)tvH zhWIE*Vukc*A*BE!Jc(@*yCyLdmlWls=AkAxaNdW8FiOD#auDp`D>UbTq8?N#A#KJ2 zxd)a-3=NVqQj@d6l_DrmL-Wcr^HSo2Qj1G-!HYg&3QfWGqEt~tofMN(>>A)*1}iW# zLFfEbrJ{N(3Umw+IKvv66clCVm4M=*BsH(37~~>+*$Jf)hnoB#Z8+q-;*tlR6hq_+ zxV7fV`8l8z0WT^bsUK2M<`!U_<%43a5A0wbRJ+PtUHxGLbw&o*hC5sgk-di~h!AHo zVe=8FB8M*yi7(E{FOM%sEXe?EF$c8)%HWoQ>Ko$Hn{h#Di7Rx{6}6a!IT4-+ipx_| z3!uRSPL1Hv98iLS1Q}$w1tokyr8;uZfI40#@jd}%pp#mVA_HOod84cfeHZEoez2KB>4E(&_-EGiYNQUNf1cr% zu7ylMzJYiF+5|xq&Pc696XYZ4z@Y`1gn)V389Mz8O|j4g6o@q!p!p1gcu3KZnwJ8J zaqLxvGfGu~tzn50yV&Xt)W`+3L$S3R(PA7Fl<=HpY#bk7oLUl}l$eqPI_(lvtmNkv zXQreU#TTW5D+1&QhWZyha19M0ReVlnUaBjo2L^3*L%a{Nki04YW)CEFnIz|zmVk>~ z2p_!-X$DEjkltA;XcZ~Qept-G+XJBXE~q_+Jywvl7+RDRRe}x&tW3^HjZX$0saWg^ z>Un^30mKnFlRRpCVN3CbXer(lv~Uqp)d!bY!ne_b8~HF_z#3EK`9;||nFP8#hA4>{ zJY0wre2~H$lxPT7k7g)aTtS%=wDA_TOlQz5uFNe-Ok&V0E-8Z088B8}eo3lcdS0ns zQfX#Rif(2K1DKbQSe(J2mr|KmT$u}@ONt;epu;9J^Yc(R@kI=JMX5Q7APrDfK~4#S z9;g&z&@0F((M!)SVbCi{ttes810NZqSCkJ<270L((34#=Qi>ShJO;h=v+NyH~mbd_ODbZe)lC*u9<*9s>jD zm|xJ@?@(>=WE7Ok0J|^2fdOJROh4>?Y8dSfyT}r1A;=6U6HI~b z9Rb~O57Q63#~McO0IP!70b;_`!D!HZ8vl^|Uje-+0!G8`|3G&?$Se>BU8ez(gP8}r z7aK;OfI1i&91Q6G2OZ-L(hoh>8Ge6u0`!1w3Fw8OApM{_deHS(fbNWBU|@hMV_<+C z=nSRBL5@ViAiI#b450f#Ku(0|huy~wr_nUPq60>QuA4yC54*P;M#J0-vlGUL(d}sN zhu!ZDqjy8kpNHv(*$dgN7eWKf?ux zI)(!fS^+KmVESP6do=y9d-xO}7mLI1;f0vS0MGw0{#VeQL(no1BnG>`-GE5_zo7O* zvpdKLFox-eUQY%V0}-IGLZ{KZ2$E*l0JYx%dLa;~o{?olxF1%2gYp+V?7%u9#D}L4 idNZhig)qS+%ziKjdT%B+{fn(3Dw!b^OgRG@mjM7VuTl8` diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 97ebdec..5c263f1 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -63,26 +63,23 @@ void test_some_types() { } int main() { + //gc->init(); + //gc->check_init(); auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; - // This is allocated outside of the scope of the GC, thus garbage - for (int i = 0; i < 10; i++) { - gc->alloc(sizeof(int)); + + // char *c = static_cast(gc->alloc(sizeof(char))); // 0x0 | 0x0 + // int *i = static_cast(gc->alloc(sizeof(int))); // 0x1-0x4 | 0x4-0x8 + // char *c2 = static_cast(gc->alloc(sizeof(char)));// 0x5 | 0x9-0x + // long *l = static_cast(gc->alloc(sizeof(long))); // 0x6-0xd | 0x + + // This is allocated outside of the scope of the GC (if gc->init() isn't called), thus garbage + long *longs[21]; + std::cout << "Pointer to ints:\t" << longs << std::endl; + for (int i = 0; i < 21; i++) { + longs[i] = static_cast(gc->alloc(sizeof(long))); } - /* int depth = 10; - Node* nodes[depth]; - Node *last_node = static_cast(gc->alloc(sizeof(Node))); - last_node->id = depth; - last_node->child = nullptr; - nodes[0] = last_node; - for (int i = 1; i < depth; i++) { - Node *node = static_cast(gc->alloc(sizeof(Node))); - node->id = depth-i; - node->child = nodes[i-1]; - nodes[i] = node; - } */ - //test_chain(10, false); - //test_some_types(); + gc->collect(MARK | SWEEP | FREE); // free misses some chunks gc->print_contents(); return 0; From c6463efd510c526ae2f1e2c76ded709337a4ed1f Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Thu, 23 Feb 2023 13:00:15 +0100 Subject: [PATCH 27/32] Documented the library --- src/GC/include/heap.hpp | 22 ++-- src/GC/lib/heap.cpp | 229 +++++++++++++++++++++++------------- src/GC/tests/extern_lib.cpp | 107 +++++++++++------ src/GC/tests/h_test.cpp | 20 +++- src/GC/todo.md | 34 +----- 5 files changed, 257 insertions(+), 155 deletions(-) diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 575d6f7..30f1a7a 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -23,6 +23,7 @@ namespace GC { private: + //Private constructor according to the singleton pattern Heap() { m_heap = reinterpret_cast(malloc(HEAP_SIZE)); m_size = 0; @@ -50,8 +51,8 @@ namespace GC { public: - static Heap *the() { - if (m_instance) + static inline Heap *the() { // TODO: make private + if (m_instance) // if m_instance is not a nullptr return m_instance; m_instance = new Heap(); return m_instance; @@ -62,12 +63,19 @@ namespace GC { std::free((char *)m_heap); } - void *alloc(size_t size); - void init(); + /** + * These are the only two functions which are exposed + * as the API for LLVM. At the absolute start of the + * program the developer has to call init() to ensure + * that the address of the topmost stack frame is + * saved as the limit for scanning the stack in collect. + */ + void *alloc(size_t size); // TODO: make static + void init(); // TODO: make static // DEBUG ONLY - void check_init(); - void collect(uint flags); - void print_contents(); + void collect(uint flags); // conditional collection + void check_init(); // print dummy things + void print_contents(); // print dummy things }; } \ No newline at end of file diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 58c4966..ea47bc4 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -16,16 +16,8 @@ namespace GC { * Initialises the heap singleton and saves the address * of the calling stack frame as the stack_end. Presumeably * this address points to the stack frame of the compiled - * LLVM executable after linking. (NOT CONFIRMED) + * LLVM executable after linking. */ - void Heap::check_init() { - auto heap = Heap::the(); - cout << "Heap addr:\t" << heap << endl; - cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; - auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - cout << "GC stack_start:\t" << stack_start << endl; - } - void Heap::init() { Heap *heap = Heap::the(); heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); @@ -76,6 +68,24 @@ namespace GC { return new_chunk->start; } + /** + * Tries to recycle used and freed chunks that are + * already allocated objects by the OS but freed + * from our Heap. This reduces the amount of GC + * objects slightly which saves time from malloc'ing + * memory from the OS. + * + * @param heap Pointer to the singleton Heap instance + * + * @param size Amount of bytes needed for the object + * which is about to be allocated. + * + * @returns If a chunk is found and recycled, a + * pointer to the allocated memory for + * the object is returned. If not, a + * nullptr is returned to signify no + * chunks were found. + */ uintptr_t *Heap::try_recycle_chunks(Heap *heap, size_t size) { // Check if there are any freed chunks large enough for current request for (size_t i = 0; i < heap->m_freed_chunks.size(); i++) { @@ -107,12 +117,23 @@ namespace GC { return nullptr; } + /** + * Collection phase of the garbage collector. When + * an allocation is requested and there is no space + * left on the heap, a collection is triggered. This + * function is private so that the user cannot trigger + * a collection unneccessarily. + * + * @param heap Heap singleton instance, only for avoiding + * redundant calls to the singleton get + */ void Heap::collect(Heap *heap) { - // Get the adress of the current stack frame - - uintptr_t *stack_end; + // get current stack auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + + // fix this block, it's nästy + uintptr_t *stack_end; if (heap->m_stack_end != nullptr) stack_end = heap->m_stack_end; else @@ -126,6 +147,87 @@ namespace GC { free(heap); } + /** + * Iterates through the stack, if an element on the stack points to a chunk + * that chunk is marked (i.e. reachable). It only marks element which are directly + * reachable from the chunk, so no chain of pointers from the stack are detected. + * If a chunk is marked it is removed from the worklist, since it's no longer of + * concern for this method. + * + * @param start Pointer to the start of the stack frame. + * @param end Pointer to the end of the stack frame. + * @param worklist The currently allocated chunks. + */ + void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { + int counter = 0; + // To find adresses thats in the worklist + for (; start < end; start++) { + counter++; + // all pointers must be aligned as double words + + for (auto it = worklist.begin(); it != worklist.end();) { + Chunk *chunk = *it; + + auto c_start = reinterpret_cast(chunk->start); + auto c_size = reinterpret_cast(chunk->size); + auto c_end = reinterpret_cast(c_start + c_size); + + cout << "Start points to:\t" << hex << *start << endl; + cout << "Chunk start:\t\t" << hex << c_start << endl; + cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; + + // Check if the stack pointer aligns with the chunk + if (c_start <= *start && *start < c_end) { + + if (!chunk->marked) { + chunk->marked = true; + it = worklist.erase(it); + } + else { + ++it; + } + } + else { + ++it; + } + } + } + cout << "Counter: " << counter << endl; + } + + /** + * Sweeps the heap, unmarks the marked chunks for the next cycle, + * adds the unmarked nodes to the vector of freed chunks; to be freed. + * + * @param heap Pointer to the heap to oporate on. + */ + void Heap::sweep(Heap *heap) { + for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { + Chunk *chunk = *it; + + // Unmark the marked chunks for the next iteration. + if (chunk->marked) { + chunk->marked = false; + ++it; + } + else { + // Add the unmarked chunks to freed chunks and remove from + // the list of allocated chunks + heap->m_freed_chunks.push_back(chunk); + it = heap->m_allocated_chunks.erase(it); + } + } + } + + /** + * Frees chunks that was moved to the list m_freed_chunks + * by the sweep phase. If there are more than a certain + * amount of free chunks, delete the free chunks to + * avoid cluttering. + * + * @param heap Heap singleton instance, only for avoiding + * redundant calls to the singleton get + */ void Heap::free(Heap *heap) { if (heap->m_freed_chunks.size() > FREE_THRESH) { while (heap->m_freed_chunks.size()) { @@ -134,15 +236,25 @@ namespace GC { delete chunk; } } + // if there are chunks but not more than FREE_THRESH else if (heap->m_freed_chunks.size()) { + // essentially, always check for overlap between + // chunks before finishing the allocation free_overlap(heap); } - // No freed chunks, nothing to free - else { - return; - } } + /** + * Checks for overlaps between freed chunks of memory + * and removes overlapping chunks while prioritizing + * the chunks at lower addresses. + * + * @param heap Heap singleton instance, only for avoiding + * redundant calls to the singleton get + * + * @note Maybe this should be changed to prioritizing + * larger chunks. + */ void Heap::free_overlap(Heap *heap) { std::vector filtered; size_t i = 0; @@ -161,6 +273,25 @@ namespace GC { heap->m_freed_chunks.swap(filtered); } + // ----- ONLY DEBUGGING ----------------------------------------------------------------------- + + /** + * Prints the result of Heap::init() and a dummy value + * for the current stack frame for reference. + */ + void Heap::check_init() { + auto heap = Heap::the(); + cout << "Heap addr:\t" << heap << endl; + cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; + auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + cout << "GC stack_start:\t" << stack_start << endl; + } + + /** + * Conditional collection, only to be used in debugging + * + * @param flags Bitmap of flags + */ void Heap::collect(uint flags) { cout << "DEBUG COLLECT\nFLAGS: "; @@ -200,68 +331,6 @@ namespace GC { } } - /** - * Sweeps the heap, unmarks the marked chunks for the next cycle, - * adds the unmarked nodes to the vector of freed chunks; to be freed. - * - * @param *heap The heap to oporate on. - */ - void Heap::sweep(Heap *heap) { - for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { - Chunk *chunk = *it; - - // Unmark the marked chunks for the next iteration. - if (chunk->marked) { - chunk->marked = false; - ++it; - } - else { - // Add the unmarked chunks to freed chunks and remove from - // the list of allocated chunks - heap->m_freed_chunks.push_back(chunk); - it = heap->m_allocated_chunks.erase(it); - } - } - } - - // This assumes that there are no chains of pointers, will be fixed later on - void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { - int counter = 0; - // To find adresses thats in the worklist - for (; start < end; start++) { - counter++; - // all pointers must be aligned as double words - - for (auto it = worklist.begin(); it != worklist.end();) { - Chunk *chunk = *it; - if (chunk == nullptr) { - assert(false && "EPIC FAIL"); - } - uintptr_t c_start = reinterpret_cast(chunk->start); - uintptr_t c_end = reinterpret_cast(chunk->start + chunk->size); - // Check if the stack pointer aligns with the chunk - if (c_start <= *start && *start < c_end) { - //if (c_start == *start) { - cout << "Start points to:\t" << hex << *start << endl; - cout << "Chunk start:\t\t" << hex << c_start << endl; - cout << "Chunk end:\t\t" << hex << c_end << "\n" << endl; - - if (!chunk->marked) { - chunk->marked = true; - it = worklist.erase(it); - } - else { - ++it; - } - } - else { - ++it; - } - } - } - cout << "Counter: " << counter << endl; - } - // Mark child references from the root references void mark_test(vector worklist) { while (worklist.size() > 0) { @@ -305,7 +374,7 @@ namespace GC { void Heap::print_contents() { auto heap = Heap::the(); if (heap->m_allocated_chunks.size()) { - cout << "\nALLOCATED CHUNKS #" << heap->m_allocated_chunks.size() << endl; + cout << "\nALLOCATED CHUNKS #" << dec << heap->m_allocated_chunks.size() << endl; for (auto chunk : heap->m_allocated_chunks) { print_line(chunk); } @@ -313,7 +382,7 @@ namespace GC { cout << "NO ALLOCATIONS\n" << endl; } if (heap->m_freed_chunks.size()) { - cout << "\nFREED CHUNKS #" << heap->m_freed_chunks.size() << endl; + cout << "\nFREED CHUNKS #" << dec << heap->m_freed_chunks.size() << endl; for (auto fchunk : heap->m_freed_chunks) { print_line(fchunk); } diff --git a/src/GC/tests/extern_lib.cpp b/src/GC/tests/extern_lib.cpp index 2d47576..9ee3a5b 100644 --- a/src/GC/tests/extern_lib.cpp +++ b/src/GC/tests/extern_lib.cpp @@ -7,40 +7,6 @@ GC::Heap *singleton_test(); void init_gc(GC::Heap *heap); void frame_test(GC::Heap *heap); -GC::Heap *singleton_test() { - std::cout << "TESTING SINGLETON INSTANCES" << std::endl; - std::cout << "===========================" << std::endl; - std::cout << "Call 1:\t" << GC::Heap::the() << std::endl; - GC::Heap *heap = GC::Heap::the(); - std::cout << "Call 2:\t" << heap << std::endl; - std::cout << "===========================" << std::endl; - return heap; -} - -void init_gc(GC::Heap *heap){ - std::cout << "\n\n INITIALIZING THE HEAP" << std::endl; - std::cout << "===========================" << std::endl; - heap->init(); - std::cout << "===========================" << std::endl; -} - -void frame_test(GC::Heap *heap) { - std::cout << "\n\n TESTING FRAME ADDRESSES" << std::endl; - std::cout << "===========================" << std::endl; - -#pragma clang diagnostic ignored "-Wframe-address" - auto curr_frame = reinterpret_cast(__builtin_frame_address(0)); - std::cout << "Current stack frame:\t" << curr_frame << std::endl; -#pragma clang diagnostic ignored "-Wframe-address" - auto prev_frame = reinterpret_cast(__builtin_frame_address(1)); - std::cout << "Previous stack frame:\t" << prev_frame << std::endl; - - heap->check_init(); - // auto alloced = heap->alloc(sizeof(unsigned long)); - - std::cout << "===========================" << std::endl; -} - int main() { std::cout << "in main" << std::endl; auto heap = singleton_test(); @@ -49,4 +15,77 @@ int main() { frame_test(heap); return 0; +} + +/** + * This test is supposed to determine if the singleton pattern + * implementation is working correctly. This test passes if the + * first and second call prints the same memory address. + * + * Result: pass + * + * @return Pointer to the Heap singleton instance +*/ +GC::Heap *singleton_test() { + std::cout << "TESTING SINGLETON INSTANCES" << std::endl; + std::cout << "===========================" << std::endl; + std::cout << "Call 1:\t" << GC::Heap::the() << std::endl; // First call which initializes the singleton instance + GC::Heap *heap = GC::Heap::the(); // Second call which should return the initialized instance + std::cout << "Call 2:\t" << heap << std::endl; + std::cout << "===========================" << std::endl; + return heap; +} + + +/** + * This test calls Heap::init() which saves the stack-frame + * address from the calling function (this function). + * Heap::init() is supposed to be called at the absolute + * start of the program to save the address of the + * topmost stack frame. This test doesn't do anything + * but prepares for the next test(s). + * + * @param heap The Heap pointer to the singleton instance. + * +*/ +void init_gc(GC::Heap *heap){ + std::cout << "\n\n INITIALIZING THE HEAP" << std::endl; + std::cout << "===========================" << std::endl; + heap->init(); + std::cout << "===========================" << std::endl; +} + +/** + * This function tests the functionality of the intrinsic + * function `__builtin_frame_address` which returns the + * address of the corresponding level of stack frame. + * When given a param of 0, it returns the current stack frame. + * When given a param of 1, it returns the previous stack + * frame, and so on. + * + * This test passes on two conditions: + * 1) if the address of the current frame is smaller than + * the address of the previous frame (assumed). + * 2) if the previous frame has the same address as the one + * saved in the Heap instance after running Heap::init(). + * + * Result: pass + * + * @param heap The Heap instance +*/ +void frame_test(GC::Heap *heap) { + std::cout << "\n\n TESTING FRAME ADDRESSES" << std::endl; + std::cout << "===========================" << std::endl; + +#pragma clang diagnostic ignored "-Wframe-address" // clang++ directive to ignore warnings about __b_f_a + auto curr_frame = reinterpret_cast(__builtin_frame_address(0)); // addr of curr stack frame + std::cout << "Current stack frame:\t" << curr_frame << std::endl; +#pragma clang diagnostic ignored "-Wframe-address" + auto prev_frame = reinterpret_cast(__builtin_frame_address(1)); // addr of prev stack frame + std::cout << "Previous stack frame:\t" << prev_frame << std::endl; + + heap->check_init(); // prints the saved absolute top of the stack + // auto alloced = heap->alloc(sizeof(unsigned long)); + + std::cout << "===========================" << std::endl; } \ No newline at end of file diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index 5c263f1..a71c62f 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -35,7 +35,7 @@ void detach_pointer(long **ptr) { *ptr = dummy_ptr; } -void test_chain(int depth, bool detach) { +Node *test_chain(int depth, bool detach) { auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from test_chain:\t" << stack_start << std::endl; @@ -43,6 +43,7 @@ void test_chain(int depth, bool detach) { // This generates a segmentation fault (should be investigated further) if (detach) node_chain->child = nullptr; + return node_chain; } @@ -63,8 +64,8 @@ void test_some_types() { } int main() { - //gc->init(); - //gc->check_init(); + gc->init(); + gc->check_init(); auto stack_start = reinterpret_cast(__builtin_frame_address(0)); std::cout << "Stack start from main:\t" << stack_start << std::endl; @@ -74,13 +75,20 @@ int main() { // long *l = static_cast(gc->alloc(sizeof(long))); // 0x6-0xd | 0x // This is allocated outside of the scope of the GC (if gc->init() isn't called), thus garbage - long *longs[21]; + /* long *longs[21]; std::cout << "Pointer to ints:\t" << longs << std::endl; for (int i = 0; i < 21; i++) { longs[i] = static_cast(gc->alloc(sizeof(long))); - } + } */ + //Node *root; + Node *root = test_chain(3, false); + std::cout << "Adress of root:\t" << &root << std::endl; + std::cout << "Root points to:\t" << root << std::endl; + // 0x7ffdd7556bd8 + int *i = static_cast(gc->alloc(sizeof(int))); + std::cout << "Adress of i:\t" << &i << std::endl; - gc->collect(MARK | SWEEP | FREE); // free misses some chunks + gc->collect(MARK); // free misses some chunks gc->print_contents(); return 0; } \ No newline at end of file diff --git a/src/GC/todo.md b/src/GC/todo.md index 7011610..dba3eee 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -1,5 +1,7 @@ # Garbage collection + + ## Project Goal for next week (24/2): @@ -7,34 +9,10 @@ Goal for next week (24/2): ## GC TODO: - Merge to main branch -- Fix singleton references -- Get a good grasp of how the adressing of stack frames actually works. -- Debug "free()", sometimes it skips chunks that should be freed. -- Check alignment of chunks. -- Think about how we want to determine if some object is a pointer or not, probably will have to discuss that with Samuel. Since it is not ideal to determine in the GC if an object is a pointer or not. It should preferably be done in a previous stage. +- Switch std::vector to std::list +- Make alloc and init static, move the() to private +- stack_end, stack_start -> stack_top, stack_bottom +- Double check m_heap_size functionality and when a collection is triggered ## Tests TODO -### Library linking -**Victor fixes this** -Compile the GC lib and a test separately, link them together -and evalutate the following: - __builtin_frame_address(0) - __builtin_frame_address(1) - __builtin_return_address(0) - __builtin_return_address(1) - -### GC Init and __b_f_a -1. Save the first stack fram globally as the stack start -2. For each call to collect, save the prev stack frame as the stack end -3. Scan through the span - - gc_init() - global stack_end = __builtin_frame_address(1) - - collect() - local stack_start = __builtin_frame_address(1) - - sweep() - for all addr in range(stack_end, stack_start) - mark if chunk From bbd2650445f246cdacd7d868e3252aaefea2bcb2 Mon Sep 17 00:00:00 2001 From: valtermiari Date: Thu, 23 Feb 2023 15:51:29 +0100 Subject: [PATCH 28/32] Testing recursive marking with chain references. --- src/GC/lib/heap.cpp | 1 + src/GC/tests/h_test.cpp | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index ea47bc4..3d37a3c 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -182,6 +182,7 @@ namespace GC { if (!chunk->marked) { chunk->marked = true; it = worklist.erase(it); + mark((uintptr_t*) c_start, (uintptr_t*) c_end, worklist); } else { ++it; diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index a71c62f..dfba75c 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -8,17 +8,20 @@ struct Node { }; Node *create_chain(int depth) { - Node* nodes[depth]; + std::vector nodes; if (depth > 0) { Node *last_node = static_cast(gc->alloc(sizeof(Node))); last_node->id = depth; last_node->child = nullptr; - nodes[0] = last_node; - for (int i = 1; i < depth; i++) { + nodes.push_back(last_node); + for (int i = 0; i < depth; i++) { Node *node = static_cast(gc->alloc(sizeof(Node))); node->id = depth-i; node->child = nodes[i-1]; - nodes[i] = node; + nodes.push_back(node); + } + for (size_t i = 0; i < nodes.size(); i++) { + std::cout << "Element at " << i << ":\t" << nodes.at(i) << std::endl; } return nodes[depth]; } @@ -55,7 +58,6 @@ void test_some_types() { std::cout << "l points to:\t\t" << l << std::endl; detach_pointer(&l); std::cout << "l points to:\t\t" << l << std::endl; - // l still gets marked, which is not supposed to happen // Some more dummy values of different sizes, to test stack pointer alignment int *i = static_cast(gc->alloc(sizeof(int))); @@ -80,15 +82,14 @@ int main() { for (int i = 0; i < 21; i++) { longs[i] = static_cast(gc->alloc(sizeof(long))); } */ - //Node *root; - Node *root = test_chain(3, false); + + Node *root = static_cast(gc->alloc(sizeof(Node))); + root = test_chain(3, false); std::cout << "Adress of root:\t" << &root << std::endl; std::cout << "Root points to:\t" << root << std::endl; - // 0x7ffdd7556bd8 - int *i = static_cast(gc->alloc(sizeof(int))); - std::cout << "Adress of i:\t" << &i << std::endl; + std::cout << "Root child:\t" << root->child << std::endl; - gc->collect(MARK); // free misses some chunks + gc->collect(MARK); gc->print_contents(); return 0; } \ No newline at end of file From a684fe1ea07edbbf502165fa349548befbd673fb Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Fri, 24 Feb 2023 12:01:37 +0100 Subject: [PATCH 29/32] Made exposed endpoints static --- src/GC/Makefile | 4 +-- src/GC/include/heap.hpp | 61 ++++++++++++++++++-------------- src/GC/lib/heap.cpp | 76 +++++++++++++++++++++++++--------------- src/GC/tests/advance.cpp | 33 +++++++++++++++++ src/GC/tests/h_test.cpp | 6 ++-- src/GC/todo.md | 3 +- 6 files changed, 121 insertions(+), 62 deletions(-) create mode 100644 src/GC/tests/advance.cpp diff --git a/src/GC/Makefile b/src/GC/Makefile index 354adad..92b02e8 100644 --- a/src/GC/Makefile +++ b/src/GC/Makefile @@ -9,8 +9,8 @@ STDFLAGS = -std=gnu++20 -stdlib=libc++ WFLAGS = -Wall -Wextra DBGFLAGS = -g -test_test: - echo "$(shell pwd)" +advance: + $(CC) $(WFLAGS) $(STDFLAGS) tests/advance.cpp -o tests/advance.out heap: $(CC) $(WFLAGS) $(STDFLAGS) $(LIB_INCL) lib/heap.cpp diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index 30f1a7a..cd0b142 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -2,9 +2,9 @@ #include #include +#include #include #include -#include #include "chunk.hpp" @@ -30,26 +30,10 @@ namespace GC { m_allocated_size = 0; } - void collect(Heap *heap); - void sweep(Heap *heap); - uintptr_t *try_recycle_chunks(Heap *heap, size_t size); - void free(Heap *heap); - void free_overlap(Heap *heap); - void mark(uintptr_t *start, const uintptr_t *end, std::vector worklist); - void print_line(Chunk *chunk); - void print_worklist(std::vector list); - - inline static Heap *m_instance = nullptr; - const char *m_heap; - size_t m_size; - size_t m_allocated_size; - uintptr_t *m_stack_end = nullptr; - - // maybe change to std::list - std::vector m_allocated_chunks; - std::vector m_freed_chunks; - - public: + // BEWARE only for testing, this should be adressed + ~Heap() { + std::free((char *)m_heap); + } static inline Heap *the() { // TODO: make private if (m_instance) // if m_instance is not a nullptr @@ -58,11 +42,35 @@ namespace GC { return m_instance; } - // BEWARE only for testing, this should be adressed - ~Heap() { - std::free((char *)m_heap); + static inline Chunk *getAt(std::list list, size_t n) { + auto iter = list.begin(); + if (!n) + return *iter; + std::advance(iter, n); + return *iter; } + void collect(); + void sweep(Heap *heap); + uintptr_t *try_recycle_chunks(size_t size); + void free(Heap* heap); + void free_overlap(Heap *heap); + void mark(uintptr_t *start, const uintptr_t *end, std::list worklist); + void print_line(Chunk *chunk); + void print_worklist(std::list list); + + inline static Heap *m_instance = nullptr; + const char *m_heap; + size_t m_size; + size_t m_allocated_size; + uintptr_t *m_stack_end = nullptr; + + // maybe change to std::list + std::list m_allocated_chunks; + std::list m_freed_chunks; + + public: + /** * These are the only two functions which are exposed * as the API for LLVM. At the absolute start of the @@ -70,8 +78,9 @@ namespace GC { * that the address of the topmost stack frame is * saved as the limit for scanning the stack in collect. */ - void *alloc(size_t size); // TODO: make static - void init(); // TODO: make static + static void init(); // TODO: make static + static void dispose(); // -||- + static void *alloc(size_t size); // -||- // DEBUG ONLY void collect(uint flags); // conditional collection diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index 3d37a3c..cf12a24 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -23,6 +23,14 @@ namespace GC { heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); } + /** + * Disposes the heap at program exit. + */ + void Heap::dispose() { + Heap *heap = Heap::the(); + delete heap; + } + /** * Allocates a given amount of bytes on the heap. * @@ -43,13 +51,13 @@ namespace GC { } if (heap->m_size + size > HEAP_SIZE) { - collect(heap); + heap->collect(); // If collect failed, crash with OOM error assert(heap->m_size + size <= HEAP_SIZE && "Heap: Out Of Memory"); } // If a chunk was recycled, return the old chunk address - uintptr_t *reused_chunk = try_recycle_chunks(heap, size); + uintptr_t *reused_chunk = heap->try_recycle_chunks(size); if (reused_chunk != nullptr) { return (void *)reused_chunk; } @@ -58,7 +66,7 @@ namespace GC { // then create a new chunk auto new_chunk = new Chunk; new_chunk->size = size; - new_chunk->start = (uintptr_t *)(heap->m_heap + m_size); + new_chunk->start = (uintptr_t *)(heap->m_heap + heap->m_size); heap->m_size += size; @@ -75,8 +83,6 @@ namespace GC { * objects slightly which saves time from malloc'ing * memory from the OS. * - * @param heap Pointer to the singleton Heap instance - * * @param size Amount of bytes needed for the object * which is about to be allocated. * @@ -86,10 +92,14 @@ namespace GC { * nullptr is returned to signify no * chunks were found. */ - uintptr_t *Heap::try_recycle_chunks(Heap *heap, size_t size) { + uintptr_t *Heap::try_recycle_chunks(size_t size) { + auto heap = Heap::the(); // Check if there are any freed chunks large enough for current request for (size_t i = 0; i < heap->m_freed_chunks.size(); i++) { - auto cp = heap->m_freed_chunks.at(i); + // auto cp = heap->m_freed_chunks.at(i); + auto cp = getAt(heap->m_freed_chunks, i); + auto iter = heap->m_freed_chunks.begin(); + advance(iter, i); if (cp->size > size) { // Split the chunk, use one part and add the remaining part to @@ -100,7 +110,7 @@ namespace GC { chunk_complement->size = diff; chunk_complement->start = cp->start + cp->size; - heap->m_freed_chunks.erase(m_freed_chunks.begin() + i); + heap->m_freed_chunks.erase(iter); heap->m_freed_chunks.push_back(chunk_complement); heap->m_allocated_chunks.push_back(cp); @@ -109,7 +119,7 @@ namespace GC { else if (cp->size == size) { // Reuse the whole chunk - heap->m_freed_chunks.erase(m_freed_chunks.begin() + i); + heap->m_freed_chunks.erase(iter); heap->m_allocated_chunks.push_back(cp); return cp->start; } @@ -123,11 +133,10 @@ namespace GC { * left on the heap, a collection is triggered. This * function is private so that the user cannot trigger * a collection unneccessarily. - * - * @param heap Heap singleton instance, only for avoiding - * redundant calls to the singleton get */ - void Heap::collect(Heap *heap) { + void Heap::collect() { + // Get instance + auto heap = Heap::the(); // get current stack auto stack_start = reinterpret_cast(__builtin_frame_address(0)); @@ -148,24 +157,26 @@ namespace GC { } /** - * Iterates through the stack, if an element on the stack points to a chunk - * that chunk is marked (i.e. reachable). It only marks element which are directly - * reachable from the chunk, so no chain of pointers from the stack are detected. + * Iterates through the stack, if an element on the stack points to a chunk, + * called a root chunk, that chunk is marked (i.e. reachable). + * Then it recursively follows all chunks which are possibly reachable from + * the root chunk and mark those chunks. * If a chunk is marked it is removed from the worklist, since it's no longer of * concern for this method. * * @param start Pointer to the start of the stack frame. * @param end Pointer to the end of the stack frame. - * @param worklist The currently allocated chunks. + * @param worklist The currently allocated chunks, which haven't been marked. */ - void Heap::mark(uintptr_t *start, const uintptr_t *end, vector worklist) { + void Heap::mark(uintptr_t *start, const uintptr_t *end, list worklist) { int counter = 0; // To find adresses thats in the worklist for (; start < end; start++) { counter++; - // all pointers must be aligned as double words - - for (auto it = worklist.begin(); it != worklist.end();) { + auto it = worklist.begin(); + auto stop = worklist.end(); + // for (auto it = worklist.begin(); it != worklist.end();) { + while (it != stop) { Chunk *chunk = *it; auto c_start = reinterpret_cast(chunk->start); @@ -181,7 +192,9 @@ namespace GC { if (!chunk->marked) { chunk->marked = true; + // Remove the marked chunk from the worklist it = worklist.erase(it); + // Recursively call mark, to see if the reachable chunk further points to another chunk mark((uintptr_t*) c_start, (uintptr_t*) c_end, worklist); } else { @@ -203,19 +216,22 @@ namespace GC { * @param heap Pointer to the heap to oporate on. */ void Heap::sweep(Heap *heap) { - for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { - Chunk *chunk = *it; + auto iter = heap->m_allocated_chunks.begin(); + auto stop = heap->m_allocated_chunks.end(); + // for (auto it = heap->m_allocated_chunks.begin(); it != heap->m_allocated_chunks.end();) { + while (iter != stop) { + Chunk *chunk = *iter; // Unmark the marked chunks for the next iteration. if (chunk->marked) { chunk->marked = false; - ++it; + ++iter; } else { // Add the unmarked chunks to freed chunks and remove from // the list of allocated chunks heap->m_freed_chunks.push_back(chunk); - it = heap->m_allocated_chunks.erase(it); + iter = heap->m_allocated_chunks.erase(iter); } } } @@ -257,13 +273,15 @@ namespace GC { * larger chunks. */ void Heap::free_overlap(Heap *heap) { - std::vector filtered; + std::list filtered; size_t i = 0; - filtered.push_back(heap->m_freed_chunks.at(i++)); + // filtered.push_back(heap->m_freed_chunks.at(i++)); + filtered.push_back(getAt(heap->m_freed_chunks, i++)); cout << filtered.back()->start << endl; for (; i < heap->m_freed_chunks.size(); i++) { auto prev = filtered.back(); - auto next = heap->m_freed_chunks.at(i); + // auto next = heap->m_freed_chunks.at(i); + auto next = getAt(heap->m_freed_chunks, i); auto p_start = (uintptr_t)(prev->start); auto p_size = (uintptr_t)(prev->size); auto n_start = (uintptr_t)(next->start); @@ -366,7 +384,7 @@ namespace GC { cout << "Marked: " << chunk->marked << "\nStart adr: " << chunk->start << "\nSize: " << chunk->size << " B\n" << endl; } - void Heap::print_worklist(std::vector list) { + void Heap::print_worklist(std::list list) { for (auto cp : list) { cout << "Chunk at:\t" << cp->start << "\nSize:\t\t" << cp->size << endl; } diff --git a/src/GC/tests/advance.cpp b/src/GC/tests/advance.cpp new file mode 100644 index 0000000..632b447 --- /dev/null +++ b/src/GC/tests/advance.cpp @@ -0,0 +1,33 @@ +#include +#include +#include + +using namespace std; + +int main() { + list l; + char c = 'a'; + for (int i = 1; i <= 5; i++) { + l.push_back(c++); + } + + auto iter = l.begin(); + auto stop = l.end(); + + while (iter != stop) { + cout << *iter << " "; + + iter++; + } + cout << endl; + iter = l.begin(); + while (*iter != *stop) { + cout << *iter << " "; + iter++; + } + cout << endl; + + // cout << "iter: " << *iter << "\nstop: " << *stop << endl; + + return 0; +} \ No newline at end of file diff --git a/src/GC/tests/h_test.cpp b/src/GC/tests/h_test.cpp index dfba75c..ac55bf7 100644 --- a/src/GC/tests/h_test.cpp +++ b/src/GC/tests/h_test.cpp @@ -17,7 +17,7 @@ Node *create_chain(int depth) { for (int i = 0; i < depth; i++) { Node *node = static_cast(gc->alloc(sizeof(Node))); node->id = depth-i; - node->child = nodes[i-1]; + node->child = nodes[i]; nodes.push_back(node); } for (size_t i = 0; i < nodes.size(); i++) { @@ -83,8 +83,8 @@ int main() { longs[i] = static_cast(gc->alloc(sizeof(long))); } */ - Node *root = static_cast(gc->alloc(sizeof(Node))); - root = test_chain(3, false); + //Node *root = static_cast(gc->alloc(sizeof(Node))); + Node *root = test_chain(100, true); std::cout << "Adress of root:\t" << &root << std::endl; std::cout << "Root points to:\t" << root << std::endl; std::cout << "Root child:\t" << root->child << std::endl; diff --git a/src/GC/todo.md b/src/GC/todo.md index dba3eee..c948b6e 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -9,10 +9,9 @@ Goal for next week (24/2): ## GC TODO: - Merge to main branch -- Switch std::vector to std::list -- Make alloc and init static, move the() to private - stack_end, stack_start -> stack_top, stack_bottom - Double check m_heap_size functionality and when a collection is triggered +- Kolla vektor vs list complexity ## Tests TODO From 019c54bdad0c53c522f21f20a848bfa2997f845a Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Fri, 24 Feb 2023 13:08:33 +0100 Subject: [PATCH 30/32] Switched stack start and ends to tops and bottoms. --- src/GC/include/heap.hpp | 2 +- src/GC/lib/heap.cpp | 42 ++++++++++++++++++++--------------------- src/GC/todo.md | 6 ++---- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/GC/include/heap.hpp b/src/GC/include/heap.hpp index cd0b142..c70ee54 100644 --- a/src/GC/include/heap.hpp +++ b/src/GC/include/heap.hpp @@ -63,7 +63,7 @@ namespace GC { const char *m_heap; size_t m_size; size_t m_allocated_size; - uintptr_t *m_stack_end = nullptr; + uintptr_t *m_stack_top = nullptr; // maybe change to std::list std::list m_allocated_chunks; diff --git a/src/GC/lib/heap.cpp b/src/GC/lib/heap.cpp index cf12a24..c17f680 100644 --- a/src/GC/lib/heap.cpp +++ b/src/GC/lib/heap.cpp @@ -14,13 +14,13 @@ namespace GC { /** * Initialises the heap singleton and saves the address - * of the calling stack frame as the stack_end. Presumeably + * of the calling stack frame as the stack_top. Presumeably * this address points to the stack frame of the compiled * LLVM executable after linking. */ void Heap::init() { Heap *heap = Heap::the(); - heap->m_stack_end = reinterpret_cast(__builtin_frame_address(1)); + heap->m_stack_top = reinterpret_cast(__builtin_frame_address(1)); } /** @@ -139,17 +139,17 @@ namespace GC { auto heap = Heap::the(); // get current stack - auto stack_start = reinterpret_cast(__builtin_frame_address(0)); + auto stack_bottom = reinterpret_cast(__builtin_frame_address(0)); // fix this block, it's nästy - uintptr_t *stack_end; - if (heap->m_stack_end != nullptr) - stack_end = heap->m_stack_end; + uintptr_t *stack_top; + if (heap->m_stack_top != nullptr) + stack_top = heap->m_stack_top; else - stack_end = (uintptr_t *)0; // temporary + stack_top = (uintptr_t *)0; // temporary auto work_list = heap->m_allocated_chunks; - mark(stack_start, stack_end, work_list); + mark(stack_bottom, stack_top, work_list); sweep(heap); @@ -211,9 +211,9 @@ namespace GC { /** * Sweeps the heap, unmarks the marked chunks for the next cycle, - * adds the unmarked nodes to the vector of freed chunks; to be freed. + * adds the unmarked nodes to the list of freed chunks; to be freed. * - * @param heap Pointer to the heap to oporate on. + * @param heap Pointer to the heap singleton instance. */ void Heap::sweep(Heap *heap) { auto iter = heap->m_allocated_chunks.begin(); @@ -301,9 +301,9 @@ namespace GC { void Heap::check_init() { auto heap = Heap::the(); cout << "Heap addr:\t" << heap << endl; - cout << "GC m_stack_end:\t" << heap->m_stack_end << endl; - auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - cout << "GC stack_start:\t" << stack_start << endl; + cout << "GC m_stack_top:\t" << heap->m_stack_top << endl; + auto stack_bottom = reinterpret_cast(__builtin_frame_address(0)); + cout << "GC stack_bottom:\t" << stack_bottom << endl; } /** @@ -325,20 +325,20 @@ namespace GC { auto heap = Heap::the(); // get the frame adress, whwere local variables and saved registers are located - auto stack_start = reinterpret_cast(__builtin_frame_address(0)); - cout << "Stack start in collect:\t" << stack_start << endl; - uintptr_t *stack_end; + auto stack_bottom = reinterpret_cast(__builtin_frame_address(0)); + cout << "Stack bottom in collect:\t" << stack_bottom << endl; + uintptr_t *stack_top; - if (heap->m_stack_end != nullptr) - stack_end = heap->m_stack_end; + if (heap->m_stack_top != nullptr) + stack_top = heap->m_stack_top; else - stack_end = (uintptr_t *) stack_start - 80; // dummy value + stack_top = (uintptr_t *) stack_bottom + 80; // dummy value - cout << "Stack end in collect:\t " << stack_end << endl; + cout << "Stack end in collect:\t " << stack_top << endl; auto work_list = heap->m_allocated_chunks; if (flags & MARK) { - mark(stack_start, stack_end, work_list); + mark(stack_bottom, stack_top, work_list); } if (flags & SWEEP) { diff --git a/src/GC/todo.md b/src/GC/todo.md index c948b6e..f9492da 100644 --- a/src/GC/todo.md +++ b/src/GC/todo.md @@ -1,17 +1,15 @@ # Garbage collection - - ## Project Goal for next week (24/2): -- Debug +- Write more complex tests ## GC TODO: - Merge to main branch -- stack_end, stack_start -> stack_top, stack_bottom - Double check m_heap_size functionality and when a collection is triggered - Kolla vektor vs list complexity ## Tests TODO +- Write complex datastructures for tests with larger programs From 7ff174459a9f54325b19a46681adc736f1dd3076 Mon Sep 17 00:00:00 2001 From: Victor Olin Date: Fri, 24 Feb 2023 13:09:24 +0100 Subject: [PATCH 31/32] Delete random files --- .../tests/h_test.out.dSYM/Contents/Info.plist | 20 ------------------ .../Contents/Resources/DWARF/h_test.out | Bin 204968 -> 0 bytes 2 files changed, 20 deletions(-) delete mode 100644 src/GC/tests/h_test.out.dSYM/Contents/Info.plist delete mode 100644 src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Info.plist b/src/GC/tests/h_test.out.dSYM/Contents/Info.plist deleted file mode 100644 index 3db2218..0000000 --- a/src/GC/tests/h_test.out.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.h_test.out - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out b/src/GC/tests/h_test.out.dSYM/Contents/Resources/DWARF/h_test.out deleted file mode 100644 index d3ad3e76a59e30d8544efb36f9e28d362fbec250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204968 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 Date: Fri, 24 Feb 2023 13:14:46 +0100 Subject: [PATCH 32/32] Rebased the branch --- src/GC/tests/advance.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/GC/tests/advance.cpp b/src/GC/tests/advance.cpp index 632b447..0a8a177 100644 --- a/src/GC/tests/advance.cpp +++ b/src/GC/tests/advance.cpp @@ -27,6 +27,7 @@ int main() { } cout << endl; + cout << "rebased" << endl; // cout << "iter: " << *iter << "\nstop: " << *stop << endl; return 0;