{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "a045a688",
   "metadata": {},
   "source": [
    "# **Facility location problem**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8302aba0",
   "metadata": {},
   "source": [
    "***facility_location.ipynb***\n",
    "\n",
    "A facility location problem to select the location of parks over a set of candidate sites that are meant to serve public schools at minimum (average or maximum) distance.\n",
    "\n",
    "&copy; Copyright 2025 Fair Isaac Corporation\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n",
    " \n",
    "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n",
    "\n",
    "This example uses FICO&reg; Xpress software. By running it, you agree to the Community License terms of the [Xpress Shrinkwrap License Agreement](https://www.fico.com/en/shrinkwrap-license-agreement-fico-xpress-optimization-suite-on-premises) with respect to the FICO&reg; Xpress software. See the [licensing options](https://www.fico.com/en/fico-xpress-trial-and-licensing-options) overview for additional details and information about obtaining a paid license."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "908cca61",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install the xpress package\n",
    "%pip install -q xpress"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa44a630",
   "metadata": {},
   "source": [
    "## Problem description and formulation\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0aa71950",
   "metadata": {},
   "source": [
    "There are $n$ public schools in a region. The administration wants to create parks (or gyms, swimming pools, etc.) that can be used by these schools and has $m$ abandoned areas, currently unused, that could be converted for this purpose. The coordinates of both the public schools and the abandoned areas are therefore known. For budget reasons, the administration can only open $p$ parks.\n",
    "\n",
    "We formulate and solve the problem of choosing the $p$ parks among the abandoned areas in such a way as to minimize one of the following two objective functions:\n",
    "\n",
    "* the average (i.e. the sum divided by the number of schools) of the distances between each school and the closest (open) park;\n",
    "* the maximum, calculated on the set of schools, of the distance between the school and the closest park.\n",
    "\n",
    "The **binary variables $serves_{i,j}$** indicate if school $i \\in SCHOOLS$ is served (=1) by the candidate site $j \\in SITES$  or not (=0). The **binary variables $build_j$** indicate if a certain candidate site $j$ is selected for creating a park (=1) or not (=0). \n",
    "\n",
    "$$\\min \\frac{\\sum_{i \\in \\mathcal{I}} \\sum_{j \\in \\mathcal{J}} dist_{i,j} \\cdot serves_{i,j}}{|SCHOOLS|}$$\n",
    "\n",
    "Subject to:\n",
    "\n",
    "* Every school must be served by one park:\n",
    "$$\\sum_{j \\in SITES} serves_{i,j} = 1, \\qquad \\forall i \\in SCHOOLS$$\n",
    "\n",
    "* Exactly $n$ parks are built:\n",
    "$$\\sum_{j \\in SITES} build_{j} = p, \\qquad \\forall j \\in SITES$$\n",
    "\n",
    "* Only parks that are built can serve schools:\n",
    "$$\\sum_{i \\in SCHOOLS} serves_{i,j} \\leq n \\cdot build_{j}, \\qquad \\forall j \\in SITES$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4b894ed",
   "metadata": {},
   "source": [
    "## Data preparation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2ffd5dd",
   "metadata": {},
   "source": [
    "We start by importing the necessary modules, to then create random coordinates for school and candidate sites to calculate the distances between schools and sites. \n",
    "\n",
    "For a different instance, change the value of *rndseed*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cff7654f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import xpress as xp\n",
    "import numpy as np\n",
    "import networkx as nx\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "rndseed = 10\n",
    "np.random.seed(rndseed)\n",
    "\n",
    "num_parks = 4    # Number of parks to be built.\n",
    "num_schools = 9  # Number of schools to be served.\n",
    "num_sites = 11   # Number of candidate sites to build parks.\n",
    "\n",
    "SCHOOLS = range(num_schools)  # Set of schools.\n",
    "SITES = range(num_sites)      # Set of candidate sites.\n",
    "\n",
    "coord_schools = 10 * np.random.random((num_schools, 2))  # x-y coordinates between 0 and 10 (in km).\n",
    "coord_sites   = 10 * np.random.random((num_sites, 2))\n",
    "\n",
    "# Create a dictionary with the distances between schools and candidate sites.\n",
    "dist = {(i,j): np.linalg.norm([coord_schools[i] - coord_sites[j]]) for i in SCHOOLS for j in SITES}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55ee1038",
   "metadata": {},
   "source": [
    "Now we define a function to be used for solution visualization using `matplotlib` and plot the points for schools (blue) and sites (grey)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "534dd7e0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Schools (blue) and candidate sites for parks (grey):\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAIvCAYAAABuhDEcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPU1JREFUeJzt3Ql4lNXZ//FfQgiELciesCMEBZSdCq+yKCigoEUs1n3p69KK9q27raV/VNRiba1UrW9V0GKrRfta3EGhIouIxaossu+brGELS8j/uk86ELI+AzPzzDPz/VxXriTPPCM3i5nfnHOfc1IKCgoKBAAAEECpfhcAAABwoggyAAAgsAgyAAAgsAgyAAAgsAgyAAAgsAgyAAAgsAgyAAAgsAgyAAAgsNK83HTkyBFt2LBBNWvWVEpKSvSrAgAASa2goEC7d+9Wdna2UlNTTy7IWIhp2rRpJOsDAACo0Nq1a9WkSZOTCzI2EhP6j9WqVcvLUwAAAE5Ybm6uG0QJZZCTCjKh6SQLMQQZAAAQKxW1tNDsCwAAAosgAwAAAosgAwAAAosgAwCImunTp7seh9I+5syZ43d5SACemn0BADgZt99+u7p3737ctdatW/tWDxIHQQYAEHXnnHOOhg8f7ncZSEBMLQEAYsJ2aT18+LDfZSDBEGQAAFF3/fXXu33Iqlatqn79+mnevHl+l4QEwdQSACBq0tPTdemll2rw4MGqV6+eFi5cqCeeeMJNNc2aNUudO3f2u0QEXEqBncrkYZvgzMxM7dq1i519AQAnZdmyZTrzzDPVu3dvvf/++36XgzjlNXswtQQAiClbrXTxxRdr2rRpys/P97scBBxBBgAQc3YY4MGDB7V3716/S0HAEWQAADG3YsUK1/hbo0YNv0tBwBFkAABR891335W49u9//1v/+Mc/dP755ys1lZchnBxWLQEATsiRI9KmTVJenmQDK/XrSykpx98zYsQIZWRkqFevXmrQoIFbtfT888+rWrVqeuyxx/wqHQmEIAMACMvu3dKUKdIHH0g7dhy73qSJNGiQ1KePLbsuvHbJJZdo4sSJevLJJ90qlPr162vYsGEaNWoURxQgIlh+DQDwbN066aGHpJ07peKvHjYaY9datZIeeEDi5QIng+XXAICIsvAyerS0a1fJEGNC11atkmzWiNMIEAsEGQCAJ+++a++SC3tjymOPL1smzZ0bq8qQzAgyAIAKHTxY2BdTUYgJscVIFnyAaCPIAAAqtGKFFM7edRZ4liyR9u+PZlUAQQYA4MGJBhKCDKKNIAMAqFBGRmyfB3hFkAEAVMiWVFev7v1+65HJySHIIPoIMgCACtkGdwMGFAYUrz0ygwdHuyqAIAMA8MiCie1LVlGYscdt094ePWJVGZIZQQYA4Ent2tIvfyllZpY8U8mErrVoId1/v5TGITiIAf6ZAQA8s/OUnnhCmjpVev/9489aaty4cNSmd+9jZy0B0UaQAQCEpWZN6fvfly6+uOLTr4FoI8gAAE6I9cJkZ/tdBZIdPTIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDIAACCwCDI+27Nnj0aNGqWBAweqTp06SklJ0fjx40u99/XXX9dZZ52l2rVrq27duurTp4/eeeedmNcMAEC8IMj4bOvWrRo9erQWLVqkjh07lnnf008/rREjRqhevXp67LHH9OCDD2rXrl266KKL9Oabb8a0ZgAA4kWa3wUku6ysLG3cuFGNGjXSvHnz1L179zKDjD02efJkN2pjbrjhBjVu3FgTJkzQsGHDYlw5AAD+Y0TGZ1WqVHEhpiK5ublq0KDB0RBjatWqpRo1aigjIyPKVQIAEJ8IMgHRt29fvf/++25kZtWqVVq8eLF+8pOfuOmlO+64w+/yAADwBVNLAfH73//e9dPcfvvt7sNYv8xHH32knj17+l0eAAC+IMgERLVq1dS2bVs1adLENfju3r1bv/3tb11vzIwZM9S6dWu/SwQAIOYIMgFx2WWXKS0tzTX7hlx88cVq06aNfv7zn+u1117ztT4AAPxAj0wArFixwvXHDB069Ljrtu/M2WefrZkzZ/pWGwAAfiLIBMDmzZvd5/z8/BKPHTp0SIcPH/ahKgAA/EeQCQDrf0lNTXXTRwUFBUevr1u3zvXHdO7c2df6AADwCz0yMT6OYNmyZW7JtLE9YCykvPLKK9q5c6c2bNjgrlsfjIUUM3LkSNWvX99tfvenP/1J5513nmvwtWbfZ555Rvv379f999/v6+8LAAC/pBQUfYtfzmZsmZmZ7gXYNmFDeA4cOKBZs2ZpzZo1Rze0sz92+9o+33vvvUenj4pbuXKlWrRo4aaPnnvuOb3wwgsuDBnb6deOKujXr19Mfz8AAESb1+xBkIlBiHnvvffcn2FZf9QWaGx33sGDB6t69eoxrxEAgHjjNXvQIxNls2fPLjfEGHvMpog++eSTmNYGAEDQEWSiaO/evVq9enW5ISbE7tmyZYu2b98ek9oAAEgEBJkosl6Wooc8VsTuXbp0aVRrAgAgkRBkosimlMJhozLhPgcAgGRGkIkzXqahAABAIYJMFNWsWTOs+21qiVVhAAB4R5CJItvsLpwRFrvXDoEEAADeEGSiyHbubdq0qaeGX7unXr16qlu3bkxqAwAgERBkoqxXr15uk7vywow9VqVKFfXp0yemtQEAEHQEmSirWrWq27E3KyvLfV800IS+tpGYCy+80I3gAAAA7zg0Mgbs+IEBAwa4bZZtnxj7bP0w1gxsPTF16tTxu0QAAAKJIBNDdmZEt27d/C4DAICEwdQSAAAILIIMAAAILIIMAAAILIIMAAAILIIMAAAILIIMAAAILIIMAAAILIIMAAAILIIMAAAILIIMImLBggW67LLL1KpVK1WrVs2dH9W7d29NnjzZ79IAAAmMIwoQEatXr9bu3bt17bXXKjs7W/v27dMbb7yhoUOH6o9//KNuuukmv0sEACSglAI7vbACubm57pwgO+ywVq1asakMgZefn6+uXbsqLy9Pixcv9rscAECAeM0eTC0haipVqqSmTZtq586dfpcCAEhQTC0hovbu3av9+/e7BP2Pf/xD7733nkaMGOF3WQCABEWQQUTdeeedrifGpKamatiwYRo3bpzfZQEAEhRTS4ion/70p5oyZYomTJigQYMGuT6ZgwcP+l0WgCL27NmjUaNGaeDAgapTp45SUlI0fvx4v8sCTghBBhF12mmnqX///rrmmmv09ttvux+YQ4YMkYeecgAxsnXrVo0ePVqLFi1Sx44d/S4HOCkEGUTV8OHD9fnnn2vJkiV+lwLgP7KysrRx40a3bcLYsWP9Lgc4KQQZRJU1/hpr/gUQH6pUqaJGjRr5XQYQEQQZRMSWLVtKXDt06JBefvllZWRkqF27dr7UBQBIbKxaQkTcfPPNbvMiO5agcePG2rRpkyZOnOg2wvvNb36jGjVq+F0iACABEWRQrg0bpA8/lL78UsrLk6pXl3r2lM47TzrllGP32V4xL7zwgp599llt27ZNNWvWdLv6Pv744+6YAgAAooEgg1IdPiw9/7w0fbrtByMdOVJ4fft2ad06adIka+SVLr1USkmRLr/8cvcBAEAsEWRQgoWWJ5+Uvvji2PdF2Upq+3j9denAAenKK30pEwAAmn1R0j//Kc2bVxhWKvLWWxIrqwEAfiHI4DgWXt59t3C6yAubdvrgg2hXBQBA6ZhawnHWr5dWr/Z+v007zZplq5ak9PRoVgYgkuwMNDuZfoN19EuaPHmy1lkDnKSRI0cqMzPT5woBb1IKPOwdb8tq7R+1bWpWq1Ytj/9pBNFXX0kPPxz+8559VqpbNxoVAfDCjjSbM0eaP1/at0+qVk3q3Fk666zS32S0aNHC7exbmpUrV7rHAT95zR6MyOA4aWmxfR6Akzd1qjRxorR377FVhvZ55kzpxRelq66S+vc//jmrVq3yq1wgonj5wXEaNz5+ubUXNgJds2Y0qwJQXsO9hZiQ0P+7oc82OmNbKezZI11yiT81AtFEsy9KhBIbirYw44U1BV9wgff7AUSOrRgsGmLK8+qrrDBEYuLlByVcdJG3pdcWYqpUKTlkDSA2bIWh1zcRdp/dDyQaggxKaN1auuWWwqBS1jJs+6FofTH33ivVrh3rCgFYP4w193qdBrb77H6bYgISCUEGperXT7rvPqlZs2PBpVKlY+/+Tj9deughqX17X8sEktbWreH1shm7f9u2aFUEHPPFF19o4MCBbrWRnb13/vnn60s7tC8KaPZFmWzpZqdO0rJl0tdfFx4aaYdYd+smZWf7XR2Q3LxuWhmp5wFe/etf/9LZZ5+tpk2batSoUTpy5IieeeYZ9enTR3PnzlXbtm0VSQQZVPhDr02bwg8A8aNevcJR0vx878+x+9nvCdH24IMPKiMjQ7Nnz1bd//yDu+qqq5STk6MHHnhAb7zxRkR/PaaWACCAbMO7nj3Da/a1+6tXj3ZlSHYzZsxQ//79j4YYk5WV5UZk3n77be2JcKMWQQYAAmrw4PCafQcNinZFgHTgwAE3IlNctWrVdPDgQX3zzTcR/fUIMgAQ4BWG11zj7V67jylixIL1wMyZM0f5ReY9LcB89tln7uv1dqhfBBFkACDg+z79+MfHdtcOTTWFPtt1e9zuA2Lhxz/+sZYsWaIbb7xRCxcudCMw11xzjTZu3Oge379/f0R/PZp9ASDg+vaVzj5bmjvXVozYC4VkI/tdukg9enAWGmLrlltu0dq1azV27FhNmDDBXevWrZvuuecePfLII6phy18jiNOvAQBAxO3YsUMLFixw+eGMM85wK5YeffRRd61du3YVPp/TrwEAgG9OOeUUt59MyNSpU9WkSROddtppEf116JEBAABR9dprr+nzzz/XT3/6U6VG+JRhRmQAAEDEfPLJJxo9erQ7lsD2krEVTC+99JI7suCOO+5QpBFkAABAhayldvPmzVqxYoX27t3rRlbq1KmjNm3aHNfA27hxY1WqVMk1++7evVstW7bUww8/rJ/97GdKi0LnOc2+AACgXNu3b3cjLZYDUlJSXKgxoa9btGihXr16qXLlyooUr9mDHhkAAFCmbdu26d1333XBwhQd/wh9vXr1an3wwQc6fPiwYo0gAwAASmUnV3/88cfuc3kTOPaYjdrYydexRpABAAClWrdunfbt21duiAmxe2xH30OHDimWCDIAAKBUFkysD8YrO19p1apViiWCDAAAKJU12noZjQmxlUy2UimWCDIAAKBU4YzG+IUgAwAASmXLn8MJM9YUbM+JJYIMAAAoVdu2bcOaWrIN75o3b65YIsgAAbJnzx6NGjXKbfVtO2raO6Xx48eXuG/u3Ln68Y9/rK5du7oNqoIwPAwg/mRnZ7tde73+DLEDIaOxe295CDJAgGzdutWdYbJo0SJ17NixzPts86o//elP7odPq1atYlojgMSRmpqq8847z4WTisJMw4YN1alTJ8UaQQYIkKysLG3cuNHtomnnmJTl1ltvdasN5s2bpwEDBsS0RgCJpXbt2rrwwgvdAZDGAk3oI/R9Tk6O+1ljZyzFGodGAgFSpUoVNWrUqML77J0RAESKNfBamLHde5cvX+42ybPRmlNOOUWtW7dW1apV5ReCDAAA8MR68+wjnjC1BAAAAosgAwAAAosgAwAAAosgAwAAAosgAwAAAosgAwAAAovl10CcssPX1q1bp9zcXPd9zZo11aRJ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lQTAVwQZAGGx4JKenu53GQDg0CMDAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAACiyADAAA82bNnj0aNGqWBAweqTp06SklJ0fjx40u998iRI3r22WfVqVMnZWRkqG7dujr33HP173//W5GUFtH/GgAASFhbt27V6NGj1axZM3Xs2FHTp08v894bbrhBEydO1DXXXKPbbrtNe/fu1fz587Vly5aI1kSQAQAAnmRlZWnjxo1q1KiR5s2bp+7du5d63+uvv64JEybozTff1Pe//31FE1NLAADAkypVqrgQU5Enn3xSPXr0cCHGpphsNCZaCDIAACBicnNzNXfuXDda88ADDygzM1M1atRQq1at3EhNpDG1BAAAImb58uUqKCjQX//6V6WlpenXv/61CzNPPfWULr/8ctWqVcs1C0cKQQYAAER0ZZPZtm2b5syZo+9973vu+6FDh6ply5Z6+OGHIxpkmFoCAAARY0utjYWWUIgxNr00ZMgQN+10+PDhiP16BBkAABAx2dnZ7nPDhg1LPNagQQMdOnQoos2/BBkAABDRIGMrm9avX1/isQ0bNqhq1aqqWbNmxH49gowPOx7a9bI+BgwY4EvtAABEyogRI7R27VpNmTLluM303nrrLbe7b2pq5OIHzb4+7Hj4yiuvlLhmGwtZR/f5558fg0oBAPDG9oEJvdk248aN086dO93oipk8ebLWrVvnvh45cqRboXT//fe7pdaXXnqpfvazn7lrzz33nJtWGjNmjCIppcDWSHlYE25F7Nq1yy2bQukOHDigHTt2HLfj4UsvvaTrrruuwuf+6Ec/0osvvqg1a9aoSZMmMakXAIDSWA/L0qVLtWTJEu3fv99ds9f/tm3bavDgwVq9enWpz1u5cqVatGjhvl6xYoXuuusuffTRRy7A9OzZU4899liZuwGfaPZgRMaHHQ9LC0BvvPGG+vTpQ4gBAPi+D8zMmTPd10XHOixYfP75525E5bzzziu1mbco2wDPjiiINnpk4sC7777rhumuvPJKv0sBACSxVatW6dNPP3UBpqwJG1s6bb0vtk9MPCDIxAE7HdRGc4YPH+53KQAQ92zKw3aItRHsatWq6bTTTnP9ifv27fO7tEDLz8/X7NmzK7zPAo71zXi5NxaYWvKZDdW98847bs6xdu3afpcDAHHNVsLYYYTWO3Hbbbe5FaL2gmorRr/44gu3KgYnPhpz8OBBT/damLERGfuoW7eu/ESQ8Zn1xuTl5TGtBAAe2KpPm4q36Y/27du7azfddJMbIXj55ZfdgotTTjnF7zIDG2TCYauY7Dl+BxmmluJgWsneWVx00UV+lwIAgRjFNsUbTbOystzeJOnp6T5VFnz7/7M6KdzFKn4jyPho48aNmjZtmltnbz0yAIDy9e3b132+8cYb9eWXX7qpptdee03PPvusbr/9dlWvXt3vEgMrLS38SZpKlSrJbwQZH9kR5zYcyrQSAHhjO6c/9NBDbtVM586d3Qak1vhrG7H99re/9bu8QGvYsOHRTe+89snY2Ul+o0fmJNgGP9u3b3dL0ezsCGs6+8Mf/lDhjodFp5XsTIrQOwwAQMVsw7XevXu70Wzrz7AFE7a3ie3jZQ3AODE5OTn66quvPN9vMwkWJP3Gzr4nwP48Fi5cqGXLlrnlaiE2pHnHHXccDTHl7Xj47bffuiWDtnXzb37zm5jVDgBBH8m+4YYb3I6zRTcQvf76692W+LY7ut/Np0E2c+ZM99rmha0eO/3006NWi9fsQZAJ06ZNm9x2yxZgyvqjs455OzPJRmkAAJFjIzH28ze082zI3//+dw0bNsxNOfXv39+3+oIuPz/f9W6WdnJ1Ue3atVO3bt3CmooKl9fsQY9MGOwPc+rUqW4qqbz8Z1NLdp/1vwAAImfz5s3HjYQXneo39vMZJ86ad+10ajsPqUaNGiUetxYKC5P2eDRDTDjokQnD119/7SmchDYKsm765s2bx6Q2AEiWPo4PP/zQTS3Z1yF/+ctf3PLrM88809f6EkFqaqobcbFpIwuOdoCkhRYbHYnHaTuCjEe2aZ31uHiYiXPsL33x4sUEGQDwYOdOafp0yVoM7f2ibRPTp49UfFHM3Xffrffee0/nnHOOa+y1F9a3337bXfvRj37kFlAgMux17EQOQo41goxH3333XVhTRRZ4rJ/GPsfL8BsAxBvbg+2FF6RPP7Wfm/bieeyxv/1N6tpVuvlmKXSCi01rzJo1S7/61a/0zDPPuNHvli1b6pFHHtE999zj2+8D/iHIeBSafw2XzddWrlw54vUAQCKEmF/+0s5PKhyFMcUHvefPl37+c+mRR46FGVst8+6778a+YMQlmn09OpGdd20k5kR2SgSAZGAjMUVDTGnssW3bpKeeimVlCBKCTBg7HoYTSizE2EZBTCsBQOk9MTad5GXG3u5ZsEBasyYWlSFoCDIeWYixDnmvwcR6Y2zDOwBASdbY63HthJOaKk2dGs2KEFQEmTB06NDBbXLnJczYaqXip7MCAArZfmvhDFjbqEwFe7QhSRFkwpCRkaELLrhA1apVK/XxUMCxKSVbGsi0EgCULpzRmJN5DhIfnahhsg2BLr74Yi1fvlyLFi1yWyiH2P4FNp3UuHFjQgwAlCPcQ5NtaolBbpSGIHMCbDm1BZa2bdvq4MGDbol1eno6y6wBwKO+faVJk8KbWjr33GhWhKBiaukk2KiLLcu2U68JMQAQ3oiMbXZnIy0VsXtatpRat45FZQgaggwAwBe2Y2+dOuWHGXssI0P6n/8JrzkYyYMgAwDwhe3UO2aMFNqpomigCX3drJn06KNSAI78gU/okQEA+BpmfvUrafVq6aOPpHXrClcnWXCxnhibTmIkBuUhyAAAfNe8uXTDDX5XgSBiagkAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQYAAAQWQQZAwvj888912223qX379u5U+mbNmukHP/iBlixZ4ndpAKKEIwoAJIzHH39cM2fO1GWXXaYzzzxTmzZt0rhx49SlSxfNmTNHHTp08LtEABGWUlBgx3OVLzc3V5mZmdq1a5dq1aoV6RoAICJmzZqlbt26KT09/ei1pUuX6owzztDw4cP15z//2df6AHjnNXswIgMgYfTq1avEtTZt2rippkWLFvlSE4DookcGQEKzQefNmzerXr16fpcCIAoIMgAS2sSJE7V+/XqNGDHC71IARAFBBkDCWrx4sX7yk5+oZ8+euvbaa/0uB0AUEGQAJCRbsXThhRe6ZsFJkyapUqVKfpcEIApo9gWQcGyVw6BBg7Rz507NmDFD2dnZfpcEIEoIMgASSl5enoYMGeI2wZs6daratWvnd0kAooggAyBh5Ofnu6be2bNn66233nK9MQASG0EGQCDs2SN99ZW0b59UtapkAy116hx/z5133ql//OMfbkRm+/btJTbAu+qqq2JbNICoY2dfAHFtyxbpjTekGTOkw4ePXU9JkXr0kIYPl5o3L7zWt29f/fOf/yzzv+Xhxx2AOOE1exBkAMStVauk//f/pP37pSNHSj6emirZYqR77pE6dvSjQgDR4jV7sPwaQNxOJT3ySNkhxth1G6X59a+lDRtiXSGAeECQARCXPv7Y3pGVHWJCbEw5P196991YVQYgnhBkAMQdCy/vv18YUrzeP3164egNgORCkAEQd2wkZuvW8J5z8KC0dm20KgIQrwgyAOKOhZJYPg9AcBFkAMSdmjVP7HksqgSSD0EGQNzJyJA6dy5cXu1VVpbUtGk0qwIQjwgyAOLSwIEVr1gqatCgwk3yACQXggyAuNSpk9SrV8XhxEZtcnKk886LVWUA4glBBkBcsgBz223SOecUfl98min0vZ259MADUuXKsa8RgP84NBJA3EpLKwwzNs304YfSZ58V7hVTpUrhkQR2vX17ppSAZMZZSwACxX5iEVyAxJfLWUsAEhEhBkBRBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAABBYBBkAKMWePXs0atQoDRw4UHXq1FFKSorGjx9f6r2LFi1y99WoUcPde/XVV+u7776Lec1AMkrzuwAAiEdbt27V6NGj1axZM3Xs2FHTp08v9b5169apd+/eyszM1JgxY1wAeuKJJ/T1119r7ty5Sk9Pj3ntQDIhyABAKbKysrRx40Y1atRI8+bNU/fu3Uu9z8LL3r179cUXX7jQY3r06KEBAwa4EZybbropxpUDyYWpJQAoRZUqVVyIqcgbb7yhiy666GiIMf3791dOTo5ef/31KFcJgCADACdo/fr12rJli7p161biMRuVmT9/vi91AcmEIAMAJ8imnkLTUMXZte3bt+vAgQM+VAYkD4IMAJyg/fv3H52GKq5q1arH3QMgOggyAHCCMjIy3OfSRl3y8vKOuwdAdBBkAOAEhaaUQlNMRdk121OmtNEaAJFDkAGAE9S4cWPVr1/fLc8uzvaQ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",
      "text/plain": [
       "<Figure size 700x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def draw_sol(n, m, prob=None, x=None, y=None):\n",
    "    \"\"\"\n",
    "    Given the variables x and y and their value, display the possible locations for new facilities\n",
    "    selected by the model and the school-area assignment.\n",
    "    If x and y are not passed, it displays only the locations of schools and areas.\n",
    "    \"\"\"\n",
    "\n",
    "    mpl.rcParams['figure.figsize'] = (7,7)  # To plot with the right aspect ratio.\n",
    "   \n",
    "    V = [i for i in range(n + m)]  # Set of nodes.\n",
    "\n",
    "    # Set of edges: condition i<j implies these are EDGES, not arcs, \n",
    "    # and therefore they are not directed.\n",
    "    E = []\n",
    "\n",
    "    # If a solution is provided, use it to create the assignment graph.\n",
    "    if prob is not None:\n",
    "        xsol = prob.getSolution(x)\n",
    "        ysol = prob.getSolution(y)\n",
    "        E = [(i, n + j) for i in SCHOOLS for j in SITES if xsol[i,j] > 0.5]\n",
    "\n",
    "    # Create a dictionary with nodes as keys and (x,y) tuples as their values.\n",
    "    coordS = {i:     tuple(coord_schools[i]) for i in SCHOOLS}\n",
    "    coordA = {n + j: tuple(coord_sites[j])   for j in SITES}\n",
    "\n",
    "    coord = {**coordS, **coordA}\n",
    "\n",
    "    node_colS  = {    i: '#5555ff' for i in SCHOOLS}\n",
    "    node_colA1 = {n + j: '#ff5555' for j in SITES if     y and ysol[j] > 0.5}\n",
    "    node_colA0 = {n + j: '#a0a0a0' for j in SITES if not y or  ysol[j] < 0.5}\n",
    "    node_col = {**node_colS, **node_colA1, **node_colA0}\n",
    "    node_col = [node_col[i] for i in range(n+m)]\n",
    "\n",
    "    g = nx.Graph()\n",
    "\n",
    "    g.add_nodes_from(V)\n",
    "    g.add_edges_from(E)\n",
    "    \n",
    "\n",
    "    # Offset the labels.\n",
    "    offset = {node: (coord[node][0] + 0.2, coord[node][1] + 0.2) for node in g.nodes()}\n",
    "    nx.draw_networkx_labels(g, pos=offset)\n",
    "\n",
    "    nx.draw_networkx(g, pos=coord, node_color=node_col, node_shape='.', with_labels=False)\n",
    "\n",
    "# Pass None as solution to obtain just a map of all schools and of all candidate sites.\n",
    "draw_sol(num_schools,num_sites)\n",
    "\n",
    "print(\"Schools (blue) and candidate sites for parks (grey):\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5638f3e",
   "metadata": {},
   "source": [
    "The code below computes the distance range and plots a 10-bin histogram of the 99 distances distances between schools and candidate sites."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "6a309528",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum distance: 0.91 km\n",
      "Maximum distance: 10.42 km\n"
     ]
    },
    {
     "data": {
      "image/png": "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7v6HH344UpKxY8e67Z555pnC+3755ZfIkUceGfnVr35V5LWrfH369Cnx8cq6bfBevvLKK0Veh97z6PZw1VVXlfg8eo7oegvs2LEjsm3btiL3/fjjj5G99947cuGFFxbet2LFCve8DRs2jPzwww+F96tcuv8f//hH4X3dunWL1K1bN7Jy5coij1tQUFD4/xdddFGkadOmkQ0bNhTZ5qyzznKvJz8/3/18yimnRA444IBIvILyxrpdccUVRcry888/R/bYY4/IJZdcUuQx1q5d68oSfb/qOdZH0Isvvuju//zzz93P06dPj9SsWTPSr1+/yJlnnlm43YEHHhgZMGBA3PXwt7/9LZKZmRl59913i2ynfVTP+/777yeknes177XXXm7b9u3bRy6//PLI5MmTIz/99NMu7aZNmzauTam9RIuuW+2veqw777yzyDY6fh166KFx78eLFi1y21188cVFtrvxxhvd/W+99Vaxx5XytqWK2EcOOugg975H1+sbb7zhtou1n0bTMVXbTZ06tUzl37p1a2Tnzp1F7lNZ1T6j35fgWN6hQ4cirzd4vk8//bTwuNe4cWP3GqK3mzBhgtsuus6DOok+lsfz2oP2H9Bzd+zYMXLssccWub9OnToxP1vKun/FonYcfBbqvT777LMj48aN2+W4Fv25rdcbUFuLrovAyJEjXXmXLl1a5P5bb701Uq1atciqVavcz9ddd12kXr16rv0B8WLoHdKarlKVtPqdhtvJK6+8Uu6FD9QLpat8ZXXeeee5K9cBXbXVlWZNfq9IenxdVdWV4mi60qxzRl09jKZeruBqo+hKv4Y06Ipoac+jK+a6whfQ1WE9r1YC0xCLihD0/JT2futqr3o74qW6C+adqK3oSrWGNmlIUjB0L9qZZ57phiwFgh6/oP60Ytrs2bPdUBddKY0WDBHS+/LSSy9Z37593f+rxye46Sq9rmIHz63Xpp6wWEOXykJXmHVlVjc951VXXeWupmvye0C/U6+g3tvosqhu1AviD7GKJagHvfag50hDrjQEMhiSpOfQghrBtvHUg3ov1Yuk4VbR22k4rvhlLG8711VvDclSL+WPP/5o48ePd70tGs6p4W7BMDj1smmIqa7IB8ebQKyhYHo8v76iy1LW/Tg4nkS/f8F2oiGmxSlvW0r0PqJeA/W0q8dOQ/kCaitlmduonhCJPt6WdixXD1HQu6cenGA4dqzy67gfPRfNL/+8efPcqAG9p9HbqXc9+vXEEu9rjx6NoPaofULliVVuXzz7Vyxqx+rVHDVqlHs/1WOs44d6mvQeR89Riof2Zb0GPWZ0mbTP6v0JjiFqrxpSqOMTEC+CEtKaTsxL+pDUQVxDBTQcQSc+Gj6ncefxhCYtMBDPxG0tOOB/yGjcdUV/r4Tm3WjoiF8fwdAm/T6af/Iu+sDSh3Bpz6PXGJxwlPY8iRIsx1zS+62hMToB15AXDT/R/KXSToijaRiTTqQ1X0DDsjQ8RSecOpHw+fUXnBAG9Rc8r+YdFEdhSicZmuOg54q+BeFcJ2KioZw6qdPrUv3rRCUYQloW+hudgOim4U+ahK3haBreoqFrsmzZMvevQodfHg0TCspSEu1neq4gFOlfnQxpjp8CrOpF5dY+GJx4xlMPKqOG8vnb7bfffkW22912LrrAoWGHOqldsmSJG7an59JwWA25ip6/UdL7HFC78oef+mUp636sf7UP6tgSTRcxdGJZ0n64O20pkftIUEb/mCkKL6VR4JWyflWE2lywKIxCk1ZiU/k17DCR5deFo1//+tclliXe164hdho6p3rXsD6VW20zVrl98exfxVF9aeichrxpP1ZYUnn0eaqhfOWhfVnDf/0y6RgVXSYdp7R/awi8hiXq4lNZ59MCzFFC2tIVUX1I+CcK/lU4XZXSVWZ9mOvgqknkOhHUiV9ZxrXHM6+orIr7UlxdRausFYOKex5/wniyUACSkt5vLZqgk2/Nz9D7q9XcNKZdc1T0IVsSLQqiK8GaaK/5IOo5UB1p7kBwMpzo+gsCu+a+FTcPJpjToxNlnazrhEntWFeIteyuTtq1hHx5aMy/ApP2EU2ODsqjuQ464faVdW6C5jPNnDnTzWfTQigqo4KETuAVnHSypRN1Leccbz1oW5XVXyo+4M8LScT7pP1VJ2q6aT6ITm41X0MXYOJREft2eb5gu7xtKYx9pCTBktQK+mVZDltLZ2sRIJ1oq1dQgUNhU72BsS6eJcsxUvuM5ifpYoPeJwV4hbGJEyeWaTGXePavstDz66Kj5ldpvqjCkhZxiHd1QZVLPWhaiCWW4OKH2pl639SrpR5V3fTaNXojehEhIBaCEtJWMIlcQwdKog9CnRDqppMrfVjqypjCk65cledEoyTBVfnoD1UtfBD9QaQrk7GGK+gqY/SVyHjKpmEQmhyuq6vRV6ODLwMMJuTuLj2OrsDqQy66VynRz+P3Jin86CQ4uLJe0oe4rkDqpiuSWsRBCycEQam4OtUiEKp7harobcr6HVC+4H0MAl4sunqq90oBObiKWhKtMqZeUt00oVs9Q3ptmvxcnqWHNWwqurcuGKKmE5PSylNS21RY1YmMJpzrtWmiu9qKAlQQlHRfcCIaTz2ojBoSp/050ftuWd9X7b/qZQrKE7zPZXkPE7Uf61/tgzreRO8TmrSvY0tp+2F52lKi95GgjP4xUxTkSqP2FAwF08I+pQVRlb9Hjx6FvYEB1Zd6l3an/MHQT9F3DGk4plYDLcvflvbaFWT1nigoRH8/kfYxX6x9It7jTFkprOlzTa9BQ+ZiXVwprkzBvqNjT1nKpFEdGjqom9q9ju8aOqzgW9LFM4Chd0hL+h4lXRHUykVaBag4GkPvC1ZmCpbQ1QmDlHecte/pp58uMhREH846qYru0dAHxIcffuhOUAK6uusvIx5P2bQ0sT4I1UMQTUNN9EFVWo9KWel59MW/6pmLPuHWcsPqJdAqRomkXgmtcKj3UgG3pN44fxiKTvg1jCl6uWTVaazhKsFJVvTVYs13+uCDD8pVbp2c6Aqwlt/VCmvRgufQc+qqrE6EYgUqDZkJaD6Ff+KguQx6LJ2YlYdW35PghE4XHTScSRcTYj1mdHlKapvBkDr15ulEKpiDofvV06S5HcE28daDeg21SpZWbovVVjSXIRH03sd6LK3upvciGB6lIK7jkIYw+nVRnp6Hsu7HwZcHByuDBYKetmAltFjK25YSvY/oooaOx+oViN4nNRdFq9CVRkubaxihgrf+jVXf6gXTexaU399G82TUnspDc7O0n2v+WvSxXL0rpR2z43ntKrfe++hl5DWU21/hMdgv/eeOZ/+KRUHIP4aJnkfvvcJqSSuaxipTsC/r7xUAYz12cCHHb6+66BJceCzLUvhIb/QoocpTN7uupuqgqaulCkn6MNEVuenTp5d4JV3La2tYkU4atL16GDR0QeOcdTUyCC0aEqQPO11100FdE9d18lMeGs6hx9bYb5VXJzK64hW9hLmG7ChAnXDCCe7DQsNW9IEePek83rLpSpuulipM6ENUJ78afqaFLDS0xH/s8tKiALqSpyE4Glal5aL1WjTHQa+1rBOrY9EJS/C9WLrSqBMGncgomGmSupaQLY7Cqd5XLZ6h167QpivzmrCuJZgD+i4OhTxNgtciA9pOdaflnXWlXMuQq73oirDqXSeQQY9LvDSnRW1BJ9OqN71vem80DFRDSYIliNW7qfdVbUTPp1CoydUqfxD2e/Xq5a7Yas6d5gHp5FAn0yprWepcjxfUrepKgUUnTurZ0WOLQpLmPSiYqswaXqMTIJ0kqcx67uAEXvUoWnRAAUsnY9pe1N5VVl0Z19LAAQVHndBKdFCKpx5UNg310QR6ba8y6QRSxwjdr5Ou6C+o3p0eaw2vU3vQa1WYUJ0r+OqYE3yfmk7aVGdqQzrx1X6vk2CVR3OpYp0ElqSs+7Hu1zAqzTvRSaUuUCgQ6MRbw9D0GMUpb1uqiH1Ew/b0WNpPNCRO73PwHU9leUwNAVQ9ax9Xe9D+r9emY4aChOpES04H5ddngt4jtXsN2dN7XNp8opJ6VLTAgY5L6lFS75zqRD09ZXnMsr52baMArM8LLSiizzF9j5n2s+jvJhO1Ve0v2l4XiXTM0T5V1v0rFvXg6nkV0rXf6jNOx2q1Nc1X0nG/pN48lUn7iOpKZdYFLNWX3jt9hut90eeJttPFCb0v+kxR+1dPnz4vVT79jY7xGnmhetL+VtoIA4DlwVFlBcuMBjct89ukSZNIz5493TKt0ctQF7c8+MyZM91SuDk5Oe7v9a+WNvWXI9Wytfvvv3+kevXqRZZw1ZKmxS2jW9zy4FOmTIkMHTrULRtbu3Zttxx1rGVU77vvPreUuJam7dq1a2TevHm7PGZJZfOXBw+Wdx48eLB7nVlZWZG2bdtG/vSnPxVZplj0OLGW0S5u2XLfd999F7ngggsijRo1cvXaqVOnmEuYx7s8ePBeaxlkLQeruteS1HPnzo35N9HLg2t53ptuuinSuXNntyS3lp3V/z/66KNF/mbTpk2RgQMHumWwo5fhVR3dfffd7me9J1q2+dVXX92lnoNlflWvJZUn8Nlnn7llsPV8tWrVirRr1y4ybNiwXepT70eLFi3c+6Z2ftxxx7llhgOPP/64W25cSy6rfPvss497vRs3box7eXC1pV//+tfu79VmfGrLvXv3dssGq8x6rvPPP9+10YCW6r3mmmvcEtp6v/yPo9NPP93d9/zzzxdZ0jg7O9u1mS1btuzyvGWph+BxxowZ49qH6mLPPfd0S2yPGDGiSH3sTjv/5JNPXP0ccsghkQYNGrg60/LKel0LFizYZfv33nvPHZuCtqflz6OXINfz6f7Sjlnx7Mfbt293r1nLk2s71ZuOPVoGO5p/XClvW6qofeSll15yS3HrMXWse/nll2Me30ry97//PdKrV68i75WWo3/77bcLt1G93HDDDe53OjbruPvBBx8UeyzXUvfRYi3xLTrG6D1Q+bt06RKZPXv2Lo9Z3N+W9bU/+eSTrh1oOy1Xr8eJ1Xb++9//uvdWr0+/i27nZd2/fPq7e+65x70e1Z3qV/ucliZXvZe2PLiW2tfngPYNf9l0tXW12X333dcdF/SZctRRR0X+/Oc/u/08+r3VZ6q2admyZeSyyy6LfPvttyWWG5AM/SfssAYAAAAAyYQ5SgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAABAun3hbEFBgftCM30Jnr6ZGgAAAEB6ikQi7ovT9aXK+tLvtA5KCkktWrQIuxgAAAAAksTXX39tzZs3T++gpJ6koDLq1asXdnGwm7Zv325vvPGG9erVy7KyssIuDlIc7QmJRHtCotGmkEi0p/+Tl5fnOlGCjJDWQSkYbqeQRFCqGjt5dna2ey/TeSdHYtCekEi0JyQabQqJRHsqqixTcljMAQAAAAA8BCUAAAAA8BCUAAAAAMBDUAIAAAAAD0EJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQAAAAA8BCUAAAAA8BCUAAAAACCZgtLs2bOtb9++lpOTYxkZGTZt2rRdtlm8eLH169fP6tevb3Xq1LHDDjvMVq1aFUp5AQAAAKSHUIPS5s2brXPnzjZu3LiYv//iiy/s6KOPtvbt29vbb79tn3zyiQ0bNsxq1apV6WUFAAAAkD6qh/nkJ554orsV5w9/+IOddNJJdu+99xbet88++1RS6QAAAACkq1CDUkkKCgrsn//8p918883Wu3dvW7hwobVp08aGDh1q/fv3L/bvtm3b5m6BvLw89+/27dvdDakteA95LyGrV6+277//freOM6LjS2Zm1Zmy2bBhQ2vevHnYxUg7HJ+QaLQpJBLtyeJ+/RmRSCRiSUBzlKZOnVoYgtauXWtNmza17OxsGzVqlPXo0cNef/11u+2222zWrFl2zDHHxHyc4cOH24gRI3a5f/Lkye6xAAAAAKSn/Px8GzhwoG3cuNHq1auXmkFpzZo11qxZMzv77LNdyAloYQct6jBlypQy9yi1aNHCNmzYUGplIDWuAsyYMcN69uxpWVlZYRcHIcrNzbVu3brZgGEP2F6tyjckt5pFrFudfJu9Odt2WoZVBetXfmFTRw52i+VoDigqD8cnJBptColEe/pfNmjUqFGZglLSDr3TC6hevbrtv//+Re7v0KGDvffee8X+Xc2aNd3NpwaRzo2iquH9hIbKbdmyxRq02teadChfIMgs2GG2eq7t3a6TFWQm7eEwLgp8qhfVD/tIODg+IdFoU0ikdG9PWXG89qQdlF+jRg23FPiSJUuK3L906VJr1apVaOUCAAAAUPWFegl106ZNtnz58sKfV6xYYYsWLbIGDRpYy5Yt7aabbrIzzzzTDa8J5ij94x//cEuFAwAAAECVDErz5s1zASgwZMgQ9++gQYNs0qRJNmDAABs/fryNHj3arr32WmvXrp299NJL7ruVAAAAAKBKBqXu3btbaWtJXHjhhe4GAAAAAJUlaecoAQAAAEBYCEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAADJFJRmz55tffv2tZycHMvIyLBp06YVu+3ll1/uthk7dmyllhEAAABA+gk1KG3evNk6d+5s48aNK3G7qVOn2ocffugCFQAAAABUtOphPvmJJ57obiX55ptv7JprrrF///vf1qdPn0orGwAAAID0FWpQKk1BQYH9/ve/t5tuuskOOOCAMv3Ntm3b3C2Ql5fn/t2+fbu7IbUF7yHvJXR8qF27tlWziGUW7CjXYwR/V96/T0aqD9WL6of9ZFerV6+277//vkIeW3UuCxcutMzM1JoC3LBhQ2vevHnYxYCHzzwkEu3J4n79GZFIJGJJQPOPNMSuf//+hfeNHj3aZs2a5XqT9PvWrVvb9ddf727FGT58uI0YMWKX+ydPnmzZ2dkVVn4AAAAAyS0/P98GDhxoGzdutHr16qVmj9L8+fPtwQcftAULFriQVFZDhw61IUOGFOlRatGihfXq1avUykBqXAWYMWOG9ezZ07KyssIuDkKUm5tr3bp1s0ufmG457TqW6zHUk9R2zXxblnOoFWQm7eEwLmuWfGYTLu7nFsvRHFDs2mYGDHvA9mq1T4X05nWrk2+zN2fbTiv751bY1q/8wqaOHEybSUJ85iGRaE9FR5uVRdKeGbz77ru2bt06a9myZeF9O3futBtuuMGtfPfVV1/F/LuaNWu6m08NIp0bRVXD+wkNbdqyZYs7Id3dkKO/rypBSfWhelH9sI/EbjMNWu1rTTokPhC4IZyr59re7TqlVHuizSQ/PvOQSOnenrLieO1JeyTX3KTjjz++yH29e/d2919wwQWhlQsAAABA1RdqUNq0aZMtX7688OcVK1bYokWLrEGDBq4nSZNL/QTYpEkTa9euXQilBQAAAJAuQg1K8+bNsx49ehT+HMwtGjRokE2aNCnEkgEAAABIZ6EGpe7du1s8i+4VNy8JAAAAABIptb7oAQAAAAAqAUEJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQAAAAA8BCUAAAAA8BCUAAAAAMBDUAIAAAAAD0EJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPBU9+8AwrJq1SrbsGFDidsUFBS4f3Nzcy0zMz1yfqNGjaxly5ZhFwMAACCtEJSQNCGpfYcOtiU/v8TtateubVOmTLFu3brZli1bLB3Uzs62/y5eTFgCAACoRAQlJAX1JCkknTHqMWvcpm2x21WziJlttkufmG47LcOqunUrltkLf7zC1Q9BCQAAoPIQlJBUFJKadehc7O8zC3aYrZ5rOe06WkEmzRcAAAAVIz0meQAAAABAHAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAACRTUJo9e7b17dvXcnJyLCMjw6ZNm1b4u+3bt9stt9xinTp1sjp16rhtzjvvPFuzZk2YRQYAAACQBkINSps3b7bOnTvbuHHjdvldfn6+LViwwIYNG+b+ffnll23JkiXWr1+/UMoKAAAAIH1UD/PJTzzxRHeLpX79+jZjxowi9z3yyCN2+OGH26pVq6xly5aVVEoAAAAA6SbUoBSvjRs3uiF6e+yxR7HbbNu2zd0CeXl5hUP5dENyKigosNq1a1s1i1hmwY5itwt+V9I2VYnqQ/Wi+qH9lq/NlKQqtifaTMW2marYnoI2s3jxYldH+J+GDRta8+bNQ3v+YB9mX0Yi0J4s7tefEYlEIpYEFICmTp1q/fv3j/n7rVu3WteuXa19+/b27LPPFvs4w4cPtxEjRuxy/+TJky07OzuhZQYAAACQOjS9Z+DAga4Dpl69eqkflJT8fve739nq1avt7bffLvFFxepRatGihW3YsKHUykB4cnNzrVu3bnbpE9Mtp13HYrfTldq2a+bbspxDrSAzpTpEy2XNks9swsX93MInms+H+NtMSapie6LNVGybqYrtKfeNV2zqyME2YNgDtlerfcIuTtJYv/ILVy9h7ks6/9E0hJ49e1pWVlYoZUDVQXv6XzZo1KhRmYJS9VR4U8844wxbuXKlvfXWW6W+oJo1a7qbTw0inRtFssvMzLQtW7bYTsso0wmGtkmlE5HyUn2oXlQ/tN/dazPp0p5oM5XTZqpSe9pREHH10qDVvtakA+E6GfclzmGQSOnenrLieO3VUyEkLVu2zGbNmuXGCgMAAABARQs1KG3atMmWL19e+POKFSts0aJF1qBBA2vatKmddtppbmnwV1991Xbu3Glr16512+n3NWrUCLHkAAAAAKqyUIPSvHnzrEePHoU/DxkyxP07aNAgtyjD9OnT3c8HHXRQkb9T71L37t0rubQAAAAA0kWoQUlhp6S1JJJknQkAAAAAaSYz7AIAAAAAQLIhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAnur+HQCSz+LFi8MuQtKhTkpG/eyKOgEAxIOgBCSxnzd8ZxmZmXbuueeGXRSkCNoMAACJQVACktiWn/MsUlBgZ4x6zBq3aRt2cZLKkvdn2oxHR4ddjKRDmykebQYAEA+CEpACdMLbrEPnsIuRVNatWBZ2EZIabWZXtBkAQDxYzAEAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQAAAAA8BCUAAAAA8BCUAAAAAMBDUAIAAAAAD0EJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQAAAAA8BCUAAAAA8BCUAAAAAMBDUAIAAAAAD0EJAAAAAJIpKM2ePdv69u1rOTk5lpGRYdOmTSvy+0gkYrfffrs1bdrUateubccff7wtW7YstPICAAAASA+hBqXNmzdb586dbdy4cTF/f++999pDDz1k48ePt7lz51qdOnWsd+/etnXr1kovKwAAAID0UT3MJz/xxBPdLRb1Jo0dO9b++Mc/2imnnOLue/rpp23vvfd2PU9nnXVWJZcWAAAAQLoINSiVZMWKFbZ27Vo33C5Qv359O+KII+yDDz4oNiht27bN3QJ5eXnu3+3bt7sbklNBQYEbXlnNIpZZsKPY7YLflbRNVVI9M6NM9ZKOElE3VbE90WbCq5tUbU+0mdhUH6oXfT6Fdf4QPC/nL0gE2pPF/fozIuq6SQKaozR16lTr37+/+3nOnDnWtWtXW7NmjZujFDjjjDPcts8//3zMxxk+fLiNGDFil/snT55s2dnZFfgKAAAAACSz/Px8GzhwoG3cuNHq1auXmj1K5TV06FAbMmRIkR6lFi1aWK9evUqtDIQnNzfXunXrZpc+Md1y2nUsdjtd7Wy7Zr4tyznUCjKrXPPdRe4br9jUkYNLrZd0lIi6qYrtiTYTXt2kanuizcS2ZslnNuHifm7hKc2nDuvK94wZM6xnz56WlZUVShlQddCeio42K4ukPZI3adLE/fvdd98V6VHSzwcddFCxf1ezZk1386lBpHOjSHaZmZm2ZcsW22kZZTrB0DapdCJSXjsKInHVSzpJZN1UpfZEmwm/blKtPdFmYlN9qF70+RT2+QPnMEikdG9PWXG89qT9HqU2bdq4sDRz5swiCVCr3x155JGhlg0AAABA1RbqpaNNmzbZ8uXLiyzgsGjRImvQoIG1bNnSrr/+ehs1apS1bdvWBadhw4a571wK5jEBAAAAQJULSvPmzbMePXoU/hzMLRo0aJBNmjTJbr75ZvddS5deeqn99NNPdvTRR9vrr79utWrVCrHUAAAAAKq6UINS9+7d3fclFUer2915553uBgAAAACVJWnnKAEAAABAWAhKAAAAAOAhKAEAAACAh6AEAAAAAIkISl9++WV5/gwAAAAAqm5Q2nfffd2y3s8884xt3bo18aUCAAAAgFQLSgsWLLADDzzQfe9RkyZN7LLLLrOPPvoo8aUDAAAAgFQJSgcddJA9+OCDtmbNGnvqqafs22+/dV8G27FjR7v//vtt/fr1iS8pAAAAAKTCYg7Vq1e3U0891V588UUbM2aMLV++3G688UZr0aKFnXfeeS5AAQAAAEBaBaV58+bZlVdeaU2bNnU9SQpJX3zxhc2YMcP1Np1yyimJKykAAAAAVJLq5fkjhaKJEyfakiVL7KSTTrKnn37a/ZuZ+X+5q02bNjZp0iRr3bp1ossLAAAAAMkZlB577DG78MIL7fzzz3e9SbE0btzYnnzyyd0tHwAAAACkRlBatmxZqdvUqFHDBg0aVJ6HBwAAAIDUm6OkYXdawMGn+/76178molwAAAAAkFpBafTo0daoUaOYw+3uvvvuRJQLAAAAAFIrKK1atcot2OBr1aqV+x0AAAAApF1QUs/RJ598ssv9ubm51rBhw0SUCwAAAABSKyidffbZdu2119qsWbNs586d7vbWW2/ZddddZ2eddVbiSwkAAAAAyb7q3ciRI+2rr76y4447zqpX/7+HKCgosPPOO485SgAAAADSMyhp6e/nn3/eBSYNt6tdu7Z16tTJzVECAACoKhYvXhzac+sitOhcKzOzXIOAKowW9WrZsmXYxQCSLygF9ttvP3cDAACoSn7e8J1lZGbaueeeG1oZdCF6ypQp1q1bN9uyZYslk9rZ2fbfxYsJS6jSyhWUNCdp0qRJNnPmTFu3bl3hFY+A5isBAACkqi0/51mkoMDOGPWYNW7TNpQyVLOImW22S5+Ybjstw5LFuhXL7IU/XmEbNmwgKKFKK1dQ0qINCkp9+vSxjh07WkZG8uy8AAAAiaKQ1KxD51CeO7Ngh9nquZbTrqMVZO7WICAA5VCuve65556zF154wU466aTy/DkAAAAAJLXM8i7msO+++ya+NAAAAACQqkHphhtusAcffNAiEY2dBQAAAICqpVxD79577z33ZbOvvfaaHXDAAZaVlVXk9y+//HKiygcAAAAAqRGU9thjDxswYEDiSwMAAAAAqRqUJk6cmPiSAAAAAECSKPfXPO/YscPefPNNe/zxx+3nn392961Zs8Y2bdqUyPIBAAAAQGr0KK1cudJOOOEEW7VqlW3bts169uxpdevWtTFjxrifx48fn/iSAgAAAEAy9yjpC2e7dOliP/74o9WuXbvwfs1bmjlzZiLLBwAAAACp0aP07rvv2pw5c9z3KUVr3bq1ffPNN4kqGwAAAACkTo9SQUGB7dy5c5f7V69e7YbgAQAAAEDaBaVevXrZ2LFjC3/OyMhwizjccccddtJJJyWyfAAAAACQGkPv7rvvPuvdu7ftv//+tnXrVhs4cKAtW7bMGjVqZFOmTEl8KQEAAAAg2YNS8+bNLTc315577jn75JNPXG/SRRddZOecc06RxR0AAAAAIG2CkvvD6tXt3HPPTWxpAAAAACBVg9LTTz9d4u/PO++88pYHAAAAAFIzKOl7lKJt377d8vPz3XLh2dnZBCUAAAAA6bfqnb5oNvqmOUpLliyxo48+msUcAAAAAKRnUIqlbdu2ds899+zS2wQAAAAAaRuUggUe1qxZk8iHBAAAAIDUmKM0ffr0Ij9HIhH79ttv7ZFHHrGuXbsmqmwAAAAAkDpBqX///kV+zsjIsL322suOPfZY92W0ibJz504bPny4PfPMM7Z27VrLycmx888/3/74xz+65wQAAACApAlKBQUFVhnGjBljjz32mP31r3+1Aw44wObNm2cXXHCB1a9f36699tpKKQMAAACA9FPuL5ytDHPmzLFTTjnF+vTp435u3bq1W1Xvo48+CrtoAAAAAKqwcgWlIUOGlHnb+++/38rrqKOOsgkTJtjSpUttv/32s9zcXHvvvfdKfMxt27a5WyAvL6/wu550Q3JSL2Xt2rWtmkUss2BHsdsFvytpm6qkemZGmeolHSWibqpie6LNhFc3qdqeaDPJWy/J2qZUJ6obfXZzbpU6gvcq3d+z7XG8/oyIVmKIU48ePWzhwoXuidq1a+fuU5ipVq2aHXLIIf978IwMe+utt6y8tAPedtttdu+997rH1pylu+66y4YOHVrs32hO04gRI3a5f/Lkye7LcAEAAACkp/z8fBs4cKBt3LjR6tWrl/gepb59+1rdunXd3KE999zT3acvntX8od/+9rd2ww03WCK88MIL9uyzz7qQozlKixYtsuuvv94t6jBo0KCYf6MQFd3jpR6lFi1aWK9evUqtDIRHvYXdunWzS5+YbjntOha7na6qtV0z35blHGoFmUk9cjQhct94xaaOHFxqvaSjRNRNVWxPtJnw6iZV2xNtJnnrJVnb1Joln9mEi/vZ7NmzrXPnzmEXB2WkDo4ZM2ZYz549LSsry9JV3v8fbVYW5drrtLLdG2+8URiSRP8/atQoF0gSFZRuuukmu/XWW+2ss85yP3fq1MlWrlxpo0ePLjYo1axZ0918ahDp3CiSXWZmpm3ZssV2WkaZPgy0TTJ9aFSUHQWRuOolnSSybqpSe6LNhF83qdaeaDPJXy/J1qZUJ6obfXZzbpV60v2cOCuO155Z3iS2fv36Xe7XfT///LMlsmtMO2E0DcGrrFX3AAAAAKSncl2eGDBggBtmp56lww8/3N03d+5c1wN06qmnJqxwGuKnOUktW7Z0Q+80L0oLOVx44YUJew4AAAAASEhQGj9+vN14441uIlSwckT16tXtoosusj/96U+WKA8//LANGzbMrrzySlu3bp2bm3TZZZfZ7bffnrDnAAAAAICEBCWtHvfoo4+6UPTFF1+4+/bZZx+rU6eOJZIWjBg7dqy7AQAAAEBlKdccpcC3337rbm3btnUhqRwrjQMAAABA0ilXUPr+++/tuOOOc18Ce9JJJ7mwJBp6l6gV7wAAAAAgpYLS4MGD3dJ6q1atKvIlrmeeeaa9/vrriSwfAAAAAKTGHCV9h9K///1va968eZH7NQRP33MEAAAAAGnXo7R58+YiPUmBH374IeaXvQIAAABAlQ9Kv/3tb+3pp58u/DkjI8N9Cey9995rPXr0SGT5AAAAACA1ht4pEGkxh3nz5tkvv/xiN998s/3nP/9xPUrvv/9+4ksJAAAAAMneo9SxY0dbunSpHX300XbKKae4oXinnnqqLVy40H2fEgAAAACkVY/S9u3b7YQTTrDx48fbH/7wh4opFQAAAACkUo+SlgX/5JNPKqY0AAAAAJCqQ+/OPfdce/LJJxNfGgAAAABI1cUcduzYYU899ZS9+eabduihh1qdOnWK/P7+++9PVPkAAAAAILmD0pdffmmtW7e2zz77zA455BB3nxZ1iKalwgEAAAAgbYJS27Zt7dtvv7VZs2a5n88880x76KGHbO+9966o8gEAAABAcs9RikQiRX5+7bXX3NLgAAAAAGDpvphDccEJAAAAANIuKGn+kT8HiTlJAAAAANJ6jpJ6kM4//3yrWbOm+3nr1q12+eWX77Lq3csvv5zYUgIAAABAsgalQYMG7fJ9SgAAAACQ1kFp4sSJFVeSNLFq1SrbsGFD2MVIOosXLw67CAAAAMDufeEsyh+S2nfoYFvy88MuCgAAAIASEJQqkXqSFJLOGPWYNW7TNuziJJUl78+0GY+ODrsYAAAAgENQCoFCUrMOncMuRlJZt2JZ2EUAAAAAEvM9SgAAAABQFRGUAAAAAMBDUAIAAAAAD0EJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQAAAAA8BCUAAAAA8BCUAAAAAMBDUAIAAAAAD0EJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAEi1oPTNN9/Yueeeaw0bNrTatWtbp06dbN68eWEXCwAAAEAVVt2S2I8//mhdu3a1Hj162GuvvWZ77bWXLVu2zPbcc8+wiwYAAACgCkvqoDRmzBhr0aKFTZw4sfC+Nm3ahFomAAAAAFVfUgel6dOnW+/eve3000+3d955x5o1a2ZXXnmlXXLJJcX+zbZt29wtkJeX5/7dvn27u4WpoKDADR+sZhHLLNgRalmSTfXMjDLVTfC7dKm/stZLOkpE3VTF9kSbCa9uUrU90WaSt16StU2pTlQ3Oq8J+9wKZRe8V+n+nm2P4/VnRCKRiCWpWrVquX+HDBniwtLHH39s1113nY0fP94GDRoU82+GDx9uI0aM2OX+yZMnW3Z2doWXGQAAAEByys/Pt4EDB9rGjRutXr16qRuUatSoYV26dLE5c+YU3nfttde6wPTBBx+UuUdJw/c2bNhQamVUtNzcXOvWrZtd+sR0y2nXMdSyJJvcN16xqSMHl1o3uqrWds18W5ZzqBVkJnWHaKXWSzpKRN1UxfZEmwmvblK1PdFmkrdekrVNrVnymU24uJ/Nnj3bOnfuHHZxEEdPyowZM6xnz56WlZVl6SovL88aNWpUpqCUPHtdDE2bNrX999+/yH0dOnSwl156qdi/qVmzprv51CDCbhSZmZm2ZcsW22kZSXXASwY7CiJx1Y22SYc6jLde0kki66YqtSfaTPh1k2rtiTaT/PWSbG1KdaK60XlN2OdWiF8ynBOHKZ7XntTLg2vFuyVLlhS5b+nSpdaqVavQygQAAACg6kvqoDR48GD78MMP7e6777bly5e7eUYTJkywq666KuyiAQAAAKjCkjooHXbYYTZ16lSbMmWKdezY0UaOHGljx461c845J+yiAQAAAKjCkmfAazFOPvlkdwMAAACAypLUPUoAAAAAEAaCEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAQCoHpXvuuccyMjLs+uuvD7soAAAAAKqwlAlKH3/8sT3++ON24IEHhl0UAAAAAFVcSgSlTZs22TnnnGN/+ctfbM899wy7OAAAAACquOqWAq666irr06ePHX/88TZq1KgSt922bZu7BfLy8ty/27dvd7cwFRQUWO3ata2aRSyzYEeoZUk21TMzylQ3we/Spf7KWi/pKBF1UxXbE20mvLpJ1fZEm0neeknWNqU6Ud0sXrzYndvgfxo2bGjNmze3ZBScB4d9Phy2eF5/RiQSiVgSe+655+yuu+5yQ+9q1apl3bt3t4MOOsjGjh0bc/vhw4fbiBEjdrl/8uTJlp2dXQklBgAAAJCM8vPzbeDAgbZx40arV69e6galr7/+2rp06WIzZswonJtUWlCK1aPUokUL27BhQ6mVUdFyc3OtW7dudukT0y2nXcdQy5Jsct94xaaOHFxq3eiqWts1821ZzqFWkJkSHaKVUi/pKBF1UxXbE20mvLpJ1fZEm0neeknWNhXUzYBhD9herfYJuzhJY/3KL1y9zJ492zp37mzJ2JOic+qePXtaVlaWpau8vDxr1KhRmYJS8ux1McyfP9/WrVtnhxxySOF9O3fudA3wkUcecYGoWrVqRf6mZs2a7uZTgwi7UWRmZtqWLVtsp2Uk1QEvGewoiMRVN9omHeow3npJJ4msm6rUnmgz4ddNqrUn2kzy10uytamgbhq02teadEi+QBAWtRXVi873wj7nLEkynBOHKZ7Xnjx7XQzHHXecffrpp0Xuu+CCC6x9+/Z2yy237BKSAAAAACARkjoo1a1b1zp2LNrdXadOHTdRzr8fAAAAANJqeXAAAAAAqExJ3aMUy9tvvx12EQAAAABUcfQoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAJBqQWn06NF22GGHWd26da1x48bWv39/W7JkSdjFAgAAAFCFJX1Qeuedd+yqq66yDz/80GbMmGHbt2+3Xr162ebNm8MuGgAAAIAqqroluddff73Iz5MmTXI9S/Pnz7du3bqFVi4AAAAAVVfSByXfxo0b3b8NGjSI+ftt27a5WyAvL8/9q54o3cJUUFBgtWvXtmoWscyCHaGWJdlUz8woU90Ev0uX+itrvaSjRNRNVWxPtJnw6iZV2xNtJnnrJVnbVDLUTTJSfaheFi9e7M75kk1QpoULF1pmZuUPKmvYsKE1b97cwhZPHsiIRCIRSxF6g/v162c//fSTvffeezG3GT58uI0YMWKX+ydPnmzZ2dmVUEoAAAAAySg/P98GDhzoOl/q1atXdYLSFVdcYa+99poLScUl0lg9Si1atLANGzaUWhkVLTc31w0XvPSJ6ZbTrmOoZUk2uW+8YlNHDi61bnTlqu2a+bYs51AryEy5DtEKq5d0lIi6qYrtiTYTXt2kanuizSRvvSRrm0qGuklGQb0MGPaA7dVqH0vGHq9udfJt9uZs22kZlfrc61d+4epm9uzZ1rlzZwuTskGjRo3KFJSSZ68rxdVXX22vvvqqq+CSuu1q1qzpbr6srCx3C5O6Obds2eIaZzId8JLBjoJIXHWjbdKhDuOtl3SSyLqpSu2JNhN+3aRae6LNJH+9JFubSqa6SSZBvTRota816RBuGIjFDZNcPdf2btep0t+3nZbh6kbnwmGfj8fz/EnfutXhdc0119jUqVPt7bfftjZt2oRdJAAAAABVXNIHJS0NrvlFr7zyivsupbVr17r769ev7ybMAQAAAEDafY/SY4895sYQdu/e3Zo2bVp4e/7558MuGgAAAIAqKul7lFJorQkAAAAAVUTS9ygBAAAAQGUjKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAeAhKAAAAAOAhKAEAAACAh6AEAAAAAB6CEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAKRiUBo3bpy1bt3aatWqZUcccYR99NFHYRcJAAAAQBWW9EHp+eeftyFDhtgdd9xhCxYssM6dO1vv3r1t3bp1YRcNAAAAQBWV9EHp/vvvt0suucQuuOAC23///W38+PGWnZ1tTz31VNhFAwAAAFBFVbck9ssvv9j8+fNt6NChhfdlZmba8ccfbx988EHMv9m2bZu7BTZu3Oj+/eGHH2z79u0Wpry8PDd88Lsln9qO/E2hliXZ/Pj1l2Wqm2oWsRZ1ttiqhR/aTsuwqq6s9ZKOElE3VbE90WbCq5tUbU+0meStl2RtU8lQN8ko2eslzPb0/dcrXN3oXPj777+3MP3888/u30gkUuq2GZGybBWSNWvWWLNmzWzOnDl25JFHFt5/88032zvvvGNz587d5W+GDx9uI0aMqOSSAgAAAEgVX3/9tTVv3jx1e5TKQ71PmtMUKCgocL1JDRs2tIyM5Lkag/LRlYgWLVq4xl2vXr2wi4MUR3tCItGekGi0KSQS7en/qI9IvUo5OTmlbpvUQalRo0ZWrVo1++6774rcr5+bNGkS829q1qzpbtH22GOPCi0nKp928HTeyZFYtCckEu0JiUabQiLRnszq16+f+os51KhRww499FCbOXNmkR4i/Rw9FA8AAAAAEimpe5REw+gGDRpkXbp0scMPP9zGjh1rmzdvdqvgAQAAAEBaBqUzzzzT1q9fb7fffrutXbvWDjroIHv99ddt7733DrtoCIGGVeo7tfzhlUB50J6QSLQnJBptColEe4pfUq96BwAAAABhSOo5SgAAAAAQBoISAAAAAHgISgAAAADgISgBAAAAgIeghJQwevRoO+yww6xu3brWuHFj69+/vy1ZsiTsYqGKuOeeeywjI8Ouv/76sIuCFPXNN9/Yueeeaw0bNrTatWtbp06dbN68eWEXCylo586dNmzYMGvTpo1rS/vss4+NHDnSWHsLZTV79mzr27ev5eTkuM+2adOmFfm92pJWk27atKlrY8cff7wtW7YstPImM4ISUsI777xjV111lX344Yc2Y8YM2759u/Xq1ct9pxawOz7++GN7/PHH7cADDwy7KEhRP/74o3Xt2tWysrLstddes88//9zuu+8+23PPPcMuGlLQmDFj7LHHHrNHHnnEFi9e7H6+99577eGHHw67aEgROjfq3LmzjRs3Lubv1Z4eeughGz9+vM2dO9fq1KljvXv3tq1bt1Z6WZMdy4MjJem7tdSzpADVrVu3sIuDFLVp0yY75JBD7NFHH7VRo0a572nTl1oD8bj11lvt/ffft3fffTfsoqAKOPnkk913RT755JOF9/3ud79zV/6feeaZUMuG1KMepalTp7qROKLTfvU03XDDDXbjjTe6+zZu3Oja3KRJk+yss84KucTJhR4lpCTt1NKgQYOwi4IUpl7KPn36uGEHQHlNnz7dunTpYqeffrq7gHPwwQfbX/7yl7CLhRR11FFH2cyZM23p0qXu59zcXHvvvffsxBNPDLtoqAJWrFhha9euLfK5V79+fTviiCPsgw8+CLVsyah62AUA4lVQUODmkmioS8eOHcMuDlLUc889ZwsWLHBD74Dd8eWXX7qhUkOGDLHbbrvNtalrr73WatSoYYMGDQq7eEjBHsq8vDxr3769VatWzc1Zuuuuu+ycc84Ju2ioAhSSRD1I0fRz8Dv8D0EJKdkL8Nlnn7krbEB5fP3113bddde5+W61atUKuzioAhdv1KN09913u5/Vo6RjlMb/E5QQrxdeeMGeffZZmzx5sh1wwAG2aNEid3FQw6VoT0DlYugdUsrVV19tr776qs2aNcuaN28ednGQoubPn2/r1q1z85OqV6/ubprvpsmt+n9dwQXKSitH7b///kXu69Chg61atSq0MiF13XTTTa5XSXNFtHri73//exs8eLBb/RXYXU2aNHH/fvfdd0Xu18/B7/A/BCWkBE0+VEjShMS33nrLLZsKlNdxxx1nn376qbtSG9zUI6ChLfp/DXcBykrDgP2vK9D8klatWoVWJqSu/Px8y8wsenqmY5J6LoHdpfMnBSLNgwtoqKdWvzvyyCNDLVsyYugdUma4nYYhvPLKK+67lIJxtJqAqJWAgHioDfnz27Q8qr4Dh3lviJeu9msCvobenXHGGfbRRx/ZhAkT3A2Il77/RnOSWrZs6YbeLVy40O6//3678MILwy4aUmhF1+XLlxdZwEEXAbUAltqVhnJqpde2bdu64KTv7dLQzmBlPPwPy4MjZZa3jGXixIl2/vnnV3p5UPV0796d5cFRbhoSPHToUPeljTrx0MIOl1xySdjFQgr6+eef3YmrRlBoiLBOYM8++2z3BaFaIAQozdtvv209evTY5X7NcdMS4Dr1v+OOO9zFnJ9++smOPvpo9zUZ++23XyjlTWYEJQAAAADwMEcJAAAAADwEJQAAAADwEJQAAAAAwENQAgAAAAAPQQkAAAAAPAQlAAAAAPAQlAAAAADAQ1ACAAAAAA9BCQBQITIyMmzatGlWFf3yyy+277772pw5c9zPX331lXu9ixYtSujzjB8/3vr27ZvQxwQAlA1BCQBQZueff74LBLplZWXZ3nvvbT179rSnnnrKCgoKimz77bff2oknnlglQ5UCTJs2beyoo46q0Oe58MILbcGCBfbuu+9W6PMAAHZFUAIAxOWEE05wIUi9KK+99pr16NHDrrvuOjv55JNtx44dhds1adLEatasaVVNJBKxRx55xC666KIKf64aNWrYwIED7aGHHqrw5wIAFEVQAgDEReFHIahZs2Z2yCGH2G233WavvPKKC02TJk2K2UukoWpXX321NW3a1GrVqmWtWrWy0aNHu9+1bt3a/TtgwAD3N8HPX3zxhZ1yyimu1+pXv/qVHXbYYfbmm28WKYu2vfvuu13PS926da1ly5Y2YcKEItusXr3azj77bGvQoIHVqVPHunTpYnPnzi38vcqu16Fy/frXv7YRI0YUCXy++fPnu7L16dOn2G127tzpytS+fXtbtWpVYX08/vjjLlBmZ2dbhw4d7IMPPrDly5db9+7dXdnUQ6XHjqahd9OnT7ctW7aU4d0BACQKQQkAsNuOPfZY69y5s7388ssxf68eEZ3sv/DCC7ZkyRJ79tlnCwPRxx9/7P6dOHGi66kKft60aZOddNJJNnPmTFu4cKHryVJoCIJH4L777nPhR9tceeWVdsUVV7jnCB7jmGOOsW+++cY9f25urt18882FwwQ1pO28885zPWKff/65CzIKe3fddVexr1V/s99++7lgFsu2bdvs9NNPd/OVtK3CW2DkyJHu+fQ7hSj1Fl122WU2dOhQmzdvnuutUqCMptem4BYd7gAAFa96JTwHACAN6MT/k08+ifk7hZu2bdva0Ucf7XpW1KMU2Guvvdy/e+yxh+upCih46RYdMqZOneoCT3SYUJhSQJJbbrnFHnjgAZs1a5a1a9fOJk+ebOvXr3fhSz1KokUYAuo9uvXWW23QoEHuZ/Uo6XkUpu64446Yr2XlypWWk5MT83cKZuppUlhSGerXr1/k9xdccIGdccYZhWU98sgjbdiwYda7d293nwKbtomm3ic9jp4XAFB56FECACSEekMUgopbBEK9KAov1157rb3xxhulPp5Cx4033uiGqClEafjd4sWLd+lROvDAAwv/X8+vsLVu3Tr3s57z4IMPLgxJPvUw3Xnnne6xg9sll1zierby8/Nj/o2GwGmYXiwa4rd582b3+vyQ5JdVQwqlU6dORe7bunWr5eXlFfm72rVrF1seAEDFICgBABJCIUYrwcWiOUArVqxwvTUKGupVOe2000p8PIUk9SBpDpKGsCn0KFRovlM0rb4XTWEpGFqngFFaGFOvkh47uH366ae2bNmyYsNQo0aN7Mcff4z5O/VuqVdNc49iiS5rECpj3eevIPjDDz8U9rwBACoHQ+8AALvtrbfecgFj8ODBxW5Tr149O/PMM91NIUlzjhQA1NujsKAFEKK9//77ridKizwEoUYr7cVDPThPPPFE4fPECnCazxQ9HK806qF67LHHYvagaX5Ux44drV+/fvbPf/7TzY/aXVrcQb1Mel4AQOUhKAEA4qL5N2vXrnXB5rvvvrPXX3/drWCn1dy0UEEs999/v1vxTif7mZmZ9uKLL7ohchpSJ1rYQYs2dO3a1a2qt+eee7o5TVocQgs4KJBoLo/f01IaDYVTj1T//v1dGVUGLfqgOUaaH3T77be7cmvBBYU3lU3D8T777DMbNWpUzMfUcugKbf/5z39cKPJdc801rm70uFoJUPOydod60zR3ap999tmtxwEAxIehdwCAuCgYKXAo3KhXSIsWaFU7LbNdrVq1mH+jFeLuvfdet4KblvlWz9C//vUvF0yCletmzJhhLVq0KOw5UbhSYNKS2QpLWvBAPUDxfg+R5gs1btzYDYvT0L177rmnsJx6zFdffdVto3L95je/cYtBRC824WvYsKHr5dLKfcW5/vrr3ZA+PeecOXNsd0yZMsXNmwIAVK6MiMYOAACAMtM8pJ49e7phcVoAoqKo10pLry9dujTm4hAAgIpDjxIAAHHS3KcxY8a4BSoqklbfe/rppwlJABACepQAAAAAwEOPEgAAAAB4CEoAAAAA4CEoAQAAAICHoAQAAAAAHoISAAAAAHgISgAAAADgISgBAAAAgIegBAAAAAAeghIAAAAAWFH/D3+nVj/F0SoRAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Extract all distance values\n",
    "distance_values = list(dist.values())\n",
    "\n",
    "# Calculate minimum and maximum distances\n",
    "min_dist = min(distance_values)\n",
    "max_dist = max(distance_values)\n",
    "\n",
    "# Display the range\n",
    "print(f\"Minimum distance: {min_dist:.2f} km\")\n",
    "print(f\"Maximum distance: {max_dist:.2f} km\")\n",
    "\n",
    "# Plot histogram of distance distribution\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.hist(distance_values, bins=10, color='skyblue', edgecolor='black')\n",
    "plt.title('Distribution of Distances Between Schools and Candidate Sites')\n",
    "plt.xlabel('Distance (km)')\n",
    "plt.ylabel('Frequency')\n",
    "plt.grid(True)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c54bb9db",
   "metadata": {},
   "source": [
    "## Model implementation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c97a3f3d",
   "metadata": {},
   "source": [
    "When passing sets, lists, or range objects to [prob.addVariables()](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/python/HTML/problem.addVariables.html), the result is a Python dictionary of variables, whose keys are tuples of indices. Variables $serves$ and $build$ are created this way.\n",
    "\n",
    "The objective and constraints are then created and added to the problem directly by passing the corresponding expression as a list comprehension in the code cell below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddf5c0a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average distance from a school to its assigned park: 2.00\n",
      "Maximum distance from a school to its assigned park: 3.54\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAIvCAYAAABuhDEcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVcFJREFUeJzt3Qd0lNUWhuGd0HukhmjoTYqAUpTeuyCooMgFBK6KCiICiop4QUAExIqooBQbKljoTYrSQUAElF6U3kMgkHbXPnFigJQZMjP//DPvs1ZWTDLgQUPmm3322ScoPj4+XgAAAGwo2OoFAAAA3CyCDAAAsC2CDAAAsC2CDAAAsC2CDAAAsC2CDAAAsC2CDAAAsC2CDAAAsK2MzjwoLi5Ojhw5Irly5ZKgoCDPrwoAAAS0+Ph4iYiIkLCwMAkODk5fkNEQEx4e7s71AQAApOnw4cNy2223pS/IaCXG8Zvlzp3bmV8CAABw0y5cuGCKKI4Mkq4g49hO0hBDkAEAAN6SVksLzb4AAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAMC2CDIAAK9avny5BAUFJfu2du1aq5cHm8lo9QIAAIGpb9++Ur169Ws+V6pUKcvWA3siyAAALFG3bl154IEHrF4GbI6tJQCAZSIiIiQmJsbqZcDGCDIAAEs8+uijkjt3bsmaNas0bNhQNm7caPWSYENsLQEAvCpz5sxy//33S6tWrSR//vyyY8cOGTt2rNlqWr16tVStWtXqJcJGguLj4+PTetCFCxckT548cv78eZOeAQBwpz179sgdd9wh9erVkwULFli9HPgAZ7MHW0sAAMvpaaV27drJsmXLJDY21urlwEYIMgAAnxAeHi5Xr16VyMhIq5cCGyHIAAB8wr59+0zjb86cOa1eCmyEIAMA8KqTJ0/e8LmtW7fKjz/+KM2aNZPgYJ6a4DxOLQEA3OLsWZGlS0V+/lnk/HmRTJlEypYVadFCpEIFkaCghMd16tRJsmXLJrVq1ZKCBQuaU0sfffSRZM+eXV5//XWr/xiwGU4tAQDSbd48kWnTRPQZJemzihZX4uK0mVfk+edF8uQReeedd+Tzzz83J5X0+aVAgQLSuHFjGTp0KFcUwOXsQZABAKTL3LkiU6em/hgNNKGhIiNGiOTI4a2Vwc44fg0A8LhTpxIqMWnRqsyxYyKzZnljVQgkBBkAwE1bsuTf3hdnwow+/upVT68KgYQgAwC4acuXJwQUZ12+LLJliydXhEBDkAEA3DQ9neSqc+c8sRIEKoIMAOCmZczonV8DpIQgAwC4aSVLJpxIckWJEp5aDQIRQQYAcNN02J2zPTLaFKxjYooV8/SqEEgIMgCAm1atmkjhws5VZXRqWYcO3lgVAglBBgBw07Tf5aWXEib2phRmHMezu3RJCD6AOxFkAADpUrCgiF6RVL++o5E3XuLjYxIDTHi4yHPPibRta/FC4Ze4ogAA4DYXL2rl5S0JCgqR//63u5Qpk9AQ7OzQPMCBKwoAAF6XM6fIoUPTJDR0nbRqldDcS4iBJxFkAABu9ddff8mtt95q9TIQIAgyAAC3uXLlipw8eVJuu+02q5eCAEGQAQC4zZEjR8x7KjLwFoIMAMBt/v77b/Oeigy8hSADAHBrf4yiIgNvIcgAANxakcmVKxejOuA1BBkAgNtwYgneRpABALi1IkOQgTcRZAAAbq3I0OgLbyLIAADchooMvI0gAwBwi7i4ODNHhooMvIkgAwBwixMnTkhMTAwVGXgVQQYA4NYZMlRk4E0EGQCAW6f6UpGBNxFkAABuCzKZMmWSAgUKWL0UBBCCDADAbVtLYWFhEhzMUwu8h+82AIDbKjL0x8DbCDIAALfgegJYgSADAHALKjKwAkEGAJBu8fHxVGRgCYIMACDdLly4IJGRkVRk4HUEGQCA24bhUZGBtxFkAABuG4ZHRQbeRpABALitIlO4cGGrl4IAQ5ABALilIlOoUCHJnDmz1UtBgCHIAADSjRNLsApBBgCQbsyQgVUIMgCAdKMiA6sQZAAA6UZFBlYhyAAA0iUqKkpOnTpFRQaWIMgAANLlyJEj5j0VGViBIAMASBem+sJKBBkAgFum+hJkYAWCDAAg3RWZ3LlzS65cuaxeCgIQQcZPXLx4UYYOHSotWrSQvHnzSlBQkEyZMiXZx3799ddy9913S0hIiOTLl0/q168vc+fO9fqaAfgHTizBSgQZP6EnBoYNGyY7d+6UypUrp/i4d999Vzp16iT58+eX119/XYYMGSLnz5+XNm3ayKxZs7y6ZgD+gRkysFJGS//tcBu9qO3o0aMSGhoqGzdulOrVq6cYZPRrs2fPNlUb1aNHD/NDaOrUqdKhQwcvrxyAP1Rkbr/9dquXgQBFRcZPZMmSxYSYtFy4cEEKFiyYGGKU7m3nzJlTsmXL5uFVAvBHVGRgJYJMgGnQoIEsWLDAVGYOHDggf/zxhzz11FNme+mZZ56xenkAbCY2NtZUg+mRgVXYWgow77zzjumn6du3r3lT2i+zdOlSueeee6xeHgCbOX78uAkzVGRgFYJMgMmePbuULVvWvHrSBt+IiAgZP3686Y35+eefpVSpUlYvEYANZ8hQkYFVCDIB5sEHH5SMGTOaZl+Hdu3aSenSpeWll16SGTNmWLo+APbCVF9YjR6ZALJv3z7TH9O2bdtrPq9zZ+rUqSOrVq2ybG0A7FuRyZw5s9miBqxAkAmwvWyl+9nXi46OlpiYGAtWBcAfTiwlPQkJeBNBxqaioqLk0KFDpsqiP0g0iKRF+1+Cg4PN9lF8fHzi5/XXa39M1apVPbxqAP6Gqb6wGj0yNnPu3DnZtm2bOTodFxeX+Hnte9m8ebPkyJFDTp48aT6nfTCO/es+ffpIgQIFzPC7SZMmSePGjU2Drzb7TpgwQS5fviyDBw+27M8FwJ6YIQOrBcUnfWmeyhC1PHnymFkjOjwN1jh27JgsWbLEBJjk/rcNGDDAHK1Ozv79+6VYsWJm+2jixIkyefJk2bNnj/maTvrVqwoaNmzo8T8DAP9SpkwZc2BgzJgxVi8FfsbZ7EGQsQn9f6AVlrT6WHSfWif06g8WbcADAE/Rpw+tAo8cOVL69etn9XLgZ5zNHvTI2MSOHTuSbdJN7gfLpUuXZO/evV5ZF4DA3urWbWm2lmAlgowNaCOvbgM5UTxLpLdgu/J4AHCVowePZl9YiSBjA2fPnnWqGpOUNvFeuXLFY2sCAMdUXyoysBJBxgZudr4Lc2EAeLoio315hQsXtnopCGAEGRvIkiWLV38dADhbkSlUqJBkypTJ6qUggBFkbECvENCTAc7SV0hhYWH8cAHg8YoM/TGwGkHGBjSY3H777U4/Xpt8XXk8ANxsRYb+GFiNIGMTZcuWNZUZZ+4zKVKkCD9cAHgc1xPAFxBkbEKvIGjatKnky5fPfHx9oHF8XLRoUalXrx4XuAHwOK4ngC/griUbyZo1q7Rs2dK8CtI5MXplgW4j6UWQ4eHhUq5cOdN4R4gB4Gk6CO/MmTNUZGA5gozNOEKLvmmI0fkyGTJkILwA8CpmyMBXEGRsTMOLbjkBgFVBhooMrEaPDADgpq8noCIDqxFkAAA3VZEJCQlxacYV4AkEGQCAyzixBF9BkAEAuIwZMvAVBBkAgMuoyMBXEGQAAC6jIgNfQZCBT9i+fbs8+OCDUqJECcmePbvkz5/fTCiePXu21UsDcJ2YmBg5evQoFRn4BIaQwCccPHhQIiIipFu3bubm7kuXLsnMmTOlbdu28uGHH8pjjz1m9RIB/OP48eMSFxdHRQY+IShex8Om4cKFC5InTx45f/685M6d2zsrQ8DTqcV33XWXREVFyR9//GH1cgD8Y926dXL33XfLli1bpHLlylYvB37K2ezB1hJ8ll69oFcxnDt3zuqlAEiCqb7wJWwtwadERkaay+g0gf/4448yf/586dSpk9XLAnDdiaUsWbJI3rx5rV4KQJCBb3nuuedMT4zjgswOHTrIe++9Z/WyACRzYonLauEL2FqCT+nXr58sXrxYpk6dKi1btjR9MlevXrV6WUBAuHjxogwdOlRatGhhqi0aVKZMmXLD45ghA19CkIFPKVeunDRp0kS6du0qc+bMMT9Y7733XnGiJx1AOp06dUqGDRsmO3fuTLWJlxky8CUEGfi0Bx54QDZs2CC7du2yeimA3ytcuLCZD6PjEMaMGZPi46jIwJcQZODTtPFXafMvAM/SBt7Q0NBUH6PVUSoy8CUEGfiEEydO3PC56OhomTZtmmTLlk3Kly9vyboAXOvMmTNmthMVGfgKTi3Bo+LiRH79VWTZMp0GqrNhRIoVE2naVKRUqX8f9/jjj5vhR3otgf6APHbsmHz++edmEN64ceMkZ86cVv4xAPyDGTLwNQQZeIy2tbz5pr6C06PUCaFGHTyYEGzKltXj1iIhIWJmxUyePFk++OADOX36tOTKlctM9R09erS5pgCAb9D+GEVFBr6CIAOPhZhXX/03vDjeJ/3n3btFXnpJZNQokYceesi8AfD9iozOeEqrlwbwFnpk4HaxsSLjxiUElqQB5nr6tdOnRT75xJurA5DeioyGmIwZeR0M30CQgdtt2iRy9mzqIcZBH7N2rQjXKQH2wIkl+BqCDNxO+1+0J8ZZOuvul188uSIAFy+K7N+f8Kb/fLOYIQNfQ20Qbqenk5ypxjho6Dl1ypMrAgLXn3+KzJsnsm7dv38v9e/c3XeLtGyZ0HSflN5tpjfOHzlyxHw8e/bsxAbfPn36mIpMw4YNvf7nAFJCkIHb6RFrV7lSwQHgnO+/F/nii2tPDSbd0l29WuSRR0Tatfv3a2PHjjWTfR1mzZpl3lSXLl2oyMDn8PQBtyta1LVgos3BbLkD7rVkSUKIUclVSB2f+/xzkaVL//38gQMHzPTe5N4KFChgqjX0yMCXEGTgds2auba1lDWrSK1anlwREFj0wngNKM767DOdpO38MDwqMvAlBBm4XdGiVyVDhn0SF5f2T8agIJEWLRLCDAD30G2jyEjnH6+P1R6atDDVF76IIAO3OnnypDRt2kTmzm0o2bNfSXWLSUNM5coiHTt6c4WA/9uyxbXtXX3s5s1pP46pvnDWpk2bpEWLFpI7d24zqb1Zs2ayRb8xPYBmX7jN1q1bpV27dubG6vnzZ0mFCjnNsDvHKz3HD1bticmSJaES06mTCHO1APfSS+Nd2d7Vx1665FxF5pZbbjEXuQIp+fXXX6VOnToSHh4uQ4cOlbi4OJkwYYLUr19f1q9fL2WvPyqXTjyFwC1mzpwpXbt2Nd+g33//vRQpUsR8vn//hLuWdE6MHrHWMKNf0p4YtpMAz9Cccf1JpdToY7Nnd64iw7YS0jJkyBATdtesWSP58uVLPPFWpkwZefHFF83zhTsRZJAumrSHDx8ur776qnTs2FE+/fRTyX7dT8S8eUW49xHwnjvvdG3IpAYe/TXOVGTYVkJafv75Z7Ot5AgxqnDhwqYiM2fOHLl48aLkzJlT3IUeGdy0yMhIE140xLz22mvy1Vdf3RBiAHhfzZoiOXI4/3h9TtFfkxYqMnDGlStXkt1+1OeHq1evyu+//y7uRJDBTdGBWbVr15YFCxbId999Jy+99JIEafcuAMtlyiTyn/84//iuXZ3rVaMiA2doi8HatWslVhsi/6EBZt0/DZOO02/uQpDBTZUNq1evLufPnzd7oPfdd5/VSwJwnUaNEgKKSu4Ek+Nz+pgGDdL+/aKjo+XYsWNUZJCmJ598Unbt2iU9e/aUHTt2mAqM9lAePXrUfF0PhLgTQQYu+fjjj6Vx48ZSvnx52bBhg1SqVMnqJQFIQZs2IiNHitSufe3VIUFBsVKnTsLX9DHO0BCj032pyCAtTzzxhGnq/eKLL6RChQrmeWLv3r0yaNAg83V39scoggycoq/G9MK4xx57THr16iWLFy+W/PnzW70sAGkoVUovexSZPFnkzTf1EsnWEhr6kjz9dMLXnMUwPLhixIgRcvz4cVPB/+2338wLXz0covT0kjtxaglpOn36tGnqXblypZkF0Lt3b6uXBMBF2oevb6GhMXL48C6Xfz3D8OAqnTmk82QclixZYoJwuXLlxJ0IMkjV9u3bzZA7vShOqzANnNlMB+CzihYtaqauukorMnoSRZ+cAFfNmDHDVGX0dvVgV8ZOO4EggxTNnj1bHnnkEfODT0NM8eLFrV4SgHQqVqzYTQ0k04qMVmM4nRi4YmJizO3oe/bsMeM39HtBZ8VohaVgwYKJ3xtavR82bJi5lkC/rieYdMaYzpZ55pln3L4uggxuoA19o0ePNs1aWo2ZNm2auSsDgP3pC5MzZ85IRESES3+vtSJDf0zg+vvvv2XFihWmXzIpHW6n4UYDS6NGjcysGA28GTJkkDFjxpjvM30RrLPG+vfvLxk9cCcNQQbX0GNxemTuyy+/NGOmddidu8uAAKytyDhmQVWsWNGliozj6hEEXohZunSpeZF7PcfnNBzPmzdP2rRpIyVLlpSFCxd6bX08Q+Gab9Z69eqZu5J0P1NLg4QYwP8qMo4g4woqMoG7nbRixYpkQ0xS+vVLly6ZPhhv41kKhk5crFatmjkut2rVKnNKCYD/0TtvtLzvSpDRJymm+gamAwcO3LCdlNr3yf79+yUqKkq8iSAD0wOjl3mVKFHCpOmqVatavSQAHqK9C7pFpE9Qroxg0PtzqMgEnj179rj0eA0zrnxvuQNBJoDpPRgDBw6Ubt26mdNJP/30kxQqVMjqZQHwwvaSKxUZZsgErsjISJcer+0Irv6a9KLZN0DpXJiHH35YFi1aJG+99Zb07duXY5VAADX86owoZzHVN3AFu9gnqRUZb/dWUpEJQHqZ1913323O9s+fP9+c6yfEAIHjZioyuiVFxTbw5MuXz6XnBw0yefPmFW8iyAQYPRJXo0YN8425fv16M7AI/ktnPAwdOtQMotIfLvr/fcqUKTc8Tr8X9Mbau+66SzJlykSwDYAgo439zt5CrBUZbRLWMIPAUrZs2TRPLCWVJUsWCQ8PF28iyAQI/UYcP368tGrVSmrXrm2qMaVLl7Z6WfCwU6dOmWP0O3fulMqVK6f4OJ3/MGnSJBNgtOkbgTFL5tChQy5N9UXgKViwoEtVGZ1NxNYS3E5PG/To0cNMVRwwYID8+OOPkidPHquXBS/QV9FHjx412wg6ZTMlehHo+fPnZePGjdK0aVOvrhG+P0uGGTKBKygoyEzszZEjR5phRl8EVahQQbyNIOPnjh07Jg0bNjSTeqdPn26uHqA8HDi0zBsaGprm47T3QS8ERGDQUKKvmp09JktFJrBlz55dWrduba4acFRb9L0j2OjPGd2W1puurdiW5tSSH9Mbbu+77z5zzFov8dLeGADQPigNJlRk4KysWbNK3bp1pXr16iYA6xRfDTN6G7r2xFg5BZ4g46e++uorefTRR6VSpUry3Xff8WoKwE2dXNKGcd125GcIHIFGb7v2JWwt+Zm4uDh56aWXzIyY+++/39yRwQ8gAMk1/DqztcQMGfg6gowf0evS27dvL6NGjTK9MNoTQ98DgPRUZJjqC1/H1pKf2Ldvn7Rt29Ycp5w9e7ZpzAKA1CoyWm25evWqZM6cOc2KDEEGvoqKjB9YtmyZacDSY9Z6izUhBoAzFRmdL+WouKREv65zRLQ3AvBFBBmbmzBhgpn7ceedd5oQc/vtt1u9JFhEn5ROnjwpW7duNfNgfvvtNzlz5ozVy4LNZ8lwYgm+jq0lm9JysN6RNHHiRPN+7NixkjEj/zsDlT7Z6HH7s2fPmjkO+qbBZvPmzbJmzRoJCQmRCxcumMfq1qPjVXifPn3McER9MtOeKqUhSL322muJT3j/+c9/LPuzwTOKFCli3qfV8MsMGfg6nvlsSF91P/jgg7J69WozVr5nz55WLwkW90f9/PPPiR9rgEl6N8q3334rp0+fTvx41qxZ5k116dLFBJn9+/fLkCFDrvl9HR/Xr1+fIOOHdKtIhyU6U5HRYWeAryLI2IxuF7Rr184MI9LeGL03CYFLt45++eWXVB8zbtw4814HVumAxFy5ct3wmAYNGrh0MRwC5wi2VmT0IAHgq+iRsREdbFerVi2zTbBhwwZCDMxlkM7SoPLnn396dD3wryPYuoV94sQJemTg0wgyNqBPQMOHD5cOHTqY26v1FbhjfxuBS59kdFvJ2UqKPm7Xrl3mygrAmSCjF47q9w09MvBlBBkfFxkZKZ06dZJXXnlFhg0bJjNmzDC3kALavKuTnF0RHR1ttiUBx9bS4cOHUwy3TPWFHdAj48N0uJ32w+zevds0Z+rUXsDB1RCT3l8H/6zIxMTEyJEjR8zFf9djqi/sgIqMj9Lto2rVqpnjtHo6iRCD691MZU6PZXNtBZJWZFRKDb9akdHvMz3ZBvgqgowPmjx5sjRq1MgMt9Om3jvuuMPqJcEH6RNMoUKFTDhxhj5OX3WnNo4egSWtoXiOGTLOfo8BViDI+BAt8epwu169ekmPHj1k8eLFUqBAAauXBR+mYdeVZt9y5cp5fE2wVxjW6wdSCjJM9YUdEGR8aB5Iy5Yt5f333zfXDujEXl45Iy16eq1kyZJOh57ChQt7fE3wn1kyTPWFHRBk0uHixYsydOhQadGiheTNm9eUX6dMmZLsY9977z3zRJIlSxbzg6F///7mRJJjFkjNmjXl119/NVWY3r17e/lPArvS7zmdLeS4Y+v6LQDHdQW6PakXiwKuHMHWigxBBr6OU0vpcOrUKXMkWl8VV65cWZYvX57s455//nl544035IEHHjBbRzt27JB3331Xtm/fLn379pWHH37Y/DDRfpgSJUp4/c8Be9OJvTVq1JDy5cubOTH6KlpnzGho1u/N0qVLS/bs2a1eJny4IqP3byV3uo2tJdgBQSYdtEyvA6P0vhK9aC+5V7z69TfffNPcVTNt2rTEz+uTi4aYRYsWmfHfn332WbKj4wFn5cyZ09yCrm+As/RFlI560OCioTjpCzWdO0RFBr6OraV00Fe8GmJSozcPaxPvQw89lPi5y5cvy4oVK8w/V6hQwVw9QIgBYFWQuXLlirmKILkZMlRk4OsIMh6mPyCUY3aHlmr1NuG5c+eajzXkJH0VBAC+MEvGMdWXigx8Hc+gHla2bFnzftWqVbJ+/Xqz/aTbTWPGjLnmhwUA+NIsGa3IZMyYUQoWLGjRygDnEGQ8TPsV9ETSiBEjzG3VuhX1+uuvy9ixYyVTpkxmmwkArBISEmIm9yZXkdE+wAwZMli2NsAZBBkP08vYqlatKlFRUWYbafPmzdKtWzfp2LGj+bw2aAKArx3B5sSS53Xv3j1xREJyb1TsncOpJQ86f/68dO7cWRYsWCDjx4+XVq1ayfHjx82JJa3MhIWFSZkyZaxeJoAAl1yQYRie5z3++OPSpEmTGyZwP/HEE6Z3if/+ziHIeIjeWK3Hqo8dOybz58+XZs2amc87govOktFeGU3kAGAlfdJcunTpNZ/TakDFihUtW1MguOeee8zb9RcGX7p0SR555BHL1mU3bC15gE7n1QFlmqzXrVuXGGIcdF7DoEGDzJAyTd4A4AsVmaT3dlGRscYXX3xhtpW0mg/nUJFxlv4F37lT47LuGYlkyiRSsqS89+efci4qSo4cOWIepltI27Ztk1KlSplhdzpZVaf5ao9MlSpVzIAp/UbVE0xTp041XwcAqysyemXK6dOnJX/+/HLhwgWJiIigR8bL9Pnh66+/NteOOI7FI20EGWfs2aOXJYloWNGZL3FxeomNTruTsXPnysF/7kxSv/32W+LWklZelDb1vvXWW/L5558njpPXMm7Dhg0t+yMBQHJHsDXIMEPGGgsXLjRhkm0l17C1lJY//hB55RW9ayDh43/CianQxMfLgVatJO7BB+XnNm0ka+bMpsqi5Vl9cyRq7YPZsmWLuWRSX+ksWbKEEAPAZ2fJOILMN99849SluEkrCnrnlz5WR0zANVqt17EceqoVziPIpCYqSmT0aD1DnRBcUqD3DdfKmlX+GDtWunbt6tUlAkB6aRVGe/Ycs2Qc1xPo5bY7d+40l+I6Qx+v9zbBdfpC94cffpDmzZtLvnz5rF6OrRBkUrNqlYhuG6USYhz0FUjR33//t2IDADZhfn4lOYKtFRkNN3qyUj/nmESeGr2radiwYfL88897YcX+5/vvv+e00k0iyKRm8eKEXhgnmEedPSuydaunVwUAbqdb4UkrMtrom9aluEm98MIL5kqWLl26eHCV/kt7KHVAqo7tgGsIMqnRvhgnqjGJNPQ4emkAwEaur8i4cmLJcQpTDzVodQcJLl0SOXUq4X1qTp48aXon27dvb7b44BpOLQEATJD56quvEisyerrSGXqwoU+fPtKpUycz3O36O5sCTXS0OdAq8+eL7N377+dLlRJp2VKH4IlkvO6Zd8aMGeYKG7aVbg5BJjVaVtW/lM5WZfRxLpRiAcCXtpbOnTtnrlZxpSKjJ5l0dta3334rge7CBZGRI0X27buxK0FDzbvvisydK/LiiyK5c1+7raS3jF9/XQGcw9ZSapo2dW1rKSRExMnufgDwxSPYOgNLG3edmSGj4yQGDx4sAwcOlPDwcAlkV6+KvPZawmtfdf1Th+Nj/bqGHX28w5o1a8w9fNw0fnMIMqmpU0dE9yud3fNt1UqEb0QANuSYe7V582bz3pmKjM6KuXr1qtlW0i0lfXMc3T579qz5WL8eCJYvTwgpaR1c1a9rxWblSm+tzP8RZFKTNavIoEEmnMTrRN+UaNC5806Re+/15uoAwG0KFSokmTNnlu3bt5uPnanI6MwYDSwVKlSQ4sWLm7e6deuar40cOdJ8rBfk+juttsyb5/zj9SlDe2hcKfgjZfTIpKV8eZFXX5WoMWMk2/nzEhcUJMH63eeo0mjA0S0oHYRHNQaAHcXHS/Du3TLhnnuk2KFDUvbOO6WYTvctXTrhXrkU9O3bV+67775rPqfbUo8//riZaN6uXTsTZvzdiRMJN9g4S59CDh/W00oiBQt6cmWBgSDjjDJlpFdkpATv2SPTHntM5Nw5kcyZzaWRolcNJO3aAgA7+fNPkY8+Ms+s3QoUMJ+qV7y4ZPr4Y3lvyBA5V6aMHMmRw3x+9uzZiVtHelLpzjvvNG9JOU4taZXm+pBjN7GxsaYBWt+08uR4u/7js2dvEZHXXf79k1zTh3QgyDhBz/h/O3OmKZUGPfGE1csBAPfQS25HjUps7MjoqDT/837stm1ycN26xIfPmjXLvCkdfJcnTx7xdVeuXEkziKT0sTYzJ0dn5YSEhMgtt9xi3vLmrWjOetxM9wLSjyDj5PFC/cbVUikA+AV9ktarBzTEpNCscaB1638/6N9f5O67nWoa1tky7qK/l47udzWEON4uX76c7O+rlzM6gogjlBQuXNhcepk0pCT9uuMtV65cEpykb1L/E/bunTDc3Vl582pfkjv+C4Egk4a4uDj58MMPzW2kXOQFwG8sW5ZwBtiZ0KEVmtmznQoyKf0c1erGzQQR/Vhv1U6OTsG9PmiUKFEizSCiH+uvddcUYs00zZvrYDvn/3PqcLzUzpDAeQSZNOjY6L1798q0adOsXgoAuM/Cha4N+9y9W87+9pucypbN5eqIDtnTMJMc3Z66PmiEhYWlGUT0vZ6y8hV65kP/k54/n/oRbA0vt9wi0rixN1fn3wgyaZg4caJUqlTJjN4GAL8QE5NwCZCLerVqJbP0NFMSOsTt+rChN2eXKlUqzSCiIcZfhsDlyiXyyisiw4alHGY0xGhb0ZAhIjlzWrFK/0SQSYWO6f7xxx/l3Xff5SI0AP7jJntYnh84UPpWqXJNGNEbm/n5mEBH77zxRsKMmEWLRC5evDboaNVGt5Rs0CNtKwSZVEyaNEmyZs3KRV4A/IvOhtFn1ogIl35ZDW3+1dsPkSINKQ89JPLAAwkTfLXXOFs2kRIlbrwsEu7Bf9YU6E2kH3/8sQkxuZkTA8Df6AWFP/yQ9kx9h7CwhNlZcIqGljJlrF5FYKBnOgVz5841W0tPMDcGgD/SfQ5XtGnj/L1zgBcRZFJp8q1Zs6ZUrVrV6qUAgPvlz58w/CQtGl702HWjRt5YFeAytpaSsW/fPlm4cKF88sknVi8FADynfv2EfpmPP06Yl6+hxdEIrP+sbzogRe+SY+gJfBRBJhkfffSRORaoQ/AAwK/VqiVSvbrI2rUJb3p2WGfn3357wrCTm5m9D3gRQSaZezm0EtOtWzcz+REA/J5WZerWTXgDbIZa4XX0QjS9JJImXwAAfB9BJpkm3wYNGki5cuWsXgoAAEgDW0tJ7NixQ1auXClfffWV1UsBAABOoCKThN5yXbBgQWnfvr3VSwEAAE4gyPwjMjJSpk6dKj179vSpG1UBAEDKCDL/mDFjhly4cEH++9//Wr0UAADgJIJMkibfFi1aSPHixa1eCgAAcBLNviKyadMm2bBhg/z4449WLwUAALiAisw/1Zjw8HBp1aqV1UsBAAAuCPggc/78efniiy9Mb0yGDBmsXg4AAHBBwAeZzz77zFxLoKeVAACAvQR0kImPjzfbSvfdd5+EhYVZvRwAAOCigA4yq1atkt9//517lQAAbnXx4kUZOnSoOQ2bN29eCQoKkilTptzwuO7du5uvXf/GNTnOC+hTS1qNKVWqlDRq1MjqpQAA/MipU6dk2LBhUqRIEalcubIsX748xcdmyZJFJk2adM3n8uTJ44VV+oeMgfxN9s0338iIESMkODigC1MAADcrXLiwHD16VEJDQ2Xjxo1SvXr1FB+bMWNG6dKli1fX508C9hlcS3xavtOyHgAA7qRVFg0xzoqNjTXT5eG6gAwycXFxZlvpwQcflPz581u9HACwpD/j448/lvr160uhQoXME69ONn/00UflwIEDlqw7UF26dEly585ttpP0/9dTTz1l/h/COQEZZJYuXSp79+41Tb6//vqrtG3b1nzzZM+eXSpWrCjvvPOO1UsEgHT3Z+zcudP0Z6Rk8+bNJrwMGjRIPvjgA7O9MX/+fLMNcuTIEa+uOZC3oPS//6effipffvmleT6aMGGCCaExMTFWL88WArJHRqsxGlg08Wqjb9WqVWXIkCGSM2dOE3D++usvq5cIAB7vz9AnzOvpOIpq1arJtGnT5IUXXvDCagPbqFGjrvn4oYcekjJlyshLL70k3377rfkYqQu4IPP333/LDz/8IKNHj5Zu3bpJ69atzTcLDb8AArU/I6lixYqZ9+fOnXPzquCsZ5991ry4XrJkCUHGCQEXZCZPnixZs2Y1weX48eOJp5YiIyMlW7ZsBBoAAef06dOm2fTQoUNmS0o1btzY6mUFLH0uypcvn5w5c8bqpdhCQD1r636jNrd17tzZDMPT5iqt0JQtW9ZsK+nHvXv3lqioKKuXCgBec+utt5qGX92CWr16tekTbNq0qdXLClgRERGmz6lAgQJWL8UWAirIzJs3z/S/aFjZvXu3CTbt2rWT5s2by8yZM6VHjx6mf0a79gEgUGiDr/58HDdunBngphVqeJ6+aNbQcr3hw4ebK3S04RdpC6itJe3Kr1Gjhmnu1UZfPfKmJ5ccp5Q6dOggV69elQ8//NCUV0uXLm31kgHA4xo2bGjet2zZ0ry408MQWqV++umnrV6abUZ66CkvPbau4UQH3BUsWFAWLVpknmscJ8Bmz56deJikT58+cvbsWfN89PDDDydeSbBw4UITKjXE6P8LpC1ggsy+ffvMN4j2yDj2IJV+AyWl204aZNasWUOQARBwSpYsaZ5cP//8c4KME7Q9Qbfj9IWxzuvRSoo6ePCg6cHULSKHWbNmmTelR91DQkKkTZs2snjxYpk6darpU9Jrc0aOHCkDBgygZ9NJARNktDdGhw116tTJfKy3XW/fvt3sCyelKVppUgaAQHT58mW5cuWK1cvwedocvWzZssSPHSHGYezYseZ9iRIlpE6dOiboXG/69OleWKl/C4i4p9tFWonR49Y69E7dddddiWk6KUcJkCYrAP5MewSTe8G2fv162bZtm5klg9TD3ooVK5zeEdC+THiGX1ZkNBSfPCmi/WpZs4osXz5LTp48KY8//njiYzp27Civv/66CThJb7/WG0h1f7NBgwYWrR4AXKPHdPXJUp9cdTtCj+4uWLAg1f4MrR6Eh4ebKnWFChUkR44cJsDohFmtXuscE6RMg4n2xjhrx44dpl0huaoM0sevgoxWQvWm9PnztbLy7+djYxtKy5YfSHj47Ymf0z1gPaX0ySefmFcmet+IXrOuN2IPHjzYbD0BgC/ToXU6SkL7MJI+Qe7ZsyfN/gz9GderVy+zNaJDQTUE6ee0b/Dll19OHIyH5P35558uPf78+fMcqfaQoPjrN/WSoTdyakLX/xE6a8UX6RDK117TPcsbvxYfH2f+kufPHySvvCLiGHgZHR1tmqr0FYi+ailatKi5rKtfv35eXz8AuFqF0WPT2iCa2o9xrbpohZnGUffRSszN9LbUrVvX9MvAOc5mD7/4zr56VWTECJGUrkgKCtI/ZpDokMT//U+HDSV8PlOmTOaGWD0yp300WiokxACwwxOpXn6bVohRhw8fNgcbAH/lF0Fm1So96qZ/uVN/nH5dw8zChd5aGQB45rSMHvd1oqCe2J/hSj8HUqfVLe0pcpWv7mjYne2DjP49njdPqy7OP16DTGysp1cGAJ7rz3ClaVSHtDkafeEeerWNK3RmjDZhw/1sH2R0m0irMU6+MDHOn0/4NQBg1yZfZ6sxSkOP9hvAfXRwXYYMGZx+vJ4M48SSZ9g+yFy6dHO/7vJld68EALzDlRCTnl+DlOl0eG2idiacaOjRicnwDNsHmX9uGvDarwMAq7naa6EhRu9Ognvddttt5pZwx39bR6hxvNeKTeXKlaVWrVpUYzzI9nNk9O9z0aIJx66dfcGRJ0/CrwEAOypTpowZ8uksPaGpt1rD/QoXLmwuHD527NgNl0bqUWv9bw/Psn2Q0ZDbsqXIxInOP755c03Knl4ZAHiGDqvbsGGDmYXlzJaRNqa60s8B12i1RQONvsH7bL+1pOrUSaiwpDXvSb+eN29CkAEAu9JX/A0bNkxzu0K/rpNkq1Sp4rW1Ad7mF0Emc2aRl17S/cqUH6N/3zXEDB0qkiuXN1cHAO4XGhoqzZs3T5xnkjTUOP5ZKzfNmjWjGgO/5jdXFKR215Ie3W/RQqRxYxH63QD4E/0Rrles6KWRkZGRJrTovBLto6HBF3bmbPbwqyDjoH+iEycSbr/W00mFCqW97QQAAHyHs9nD9s2+ydGqqoYXAADg36hTAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAAAA2yLIAPCKixcvytChQ6VFixaSN29eCQoKkilTplzzmLi4OPO5tm3bSnh4uOTIkUMqVqwor732mkRFRVm2dgC+iyADwCtOnTolw4YNk507d0rlypWTfcylS5fk0UcflZMnT8oTTzwhb731ltSoUcMEoJYtW0q8Xm0PAP5++zUA31O4cGE5evSohIaGysaNG6V69eo3PCZz5syyatUqqVWrVuLn/vvf/0qxYsVMmFm6dKk0adLEyysH4MuoyADwiixZspgQkxoNMklDjEP79u3Ne63mAEBSBBkAPu/YsWPmff78+a1eCgAfQ5AB4PPeeOMNyZ07t+mTAYCk6JEB4NNGjhwpS5YskQkTJkhISIjVywHgY6jIAPBZM2bMkJdffll69uwpvXv3tno5AHwQQQaAT1q8eLF07dpVWrduLRMnTrR6OQB8FEEGgM9Zt26dOalUrVo1+frrryVjRnbBASSPIAPAp+gRa63C6OyYOXPmSLZs2axeEgAfxsscAG4XGxsrBw4ckD179pirCYKDg821BDrsTr+mg/HU7Nmz5a+//jL/3KdPH/O45s2by9mzZ2XgwIEyd+7ca37fkiVLyj333GPJnwmAbwqKd2Lm94ULFyRPnjxy/vx5cwQSAFKiIWX58uVy9epVc5+S40eM/nP//v3l9OnTyf66/fv3m/fFixdP8ffu1q3bDfczAfBPzmYPggwAt4YYbdJN7ceKBhrdLmrTpg3bRgDSnT3okQHgFrpltGLFijQvdtSvX7582TT0AkB6EWQAuMWhQ4fkypUrTj1Ww4w+XgMNAKQHQQaAW2hjrys0zOzbt89j6wEQGAgyANxCTye5Qk8oXbp0yWPrARAYCDIA3EKDiasVGVd/DQBcj58iANwiX7585kSSK0Hmlltu8eiaAPg/ggwAtyhbtmyaJ5aSypw5sxQtWtSjawLg/wgyANwif/78UqBAAaerMuXLl5cMGTJ4fF0A/BtBBoBbaIBp2LCh5MiRI80wo5WYSpUqeW1tAPwXQQaA2+ikXr3wsUSJEomNvPre8c9ZsmSRqlWrSr169Wj0BeAWXBoJwK2yZs0qderUkWrVqpmLIyMjI01o0cbe8PBwtpMAuBVBBoDHAk25cuWsXgYAP0dtFwAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAA2BZBBgAAOOXixYsydOhQadGiheTNm1eCgoJkypQpyT42Li5OPvjgA6lSpYpky5ZN8uXLJ40aNZKtW7eKO2V06+8GAAD81qlTp2TYsGFSpEgRqVy5sixfvjzFx/bo0UM+//xz6dq1qzz99NMSGRkpmzdvlhMnTrh1TQQZAADglMKFC8vRo0clNDRUNm7cKNWrV0/2cV9//bVMnTpVZs2aJe3btxdPYmsJAAA4JUuWLCbEpOXNN9+UGjVqmBCjW0xajfEUggwAAHCbCxcuyPr160215sUXX5Q8efJIzpw5pUSJEqZS425sLQEAALfZu3evxMfHy1dffSUZM2aUN954w4SZt99+Wx566CHJnTu3aRZ2F4IMAABw68kmdfr0aVm7dq3UrFnTfNy2bVspXry4vPbaa24NMmwtAQAAt9Gj1kpDiyPEKN1euvfee822U0xMjNv+fQQZAADgNmFhYeZ9oUKFbvhawYIFJTo62q3NvwQZmw8d0s+n9Na0aVNL1g4ACOwgExoaKn///fcNXzty5IhkzZpVcuXK5bZ/Hz0yNh86NH369Bs+p2f7tamqWbNmXlgpAMCfxcXFmebdDBkyOP1rOnXqZJ6HFi9enPiiWp/XfvjhBzPdNzjYfXUUgozNhw516dLlhs9p6NGKzMMPP+yFlQIA/M3Vq1fN6aOdO3dKRESE+VzmzJmlTJkysmzZMomKijLVFTV79mz566+/zD/36dPHnFAaPHiwOWp9//33S//+/c3nJk6caLaVRo4c6da1EmRsPnToeleuXJGZM2dK/fr15bbbbvPI2gAA/uvEiROydOlSE2aS0o+3b98uo0ePNtUVB53eq2+OF9caWrQ/5pdffpEBAwbI+PHjTYC555575LPPPjO7DO5EkPEz8+bNk3Pnzskjjzxi9VIAwCt2794tQ4YMMU+cZ86cMVvynTt3Nk+i2bNnt3p5tnLmzBlZtGiRxMbGJvt13WIaO3as+edatWpJ6dKlU/y9dACeI+B4EkHGz+gFXVrNeeCBB6xeCgB43OHDh80ofK0C6MWEejhizZo15rDEpk2bTE8GnLdu3TrTE+PsY4sVKyaZMmUSKxFk/Gws9Ny5c6VVq1YSEhJi9XIAwOP0wINWobUaU6FCBfO5xx57zDwZT5s2Tc6ePSu33HKL1cu0hXPnzrl0M7VWbfbt2ydly5YVK3H82o9ob4w2YLGtBCCQXsAlN7NED0zoyRhtUIVzDh48aA6KuGL//v1iNYKMn20raXm1TZs2Vi8FALyiQYMG5n3Pnj1ly5YtZqtpxowZ8sEHH0jfvn0lR44cVi/RNqKiolwOMvprrEaQ8RN6VFuPxOlRN+2RAYBAoENDhw8fbuaVVK1a1TT66sWEegxYT8vAeXrBozbzusKV2TKeQo+Mr9B7J06eFImOFsmdW8TFHhe9ZVT3hNlWAhBotOG0Xr165oVcvnz5TK+gzirRERbaAAzn6PUBv//+u5OPTpgsr1t4ViPIWO3MGZGFC0UWL9Z7Cf79fPny8l5EhJwLCZEjR4+mOHQo6baSjoV2lFkBIBDoizht7t21a1fi7KwOHTqYF3bPP/+8GQyq4QZpu/XWW81x9UuXLjnx6ISj2Dogz2pB8U7UkbSZSp80z58/L7m1WgD3+OMPkVGjdIqdzoC+9mvBwVJs9mw5mMI3lDZY6asQ9eeff0q5cuXM9MRx48Z5Y+UA4BO0EqOnZ1atWnXN57/77jsTaHTLqUmTJpatz44zeVavXu3UY3VOTN26dT22FmezBxUZq2hlZcQIHZWosfbGr8fFyYHWrbV2J1K7tkjfvin+Vnr0zdV9TQDwB8ePH0/2eLVOklUxum0Pp+mAO72ZeuvWrWbrKKXnFt0B0IF4voBmX6vMmJHQD5NWANGv//KLyL593loZANiGbm1s3rzZbC0l9eWXX5rj13fccYdla7OrKlWqSMOGDaVAgQI3fC1nzpzm7r/GjRv7RKOvoiJjVV/Mhg03bielRG8J1T6a3r09vTIA8An62m3RIpH16/WIr94/J3LnnSLNm2vVIKFYrQYOHCjz5883Wxza2Kv9MHPmzDGf69Wrl6kcwHV6+kvfdEievmnPkYYYDTeuHtH2NHpkrLB8uciECa79mly5RCZP9tSKAMAn6E7QxIkiK1cmvIZL+nrP8XH16gm77Y5JE+vXr5dXX33VVGZOnz4txYsXl27dusmgQYPMkWLYEz0yvkwbeDXRutLXcvmyJ1cEAJbTkPLuuyJr1/778fVfV5s2iYwZIzJ4sM4xEXPXkl6Yi8BEj4wV9DZWV5tzs2b11GoAwCdoQFmzJu0fjxpofvtN5OefvbUy+DKCjBUqVfp3g9cZWk+96y5PrggALLdgQcKPO2foj9D58z29ItgBQcYKOpypWjXn/8bqyw/tcAMAPxURIbJtm/NnILRqo/cVHj/u6ZXB1xFkrNKxY8LmblqVGf16zZoipUp5a2UA4HX/XGLtsnPn3L0S2A1BxipFiyZ0qukV88lUZmIdL0uqVNH7CLy/PgDwokyZvPvr4D8IMlaqWFFErxRo1UokW7ZrvrTx3DlZcvvtIs8/nxB2AMDPd9xdne6hZyBuvdVTK4JdMEfGV+hVBceOJbwPCZH7evWSAwcOmLkIvjZ8CAA84euvRWbOjJf4+LR/5mkhu0ULke7dvbI0WMDZ7EFFxldo1aVIkYRemPz55fHHHzd3XWzQCcAA4Od0cuy2bePkypVzEh8fm+pj9bWdzrnTIAMQZHxUs2bNzHjoDz/80OqlAIBH6TTe1q1by4gRA6Vcue8kW7bgFA916uc1xAwaJBIa6u2VwhcRZHyUXsb13//+V7766itTVgMAf6RV5zvvvNO81/uRXn+9h4waFSR33/3vOQjH7rq+15FaI0aIcBckHOiR8WFHjhwxVZl33nlHnnzySauXAwBuo089WnF+5plnzG3L33zzjfl5d/3Rap3gGxmZcB5Cz0fkz2/ZkuFlzmYPgoyPa9++vezbt0+2bNlC0y8Av3Dp0iV54oknZPr06eZF2ptvvilZHDdAAv+g2ddPaNPvb7/9Zm53BQC727Vrl9SsWVNmzpwpn3/+ubz//vuEGKQLQcbHNW3aVIoWLUrTLwDbmzVrllSrVk2uXr1qXpx17tzZ6iXBDxBkbNT0e45Z3ABsKDo6WgYMGCD333+/NG/e3DT2VqhQweplwU8QZGygR48e5hWMlmEBwE6OHj0qjRs3lrffflvGjx8vX3/9Nb2WcCuCjA0ULlxY2rZta7aXnOjNBgCfsGLFCqlatars2bNHli1bJv369ePQAtyOIGOjpt9t27bJunXrrF4KAKRKX3CNGTPGVGLKly9vrlqpU6eO1cuCnyLI2Kjpt1ixYjT9Aumk/RlPP/206dHIkSOHmV3SsWNHc5oG6adHZTt06CCDBg2SgQMHyqJFi6RQoUJWLwt+jCBjE8HBwabpd8aMGTT9AukwevRoc/TX0bfx2GOPycqVK8102d9//93q5dmajorQU0m6jfTDDz/IqFGjJKPeJwB4EAPxbOTYsWMSHh5uGub0FSUA161evdo82WbWi1r/sXv3bqlUqZI88MAD8tlnn1m6PruaOnWq9O7dW8qUKWOCYsmSJa1eEmyOgXh+KDQ0lKZfIJ1q1ap1TYhRpUuXNltNO3futGxddhUVFWV6+Lp37y4PPfSQrFmzhhADryLI2Iz+wNDy99q1a61eCuA39IXB8ePHJT8X+bjkwIEDpolXqzGTJk2STz75RLLppUiAFxFkbKZJkyZSvHhxmn4BN9IZTX///bd06tTJ6qXYxrx580xf0enTp812Xc+ePa1eEgIUQcbGTb9nz561ejmA7f3xxx/y1FNPyT333CPdunWzejk+LzY2Vl555RVp3bq11K5dW3799VcTaACrEGRs6NFHH5WYmBiaEgE3NNDrE7I2FH777bfmShCk7OTJk9KyZUsZMWKEedOTSbfccovVy0KAI8jYtOm3Xbt2NP0C6aAnIfRJWccZLFiwQMLCwqxekk/TvjytvGzZssXMhnnxxRdNhRiwGt+FNm763b59uzkhAMD1kzb33nuvGYI3Z84cM30WydMXS++9957Uq1fPjH/QrSSdwQP4CoKMTekPkhIlStD0C9xEj4c29eqLgG+++cb0xiB5Fy9elM6dO0ufPn3MjJjly5fLbbfdZvWygGswctHmTb//+9//5K233mKfGgEvNlZk0yaRRYtE9u9P+DhfPpFGjUTq1xfJmTPhcc8995z8+OOPpiJz5syZG3rNunTpYs0fwAeboPWqgUOHDslXX33FiS74LCb72pjOvdBXR+PGjZO+fftavRzAMseOiYwcmfBe2zbi4v79ml62rFPydRi2Fl8aNGhgbmVOCX1nIl9//bU5Tq1bSTql9/bbb7d6SQhAF5js6//0Irb77ruPpl8EtFOnRF5+WeTEiYSPk4YYpX81oqNFxo/XhlUx2yP69yWlt0B29epV6devn6m+tGnTRtavX0+Igc8jyPhB0++OHTvMQCogEE2Zor0cNwaY62llZsIEbfT11srsRQcCNmzYUN5//31555135IsvvpCcjv04wIcRZGyuUaNGNP0iYJ05I7JhQ9ohRmmxRUPMqlXeWJm9LF26VKpWrSoHDx40N4Frc2+QJj/ABggyftD0+9hjj5k9bW1cBAKJq4VIfW5OpT0m4MTFxcmoUaOkWbNmUrlyZdm8eTOnuGA7BBk/mfSrP5CmT59u9VIArzp3LqG511lalSHvJ9ArTnSwpg620zcdCligQAGrlwW4jCDjBwoWLEjTLwJSpkze+TX+Risvd911l6xatcoMBBw+fDjXM8C2CDJ+1PS7c+dO84MJCBQlSybMi3GWVm/KlJGANnnyZLN9pLOnNm3aZO6aAuyMIOMn9LRByZIlafpFQKlaVSQkxPnHa1Nw8+YSkC5fvmxmw/Tq1Uu6du1qXvQUL17c6mUB6UaQ8bOmXx25TtMvAoXuhnTo4Hw1pmJFkRIlJODs3btXatWqZY5Uf/rpp/LRRx9J1qxZrV4W4BYEGT/SvXt30/Q7bdo0q5cCeI1WWNKqssTHx8qtt4r07y8BR69j0H6YiIgIc7+U/pwA/AlBxs+aftu3b0/TLwKKHqnu0UPkscf078C/n3OcZsqQIVp2735HGjdelnjfUiCIiYkxp5H0ZJJey7Bx40apUqWK1csC3I67lvzMTz/9ZG7G1qFWdevWtXo5gFfpT7Pt20UOHkxoAs6bV+Suu+KladO6cu7cOdmyZYtk1IuXAuAetocfftjcKaVzYgYOHMiAO9iOs9mDIONndGupbNmyUrNmzRtu9QUClZ7OqV69urz33nvy5JNPij/TJt6OHTtKbGysubVaqzGAHXFpZIA3/X777bdy+vRpq5cD+ATtEdHBkUOGDPHbZnh9TfrWW2+Z4KLXlvz666+EGAQEgowf6tatG02/wHVGjBgh0dHR8r///U/8jTby6o3Vzz77rPTt29dsMYeFhVm9LMArCDJ+2vTboUMHmn6BJEJDQ+Xll182tzvrjfH+Yvv27WbbTK8Y0PEL48aNk0yML0YAIcj48aTfP//8U37++WerlwL4jGeeeUaKFStmKhf+EPJ1LkyNGjVMcNFTSQ888IDVSwK8jiDjp3RvvHTp0kz6BZLIkiWLqVgsWrRI5s6dK3Z15coVefrpp+WRRx4x1de1a9dKmUC/ewEBiyDjp/SoJU2/wI3atm0rTZo0MVWZq1evit0cPnxY6tevb6bzTpgwwfTC5ciRw+plAZYhyPh506+aOnWq1UsBfCrkjx8/Xvbv3y/vvPOO2IlWkqpWrSpHjx6VX375RXr37s18GAQ8gowfK1CggCk76ys3f+gHANylYsWK8sQTT8jw4cPN8Dhfp6cQhw0bJi1atJBq1aqZuTjaGwOAIBMwTb866RfAv/QYdoYMGcxJJl+mW8Nt2rSRV199VYYOHWp6e/Lnz2/1sgCfQZDxc7qXrk2ANP0C18qXL58JM5MnT5bNmzeLL9KTSDrMb926dTJv3jwTZDR8AfgXQSZAmn5nzpwpp06dsno5gE/R7aXbb7/dHMv2pe1XXYu++Khdu7aZC6VTenVbCcCNCDIBgKZfIHk6f0XH+uu8JR0m5wsuXbok3bt3NyGrZ8+eZm1Fixa1elmAz+LSyADRuXNn0yD4xx9/cMoBSOZI9tatW83fj2zZslm2jt27d8v9998ve/bsMU36Xbp0sWwtgNW4NBI3NP3u2rVLVqxYYfVSAJ+jQ/L0SPPYsWMtW8N3331nTiRFRUWZnhhCDOAcgkyAqFevnpQtW5amXyAZOgW7X79+8vrrr8tff/3l9K+7ePGiacDV/pW8efOaaueUKVOSfezOnTvN43LmzGke+5///EdOnjwpMTExMnDgQDMqQQf1aYNvpUqV3PinA/wbQSbAmn5nzZplfngCuJYew9aQ8cILLzj9a7SBXue7aEipXLlyio/TcKQvJnTLaOTIkTJgwABzjFqvEmnYsKEZ0KdVIZ3EzfY94JqMLj4eNta1a1cZPHiwafrVH6QA/qUBQkNGr1695KmnnpJ77rknzV9TuHBhsyWlN2trJUVvoU6O/r6RkZGmT61IkSLmc1mzZpXnnnvO9AAsW7ZM6tat6/Y/ExAIqMgEEB2ipbfjMukXSJ6eFtIrAPQ4tk7TdeYSSg0xadHxBzrUTkOM/t3TXpxBgwaZxuI77riDEAOkA0EmAJt+9WTE8uXLrV4K4HN02Nzbb78tGzZskOnTp7vl9/z777/lxIkTppFXT1/oqSTtidFqTPv27WX79u1u+fcAgYogE2D0lV+5cuVo+gVS+TvSqVMn0ysTERGR7t9Pt55UdHS0CTNLly41J5RGjx4tt956q5w5c0auXLnihpUDgYkgE2Bo+gXS9sYbb8i5c+dk1KhR6f69Ll++bN7rdQjZs2c3fTL33XdfYp9M0scAcB1BJkCbfoODg1M8JgoEOu1l0R4WPUm0b9++m/59dCaMTg5WNWvWlDVr1kipUqWu+bqycggfYHcEmQC9LI+mXyB1GmT0nqObPeF34MABqVOnjsyePdt8rM2+WpG5fttJZ8po0zCAm0OQCVC6vaQzLfTYJ4Ab5ciRw/SxaD/LTz/95NKvnT9/vtx5551y+vRpU4UpUKCA2VK63vr166VKlSpuXDUQeAgyAdzQqLf+0vQLpOzhhx+WWrVqmam/MZcuiaxdK6IVljlzRLZuFUnmiLYGn9atW5s5NBpe7rrrLnNSac6cOXL48OHEx2nTr14b8uCDD3r5TwX4Fy6NDGC6d6/lc506qiV0ADfauHq1LHr8cXmuUiXJEhMjEhwsoj829S1fPnlPRM6Fhcm+/fvl008/Nb+mcePGUr9+fenbt6/52akBRufThISEmBk1erXBmDFj5LbbbjNHvdlaAm4+exBkApge+wwLCzMj1jXQALiONuMOHy5xu3enWL4uNneuHNRqTTL2798vxYoVM/+s82L69+8vv/zyi2TOnNlUbbSZuFChQh78AwD2RZCBU/TiurVr18qff/5pTjIBSOLNN7WRJdktpKT0x+hHFy5Iq0mTJDw83GvLA/yZs9mDZ64AR9MvkAIdZKc9MU5cVWDmM4WGSjjVFcDrCDIBTo+H0vQLJGPx4oR+GCcF6VC71as9uiQANyLIBDh9Jan3L+lJi+PHj1u9HMB37NnjVDUmUYYMIukYngfg5hBkYPpk9LI8Jv0CSVy96vqviY72xEoApIIgAzNZtGPHjvLxxx9LnCuvQAF/li+fliydfrg5NxES4tElAbgRQQaJTb979+51eYIp4Lfq1k2YFeOkoLg4WRIVxYsBwMsIMjBq164t5cuXp+kXcKhWTSRPHqeqMnFBQbLl6lVp2r27GXz3zTffEGgALyHI4Jqm3++//56mX0BlzCjSp09CkEktzAQHS3C2bFJlwgRZsWKFmZKtW7WVKlWSL7/8UmJjY725aiDgEGRwTdNvxowZE8esAwHvjjtEnn9eJLkrBBxHs7Uv5n//EwkLk3r16snixYtl9erVUrRoUencubOpdE6bNk1i9HoDAG7HZF9co1u3bmaE+m4dyc6kXyCBXkHw888iS5aInDyZEGJ0gm/z5iI1aiRUb5KxceNGGT58uPz4449SokQJefHFF80LBr2iAEDquKIAN2XVqlVmSN6iRYukadOmVi8H8AtbtmyR1157TWbOnClFihSRwYMHy6OPPsplkUAquKIAN6VWrVpSoUIF+eijj9zy+40YMcL031SsWNEtvx9gR1WqVJFvv/1Wtm3bZv6OPfnkk1KyZEl599135bJOBAZw0wgySLHp99ixY+n6vf766y8ZOXKk5MiRw23rA+xMA702AO/YsUMaNmwo/fr1M1tOb775pkRGRlq9PMCWCDK4QZcuXdzS9DtgwAC5++67pZoeYwWQqFy5cjJ9+nRz63zLli3l+eefl+LFi8vo0aMlIiLC6uUBtkKQwQ1uueUW6dSpU7om/a5cudKU0t966y23rw/wF6VKlZJPPvlEdu3aJe3bt5chQ4ZIsWLFzJas9gUASBtBBilO+t2/f78s0VMaLtK5GX369JFevXqZWRoAUqfVGB1GqdO1H374YXPSSQPNq6++KmfPnrV6eYBPI8ggWffcc4/Zz7+Zpt+JEyfKwYMHzQ9jAM4LDw+X9957T/bt2yfdu3eXN954w8yjeemll+TUqVNWLw/wSQQZpNr0+8MPP7jU9Hv69Gl55ZVXTIm8QIECHl0j4K/CwsJk/Pjxpir6xBNPyNtvv20qNIMGDWLyNnAdggxSbfrNlCmT2cN31ssvv2xu09atJQDpU6hQIVOVOXDggDzzzDOm2qnbUM8++6wcOXLE6uUBPoEggxSFhIS41PSr04B1K6pv377mh6z+8NW3qKgoiY6ONv985swZr6wd8Cf58+c3DcD6d0irMnqiUI9tP/3003L48GGrlwdYism+SNWaNWvMAK8FCxZIcx3Hnorly5eb2Rip0VeVnGQC0kd/Fmsvjc6f0ePaOiVYpwXr9hPgL7iiAG6h3x6VK1eW0qVLm/HqqdFmRL2nKbntJv1hq/v8Os2Uk0yAe+jfqw8++EDGjh1rTjfpPU56n5Me6wbsjiADt3nvvfdl+PBvZNCgeRIRkT3xvrwmTRLep6VBgwYm5Pz+++/eWC4QcHQqsB7fHjNmjJw4ccLcuq0nnXTwHmBX3LUEt/jrL5E9e56Q+vWXy7p1WWTHDhHNIwsXijz3nIiesL5wwepVAoFNrwHp37+/ObatW7fLli2T8uXLm5k0vICAv6Mig1RDzMsvi0RFiaTU66vVGT1lPWKECN8agG+4cuWKaQgeNWqUHDp0SO6//36zxauXVwJ2QUUG6aLxduzY1EOM0q+dPCkyebI3VwcgNVmyZDHzZ/Qk4aRJk2Tz5s1StWpVadeunWzcuNHq5QFuRZBBsnQLScdUOHPVkj5m3ToRTlYDviVz5szSs2dPcznl1KlTZefOnVK9enVp1aqVOZEI+AOCDJL1008J20auVHBWrvTkigDcLL3NvmvXribIfPHFF2YejY5VaNq0qfz8889WLw9IF4IMknX0qHPVGAcNPSdOeHJFANIrQ4YMiQ3AX3/9tTnhVK9ePTP/6aeffjLjFgC7IcggWUFBrv8aVyo4AKwTHBwsDz74oOmd+e6770xTZePGjaVu3bqycOFCAg1shaceJEvnw7gSTLR6ExbmyRUB8ESgue+++0wD8Jw5cyQmJkZatGghd999t/mYQAM7IMggWTrszpWtpQwZROrW9eSKAHjytvvWrVubBmCtyOhlsffee6/cddddpmLjzF1rgFUIMkiWTjgvXdq5qoxuQ9WvL5IrlzdWBsCTgaZZs2amAVh7ZnSGR4cOHcz8Ge2piY2NtXqJwA0IMkhR//4iefKkHmY0xJQoIdKtmzdXBsDTgUYbgHVC8MqVKyU0NFQ6depk7knTU08EGvgSggxSlC+fyKhRInfckfCxBhrHmwYY3U5q0EBk6FCRrFmtXi0AT9AG4EWLFpltp+LFi8sjjzwit99+u5lLEx0dbfXyAK4ogHOOHRNZsSJhiq8GmdtuS9hO0ooNgMCxadMmGT58uPzwww8m2Oht2zqjRofvAe7E7dcAAI/ZunWrvPbaazJz5kwJDw+XF154QXr06GGuRwDcgbuWAAAeU7lyZfnmm29k27ZtUrt2bXnqqaekZMmS8s4778jly5etXh4CCEEGAHDTKlSoYBqA9foDHarXv39/s+U0btw4iYyMtHp5CAAEGQBAupUtW9Y0AOsFlW3atDFbTcWKFZPRo0dLRESE1cuDHyPIAADcRreXJk2aJLt375b7779fhgwZYgKN9tNorwPgbgQZAIDbaXiZOHGi7N27Vzp37myCTNGiRWXo0KFy5swZq5cHP0KQAQB4jJ5oevfdd2X//v3mVNOYMWNMyNFj26dOnbJ6efADBBkAgMcVLlxY3nzzTTlw4ID07t3bnG7SCs3AgQPl+PHjVi8PNkaQAQB4TcGCBU0DsAaaZ599Vj788ENToenXr58cOXJEfNWVK1fk+eefl7CwMMmWLZvUrFlTFi9ebPWyQJABAFghf/78pm/m4MGD5oSTnngqUaKEmUdz6NAh8TXdu3c3FSW9ouHtt9+WDBkySKtWreSXX36xemkBj8m+AADL6fPL+++/b+bP6HFtDQ6DBw82M2mstn79elOB0f6eAQMGmM9FRUVJxYoVTYVp9erVVi/RLzHZFwBgG/qEpQ3AWqEZMWKEfP/991K6dGl59NFHzVFuK3377bemAvPYY48lfi5r1qzSs2dPc5nm4cOHLV1foCPIAAB8Rs6cOU0DsPbQaAVkwYIFUq5cOfnPf/4jf/zxhyVr2rx5s5QpU+aGqkCNGjXM+y1btliyLiQgyAAAfE727NlNM/C+fftMT8ry5culfPny8tBDD8nvv//u1bUcPXrUnLq6nuNzvtykHAgIMgAAn6UnhJ5++mnZs2ePfPDBB7J27VqpVKmSmRrsrUqIXoKZ3K3eur3k+DqsQ5ABAPg8DRKPP/646ZeZPHmybN26VapWrSpt27aVDRs2eDxM6fHr62nDr+PrsA5BBgBgG5kyZTITgrVfZtq0abJr1y7Tq9KyZUvTeOsJuoWk20vXc3xOZ8vAOgQZAIDtZMyY0TQAb9++Xb788ksze6ZWrVrSpEkTWblypVv/XVWqVDGBSY8DJ7Vu3brEr8M6BBkAgG3psWhtAN62bZs5Jn3y5EmpX7++NGjQQJYuXSppjUqLixPZtk1kzhyRH34Q0fl2/+wYJXrggQckNjZWPvroo8TP6VbTp59+aubL6H1SsA4D8QAAfiMuLk5mz54tw4cPl02bNpkqzZAhQ6R58+YSFBSU+Dh95lu6VOT770VOnBAJDv432GgPb6NGIh076umphM937NhRvvvuO3OSqlSpUmYSsQ7K07BUr149i/60/o2BeACAgBMcHCzt2rUzDcBz5841lRTtn9HKiQYcfe2uIeaTT0S0wKIhxhFg9E1pRWbBApEhQ0QuXkz4nPbj6H1Q06dPl759+0p0dLTMmTOHEOMDqMgAAPyWPsUtWbJEhg0bZu5F0pNOHTt+Ir/+mnZfi1ZpypcXeeUVrywV16EiAwAIeLqd1LRpU9MAvGzZMgkJySurVhVKs3dGaYVGZ+/t2+eVpeImEWQAAAERaLQBePToJZItW+Fr+mXSqsosXOjx5SEdCDIAgICxd6+edHL+8VqVsfjOSqSBIAMACBgxMa7/muhoT6wE7kKQAQAEjJCQf08nOUN3oPLm9eSKkF4EGQBAwKhVy7XHa09w/fqeWg3cgSADAAgYWl2pXv3fAXhp0eF4tWt7elVID4IMACCgdO8ukitX6mHGcajpqaf05m2vLQ03gSADAAgo+fOLDB8uUrBgwsfXBxoNMZkyifTvL1KzpiVLhAsyuvJgAAD8QWioyPjxIr/+mjAn5sABkdjYhK2nxo0T+mJy5LB6lXAGQQYAEJB0noz2y+gb7IutJQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsEGQAAYFsZnXlQfHy8eX/hwgVPrwcAAEAcmcORQdIVZCIiIsz78PBwd6wNAABAnM0gefLkSfHrQfFpRR0RiYuLkyNHjkiuXLkkKCjIuX8zAADATdJ4oiEmLCxMgoOD0xdkAAAAfBHNvgAAwLYIMgAAwLYIMgAAwLYIMgAAwLYIMgAAwLYIMgAAwLYIMgAAQOzq/1+JkFOUyqVgAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 700x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "prob = xp.problem()\n",
    "\n",
    "serves = prob.addVariables(SCHOOLS, SITES, vartype=xp.binary)\n",
    "build = prob.addVariables(SITES, vartype=xp.binary)\n",
    "\n",
    "# Objective function and constraints.\n",
    "prob.setObjective(xp.Sum(dist[i,j] * serves[i,j] for i in SCHOOLS for j in SITES)/num_schools)\n",
    "    \n",
    "# Every school must be served by one park.\n",
    "prob.addConstraint(xp.Sum(serves[i,j] for j in SITES) == 1 for i in SCHOOLS)\n",
    "    \n",
    "# Exactly n parks are built.\n",
    "prob.addConstraint(xp.Sum(build[j] for j in SITES) == num_parks)\n",
    "\n",
    "# Only parks that are built can serve schools.\n",
    "prob.addConstraint(xp.Sum(serves[i,j] for i in SCHOOLS) <= num_schools * build[j] for j in SITES)\n",
    "\n",
    "prob.controls.outputlog = 0 # Turn off output log for cleaner output.\n",
    "\n",
    "prob.optimize()\n",
    "\n",
    "prob.writeProb(\"problem.lp\")\n",
    "\n",
    "# Get the solution.\n",
    "sol = prob.getSolution(serves)\n",
    "avg_dist = sum(dist[i,j] * sol[i,j] for i in SCHOOLS for j in SITES)/num_schools\n",
    "print(f\"Average distance from a school to its assigned park: {avg_dist:.2f}\")\n",
    "max_dist = max([dist[i,j] for i in SCHOOLS for j in SITES if sol[i,j] > 0.5])\n",
    "print(f\"Maximum distance from a school to its assigned park: {max_dist:.2f}\")\n",
    "\n",
    "# Draw solution: open parks and their closest schools.\n",
    "draw_sol(num_schools,num_sites,prob,serves,build)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c74071ff",
   "metadata": {},
   "source": [
    "To consider the **maximum distance** (as opposed to the sum of distances), we model the objective function:\n",
    "\n",
    "$$\n",
    "\\begin{align*}\n",
    "\\max_{i \\in \\mathcal{I}} (\\sum_{j \\in \\mathcal{J}} dist_{i,j} . serves_{i,j}) \n",
    "\\end{align*}\n",
    "$$\n",
    "\n",
    "by creating an auxiliary variable $z$, and setting the objective function to ($\\min z$) and adding the constraint: \n",
    "\n",
    "$$\n",
    "\\begin{align*}\n",
    "&  \\quad z \\geq \\sum_{j \\in \\mathcal{J}} dist_{i,j} . serves_{i,j}, \\qquad \\forall i \\in \\mathcal{I}  \\\\\n",
    "\\end{align*}\n",
    "$$\n",
    "\n",
    "The new variable is created below, and the new constraints are added to the problem before setting a new objective with [problem.setObjective](), which replaces the old objective function when called again without the *objidx* argument. \n",
    "\n",
    "Run the cell below to verify if the optimal solution remains the same for the new objective."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f8bea8dc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average distance from a school to its assigned park: 2.22\n",
      "Maximum distance from a school to its assigned park: 3.33\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "z = prob.addVariable() # Add auxiliary variable to the problem.\n",
    "\n",
    "prob.addConstraint(z >= xp.Sum(dist[i,j] * serves[i,j] for j in SITES) for i in SCHOOLS) \n",
    "\n",
    "prob.setObjective(z) # Replaces the old objective function.\n",
    "\n",
    "prob.optimize()\n",
    "\n",
    "# Get the solution.\n",
    "sol = prob.getSolution(serves)\n",
    "avg_dist = sum(dist[i,j] * sol[i,j] for i in SCHOOLS for j in SITES)/num_schools\n",
    "print(f\"Average distance from a school to its assigned park: {avg_dist:.2f}\")\n",
    "max_dist = max([dist[i,j] for i in SCHOOLS for j in SITES if sol[i,j] > 0.5])\n",
    "print(f\"Maximum distance from a school to its assigned park: {max_dist:.2f}\")\n",
    "\n",
    "# Draw solution: open parks and their closest schools.\n",
    "draw_sol(num_schools,num_sites,prob,serves,build)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
