From e739218eb5fb8ba7066b501b7cbf807c17e2f511 Mon Sep 17 00:00:00 2001 From: Rakesh Joshi Date: Sat, 25 May 2024 18:29:56 +0530 Subject: [PATCH 1/2] Added Graph Traversal in intermediate section --- codeharborhub | 1 + dsa/intermediate/Graph_traversal.md | 418 +++++++++++++++++++ dsa/intermediate/_category_.json | 8 + dsa/intermediate/binary_tree.md | 597 ++++++++++++++++++++++++++++ dsa/intermediate/graph.png | Bin 0 -> 60250 bytes 5 files changed, 1024 insertions(+) create mode 160000 codeharborhub create mode 100644 dsa/intermediate/Graph_traversal.md create mode 100644 dsa/intermediate/_category_.json create mode 100644 dsa/intermediate/binary_tree.md create mode 100644 dsa/intermediate/graph.png diff --git a/codeharborhub b/codeharborhub new file mode 160000 index 000000000..08e05f289 --- /dev/null +++ b/codeharborhub @@ -0,0 +1 @@ +Subproject commit 08e05f289d8a4b672c1e5cbd559142f9a217acb6 diff --git a/dsa/intermediate/Graph_traversal.md b/dsa/intermediate/Graph_traversal.md new file mode 100644 index 000000000..2aec3e86e --- /dev/null +++ b/dsa/intermediate/Graph_traversal.md @@ -0,0 +1,418 @@ +--- +id: 02-graph-traversal +title: Graph Data Structure Traversal Methods +sidebar_label: Graph Traversal methods +tags: + - dsa + - data-structures + - graph + - graph-traversal + - bfs + - dfs + - intermediate + - javascript + - python + - c++ + - java + - programming + - tutorial +sidebar_position: 5 +--- +## What is Graph Data Structure +Graph Data Structure is a collection of vertices connected by edges. The vertices(V) are also referred as nodes and lines connecting any two nodes are called edges(E). A graph is denoted by G(V,E). + +![Local Image](graph.png) +## Traversal Methods in Graph +Two very popular traversal methods in Graph are: +* BFS (Breadth First Search) +* DFS (Depth First Search) + +## BFS (Breadth First Search) +Breadth First Search traversal algorithm in graph is similar to level order traversal of tree. It starts at a specified vertex and visits all its neighbors before moving on to the next level of neighbors. BFS is commonly used in algorithms for pathfinding, connected components, and shortest path problems in graphs. +### Algorithm: +1. Use adjacency list or adjacency matrix to store the graph, queue and a visiting array to keep the track of the visited vertex. +2. Strat traversal from any vertex. +3. Drop that vertex into queue +4. Take out the vertex from queue and explore it. +5. While exploring, go to all the adjacent vertices and add them to queue. +6. Repeat step 4 and 5 unitl queue is not empty. + +### BFS Program + + + ```Cpp showLineNumbers + /*write a cpp program to implement bfs algorithm*/ +#include +#include +#include +using namespace std; +void bfs(int source, vector>&graph,int vertex) +{ + queuequ; + vectorvisited(vertex,0); + qu.push(source); + visited[source]=1; + cout<>adjlis(vertex); //using adjacent list method to represent graph + //there are 9 edges in the graph + adjlis[0].push_back(2); + adjlis[0].push_back(1); + adjlis[0].push_back(3); + adjlis[1].push_back(3); + adjlis[2].push_back(3); + adjlis[2].push_back(4); + adjlis[3].push_back(4); + adjlis[4].push_back(5); + adjlis[4].push_back(6); + + bfs(0,adjlis,vertex); + return 0; +} + ``` + + + + ```Python showLineNumbers + from collections import deque + def bfs(source, graph, vertex): + qu = deque() + visited = [0] * vertex + qu.append(source) + visited[source] = 1 + print(source, end=" ") + + while qu: + u = qu.popleft() + for it in graph[u]: + if visited[it] == 0: + print(it, end=" ") + visited[it] = 1 + qu.append(it) + + def main(): + vertex = 7 + adjlis = [[] for _ in range(vertex)] # using adjacency list method to represent graph + # there are 9 edges in the graph + adjlis[0].extend([2, 1, 3]) + adjlis[1].append(3) + adjlis[2].extend([3, 4]) + adjlis[3].append(4) + adjlis[4].extend([5, 6]) + + bfs(0, adjlis, vertex) + + if __name__ == "__main__": + main() + + ``` + + + +```jsx showLineNumbers +import java.util.*; + +public class Main { + public static void bfs(int source, List> graph, int vertex) { + Queue qu = new LinkedList<>(); + boolean[] visited = new boolean[vertex]; + qu.add(source); + visited[source] = true; + System.out.print(source + " "); + + while (!qu.isEmpty()) { + int u = qu.poll(); + for (int it : graph.get(u)) { + if (!visited[it]) { + System.out.print(it + " "); + visited[it] = true; + qu.add(it); + } + } + } + } + + public static void main(String[] args) { + int vertex = 7; + List> adjlis = new ArrayList<>(vertex); + + for (int i = 0; i < vertex; i++) { + adjlis.add(new ArrayList<>()); + } + + // There are 9 edges in the graph + adjlis.get(0).addAll(Arrays.asList(2, 1, 3)); + adjlis.get(1).add(3); + adjlis.get(2).addAll(Arrays.asList(3, 4)); + adjlis.get(3).add(4); + adjlis.get(4).addAll(Arrays.asList(5, 6)); + + bfs(0, adjlis, vertex); + } +} + +``` + + + +```JavaScript showLineNumbers +class Graph { + constructor(vertex) { + this.vertex = vertex; + this.adjList = new Array(vertex).fill(null).map(() => []); + } + + addEdge(src, dest) { + this.adjList[src].push(dest); + } + + bfs(source) { + const visited = new Array(this.vertex).fill(false); + const queue = []; + visited[source] = true; + queue.push(source); + + while (queue.length !== 0) { + const u = queue.shift(); + console.log(u); + + for (const it of this.adjList[u]) { + if (!visited[it]) { + visited[it] = true; + queue.push(it); + } + } + } + } +} + +const main = () => { + const vertex = 7; + const graph = new Graph(vertex); + + // There are 9 edges in the graph + graph.addEdge(0, 2); + graph.addEdge(0, 1); + graph.addEdge(0, 3); + graph.addEdge(1, 3); + graph.addEdge(2, 3); + graph.addEdge(2, 4); + graph.addEdge(3, 4); + graph.addEdge(4, 5); + graph.addEdge(4, 6); + + graph.bfs(0); +}; + +main(); +``` + + +Output:
+ +``` +0 2 1 3 4 5 6 +``` + +## DFS (Depth First Search) +Depth First Search traversal algorithm is similar to Pre-order traversal in binary tree. DFS use stack data structure here (or recursion as stack).he algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. + +### Algorithm: +1. Use adjacency list or adjacency matrix to store the graph, queue and a visiting array to keep the track of the visited vertex. +2. Start with any vertex and start exploring. +3. After getting first element suspend the previous one in the stack and now start exploring this vertex. +4. If cannot explore more go back to previous vertex (backtraking) from stack and explore that +5. Repeat 3 and 4 until stack is empty. + +### DFS Program + + + ```Cpp showLineNumbers + #include +#include +using namespace std; + +// Function for DFS traversal +void DFS(int u, vector>& G, vector& visited) { + cout << u << " "; + visited[u] = 1; + + for (int v = 0; v < G.size(); ++v) { + if (G[u][v] == 1 && visited[v] == 0) { + DFS(v, G, visited); + } + } +} + +int main() { + int vertex=7; + + //using adjacent matrix method to represent graph + vector> G{{0,1,1,1,0,0,0}, + {1,0,0,1,1,0,0}, + {1,0,0,1,0,0,0}, + {1,1,1,0,1,0,0}, + {0,1,0,1,0,1,1}, + {0,0,0,0,1,0,0}, + {0,0,0,0,1,0,0}}; + + + vector visited(vertex, 0); // Initialize visited array to 0 + + cout << "DFS traversal starting from vertex 0: "; + DFS(0, G, visited); + + return 0; +} + ``` + + + + ```Python showLineNumbers + def dfs(u, graph, visited): + print(u, end=" ") + visited[u] = 1 + + for v in range(len(graph)): + if graph[u][v] == 1 and not visited[v]: + dfs(v, graph, visited) + +def main(): + vertex = 7 + + graph = [ + [0, 1, 1, 1, 0, 0, 0], + [1, 0, 0, 1, 1, 0, 0], + [1, 0, 0, 1, 0, 0, 0], + [1, 1, 1, 0, 1, 0, 0], + [0, 1, 0, 1, 0, 1, 1], + [0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 1, 0, 0] + ] + + visited = [0] * vertex # Initialize visited array to 0 + + print("DFS traversal starting from vertex 0: ", end="") + dfs(0, graph, visited) + +if __name__ == "__main__": + main() + + ``` + + + + ```jsx showLineNumbers + import java.util.*; + +public class DFS { + // Function for DFS traversal + public static void dfs(int u, int[][] graph, boolean[] visited) { + System.out.print(u + " "); + visited[u] = true; + + for (int v = 0; v < graph.length; v++) { + if (graph[u][v] == 1 && !visited[v]) { + dfs(v, graph, visited); + } + } + } + + public static void main(String[] args) { + int vertex = 7; + + int[][] graph = { + {0, 1, 1, 1, 0, 0, 0}, + {1, 0, 0, 1, 1, 0, 0}, + {1, 0, 0, 1, 0, 0, 0}, + {1, 1, 1, 0, 1, 0, 0}, + {0, 1, 0, 1, 0, 1, 1}, + {0, 0, 0, 0, 1, 0, 0}, + {0, 0, 0, 0, 1, 0, 0} + }; + + boolean[] visited = new boolean[vertex]; // Initialize visited array to false + + System.out.print("DFS traversal starting from vertex 0: "); + dfs(0, graph, visited); + } +} + + ``` + + + + ```JavaScript showLineNumbers + class Graph { + constructor(vertex) { + this.vertex = vertex; + this.adjList = new Array(vertex).fill(null).map(() => []); + } + + addEdge(src, dest) { + this.adjList[src].push(dest); + } + + dfsUtil(v, visited) { + visited[v] = true; + console.log(v + " "); + + this.adjList[v].forEach(neighbour => { + if (!visited[neighbour]) { + this.dfsUtil(neighbour, visited); + } + }); + } + + dfs(v) { + let visited = new Array(this.vertex).fill(false); + this.dfsUtil(v, visited); + } +} + +const main = () => { + const vertex = 7; + const graph = new Graph(vertex); + + graph.addEdge(0, 1); + graph.addEdge(0, 2); + graph.addEdge(0, 3); + graph.addEdge(1, 3); + graph.addEdge(1, 4); + graph.addEdge(2, 3); + graph.addEdge(3, 4); + graph.addEdge(4, 5); + graph.addEdge(4, 6); + + console.log("DFS traversal starting from vertex 0: "); + graph.dfs(0); +}; + +main(); + + ``` + + +Output:
+ +``` +DFS traversal starting from vertex 0: 0 1 3 2 4 5 6 +``` diff --git a/dsa/intermediate/_category_.json b/dsa/intermediate/_category_.json new file mode 100644 index 000000000..26b212a40 --- /dev/null +++ b/dsa/intermediate/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Intermediate", + "position": 2, + "link": { + "type": "generated-index", + "description": "Learn the intermediate of the Data Structures." + } + } \ No newline at end of file diff --git a/dsa/intermediate/binary_tree.md b/dsa/intermediate/binary_tree.md new file mode 100644 index 000000000..a41c99645 --- /dev/null +++ b/dsa/intermediate/binary_tree.md @@ -0,0 +1,597 @@ +--- +id: 01-binary-tree +title: Introduction to Binary Tree +sidebar_label: Binary Tree +tags: + - dsa + - data-structures + - binary-tree + - intermediate + - javascript + - python + - c++ + - java + - programming + - tutorial +sidebar_position: 5 +--- +In this tutorial we will explore one of the fundamental data structure in computer science: Binary Tree +# What is a Binary Tree? +A binary tree is a hierarchical data structure composed of nodes, where each node has at most two children: a left child and a right child. The topmost node of the tree is called the root node. Each child node can have its own left and right children, forming sub-trees. + + + +## Representation of a Node Binary Tree +Binary Tree is made up of nodes, where each node except leaf nodes have children. Each node in the tree consist of three parts i.e., data, left pointer, right pointer. To create a node we can follow the below structure of code: + + + + ```Cpp showLineNumbers + //Creating a node in C++ using structure + + typedef struct treetype + { + struct treetype *left; + int data; + struct treetype *right; + }node; + + //Creating a node in C++ using class + class Node{ + public: + Node *left; + int data; + Node *right; + }; + ``` + + + + ```Python showLineNumbers + #Creating a node in Python + + class Node: + def __init__(self, val): + self.left = None + self.data = val + self.right = None + ``` + + + + ```jsx showLineNumbers + //Creating a node in Java + + class Node{ + int data; + Node left,right; + public Node(int val) + { + left=null; + data=val; + right=null; + } + } + ``` + + + + ```JavaScript showLineNumbers + //Creating a node in JavaScript + + class Node + { + constructor(val) + { + this.left=null; + this.data=val; + this.right=null; + } + } + ``` + + + +## Operation in Binary Tree +### 1. Insert Operation: +We can add a node in the Binary Tree as a left child or right child of any node. +
+**Algorithm or steps to insert in a binary tree**
+* First check if the root is null or not if root is null means this is the first node of the tree, make it as a root and return it else move to next step +* Now as we have already studient queue data strucuture, we will use that to add nodes to the binary tree +* Insert a node as the left or right child of the parent node if the parent node points to null +* Return root to main function. + +### 2. Traversal of Binary Tree: +Traversal means visiting all nodes of the binary tree. Three famous binary tree traversal methods are:
+* **Preorder Traversal (NLR) :** In this traversal method we have to visit the current node before visiting its left or right subtree. The traversal is Node-left-right means first node (root node) is traveresed then left child and then right child +* **Inorder Traversal (LNR) :** In this traversal method we have to visit all the nodes inside the left subtree first then visit the current node and then the nodes in the right subtree. The traversal is Left-Node-right. +* **Postorder Traversal (LRN) :** In this traversal method we visit the current node after visiting all the nodes in left and right subtree. The traversal is in the order left-right-node. + +### 3. Search in Binary Tree: +We can search any element in the Binary Tree using the same algorithm as insertion just with some difference
+**Algorithm or steps to insert in a binary tree**
+*First check if the root is null or not if root is null return false to main else move to next step.
+*Store the root in a queue, start a loop which ends when queue is empty.
+*Take the front node (as temp) from queue check the temp value with the search value given if same return true to main else move to next step.
+*Check if the temp left or temp right child are NULL or not , if null continue the loop, else push the left then right child in the queue.
+*If the queue comes empty and element is not found return false to main.
+ +## Programming implementation of operation in Binary Tree + + + ```Cpp showLineNumbers + #include + #include + using namespace std; + class Node + { + public: + Node *left,*right; + int data; + Node(int val) + { + left=NULL; + data=val; + right=NULL; + } + }; + //insert function for binary search + Node* insert(Node* root, int data) + { + if (root==NULL){ + root=new Node(data); + return root; + } + //using queue data structure to find the position to insert the node + queuestore; + store.push(root); + while(!store.empty()) + { + Node *temp=store.front(); + store.pop(); + //check for left and right child + if (temp->left==NULL) + { + temp->left=new Node(data); + break; + } + else + store.push(temp->left); + if (temp->right==NULL) + { + temp->right=new Node(data); + break; + } + else + store.push(temp->right); + } + return root; + } + //now traversals methods of binary tree + //PRE-ORDER traversal + void pre_traversal(Node* root) + { + if (root==NULL) + return; + cout<data<<" "; + pre_traversal(root->left); + pre_traversal(root->right); + } + //IN-ORDER traversal + void in_traversal(Node *root) + { + if(root==NULL) + return ; + in_traversal(root->left); + cout<data<<" "; + in_traversal(root->right); + } + //POST-ORDER traversal + void post_traversal(Node *root) + { + if (root==NULL) + return ; + post_traversal(root->left); + post_traversal(root->right); + cout<data<<" "; + } + //search function for binary tree + bool search(Node *root, int value) + { + if (root==NULL) + return false; + queuestore; + store.push(root); + while(!store.empty()) + { + Node *temp=store.front(); + store.pop(); + if (temp->data==value) + return true; + if (temp->left!=NULL) + { + store.push(temp->left); + } + if (temp->right!=NULL) + { + store.push(temp->right); + } + } + return false; + } + int main() + { + Node *root=NULL; + //insertion operation in binary tree + root=insert(root,1); + root=insert(root,2); + root=insert(root,3); + root=insert(root,4); + root=insert(root,5); + //traversal + //preorder traversal + cout<<"Preorder Traversal: "; + pre_traversal(root); + //inorder traversal + cout< + + + ```Python showLineNumbers + from collections import deque + + class Node: + def __init__(self, val): + self.left = None + self.data = val + self.right = None + + # Insert function for binary search + def insert(root, data): + if root is None: + root = Node(data) + return root + # Using queue data structure to find the position to insert the node + store = deque([root]) + while store: + temp = store.popleft() + # Check for left and right child + if temp.left is None: + temp.left = Node(data) + break + else: + store.append(temp.left) + if temp.right is None: + temp.right = Node(data) + break + else: + store.append(temp.right) + return root + + # Now traversal methods of binary tree + # PRE-ORDER traversal + def pre_traversal(root): + if root is None: + return + print(root.data, end=" ") + pre_traversal(root.left) + pre_traversal(root.right) + + # IN-ORDER traversal + def in_traversal(root): + if root is None: + return + in_traversal(root.left) + print(root.data, end=" ") + in_traversal(root.right) + + # POST-ORDER traversal + def post_traversal(root): + if root is None: + return + post_traversal(root.left) + post_traversal(root.right) + print(root.data, end=" ") + + # Search function for binary tree + def search(root, value): + if root is None: + return False + store = deque([root]) + while store: + temp = store.popleft() + if temp.data == value: + return True + if temp.left is not None: + store.append(temp.left) + if temp.right is not None: + store.append(temp.right) + return False + + # Main function + def main(): + root = None + # Insertion operation in binary tree + root = insert(root, 1) + root = insert(root, 2) + root = insert(root, 3) + root = insert(root, 4) + root = insert(root, 5) + + # Traversal + # Preorder traversal + print("Preorder Traversal:", end=" ") + pre_traversal(root) + # Inorder traversal + print("\nInorder Traversal:", end=" ") + in_traversal(root) + # Postorder traversal + print("\nPost-order Traversal:", end=" ") + post_traversal(root) + + # Searching a node in the binary tree + if search(root, 4): + print("\nNode found in the binary tree") + else: + print("\nNode not found in the binary tree") + + if __name__ == "__main__": + main() + + ``` + + + + ```jsx showLineNumbers + import java.util.LinkedList; + import java.util.Queue; + + class Node { + Node left, right; + int data; + + Node(int val) { + left = null; + data = val; + right = null; + } + } + + public class BinaryTree { + // Insert function for binary search + static Node insert(Node root, int data) { + if (root == null) { + root = new Node(data); + return root; + } + // Using queue data structure to find the position to insert the node + Queue store = new LinkedList<>(); + store.add(root); + while (!store.isEmpty()) { + Node temp = store.poll(); + // Check for left and right child + if (temp.left == null) { + temp.left = new Node(data); + break; + } else + store.add(temp.left); + if (temp.right == null) { + temp.right = new Node(data); + break; + } else + store.add(temp.right); + } + return root; + } + + // Now traversal methods of binary tree + // PRE-ORDER traversal + static void preTraversal(Node root) { + if (root == null) + return; + System.out.print(root.data + " "); + preTraversal(root.left); + preTraversal(root.right); + } + + // IN-ORDER traversal + static void inTraversal(Node root) { + if (root == null) + return; + inTraversal(root.left); + System.out.print(root.data + " "); + inTraversal(root.right); + } + + // POST-ORDER traversal + static void postTraversal(Node root) { + if (root == null) + return; + postTraversal(root.left); + postTraversal(root.right); + System.out.print(root.data + " "); + } + + // Search function for binary tree + static boolean search(Node root, int value) { + if (root == null) + return false; + Queue store = new LinkedList<>(); + store.add(root); + while (!store.isEmpty()) { + Node temp = store.poll(); + if (temp.data == value) + return true; + if (temp.left != null) + store.add(temp.left); + if (temp.right != null) + store.add(temp.right); + } + return false; + } + + public static void main(String[] args) { + Node root = null; + // Insertion operation in binary tree + root = insert(root, 1); + root = insert(root, 2); + root = insert(root, 3); + root = insert(root, 4); + root = insert(root, 5); + + // Traversal + // Preorder traversal + System.out.print("Preorder Traversal: "); + preTraversal(root); + // Inorder traversal + System.out.print("\nInorder Traversal: "); + inTraversal(root); + // Postorder traversal + System.out.print("\nPost-order Traversal: "); + postTraversal(root); + + // Searching a node in the binary tree + if (search(root, 4)) + System.out.println("\nNode found in the binary tree"); + else + System.out.println("\nNode not found in the binary tree"); + } + } + + ``` + + + + ```javaScript showLineNumbers + class Node { + constructor(val) { + this.left = null; + this.data = val; + this.right = null; + } + } + + // Insert function for binary search + function insert(root, data) { + if (root === null) { + root = new Node(data); + return root; + } + // Using queue data structure to find the position to insert the node + let store = [root]; + while (store.length > 0) { + let temp = store.shift(); + // Check for left and right child + if (temp.left === null) { + temp.left = new Node(data); + break; + } else + store.push(temp.left); + if (temp.right === null) { + temp.right = new Node(data); + break; + } else + store.push(temp.right); + } + return root; + } + + // Now traversal methods of binary tree + // PRE-ORDER traversal + function preTraversal(root) { + if (root === null) + return; + process.stdout.write(root.data + " "); + preTraversal(root.left); + preTraversal(root.right); + } + + // IN-ORDER traversal + function inTraversal(root) { + if (root === null) + return; + inTraversal(root.left); + process.stdout.write(root.data + " "); + inTraversal(root.right); + } + + // POST-ORDER traversal + function postTraversal(root) { + if (root === null) + return; + postTraversal(root.left); + postTraversal(root.right); + process.stdout.write(root.data + " "); + } + + // Search function for binary tree + function search(root, value) { + if (root === null) + return false; + let store = [root]; + while (store.length > 0) { + let temp = store.shift(); + if (temp.data === value) + return true; + if (temp.left !== null) + store.push(temp.left); + if (temp.right !== null) + store.push(temp.right); + } + return false; + } + + // Main function + function main() { + let root = null; + // Insertion operation in binary tree + root = insert(root, 1); + root = insert(root, 2); + root = insert(root, 3); + root = insert(root, 4); + root = insert(root, 5); + + // Traversal + // Preorder traversal + process.stdout.write("Preorder Traversal: "); + preTraversal(root); + // Inorder traversal + process.stdout.write("\nInorder Traversal: "); + inTraversal(root); + // Postorder traversal + process.stdout.write("\nPost-order Traversal: "); + postTraversal(root); + + // Searching a node in the binary tree + if (search(root, 4)) + console.log("\nNode found in the binary tree"); + else + console.log("\nNode not found in the binary tree"); + } + + main(); + ``` + + + +Output:
+ +``` +Preorder Traversal: 1 2 4 5 3 +Inorder Traversal: 4 2 5 1 3 +Post-order Traversal: 4 5 2 3 1 +Node found in the binary tree +``` diff --git a/dsa/intermediate/graph.png b/dsa/intermediate/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..43d78b5555cc8e3e00b54ca279e16b95294e18e8 GIT binary patch literal 60250 zcmcG0^jQR)fw=TY%Pa32T~RD5RY_uqIxtH_Q12Tq5>QY7dfZYgyh zL4O`T6{3OuRQP)I|Kmq|URH@8yA&i)={{?aAnjQwXj=ItM%eP+DT#aKY|)KG4X|^?d7@0;~hyuE0cI9u4_@nPZ{}5DlmNo+8L_-#kZ8~d$J?AxVb5t&LK!x z<{oi#Xl|g)-_f$xEw5;PsM4{_pSUsbu_hnJ5R)z#Q|5{Bf53}|1bPVdf?(>_J=Q8r@yr*K| zx#_*~tHi9vW&5q$#+dI9Go|up zOXSeYb85TsV{d}VDsAxWO(ZybQu0)jp*pweABucOiw;W#3l#gTV@zvYvTQ^vUhsJB z?yll-aA^THWvUUZ29*xRmZ=PWGaWXnYxk#_Gu>zV2PWDR95)w+laC1M<-X7_G#glq zni&(~MUd}l7%tqbRHehf4~d8RS$f$wSn_qUp7s?OukuU8FuGYQb7WMQOT6-&AGDe! z6m8B;btFj(+H@rD-{0{sFC^p};%9pEPWYWaDi0TSJ+mO2>8K$4otEe8N}iJXB0Y7U zPP5-?$|#>2D;ncrQ3k8;|J)VIUwFPT)7R#+HuZhHy0!;fheeRF?&(q^`@&YMmPn38 z`#O;*_4td+?p5}L!o~?}^5`ELNm6|upRxQjy|1^NiBD6K$al|(pX2^PuE_2Dgh|NE zR=8p9mH$#RCHwBM-)cL%?acF>eba~M4)-qRKh&b`^<8YRxgH}>;=54O60j7?;YGoK zAZAil7Z28p0tdo{8>bo=@70VmHN7l2RsY?DuujCjy-G4gTx@bm3E0US_WBv&u{rE% zT4voI;z?Q(k$U3OgEhs>4VT@$#lX!Aq|lSh$+0(Ad&D!%vMFFhNpZ-iH~fq=_KA+JZo@B+ zu5=Y~zb$9s5Bj3b90yx1jgR%ZEhCYV2k^b;qZ|A-25cI6*yQ}aF3Ne#_P4j$374yh ze$!jYD7u<(ecHwBwkz}%JWY}NNaFAdbIBZa0bSspCc7;6EV}9`1 zuv40B1{}!JTK8F>*CF)syPag(^AcU=+8ZGVvgA%B=`QLG+q$vResMzI(A>&%*gdww zVL+tKN5qT@H#{hk;h#Cfkv5l)O^CX$ug@6FefwCP2Iqnl*dvX zDklV!Uvq0#s}Rdf_nVjqWYDmHj*hmGrV;_p7N&)rRs9~wUh2m zYX;8f>tn5T=#OyrLqQw;@sQbKiRSjtj}i0VA9HM|Dt5&y>W$Ud^;{sr!q4NK>gL7k zzCSt@Vn~7n(XfcT9|<5j(u<_{tz6BAveRpQG2FYE~Ql#giVH> z5d^t%K5bnyl2tyNt^#v>?RCoT`_229y=Mls3tD!#eh;zZdNsJx#-&8o@N}Vy+EZBB#FA^Yk^5UM@;h%c<1AU%NfCwguALlrt=Y7G6vEA!u;j_EimOo88(0*>nFMzUa1~D_ zM*Vs&-1z4v!Q3;6;~^CzmBka;LB5O<+gdqoo1utP5<3psobfNG50O%Ry2$C%k$9=U z-rIGNj+x$7K-2*S0` zNzxe=xsQIW^DJuE`Vl_jtTv3PxFv6)m#fu`RxDRlOW%1hY5yI!B|r_!*JqRZWpRNf zlojkBsm*hyd{hX6wE%;qgf*HhUf1=a{A7Adz}E-tPC$Ex88U#?ODvz?lkje}iw?7|kN z3CqgYTVO1jy;%+iPrdi%WRmB|a%qo!Va-RhEY}~GzbK?qCdKH?F6H(~v?iWFt9(iX zKGr>`r+6yCsc~S^!m4SGWu}1StE}(FT3w^>#@vw(Qsii0d52v?Pi@Y+u*LMBr_!}f zb2Q?x)XOC|O1JHm@sa5Y*U64s?fd@AADAm$CpDaGmqriv2_ycS=BNI?{Xo#H`Y+Ru zaXg{U=44mC(8^FHmXK^+C~Bo{14Wl zs`$yhU5^zCV9S_gVWm35s%;VeK*Fy3{Nk=b)-}eujY0d+GGomwoJkZsVe3HR z(CF^g(mQ&`xvwQC#1IbbOFy~r%24nc>kI$2DQ%7%9q4gmj0p1M-H#99^F5mK6~BJn zt%H(?QwSz)<~N>P#mjFVADQmS@l{>7JlKhCSb9s%?uGFuNS+Ye?CNKWuE)}do4L&w zLnV{;T1sUUFzUn_7O~fpDpQ7NoR=AX`K>9i$?1KOcE+RePcPTA3Qhj8{_@YQNcsJ0 z&wq4Zu(XP>%LjY|@G+pnKOlLuYaLPU7kRP#b zkGC>3caIix_}b}IZ4G@IYvwZ%XEQfold{f|TIVspvU7n@iMg)zi1XiC9b@Obh94c}p1J4Z=UjjqPyR+1H4JQ;ZdCbiU9g;mYK zo!4TR-cO?$-}|IIf4qM(cCIXWVFT;93%Ft0jS>mFZZe8)2x_&M)vqOYHkMmBhH|wt zc2!I7{TPA93YDHZqW1HMJHb5JUGIWkQ@@x(b!ElWjtb%L+T<>G+M|xJb2`hla)%Pc zzdydCecVb!|8|DR2tYMsoJob>y94;uN#DQL>YYX#1DN$Zc`79BUbt7=-lB@`!$$jg z%yE$;oOQP5Jv-U%8nfn-_jvLzWA=BqJ$`*UhPUX)nG)(o?Hw1tmShY&zoYe-#Z{TS zzM#Ilhjx6t9PvwNpL3V{vqBp;^NiV3obgB9&Ze~|NfTOQg`N7a`qUkFWd*O8{Bzk@ zC4$eczhI!IF3E(U@0*(CW80?jcrp83Z^^tbYSbm9w_yW4>=(m1nM}S_98ku6H^Enk zO>PW1$s2x5NLDSMl2v)iu>43Bvy#!`Y$dHi5Uow_T&F#%j^4jsh)(Iq}fu0v+t&cgz*eI#-M2Mt9a{Lq!qfy&TRSU4e&6 zg=RJN+hgYYz1*vAE4B&Zjw^E+CUK8L zuh}xlV4Ahnqy;b5Dq+vU`I^yrkmmIBScUm#fS$aTE; zog$lKg}G|929Dt1s|2(yiSn0?aDP}qoTLx$BDMy~5-k;menNow8 zms)>ek0-9mUpU=srr1uew?Ov4SAKpfd$~7HcYbekbaR%5*P!5^#lK~nx_R@beN+iz zX?SX7YB;nPqZ@5CvqBo3wL0@O+(%<7dhOFb9;%hjuS=a4P5Yjza&^>KQhJ&Mc`;mG zXy@M}6+2uWt(t+~2h4}k4t)E3fki`Yg*~C8snEH5{h8e3LZ=|x%biaiWOp0RmtE1T zJyG!HBogG6=B_?#>Y*F74RG+Q<^BqD$|#FYorh!HN-KXuony5VPk5pI+hJzXYNJby zhi&%QkB+asvwWA-HzRYpd`Ue{3SATN8brXE`CXjsK{@)aw0S^Nn*{*#R4p^op z&N~IpHg(XoIzML-{g~{(VVu&!Qk$0VLV!a}Xk1NN^jeBzQ+;;w7WAx}>S}uEPSRD7 zaQOPy!S~a2JBwK#)D$PzrhEL&TF070Wv6af-p(LjDQRIZ`~L2+uiZ22fV~NcrXxdI zvq#C30L9A7O!X65BSQ~gUjmvc^tk^z8&&N>-D0BywUn-|?jFS|R9-_Tb_TvYLEY?U z!)`t58^enMgh^K$=HVM0lFnl_MPy+V=)U7q>{2~|Mt4E-_4))pWs&69*7DB=C7ehS zz3kcx&jMQVsMU$~Rd35dN*y>gu8UVwXlW_QYj+Z%Fi>>>LmsO2n8z5J-G8{Z;Mqjo z@gNfWy8Myc<~LXNxhMS_tNoKO#PM z(b0LOkJX$0CduI5C++g<%F;}%ufm#G?nO1c{?m-QjDZq@UW#bqcpdOS3G@t?z5~wZ zXMcldEDFlX;AYc-f6)c3e!hXTIB_ce>^Iu*pzsfU7mmkIxMF0kN=jE_7@pSl^G?b5 zZ589`b$K6p4ke zW<<)B0_&o%X^)q1x+hN@z|TFF-%Z1Rp_ycgdp6~xI_g_J5lI&NH1)(0^$4FRcbdt! znIANLFRj(wg|;%HDqDVZ{##8C^s(=e-KmOX`MNpJ<>|S}Yg-F2+J_KMi$5h<$n4^E z>2g`C*?!!Jpdm?)kGL&;PGygB2wHJZ)J`DjK+}$+EPf95Nu}rF$k>hkp2iy$R~P$n z38UV6oq0Nm5+h#kRG*)=D{9)WtuiqDSO$-!KTnq%h2cwG-!q!KOrk0l5B+Y9HBVfmGL-s0JGecq~#vbmmCQQn`nO39XH>db-i+K@>})&4B=Mb(X{Bc zA^xcZ%yg`eOYI3lrj33zo0y|ka(!9*u#+oC8hlNg0`~kO2x)ZN(BCQ^a|C>Cx**0u z#cYnBs#PUOC|vw~jCk`)6XAKm#(PYPhYmIbG*69#6?dj9O?@B3>h?22Vh}LNVzAvn zsnwoewV*})SLSh6G0Y(w5I+1(2<44-Nz|137aRx6KU;SsPB&XyTeZA7{GV^Rb(iXR zywv9rV8i{@_wR5_C9=6u>Zph6k!CFT@U>`<<+-HJIm~28mkdhpd=bUpy>88j1kI%` z;8>-z`O^Qs^YM^P*>jO3lXqgr)n~V=#P)l#DqEc@KBzXQ_U|~0o!r^R2i^maRsqTu z{?+T(p=Aocj=7!vKI}2%xc|;lDd|MoP{P7K-&7xsa65OOpB6OF&$^nj7$HOuT@1e{@ImX&i5 zn*a9-$Dw|#UfylMVWj{@DQ$idP>rO&z*sK%VaNaZzU3PvIfa&PC=fL#AYGuZUCD^p zyL$Di#iI-s)8%Vq1!9Ib!tbxo^o5o|tLDJDnk<$t*zJWI#_#2!P`M|y4KA9`@={X`3=fZ9RyC>ba)RJHGT@$wgK#T5Gv7JVckOM zS(T@UY)FtW%RjgBpARx`nv$XjGXT*{K~yRbRZ;BMkDR!$CD7(o;mO;tmdtscX$!7V!9b2!@Nny97^jSvps;M2WW7ZMpJV3GxK7Gl>i%W})`47yNYl|vGS)P1yDxF6XCxPIt z4OlqUFF*3E2YpU&>DpYE1%3Ox50Ih)pjsY%`iA612=YSm&*kL0{~aUUH(RSr;I7r^ zT7Oz-8e|(gyJ;6PiFE&JPaw3$2-<@hSc(cDh4m|~{|Fk#i95#2u6#Pzm@>XITa>d# zfxLL(GTv$hVqz)Ob@aG80fc`(&~@vSxI;1YwV_&&?MQOs&yaRK2jwOxqyt!oY1O@? z2mtsPLgD=6?awdHD9zPOCa*qRw~;5Zu+4*}j00vr;-Kbxh8vU)*texp?lXsqK2o?3 z5VGn>r$8(Sl+R77{1Jz3&Tdw$x-$}Re%bopiElQH4 zJqLm2T7#y$xo&EIiT1&tYsfqx8G+t|cj@@&?{_FkY&wUf$z6D^dcytZDN*ZZi{A@C z7}?vMl&?|@rPwAE3VHGy7RpE{_yE-PSQ=|~jl-`gUJPeOI7jT{Z2<5$5cBW#g8V!Z zNlH$2XfcdVEt0(gblUCs!e!yXHt+R5L&~C3>vJBUAjN5AsM6Alqo)mk&8n-Ieg9fo zPnQDMWxUMlGZbTuT)YzgYQqJytjD6=ldXJI*@*+BFxi`Yfd#y{Yf%Qs;TGaM43TcnI;#dox&+I-^XJ!Y=a%7<>_LtmIBUOK& zdD@akn10OEPBXLgA;>coms}^d(la|M`R?X zSmSQQi8M=>#+D}R_{i<8={8;cR_ktGHxX~|=Wl(T<~FD!FOE!a-mo401v`A!mz!}a z&oz!?AB%L4~Wl*-SdRnCD_@ zCF9OxidE2SYHD>`oy2qaT?BnVX|^VQDS};guquV;&1`2{C`x|$AH8*4y%TA?kSyzH zK1fJAHH0F&b+fp3(|a`^2zRdr%96f69-=XJ+)kq(gci&JG^TpD3d16cMg=>~unP~|hm=tLAzKk#Ly}|fC?cXRcA-WwYtT1oc z;Z80detlsezYn{uK4$9F(ARjdx7ac#pgrbyDCrGXcOcs^i+*u7g;Hz4%z`b@wF02L z{SCgJi;rR%^>#!(=8V7-Nt7VdS;|>(N3|l(zxd->r-|Cm{2+~Q-oQ$2%yfP_8U2ed zA%9P}maJee?IoWqT%K8ZWj^+593GWYoIYV>o^0sPP^>%$m{b~A^E6P|F5Sim><8T7wv~TYw zcJD&%&-@ir@;5t!dI9e(PC%E_!js{=O(G{dl4d1t5^$!I(JHme*pj;@krkEpzU>eB zp7)9>l33eb55G4vc)vY9@E|2G8ybD(n*T(Z&|H4FOi9Ev?F-W;tcwW-~k+EVx?hQb0J@T{0 zPGh+wM(&@|LK6^kXJ!e69N82qEF;6Ly}m+0LmKq1PynFYgN+{ZCYIEof7150_jjf} zUp5(1lDJv%DCLstN2ec{2>LyfNU7czS|mCB9`11jpV|d(`4YTla`_;53Qd$pg`tf8 zr4yqyaE;u~q&RA?H%V7)uIp_EqR*l<{5M>+P<5>->&)4Fnsla&0-luiYkcSW-{vcM zI*4uR%3q6`*YhxJ&SC04&UMXeDeoM^O)}(Yn_fUZq6aQX%uGcpAD2FfT@t-MnVoEJ zgf%W0dqc-SSK@g^CI5Aki=hq^lXfICiRGKU0ozvB7y9@mso%>16bb3wHsBJ&7#+O(;X31#H4khjdACKMnQ#oL!gs5p4Imx2TtT@2j!YnsMZ zG+cdsp?M%Yw$AH*n|XEd{1xikZDy(;8N!$V^&I+er_;L;8ke^>PBp(AXn$EE)s?;* zSAX8j)=XL8s;0Uu#;hLKy_V#}_`Z~q0Xa%t$~P62S?TCVkUy}qOq8-xF)2R`*ZE|{ zgfrwvN&UtUPcBWwgRZv)3so~A`N+jyazpBhjX>T;k9D%zfw5P|^+#$wQz?_-o+MB@&-{3@Q& zl(jm=?tNa8)ZWlt#TyiwO-EuRGdcB%@_k%}>QBL`3WGXDKp-UMaxV!7c-;LFGW(uQ47y6i+g%o*8{AM17GGB=~c+0V4 zGrM`ZIRZ{2_4||gdnt^3dP|6&uM!DzI2I(U(!Gbw4vT>Y_UadI9PU6$f@PDC+pkEk zkiP;zSP5`;2<7^9U=iZ1+G4;^``bzNqT}GjQDUBK>N&ONYp=}2_@sQ+a&0sKcXKfY ztO1;ou5t`qs2QUE;W7(oI&pG55h;r`0kiOXjWoKvmOylB@=j|Fq&OAyGwb5vc z=8u&pMVv3aO`49%pl14--jRgUA7qU!(#aYVI64fa=J|)gkNm*I^{AeI1xFz7d zw+^4-qpeB7xxgD5mzX$5Vg)GMZ*dX~Z*Z&b^#js#k^;Z{LV}EUX#;VgZeyRgI26UJ zE5naXWk7;#Ps9&zZ%_B29|LaB*{~Znzu*aE7?v;Ua#aH?UM>9wyxkP+E7{q+?G!+q zYtM37PijA+Mm}Bfu$HoFA8U@`=lzV4Av!oyglYU)ZdJ;?lV2ct5NXo2uSuR-YpZqQ zEP3Y4tNaP2w7nE5TbVOc~$+|H+`9&;xX$r7x%<1#z2(b)Bk?60UVS`#JVn!afK1-+qBC$Q9 zDRx$8(yU8Pt27lk+H{uDtu=-_r92~?$$0OKQi!O+8X$?YVX2~({(!bDtn=aYywl&% zRSy$)_&UbY1-3T?wQL+9V18H=Ujo~ld8|3zx6uBXxh{XRF*Di>|vZC z9b4%alql)h%TZ=HqBa9)=)7+OL(dF=ZWlgNA?55@L8$}*z<8xC=WacNLe<{)jGp(QD1E%7kvco zH+l?1$AfTss7Oskxo?gxMvA5Qc5npSD*X9~A6grtdI6Bc&@rv^z)76aA(&dpMw2*p zrUp}H4l;wrW?>yns_^W|qtw;8t_*mn9kWHI%L~I$t?&MOY$Vq*3?7qSjUM7d`W`;{ zSe$$0Wk`2tBl=*`4Tl7MJw~gTGY2O0(0)~u@oJ50sOW!wxw_YnM@+0wBT@3Zxs&_L z(mO45!k>pL>|u%fJRk4WblwcZUEc#^p~1 zP!5~$e?+R$egMdRwq}`+uS&l&kH$7m#Hs*-Br#D@zlunZbhV4*Ni76i*(LW`leQ1x zIIU0$*dZb=dvfYarxnC~$D<8pf=>Q*Q^A?y$u-|gj9Nef->DVweA27bHFpvVPAnH-X50H+&gOg zzLQA-$jd*6fLlZ8gsm?Rf&SOEbLwsAk0-X>;80^YWlkLenCO{VDtWmk`OV4-Uo)-XAZKrQ1!I{@pLg8y$nP{I?54&vcLW0C{n}{Zr+I%`X zwEO-B=P|J?=#J&|ti<@%g8z##F?Ge%|B5rXEmz4+PD#L{%Ba!S28UF6Mp z_(ZC%!H7>jBP=ggZr=-Ti~Ud0Jp1jU3wWL9_H(JzKx^<3J%lyx&nfxrd1E*rE>&ju|_yf|mYtek(Wa+1z>bn*i zHZAI=vlIMAau(!;KrvN~WOoD^txQvH`~9h-&|rZ2j4sCMENGJ|%;h^D>}`CA6RrID zff@b0f1hvq2XHU^7bn32a0IKH-62`Zy|ty#b}@(b=roUZ`U4x)3b)Rn!$>0^lSq=w z-32q#ZyAsA3t!qQsqT{fDdWe~8Sc(#A+`QQ5Bkdzj)QlB)UAnp0};*`G#b1ZCl>y= z^b$dyM8lrh-ywLo42kCxKc0eh_WO5r%DeY9qx%+ys_^1YBMzv{z0A*7rmn7Darq$? zJgOVHA$T+#7febX5=jyCp5eM;&KLX6H`x8}^ad;O_E3+#igQjNOJY#QRWG+&l5;D!B+@?C4rN5!M044#Wn~*!JI-~UHD->6MpuKkduZv?x%eu^ zM3T3mH=xhml{yxVVvsn^`Ga0IfASQFYOEF5*seW|KcNo+iA{gLpmsP9OI^?&ZVUGC z<}cRwti%X8_9gr9Ns`@_{rBnQcYx=e61ZO@!O)$oX@1v^BKJA4fUSMa_5;0ay~m{5 zVw|KwUQFSNlhaWQ0MDjgYYOC<*Nq9hsQCBk$Y>!D$IuqemjyFk(75!yO)y42H^6^q z%`W92?}BpcBLg@Szu_W9(AKeVD5`$rjMu#<+3ZEUU0@HJ%uOFc%$TA(m;_CF`3wsk zP^1=2M!B;OG}qT8-vC$Owftk`fh{O&jR&g{5+lXXx4gYUhVYfSLxqGTx_}PX5kl@r zv^-!?{NK%TwAF49@=UqbHsy-!anB(Q$yL8K4ab1`*+R`l&2~ z#JuC*z(3l#!X$QvG|1?9n_`Yb!0!F)>O>avgN995`2IhQ7=or*<*34Tud3DS9*8{& z^t@ZW)r{oX@x;7^s(3OJ@F1^iXwU%~PB$%}OcH7GcFkW4w=|kgaH8u#Vk3VyVvX}s zzwtOpZiuG)Tm98E-5d>XXA_7T;)D2(>R&2sbtd67`JmKU6F6sN>bp7Ij~Tz#7AGI* z%v3G&r&N$0WC%=wCg=dCv60^G``d@?K}>)|u0`>DXTfVxn#~{Rt)`=L9Gv!-%=C&m z1r3wz^pf_wqX)oO+WznrZs%LA0gvDq{v#jQNEwe(`3WVdHM8d27!mib_PE#CbI4h4 zi;xb{$8-bV%2SHgNBjv-&F`zgg}D8DAs zUno?Q?O%3KYFU3MsgxKY;m~qj*tjfCG*t9W*113H@=0cXRR**UHc*7fIv}aClc>43 z1K9`=73J)|7N^-LVQ?h#>gzFwxmMlMObG^^Ji&8%&X@i$j}xDy(o%IuCcvk1 zguR%2->A|d4vimPixrw*l@|+9iEMp<-9C!kjrMADdnDjM=x81GuZnK?`FxDV`Tn0H zd+4oF#N&%(dXKL;D~(r4doHX6>19=-jBG*)y2plyS@Zgw39&y_BnoGHU` zb+%n_=)M14y8)&4N6?nQhw_`zCdso7#VQq&YLch%5pV#E7mtt!g)>GdP7aXO&As34 z@~|fINtZchB@I`}dXaZsFnmH4Q+Hdo%{;Ae+^MU@g;Dra{c+;I7gw4hHGFTRexNJ` z(E7Tp5nme=mCV>Nz@7aq#Zx6(X_p&4qXc+@zJyh#u5QiU@^JfVIT!vqubJij)6?7C z{VBonWu%T26gIa{{aIXvUwK5F(D4dNsApY#`q)JN27QWh;K3t|hP^>o6#0-u;rNh_ zcL&=MHj-R{t8y__0cvf!CCTG_<{$89b`sSG9CE5~<+}Vi2aAh^Dje5q*Xj3VV*UV= zBg!Kvg?n$%0(OA^eokqsRQbW``zI%oxAj)fkf%dAEl;1bBYhEUdqgVwyUfb|2|L4` zO9ImqqsIFNV1;lRB>p4)mab{@pW0u>FB1Yzt+HtTDbK-E84Fc|WY`i)zIT1(nYE*6 zn;_GR{thS}%{(ozXt$G)BLH)CeI+*!wpE4m)N98#4<-Kng$(Z*xR_P>xoL|td(%rK zlLiTLD}Su}Q_rpIYg1q#+M5eNmzAT|qkV)HHefku&XqV8Nms7*@{jjgu4b{hYd?WPHr2O4i*X&?N zIsm$>Y+?8P!tS@E2<~hG6>qmy2)hUId1vwC+6;b`W7K|&fhN+n+}Nb^fxShrnwS8 zgqGkU4RWS#|DJi>(eLn{?8hBHeKd?O^zvhF6p!}XQ&f3}svsTA{$OLer)Bd2rg0Lg zzQeCiFE_rq;=L){;BqQ&y`xBBra~0XLd8coscjEzYFx$(Krm(Z+MiOBFGXPyRBAia z{(K&TW|{qWms{8$JU=DTL8c>ip_{!EFMlAj1rH%i7=08Ef<;mRC~bUHY9bCV&OPBy zUJ|Nq4M5G8eF!ZNjqYzqI4Q3|3T@jfrYA?!cj+qGSx%4T1LiF$^y=TGb}v{F--ZsGQ->BC5VjHp=_U zvRpcl4X<@uo|LxmI^#uo865=)yG^B_A7G01au0NywK+#0=?mzDdW8;U$c~*Bxf|B7 z)_q;vXU*2M-m3&yO!$f^!Yt^ty<(6a7#J9Ed(~R{qB~Yz(`m8zR(IohBl$j7i>{KR233XG=gK>I};NNe)Ky}2(LuTd*pA9Z_u z;4_?$Slac=?GUoexhv7UuB! zRCUXSO)JOyvnsSdgXXmimsW2B@5ThU|pM9 zp56YiyLrWuqHd#+*wK)@@0WYXfa3(;@bGFg<$ms>lCg#MgbvFMZ3UlzxW(@*q9Hbx zv|86Q{mox#r^bK!y}Tzrgfmw`-zLJ-OMwksZ0_1FHj;Sdry&~nf)gHKgJ$W~)$77^ zU{4h=3dePK5&~9F z9qfr*U)1NsDi|57kU!lqaSPBMT^F3T}iBYf`kUsLggQ2 z3YVx`Y7`(B8Nz1qS4c2dmMt1~wTo;B0lh{bwjc_LogeN2O2*j^J~RTrA&Y>JP-G6J zJ|OpuHpH$XZ+Rc=ZO(5`rc?zU5J$xY=R;sHNZqZOyi`F(|5y~&2G6w}mu|8B6oQcg^>2by<9ZZj|53((b#O4Qx`#5 z`Wi$+=Fpj{=mEB~X?Qtx-R%!g2Oz=W2pRUqOR$!PnH+GDFN;|K=K?ak(kwK_lVC+Q5jGxL$W)(RAAj zF8}`3r7v;Kq96<+FF0GHcz^yhxYw|5Al$$v<5lbqG*UP!dLBYX67xWjmiAIo{5Rsz z&=@pbYw$Nqe|Hyi#O#Vp#}tj#Nu}|0s+r4K71M2+_|tN`<97z_spyo{a^K}A(vG|y z*$y6&IO1>7wV1HK`oQA)0ejxwN?UW8Fz*|6j+4pXYQ?-ZtSHv}(r#o2jB2qs?{p73 zQAaIvq1ECzI2jN}ogvC|c>g-)3wHe+#5AfPagiWqAA>seK;y>CsVmVzq<%MMYvj0^ zZDe|Gfm>j0_u$%i&Kat2dUOe0Y5q~hTzVb}T`xz1%Tp|;*{;QwM86)YB*%-y$i2=h z{jo;W?1|<0nShq>7eP@kKLZ*8)vaYS2t#2DF`YT-(e3A+ZyUyAO#LXP06@;kA8bd; z?o4HjkQ-)IgJxvCOZ9@YQRlX_YxaDTLX5Dd&MWzBA&a@lGlQZme4!2B{ysZhmY&xZ zONnpHEUZbxpGf~QSDPBFy`xb+P1fSa$WMV6@d$Y0Xe*!J$h0@W>5889Aj%XNm|IdP zGq3X)SvOdfhdBQT8R)ox=a}o0jemFjYvnf?nVo0uSQ&t-56W zYTegbkh}J#5Bvy`obkz0dgxi2S{LOGt+2a?^=t`j$w>X0zXwBti-L@v0* zjD}ZfvM*cDKeE1ywa4*{wb|nDs-i-?j3`G{`Y1QUTpvw5GHtJIpj*^#-~HPc?y(2Rd-E{ zA7K8L4E1dmY97pWvoe&2!7e^)~W1?}~rYICQBotZJk~fu`$g2n+`dH0`e! zjnN>=O=ULton#I27)Uv-A2%hBXRSzA@>Kx>Y7Jng9L57oA!J_w1P1lYXR~50RxVYy zCrDHciQ1OFX447if6HG2>K9uAg%4hx++G-5XOBdxkQbtGR?(UOs-b1Zp5#LL*KwR zO;za$N)(X0EFdcsdxKK#vzi9kVgfoE;IpBdRfUnu{4xpojPdp`Sl_9x3=eP&>9q#d zLycORzJJZ6P^Mziv`CH9vOaCv_$@H<8ok`fM8(6t;Go^s~fh~x`o=d%^=7#kHSdf6iX*}ve#QQaROy6-f^fhqTtwVx&!Or-(V9N z$iCSe!tTeHF;L}XiH@@PGueWdRshPP1*Q&iHmAfeQ4QeAT093M2E4Tj0Iifw)JKyJ zO9nqfi&s#X*1Kp_LL_d?&rc*cRi+&5PRbqVj#u)1PJ)`b2c~5Oz1-HD&`!X*gWxdF zgF?t2gmq&MyU^9C%ma*i-%EVFd-K9sp9lNwN`Xbc2^ykIK0od-REb-B=nFBYd5Na& z2$TfLrCYsyaAf0PfApXX^29mOAuurTG~`S2HT?anEj>d9JLhhjPA&euw#k~0 zRt<$-t?Vm`)-TVh6o6{qc;E_=u4M8Cppx~6JVEW=zz6R4um|qmClW^w7R;Ud{t5fS z{eme`FLyRF$Kb}M+WSgf{-#}Dn!SdPd}yOM8r>U|YulC1Zd-Y8crby^+<(2VA5xk? z{F4}kExv8~z+ms7h4(n4FKlK9n1~r+GxSvoR*q^?;b?o=^diaVuR)D3Y{wE+1iD8@ zpKNFBE$YIp3;Y{C5H&xam-Z35dWa|z^o)nh1a+CrYs>MwXiyE+NvW8H=18(bG}}pr zOYS^&94P$&WVk-B4cv;opR2ze@{z!3Q3sp!O;*?87)WD*Aq%qlhrZ-atxePU zZM}~$x|M{E&a^?}vQby!sy>u@__6I_DK5&-#opB$E8(cwR(X03SZ6A^^U23S+cu zv7s-^c(;GsGVum&2dBZWPllhU=y&57ZAJf*JTdgITobe;3HsaoXwxViyNoTGLWYXw z%cN(lNuC3l{N=e^c2ICnm--z8U!-gN)Awn>PwCec90WupYW5UFYPxM3o-# zF+KM>E}nw-U0lA`z*zLxKZYSU@?aDlBTt#kR!^vJn}=gE2hzmI8ACPHCxc1Yk>V@O zIdsuKNtv$?Su?m{93x{uErscX-w$75LwBhL2DRzs^r`avQ5(8^rZ1nUouk2)Z&Z>_ znMozrr^5V+#!71432N0A>`c`ECE+AacdI?#2*w^VjN>Jzl45uPEWd{g55heVAS=b! zXaIsjNPxA?{(p=~@YF0I?T1dJZ_E!(`pToZssT+lzV<#_Ch`<2<-VXR;e=z6=*Gjl9d{$O{E!TVA?SK4OEO;;4o;~% z?i{>5+08g>s1v#RZ2_jOy3Q%M*sHp@Z3u;Tx!TmNbhIn1RB=+L(KlznIL0g$Z zDA3y|h>fSuJ5eZ-3Y)S7HUQd+Wynmhdc18Z@=cV*gB(x4s(K5)`1^mBKOjlgx1WR2 zVFBjAP93$Q&kZ>q{R_VL8|y{eu{a$zkiFK&PLza0fauQuY_;3qg}`yX4%QIxq#>x& z4cjj^g1`^i2!u>~&t}j}3Hok;;+xH58OQjiEPe|f;IL~TS8l-FtjyW)kO4$ASbUm) zd?@jft53f!i7h&J0Ct!1(#tSw_@*C_F)D?Cf9^3ys2Ba~fb`(2= zW2LiOgdNSdBy<1A0~@J6a>HRKRE_7V=4J4P9&)`K@DJ+7_zs&x zB%D$n0${I9tyBQ?Oj=dLz6DptIO4z787Y0$YDdo@H`f9yyw@q9MV<)=e>q6Bch3M7 z$yEB!^c+E@tlulEP|ZV(d-duEn^Rv9G&_|_NIVD^_0?;#wfgaG2|#{=1Dza{V~q{D z0V~CN1YQgB{)~IEKDX)c7(`uD_kKZ=QF@{J-C()ho$b}hD){T@*`9w#FTZv{`2@E{ zIRry|4K6|?q0Qs|{ZHcv%egl1jfb(IP;8t z42`tlm;Gn$&W=NVy^(SarnnkMb%&i8y=Jrw%|LRt>xQ%n-^sqyT2@!?-}>)OqD(!% z3Ar`dRFpm_4LiAm_6fU77R`fjp+Oml4G3&qc~B4PRkGNHsY8u0Qw>XA42)1XZywa$ zVV_wX469Tb#|oMI{b~hUzu{OH0FxP_g8cTc6A3ULA8Fggt`$A|_Mc!XGvtrKM~b8; zwK`Y9YV#WuEOl!~e`lBR>O^Pkv#LO(*Io(0WEG*wpQDP z!HPDhqc$jXyobKzq5|dze3k~_2+=F+KY|=!7x3->6zikmP!w;Y2h~3njo^dh@3nd+ zNgAfYC{wBA&=3NYg$js0QF5@1!Z}6J9fY)wAYtw^L3I!lS@fy9|5J68$O5>R#ufyW zB6s+ce+K%3m3r@03Jx~Q|MP1SGXeSCrdA5S9kPEmd@&O_&!Nz79gac0XUL&iurB?d zD|EUX8$)$oAA_c2=oR`NT=7-xJ5mLPY2%`<8XT@4*}Ddc+^$l;vFq7fKmaK4^@W(w z?+I7t=uviPUz=##Gk5k}_%_XUA0`6*M{GdVk=^P|6ZvM;?$-#TC8!H(Ia<`PF$lx+ zaQdH>=ctH&>7CXLpM{gVOScH|mpymdmq64CP$77P@h@~ZI`hi0rl0vLhDCWKWDqo0 zu>U~#BGat*yu7@Pl^pT`->mV; zj_83~H;ul*%8}84g9EYAP{1eJZ_g+CoZydBP=$vmka?hCa-#yt%Sd6;BTq01TC;B# z>v_vi8+vMIF?RoXA*+z>MqIog*c2bZcAg{2WrBCETr>XsiYwF;^xz>kQSpl&DlC`D zU8s7?_opceLNv*3O^6KD(_x3)C;ChZiwuLaYu7Oigu#HZHzfEU81(~q2h84{38ANG zeW#XD%ifV-!an#DYdK5o-8_{)V9qIuURY|4mC5-E+W?S}(Vz+HKu|_P!>EGZkYp<9 zPA~|6#>(?xsws_0KoB#7%xIlJnBrE+*BDJ~69W&MLrLy$^#;GDheLEt-e8#Omy!y^)=fATLn* z&9cFA7(!=eP)$WR2J^f#O^MR-MY$GM;0o786J<9Zt@_ThdE^?8LyXwKzp^+fW`Vxv zLRg1N6_|!i)v!kba992v;&YPNwQbS4AM+;erE;K z*o|tsvqf^T_s-hy_0j0y=J^uTn<_1*REtSJui4jCj!Y4CxuWg~;K3h>5itHS+J>td z!AN{_4*e6v;*^7P5_^S9ycILkc{zi|8YbNQ{?<{| z>~+H#7KBPc>YcG0afzMSkr*~Ag$&JXiB@TxuraM zIEJ0m#&J*d@(M%jhs`WNqz_ElX^h(LO~Z*P$bc^-^r|$H)lb%Y$a&PUU-aCjb9pTl@_OjL;GKXBYeR%B`o0dT=zNo_7s=m9_>N@&@ zmin@yQmldipiiNY4Xa$yVg91}A8{Ijs_0u?9ts^VpW6S)aZn6hhA0<{DlKik=lX0x z(wa-<)Fz&*po8W?NB*?c2Mu*_=zC{c`|;`1I=X%iW8KZGUk96LRlz{Ce6em(PWb;( zcHV(h_y6BNl!g(NaZyH_qbMUID?4SMLkN}ZRoPpVrZkM~J&t3PnVp8pI>te^5;6`7 z$L4;$b$x&1zW=)ax&FFx&iQ=a<29bo$BPiU9n>jqA=EHzJ7Mw({4!5IrjIDTen}o0 zLw%gjya9bXh5u(wg<$s0lgfMfxjAadlGB zec2#fGu6ctCbyDh?vr(GFUw=th?jJvD5&%h>I+xJPal4_o#MtCM#Vc-9#i18BPx*G zGvm+@*ZUl>7BU+%r9WZqIk`SSQAeRzTaVnQJyL31gJ(-K+dWgWS-q8{BfgM$*Og(s zQfu3h^Mfy`-gaT*@EnIjpKSTK%TBS_!zVM|ofdgS)rMxs0e_BSYf^$c*i2XW!)?<1 zgeHnIwLGz(%9clCt3JtqGD#Wa9-5XiY;OsB6S=k#ekY0~VNLqM3_G(IU%G5ltxIgh zf)D);=w_Nl;}LIYW-)voxG-Yynyc>^7s;cNYmMSDBG&OCUBKEfudE=kASH2QK63yE zuU0wj52S|?%VeGw5Zy1kvqtm`+-^8UC7Q2eJ*{2!qjNRxbg2CRV`2$B`JMTgR^h)1 zc3SGE3!2_I!ZGef)1d?N6$$2SbTk}V>n&O9a zq+VOy&n`w!L|wu{JYa62%e)i}_$|b!>yE4sNAG5f&M*j94p|l(_lk4vc;F7Q4li6t zYRR}#2;-X>sOy})IrQ#T@ijXGp>eztDg zhx^Q>&=cJ8zwC{=cT95H+#cp>|7*L%APb`U7z9|<{DAd_2K;pOsuOtf0Hk9&QI{!8 z=;glUR3RSh^6Uq!-9N`2ghk zm!?yv7(>dPCLCsp_CD!Xk776Tz57`$5tJR2XnsP7g)Q zwgt^k5c7?pXqpQl9rfdW?QhUX2{QbkRCo@~Z3`sD2HnT~^*I_0%kIBimMu`v6*8L# zCBJ;pr9xlFIzxb7emoH!DLJ@k) zMO(F8}4=Q(hSA)I4`B$n_8T|&Nu?{GUS5*a%B$FI= zQec)m&;f-T)JjL1g<5bZ^R+*`E8#pK1D?oN)&~oNMdEr~;Jk8P;?~i%y#!4`Sw2Py zzXb3Md%AnTO?RQ}NIAlSFp@ehPRilh>i3Sc2T`d$^@p zD`Whis9|x+xM+6B1GFLk_vg}uBR4rZ$$T3jitN?)|Fb`Fw=}3*e840tyM%j3tcpxk z4K0B8de1E^Gta_xze$&Pc{NSSZlELd3Ll;?3oU4< z);%AJ_|me$Z0T9N3-*cdzZe1`dg%x}PKQ{{*prZ|>Q|n@645^4Ya=`kg$bECuIV~O zAnjeBua)a5mI<2!T3f82RQ-QxKeaW=5BKq4 zLK=`viSX`3qVJFH=CrhU1~4O% z4fdVp;2{qvP7jox@7B@Xp~tk%<>#00HG4Sxcuc$gi$R0(zjbDmFau1Xyx#VZ&dWPU z_R^bW|I7uv0YM%&YLII=B}X1&|Nj7d3SNptPw){{<-njBux?dIs~a(t{WYwv^zOM| zWVd^H_LqD2ZgGpqHc9Hw4`1WfPf<~S+>D5Jh&8wl__$(7`B#?Jo#qXfL)qos2Dkk; z5#t;;l#8Iwy&B-&@7C4r44rZadt<|dmOlymUjt%Gg`xC4_#l2U)2R=lNol@??n1j4n*Zp!MFZ;v?Qssm>Iv zNR#Mva#C8!Aujr%0SJjN>eBT?NONg+UCj~{`A0` zzgm(}(|V_M!F_gRx5x@mw>!WFH5>4OcJS(9JQ(ALOusLpLkz_trfv(Vd|W}-K;d++ z(-psuP+$XXZz?E?&Uzm6vEgRIix5l@P4B1d!SHeNMjN<)NS`wZYvOTYC+1`9^RE5N zplSax3mv&t|AxnGD`74I_X=8BU9+2f+y|M!)O@9=PLBG`qMOGxK^S~A{vZ$N1&rg& zv6_i1`LUH;_WQVU_w6~N`UIT{H!d2meL0CxKFhN~r!SC->Ms0YBf z*ljhtntnonwbJwxzMGimF%eY64A_`Uq`*V_vllyYeG{4|#*i=il5F4dw|ha?pdjN& zHo{D?@$0=q8k4mA+N{!Qvq!ZB^c$I*G0)YG96BmSAxc6-uQRbUc4np2V$RulH(WOEtF=u?VUaOj87O=T7bm>RS ztV4h9DZqW)+yOeSOkgA-tV>I^E?o&?RDg8r8=T1w(|u)Tom?w%uz}{LmwMi(XqEJk zx*_co1chb|j}U!`o9WAV6Su%dzQ3p|$9e6Khw96>5rJ)D0T4pqS+UoPg*>h|bOyvH zYATY(aI?$M-ReI_&eql0+*qd|1jC;m5U%wCM9&s#$9sHAJ>42R+(Q3@bV3DA;hI*{ z`l$>$-N(c2PtSY%gMO0>zMVDdFglfY zTOwz|(rwTNvuOYO%AF>ZeFps&y@tF5BdHJg2;y#ww+*i@oBPR-Q+b z0;1`CW>Bijfr~}%n^9rzk9aP|tUh(k9b6Jl2jd``rV<`cfr#1n#={^jJoT=NnRQVM zVuZNLrvB&SZFO7#f#3iLffAe6!@`;m4UNMQKX#QmQwmN1Pf_3sUys(f$aWQ$T{{9G z43e^zdr{fFi>!M#!5KSQZV4>kEi~bO5n*`S>~c~?;ykO5lta&FaPW3}s06a51tBJk zP$>5*R5Yd_OD%*3tGt;p(JR_6+XW8EUg$hKg6OZdVmK_%#C1Jo@*h(Yru6}$%!ueS zd2WEGbn=doOdDeh9Rs_kEjn@RkU$+_0?z{Ww=IN`^E%R~hKI9G_E$i4qt~&s+Rumg zK+3IS;OmOec5i;)tX1x`3>oUWbcmzq7QZD1-kUK}hXXN#3QV%QZb`0bmw>U0kcF^p z=XNM^IWS=qa&%|kf;q^%YXFQB!lydipMzj?`5&>|5j&QwV$;9yOYeZnEr80r?4&gG z=z;w5motNv=-?Ye#1Dsj&)XAZfdg{BZ&8zK2Z#U|&cNxX%Ka^(TfgIJy;WD9sXaV~ zLU79ZT*#%~%J>_H%Om#a@WX$xm?ceoF%ZRr--RA&rgA_hH9+Ik`07lpV5?fYvgkS8 zc_<=NYj^T~1D$N8Meg+W6Yp*Qfw*2riBG&STGpo|>IK+W21FBjg#N&-KlraOmVRJe z{y(UjtOcFP>oP5WA*Ct*vN!?5N&-xxKJtN~a12Qjha6mWzr2cmt;&P9)j73D60aGvzhPjOy(v-=SpB01ac@kPFIqXRG_9f6i zP;gepf9)-4t*u|Dsk;0dosizV8v=Gv&;I#~c7>jV8Ej>5+v%TBVUigluW7oabVxo! zrW|Pf2$d-jQha!jDX(t-cBUQm*|AzgmwRrzLH{fe+d85~;W9?7U9z(|;;V z-oyBg4yoX_)Egp}2&vu9xxx%67skU&FTJxq-{sVt>np7`NG>^CYf`jN71=rWn?&M1XgN z-&6cgo4L6Ics#Z>!wtM_WE+n&PE5aH7mL^{TDTv>B9Pq-EcJV&ev})L z+R5(hkZT+#)T@E7f8`njwi{2#?NnHhg9|)&+_-naI89)P%=FW?J!82i&npcoxrGOu z-qx0GV%|Ww`(-=uArEJL8i(S`LdDYw8Ywa6Nw~)A-ZmWY=ebXPrLt3;TU(F$IrH{A@IhUthfwRfe4<8xx=Y zhAX@TS{8TROzHbQ@yGG@Wlnt)_N`;MBx13worULMpHO=9C)Jxh=*hX?^NA=G z9HhzA=+v5WuNWjH+wfHQPVWVZBJJd%*qK}2W;d8o{z>inrD*J(q6BP$$dz!pn)FPM*YVRe7Sn6v8eeywlNBk@fs`VPgQ2vqARuK<#6~ zTn60JIb$GCs7y^X&LB>ydfbI{+uQj`l3tJV>RSEN?6?b{O*rMmRg}A)up(RZC4`!@ zg&wNaKP?VX#Fr9Th9Gi&NdhMr|N}`UdB`?0#e*V@`0(G!$+80?$h*idI_u zeXDos!X=uF&WpL`#?C30IZ;9Ketz^%@PCMIdLt$El32;ku2{T}oEuGEY|Y$gb1~e8 zy#Q}pcOevAE>w5he>p(wZ_)eCMsFH(ovWdqhf1+$*1fWzVkjf7a$i|DzF+XnSjM$< zUeR<3XOMa_jn45Q`4-gjQ5uoQ67d4Cjr^)kp8dI&KYraN*`(Mm!dk0%Q2%iP zHIzRI1oAB#z_SyogXH!UWEr9l>^^4JbI~~(nt7$~yjkALd8*l5t(Z+kc0VgWvC*K{ zu&8=cCviK4u7kgzrN=+n@$8D|u3QRzwcAU>`<=b0^{|p>K512)9fgx+yDepZ4&`sq zOv2n+n*DCJAq_6!8jI|l%;_I?iI1e41zzd1WYb+@VwgAAIhJqyr07?cV3OBn7Ec6ChzGS{f#@G0A#yyXx*djaH`Vd+ijV-NKTUE!>W#Js#K8PByz}d5JA4WYkQj${T zMPPnVo8jdix&-XGwgGm!B;zdCF|mEDHrer2K~@neXe#K#8uJ@z9lQDtwMRm3T zKOp2>vm(}OvE2};Ap9YFc4sF~S=u;uc@yMz0}g-gtgDjI`7|f2;4JPY;iL^b#UV`> zzN5gb!VIc=xZ(Gtoh!$3cK*mtdW+1WH`P5H-F8NO+K<^6MVki^lV@QCr>NDEriLZ8 zNL-2S90~vjcJu9pVCajO8xJ7k%YRLjO`F}<2weCFyPpOB-Q>t(Fl)*?T)ZrF#GO0e`>^j}h^K~00B}(W}@jd0$vmIB} zx;5#dxusoac`y?_doW~$s6lPW7jT8>BkKb4m{{n-aZR;BbvLRV3s`# zgau-0tKo94f9};n|MeBnYtCJ`uY`FZS8p>>_Z_;V6o_FAs=VE5Ze_)W^bir8Whfpq z3)Oa-8w^d3FmWQ(T6Vz`;%B5GG_TB>GEn*`?tSmvD2B!8J~J=1EVieDfMqkq+L4gp zzS;3P2zAf5?B+8;HK@Xb9*#6s)(PLNGADWv-QbApDE3D|8*p@P?CfXkgM#_Y=dP(H zkeM!%EZs8j7aZYfLo@o_CwO-(d+Fuy<>_^-(qu{rgxvnOQVUEh<;L&s!gMRqWJ-sj z&gbIIiP1q+c1E*LAb_2n`{$h{`p0KrtO@lhBER`RPraQ7-X^1m`;N)XlH=XPvy;LZ zFz=P3?r;UCl*IxZgqm22P3|BKLelSTZA^8deR~BQX@|8e4BTf1D5(ZyZe0$AiC0;& zi9Kp$$i|5{!V8ZYI?N3wO0i+Egg8SRX%Li1UWUl+wd62@?8GzMx6H$Q+5Ai71nqt| z!!8pFh5RW@D2VK;ZfUkX5p#1Kr%?g3R)o_#2D~Z5C!wf7>c_c@Lf_x>1pIASgSr4y#iJLdgE*awZ0E~8I&#wE)pmOs*ouxg5@;&ucmWD?L4K#( zHYaEk0jE)ZQOrYM;yaG%g?xa2z+gFy-;k5{YO||ZO4;PXyax}WLZ6PcN&k0din-qD zY!Ok)0$C+0h6yyghdd=PAMbjo&%Ebi7^|{2{PeF80SlWdgakm^HXE$>{2Vmnw&CKIU@I&dMMKI-j z7G(Os%SDzA?6GGoLT0SxAy1v@p6V$kZax7hl;Lb1gNfH%lfi3$KjNQXsp!u!qd%vq zDGuwF(v7jCEgI7wv4)x*$KYId+J*gfIhY5WJr!l1zpp#9rk%8g%&YQNOpsr5n}XAZhU zT3d%-Q87%eNd!<`A8DIHn!q=ln$vn?3`}lNoV}%kPP<(@* z`==}xmOJT%(Z~DXHcVe%S)OXH1cj9~4c{b4I-pSMO0{2K>2Wjpgi@r)72)+EKGyH`J=Nv)9UQonk@d2^eWPNhBSZtWBKc~PIkx!6P z1EuQDM7!oU9y4al>d*lL4*--hye}NU+hmRH?{{XncACWbVK8E~Unk`E1(KE>w42VImdfU!lpYUn`s(Ys@}3{TeJw#>FQR z8Jhtp1M+}C=VUzz${Zu8(T{||2oHqYkXcP)P{O>$tuD?iD!9NgdlvjZ_TUYbV4%kv z+{k=sD?cb!QTTP~x4}`0^+C)HI#_aFwp$(oaoi8nqinu*1_@UF?1BbUeF-E8^Ul|mr6!>hen%j$9Q-u1n5NuY=mF?mO^>+7x zywZ=9N%aSyser)O!i4gxIXJ>Tru&#H&xERqJoMREQ`N$#dd8Mw`18rPG*>wH*H8Yz8xhc*F^Oui>&PLs#A#!GtM%u>EURf33A}qEP>M-**?*Fu zqIqT^AYhB~c1j`d_f#RAC~qa<3$m!L>?Ja2iywe36$#snHRW9)9OY*IL_bp`-1SSu zT#uzXWu&DoF`clKSO_qecm=z8WVI5%z+$g8(>qpp?tt(7b2iGiGawg;2BQF`TS4AV z+)l+vJEF(-xH&Yx{61^GpX%@a7GD<1;!=6G#pkPc;;mc<13={4-YSb(_>UTy0eXkj|$_WJ4l z>5hgSjIUGT&zYp}`stB_s_)(2PR55pb4>P%{^o_3Mu$o39qrdzrxJ3mT?o^QK+ltMCiN6;#U+hkss z-);{(#X?7@E2t>(0$aeJ{epgzx$sh#K$ebSIR-4D$=We=%GP8SBzj-c(xR?kt55p% z{EVQ&&na+-pz#GwLAc}QpuT{e7|**>6TM3!WRKRXtHkP6Q{loUHnoutnD_U=GM4g$ zmIQJdpRxq$t4@#>xPugx={|Y4ep86pn7-v(Ou_vPZM)54kyr-yle2$}*3EI^L8H#u z`wl(Nso3-n$XV`l+1P~{gzN*8f*kZ!QV*%2gz;zoH#ndbIOaQXy%Z$01_d|1!rCZ^ zaiS%RM_D=9Q8Sz{0`G8Axj|Y@Lzk4T0nySO?`9Uz|Hxy8Cyp)Otft%D5E$V>K6SK8{RWVy{ujoBOkohE|zPC8Q1!|H5 z&kbrbg0v`wbx~VHIj7FXzeG9A7W3i3nV4-^-GQh-_fFqO4i)nOklzU%I_I-#Mv1QF zbV3Om0RluR;Jx(%9~|JBU$!;DS~7tyR+XqD9N z{lPVe!g+k{PDAlF&bS-+^4l=YXbIm^hWyiWqQy+Ci4{gyIE0S+ z!lBi?cyFICt@%a(8cX2^1NsvBQD%jjVT(?7VMQAD&!zqwGZ#edoARQ&$%B5QD0aUL zT&g72IGBtn!PDj<&Pfj!BXx)R4FZ86N2@|J29-A7`3n{9l(o?(R3|V9%6py=vHuXv z+!Oubel8XD?=V9b(RRpW^_=c5{JiKp@!oi~!!Z`|%{P>q*aBBvI}fZFA7d+^(oyyo)X`<xwMf`Apr)#r@yPh#(rN59 znQOpDA(c)HLo*O_6ahxmPunG=++x9=BFAY{?DaYGs09MUA3S$`+)ugHS>x8!PnHaa zICiyW0WLFRC_&ofugFN?HMzS~*)ajJQY)j=?S%ESBXTiRx5 z@fd?pVyQGvlO1>y>3KB+^@A?jH+LwcK$e4v1DlZ*vy7X~U@Wb+_~ll*it>H{XWiA^ z_rQ2UnW%S*(og;;92`o^HG?fV#uOt}s+0%}SeVXIJtsaDi96gz6p zWa#=GNwP?+KoSPUlFS@{z>MX-G2FLFzWp1zb)N3}VdyqgJrC0G#TU2M52#XmmnO}7 zzdH8jOdoKDm3H(nJUuXT&&qiHN!yvoRa^kK63I84)sR!$@+nXjkF!1yv-~Cg*d2HQ za#ZDR&HkghYF3t`-4&chb8sSM2P_3gRF1{~t4bN+Tb5K2fge6^H9^~Lvk#b9)}dHj z){vpT;U9J+;1M(L39sWM&mh4L%IN^*P*q z7!j3dZOe1TgD$8wUz->g=Kx*x`Ke6lpotW7%TNW$@xc@>GeWpQ^b*3>cAAb9(M!U^ z;Huo;dVL|@!x#|DxnS|8gWrm(bnjH4X#FHg)Q&U;12|B@7aC9_p~kK_5XXVE=;yJ} z8}iR1aMaw!RZuj+Nn|^4T78om-jDn00TUR4JP!B7X{|~ncgKeUi4f=z49&Fatgv4L zA7`Ww!=$PNM`J*tkQB+6J^~?b^%WZ(O^;#b(Ecyj`XW+{c*ACuK>Gl2_>p!SwsHeK z`^hhwPx(vdA`DNCz=VshKfl6__%H~rots}3qcb7V>4va(y~Tx+uHOR54z@}Yw4QRb zZ#|KZq+t5@@Ml2OuI9Low;|@PJ#y=wXa;@wtd?>`y5FktZBl~4_Y?B4d)2q2FM2Zh z&KlGgre$j)Yt$IxB*fYS-guoOXFN95#@M>*Trb}(q{CF=8Y;fDO z)>n5&I8FAU$`a~IHy1rHjRoBh^Gl%Z!8=sFdvo}A$aP<9PZ9r^donji%s3l?&YJ{eEqDvuw+nLo< zu*D#A5bQil58xbU?uCwy3^7ywfSYN@1I{K%{Ql!j(YV4mc#%G~1y)HD3!drwrl7{( z11qMAGr~!ce+WvR{oz-qt$dArNU}UPJC|xU8JaN<4ACodNY~{+GE>xXLE`n6wwzCp z+xW~9t_pSrKY{(`^Y9n+RUIH=-5OF+-f<7l6j@~cTk(8akWOff?q_puyU0|(*Yxk_ z$I|$UK)q61VG&!-3)B`P%}~YGR417tNXgY^Y(@nwbbfS27i}`Tbl6Pwd*ps&GlU^B zACI8tsm#BmSC%W1*i(}^6)F7^GSY%xn8Uc5K)SqJIy|@iMYdlKN~vaSAx_@#%TmUj zFRreE`haIk)>S>Drg_#USboEI*?GD2^-&PK85wN;0I1= zkres;-1Xp8+non3q(Z38%e)a=w+}~(!H_NS_!7RV0@G|DE9>pbOW0Y&vVXB+V>4#_Sd__S> z3ixCEt7hty zW%7V(lQqy~BX`~g{R!g$H)p*JI))pp(M~r{r9BZ5f_+fGr`~;H4yxoQvx7_{2C*jp zIHnWmg%-h#Y(8h5=r>9#_R!~kg7-ei(Cu)yD>5^o;7FmhNpP|fB%^;n6iWd!GH6yu zYvW_~2uuAU$unZsto=% zQ7WtFA{P^^hf#@rMIMF$VW4(1H0HKD$Togp*IQp}=Ba}Hb85ZO6yj84Nrb!mAa#gM zIrhpi?B(f43nxA9l}93LKVC*I=Eb2E2(>XO#^9*lc@kTJkGy15r{kedXV~36ZeXE3 z;5~V2i!D>q>r{xk#@mK$l9J|-bp#n9kaeU2StyKjkD~JXHcd;5j(;xnd$6T>04t}k z%QYj^?_Y;|qTj7Qmv8QPb6Blf(ZF+vl%o)P=P&=22BWKOYFa#_KN1bM(x0j)FpV@c`JsWo;zH? zVIZ+%zW5hOLk%2e>oe*!-ca27;#BwW{}ViTa2JfQ!YDL?$V0q+x7%%CR*HYqRn?Ba z4r=%5xsx4N#%|ksF z7d+m0;%cFAKY;^4poOu}F4|o{tvO5;_~7+({X|>dQJ2eYO*MsUxq0+v=W`^_c--ao zpEOe=6d zy(HTZG8oNX)vC=XhD4cHMle$rtA=Zx69m)Bg=1`Y4yH2NWWAhBpW?-F&bW|d$A)F6K}zs< z26ajz&@6{QB>pF`40Lfk&#c5P@3IYH3#EX*77H?x2rvzTQQHdT#WhEQnwD<+*0G!` zz8w-}$v)wyeUtr-`kk?ESrbZQCtGCU&4Q6!9&R7<-T-t-p3y86hyZzx7G+Y#Z>4DG zL#`7kQqY)tkDo9 zym(bVU;yjU`7IKS8IA$oQoytr!z206nN`--9?q|W`fIGq8af!84;%OaJtF>!Nb7C( zO9gA1`QYzBrC1D0J1dz#mhi&Z@*C^r2!K3WD`7umGRA4#SeS%M*%JG!&8I_5eN}P> z3@U@4Ih&3ZbEL>~tQ$S3%SPimYjcwHMxh`24P1b}GZ}ToHU_qE#jlrX#O{_H)}J^* z>gM0e;`_aR_;nA5-sV8$BDn zlYPDwwMe9%OSgw`(H%O&lJt>xLu;=S3?s+i>Ru?8Y)`Z^Vg9{stN+xO9B@*ihH{8RrX>VCRg@bzd^86%xh)?&M zpg%Xo_!Z|hxK|&^vrjB21t?Dq&#-<6_dDhpOOZBGU-7siA`&y@B3UHsxN=Vz{AX~v z*<*`m2K9#3fsdXk?{t06MJ(Vjggx&DRadV^bfY}iV^`-vGK$0!qcv=Wtxqyt-*5D0 z=>t44$`3nxfKlpVPv9l+p|d(Cj4j7mZLq6lpsa*Pv^WKWrc14VL#K(=gC-LOV7E71 zTadLYdPuc4dqC^zM$?(t039S*zOI2LVqW>g6{%A+aIJv_mIkw1E%Xknf^E@fG;o+C z{!)KfH?Mldj=A{<9*7RILk6b_Z%&WtkLObD?Pf+F>^2V^Z@TSy|oGzVIcjtXm&`#~+B!%;*ma)epgA>>9JnV3t;@ za3n_~69;Ov2be~;q8V;*a_2xqwZQ{Ik{#&g{Z6PfC_E0R@F}C_#D1X@t`p&Njx@Vv@H7`_C+IRb6pS3>?<~s^N z)jh$xTY#FbV7w}bdt%5N-LkYu(FZZ~)DcbMht#Sx>4xJy@#-vqgSyJx1;GXhvVvU9of9PKG+@zD$7qxZS#OEEs!$ zQ;Ytj_&!ymW+<(8!``aQG3a+-dlFI*`$X~lQOC88d;Z`1MxHUT3B8Kr9-V#T5eRlXgVn92ZEv2e@EHfW`cZi&q|5hYL0wl#i~<4$V^P zP=eZ`b`urmvw+NR^Z^`$J-RESvB4fUm@K)*#NoBI!gM5tW~+pPIQq-!Q?ULmyzha; zaCWt2uikWC#oDdKUgwt-EEu zD;yzSKI56${glIO_No|;o;YZdc(F#!+XqNaybHhUjT3}De*fU~=ap8Rf3r-){T^F| z8%K?=^Y6kAY6g9Y&k!CNksOw6H`8Kv5^_pGbG`R~O3I~7ky!f5J2sIq)J>ex$9XmW z)PGViw;K{SZdgNJX`ZOQx|!}mc+9by->&~U3!{JDcDm?l;UD3E@vxPDWIF>EO$9eo zd6#{<20RjT0oQ*K1`Y(Dw-j8E^UFI{<+JLexJNT~G)(23>+I*bc&VF1_JjAI&INZt zb7lPuWV&m6AGo31=5BhD{;EL7=@S)JE=Z{zyJ&Orkz9TZ2W0vuJ;i-cZ&oyJOGJ-p zwY4zTdF${lF#q5Im=!EPD2V8L9S5CEtC!x__qq3$@rhNLI#-Y1NfiSq6%qKa zE2+OK%{U@Tr#&~k0?Y&{Z<;bRJ4Gm0+6DC2;%Id(&#!y+EVs-=lk?)`6SQaKH&wuZ9*EQnWk}Ii)#T(8fP3+KD0Eqs3KtWlZ%}zpUf+S zxQH&_Dj!N$J}m@=e;!z_etrTJQ@qcguP*7iZiApwY?+If_5H@%9#uP`TNBwbIo@ER zKM*ju=sls%J3GxQ+rtZjjGscrVxI1{fAHC?GOM=}`B^5n_6`gOP))aSN~gMo#MWO{ zOEXn~x_K|wAjbwOAP5rYBhjti@_?1DkE@?nSya47cT{A3Z~fT>;q?vmR=N7Q5eABvF5mO;lmyjUsR{Qa=XQH(}S|A|{+edFk%A6Yu;FWIPjJbo%`WST^fX}}M zkk!r_dR{*sab`W++`5AKsqS`Z_bD6DPYkF?>=VPP_((4l(>zp;w^ZWPp-^!8e6o+4 zqrfAPm>H$}I_n7QT0&n*6EBS~H##M+3AB4b3G=mwlPrWWkUTe{5r!j`;EZ^K5H655 z-T*f&wJQC23MpTH8=qO6`P1xC*|Ce}8a|^#wZaEj(q-+KZHCWSG)MG>h@`xbs}N|& zE3d!k*kPmI=21a6iIMn(*h7eVQ+r@J>|BM^ucc&)KNMk|mYIm3f%nY{6&3kKRg!CRxKx ziKNsf!KN{z*l+Ka=Hc*(K7icizj0EJkNr(Opf)25e6hLsW&5{iCZYi>rtF8$&!E5yPCBEYaylc8C0um z8r|gMnrmI-wj?XnCjanjxE=cEukz25CD|+$+H1^dGBj?9TOAAM#NYgfUWSItGpuo z9V`CHEXGXQ=EuqVu2^cb&Dtf5rR&whZ&m55X!085xGA>4IHDv?x z;sG#HPfNxY)3fqlg+#m%iZ3RR(XX9ZPv(q|*~>*QDPFAt8sjnj8B&yRVj}Z>xU0RE zo!=BOT;Y3uH->iPoO8{M6}`TB&ATGRwV~RLtV<*JsBZoTBDM<-k-J{#a+vb5|2?(~ z9#8Q3z+@z6>i#`QMt&)q>Xsdx%hS%wm5LmfbTensM9nIgK?YErqsUz-!^ac_H4>O+ zw*iIN6p<^s2DgC~ov=*aTYnp?&)GxtI)l4TEHLT*T`#!d`G#7#SuKzK5M52!%hK@g zsbUSu76n`^Jb@}fF}u>8f2K~^uhc1iPy2leS$$#qJtwbxme1))-1xaF77>9PZ9ms) zkT+#nJpMW3N{$Az?9ZB+uMA@QSB_6S^%E*V<|qpm4=71MwA6eRloc_<5BLm)%X4Ry@whUgC##_W2N2?0Nh z6@wGRkZ5pf@S+qr@bW`XJyc8fN`}7JfDy;rf66p`rQVM@)PI^WQl8(vg^|B=b1N#S z1aE~Aw51RSqBeRdBT0Xd2=H(RhMQ+@8|I9K!AO94KpM6TTKt+}+Y*^6yl;QCkM1gz zpBQ>8n{5g}JR&>>heKYm&F>K%Prkz2hW{@Lk@h?4?x=erJTwR}dJu3J%mf2hPM8t& z^QzU{zM_6w)Hhm=BLR=)B9EA#KlkQpQT!{P-`vJ~W#<9OfJpZ$OtvdRBaiAuU(iJH8U8LnWsddb?~6P~W}oP;__Plu{zB+P zg||PK4#QNbZvM}+_CeO~(pP^>B-e^!q9&o-eioEd2gGciffj1B2pNQ2l08$7UqHtF zb+AYR0YAhmL)0+uN-go-C#ki>LC?rb;l~53$mr1uH@_vl5_>slbeI)T*xtEH6 z%?OQm$}hR_UD+jl1lqJlXo{#Yv>DHO&R!iH^n!WOb^ZQobREvs%Ng-9UTtPDIa3gq zr87%^)AlKe$4c$~`lo8iXs)>PIbWXVKV#!r5*2K*x_Wa5NVJ-F?WT+0&h(abZI$M| zQlX%@#!mp{7lY8WCm0B#6445DF$e|%Jo`F-a0kI4F$yfri*d5A8$=VVOY#dudkuQJ z{d$89SscaKRZQ(56Xw*?uzPO0^=)aQf&=6gJi#*IH-P&U392}_@y<#fr~p>91>{Bv zezUbZ!94S`Il3M5&dVRz8>{}!z-7!Yfo|91k=4SU&xEN_z7 zUE@Qu!>2$r3ja5fAA%`@2wIeHh?~(3ZGs@f>m-D_1IuI;9uQtmfKUMWq1`M!2Gbo3 zF*LMKwa2(U`o14gCHtOW|D5Fjvow(X=^N}^3NkIh%=NQdpMnAdg&i=NCkFr|h`Z@C zo*o4iU55q4oCe(p0|IV7_rZ0Ipq`1}_+0(7laW2F;WrMdoDEenGRy{hL6R z_KKXKrpZ@sK1UTXkEmUn18gj|B064!w(;_lt%rC;R}eDY4jP=U2g#= z82K%GgrH~I)KJ+nlY5Cky^8J49#udbF>QSxHBc-$f$p#fgx;5-+*DcnoJR>FX0ZVk z&3kaqjD+>X_T-vKfFjO#b`Q+c2ul)G+{JZM3OxWOOUaHP1M1T^YBb{GblYmzR(d?uC{D8klemJdG?iC*~zt%239G>m?<2HoTO zn-lBMhc1C0(29SPGyQ{heHP*r1?V3aJiPrP$mJ&f)Lw^K_S+a3ZB${h8jL3Ee+gyXS2{twxqn|hfP((9n z2;=EB7L08;JLN8N({Eo8=V!>i-G|0~!DU`^%h}fIm&?Q|-oUV%3;>Oa&JsrxW>**= zdqR5mQGPmec}^F7{iT?_Js%!ZX*ada#fS(j{?GpN$+ zptxx;=%9!bw`u9}5!x8Xt@r1~k)MG&y21V{{zEb`@u5ALn1d(qIOp+=_ zdg2moWB3eQEh=4(+b}>!GpKocYEE*Hy5*`?-16%Ap8!H=mlk4^i|Ic2)JawGcf8$!K%?4RRaGoY|^(n zW(N*E$A+zqe~Weaa0kC}<@`{5lfQrMA0s;b&A81XYZ)b;>Dip(d{@g^V*cv%>uDZW ztPVp&YKV;7$bd_Yq18nPl5noy=1TO&nqInae$y}e%6|sut3nQp6u(PH=ktssxmtr_ zPnK&|#-8aY$bb44&5%Ju5}`;u;v-Y+!HNmI$=4pOuu(QNp1(b==fJY&syM!G#U^S@ zc9K)%#-|z>%8^<1G+CrS4`0K`+I}%Hz0u*JBTO!c9NAoSQx4t};j?n2TZ`{(R`k>Q z3m`(7UKNa>v_H4;;lgJlQ)FT{;b}QcXnBJM7eJ5eizk>1gOWt=qyZ71(b{TJb)e(N zcbD`x^u|%?Hx8a|9yt4z7oQia%Q;oNQ0>urtfajJN(t$7UJ=!de^OK`9`TGo#T zTVPt%jumqq5V30fhxb4m@Rx-}@tNP0(`4ggI^f#(aZX8-KM?An8+-_ZDd0M99kgUK zQbVGAC!5th9#lenCR#)V)u)H6*=%ty(t`Qk(Q4+gsFP~ zf_(FFJ*Z16+&V)Y|#h7&@# zSOt>SN~%(rG&b{b5`JeztLD>-IeLzGm(7b4V=1NFcF$Z7!N-WNM(%)**+$W3q>DpN zEk-26-3|7PLvm#Fmg zPYk}%pVp51*$uGDRNRE6ceTiJ`LXcMW=6VryS#bF&k}Sm;p4V_u9@m%;QNEG!HYHXVGI~O#&q1I-zr*u0hMgN!2?$F0HEJmN7au=d`pOJH5*zbgxIi{2Ly0Pu>3q--zJ`tnJ=g;J5)Z?#Jkgvqcvxq{*Y}P zPJ5DbQdCpo0(|w=dM+mKGqF5_{{Hg0>bS*dd5`mxW`2S4I|H3l{O-g3UjV7X7jUi& z7oK2q-FMTBOWdrDQJZoPUsgb^69RfRl<*EzZo>pN9)S;mgP#F5x!buKFF7k!E2nky z-3|*s+=8v6PWZ8lf)t7UY>`C4dBW&5!Q3W|@>`z}S8-KK0`8`+<9D)6BM%#ljZeWN4R!rQJEh-iG zBLkPSU~87#9?^i-M_hVZ+IAGPOKp$etsLs2XlC+%xccg_thz64M3C<85&@-=6eJ`R zl#r6{kdQ{YBt=R@x~01j1Sv%YX{4m3rKF_4b^OiDHS_)XUN6FV&a?O0Yv1dRzn85} z4pv?cJjdPdMbo}HTi#v~7^xH5Z|zkj7XWAvMq!%!Eabus1d%hdn9Kbv!IRw+%nbUP0k!>!x_<8y!yDS+U#AQ%=7gGa)BExy^RD`tv@q z+S_XBwdIv>4sz{_e6Q;w++woBZm6ZZ!2+O zcf?aoV!t%p zk{nX92WYQ4a=78u-W-Q(@2u##K4W2)28%j3spHF(i{N(-VsEI{B(?UB`LRU=oc$`j z_%yK7F1#=D&AzwhL02#u&60Yq#`4rOdyR;Y0I5pIu|V~jdTkIY#`m`_!Q1^HOK8LfQae{r+M03@2}B2LU6a1%39@U#!^GV?Sq9MPZ}IjYD6us>!S ze`AYk5+`Ba5@R#W*KF75{5XEv@cWNv&2Pq-i9){Jsf%%el4v+t6h{wb5pO2&ch2B# zxZl)453d6?AGs;t)s>?H$$1}m>Fdbr+*kX$(ICj)L^~;29H2fiejh!J_}l8uJ?dMF z1_4j`fa;JuQNPk8o<>3Q10U0_pNLdAvIrwfY*RTLG zB4x=X10i;6HFw}TW&@}`GDbx1$q4$1yp+p(0}-5LDP=`BBq*92_NLeiM`=|oL>R31 zJY;Lq7|K0H84{Mx>d(tjxRLB#g|2w1m>$3 z@br*h7ni4DS=`r198ElhF(nBEJQga)n>|I(KFYi$!K{GOV-jY#;;V4OE5Z-~Y#85A z?j6T)DgR1IMe8I$5OyH0&)9ueMTo)(0yc9|7(UGDe2{uTFi`#Y_V4tc9>#TUr9X%7 zoW5Q{>rn6(CbP4-9ma11cQx>9tgr-S}AP+{mC3nVrHMRb7Nfk z5pLg(RKHR{J%Z!{BA7|$r=phNaOI{4S!zOJNDB$^v%@Ld0L0mq&Y%PoI)jZrfshrL z@F0fkP@@PPKL-FVaf+FW5cd|@qSSRh`n5c#zlL&MNXrq)MrjiTEP-c`Q=>2zOh3NE zBuAl*>Z*oiNpjITr#@Jr{|l=pSA?l1eiuqW*QcBKDB;+!-1b@mkXqDNh-h|^O|%m+ z9t&EqZQh?C14O*Fkk00+%Jf4p1?5J#KV46IKg0B)<@z3wL=2UI%J0H6A#0~LhbRUe zxHSN6NELG{wyFT@?ibGikq5^n6viBo7}`V6aOj&x9rw85nZYd06ObRz(S-{FzpE1P zA@8TPP2+wrf6h2~*GrBx`LT7fqsct7Pqp+`leNt0d4=E7d1F} zAxPR?Flz@DsTy=ajB%AYS5cS|L!k_G=$Vs2FY!Hf0AUHF4ly2b>}U)iaXAb{{H9%) zdR3-!$iGoTP$g!WyjmN60q;XQhr79@Ns6{WCQ$;XbT^QNgO7+gIDc0`k2(P-8Aly@ z0NU$CoNLx{veu1~j-suNUe-If;aoQ4@8<4FBhfy;LusB>LMwah(p7-?00(1{AkoJ^ z!0YYfSBPQ?nbQQzL$J$7`J!b*`_9+}baOLx?ri~A5NHCmPedC?=!ib*`SlC|tLW`* z&=NQx&zcbjAwuRf=*gfHss|WwY{lW`oW>%fq76wWl3Px`f%rmie*^&JZj2y8?70KJ zTHz1jjq1@NCgy!|76?W*0BqL)UHSA8U|eS)Dn|(p0j5iLA?Mqm2n4rkE8+xH2uz5W z;zl8(9`p!{dG&C%|M|1==FJ=AMSnn$_27_itb){XE>s{JU$Ce{nt=Ztzd1e00tJ_; zFvJK0+qquE&3^tOw)oPk?K+JXP zWwR)_m4bwr5aNWdpy(*(^1?E)0;S#|qk0Xc=H0KH^7`RTl($G`3e{K$gzi!OfvtzO z4d!5o5JBoKKz+4|3ZO!r=zeGY(Gc2iL=V+|C*W1l`#17yw;_}ivFV5kfv`*Z4-h_X z@$bp9mFoaS+W#!=H3NtdPYLUstfeNTw{))+{&WY}0el8!<%>|HXpzsaFJvK7N8kVz z&mGJJATBWqksCu45$%Vof89l$f9*s=?o&C?O1E*eKJT>!UPYEp6?l=MI8H#Y^)tl0 z6gZAv`HIu`!T%MQZoR{IjT6T4DS6v6OZ4?}HLN+&P^u7)m!l4##g@o?1o0>fJ3oTa z>CwuS#CsEeka@sMaxNR-0v-(6qpF~UKSDl>QavmI8elJOH>)2F0%J}O@gUF+>=}lf zfPWU^5A_09p!#eAx2L@XCEy8yRySH3`RsW9v zV_-^Z4`(=JVgbJRFH;U5MT+y^8@X*EM21rMt{yO`ncIb+lWH%K`oRIPGGxtWt{^=t z6rp;*bFYuPkd%stJZEIJ?HKp=O);nwx771NRF946ylnnJ`iJ`R2SijfsC7A`RbjX( zERHnpxt=H}gE6IE+UibL@`_@yUrCH*hv=%jwAQ|Ki)f;Y~v(lfVV zGq_4Z7TMQ1I+OrwWc2%mbhAjktq8{t%R+<<4P_prM%=bT?;_mRhCtnL%M!771iJ3< zAUTRDqO+OPTk9}Pzo+@b<7EG-!`2YsOdtPZR4YMI`cR|_J5%CR^x035R9LpqS=@y4 z`JXp3`p>4qe8%>3mHAO z#)*X#zfnuKNtgzl1Q2Mru}!G3PJ{98j(;S!ID$!D9swir-%Jcg7rG@Rg7}~P-qR7e zRCxc80Pha+VRVsV-YQSAg^*1_9P4Gd2ad}1aM+?(pbmm}l>A}g``AOu z{#4=qnm=GJiv!m*B(@19phC510l;=&d{dBLO3Z0su@FYxX3@&k(6}he*Z$@XRJT{r z^(cgL$R=MYyi*qR2t6HJ#2YlC$=4ZEp88uMa@X8V#8;#$mOld}U=&0z=raS zFfDwb1nz_4@o2JlzP}n}C)?cBm^&U+U>JmNF9!|2y*7v*vjO2=9b)%))DI&H&#yT_ zDvVl4G?N$PIYw20B=IS-6#?Pr>m)&8MzV{E^|ihT#?30t_kRIwe*tAT?w_#h;dd>>4$^xLTI)HAbp!`~&8l>58^tu{kj2*D3hvGJ zkRF6cCmdqYQNnTI>$q>6(vFMM?a^GC1Iz>)9;Cx#G zVGIl2EaVn~G&t)AXab?3J!n&>$_Cco6X-!w z5wh`pscfCJ6ssqYmgLa-7~t%GUIzG#hh$)h`9c{z^P98H>>s$LCe4Eq_uqSXB{muj zG;E$WO)nA1;Qq+opB&G6WmiF16FQ<@Nw{Fv!cpRF1=ebZ^VnBWh`)gCsvS&j5Mmyf zVOIYOg9GEaIZej9YqL$ueZ>MbDcDiq(hjws97-=Hpus5j39&^qAD1ZCHDPW8J5Lbw zm>y)|4uFs3DiD-_!UIgL`yE;b;A^eMfUos>0IWvOBV`Lu=d=Zv>&?ZVt-j4jdbTdqTNtxo&s@1)4@TI)W^$6I&f|xIsRum`(!<<>vLThG z)<)G7ZrJQzh71&yutr^f3gJCH6B7&B#?7R2N}aHgroLBZ9?QP zzL~mkK$Jn4ycV)BVD;{Bqag8=+tyPsQ=DBX%~GecSIN9f2LMSd8SGfbXlrt0_J-7S zFz{2ihn>iY*j3&^c~|ht3eH^LSFwj)evnvr;eY=$3(j$5vbhip#sN0Bsq=sVhZI5E z$y$ypY&%@HJK^_x@2}1a+ahB);b)lQ|8ZWBq8<2DwT!0>97>)nGRI;k!d$h0-oeWR z*vyE~`s`Y?r3Vri1x)g3MGRK!G0~)^^~Qes(b6!CFKL~caUK% z-~B5qAVJz3R*^iwEogEuboxa05A?d)miKrL?jybq-0v>cZEoK7zwiNzOey$nZJ*$P z4WO)rv(v$~8koDtk!2+cBU{=J*mKTBrc%N#U^%}n?D=L>AJi%TeH7Io&-fYcYhSx_ zIE`9=BEx9JQw`P#s|T5s76(MM!zB3!Oph!ONF16;j|X>9<`$spOTGHL5Xtl5P8oG7 zd#6shz9@l6!n`>-8zDWSMy|8fCJ+aYCws88Ja`4|@ZP`I0R)3?C7XnKjj%^iaz)w| z^ieMYc-7~M$_K#lrnL{)nBEb0=VCl4j(Cp5`0le9n*ckX~C2$GoGYy*z7A|4n4zg2-C;xMUM zXQPQ|4nPw+ru6L6-`fh6LDTK2WYXkB6hGxk%O)2}$|}l! zG;Du7H7v6)(~ayYDRkqw`8YxDje&bC9Wm;}SNiITnwiVv^oQ4(*_E!{*gyXB{(7?a z%FG=BQI)=J@l;04pqsp3>IAQq78z;6WV7Dr+f4n zb|uW1@S7-!(t{W=r7>@f@;m&7=&+G_Z@35z8}@Z|$zBq{5Ac|pn!4UffXhp6Yb!mh z@OGHf=T*isVs<J1BhRpv$zBN~Q2im3_H;WvxzpFqT= zl#`RYXn{W@<1Ooo4gZ^pG|f)tBWPzILNGjB28KeE;IneWj5iv%%EkbBK52I6fBpnq!lI%<&5|iQ(oc4pnq<^8G2{VhKOaF~w5)e?wd9D8b}RBz4x7EbQD1ep8dK$_&{1xO!jp!fSNm|AIw{gZT3*sPsbmhx3ru z_5FY$65Yp-b6RrtrQQ`3YzW=h_Zy;l5cs9|?Y>Z2dE$%Fr^3&E7UI0FypQF5rTQ_K z1SNd2lCNT)fR`42P2L=WF>!;H`MK-Ud)9i;#$?G^xx3dN+JGxEz4#LajREiEl$2uo zp09lhdfg$nxC;ko_!!b~?Dvy~Hon@!sXsa6RP}I@8!O0>n+TR#2Ras8KhL zxO5qzmrzzgOMW4@ZLXlIqZ0vW!c&4JAQTp}1%vBpJ5-N@cX2s`yttQxY@zWo_4>y1 zjP#PguX~updqqu6?SchOdKK4^bC@2A0D5+Ib|dK6_#oO?gckpjsLXL)jz+HiYvoTM z+$izb@r9j2ulgD8%dxSsbCM^&t$TzFTQElVLWw@SOvaRxj z-@jqjIM5Z2^HOuNutKj?Omo#OFUpjgz2x^0O^;&pe)$Z*5sh%Y6B8FUfSu%lY(&TQ zwhuS7Vt#!NqT$SM&!NXvF;mNMxzcIArkSTOU(*vA%kg2u92m0_74)W~CT5`!?8Ab%nojwC(N7$Ww6htY%oz*(j3P75hhJNFo#X zBm#1h&|f}bj5=QYdEH;1Fj&guysqQ21!_V;i04~eb#HL2KQNDGDu(B5cxK`FVI1c= zZm!wIC}4!ObH9A~R3b?vmQ|fhAH-mwTgl5`gCNu*bT+nhXk14#@TCdGc=lC?mU%}q z7F)Bjq`ax9zDm)^@vt8mK~At2-^)0{?y%Ww#D=M3<`<$8S^G`Z9#k$e$z$AxD$<0g zf#J&V8zg#lOlOuCVc=5w{lqF#cwOg;f1nXY)4npeP`b8y#mQ| zj-jEUT7~%d?|^`;K49=ZQS*Q=Z+;gR-}>33XivZX5WeNN7$ltGpG~b1rjP5=Z(#LG zDcC}dcO^y2(rRs`U_0Qd#cU4=B=%#;9as3@9J(4)(zIap-#z6-PMIn4hZ*8JM}N$2 zy@^-9!yZ18#Y#87GxvgE{mhvh3tK+P;hVmzyoKX@^cvPfbwb!j znC5R;;L8m5d=2@3DSc6ApqnZwX}wl5cRkIzItz0Mmw+BsRtE#a^GhvvYOd#=^TdTw36vb8rJwW+iNXZ=blD z3#$)Rcefe2$&ZmU#RJ0zGoLlA7hZ?J)QWn{dOLcp(5t)-0f(hHRp?z%k1m$&=j-{v>$1^Y5P~g z+BDnp;XUQiy*+b*vlb0$T+jq@S59C}0+a+0?v2%N6)Tz1=|ANZ6gDDmPTeduY@t3r zK1SX>+8x>o+J@hqJx;y5KH1XEN~b-JdXr{YHDv$&II5ko*YzV#eB`1bHc3_%c-*Ui(t8-filgmb5H1rybRqn+s zN_Et;mfr9NmZiag7xV#NdV5FQIR>~MS^Kj+N(tWIcePJM8X}B;AD;`{B0Au%>UxVv zh>d`>R}CUl8yrD&U;@95?I(BZU(;T=#sFC|jXabNujF2}L_3sIRSk_`#9itLy0=ot zH0KY_Kb_BK2C*a7@u`eE+jyU2&W z`R_yPibO2jynw#JP4kPC^k8ygV%Wlh=_LzWsOQ7)-@jk6x8;Y+cWrI$9CAI8gdJ1a z;q-0yn-k4_>)a=W;hRcGsGDt-QsCOIhpWdn&^vcmb7M?F41MB>JW~BtBoD9(Mp!^V(UC-`q;n4br!;=&8%7(pF4C_&^KdA* zy8w+j;0p|ZC7a})e5eDG}5UOj25<*l$0V zVZQZrtMjP!NTTKZ$p2Cp$gbRUeU=SV=L+uPPEJmsUmNtjEG{laUDt%Q*ERXK2vS431jZ3#IlQm}5T6@_IV-@7u_X z6n`vD$W4nJ=Y&WAjEagi5?ttio!8M>zFo(_pv>R0`2`>htK0n)fcgy_?EvZd>pNw_ zAi`*+Xq9O7=rO5wRJjlM5^0kIuWCs*=o)K4#?K(#Mr2JhbGz zb{-hyp1gf!vljVM82^1K*V)(EZ=c3>#5&8$f0E0-0&?)}@ zcrts4h%qo2V2{>XtCZ9?Z2CGXW z9j){Os9NOyySuv=3S#u3LysN#V_bIT+9^eyuhaXVIYAJ&S_2wzH}H@Ioh*Qjz5X-+ z%rK1+GmAm2Rrt$Xt9T4s#<9cc>+V-4>OykG-<@Akt#GUIp4a5$pgOc1ye)s%0^H^P zP1UDQi=z8H{?3QF^^nptSi=g){68xo&5=)=BbN7QEkE_y(Dxq{T)OW%M`4cpx!Pf5r{RXgFVgrAFf8gP_YTI!{>)n9yl4Cz!dI_AC1^tmIB*Cg zcwYrff8Z2&$K@>it7P^hC4oUlq=kN2L5%ty|E}|Yu|;;xSoZ75(RxjwaNsvG;<_F@ zfHN>dDq4Lxsb=LyL;VKqK{H@!XHK!)y$fa}`p#cj#i(C!X^nrA`_m4`lhA((M5VQS zmiD>|`pi}By{Q|H`qL|2+ygoBD=Xg6h&y)dQr*8JCH=r@VrF<^`P`0&{g@KnDz(MB z=PF+9`LE+o@^BX`{?Brpzv-V9GQBn+6qq{}$n>li1Mhk-#T|olk%cP*{dRghP9h@NQ1nIHQCvk2Dm|C zMa5XW$g;2dW(xJdS8^laif%33|Fw_t%=zfNctJOR^qwy3i-odh>Pq~;+p5?0dVZ`^ z$vd8b!S2ZwsqVT+0Y?A}8PyIfI_;sJo}TjS2UG$i(@8 zXR5WY9NP)Jis5?tIye|j-*r&#N&{VOPi=hQy4p?5j*zfk%RZ*1M@xmz{RbnNF*_nm zMxV%3QDCx*>BPO=#7JV1Q<3)a5<_CVrZWYgvikc%VwtOedq)r*g0bkL0 zT6{}XJ&4fff2t|=vdhrc!&IS1Jnm%VanDd>xVFKCM758LUM6S>ZByoJ1uw#qs`tsWrp5{Kl_XIzEBz*xL!{q?^;8d^gDVG^I4>8`HkpZ3T&BD^0{ z%!p}qt(&!*t(&9UmN9$G8EVZWx17AZDOl+=f*DF3hAT|eJRm@)b|pUh5;XFWhLkwB z?cLvhN9wK*-4CN%XR|m3;bZ$brSDPXzE4>1-)8Jx5BUCP>5RKzEMkB1{K?~bO1+YX z>@M|)oVVDtcAQc#rb0yYaGCGXUgV-nTNB*-bhtfRv6l#uYg_)cX4z~3qfDYsFf1m_ z$;ol;BV~)jEn7lh*J+>gi_`6H@U$Wtu-vhS7E(8?2L|d`SFhm`&U0W&U&DzU?0FAz z8M@=P@CYgCJ7f$DF@T9}oGIs{56JV00W4#>2mUji1pa^TL1KWMf+JcAoS+6gpFzvG zyEkBjyz~y$(7m&x>#OE=CHfIuf(+S%rSgUIZL#6Ijm%Hq5@*I;umk`U^SgW^#1{`k zb*U(XfNAG%=}yv5&Prxl-_BEG*Ip_8I1ya6!!{Lj^lX84eGc*?QJ=rO&<`&A-*&t$ zD7a>8VP&;JD5Si)inSDM^CgyPlEkaLYZfdsl&0s>vs-bC;y*w=PgiLKDM$Nk>`L`t(A8yTPwEjAj0GeT4~MrW70$D} zjGAfREBER}9kx;kXQe&wXg0ANVt=Kyj(6{z1T8zEo8B82+OUzFcrvQ1$+@JQ1H(wC zzy6igr2(KqLxiuBE_n>eUF(GrICRQX9PS)qRNqdaRqFbv0GqueZfUQgegD!nxB5M; z+YB{sIBnF|ufk@J7orN)7WhAM;H(Lr?mWJjt;$&^dDCn=XsT;0z&tQ}m+&Lq4$IF8 zTXMhgZROqv8G-j%$PI_1bz>sZ-SRv*z40=7eump<3;3*OGGa=BO+;;&6G%EINscp7 zB+`OSTHv-JY`<7*|I={w|8&f+hdm!Zd?Q4`*y4xtCsknZSCNA2ebf$neDmAS6ii&m zb$z&h7tRD6ZxyDMM?8Jj^{*WYYnnaMx$?V`=`(rgm)O`o@XkS{j;fQ2B*rOid%79y`IL)` z_f|=O<$>;ql~u5Q(t9`k7I)#M!NnNt{%k6N^PjxVPdeG}fkU9V^5Oxn#HAlZWO zz2WzdIZa1k_HmgDpN_?j#u+3Qq@<*1oJZnG#@>{N0{Qkik1XR@{xu5X>1^3UI-#t2 zdsXjz?!HaDB)R1Fr9ZV1>LenLz^W1;B6%I2UPm(@r1FUH-u%AK+@Fa#zRewvd%WBy zk9`Wd)01Ld`F{T(9C@EoxnzB#UW@iI>W`2NHG`dL!}y)y3jtoCCgF}(m~PR8zwS(X z@UNiw#aCV3=usLG)k~FlPHEUc97M)jvNsah8>*9lbNkKJXRO7Op00OLUCw1Z{O^*? zFsOvS_b$5}9L}o3Xa9og%pb6>c$4rl+Wq#(RnPULduvjgRjn3uAuH#3)|6gY)HnJ9 zPG=+Gj(SJj?UD62Zt2c;7DvtEqeZmsz~)x;1JR{Ii6^+)-;+JBa)=0@yRjHH?z8&r zv?&z!uKhjw^Dv9T1n|rz3#`*&gVjpn8|Xs!B6MW$69&(PF1}ezfXnicOxVAxhE5J2 z9H4Zvt{K6-O>|$LTVy$`vg=d3r4#!{eJPv`z42T^{#i4u3f@} z&#rgaPtN_(o#(e3*Gi8l&6lCIFZz_-#QfoPGj+@g=VykRL^HoF`Cqp+ay~E0zLubt zr1D_h+7=~0?|eOy&^fSLvoM@OE$+mAkFG#gQ(XFJrPebc5H zr#0{Ls(^3NV-dwz_v_@ha8nKJvnQ22nv(RiJCAnCcBVZ=dyg)^vRYhbm?i1`=ny`- z@z*l?>f4t7b^Hqnx?s)e=Sg&!niccn`%0y{Ef{wkPOl0npYcVXskbm>@bJiJl=gRp ziuNxo-ns~2Vb}^KD(IS*33>FCcpEs&}H4E^9e2IL63zaWb6lmFtgoB>M)GY^7Rzw*+hM|&l z7bpy4?>h5jpGJE1%--s6s~Favi@_LM)Lz@zRUVXn6}A0x7LPh+Bi@^-x3Uwb`RMQ`Rl#}rffu89 z2Q!H+H9){T@sx#mltCFeA$)3X;Hjd znHp2JcscLU^w29Uz5)l-b@Ve1ner+q(z5jE9f@xNG!p>p?a&DFOVL|+hvI9!h5F+C9=PO$ha3Bw1_B9|n2XKG^M5fULzC=M?+g$sR zG~@rg3jt@weAeE;=~wcei)!N^_#8d$3wK70ZKvHo7>pH1TiMv)&97(fMD@;yA%YGL{%i)4Qvfv4BfI4l&Y6qvZv^2bqW{DM#^qJK~8}@8(^Md`cPn%`uB^%@FUpQL0>=MxM8s}TGuL9d6w79$b?i;a?$KM17^GDVXz7i|JO9R({-uO{7@d69gY zOkD29J7OCk@zZ~RuQwOH?WDn^+z6#+C+qQCQQM$QQu37BF0_TY)={<2Q`$)j}PdJ;zFM)Umsb?kzUCcLbeE!(r(rFWmOb9@ITjD))ur`eG zV=q>c6L4pe@(X!a1l&-TU%_R#`(bZ?^Ve)=#S;hc-oU)rzPwQR_?h8s4ue?t7G?(( zQ_kM4Ifm%)SoW^*#W=#0;2EOxI2)B0Q&w|@HCL3MsBYQFTHfRPlXBA}Ny`;0Dllr{ z5!KF{ohP^v%AIpb8X_{$SWzRD_YZu8?-sLnPZrw*(=h$jI+}5OB2zhcpGs)7HtVa^ zy;9;AV|kx5->>eo&nJ|iSxr1+y}4*Y<%;u)``$=&#ovt_UYzHhXTPwLPTyV$@iuvD z(XN`BTo7#4?#C!Z7CJe}yXW3{G{X=mQ8MBpVEk({Oic%MxG4D910md)mB^f$9LiSz zbFwFY_+zW^zC6IFPGA(zlFjMCGHb&u#$^>FxN=9h&9R={DG9^nfH+BM_UZIn_Q2-9 zbgZtU8zth!(N69BPSm{Cl#(K>=85fRqnD^OKTw<9i#K-8PTxowRBTD&%los=ctpK6 zP1;+&QZj}T7sp%U44^q{(y@YZvR58)jo^;Y2kh{dL3RENB8e3;JuVe(Ej(AZ_Blm_ z?bNsBIAyLiyp*p0YpwH+t0ZiJ@qFp3P6$WS;Dj8ZTb&+tg_?Wvg)JG>Pnc z_6b(4`&znv0SWWQha#Aeu)IOf5aT=ZHK88|rv1V71HIXkx0uS(tHF*xf!{+0$gvpO z=*pf6c)fYi4<;9tlnmRaA;3Lg=4(P6a0*%l1&?K1BND=p@51j++iEaY9!q`0{xFEZ zeZ)&*Tq{0oWlw97L8l~k%8~Qe4-=fgrAA4yszYA!f#>Xg{)6miwf&4|7GE$mZkg=t zwAy{p(g+dD)I2)bze(gRl*CCqQo0qwU0X>>sYd$Jh(+Yq-n^b9fn_^>UbxMOx^KXD z{P=!bEoLDroL)CY&Y_wI#R-jPzvQ^&AJv;x6`PGR=*SK)u(OPlu=N=u5&iZw#uH>)q-MF@# zA+f{dqtb$rAQfJA&?FwrT%S$UhaNfSrGjO2AaNEF_2JW!wa0ws4sG9{Wb+Y&%)#t( zuEn16-}Uta%;AhjZYmk;Vz+&oNS0Juu%18I*v9lWasJ54OzW0@rCByQNPACuT} zk5^mZq)bTG#dlozrKPp*bl@~yt^xz*_bf~?twLaSmAsg;n7a6(M&?xUj*_<$%#3aU zB$Dsr^qIqlEA2yfu)R<^sW>n9 zgi8HqFnf+x+V5{+b#7=TjtOU}IFOs8dJA`iD+e$A(cwLbLCG;Sd6j{A56dYx8{aaY zIG*}$ccxY03=fM~{lSwuY2ONe%f?b8+Isqao^>kqicqI1+AJ#`MrPv5Tl0w{=;5zW z4>zy;`E%Y~e_k-dcHmVy`;j3Vs| z^~1$YB{oO@~oFcV?zj|*J0gi-5{5Zjpryl zrK&Nj-m0keRaDdT@97rZTf^sZ{P7g}Nt2%W<50T2V&z0T9LF3V-42%coZb4IQTDud zy}qnqH?xqgEM_fzb4T(duhTP)xB-uQKV$srtluTMc;z$v@{7f#@GWYrOyc^bWWhpi zasLn>z<(U4-NxppW-o*g(-*Tb?gQ`f2iaqX3X&&redwos&s$j@{Xm~b4fwA$(JXMZ z_0Bi%e-Ccqy2g}NpK8rT++|a%CV!jx75nt^ukdDc6?T)u=2wrNXr{!ZEZ&^(d?WIp zqO4OO%!TjyHj|J3Xz;ZPV*B;?SKowtz0)RMj@b$CcRlq6i~s{SM19%sFeZ&x@BmP6LU1NpYR zD2sgE`U(d9IbSK2zo1%IJ>^K#U24!VM5)PtIITkBQ*l8*)7;(Wy@Khnor&wReItoJ zF(oST>i0)w#o-4gvPP_bH7J|~cvWV-2=0>bkti@+)EQePKp=9h+hoB%-d*(G8ZviS`k9X7$*R>cLarz4-sf) zj<(mt0VJIV^OhGdP!ADp-Hmei3-IZ{#JtCHJnlhMGqm( zHtlL9EIHOD<(H3{TD7E2L>Atx9xoKp?r>Shzk|J;8A9`Y8&xTqq}ONj(szFPVGU-i3-+D7Cs_*{ZhZb zI6IVH>h?ys&xK@0ZLRmJPeRhOC3!N5Q|2pWOO8I$$tQVTj!4q^{d^b9!(ir75wyTt zYs*|Z-@U}Xo>=-U05vV`7uUeixcjT1mAb+s)v!_B5zR8ApI~!j6wqDms6rDe7W1jx zZ+X`znXNg@1!b0PW(ua?jxb}(uCFJDSrfVYmfc=7hGcKlf`ou@!ub|rAUM7jK>-xG zfd8uhX^ZKLtu<2K-@NnxYtN5HCLxW&m#XAE$4QSzk&`lW2NQFZqP(o0D1M%U35|jl zystN_zDZ4iOXIGeoGATx4UWI052fTpX2h%|UHgo@uw^-(1W(N zRY%g>o;&;5y5hAZ)GC%jjLkFm6vo%g)R@_xV$QAR_^AeQJjd%TU25Xrq}UNjU@x=L zBss(^lkc5;oMe%FaaEVEB+^7|!{l*o7YAQSFux0%+jzNp#K7y$3l_4baMkF(20QNW+SWgAhR*yBpJQRE8`_2~D>+e+DH~Lx`#&|uiE>^XKV!S`1eEJ5i zimRSchkxvesT%4;xnH8lgB`JH$5FZ--%_69z;0ht2UfY_lJ=!5sbqEq|3L zI~)mr%X^X5lAuBxj&B+odW^7Jx&e-V(IiRl((F+IsehNDS2UwGvo^Q3;Dh$0_T+@n%vfIETF(f+9Fs)9x2VUK z;YQDJ@!UZ$!E#uj+BmA>@lCJItq&$C17#Av-uLQ3vZ(Qt$Q3%@SBVGIoGvsHG$)|pM0K1y?*d` zr5FwWnZ}A%{JBl&ryp1I-t$VHVlHP0@}|&?+Ox-fTd%`yIXE%4+zwGosfbqBa|;o( ziX-l#YRiaPr=~I9|4k6gvD+hb^Umn|jg8U0k5|lADGz8)WnNi@QA=hM*|$))9j;>(`6@3SAI0l^O+>4s&7-$Y1{I{Ty?nYHDTniK z^7-~|{8Ey{+{R}8G5yQ~M`^C4JftCuuK4g!FyfK`*dShzp_AP=@@yo_&K}&`cYYHt(xzfXBxD{ zpD&JTVr!(aEDuEUqgI2m#}1_Lk2_^{dImk3(BXT%DgVSIZd0BTpWKejnB!u2c-RRz zjf+5x6w{CLG}@H-1|!`k18-x1w(5NsM3E6kGu{NC5R(QuMXT}3iz|seAs~EQ^qxJX z2gV=5wln?wis~P8+A1czuf}+B5S3MIV@}W>Q@G>J&O=!=^vDyvq3=WyYJ6C$MD$oR zrQ;=Nff(*0zFPXETWu}V@w?MAUz3ul2{7(S3Em+8B{=t$lYmOQjrvo=>paUzCiFeLt}Zmg{t0vtvamSS_xXm*wouxyKtxz~NMo(O{JB(ql@w z?knw_sipQU?TebaYY%BBQQoO^L+&-+VDqdN*xARixF0ts`GWW4rF;T|Due zX2*ypBhJ}E7w@XrcPXM4t^cbwbEo!6kh3=UXVYS&;4>@EJ^)xgK$a`>wChZ zokpMgE$>=Z#e;@gEW#f~1$A$BUdV+xdRSbEUS`kUL^mDE;k}q)TIJtCWBRf}^iuh7 z$DDl}{M4VHCrH+OQsf;VN9_%wCGEo1Hru#@RYVqy!!WrA7Aeevf@BjD6CTG)iA2Q2 zITT-l@?zLrl-DABVW`Rr1S$L6aU7jVVXUBmxbRhRoV#W0ZGoS?Jl?Ew+BlgQ8F0~t z;-6{^{AR6MiiETFetHIlYk~-b+VR%ft3eS4zM$-*O(X;V)0v~50X01jR8AP9H zG|KR@e{0i>xb{Q)ICf(7Q%g(7z$UJ2!3|Dw`2|Ksez|jWji8XSN4ie}HPU%*lF3i9 zQ(moj+`X?Jq!cmoE0C8t-qndd{pz}nTK^-o6MfX4zjsVtwJN6%XKqs!8`{1kPJG7p zDuv%5wwuzCgLCX$_*Eq)>rG*fr4bafS7QFU{syC?tNFp|K}{5iB!%jxaYknG#<=BmJ;nvT;4{S}Cyu=jr|5ywrCtNALz?6R);kBjNHV{{4Qm4kpi~Z({ z!(z&QXO8TV4;vHvh(;*h?I7LJ1cK_YYLX=Mf|P7_udRY zw_7R<9YlT~`H?WibH5O-Kxqw?AHTMLuS?>2+wS*N;|QBFe!B?Qw!4iCoLEllEjt~0 zQz*l0fm~eZMB4hVg5L|XEQfxr6w_s+;bhmSGiOQ5(+sD+gUOe8Yko@ERVaTYcOl-u zQETMsAl37T6T4`VbTkd-#`sL(zHHW|xW9&RQxyMlOW&eyynEqr}?}H(tLQ zbW-%F6&Ody`yP&6#l&4(*Uch2wAwZ4Op(#!VxknKLgl$7U|jciKyXB=Xt>KY@5qpn zF6wsoM1@!io+71?c7vDr+G`7Zt488Hd^e(vs#DX9934H>$`y9G0)t1db6=a#YICl- zP}>^cBr1=IQc^>$Z$63CDleH@cl=R%MatEdK3D#HGMP+Hk+k?Udlgr6B_=|(xy>Ry|ookFAyWY5dv%M(T zsjR8Hv{U0MZz#S)+2g5k%)Kn)a=|*+WRCXIzCq>j6vZqrfl(J38RN|YSsPc<4`DTK zPs&)C=zq*exJhR(@=eowy!C%I zKjLw&b{poFp=(kl`1o9e_9RKF z!yCcta-IV{=n06@@XJ~bCvDwqNe?N3JdFw5zJAn(vB-tD@|-*pL2{oyu{(N>qDi2U zD`CF2ch^sxBx`VgBzyFQ=aR{(=)uLGA@bfH`?f=BoZ>X{gQt}dA0wVVxE3m>r#3Pt zzkUDCvo-o4qAGW^xEBuygQ%4YDL*5&pty8mq`>gIgXB_d+T+U7TTH!seVk$^SP6Vm z1My$WsScmPUo%S%xNsWS=eb_lUyFiOw`y3JS zi-pA>FX<9SP@(Ak?cUp| zIX)0HYd*3tyL7GCKuc&`wMGl)@g}{v#BI{}$8_Nu*zqfMdR&+kbsU%l=-+iMEb{Oz z%>Isp;8P6Nt?#gO0_RauX5FR8;w%x&v2t)wU87!{xn5ggJg9@+qD* z=yNL05vlPI-I$xzz8i#^MATmTIAsFwfVBszu)#57GX%LkMo|HsuBxni|)#50VAS}SGqr+ z%;5K3{n<}JmvnPdv)0LJ*fI(o3BKj4E`=jPmGd!=9jT@Xp67VOOLUcJNr zQfXPrDd!8Js51G4cg%cES|y)KJd^W&X?5|I9L4`z?34Osz_qF;6K7BA>EQuhIU9dl z_?Eig*$jWsQYP{B60^>;>WFz*&y-l2`}mQRYg%EU;igTSww%@0*1r6$b6c-jK5*qs zRq~T|peZ|@T+$g%tjs>NX;ajm!XXB{@5Kc?e*W9oq~6>C>~*Gyb_Bx8!`4z-(Y zH#5V|ypU?U@R;iea42A7&h2f!?fW-nu&F1B%)0aF@#C*4dRkgu&qEF6r?i@AsO^ng z|IMpF>BfZ%3szse)a~{0WT$MgtENe0OEd4orCPw1{OL@^+Q2ga+JUD$WHFw)DRBSy%u4ip-Yddo9k`pm9Z28F0|j7_YgSk zSzsq{QBvc|?Op4)aen^%YU7F}Tc4}(sG3cEv1MiFn;8+@axY}NUhlpoC|>oAwF$Ts z!PdeMw4Z$5ox*T6G6{`Ua; z#-=@$oRpGh#B$i>7VZ0h|hOibG7O9WZjA-^%7Mso$fBc4JIJe!YwU0_j$)8HF2@& z6&Efi9t_o7_-gL-CADB#paQ)b&^kxp{z))mbk@2KWda2lok1&Dp^^dys0xRv6w{CY XGLDK~-po Date: Sat, 25 May 2024 18:49:46 +0530 Subject: [PATCH 2/2] category changes --- dsa/intermediate/_category_.json | 10 - dsa/intermediate/binary_tree.md | 600 ------------------------------- 2 files changed, 610 deletions(-) diff --git a/dsa/intermediate/_category_.json b/dsa/intermediate/_category_.json index 0390a306e..26b212a40 100644 --- a/dsa/intermediate/_category_.json +++ b/dsa/intermediate/_category_.json @@ -1,4 +1,3 @@ -<<<<<<< HEAD { "label": "Intermediate", "position": 2, @@ -6,13 +5,4 @@ "type": "generated-index", "description": "Learn the intermediate of the Data Structures." } -======= -{ - "label": "Intermediate", - "position": 2, - "link": { - "type": "generated-index", - "description": "Learn the intermediate of the Data Structures." - } ->>>>>>> ffdb98189e57785af0ab636ef7392311a2e98db9 } \ No newline at end of file diff --git a/dsa/intermediate/binary_tree.md b/dsa/intermediate/binary_tree.md index 86908014c..a41c99645 100644 --- a/dsa/intermediate/binary_tree.md +++ b/dsa/intermediate/binary_tree.md @@ -1,4 +1,3 @@ -<<<<<<< HEAD --- id: 01-binary-tree title: Introduction to Binary Tree @@ -596,602 +595,3 @@ Inorder Traversal: 4 2 5 1 3 Post-order Traversal: 4 5 2 3 1 Node found in the binary tree ``` -======= ---- -id: 01-binary-tree -title: Introduction to Binary Tree -sidebar_label: Binary Tree -tags: - - dsa - - data-structures - - binary-tree - - intermediate - - javascript - - python - - c++ - - java - - programming - - tutorial -sidebar_position: 5 ---- -In this tutorial we will explore one of the fundamental data structure in computer science: Binary Tree -# What is a Binary Tree? -A binary tree is a hierarchical data structure composed of nodes, where each node has at most two children: a left child and a right child. The topmost node of the tree is called the root node. Each child node can have its own left and right children, forming sub-trees. - - - -## Representation of a Node Binary Tree -Binary Tree is made up of nodes, where each node except leaf nodes have children. Each node in the tree consist of three parts i.e., data, left pointer, right pointer. To create a node we can follow the below structure of code: - - - - ```Cpp showLineNumbers - //Creating a node in C++ using structure - - typedef struct treetype - { - struct treetype *left; - int data; - struct treetype *right; - }node; - - //Creating a node in C++ using class - class Node{ - public: - Node *left; - int data; - Node *right; - }; - ``` - - - - ```Python showLineNumbers - #Creating a node in Python - - class Node: - def __init__(self, val): - self.left = None - self.data = val - self.right = None - ``` - - - - ```jsx showLineNumbers - //Creating a node in Java - - class Node{ - int data; - Node left,right; - public Node(int val) - { - left=null; - data=val; - right=null; - } - } - ``` - - - - ```JavaScript showLineNumbers - //Creating a node in JavaScript - - class Node - { - constructor(val) - { - this.left=null; - this.data=val; - this.right=null; - } - } - ``` - - - -## Operation in Binary Tree -### 1. Insert Operation: -We can add a node in the Binary Tree as a left child or right child of any node. -
-**Algorithm or steps to insert in a binary tree**
-* First check if the root is null or not if root is null means this is the first node of the tree, make it as a root and return it else move to next step -* Now as we have already studient queue data strucuture, we will use that to add nodes to the binary tree -* Insert a node as the left or right child of the parent node if the parent node points to null -* Return root to main function. - -### 2. Traversal of Binary Tree: -Traversal means visiting all nodes of the binary tree. Three famous binary tree traversal methods are:
-* **Preorder Traversal (NLR) :** In this traversal method we have to visit the current node before visiting its left or right subtree. The traversal is Node-left-right means first node (root node) is traveresed then left child and then right child -* **Inorder Traversal (LNR) :** In this traversal method we have to visit all the nodes inside the left subtree first then visit the current node and then the nodes in the right subtree. The traversal is Left-Node-right. -* **Postorder Traversal (LRN) :** In this traversal method we visit the current node after visiting all the nodes in left and right subtree. The traversal is in the order left-right-node. - -### 3. Search in Binary Tree: -We can search any element in the Binary Tree using the same algorithm as insertion just with some difference
-**Algorithm or steps to insert in a binary tree**
-*First check if the root is null or not if root is null return false to main else move to next step.
-*Store the root in a queue, start a loop which ends when queue is empty.
-*Take the front node (as temp) from queue check the temp value with the search value given if same return true to main else move to next step.
-*Check if the temp left or temp right child are NULL or not , if null continue the loop, else push the left then right child in the queue.
-*If the queue comes empty and element is not found return false to main.
- -## Programming implementation of operation in Binary Tree - - - ```Cpp showLineNumbers - #include - #include - using namespace std; - class Node - { - public: - Node *left,*right; - int data; - Node(int val) - { - left=NULL; - data=val; - right=NULL; - } - }; - //insert function for binary search - Node* insert(Node* root, int data) - { - if (root==NULL){ - root=new Node(data); - return root; - } - //using queue data structure to find the position to insert the node - queuestore; - store.push(root); - while(!store.empty()) - { - Node *temp=store.front(); - store.pop(); - //check for left and right child - if (temp->left==NULL) - { - temp->left=new Node(data); - break; - } - else - store.push(temp->left); - if (temp->right==NULL) - { - temp->right=new Node(data); - break; - } - else - store.push(temp->right); - } - return root; - } - //now traversals methods of binary tree - //PRE-ORDER traversal - void pre_traversal(Node* root) - { - if (root==NULL) - return; - cout<data<<" "; - pre_traversal(root->left); - pre_traversal(root->right); - } - //IN-ORDER traversal - void in_traversal(Node *root) - { - if(root==NULL) - return ; - in_traversal(root->left); - cout<data<<" "; - in_traversal(root->right); - } - //POST-ORDER traversal - void post_traversal(Node *root) - { - if (root==NULL) - return ; - post_traversal(root->left); - post_traversal(root->right); - cout<data<<" "; - } - //search function for binary tree - bool search(Node *root, int value) - { - if (root==NULL) - return false; - queuestore; - store.push(root); - while(!store.empty()) - { - Node *temp=store.front(); - store.pop(); - if (temp->data==value) - return true; - if (temp->left!=NULL) - { - store.push(temp->left); - } - if (temp->right!=NULL) - { - store.push(temp->right); - } - } - return false; - } - int main() - { - Node *root=NULL; - //insertion operation in binary tree - root=insert(root,1); - root=insert(root,2); - root=insert(root,3); - root=insert(root,4); - root=insert(root,5); - //traversal - //preorder traversal - cout<<"Preorder Traversal: "; - pre_traversal(root); - //inorder traversal - cout< - - - ```Python showLineNumbers - from collections import deque - - class Node: - def __init__(self, val): - self.left = None - self.data = val - self.right = None - - # Insert function for binary search - def insert(root, data): - if root is None: - root = Node(data) - return root - # Using queue data structure to find the position to insert the node - store = deque([root]) - while store: - temp = store.popleft() - # Check for left and right child - if temp.left is None: - temp.left = Node(data) - break - else: - store.append(temp.left) - if temp.right is None: - temp.right = Node(data) - break - else: - store.append(temp.right) - return root - - # Now traversal methods of binary tree - # PRE-ORDER traversal - def pre_traversal(root): - if root is None: - return - print(root.data, end=" ") - pre_traversal(root.left) - pre_traversal(root.right) - - # IN-ORDER traversal - def in_traversal(root): - if root is None: - return - in_traversal(root.left) - print(root.data, end=" ") - in_traversal(root.right) - - # POST-ORDER traversal - def post_traversal(root): - if root is None: - return - post_traversal(root.left) - post_traversal(root.right) - print(root.data, end=" ") - - # Search function for binary tree - def search(root, value): - if root is None: - return False - store = deque([root]) - while store: - temp = store.popleft() - if temp.data == value: - return True - if temp.left is not None: - store.append(temp.left) - if temp.right is not None: - store.append(temp.right) - return False - - # Main function - def main(): - root = None - # Insertion operation in binary tree - root = insert(root, 1) - root = insert(root, 2) - root = insert(root, 3) - root = insert(root, 4) - root = insert(root, 5) - - # Traversal - # Preorder traversal - print("Preorder Traversal:", end=" ") - pre_traversal(root) - # Inorder traversal - print("\nInorder Traversal:", end=" ") - in_traversal(root) - # Postorder traversal - print("\nPost-order Traversal:", end=" ") - post_traversal(root) - - # Searching a node in the binary tree - if search(root, 4): - print("\nNode found in the binary tree") - else: - print("\nNode not found in the binary tree") - - if __name__ == "__main__": - main() - - ``` - - - - ```jsx showLineNumbers - import java.util.LinkedList; - import java.util.Queue; - - class Node { - Node left, right; - int data; - - Node(int val) { - left = null; - data = val; - right = null; - } - } - - public class BinaryTree { - // Insert function for binary search - static Node insert(Node root, int data) { - if (root == null) { - root = new Node(data); - return root; - } - // Using queue data structure to find the position to insert the node - Queue store = new LinkedList<>(); - store.add(root); - while (!store.isEmpty()) { - Node temp = store.poll(); - // Check for left and right child - if (temp.left == null) { - temp.left = new Node(data); - break; - } else - store.add(temp.left); - if (temp.right == null) { - temp.right = new Node(data); - break; - } else - store.add(temp.right); - } - return root; - } - - // Now traversal methods of binary tree - // PRE-ORDER traversal - static void preTraversal(Node root) { - if (root == null) - return; - System.out.print(root.data + " "); - preTraversal(root.left); - preTraversal(root.right); - } - - // IN-ORDER traversal - static void inTraversal(Node root) { - if (root == null) - return; - inTraversal(root.left); - System.out.print(root.data + " "); - inTraversal(root.right); - } - - // POST-ORDER traversal - static void postTraversal(Node root) { - if (root == null) - return; - postTraversal(root.left); - postTraversal(root.right); - System.out.print(root.data + " "); - } - - // Search function for binary tree - static boolean search(Node root, int value) { - if (root == null) - return false; - Queue store = new LinkedList<>(); - store.add(root); - while (!store.isEmpty()) { - Node temp = store.poll(); - if (temp.data == value) - return true; - if (temp.left != null) - store.add(temp.left); - if (temp.right != null) - store.add(temp.right); - } - return false; - } - - public static void main(String[] args) { - Node root = null; - // Insertion operation in binary tree - root = insert(root, 1); - root = insert(root, 2); - root = insert(root, 3); - root = insert(root, 4); - root = insert(root, 5); - - // Traversal - // Preorder traversal - System.out.print("Preorder Traversal: "); - preTraversal(root); - // Inorder traversal - System.out.print("\nInorder Traversal: "); - inTraversal(root); - // Postorder traversal - System.out.print("\nPost-order Traversal: "); - postTraversal(root); - - // Searching a node in the binary tree - if (search(root, 4)) - System.out.println("\nNode found in the binary tree"); - else - System.out.println("\nNode not found in the binary tree"); - } - } - - ``` - - - - ```javaScript showLineNumbers - class Node { - constructor(val) { - this.left = null; - this.data = val; - this.right = null; - } - } - - // Insert function for binary search - function insert(root, data) { - if (root === null) { - root = new Node(data); - return root; - } - // Using queue data structure to find the position to insert the node - let store = [root]; - while (store.length > 0) { - let temp = store.shift(); - // Check for left and right child - if (temp.left === null) { - temp.left = new Node(data); - break; - } else - store.push(temp.left); - if (temp.right === null) { - temp.right = new Node(data); - break; - } else - store.push(temp.right); - } - return root; - } - - // Now traversal methods of binary tree - // PRE-ORDER traversal - function preTraversal(root) { - if (root === null) - return; - process.stdout.write(root.data + " "); - preTraversal(root.left); - preTraversal(root.right); - } - - // IN-ORDER traversal - function inTraversal(root) { - if (root === null) - return; - inTraversal(root.left); - process.stdout.write(root.data + " "); - inTraversal(root.right); - } - - // POST-ORDER traversal - function postTraversal(root) { - if (root === null) - return; - postTraversal(root.left); - postTraversal(root.right); - process.stdout.write(root.data + " "); - } - - // Search function for binary tree - function search(root, value) { - if (root === null) - return false; - let store = [root]; - while (store.length > 0) { - let temp = store.shift(); - if (temp.data === value) - return true; - if (temp.left !== null) - store.push(temp.left); - if (temp.right !== null) - store.push(temp.right); - } - return false; - } - - // Main function - function main() { - let root = null; - // Insertion operation in binary tree - root = insert(root, 1); - root = insert(root, 2); - root = insert(root, 3); - root = insert(root, 4); - root = insert(root, 5); - - // Traversal - // Preorder traversal - process.stdout.write("Preorder Traversal: "); - preTraversal(root); - // Inorder traversal - process.stdout.write("\nInorder Traversal: "); - inTraversal(root); - // Postorder traversal - process.stdout.write("\nPost-order Traversal: "); - postTraversal(root); - - // Searching a node in the binary tree - if (search(root, 4)) - console.log("\nNode found in the binary tree"); - else - console.log("\nNode not found in the binary tree"); - } - - main(); - ``` - - - -Output:
- -``` -Preorder Traversal: 1 2 4 5 3 -Inorder Traversal: 4 2 5 1 3 -Post-order Traversal: 4 5 2 3 1 -Node found in the binary tree -``` ->>>>>>> ffdb98189e57785af0ab636ef7392311a2e98db9