{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "CanoPyHydro provides access to a wealth of data regarding tree canopies. \n", "\n", "To make these statistics more accessable, they may be calculated in bulk via the 'statistics' function. \\\n", "The function is called below, and definitions for the statistics can be found in the Glossary. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
2024.10.14 21:18:19.499 |MainThread | INFO | CylinderCollection.py:291 - from_csv() | model - Processing <_io.TextIOWrapper name='./data/input/5_SmallTree.csv' mode='r' encoding='UTF-8'>\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:19.499 |MainThread | INFO | CylinderCollection.py:291 - from_csv() | model - Processing <_io.TextIOWrapper name='./data/input/5_SmallTree.csv' mode='r' encoding='UTF-8'>\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:19.535 |MainThread | INFO | CylinderCollection.py:320 - from_csv() | model - ./data/input/5_SmallTree.csv initialized with 517 cylinders\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:19.535 |MainThread | INFO | CylinderCollection.py:320 - from_csv() | model - ./data/input/5_SmallTree.csv initialized with 517 cylinders\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:19.539 |MainThread | INFO | CylinderCollection.py:335 - project_cylinders() | model - Projection into XY axis begun for file 5_SmallTree.csv\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:19.539 |MainThread | INFO | CylinderCollection.py:335 - project_cylinders() | model - Projection into XY axis begun for file 5_SmallTree.csv\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:21.362 |MainThread | INFO | CylinderCollection.py:344 - project_cylinders() | model - Projection into XY axis complete for file 5_SmallTree.csv\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:21.362 |MainThread | INFO | CylinderCollection.py:344 - project_cylinders() | model - Projection into XY axis complete for file 5_SmallTree.csv\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:21.915 |MainThread | INFO | CylinderCollection.py:769 - find_flow_components() | model - 5_SmallTree.csv found to have 70 drip components\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:21.915 |MainThread | INFO | CylinderCollection.py:769 - find_flow_components() | model - 5_SmallTree.csv found to have 70 drip components\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"reached_End of find flows\n"
]
},
{
"data": {
"text/html": [
"2024.10.14 21:18:22.034 |MainThread | INFO | CylinderCollection.py:996 - statistics() | model - Found hull alpha shape stats\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:22.034 |MainThread | INFO | CylinderCollection.py:996 - statistics() | model - Found hull alpha shape stats\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:22.400 |MainThread | INFO | CylinderCollection.py:1016 - statistics() | model - found projected areas\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:22.400 |MainThread | INFO | CylinderCollection.py:1016 - statistics() | model - found projected areas\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:23.113 |MainThread | INFO | utils.py:150 - save_file() | model - [['total_psa', 'psa_w_overlap', 'stem_psa', 'stem_psa_w_overlap', 'tot_surface_area', 'stem_surface_area', 'tot_hull_area', 'tot_hull_boundary', 'stem_hull_area', 'stem_hull_boundary', 'num_drip_points', 'max_bo', 'topQuarterTotPsa', 'topHalfTotPsa', 'topThreeQuarterTotPsa', 'TotalShade', 'top_quarter_shade', 'top_half_shade', 'top_three_quarter_shade', 'DBH', 'volume', 'X_max', 'Y_max', 'Z_max', 'X_min', 'Y_min', 'Z_min', 'Order_zero_angle_avg', 'Order_zero_angle_std', 'Order_one_angle_avg', 'Order_one_angle_std', 'Order_two_angle_avg', 'Order_two_angle_std', 'Order_three_angle_avg', 'Order_three_angle_std', 'order_gr_four_angle_avg', 'order_gr_four_angle_std', 'file_name']]\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:23.113 |MainThread | INFO | utils.py:150 - save_file() | model - [['total_psa', 'psa_w_overlap', 'stem_psa', 'stem_psa_w_overlap', 'tot_surface_area', 'stem_surface_area', 'tot_hull_area', 'tot_hull_boundary', 'stem_hull_area', 'stem_hull_boundary', 'num_drip_points', 'max_bo', 'topQuarterTotPsa', 'topHalfTotPsa', 'topThreeQuarterTotPsa', 'TotalShade', 'top_quarter_shade', 'top_half_shade', 'top_three_quarter_shade', 'DBH', 'volume', 'X_max', 'Y_max', 'Z_max', 'X_min', 'Y_min', 'Z_min', 'Order_zero_angle_avg', 'Order_zero_angle_std', 'Order_one_angle_avg', 'Order_one_angle_std', 'Order_two_angle_avg', 'Order_two_angle_std', 'Order_three_angle_avg', 'Order_three_angle_std', 'order_gr_four_angle_avg', 'order_gr_four_angle_std', 'file_name']]\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:18:23.121 |MainThread | INFO | utils.py:177 - save_file() | model - attempting to write to ./data/output//statistics/5_SmallTree__statistics.csv\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:23.121 |MainThread | INFO | utils.py:177 - save_file() | model - attempting to write to ./data/output//statistics/5_SmallTree__statistics.csv\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# This function \n",
"import os\n",
"\n",
"os.environ[\"CANOPYHYDRO_CONFIG\"] = \"./canopyhydro_config.toml\"\n",
"from canopyhydro.CylinderCollection import CylinderCollection\n",
"\n",
"# Initializing a CylinderCollection object\n",
"myCollection = CylinderCollection()\n",
"\n",
"# Converting a specified file to a CylinderCollection object\n",
"myCollection.from_csv(\"5_SmallTree.csv\")\n",
"\n",
"# Requesting an plot of the tree projected onto the XY plane (birds-eye view)\n",
"myCollection.project_cylinders(\"XY\")\n",
"\n",
"# creating the digraph model\n",
"myCollection.initialize_digraph_from()\n",
"\n",
"stat_file = myCollection.statistics()\n",
"\n",
"# Will generate a file with all of the statisics listed below \n",
"# total_psa\n",
"# psa_w_overlap\n",
"# stem_psa\n",
"# stem_psa_w_overlap\n",
"# tot_surface_area\n",
"# stem_surface_area\n",
"# tot_hull_area\n",
"# tot_hull_boundary\n",
"# stem_hull_area\n",
"\n",
"# stem_hull_boundary\n",
"# num_drip_points\n",
"# max_bo\n",
"# topQuarterTotPsa\n",
"# topHalfTotPsa\n",
"# topThreeQuarterTotPsa\n",
"# TotalShade\n",
"# top_quarter_shade\n",
"# top_half_shade\n",
"# top_three_quarter_shade\n",
"# DBH\n",
"# volume\n",
"# X_max\n",
"# Y_max\n",
"# Z_max\n",
"# X_min\n",
"# Y_min\n",
"# Z_min\n",
"# Order_zero_angle_avg\n",
"# Order_zero_angle_std\n",
"# Order_one_angle_avg\n",
"# Order_one_angle_std\n",
"# Order_two_angle_avg\n",
"# Order_two_angle_std\n",
"# Order_three_angle_avg\n",
"# Order_three_angle_std\n",
"# order_gr_four_angle_avg\n",
"# order_gr_four_angle_std"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In addition to this bulk function, some individual statistics can be found using a variety of dedicated functions. A few such funcitons are shown below."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"2024.10.14 21:18:46.444 |MainThread | INFO | CylinderCollection.py:769 - find_flow_components() | model - 5_SmallTree.csv found to have 70 drip components\n",
"\n"
],
"text/plain": [
"2024.10.14 21:18:46.444 |MainThread | INFO | CylinderCollection.py:769 - find_flow_components() | model - 5_SmallTree.csv found to have 70 drip components\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"reached_End of find flows\n",
"{25: {'sum_area': 0.03185684182767693, 'effective_area': 0.029894983741628172, 'internal_overlap': 0.0019618580860487587, 'overlap_with_previous': 0.029894983741628172}, 50: {'sum_area': 0.029130503264231784, 'effective_area': 0.027960517250591167, 'internal_overlap': 0.0011699860136406177, 'overlap_with_previous': 0.027960517250591167}, 75: {'sum_area': 0.029862028471880096, 'effective_area': 0.02854408983609465, 'internal_overlap': 0.0013179386357854463, 'overlap_with_previous': 0.028544089836094647}}\n",
"{33: {'sum_area': 0.04205788206106595, 'effective_area': 0.03938659205799218, 'internal_overlap': 0.00267129000307377, 'overlap_with_previous': 0.03938659205799218}, 66: {'sum_area': 0.038149333485791935, 'effective_area': 0.03639941352493353, 'internal_overlap': 0.0017499199608584023, 'overlap_with_previous': 0.03639941352493353}, 99: {'sum_area': 0.03757534277917172, 'effective_area': 0.03516864948497811, 'internal_overlap': 0.0024066932941936084, 'overlap_with_previous': 0.03516864948497811}}\n",
"{10: {'sum_area': 0.010467265213352325, 'effective_area': 0.009682942614845636, 'internal_overlap': 0.0007843225985066891, 'overlap_with_previous': 0.009682942614845636}, 20: {'sum_area': 0.013024295480890522, 'effective_area': 0.01197165484170726, 'internal_overlap': 0.0010526406391832624, 'overlap_with_previous': 0.011971654841707261}, 30: {'sum_area': 0.011715396253001897, 'effective_area': 0.01071389206352086, 'internal_overlap': 0.001001504189481037, 'overlap_with_previous': 0.010713892063520858}, 70: {'sum_area': 0.047188893724672075, 'effective_area': 0.04288988057954176, 'internal_overlap': 0.004299013145130315, 'overlap_with_previous': 0.04288988057954176}}\n",
"1.058276\n"
]
}
],
"source": [
"# Identifying flow information (covered later)\n",
"myCollection.find_flow_components()\n",
"myCollection.calculate_flows(plane='XY')\n",
"\n",
"# Identifying the overlap of branches at various heights/depths in the canopy\n",
"print(myCollection.find_overlap_by_percentile(plane = 'XY'))\n",
"print(myCollection.find_overlap_by_percentile(plane = 'XY',percentiles=[33,66,99]))\n",
"print(myCollection.find_overlap_by_percentile(plane = 'XZ',percentiles=[10,20,30,70]))\n",
"\n",
"# Diameter at breast height\n",
"print(myCollection.get_dbh())\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Though many statistics do not have functions used to calculate them directly. Many are readily accessible. \\\n",
"Browsing through the larger 'statistics' function and the 'calculate_flows_function' can show users methods for finding a variety of summary statistics. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"xy_projected_area=16.612411399042763, xz_projected_area=9.643371487823918, total_volume=3.9067559999999997\n"
]
}
],
"source": [
"# Finding the total projected area \n",
"# from 'statistics'\n",
"import numpy as np\n",
"from canopyhydro.geometry import unary_union\n",
"twod_polys = myCollection.pSV\n",
"projection_of_all_branches = unary_union(twod_polys)\n",
"projected_area_without_overlap = projection_of_all_branches.area\n",
"\n",
"# Finding the sum of all cylinder projected areas\n",
"xy_projected_area= np.sum([cyl.projected_data['XY'][\"area\"]\n",
" for cyl in myCollection.cylinders]\n",
" )\n",
"xz_projected_area= np.sum([cyl.projected_data['XZ'][\"area\"]\n",
" for cyl in myCollection.cylinders]\n",
" )\n",
"total_volume= np.sum([cyl.volume\n",
" for cyl in myCollection.cylinders]\n",
" )\n",
"print(f'{xy_projected_area=}, {xz_projected_area=}, {total_volume=}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Flow Statistics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For additional details on finding flow attributes, see [Flow Identification]<(file_ref.here)>. \\\n",
"The main output of the calculate flows function is the 'flows' attribute, which is added to myCollection and is populated with flow statistics (See below)."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Flow(num_cylinders=216.0, projected_area=16.51706021532694, surface_area=19.495074988550606, angle_sum=180.03288665020426, volume=3.9062960000000007, sa_to_vol=83646.49652248439, drip_node_id=0.0, drip_node_loc=(-0.299115, 2.537844, -0.598273)),\n",
" Flow(num_cylinders=2, projected_area=0.0005597565466076131, surface_area=0.001924052712727801, angle_sum=-0.8861661864942612, volume=2e-06, sa_to_vol=1924.052712727801, drip_node_id=148, drip_node_loc=(1.736771, 2.700067, 14.216883)),\n",
" Flow(num_cylinders=4, projected_area=0.0012679984136685896, surface_area=0.0043875954238933096, angle_sum=-1.1103646559240672, volume=4.9999999999999996e-06, sa_to_vol=3681.4517891642977, drip_node_id=150, drip_node_loc=(1.476039, 2.744678, 14.221036)),\n",
" Flow(num_cylinders=1, projected_area=0.00026175097799692134, surface_area=0.0008268043545717619, angle_sum=0.20259148846207123, volume=1e-06, sa_to_vol=826.8043545717619, drip_node_id=159, drip_node_loc=(1.298384, 2.459679, 14.389457)),\n",
" Flow(num_cylinders=3, projected_area=0.0008824774277666259, surface_area=0.0032463019367339413, angle_sum=-1.7087376025874943, volume=3e-06, sa_to_vol=3246.3019367339416, drip_node_id=164, drip_node_loc=(1.047176, 2.391643, 14.266511)),\n",
" Flow(num_cylinders=2, projected_area=0.0006600186476422296, surface_area=0.0023746199311056493, angle_sum=0.534393748750537, volume=3e-06, sa_to_vol=1719.5271769974715, drip_node_id=175, drip_node_loc=(1.730164, 2.302889, 14.604732)),\n",
" Flow(num_cylinders=2, projected_area=0.0004876054032408554, surface_area=0.001917581031861406, angle_sum=1.1425108485836808, volume=3e-06, sa_to_vol=1179.8879529087187, drip_node_id=179, drip_node_loc=(1.652252, 2.280224, 14.47647)),\n",
" Flow(num_cylinders=1, projected_area=0.00041651108754572896, surface_area=0.0014212408085207547, angle_sum=-0.4465420656788475, volume=2e-06, sa_to_vol=710.6204042603774, drip_node_id=183, drip_node_loc=(1.455036, 2.239273, 14.49977)),\n",
" Flow(num_cylinders=2, projected_area=0.0012733736410329834, surface_area=0.004064592575214475, angle_sum=-0.3665923044681696, volume=4.9999999999999996e-06, sa_to_vol=1666.127955868079, drip_node_id=187, drip_node_loc=(1.917529, 2.347151, 14.212591)),\n",
" Flow(num_cylinders=0, projected_area=0.0, surface_area=0.0, angle_sum=0.0, volume=0.0, sa_to_vol=0.0, drip_node_id=189, drip_node_loc=(1.984224, 2.47876, 14.194845)),\n",
" Flow(num_cylinders=6, projected_area=0.0022330283517565724, surface_area=0.007333246943678708, angle_sum=2.127804515876493, volume=9.999999999999999e-06, sa_to_vol=4446.06831715825, drip_node_id=193, drip_node_loc=(1.583993, 2.563848, 13.968024)),\n",
" Flow(num_cylinders=1, projected_area=0.00020343043979622444, surface_area=0.0006478435290600194, angle_sum=0.2846026246124941, volume=1e-06, sa_to_vol=647.8435290600194, drip_node_id=198, drip_node_loc=(1.284843, 2.628993, 14.019867)),\n",
" Flow(num_cylinders=3, projected_area=0.0007860084747630203, surface_area=0.003617512524682111, angle_sum=-2.5833501908977685, volume=4.9999999999999996e-06, sa_to_vol=2085.8447343876755, drip_node_id=208, drip_node_loc=(1.325472, 2.856421, 14.043133)),\n",
" Flow(num_cylinders=2, projected_area=0.0006471769977986668, surface_area=0.0020395847825635657, angle_sum=0.26090730746353386, volume=2e-06, sa_to_vol=2039.584782563566, drip_node_id=209, drip_node_loc=(1.435887, 2.797216, 14.208758)),\n",
" Flow(num_cylinders=8, projected_area=0.0017034251569991014, surface_area=0.007463890074178239, angle_sum=5.354426428330182, volume=8.999999999999999e-06, sa_to_vol=6831.314685414667, drip_node_id=214, drip_node_loc=(1.178362, 2.670965, 14.017909)),\n",
" Flow(num_cylinders=3, projected_area=0.0012809041391582444, surface_area=0.004173213141212342, angle_sum=0.3207042500076585, volume=6e-06, sa_to_vol=2086.606570606171, drip_node_id=219, drip_node_loc=(1.152153, 2.815179, 13.969726)),\n",
" Flow(num_cylinders=2, projected_area=0.0008570559793830896, surface_area=0.0027383692365015432, angle_sum=-0.10344238545184348, volume=4e-06, sa_to_vol=1369.1846182507718, drip_node_id=222, drip_node_loc=(1.607588, 2.540239, 13.949144)),\n",
" Flow(num_cylinders=0, projected_area=0.0, surface_area=0.0, angle_sum=0.0, volume=0.0, sa_to_vol=0.0, drip_node_id=227, drip_node_loc=(1.868195, 2.555224, 13.948772)),\n",
" Flow(num_cylinders=18, projected_area=0.005313162793692856, surface_area=0.021339283807471944, angle_sum=10.274852917465788, volume=2.6e-05, sa_to_vol=14370.354273860652, drip_node_id=232, drip_node_loc=(1.920238, 2.162247, 13.938462)),\n",
" Flow(num_cylinders=7, projected_area=0.0029795345832851253, surface_area=0.013586461456943049, angle_sum=4.695171005225782, volume=1.8e-05, sa_to_vol=5378.31106616918, drip_node_id=242, drip_node_loc=(2.047486, 1.966398, 14.326444))]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# printing the first 20 flows found \n",
"myCollection.flows[0:20]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"The first element of the above array is always stemflow. The other flows are all drip flows (those that contribute to through fall) and are listed in no particular order. \\\n",
"Note also that each flow has a 'drip_node_loc' (drip node location) listed for each flow. This attribute refers to the x,y and z coordinates of the point at which a flow drops off of a branch to the ground. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In addition to defining 'myCollection.flows', the above functions set the attribute 'is_stem' for each cylinder. \\\n",
"By using 'is_stem', we can isolate the stemflow generating portion of the tree. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"2024.10.14 21:19:27.690 |MainThread | INFO | geometry.py:563 - draw_cyls() | model - Plotting cylinder collection\n",
"\n"
],
"text/plain": [
"2024.10.14 21:19:27.690 |MainThread | INFO | geometry.py:563 - draw_cyls() | model - Plotting cylinder collection\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"2024.10.14 21:19:27.904 |MainThread | INFO | geometry.py:563 - draw_cyls() | model - Plotting cylinder collection\n",
"\n"
],
"text/plain": [
"2024.10.14 21:19:27.904 |MainThread | INFO | geometry.py:563 - draw_cyls() | model - Plotting cylinder collection\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAGdCAYAAADUoZA5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0oElEQVR4nO3deXwUdZ7/8XeHI1FIBxFJQAIqIIjciBrcAVQUlXHIzqwHHqDiOeAPVofRqDseOAavUXZEwHUULwTRAXdQjkAaEAgIIWi4IncQk6CC6RAgQFK/P2qTECEhne70t6v79Xw8+jGPNNXpdwcmb79V9alyWZZlCQAAOEKU6QAAAKD2KG4AAByE4gYAwEEobgAAHITiBgDAQShuAAAchOIGAMBBKG4AABykoekAtVFWVqYffvhBsbGxcrlcpuMAABBQlmWpqKhIrVu3VlRUzWtqRxT3Dz/8oMTERNMxAACoV3v27FGbNm1q3MYRxR0bGyvJ/kBut9twGgAAAsvr9SoxMbGi72riiOIu3z3udrspbgBA2KrN4WBOTgMAwEEobgAAHITiBgDAQShuAAAchOIGAMBBKG4AAByE4gYAwEEobgAAHITiBgDAQShuAAAchOIGAMBBKG4AAByE4gYAwEEccXcwAEBwlZZKa9dKS5dKiYlSnz5Shw5SFMs94yhuAIAkad8+acECad48aeFC6eefq/652y316mWXePmjY0fKPNj8+nFPmDBBLpdLY8eOrXG7WbNmqXPnzoqJiVG3bt305Zdf+vO2AIAAOH5cWrlS+q//ki65RIqPl4YPlz7++OTSliSv116B/+1v0u23S507S82aSQMGSI88In30kbRli1RWFvSPElHqvOJes2aNpk6dqu7du9e43cqVKzVs2DClpqbqt7/9raZPn67k5GStW7dOXbt2revbAwDqID9fmj/fXlWnpUkHDvj3/YqKpGXL7Ee5pk2lnj2rrsw7dZIaNPDvvWBzWZZl+fqigwcPqnfv3nrzzTf1/PPPq2fPnnr99ddPue0tt9yi4uJizZ07t+K5yy+/XD179tSUKVNq9X5er1dxcXEqLCyU2+32NS4ARKzjx6WMDLuo58+XsrLM5LjzTun99828txP40nN12lU+atQoDRkyRIMGDTrtthkZGSdtN3jwYGVkZFT7mpKSEnm93ioPAEDt7N0r/eMf0k03SS1aSP37S6mp5kpbktLTJd+XiTgVn3eVz5gxQ+vWrdOaNWtqtX1+fr7i4+OrPBcfH6/8/PxqX5Oamqpnn33W12gAEJGOHZNWrKjcBf7tt6YTnWzvXmnbNvtkNvjHp+Les2ePxowZo7S0NMXExNRXJqWkpOiRRx6p+Nrr9SoxMbHe3g8AnGbPnsqiXrTIPtYc6jweijsQfCruzMxM7du3T7179654rrS0VMuWLdMbb7yhkpISNfjV2QcJCQkqKCio8lxBQYESEhKqfZ/o6GhFR0f7Eg0AwtrRo9Ly5XZRz5snbdxoOpHvPB7p/vtNp3A+n4r76quvVnZ2dpXn7r77bnXu3FmPPfbYSaUtSUlJSVq8eHGVkbG0tDQlJSXVLTEARIjduyuLevFiqbjYdCL/eDz2cW6Xy3QSZ/OpuGNjY08a4WrSpInOPvvsiueHDx+uc889V6mpqZKkMWPGaMCAAXr11Vc1ZMgQzZgxQ2vXrtVbb70VoI8AAOGhpMQeqyov6y1bTCcKrIICafNmqUsX00mcLeBXTsvNzVXUCZfR6devn6ZPn66nnnpKTzzxhDp27Kg5c+Ywww0AknbsqCxqj0c6dMh0ovrl8VDc/qrTHHewMccNIFwcPmxffaz8xLLvvjOdKLj+8Afp009Npwg9vvQc1yoHgHq2dWtlUS9ZYpd3pFqyxL4kKtc3rzuKGwAC7NAhu6DKd4Fv3246Uej4+WcpO1vq0cN0EueiuAHAT5Yl5eRUrqqXLrVPNMOpeTwUtz8obgCog+Ji+zKe5avqXbtMJ3IOj0c6zU0lUQOKGwBqwbLsUabyov7qK/uiKPDd0qVSaSl3C6srihsAqlFUZF/4pPzOWrm5phOFh8JCaf16+3af8B3FDQD/x7KkDRsqi3r5cvsGHgi89HSKu64obgARrbDQvknH/Pn24/vvTSeKDB6PNG6c6RTORHEDiCiWZd/2svxY9cqV0vHjplNFnq++svdmNGpkOonzUNwAwt6BA/aqunwXeF6e6UQ4eFDKzJQuv9x0EuehuAGEnbIy++Sn8lX1qlX2WcwILR4PxV0XFDeAsLB/v7RwoV3UCxbYd6JCaEtPl1JSTKdwHoobgCOVldm7WstX1V9/bT8H51ixwr7CXHS06STOQnEDcIyffrJX0/Pn2//744+mE8Efhw/b/8H1m9+YTuIsFDeAkFVaKq1ZU3kN8DVr7LPCET48HorbVxQ3gJBSUFB5rHrhQvtuUghfHo/0l7+YTuEsFDcAo44ft3eXlh+rzsw0nQjBtHKlvcv8jDNMJ3EOihtA0OXnV+7+Tkuz56wRmY4elTIypKuuMp3EOShuAPXu+HH7l3P5qnr9etOJEEo8HorbFxQ3gHqxd2/lqnrRIvua4MCpeDymEzgLxQ0gII4ds+dyyy8r+u23phPBKVavloqLpSZNTCdxBoobQJ3t2VN1VV1UZDoRnOj4cfsWqoMHm07iDBQ3gForKbF/wZaX9caNphMhXHg8FHdtUdwAarRrV2VRL15s79IEAo3j3LVHcQOo4sgR+17J5WeAb9liOhEiQWam5PVKbrfpJKGP4gagHTsqi9rjkQ4dMp0Ikaa01P4PxiFDTCcJfRQ3EIEOH5aWLq08A/y770wnAuzbfFLcp0dxAxFi69bKovZ47F3iQCjhOHftUNxAmDp0yP5FWH5i2fbtphMBNVu/Xtq/X2re3HSS0EZxA2HCsqScnMqiXrrUHt8CnMKypGXLpORk00lCG8UNONjBg/aquvzEsl27TCcC/OPxUNynQ3EDDmJZ0ubNlUX91Vf23ZWAcJGebjpB6KO4gRBXVGRf+KT8xLLcXNOJgPqzYYP044/SOeeYThK6KG4gxFiW/curfFW9fLl9LWcgUixZIt10k+kUoYviBkJAYaF9k4758+3H99+bTgSY4/FQ3DWhuAEDLEv65pvKM8BXrmRVDZRjnrtmFDcQJAcOSGlplavqvDzTiYDQtGWL9MMPUuvWppOEJoobqCdlZVJWVuWqetUq+3rMAE5vyRLptttMpwhNFDcQQPv3SwsX2kW9YIFUUGA6EeBMHg/FXR2KG/BDWZl9O8LyM8C//tp+DoB/OM5dPYob8NFPP9mr6fJV9U8/mU4EhJ/t2+1rFrRtazpJ6KG4gdMoLZXWrKm8AMqaNfZZ4QDql8cjjRhhOkXoobiBUygosFfT8+fbx6x//tl0IiDyUNynRnEDsmeoV6+uPAM8M9N0IgAej713y+UynSS0UNyIWHl5lceq09LsOWsAoSM3V9q5U7rgAtNJQgvFjYhx7Jg9S11+Bvj69aYTATgdj4fi/jWKG2Ft797K3d+LFtnXBAfgHOnp0siRplOEFoobYeXYMWnFispVdXa26UQA/MFx7pNR3HC8PXsqR7UWLbLvXw0gPOTlSd99J3XqZDpJ6KC44TglJfY9qsvLeuNG04kA1CePh+I+EcUNR9i1q7KoFy+WiotNJwIQLB6P9OCDplOEDoobIenIEemrryqPVW/ZYjoRAFM4zl0VxY2QsWNHZVF7PNKhQ6YTAQgFP/5oHxLr2tV0ktAQ5cvGkydPVvfu3eV2u+V2u5WUlKR58+ZVu/20adPkcrmqPGJiYvwOjfBw+LC963vMGOnCC6X27aXRo6UvvqC0AVTF3cIq+bTibtOmjSZMmKCOHTvKsiy99957Gjp0qLKysnTxxRef8jVut1s5OTkVX7vY1xHRtm6tXFUvWWLvEgeA0/F4pIcfNp0iNPhU3DfeeGOVr//6179q8uTJWrVqVbXF7XK5lJCQUPeEcLRDh+z/w5WfWLZ9u+lEAJxoyRL7XvdRPu0nDk91PsZdWlqqWbNmqbi4WElJSdVud/DgQbVr105lZWXq3bu3XnjhhWpLvlxJSYlKSkoqvvZ6vXWNiSCzLCknp7Koly61x7cAwB8HDkjffCP16mU6iXk+F3d2draSkpJ05MgRNW3aVLNnz1aXLl1OuW2nTp30zjvvqHv37iosLNQrr7yifv36aePGjWrTpk2175Gamqpnn33W12gw5OBB+7KE5ZcW3bXLdCIA4cjjobglyWVZluXLC44eParc3FwVFhbq008/1dtvv62lS5dWW94nOnbsmC666CINGzZM48ePr3a7U624ExMTVVhYKLfb7Utc1APLkjZtqizqr76Sjh41nQpAuPvtb6V//ct0ivrh9XoVFxdXq57zecXduHFjdejQQZLUp08frVmzRhMnTtTUqVNP+9pGjRqpV69e2rZtW43bRUdHKzo62tdoqEder72qLt8FnptrOhGASLNsmXT8uNQwwgeZ/f74ZWVlVVbHNSktLVV2drZuuOEGf98W9cyypA0bKs8AX77c/j8MAJji9UpZWVLfvqaTmOVTcaekpOj6669X27ZtVVRUpOnTp2vJkiVasGCBJGn48OE699xzlZqaKkl67rnndPnll6tDhw765Zdf9PLLL2v37t269957A/9J4LfCQvsmHeWr6r17TScCgKo8Horbp+Let2+fhg8frry8PMXFxal79+5asGCBrrnmGklSbm6uok44V//AgQO67777lJ+fr7POOkt9+vTRypUra3U8HPXPsuyzNMtX1StX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77zzFBMTo8suu0xff/11jdvPmjVLnTt3VkxMjLp166Yvv/wySEnrjy8/g2nTpp30dx0TExPEtIG1bNky3XjjjWrdurVcLpfmzJlz2tcsWbJEvXv3VnR0tDp06KBp06bVe8764uvnX7JkyUl//y6XS/n5+cEJHGCpqanq27evYmNj1bJlSyUnJysnJ+e0rwvH3wP+orgNuv3227Vx40alpaVp7ty5WrZsme6///7Tvu6+++5TXl5exeOll14KQlr/zJw5U4888oiefvpprVu3Tj169NDgwYO1b9++U26/cuVKDRs2TCNHjlRWVpaSk5OVnJysDRs2BDl54Pj6M5DsK0id+He9e/fuICYOrOLiYvXo0UOTJk2q1fY7d+7UkCFDdOWVV2r9+vUaO3as7r33Xi1YsKCek9YPXz9/uZycnCr/Blq2bFlPCevX0qVLNWrUKK1atUppaWk6duyYrr32WhUXF1f7mnD8PRAQFozYtGmTJclas2ZNxXPz5s2zXC6XtXfv3mpfN2DAAGvMmDFBSBhYl156qTVq1KiKr0tLS63WrVtbqampp9z+5ptvtoYMGVLlucsuu8x64IEH6jVnffL1Z/Duu+9acXFxQUoXXJKs2bNn17jNn//8Z+viiy+u8twtt9xiDR48uB6TBUdtPr/H47EkWQcOHAhKpmDbt2+fJclaunRptduE4++BQGDFbUhGRoaaNWumSy65pOK5QYMGKSoqSqtXr67xtR999JFatGihrl27KiUlRYcOHarvuH45evSoMjMzNWjQoIrnoqKiNGjQIGVkZJzyNRkZGVW2l6TBgwdXu32oq8vPQJIOHjyodu3aKTExUUOHDtXGjRuDETckhNu/gbrq2bOnWrVqpWuuuUYrVqwwHSdgCgsLJUnNmzevdhv+DZyaI24yEo7y8/NP2uXVsGFDNW/evMZjWLfddpvatWun1q1b69tvv9Vjjz2mnJwc/fOf/6zvyHX2008/qbS0VPHx8VWej4+P15YtW075mvz8/FNu79Tje3X5GXTq1EnvvPOOunfvrsLCQr3yyivq16+fNm7cGBE33anu34DX69Xhw4d1xhlnGEoWHK1atdKUKVN0ySWXqKSkRG+//bYGDhyo1atXq3fv3qbj+aWsrExjx47VFVdcoa5du1a7Xbj9HggUijvAHn/8cb344os1brN58+Y6f/8Tj4F369ZNrVq10tVXX63t27erffv2df6+CD1JSUlKSkqq+Lpfv3666KKLNHXqVI0fP95gMgRDp06d1KlTp4qv+/Xrp+3bt+u1117TBx98YDCZ/0aNGqUNGzZo+fLlpqM4EsUdYI8++qjuuuuuGre54IILlJCQcNJJScePH9f+/fuVkJBQ6/e77LLLJEnbtm0L2eJu0aKFGjRooIKCgirPFxQUVPtZExISfNo+1NXlZ/BrjRo1Uq9evbRt27b6iBhyqvs34Ha7w361XZ1LL73U8WU3evToipNxT7fnKNx+DwQKx7gD7JxzzlHnzp1rfDRu3FhJSUn65ZdflJmZWfHa9PR0lZWVVZRxbaxfv16SvVstVDVu3Fh9+vTR4sWLK54rKyvT4sWLq6woT5SUlFRle0lKS0urdvtQV5efwa+VlpYqOzs7pP+uAync/g0Ewvr16x37929ZlkaPHq3Zs2crPT1d559//mlfw7+Bapg+Oy6SXXfddVavXr2s1atXW8uXL7c6duxoDRs2rOLPv//+e6tTp07W6tWrLcuyrG3btlnPPfectXbtWmvnzp3W559/bl1wwQVW//79TX2EWpsxY4YVHR1tTZs2zdq0aZN1//33W82aNbPy8/Mty7KsO++803r88ccrtl+xYoXVsGFD65VXXrE2b95sPf3001ajRo2s7OxsUx/Bb77+DJ599llrwYIF1vbt263MzEzr1ltvtWJiYqyNGzea+gh+KSoqsrKysqysrCxLkvW3v/3NysrKsnbv3m1ZlmU9/vjj1p133lmx/Y4dO6wzzzzTGjdunLV582Zr0qRJVoMGDaz58+eb+gh+8fXzv/baa9acOXOsrVu3WtnZ2daYMWOsqKgoa9GiRaY+gl8eeughKy4uzlqyZImVl5dX8Th06FDFNpHweyAQKG6Dfv75Z2vYsGFW06ZNLbfbbd19991WUVFRxZ/v3LnTkmR5PB7LsiwrNzfX6t+/v9W8eXMrOjra6tChgzVu3DirsLDQ0Cfwzd///nerbdu2VuPGja1LL73UWrVqVcWfDRgwwBoxYkSV7T/55BPrwgsvtBo3bmxdfPHF1hdffBHkxIHny89g7NixFdvGx8dbN9xwg7Vu3ToDqQOjfLzp14/yzzxixAhrwIABJ72mZ8+eVuPGja0LLrjAevfdd4OeO1B8/fwvvvii1b59eysmJsZq3ry5NXDgQCs9Pd1M+AA41WeXVOXvNFJ+D/iL23oCAOAgHOMGAMBBKG4AAByE4gYAwEEobgAAHITiBgDAQShuAAAchOIGAMBBKG4AAByE4gYAwEEobgAAHITiBgDAQShuAAAc5P8DvGIhMlVNZokAAAAASUVORK5CYII=",
"text/plain": [
"