Big Creek Hydroelectric Project - Southern California Edison
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook expands upon the ESG Analysis notebook and can be utilized for analysis of rounds in the Electricity Strategy Game. Any of the following code can be changed to create new or different visualizations. Running through the cells will allow you to visualize and calculate the profit that your plants have generated in a given hour. You will also be able to calculate cumulative profits, emissions, and expected emissions for rounds 4-6, incorporating user-specified permit prices."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First on our agenda is to import **dependencies** -- packages in Python that add to the basic functions in Python -- same as before."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"from datascience import *\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"import numpy as np\n",
"import pandas as pd\n",
"plt.style.use('fivethirtyeight')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's select your portfolio. In the cell below, assign **section** to the section number that corresponds to your own according to the following table.\n",
"\n",
"| Number | Section Time |\n",
"|---------|---------------|\n",
"| 1 | Wednesday 8am |\n",
"| 2 | Friday 2pm |\n",
"| 3 | Wednesday 9am |\n",
"| 4 | Friday 4pm |\n",
"\n",
"Assign **YOUR_PORTFOLIO** to the name of your portfolio from the following choices:\n",
"\n",
"**'Bay Views',\n",
" 'Beachfront',\n",
" 'Big Coal',\n",
" 'Big Gas',\n",
" 'East Bay',\n",
" 'Fossil Light',\n",
" 'Old Timers'**\n",
" \n",
"The variable **periods_completed** should be set to the most recently concluded round.\n",
"\n",
"The variable **period** should be set to the round that you want to analyze.\n",
"\n",
"The variable **hour** should be set to the hour that you want to analyze.\n",
"\n",
"The variable **permit_price_456** should contain expected (or realized) permit prices in each of rounds *[4, 5, 6]*.\n",
"\n",
"The variable **rps_demand_reduction_6** should contain expected demand reductions (as a fraction) in each of hours *[1, 2, 3, 4]* due to the RPS standard that will be implemented in Round 6.\n",
"\n",
"The variable **pab_periods** should contain each of the periods for which there was or will be a pay-as-bid auction. This shouldn't change.\n",
"\n",
"The variable **bid_own_as_mc** should be set to *True* if you would like to default future bids for your own portfolio to marginal cost (inclusive of permit price for rounds 4, 5, and 6). If setting to *False*, you would need to go into the respective bids_.CSV file and manually edit other teams' future bids. Note that even if *True*, the current round and hour's bids can be adjusted manually down below (after the bids_ variables are defined).\n",
"\n",
"The variable **bid_others_as_mc** should be set to *True* if you would like to default future bids for other teams' portfolios to marginal cost (inclusive of permit price for rounds 4, 5, and 6). If setting to *False*, you would need to go into the respective bids_.CSV file and manually edit other teams' future bids."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"section = 1\n",
"YOUR_PORTFOLIO = \"Big Coal\"\n",
"periods_completed = 3\n",
"period = 3\n",
"hour = 4\n",
"permit_price_456 = [10, 10, 10]\n",
"rps_demand_reduction_6 = [.15, .15, .15, .15]\n",
"pab_periods = [1]\n",
"bid_own_as_mc = True\n",
"bid_others_as_mc = True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we import the demand realizations (for past rounds) and forecasts (for future rounds) and assign the current demand."
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"16522.86029\n"
]
}
],
"source": [
"demand_table = Table.read_table('demand.csv')\n",
"demand_df = demand_table.to_df()\n",
"for hour_i in [1,2,3,4]:\n",
" demand_df.loc[(demand_df[\"round\"] == 6) & (demand_df[\"hour\"] == hour_i), \"load\"] *= (1 - rps_demand_reduction_6[hour_i-1])\n",
"demand_table = Table.from_df(demand_df)\n",
"demand = demand_table.where(\"round\", period).where(\"hour\", hour)[\"load\"].item()\n",
"print(demand)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we import our tables, one for each discussion section, and one with individualized information about our plants."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"bids_1 = Table.read_table('S1_bids.csv').sort('PORTFOLIO')\n",
"bids_2 = Table.read_table('S2_bids.csv').sort('PORTFOLIO')\n",
"bids_3 = Table.read_table('S3_bids.csv').sort('PORTFOLIO')\n",
"bids_4 = Table.read_table('S4_bids.csv').sort('PORTFOLIO')\n",
"ESG = Table.read_table('ESGPorfolios_forcsv.csv')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following will print a list of plants available at the current portfolio. Creating a vector of the "
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
PLANT
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Four Corners
\n",
"
\n",
"
\n",
"
1
\n",
"
ALAMITOS_7
\n",
"
\n",
"
\n",
"
2
\n",
"
HUNTINGTON_BEACH_1-2
\n",
"
\n",
"
\n",
"
3
\n",
"
HUNTINGTON_BEACH_5
\n",
"
\n",
"
\n",
"
4
\n",
"
REDONDO_5-6
\n",
"
\n",
"
\n",
"
5
\n",
"
REDONDO_7-8
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PLANT\n",
"0 Four Corners\n",
"1 ALAMITOS_7\n",
"2 HUNTINGTON_BEACH_1-2\n",
"3 HUNTINGTON_BEACH_5\n",
"4 REDONDO_5-6\n",
"5 REDONDO_7-8"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bids_1.where(\"PERIOD\", period).where(\"PORTFOLIO\", YOUR_PORTFOLIO.replace(\" \", \"_\")).sort(\"PLANT_ID\").to_df()[[\"PLANT\"]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can decide if we want to change the bids of our plants in the current hour for the current round. To change your team's bids for the current round and hour, set **edit_bids** = *True*. Then set **new_bids** to be a vector of bid prices of plants in the order listed in the above table. For example, if my portfolio has four plants, I should see four rows in the above table, numbered 0 through 3. I should set **new_bids** equal to a vector of length 4, with the first element refering to the bid for the plant in row 0, the second element refering to the bid for the plant in row 1, etc.., separated by commas so my vector would have:\n",
"\n",
"*[plant_0_bid, plant_1_bid, plant_2_bid, plant_3_bid]*"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"edit_bids = False\n",
"new_bids = []"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The table below should now display the names and bids that your team and others in your discussion section assigned for each individual plant."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
" \n",
"
\n",
"
TEAM
TEAM_ID
PORTFOLIO
PORTFOLIO_ID
PLANT
PLANT_ID
PERIOD
PRICE1
PRICE2
PRICE3
PRICE4
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Debreu
4
Bay_Views
3
MORRO_BAY_1-2
31
3
38.78
38.78
38.78
38.78
\n",
"
\n",
"
\n",
"
Debreu
4
Bay_Views
3
MORRO_BAY_3-4
32
3
36.61
36.61
36.61
36.61
\n",
"
\n",
"
\n",
"
Debreu
4
Bay_Views
3
MOSS_LANDING_6
33
3
32.56
32.56
32.56
32.56
\n",
"
\n",
"
\n",
"
Debreu
4
Bay_Views
3
MOSS_LANDING_7
34
3
32.56
32.56
32.56
32.56
\n",
"
\n",
"
\n",
"
Debreu
4
Bay_Views
3
OAKLAND
35
3
61.17
61.17
61.17
61.17
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
COOLWATER
41
3
42.39
42.39
42.39
42.39
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
ETIWANDA_1-4
42
3
42.67
42.67
42.67
42.67
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
ETIWANDA_5
43
3
62.89
62.89
62.89
62.89
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
ELLWOOD
44
3
75.61
75.61
75.61
75.61
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
MANDALAY_1-2
45
3
39.06
39.06
39.06
39.06
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
MANDALAY_3
46
3
52.06
52.06
52.06
52.06
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
ORMOND_BEACH_1
47
3
38.06
38.06
38.06
38.06
\n",
"
\n",
"
\n",
"
Arrow
1
Beachfront
4
ORMOND_BEACH_2
48
3
38.06
38.06
38.06
38.06
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
Four Corners
11
3
42.38
42.38
45.5
41.94
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
ALAMITOS_7
12
3
73.73
73.72
73.72
73.72
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
HUNTINGTON_BEACH_1-2
13
3
42.38
42.38
45.5
41.94
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
HUNTINGTON_BEACH_5
14
3
66.5
66.5
66.5
66.5
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
REDONDO_5-6
15
3
42.38
42.38
45.5
41.94
\n",
"
\n",
"
\n",
"
Becker
2
Big_Coal
1
REDONDO_7-8
16
3
42.38
42.38
45.5
41.94
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
EL_SEGUNDO_1-2
21
3
44.83
44.83
44.99
44.83
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
EL_SEGUNDO_3-4
22
3
41.22
41.22
44.99
41.22
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
LONG_BEACH
23
3
52.5
52.5
52.5
52.5
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
NORTH_ISLAND
24
3
65.5
65.5
65.5
65.5
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
ENCINA
25
3
41.67
41.67
44.99
41.67
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
KEARNY
26
3
500
500
500
500
\n",
"
\n",
"
\n",
"
Coase
3
Big_Gas
2
SOUTH_BAY
27
3
43.83
43.83
44.99
43.83
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
PITTSBURGH_1-4
51
3
42.97
46.97
56.97
44.97
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
PITTSBURGH_5-6
52
3
46.97
44.45
56
42.58
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
PITTSBURG_7
53
3
60
60
65
60
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
CONTRA_COSTA_4-5
54
3
58.29
58.29
58.28
58.5
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
CONTRA_COSTA_6-7
55
3
42.97
44.5
69.97
47.21
\n",
"
\n",
"
\n",
"
Friedman
5
East_Bay
5
POTRERO_HILL
56
3
69.9
69.9
69.9
69.9
\n",
"
\n",
"
\n",
"
Krugman
7
Low_Fossil
7
HUMBOLDT
71
3
47.44
47.44
47.44
47.44
\n",
"
\n",
"
\n",
"
Krugman
7
Low_Fossil
7
HELMS
72
3
0.5
0.5
0.5
0.5
\n",
"
\n",
"
\n",
"
Krugman
7
Low_Fossil
7
HUNTERS_POINT_1-2
73
3
49.17
49.17
49.17
49.17
\n",
"
\n",
"
\n",
"
Krugman
7
Low_Fossil
7
HUNTERS_POINT_4
74
3
75.89
75.89
75.89
75.89
\n",
"
\n",
"
\n",
"
Krugman
7
Low_Fossil
7
DIABLO_CANYON_1
75
3
11.5
11.5
11.5
11.5
\n",
"
\n",
"
\n",
"
Heckman
6
Old_Timers
6
BIG_CREEK
61
3
0
0
0
0
\n",
"
\n",
"
\n",
"
Heckman
6
Old_Timers
6
MOHAVE_1
62
3
34.5
34.5
34.5
34.5
\n",
"
\n",
"
\n",
"
Heckman
6
Old_Timers
6
MOHAVE_2
63
3
34.5
34.5
34.5
34.5
\n",
"
\n",
"
\n",
"
Heckman
6
Old_Timers
6
HIGHGROVE
64
3
49.61
49.61
80
49.61
\n",
"
\n",
"
\n",
"
Heckman
6
Old_Timers
6
SAN_BERNARDINO
65
3
53.94
53.94
100
53.94
\n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"bids = globals()['bids_' + str(section)]\n",
"bids.where(\"PERIOD\", period).show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall the table ESG, which we used in the introductory notebook. Let's add in the permit cost per MWH using the permit price. This is just the tons per MWH times the permit price. We can add this to variable cost to get a new total variable cost. The first few rows are shown below."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
" \n",
"
\n",
"
Group
Group_num
UNIT NAME
Capacity_MW
Heat_Rate_MMBTUperMWh
Fuel_Price_USDperMMBTU
Fuel_Cost_USDperMWH
Var_OandM_USDperMWH
Total_Var_Cost_USDperMWH
Carbon_tonsperMWH
FixedCst_OandM_perDay
Plant_ID
\n",
"
\n",
" \n",
" \n",
"
\n",
"
Big Coal
1
FOUR CORNERS
1900
11.67
3
35
1.5
36.5
1.1
8000
11
\n",
"
\n",
"
\n",
"
Big Coal
1
ALAMITOS 7
250
16.05
4.5
72.22
1.5
73.72
0.85
0
12
\n",
"
\n",
"
\n",
"
Big Coal
1
HUNTINGTON BEACH 1&2
300
8.67
4.5
39
1.5
40.5
0.46
2000
13
\n",
"
\n",
"
\n",
"
Big Coal
1
HUNTINGTON BEACH 5
150
14.44
4.5
65
1.5
66.5
0.77
2000
14
\n",
"
\n",
"
\n",
"
Big Coal
1
REDONDO 5&6
350
8.99
4.5
40.44
1.5
41.94
0.48
3000
15
\n",
"
\n",
" \n",
"
\n",
"
... (37 rows omitted)
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ESG.show(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will need both of these tables to generate an analysis of how our round went, so in the following cell we will join the tables based on the column **Plant_ID**. We will then replace any bids as previously assigned with MC or a custom vector for the current hour. \n",
"\n",
"A table will then print listing the plant's original MC, the plant's MC after accounting for the current round's permit price, and the current round's bids that are currently set. **Current_Bids** should always be set greater than or equal to **MC_with_Permit_Price**. To experiment with different values for **Current_Bids**, use the **edit_bids** and **new_bids** variables above."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
PLANT
\n",
"
MC_original
\n",
"
MC_with_Permit_Price
\n",
"
Current_Bids
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Four Corners
\n",
"
36.50
\n",
"
36.50
\n",
"
41.94
\n",
"
\n",
"
\n",
"
1
\n",
"
HUNTINGTON_BEACH_1-2
\n",
"
40.50
\n",
"
40.50
\n",
"
41.94
\n",
"
\n",
"
\n",
"
2
\n",
"
REDONDO_5-6
\n",
"
41.94
\n",
"
41.94
\n",
"
41.94
\n",
"
\n",
"
\n",
"
3
\n",
"
REDONDO_7-8
\n",
"
41.94
\n",
"
41.94
\n",
"
41.94
\n",
"
\n",
"
\n",
"
4
\n",
"
HUNTINGTON_BEACH_5
\n",
"
66.50
\n",
"
66.50
\n",
"
66.50
\n",
"
\n",
"
\n",
"
5
\n",
"
ALAMITOS_7
\n",
"
73.72
\n",
"
73.72
\n",
"
73.72
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PLANT MC_original MC_with_Permit_Price Current_Bids\n",
"0 Four Corners 36.50 36.50 41.94\n",
"1 HUNTINGTON_BEACH_1-2 40.50 40.50 41.94\n",
"2 REDONDO_5-6 41.94 41.94 41.94\n",
"3 REDONDO_7-8 41.94 41.94 41.94\n",
"4 HUNTINGTON_BEACH_5 66.50 66.50 66.50\n",
"5 ALAMITOS_7 73.72 73.72 73.72"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted_joined_table_all = bids.join(\"PLANT_ID\", ESG, \"Plant_ID\").sort(\"PLANT_ID\")\n",
"sorted_joined_df_all = sorted_joined_table_all.to_df()\n",
"\n",
"sorted_joined_df_all[\"Permit_Cost_USDperMWH\"] = 0\n",
"for i in range(len(permit_price_456)):\n",
" sorted_joined_df_all.loc[sorted_joined_df_all[\"PERIOD\"] == i+4, \"Permit_Cost_USDperMWH\"] = permit_price_456[i] * sorted_joined_df_all[\"Carbon_tonsperMWH\"]\n",
"sorted_joined_df_all[\"Var_Cost_USDperMWH\"] = sorted_joined_df_all[\"Total_Var_Cost_USDperMWH\"] + sorted_joined_df_all[\"Permit_Cost_USDperMWH\"]\n",
"\n",
"for hour_i in [1,2,3,4]:\n",
" if bid_own_as_mc:\n",
" sorted_joined_df_all.loc[(sorted_joined_df_all[\"Group\"] == YOUR_PORTFOLIO) & (sorted_joined_df_all[\"PERIOD\"] > periods_completed), \"PRICE\" + str(hour_i)] = sorted_joined_df_all.loc[(sorted_joined_df_all[\"Group\"] == YOUR_PORTFOLIO) & (sorted_joined_df_all[\"PERIOD\"] > periods_completed), \"Var_Cost_USDperMWH\"]\n",
" if bid_others_as_mc:\n",
" sorted_joined_df_all.loc[(sorted_joined_df_all[\"Group\"] != YOUR_PORTFOLIO) & (sorted_joined_df_all[\"PERIOD\"] > periods_completed), \"PRICE\" + str(hour_i)] = sorted_joined_df_all.loc[(sorted_joined_df_all[\"Group\"] != YOUR_PORTFOLIO) & (sorted_joined_df_all[\"PERIOD\"] > periods_completed), \"Var_Cost_USDperMWH\"]\n",
"\n",
"if edit_bids:\n",
" sorted_joined_df_all.loc[(sorted_joined_df_all[\"Group\"] == YOUR_PORTFOLIO) & (sorted_joined_df_all[\"PERIOD\"] == period), \"PRICE\" + str(hour)] = new_bids\n",
"sorted_joined_table_all = Table.from_df(sorted_joined_df_all) \n",
"sorted_joined_table_all = sorted_joined_table_all.sort(\"PRICE\" + str(hour), descending = False)\n",
"sorted_joined_table = sorted_joined_table_all.where(\"PERIOD\", period)\n",
"sorted_joined_table.where(\"Group\", YOUR_PORTFOLIO).to_df().rename(columns={'Total_Var_Cost_USDperMWH':'MC_original', 'Var_Cost_USDperMWH':'MC_with_Permit_Price', 'PRICE' + str(hour):'Current_Bids'})[[\"PLANT\", \"MC_original\", \"MC_with_Permit_Price\", \"Current_Bids\"]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Great! Now we have a table that has our bids for this round as well as information about the capacity of our plants as well as their marginal cost of production. Now we can continue and make plots similar to those in the introductory notebook, that will allow us to examine how we performed in this given hour. Run the following series of cells to generate a legend as well as a plot of plant capacity versus plant bid price, with bids ordered from least to greatest."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"def find_x_pos(widths):\n",
" cumulative_widths = [0]\n",
" cumulative_widths.extend(np.cumsum(widths))\n",
" half_widths = [i/2 for i in widths]\n",
" x_pos = []\n",
" for i in range(0, len(half_widths)):\n",
" x_pos.append(half_widths[i] + cumulative_widths[i])\n",
" return x_pos\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"width = sorted_joined_table.column(\"Capacity_MW\")\n",
"width\n",
"height = sorted_joined_table.column('PRICE' + str(hour))\n",
"height\n",
"new_x = find_x_pos(width)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"energy_colors_dict = {}\n",
"count = 0\n",
"colors = ['#EC5F67', '#F29056', '#F9C863', '#99C794', '#5FB3B3', '#6699CC', '#C594C5']\n",
"for i in sorted(set(sorted_joined_table['Group'])):\n",
" energy_colors_dict[i] = colors[count]\n",
" count += 1"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"colors_mapped = list(pd.Series(sorted_joined_table['Group']).map(energy_colors_dict))\n",
"sorted_joined_table = sorted_joined_table.with_column('Color', colors_mapped)"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Make the plot\n",
"price = price_calc(demand, sorted_joined_table, hour)\n",
"plt.figure(figsize=(9,6))\n",
"plt.bar(new_x, height, width=width, color=sorted_joined_table['Color'], edgecolor = \"black\")\n",
"plt.title('All Energy Sources')\n",
"plt.xlabel('Capacity_MW')\n",
"plt.ylabel('Variable Cost')\n",
"\n",
"print('Hour: ' + str(hour))\n",
"price_line_plot(price)\n",
"demand_plot(demand)\n",
"\n",
"plt.show()\n",
"\n",
"plt.figure(figsize=(5,1))\n",
"plt.bar(energy_colors_dict.keys(), 1, color = energy_colors_dict.values())\n",
"plt.xticks(rotation=60)\n",
"plt.title('Legend')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we have a market price. Let us construct the same plot, but this time only considering the plants that are part of our portfolio."
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"your_source = sorted_joined_table.where(\"Group\", YOUR_PORTFOLIO)\n",
"width_yours = your_source.column(\"Capacity_MW\")\n",
"height_yours = your_source.column('PRICE' + str(hour))\n",
"height_yours_marginal_cost = your_source.column(\"Var_Cost_USDperMWH\")\n",
"new_x_yours = find_x_pos(width_yours)\n",
"label_yours = your_source.column(\"PLANT\")"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Price: 44.83\n"
]
},
{
"data": {
"image/png": "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LSqVPsEY+JcE15X4+Hh169ZN3bp1U3x8vCQ5/aVqs9kc/3355Zc1cuRIx1h2draOHz+utm3bSpI8PT1199136/Lly3r88ccVHBysxx9/XJcvX9bWrVs1btw4DR48WJs2bVK3bt00evRotW/fXhs3bpQkrVu3TsHBwerRo4djWrdu3TRu3Di9+OKLmjNnjrp166aQkJBiBUYU7cEHH3QKJMUxfPhwRUdHO01buXKlU/hq1qyZqlatWuDyMTExCg8PlyR5eXnpgQce0Oeffy5J6t27t9auXVvoWZY/O3PmTIH/SOf59ddfdcstt8jHx8ff+sgvAAAgAElEQVRxpnjlypUKDw+XyWSSJLVs2VLdu3dXdna2srOzFRMTo6FDh0qSvL2989W3fft25eTkFLg9Pz8/hYWFKS4uTj/++KNatmwpb29vSdKoUaOcAvEflStXTqGhoXrsscd06tQpp7FLly7p999/19ixY9W/f3/9/PPPxepNWSnuWfxOnTrp9OnTjp7mvecF9bSo99xsNmvo0KGKi4vT+vXrNXjw4GL1NM/atWvVu3fvfNP9/f114cIFZWRk6JZbbinWPuH6wRk5GNrHH3+sHTt2qG7dupo1a5beeustrVixQpI0cOBAde7cudBlQ0JCdPfd//so+4kTJwo8S7B69Wo1bNhQ8+bN09SpU7Vq1SpZLBZdunRJH3/8sSTp+eef10svvaRLly5pwoQJ6tKli959913FxMQoJydHAwcOVLdu3ZSWlqZnnnlGtWrVUr9+/RQTEyMvLy/Z7dfVc7lLTd77K+V+hP+ee+4pdN5q1aopICBA33zzTbHXHxAQoLi4OB07dswx7cKFC6pYsaKk3MuEe/fu1TvvvKO77ror3/IXLlyQl5eX43WtWrW0Z88e1a5dWx4eHgoODlZMTEyRNcyYMUOLFy/W4cOHHZfpTpw44bhd4LffftPGjRt15MgRzZgxQ1FRUXrppZe0cOFCpaWlOc5A/tFNN90km82mn376SU8++aRuu+22Qusr6peIGjVq6L///a/i4uL02muvOaZXrFhRFy9eLHCZt956S61atdKnn36qqVOn6s0333SMpaWlae/evfrmm2+Umpqql19+WYsXLy6yP2Xh448/1saNG5WZmanPP/9cK1euVJ8+fWQymRQUFKR//OMf+ZaxWCxKS0sr1nv+x8unf1ajRg3t2bNHdrtdjRs3dkwvqqeSlJqaKpPJVODfUR06dNBdd92l7Oxsffrpp8VtA64TnJGDoQ0ePFixsbGaNWuWJMlkMqlq1aqqWrWqPDw8nOb9c1jKuxySp3r16jpx4kS+bfz666+64447JEl33nmn416noKAgp2UtFotq1qypjIwMpaWl6aefflJoaKj69eun5ORk2e12WSwW1apVS5IUERGhcePGacyYMUpNTf2Lnbg+5b2/sbGx6tq1q5KTk3XhwgXH+J//UR05cqTee++9Em1j2LBhmjNnjuN1hQoVlJWVJUl6//33ZbPZHK//zNPTU5mZmY7XR44ckdVqdbx+6KGHrniWcPTo0Vq3bp2WLl2q119/XZIcl+4iIyM1fPhwxcfHq1y5cpo+fbp+/PFHVapUScuXL1ffvn11/PjxfOu8dOmSYmNjdeedd2rmzJlF1rd9+3an8aioKMflvaNHj2r9+vUaMGCAzpw545gvKytLN910U4H7U61aNUm5vyjt37/fEUptNpuqVq2qhg0bqnr16mrUqFG+M3bXyuDBgxUfH68WLVro8OHDknIvrcbGxhYY4qTcIOXj41Os9/yzzz4rdNtHjx6V1WqV1Wp1eu+K6qkkrVmzxnE27o89PX36tD755BN988032rhxo1599dXiNQHXDYIcris5OTk6ffq04zKIlBvgLly4oL179zrN++d71Dw8POTn56cvv/xSUu4/hrt27dKtt97qOGvx7bff6tZbb823fN6lrbzt+fj4qHHjxo5/HLZt2yaTyeS0TNOmTRUdHa327du75KyEEfXu3dtxM/eFCxd0+PBhWSwWx3hAQIDOnTvndIbtSjp37qyEhATHP8733XefZsyY4Rgv6tJoSEiI49JsZmamlixZou7duzvGzWaz6tevX6yzhNWqVSs02CQnJ6tVq1by9/dXkyZN9NRTTykuLk6hoaF67733HL+kfPvtt9q0aZPKly8vDw8PhYSEOO6XOnfuXIH1Wa1WJSUlSco9uzRmzBjNnz9f6enpmjJlinr27KmnnnpKH3/8sc6dOydJmjVrluM2hT87e/asJCkhIUG33nqrI5TGxsaqUqVK8vb21vnz53X06NEiLyVfC+PGjdP06dOvON+2bdtkNpsdPc17zwvrad26dQt8z9PT07VkyRLde++96t69e7F7KuXeJxcSEiJJTj0t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\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Make the plot\n",
"plt.figure(figsize=(9,6))\n",
"plt.bar(new_x_yours, height_yours, width=width_yours, color = energy_colors_dict[YOUR_PORTFOLIO], edgecolor = \"black\")\n",
"plt.title(YOUR_PORTFOLIO)\n",
"plt.xlabel('Capacity_MW')\n",
"plt.ylabel('Price')\n",
"for new_x_i, height_i, label_i in zip(new_x_yours, height_yours, label_yours):\n",
" plt.text(new_x_i, height_i, label_i,\n",
" ha='center', va='bottom', fontsize=8)\n",
"price_line_plot(price)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's reduce our problem further to only include the plants that are actually operational under the new market price. Run the following cell to see the plants that will operate given our market price, and then we can begin the process of calculating our profit."
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Price: 44.83\n"
]
},
{
"data": {
"image/png": "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ZWVp8ODBkiQHBwdFRUWpd+/eevbZZ/Xll19an9O2atUqOTs767333rM+7kOSnnvuOY0ePVrt27dXr169VKFCBe3YsUOHDh1S9+7dtWHDhuK2EsAtgtAGoFy69pEfTk5O8vDwUPfu3TV8+HA99NBDRdrGo48+qurVq2vWrFn66quv5OzsrODgYG3atEmTJ0+W9L9r34rivvvu065du/TJJ59o/fr12rRpk/UL4+vVq6cRI0boySeflL+/v/U9zZs315YtWzRr1ixt2bJF3377rapVqyaz2ayXXnrJ5jtUJWno0KFydnZWVFSUlixZIldXV91///2aO3euVq1aRWgDbmN8YTyA205WVpbuueceXblyRYcOHbJ3OQBQJFzTBuCWlZqaqr/++stmmcVi0axZs3TixAn17NnTTpUBQPEx0wbglrVlyxY98cQTeuihh+Tr66uMjAzt2rVLe/fuVe3atRUbG5vvc9wAoLwhtAG4Zf3xxx+aNm2a4uPjde7cOf3999/y8fFRt27d9NJLLxXrAbsAYG+ENgAAAAPgmjYAAAADILQBAAAYAKENAADAAAhtxXTkyBF7l1Du0aPC0aOioU+Fo0eFo0eFo0eFKw89IrQBAAAYAKENAADAAAhtAAAABkBoAwAAMABCGwAAgAEQ2gAAAAyA0AYAAGAAhDYAAAADILQBAAAYAKENAADAAAhtAAAABkBoAwAAMABCGwAAgAE4pKSkWOxdREmqZjLZuwQAAIBiS01JKXA9M20AAAAGUMHeBZS0wlLqzTpy5IgCAgJK9TOMjh4Vjh4VDX0qHD0qHD0qHD0qXHnoETNtAAAABkBoAwAAMABCGwAAgAEQ2gAAAAyA0AYAAGAAhDYAAAADILQBAAAYAKENAADAAAhtAAAABkBoAwAAMABCG24727Zt09133y2z2Syz2azU1NSb3mZycrKeeuopmc1mde/eXZs2bSqBSgEA+B9CG25LAwcO1Nq1a7V27VpVq1at2O/Pzs62eT1u3DgNGzZMa9eu1apVq4q0zeu3cSOfi9Kxbds2TZs2zfo6LCxMn3zyiT755BObZQkJCVq8eLGaNGmirKwsSZLZbNb27dtlNpv1wAMPWH9BiIqKktls1t9//62IiAh1797duq2cP2dlZemNN95Qz549FRISouHDh2vv3r0ym83q3LmzAgICZDab9dprrykrK0sTJkzQiBEjFBISom+//dZae+3atZXy/7+HOSwsTEePHs21j4sXL1bLli1lNpvVs2dPnT17VpKsy8xms1566SXr+Oeff141a9ZUz5491bt3b/35559q1aqV6tSpI19fXwUFBeny5cvy9fVVjx49FBoaqsGDB+uJJ56w7tuECRNkNpsVEhKiAQMGyM/PT5MnT85V7549e9SqVSvVrFlT9evXl9lsVmxsrLWWb7/9ViEhITKbzZowYYK199czm83q0aOHRowYoa1bt+Za/8cff2jAgAHq2bOnzd9teZPzi+a1vc/ZN7PZrMcff1ySrH9voaGhGj58uPXv9PreF3as5BwbvXr1Uq9evW6492azWe3atdOgQYNyrY+KilKnTp3UpUsX7dy5s0T7dSu75b4wHrgRW7Zssf6QnjRpkjp06KDu3btrw4YNkq7+A7R27VqZzWa1aNFCZ86c0QcffCDp6j+IZ86cUXBwsCTJ2dlZrVq10t9//60RI0bo1KlT8vHx0fvvv6+4uDjNnTtXGRkZGjlypGbOnKnAwED99NNPmjJlijp37qwNGzYoMjJSWVlZGjdunDp37qzOnTuradOmcnV11V133aWlS5fK1dVV06ZNU7NmzezTNFhVrlxZa9asUWhoqCSpTZs2Wrt2rbZt26atW7dq0qRJkqQ1a9ZY33P+/Hn9/PPPuvfee63LPvnkEzk7O1vH7dmzR3Xr1tXatWuVkJCgN954w3rcffTRR/Lw8ND7778vHx8f9evXz3os1KpVS59++qn++c9/Flj3yJEj9cQTT2j58uVavny5nn/+eXl4eGjt2rW5xh48eFB16tTR4sWLtWHDBr377rtKSkrSoUOHVLlyZf3444/WH+AxMTFydXXVsmXL9Nprr0mSFi1aZN12RkaGQkNDNW7cOJ04cSJXvRUrVtSQIUNUpUoVWSwW/fnnn3rzzTfVqFEjOTs7a/bs2YqOjpabm5vmzJmjjz/+WE899VSe+7hq1Sr9/vvveX7R97Rp0zR37lx5eHgU2KfyYODAgZo0aZKWLl2q6OhoSVf3rUIF2x/jK1euVIUKFbR161a9+OKL+uyzz3L1Pq9j5dpfIqT/HRspKSl67LHHit37nGNo7ty5qlq1aq71n3/+ubZu3aozZ85o7NixWrx4cYn06VbHTBtuS1988YXMZrOee+45SdKMGTMUExOjmJgYTZ8+vcD39uzZ0/qDU5LOnTuX5z/6a9asUcOGDbV+/Xo1atRIq1atkiRduXJFc+bMUZcuXXT+/HlNnjxZy5Yt08KFC5Wdna133nlHq1ev1po1a/T2229Lunr69aWXXtL06dO1bt066/p77rmnpFqCm/D444/r448/LtZ7hg8frqioKJtlK1eutAlaTZs2lbu7e57vX716tcLCwiRJbm5ueuyxx/T1119Lknr06KH169fnOwtyvQsXLuT5gzXHsWPH5O3tLX9/f3399ddKTU3V3r175ePjI2dnZ0lSixYtVKlSJZv3tW7dWleuXFFWVlauep944gnt27cvz3pdXFyss9UVKlRQ1apVNXjwYMXGxmrjxo0aOHCg3NzcJEnPPfecTRi+lqOjo0JDQzVhwgSdP3/eZt2VK1d0/PhxjRo1Sn379tVvv/1WpF7ZW1Ev53jwwQeVlpaWZ++Lc6yYTKYb6n2O9evXq0ePHrmW+/r66tKlS0pNTdUdd9xRpH0CM224TeX81prDwcHB+sPRycnJZqzFYrF5ff3MloeHh86dO5frM37//XdrqLr33nu1e/dueXp62gQtDw8PeXp6Srr6j3FycrIOHz5snbE5d+6cLBaLPD09VatWLUlSeHi4XnzxRTk7O2vixIny8vK6oR6gYF988YXi4uIkSUeOHNH999+f79hq1arJz89PP/30U5G37+fnp9jYWJ0+fdq67NKlS3J1dZUkjRgxQvv27dO///1v3Xfffbnef+nSJZuQVKtWLe3du1e1a9eWk5OTQkJCtHr16gJrePvtt/X555/rxIkT1lNm586dk9lsliS1b99e48eP15o1a9S2bVvNmzdP8fHx8vLyUsuWLXXu3Dn16tVLDg4OatSokf71r39Jkvr06SNHR0ddunRJLi4uSk5OzrPeb7/9VtWqVcu33szMTOss4I8//qi9e/fKYrEoMDDQOsbV1VWXL1/Oc/8++eQTVa9eXe+8845mzZpl8wtZcnKy9u3bp59++klJSUl65ZVX9PnnnxfYL3v64osv9M033+jixYv6+uuvtXLlyjx7fy1PT898e3/9sXLtKdDr3XnnncXuvSQlJSXJwcEhz19q27Vrp/vuu09ZWVlavnx5Udtw2yO0Abp6rVhaWpokWX/jtFgsunTpko4cOWIz1tHRdoLayclJNWvW1A8//KDg4GBd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WrVqpWeeeUbx8fG5woSPj4+WL19uDXPe3t6aNWuWtmzZog4dOkiS5s+fb7PNoUOHys/PT9OmTdPrr7+u2rVrS7oawLKysvTdd9+pXr161vGTJ0/Ot96HHnpIPj4+SklJ0YABA2zWDRw4UHPmzFFMTIyGDRtmXb5s2TJ5eHioU6dORerJtdzc3BQSEqJly5ZpyJAhslgsio6OVr9+/XIFWkm67777VKFCBcXFxVlDXnx8vNq3by8HBwe1atVK8fHx+sc//iHpaqALCAhQjRo1il0bgLLF6VEAJerChQuqWrVqkcfnhCuLxaK0tDQlJyerVatWkq7e0HC9Z555xiasPPvss5KkDRs25Npmdna2UlNTlZycrDZt2shiseiXX36RdPXu1u+//16DBg2yCWyS8gxDRdGgQQO1aNFCS5cutS5LT0/XunXr9Mgjj6hChRv7Pblfv36Ki4vTiRMnFB8fr+PHj+d5alS6uu9Nmza1zqClp6fr119/VevWrSXJGtqkq9cfHjhwgFk2wCAIbQBKVNWqVXXhwoUijz9x4oSeeuop+fr6ytfXV35+frrnnnskSWlpabnG+/n52byuUaOGTCaT/vjjD+uynOu9atWqpbp168rPz09ms9lmm8eOHZOkPK+7uxmPPfaYdu3apd9//12StHr1av311183dGo0R+fOnWUymbRixQotX75cgYGBCgoKynd8mzZtlJCQoNOnT+s///mPsrKyrKGtdevW+u9//6ukpCTt2rVL2dnZ1lOqAMo3QhuAEtWwYUP99ttvunz5cqFjs7Ky1LdvX23ZskWjR4/WZ599pi+//FIrVqyQdHWmrLhSU1P18MMP6+DBg5o0aZKWLFmir776yvpctRvZZnE88sgjcnZ2ts62LVu2TA0aNNC99957w9usWLGiQkNDtXTpUq1cuTLfWbYc117XFhcXJz8/P3l6ekqSWrZsKScnJ8XFxXE9G2AwXNMGoESFhIRox44d+uqrr/Too48WOHbfvn06fPiw5s2bp0GDBlmX//e//833Pf/973+tF9FLUnJyslJSUqzPUdu2bZuSk5P18ccf64EHHrCOu/5RF3fddZekqzcjlKTq1aurW7du1mvQvvvuO02YMOGmt9uvXz8tWrRIDg4OeuSRRwocmxPC4uLidOjQIZuZNDc3N919992Kj4/XL7/8opo1a1p7AaB8Y6YNQIkaMmSIfHx8NGnSJJvHTuS4cOGCpk6dKknW559ZLBabMe+8806+258/f77N+Pfee0+S1K1bt3y3mZ2drblz59psp0aNGmrbtq0+//xz66nSHNfXcz03NzelpqbmO+6xxx7T0aNHFR4eruzs7ELDa1G0bdtWkyZN0owZM2we9JsXT09P+fn5afv27frxxx+tp0ZztGrVStu2bdNPP/3EqVHAQJhpA1CiTCaTFi9erP79++vBBx9Uv3791Lx5czk6Omr//v1asWKFqlevrsmTJ6tBgwby8/PTpEmTdOrUKVWvXl2bNm3SqVOn8t3+qVOn1L9/f3Xr1k2//vqrPv74Y3Xs2FEPPfSQpKunBu+44w6FhYVpxIgRqlChglatWpXrWW6S9OabbyokJEQdOnTQ0KFDVa9ePR0/flwxMTH66aef8q3h3nvvVUxMjF5++WW1bNlSjo6ONrNfXbp0kYeHh7788ks98MADqlOnzk109CoHBweNGTOmyOPbtGmjxYsXW/98/br58+fnuQ5A+cVMG4ASd++99youLk4jRozQrl27NHHiRL388svavn27hgwZonXr1km6eq3WF198oebNm+udd97RtGnTVLVqVes1bXn56KOPZDKZNHXqVH355Zd64okntGjRIuv66tWra9myZapdu7YiIiI0Z84cBQYGWmfkrhUUFKRNmzapffv2WrhwocaPH68vv/xS3bt3L3D/nn76aQ0cOFDLli3T8OHD9fTTT9usr1ixojXEXf9YkLKSE8buuOMOBQQE2Ky7duaN0AYYh0NKSkrB5wEAoByIiIjQzJkzdejQIXl7e9u7nEJNnjxZ8+fP1+HDh+Xu7m7vcgDcAphpA4ASdunSJS1dulQ9e/YksAEoMVzTBgAlJCkpSVu2bNGaNWuUlJSk5557LteYc+fOKSsrK99tODk5ycPDozTLBGBQhDYAKCEHDx7UM888Iw8PD02fPl3NmzfPNeahhx7S8ePH891GnTp1tHfv3tIsE4BBcU0bAJSh+Ph4ZWZm5rve1dWVmwMA5InQBgAAYADciAAAAGAAhDYAAAADILQBAAAYAKENAADAAAhtAAAABvD/AMlo9c3hBhUgAAAAAElFTkSuQmCC\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nonmarg_capacity = sum(sorted_joined_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"])\n",
"marg_capacity = sum(sorted_joined_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"])\n",
"marg_demand = demand - nonmarg_capacity\n",
"marg_proportion = marg_demand / marg_capacity\n",
"\n",
"marginal_plants = np.where(height_yours == price)[0]\n",
"width_yours2 = width_yours.copy()\n",
"width_yours2[marginal_plants] = width_yours2[marginal_plants] * marg_proportion\n",
"new_x_yours2 = find_x_pos(width_yours2)\n",
"\n",
"\n",
"plt.figure(figsize=(9,6))\n",
"num_x = len(your_source.where('PRICE' + str(hour), are.below_or_equal_to(price))[1])\n",
"plt.bar(new_x_yours2[:num_x], height_yours[:num_x], width=width_yours2[:num_x], \n",
" color = energy_colors_dict[YOUR_PORTFOLIO],\n",
" edgecolor = \"black\")\n",
"plt.title(YOUR_PORTFOLIO)\n",
"plt.xlabel('Capacity_MW')\n",
"plt.ylabel('Price')\n",
"for new_x_i, height_i, label_i in zip(new_x_yours2[:num_x], height_yours[:num_x], label_yours[:num_x]):\n",
" plt.text(new_x_i, height_i, label_i,\n",
" ha='center', va='bottom', fontsize=8)\n",
"price_line_plot(price)\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The plot above allows us to see how the prices we have set correspond to the market price. However, in order to look at the profits that we are making, we should look at our marginal cost rather than our bid prices. We do this in the plot below, allowing us to compare the market price of energy in this hour to the marginal costs for running the plants that have a bid price that was below the market price. We should include the permit price in marginal cost: even if we are grandfathered permits, the ability to sell the permits represents an opportunity cost."
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Price: 44.83\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAGpCAYAAADfmgGBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xt8zvX/x/HnZYyZw8I2xsxpOazVUE5Jcsp2OX6tiBIlWSKTY9FRIb5KYjroi6Jk+WYzxzRyGvqWkpAaSjQzXTsxZrt+f/i56rLTNXbt2rU97rdbt6/r835/Pp/X5337fPXsc3h/DCaTySwAAACUaOUcXQAAAAAKRmgDAABwAoQ2AAAAJ0BoAwAAcAKENgAAACdAaAMAAHAChDYATm/FihXy8PDQihUrHF2KQ3h4eMhoNDq6DAB2Vt7RBQDAP3l4eORY5urqKm9vb919990KDw9X06ZNHVDZVenp6froo4+0YcMG/fTTTzKZTHJzc1OjRo1077336uGHH5a/v7/D6gNQehmYXBdASXIttE2ePNmyLCUlRd9++6327t0rd3d3bdiwQbfffrulPTk5WQkJCfL29lb16tXtVtv+/fv16KOP6vTp0/Lx8VGnTp3k4+OjCxcu6NChQ4qLi1N2dra++OIL3XPPPXar43oeHh66++67FRMTU2z7BFD8uNIGoESaOnVqjmUTJ07U+++/r4iICEVERFiWV69e3a5hTZJ+/vlnDRgwQKmpqXrhhRc0ZswYVahQwarPqVOnNGPGDKWkpNi1FgBlE8+0AXAaXbp0kSQlJSVZLc/vmbatW7fq/vvvl4+Pjxo0aKDBgwfr559/VlhYmDw8PHTy5Emb9j1p0iSlpKRo7NixGj9+fI7AJkn16tXT4sWL1a1bN6vlJ06c0FNPPaUWLVrI09NT/v7+GjZsmH788ccc20hOTtbbb7+t3r17W/o3btxYAwcO1N69e22qFUDpxJU2AE5j27ZtkqRWrVrZ1P/zzz/XiBEjVLFiRfXr10916tTRvn371L17d91222027/fEiRPatm2bKlWqpPDw8AL7V6xY0fLnAwcOqG/fvkpJSVGPHj0UEBCg48ePKzo6Whs3btTKlSstYVS6ekXv1VdfVYcOHdSjRw95eHjo1KlT2rBhg7788kt98skn6tGjh821Ayg9CG0ASqSZM2da/pyamqrvvvtOcXFxCg4O1tNPP13g+qmpqRo/frxcXFy0ceNGBQUFWdpeeuklvfXWWzbXEhcXJ0kKCgrK9UWJvJjNZo0aNUrJyclatGiRBg8ebGnbtm2b+vfvr5EjR+qHH35Q5cqVJUm33nqrjhw5opo1a1pt648//lDXrl31/PPPE9qAMorQBqBEmj17do5lzZo107/+9S9VqVKlwPXXr1+v5ORkDRw40CqwSdKECRP0n//8R8nJyTbVkpCQIEny8fGxqf81e/fu1ZEjR9SqVSurwCZJnTt3Vq9evRQdHa3169crNDRUkvJ8Nq9u3brq06eP3nvvPf3+++/y9fUtVC0AnB/PtAEokUwmk+WfP/74Q1u3bpWnp6eeeOIJvfrqqwWu/8MPP0iS2rdvn6OtSpUqCgwMLPKar/f9999Lkjp16pRre+fOna36XRMXF6dhw4YpICBAXl5e8vDwkIeHh9577z1J0pkzZ+xXNIASiyttAEo8d3d3tW7dWh999JECAgI0f/58DR8+XPXq1ctznWtvcHp6euba7uXlZfP+vb29JUmnT58uRNV/15DXvq5t959X/KKjo/Xoo4+qUqVK6ty5sxo2bKjKlSurXLly2rlzp3bt2qVLly4Vqg4ApQOhDYDT8PDwUJMmTfT999/r+++/zze0Va1aVZKUmJiYa/vZs2dt3m+7du0kXX2pwGQy2fxcW7Vq1fLd17Xbrtf6SdLrr78uV1dXxcbG5phEeNy4cdq1a5fNdQMoXbg9CsCpmEwmSVJ2dna+/a5Nvrtnz54cbWlpaTp48KDN+2zQoIE6d+6sjIwMzZ8/v8D+166E3XHHHZKkHTt25Npv+/btkmT1zF18fLyaNm2aI7BlZ2dbXogAUDYR2gA4jXXr1unkyZOqUKGC2rZtm2/fkJAQVatWTWvWrNGBAwes2ubOnWvzSwjXzJ49W9WqVdP8+fM1f/58XblyJUefM2fO6KmnntKXX34pSWrbtq2aNm2q//3vf1q1apVV3+3btys6Olo1a9ZUSEiIZXn9+vUVHx9v9dya2WzWzJkzdeTIkULVDKB04fYogBLpn1N+XLhwQUePHtWWLVskSS+88EKBz6RVq1ZNc+fO1ZNPPqng4GCredoOHjyou+++W7t27VK5crb9t2vTpk31+eef69FHH9WLL76o9957z+ozVocPH9bu3buVlZWlIUOGSJIMBoMiIiLUr18/jRo1Sv/9738t87RFRUXJ1dVVixcvtkz3IUlPPfWUwsPD1alTJ/Xp00fly5fX3r17dfToUfXs2VMbN24s7FACKCUIbQBKpH9O+eHi4qJatWqpZ8+eGjlypO677z6btvHggw/qlltu0Zw5c/TFF1/I1dVVHTp00JYtWzR9+nRJfz/7Zou77rpL+/fv1/Lly7VhwwZt2bLF8sH4Bg0a6Mknn9Sjjz6qJk2aWNZp1aqVtm3bpjlz5mjbtm3aunWrqlevLqPRqGeffdbqG6qSNHz4cLm6uioiIkKffPKJKlWqpPbt22vhwoWKiooitAFlGB+MB1DmZGVl6Y477lBmZqaOHj3q6HIAwCY80wag1EpOTtaFCxeslpnNZs2ZM0enTp1Sr169HFQZABQeV9oAlFrbtm3T0KFDdd9996l+/fpKT0/X/v37dfDgQdWrV0+xsbF5zuMGACUNoQ1AqfXbb79pxowZiouL07lz53TlyhX5+Pjo/vvv17PPPluoCXYBwNEIbQAAAE6AZ9oAAACcAKENAADACRDaAAAAnAChrZCOHTvm6BJKPMaoYIyRbRingjFGBWOMCsYYFawkjBGhDQAAwAkQ2gAAAJwAoQ0AAMAJENoAAACcAKENAADACRDaAAAAnAChDQAAwAkQ2gAAAJwAoQ0AAMAJENoAAACcAKENAADACRDaAAAAnAChDQAAwAkYTCaT2dFFFKXqHh6OLgEAAKDQkk2mfNu50gYAAOAEyju6gKJWUEq9WceOHZO/v79d9+HsGKOCMUa2YZwKxhgVjDEqGGNUsJIwRlxpAwAAcAKENgAAACdAaAMAAHAChDYAAAAnQGgDAABwAoQ2AAAAJ0BoAwAAcAKENgAAACdAaAMAAHAChDYAAAAnQGgDAABwAoQ2AECBduzYodtuu029evVSv379dP78eRmNRoWEhMhoNOrhhx+WJBmNRhmNRvXt21cjR47U2bNnJUlZWVl67rnnZDQaFRwcrK1bt1q2W69ePZn+/7vRYWFhio+P14oVK3TnnXeqT58+6tOnj2JjYy21bN26VcHBwTIajXruueeUlZWVa83X6nvyySe1ffv2HO2//fabBg4cqF69emn58uVFOl5FyVnH3mg06p577tHgwYNztEdERKhr167q3r279u3bV6TjVZqVug/GAwDsY9CgQZo2bZpWrVqlyMhISVJUVJTKl7f+V8natWtVvnx5bd++XePHj9fHH3+spUuXqlatWoqJiVF6erpCQ0MVFBQkSapbt64++ugjjRkzxmo7Y8eO1dChQ2UymfTQQw+pWbNmcnV11dy5cxUZGSl3d3fNmzdPy5Yt02OPPZZrzVFRUTp+/HiuH/qeMWOGFi5cqFq1ahXF8NiVvce+Z8+eVtu52bGPiYmRJC1cuFBVq1bN0b5y5Upt375df/75pyZOnKgVK1YUyTiVdlxpAwAUSnJysk397r33XqWkpCgrK0vR0dEKCwuTJLm7u+uhhx7S5s2bJUkhISHasGFDnldtPDw8NGTIEMXGxmrTpk0aNGiQ3N3dJUlPPfWU1q1bl+t65cqVU9++ffXcc8/pr7/+smrLzMzU77//rnHjxulf//qXfvnlF5uOydGcZeyv2bBhg0JCQnIsr1+/vi5duqTk5GTVqFHDpmMCV9oAADb69NNP9eWXX+rixYvavHmz1q5dqz59+shgMKhZs2b697//nWMdT09PJSUl6dKlS3Jzc7Msr1u3rg4ePKh69erJxcVFwcHBio6OznPfderU0cGDB2U2m9WiRQvL8kqVKuny5cu5rrN8+XLdcsstWrBggebMmaPXX3/d0paUlKRDhw7p22+/VWJiol544QWtXLnyRoalWNh77P95C/R6NzL2kpSYmCiDwZDrlcx77rlHd911l7KysrR69Wpbh6HM40obAMAmgwYN0rZt29SqVSudOnVK0tVbdDExMbmGBunqv7hr1qwpV1dXXbx40bL8jz/+kLe3t+X3I488omXLluW579OnT8vb21ve3t76888/LcszMjJUoUKFXNe55ZZbJEmdO3fW4cOHde7cOcuzVtWqVVPTpk1Vq1YtNW/ePMeVuJLG3mP/xRdf5LnvGxl7SVq/fr3lKts/xz4lJUWfffaZvv32W3355Zd6+eWXbRsEENoAAIUzfvx4zZs3r8B+O3fulIeHh1xcXNSrVy9FRERIktLT0/XJJ5+oe/fulr4eHh5q0qSJvv322xzbMZlM+uSTT3Tfffepe/fu+vTTT5Weni5JWrRokYxGY677T0lJkSR9//33atiwoeW5rpiYGFWuXFnu7u66cOGCTp8+netzVyWRvcbez8+vSMdeuvpcW69evSTJauzLlSsnNzc3ubq6qlq1apbtoWDcHgUAFIq/v7/OnTuns2fPWm7Rubi4KCoqSpLUt29flS9fXt7e3po7d64kafjw4Zo2bZpCQkKUnZ2t8ePH57htNmrUKH3wwQeW32+//bblofuJEyeqdu3akqTw8HCFhobKYDDo9ttv19ixY3Ots0+fPnJzc1NWVpaWLl2ao33ChAkaMGCArly5ojfeeOOmx6U42GvsBw4caHWb8mbHPiUlRcnJyfL19c3RVqVKFXXp0kXdu3dXVlaWJk2adPMDU0YYTCaT2dFFOJNjx47l+hYS/sYYFYwxsg3jVDDGqGCMUcEYo4KVhDHiShsAoFDemj1Nl9L+LLhjMdq2+6D++DPJ8rvlbY3V4tarV3kuXrwgN7fKua7386+/69bGOa8GlTX5jVFB8hv70iQj200vvrbAoTUQ2gAAhXIp7U+9NKS6o8uwNqRjPo151/r4jKMl71gc4ibGIN+xLz0mf3DG0SXwIgIAAIAzILQBwHV27NihGTNmWH6HhYVp+fLlVp86CgsL08mTJ7VixQoFBgZaJic1Go3auXOnjEajOnbsqNtuu01Go1EREREyGo26cuWKZs6caTUD/bU/Z2Vl6bXXXlOvXr0UHByskSNH6uDBgzIajerWrZv8/f1lNBr18ssvWz5N9OSTT9r0aaLrXftUkdFoVK9evSyfPLq2zGg06tlnn7X0f+ONNxQaGmq1jVWbf1XXUevU5cl1GvbiNl3OzFL3sBhduZItSTpxOlXDXtyW6xiPeWOX6vZcoQ/XHs3Rlpp+Wfc/vV5dR61Tv2c3KzU977nAgLKE26MAcJMqV66sdevWqW/fvpKkdu3aKSYmRjt27ND27ds1bdo0SbKaPf6vv/7Sd999p5YtW1qWLV++XK6urpZ+P/zwg/z8/BQTE6OTJ0/qtdde03vvvSdJWrJkiWrVqqV3331XPj4+Nn0W6nrXPlW0evVqrV69WqNHj7ZMzXC9/fv3y83NzTIj/0/xf+nTTb9qw4JguVZw0f5DicrKsv29tucea6m7WnjqSi7rVChfTktf6qw6tSpryRdHtDzmmEY/GGDztoHSiittAHCTHn744Xwnhs3NyJEjLXNnXbN27VqroHX77berWrVqua5/M58mul5qamq+85SdOHFCfn5+6tWrl2Ufa746rqcHBsi1gosk6a4AT7lVsv06QJ1aeT/0XqlieUt7hfLl5FLOYPN2gdKMK20AkItPP/1Ue/bskXT1Vf/27dvn2bd69epq3LhxrpOT5qVx48aKjY3VmTN/P9x86dIlVapUSZL05JNP6tChQ3rzzTd111135Vj/Zj8LJV2di2vlypU6deqU5fbqtZnrJalTp06aPHmy1q1bpz59+igoKEgTJkxQY2/pTNLFPINXzzEbZJCUcTlLjevlHjptkXYhUx98cURRb95/w9sAShNCGwDkYtCgQZbbmmFhYUpISJCHh4el/frQNGrUKM2ePbtQ+xgxYoTef/99y++KFSsqIyNDlSpV0rvvvquZM2cqIyMj13Vt+TTR8OHDLZOi5uba7dFDhw7p1Vdf1TvvvJPr7dEtW7Zo69atKleunH799Vf5BbdUnZpuOp14QS0a3ZJjuxsXBKt8+XI6cTpVL737P5vG4sdfziv833vkXdNNH8/oIrPZrJGv7dDLo+6UR9WKNm0DKO24PQoANggJCdG+ffskXQ1sp06dkqenp6W9cePGSk9Pt7pyVpDOnTtr7969lvDVu3dvvf3225b2/G5v3sxnoa5XvXr1PL+9mZCQIB8fH/33v//V559/rrFjx+r47wn6V5eGWvjZIWX+/0sH/zucqIsZVwo+6Dzc1qSGtkQY9fGMLpKkl9/7Vu1v99J9d/rc8DaB0oYrbQBgAzc3N/n5+Sk4OFjZ2dkaN26cDAbrZ62eeOIJ9evXr1DbHThwoGbNmiVJGjZsmF5//XUFBwerYsWK8vLyUkBA7g/gX/s00ciRI1WxYkWbPgt1vbffflufffaZMjMz9dprr0myvj3q4+OjDh06WN0a7tixo/7z/ny1aNRcA3s0Vs+n18tslurXrqL3p3ey+bhn/eeAPt38q8xm6cy5C3r+8b9fyDidmK65H/2g9oFeitp2UqHdGunJAc1t3jZQWpWYz1jNmzdPr7zyip544gnNmTNHkmQ2mzVr1iwtW7ZMJpNJrVu31ty5c9W8ueP+z1sSPmNR0jFGBWOMbMM4FcwRYzR7+ohSMyHt4zP2acm0No4uA05g8gdn9NLclQ6toURcadu/f7+WLl2a478o58+fr4ULF2rhwoXy9/fXG2+8of79+2v//v35vukEAM7kZj4LZcvnh5L+StXG2L+fLSvv4qKBfe+5of1J0qnfjksKsrn/tEX7tffgWcvvkf9qrge6N7rh/QNllcNDW3Jysp544gm98847Vg/xms1mRUREaNy4cZa5jyIiIuTv76/IyEgNHz7cUSUDQJG6uc9C2bJedenpeje4/Zwen1G4yW5nPJXz7VcAhefwFxGuhbJOnayfhTh58qQSEhLUpUsXyzI3Nzd16NBBe/fuLe4yAQAAHMqhV9qWLVum+Ph4ywzf/5SQkCBJVm9nXftdmLezAAAASgOHhbZjx47plVde0caNG1WhQoUi3a69Fcc+nB1jVDDGyDZlYZwuXrwg225zlgxZ2bZ9acEZlKZjgf3Z+++jgl4qclho27dvn5KSktSuXTvLsqysLO3evVsffvih4uLiJEmJiYny9fW19ElMTJSXl1ee27X3W1S8zVYwxqhgjJFtyso4FfQiQUnjUs7F0SUUmdJ0LLA/R/995LDQZjQarT6ULEmjR49W48aNNX78eDVp0kTe3t6KjY1Vq1atJEkZGRnas2ePXnnlFUeUDAAA4DAOC20eHh5Wn4SRpMqVK+uWW25RixYtJF39dMy8efPk7++vJk2aaO7cuXJ3d1doaKgjSgYAAHAYh0/5kZ9nnnlGFy9e1MSJEy2T665Zs4Y52gAAQJlTokLb9R8pNhgMmjp1qqZOneqgigAAAEoGh8/TBgAAgIIR2gAAAJwAoQ0AAMAJENoAAACcAKENAADACRDaAAAAnAChDQAAwAkQ2gAAAJwAoQ0AAMAJENoAAACcAKENAADACRDaUObs2LFDt912m4xGo4xGo5KTk296m0lJSXrsscdkNBrVs2dPbdmypQgqBQDgbyXqg/FAcRk0aJCmTZt2w+tnZ2erXLm//5tn0qRJGjFihDp06KDLly/rwIEDhd7GjewXAFB28Lc/IGnbtm3q1q2bunXrpm3btkmSevbsaWk3Go2W/33hhRc0atQoS1tWVpb+/PNPdejQQZLk6uqqNm3a6MqVK3r88ccVHBysxx9/XFeuXNGOHTs0aNAgjR8/Xlu3blW3bt00duxYdezYUV9++aUkaePGjQoODlaPHj0sy7p166bx48dr2rRpev/999WtWzf16tXLpnAIACgduNKGMunTTz/Vnj175Ofnp0WLFmnWrFlas2aNJCk0NFSdO3fOc91evXqpTZs2lt/nzp1TrVq1cvRbt26dmjZtqiVLlmjOnDmKioqSp6enMjMzNW/ePPn7+2vKlCmaPn26MjMzNXHiRHXp0kULFixQdHS0srOzFRoaqm7duikpKUnPPvus6tatq/79+ys6Olpubm4ym81FPjYAgJKJ0IYy6frbowaDQdWqVZMkubi4WPW9PhgFBQVZ/a5Vq5bOnTuXYx/Hjx/XHXfcIUlq2bKlDhw4IE9PT8uya+t6enpKkpKTk5WUlKSff/5Zffv2lXQ1EJrNZnl6eqpu3bqSpKlTp2r8+PFydXXV888/Ly8vrxsaAwCAc+H2KKCrz4qlpKQoJSVFWVlZkq6GtUuXLunQoUNWfa9/pszFxUW1a9fW7t27JUmZmZnav3+/GjZsaLl9+d1336lhw4Y51jcYDJY/m81m1axZUy1atFBUVJRiYmK0c+dOGQwGq3UCAwMVERGhjh07auXKlUU4CgCAkowrbYCkyZMnq3///pKk5557TpI0ePBg9ezZU926dStw/TfeeEMTJ07Ua6+9pqysLE2YMEFGo1Fr165VcHCwateurXHjxikuLi7f7ZQrV06jR49Wnz59ZDAY1KxZM82dO9eqT3h4uE6ePKnLly9r4cKFN3jEAABnYzCZTDwUUwjHjh2Tv7+/o8so0RijgjFGtikr4zR7+gi9NKS6o8uw2eMz9mnJtDYFd3QCpelYYF+TPzijl+Y69u4Gt0cBAACcALdHC2nl0rdVqdxFR5dRol28eEFubpUdXUaJxhjZpqyM06nfjksKKrAfgLKN0FZI5ktJemlEHUeXUcI5z20ex2GMbFM2xunxGZcdXQIAJ8DtUQAAACdAaAMAAHAChDYAAAAnQGgDAABwAoQ2AAAAJ0BoAwAAcAKENgAAACdAaAMAAHAChDYAAAAnQGgDAABwAjZ/xspsNuvQoUM6evSokpKSZDAYVLNmTd16660KCAiQwWCwZ50AAABlWoGh7euvv9aKFSu0YcMGpaWlyWw2W7UbDAZVqVJFPXv21JAhQ3TvvffarVgAAICyKs/Q9uWXX+q1117TgQMH1Lx5cz3yyCMKCgpSgwYN5OHhIbPZLJPJpJMnT+rAgQOKjY1Vv379dMcdd2j69Onq2rVrcR4HAABAqZZnaBs6dKgeeeQRLV68WE2bNs1zA23atNEDDzwgSTp69KiWLFmioUOH6o8//ij6agEAAMqoPEPbwYMHVbNmzUJtrGnTpnrjjTc0efLkmy4MAAAAf8vz7dHCBraiWhcAAAA5MeUHAACAE8jz9mjv3r0LvTGDwaCoqKibKggAAAA55RnasrOzCz332vXTgQAAAKBo5BnaYmJiirMOAAAA5INn2gAAAJyAzZ+x+qfU1FSlpKQoOzs7R5uvr+9NFwUAAABrhQptS5cu1YIFC3T8+PE8+5w/f/6miwIAAIA1m2+PLl++XOHh4fLz89O0adNkNpsVFham8PBweXl5KTAwUAsWLLBnrQAAAGWWzaFt8eLF6ty5s9asWaNhw4ZJknr06KHp06crLi5OJpNJKSkp9qoTAACgTLM5tMXHxyskJOTqSuWurpaZmSlJ8vDw0NChQ/XBBx/YoUQAAADYHNrc3d0t87BVqVJFLi4uOnPmjKW9Ro0aOn36dNFXCAAAANtD26233qqjR49KksqXL6/AwECtWrVKmZmZysjI0KpVq+Tn52e3QgEAAMoym0NbSEiINm7cqIyMDEnShAkTtHv3bjVo0EBNmjTR3r17FR4ebrdCAQAAyjKbp/wYM2aMxowZY/ltNBoVExOjqKgoubi4qGfPnurYsaNdigQAACjrbmhy3Wvat2+v9u3bF1UtAAAAyIPNt0dr1Kih1atX59m+Zs0a1ahRo0iKAgAAgDWbQ9u1N0fzkp2dLYPBcNMFAQAAIKdCfTA+v1D2zTffyMPD46YLAgAAQE75PtMWERGhxYsXW35PnTpVr776ao5+ycnJSklJ0aBBg4q+QgAAAOQf2jw9PdWsWTNJ0m+//aY6deqoTp06Vn0MBoPc3d0VFBSkESNG2K9SAACAMizf0BYaGqrQ0FBJUq9evTRx4kTde++9xVIYAAAA/mbzlB/r1q2zZx0AAADIR6HmacvMzNSyZcu0efNm/fbbb5Kk+vXrq2fPnnrkkUdUoUIFuxQJAABQ1tkc2kwmk/r06aODBw/Ky8tLjRo1kiR9//332rJli5YtW6a1a9fyBikAAIAd2Dzlx8svv6zDhw9r4cKFOnz4sDZs2KANGzboyJEjioiI0OHDh/XKK6/Ys1YAAIAyy+bQtn79ej3xxBMaPHiwypX7ezWDwaBBgwZpxIgRiomJsUuRAAAAZZ3NoS05OVkNGzbMs71hw4ZKTk62ecfvv/++OnToIF9fX/n6+qp79+7atGmTpd1sNmvmzJlq1qyZateuLaPRqMOHD9u8fQAAgNLE5tDWqFEjrV+/PtfPWZnNZsXExFiec7OFj4+PXn75ZW3fvl2xsbHq1KmThgwZoh9//FGSNH/+fC1cuFCzZ8/WV199JU9PT/Xv31+pqak27wMAAKC0sDm0jRgxQtu2bdOAAQO0efNmxcfHKz4+Xps2bdKAAQP09ddfa+TIkTbv2Gg0qnv37mrUqJGaNGmi6dOnq0qVKtq/f7/MZrMiIiI0btw49e3bVy1atFBERITS0tIUGRl5QwcKAADgzGx+e/Sxxx5TUlKS5s6dq23btlmWm81mubq66rnnntOwYcNuqIisrCx98cUXSk9PV5s2bXTy5EklJCSoS5culj5ubm7q0KGD9u7dq+HDh9/QfgAAAJxVoeZpmzhxoh6bDxFNAAAgAElEQVR77DFt27ZNv//+uyTJ19dX9913n2rUqFHonR86dEg9evRQRkaG3N3d9fHHHysgIEB79+6VdPUzWv/k6empM2fO5LvNY8eOFboOAHCkrOwsR5dQKM5Wb35K07HA/uydMfz9/fNttzm07dq1S02bNlWtWrU0YMCAHO1JSUk6cuSI7r777kIVt2PHDqWkpGjt2rUKCwu76S8vFHTAAFDSuJRzcXQJheJs9eanNB0L7M/RGcPmZ9p69+6t2NjYPNu3b9+u3r17F2rnrq6uatSokYKCgvTiiy8qMDBQixYtkre3tyQpMTHRqn9iYqK8vLwKtQ8AAIDSwObQlttbo/90+fJlq/nbbkR2drYuX74sPz8/eXt7W4XEjIwM7dmzR23btr2pfQAAADijfG+PpqSkWM29dv78ecuzbP9kMpkUGRmpOnXq2Lzjl156ST169FDdunUtb4Xu3LlTn332mQwGg8LCwjRv3jz5+/urSZMmmjt3rtzd3RUaGlqIwwMAACgd8g1tixYt0htvvCHp6pcPpk6dqqlTp+ba12w266WXXrJ5xwkJCRo5cqTOnj2ratWqKSAgQJGRkeratask6ZlnntHFixc1ceJEmUwmtW7dWmvWrFHVqlVt3gcAAEBpkW9o69Kli9zd3SVJL7zwgkJDQ3X77bdb9TEYDHJ3d1fLli0VFBRk844jIiLybS8oJAIAAJQl+Ya2Nm3aqE2bNpKk9PR09enTRy1atCiWwgAAAPA3m6f8mDJlij3rAAAAQD7yfN3z448/1pUrVwq9waysLH388cc3VRQAAACs5RnaXn31VQUFBWn27Nk6evRogRs6evSoZs2apTvuuEMzZswo0iIBAADKujxvj3733XeKiIjQ4sWLNXv2bNWuXVtBQUFq0KCBPDw8ZDabZTKZdPLkSR04cEB//vmnatWqpbCwMI0aNao4jwEAAKDUyzO0Va5cWc8++6yeeeYZbdiwQevXr9e+ffu0ceNGy0S7BoNBjRs3VpcuXRQSEqL7779fLi58EgQAAKCoFfgiQvny5dW7d2/LJ6qysrL0119/SZJq1Khx019BAAAAQMFsfnv0GhcXF9WqVcsetQAAACAPXCYDAABwAoQ2AAAAJ0BoAwAAcAKENgAAACdAaAMAAHACNoe20aNH65tvvsmz/X//+59Gjx5dJEUBAADAms2hbeXKlTp+/Hie7SdPntQnn3xSJEUBAADAWpHdHj1//rwqVqxYVJsDAADAP+Q7ue6uXbu0c+dOy+/o6GjFx8fn6GcymbRmzRrddtttRV8hAAAA8g9tO3bs0OzZsyVd/c5odHS0oqOjc+3bvHlzS18AAAAUrXxD2zPPPKORI0fKbDarSZMmevPNN9WnTx+rPgaDQW5ubqpUqZJdCwUAACjL8g1tbm5ucnNzkyR9//33qlWrlipXrlwshQEAAOBvNn8w3tvbWxcuXLAKbUlJSVq2bJmSk5PVt29ftWrVyi5FAgAAlHU2h7axY8fqyJEj2r59uyTpwoUL6tatm06cOCFJWrRokaKjo9WuXTu7FAoAAFCW2Tzlx+7duxUcHGz5HRkZqRMnTigyMlJHjx5V06ZNNXfuXLsUCQAAUNbZHNoSExNVt25dy+/169erTZs26tq1q7y8vDRkyBD98MMPdikSAACgrLM5tFWpUkUmk0mSdOXKFe3evVudO3e2tLu5uSk1NbXICwQAAEAhnmlr2bKlPvroI3Xq1EkbNmxQWlqaevbsaWk/fvy4vLy87FIkAABAWWdzaJs2bZr69++v++67T2azWf369VPLli0t7evWrVPbtm3tUiQAAEBZZ3Nou+OOO7R//37t3btX1apVU8eOHS1tJpNJI0aM0N13322XIgEAAMo6m0ObJNWsWVMhISE5lnt4eCgsLKzIigIAAIC1QoU2Sdq8ebM2b96s3377TZJUv3599ezZU926dSvy4gAAAHCVzaEtIyNDjz76qLZs2aJy5cqpdu3akqSvvvpKH374obp3767ly5erYsWKdisWAACgrLJ5yo+ZM2dq8+bNmjRpkuLj4/Xjjz/qxx9/1PHjxzVlyhRt2bJFs2bNsmetAAAAZZbNoe3zzz/Xww8/rClTpqhatWqW5VWrVtWkSZM0ZMgQrV692i5FAgAAlHWF+iLCP6f4uF5QUJASExOLpCgAAABYszm01a1bV19//XWe7V9//bXVZ64AAABQdGwObYMHD9batWs1ZswYHT58WJmZmcrMzNThw4c1duxYRUdH6+GHH7ZnrQAAAGWWzW+Pjh8/XidPntTHH3+sFStWyGAwSJLMZrPMZrMeeeQRhYeH261QAACAsszm0FauXDktWLBAo0aN0ubNm/X7779Lknx9fdWjRw8FBATYrUgAAICyrtCT6wYEBBDQAAAAilm+z7RdunRJ4eHhWrx4cb4bWbx4scaPH6/MzMwiLQ4AAABX5Rvali5dqpUrV+r+++/PdyP333+/VqxYoY8++qhIiwMAAMBV+Ya2L774Qr169VLDhg3z3UjDhg3Vp08fRUZGFmlxAAAAuCrf0Hbo0CG1a9fOpg21adNGhw4dKpKiAAAAYK3AZ9oqVapk04YqVaqkS5cuFUlRAAAAsJZvaPPy8tIvv/xi04Z++eUXeXp6FklRAAAAsJZvaOvYsaNWrVqltLS0fDeSmpqqVatW6Z577inS4gAAAHBVvqFt7NixSkpK0gMPPKBTp07l2ufUqVMaOHCgkpKS9PTTT9ulSAAAgLIu38l1mzdvrrfeekvjxo1Ty5Yt1aFDBwUEBKhKlSpKS0vTTz/9pF27dslsNuvNN99UixYtiqtuAACAMqXALyIMGTJEzZo106xZs7R9+3Z9/fXXlrYKFSqoc+fOmjRpku666y67FgoAAFCW2fQZq9atW2v16tXKyMjQr7/+qtTUVFWtWlWNGjWSm5ubvWsEAAAo8wr17dFKlSrx3VEAAAAHyPdFBAAAAJQMhDYAAAAnQGgDAABwAoQ2AAAAJ0BoAwAAcAKENgAAACeQ55QfvXv3LvTGDAaDoqKibqogAAAA5JRnaMvOzpbBYCjUxsxm800XBAAAgJzyDG0xMTHFWQcAAADywTNtAAAATqBQn7G6JjU1VSkpKcrOzs7R5uvre9NFAQAAwFqhQtvSpUu1YMECHT9+PM8+58+fv+miAAAAYM3m26PLly9XeHi4/Pz8NG3aNJnNZoWFhSk8PFxeXl4KDAzUggULbN7xvHnzdN9998nX11eNGzfWwIED9dNPP1n1MZvNmjlzppo1a6batWvLaDTq8OHDth8dAABAKWFzaFu8eLE6d+6sNWvWaNiwYZKkHj16aPr06YqLi5PJZFJKSorNO965c6cef/xxbdq0SVFRUSpfvrz69eunv/76y9Jn/vz5WrhwoWbPnq2vvvpKnp6e6t+/v1JTU20/QgAAgFLA5tAWHx+vkJCQqyuVu7paZmamJMnDw0NDhw7VBx98YPOO16xZo4cfflgtWrRQQECA3n33XZ07d05xcXGSrl5li4iI0Lhx49S3b1+1aNFCERERSktLU2RkpM37AQAAKA1sDm3u7u6WediqVKkiFxcXnTlzxtJeo0YNnT59+oYLSUtLU3Z2tjw8PCRJJ0+eVEJCgrp06WLp4+bmpg4dOmjv3r03vB8AAABnZPOLCLfeequOHj16daXy5RUYGKhVq1Zp0KBBysrK0qpVq+Tn53fDhUyZMkWBgYFq06aNJCkhIUGS5OnpadXP09PTKixe79ixYzdcAwA4QlZ2lqNLKBRnqzc/pelYYH/2zhj+/v75ttsc2kJCQrR48WK99tprqlSpkiZMmKBHHnlEDRo0kMFgUHp6uhYvXnxDRT733HOKi4vTxo0b5eLickPbuKagAwaAksal3M39vVfcnK3e/JSmY4H9OTpj2BzaxowZozFjxlh+G41GxcTEKCoqSi4uLurZs6c6duxY6AKmTp2qNWvWKDo6Wg0aNLAs9/b2liQlJiZazf2WmJgoLy+vQu8HAADAmd3Q5LrXtG/fXu3bt7/h9SdPnqz//ve/io6O1q233mrV5ufnJ29vb8XGxqpVq1aSpIyMDO3Zs0evvPLKzZQNAADgdG4qtN2MCRMmaNWqVfr444/l4eFheYbN3d1dVapUkcFgUFhYmObNmyd/f381adJEc+fOlbu7u0JDQx1VNgAAgEPYHNrMZrOWLl2qjz76SCdOnJDJZMrRx2AwKCkpyabtXZsepG/fvlbLJ0+erKlTp0qSnnnmGV28eFETJ06UyWRS69attWbNGlWtWtXWsgEAAEoFm0PbCy+8oIULFyowMFAPPvigZWqOG5Vb6LuewWDQ1KlTLSEOAACgrLI5tH3yySfq06ePli5dasdyAAAAkBubJ9fNyMhQ586d7VgKAAAA8mJzaOvUqZO+/fZbe9YCAACAPNgc2v7973/rm2++0dy5c3X27Fl71gQAAIDr2PxMW8uWLWU2m/X666/r9ddfV4UKFSwfjr/GYDDc1PdHAQAAkDubQ1v//v1lMBjsWQsAAADyYHNoi4iIsGcdAAAAyIfNz7QBAADAcfK80rZr1y5J0t133231uyDX+gMAAKDo5BnaevXqJYPBoD///FOurq6W33kxm80yGAw6f/68XQoFAAAoy/IMbdHR0ZIkV1dXq98AAAAofnmGto4dO+b7GwAAAMWHFxEAAACcgM1TfowePTrfdoPBoEqVKsnHx0cdO3ZUmzZtbro4AAAAXGVzaNuxY4cuXryoc+fOSZI8PDwkSSaTSZJUq1YtZWdn6/z58zIYDOratauWLVumypUr26FsAACAssXm26OfffaZXF1dNWXKFB0/ftzyT3x8vCZPnqyKFStq06ZNOnHihCZOnKgvv/xSr732mj1rBwAAKDNsDm2TJk3S/fffr8mTJ1uusknSLbfcoilTpqh79+6aOHGiqlevrqlTp2rAgAFau3atXYoGAAAoa2wObd98840CAgLybL/tttu0b98+y+/27dsrMTHx5qoDAACApEKEturVq2vr1q15tm/ZskXVqlWz/E5PT1fVqlVvrjoAAABIKkRoGzp0qDZs2KAhQ4Zo69atlmfatm7dqsGDB2vz5s0aOnSopf/mzZsVGBhol6IBAADKGpvfHp0yZYoyMjK0aNEibdiwwarNxcVFo0eP1pQpUyRJGRkZGjx4cL63UwEAAGA7m0ObwWDQyy+/rKefflrbt2/X77//Lkny9fXVvffeK09PT0vfSpUqafDgwUVfLQAAQBllU2i7ePGi3n77bd11113q0qWLQkND7V0XAAAA/sGmZ9rc3Nz05ptv6tSpU/auBwAAALmw+UWE2267TfHx8fasBQAAAHmwObRNnz5dy5Yt06ZNm+xZDwAAAHJh84sI77zzjm655RY99NBD8vHxUYMGDeTm5mbVx2Aw6LPPPivyIgEAAMo6m0PbkSNHZDAYVK9ePUnSb7/9lqOPwWAousoAAABgYXNoO3jwoD3rAAAAQD5sfqYNAAAAjmPzlbZ/Sk1NVUpKirKzs3O0+fr63nRRAAAAsFao0LZ06VItWLBAx48fz7PP+fPnb7ooAAAAWLP59ujy5csVHh4uPz8/TZs2TWazWWFhYQoPD5eXl5cCAwO1YMECe9YKAABQZtkc2hYvXqzOnTtrzZo1GjZsmCSpR48emj59uuLi4mQymZSSkmKvOgEAAMo0m0NbfHy8QkJCrq5U7upqmZmZkiQPDw8NHTpUH3zwgR1KBAAAgM2hzd3dXWazWZJUpUoVubi46MyZM5b2GjVq6PTp00VfIQAAAGwPbbfeequOHj0qSSpfvrwCAwO1atUqZWZmKiMjQ6tWrZKfn5/dCgUAACjLbA5tISEh2rhxozIyMiRJEyZM0O7du9WgQQM1adJEe/fuVXh4uN0KBQAAKMtsnvJjzJgxGjNmjOW30WhUTEyMoqKi5OLiop49e6pjx452KRIAAKCsu6HJda9p37692rdvX1S1AAAAIA98xgoAAMAJ5HulrXfv3oXamMFgUFRU1E0VBAAAgJzyDW07d+6Um5ubGjRoUEzlAAAAIDf5hrYGDRroxIkTys7OVmhoqEJDQwlwAAAADpDvM23fffedtmzZonvvvVfvvfeeWrVqpR49euiDDz7gw/AAAADFqMAXEe68807Nnj1bR44c0erVq9WwYUO98soratq0qR544AGtWrVK6enpxVErAABAmWXz26PlypVT165d9e677+rnn3/We++9p7S0NIWFhemdd96xZ40AAABlXqHnabt48aJiYmK0evVqffPNN6pcubIaNmxoj9oAAADw/2wKbVlZWdq6dasiIyO1fv16Xb58WV26dNHixYsVEhIiNzc3e9cJAABQpuUb2uLi4hQZGakvvvhCf/31l9q1a6cZM2aoX79+8vDwKK4aAQAAyrx8Q1twcLDc3NzUvXt3DRgwQHXr1pUk/frrr3mu07p166KtEAAAAAXfHr148aKioqIUHR2dbz+z2SyDwcBUIAAAAHaQb2hbuHBhcdUBAACAfOQb2gYPHlxcdQAAACAfNs/TBgAAAMchtAEAADgBQhsAAIATILQBAAA4AUIbAACAEyC0AQAAOAFCGwAAgBMgtAEAADgBQhsAAIATcGho27VrlwYNGqTmzZvLw8NDK1assGo3m82aOXOmmjVrptq1a8toNOrw4cMOqhYAAMBxHBra0tPT1aJFC82aNUtubm452ufPn6+FCxdq9uzZ+uqrr+Tp6an+/fsrNTXVAdUCAAA4jkNDW48ePfTCCy+ob9++KlfOuhSz2ayIiAiNGzdOffv2VYsWLRQREaG0tDRFRkY6qGIAAADHKLHPtJ08eVIJCQnq0qWLZZmbm5s6dOigvXv3OrAyAACA4ldiQ1tCQoIkydPT02q5p6enzp4964iSAAAAHKa8owsoaseOHXN0CQBQKFnZWY4uoVCcrd78lKZjgf3ZO2P4+/vn215iQ5u3t7ckKTExUb6+vpbliYmJ8vLyynO9gg4YAEoal3Iuji6hUJyt3vyUpmOB/Tk6Y5TY26N+fn7y9vZWbGysZVlGRob27Nmjtm3bOrAyAACA4ufQK21paWmKj4+XJGVnZ+vUqVP64YcfdMstt8jX11dhYWGaN2+e/P391aRJE82dO1fu7u4KDQ11ZNkAAADFzqGh7bvvvlPv3r0tv2fOnKmZM2fqoYceUkREhJ555hldvHhREydOlMlkUuvWrbVmzRpVrVrVgVUDAAAUP4eGtnvuuUcmkynPdoPBoKlTp2rq1KnFWBUAAEDJU2KfaQMAAMDfCG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAAToDQBgAA4AQIbQAAAE6A0AYAAOAECG0AAABOgNAGAADgBAhtAAAATsApQtsHH3yg22+/Xd7e3rr33nu1e/duR5cEAABQrEp8aFuzZo2mTJmiZ599Vl9//bXatGmjBx54QL///rujSwMAACg2JT60LVy4UIMHD9ajjz6qpk2bas6cOfL29taHH37o6NIAAACKjcFkMpkdXUReLl++rDp16mjJkiXq16+fZfmECRP0008/af369Q6sDgAAoPiU6CttSUlJysrKkqenp9VyT09PnT171kFVAQAAFL8SHdoAAABwVYkObTVr1pSLi4sSExOtlicmJsrLy8tBVQEAABS/Eh3aXF1dFRQUpNjYWKvlsbGxatu2rYOqAgAAKH7lHV1AQUaPHq0nn3xSrVu3Vtu2bfXhhx/qzz//1PDhwx1dGgAAQLEp0VfaJOlf//qXZs6cqTlz5uiee+5RXFycPvvsM9WvX79Y6yjLE/zOnDlTHh4eVv/ceuutlnaz2ayZM2eqWbNmql27toxGow4fPmy1DZPJpJEjR6p+/fqqX7++Ro4cKZPJVNyHUmR27dqlQYMGqXnz5vLw8NCKFSus2otqTA4dOqSQkBDVrl1bzZs31+zZs2U2l9gXvnMoaJzCwsJynFvdunWz6nPp0iVNnDhRjRo1ko+PjwYNGqQ//vjDqs/vv/+ugQMHysfHR40aNdKkSZN0+fJlux/fzZo3b57uu+8++fr6qnHjxho4cKB++uknqz5l/VyyZYzK+nkkSe+//746dOggX19f+fr6qnv37tq0aZOlvayfR1LBY+QM51GJD22SNGLECB08eFBnz57V9u3bdffddxfr/pngV/L399fRo0ct//wztM6fP18LFy7U7Nmz9dVXX8nT01P9+/dXamqqpc+IESP0ww8/KDIyUpGRkfrhhx/05JNPOuJQikR6erpatGihWbNmyc3NLUd7UYxJSkqK+vfvLy8vL3311VeaNWuWFixYoHfeeadYjrEoFDROktS5c2erc2v16tVW7VOnTlV0dLSWLFmi9evXKzU1VQMHDlRWVpYkKSsrSwMHDlRaWprWr1+vJUuWKCoqSs8//7zdj+9m7dy5U48//rg2bdqkqKgolS9fXv369dNff/1l6VPWzyVbxkgq2+eRJPn4+Ojll1/W9u3bFRsbq06dOmnIkCH68ccfJXEeSQWPkVTyz6MSPU9bSdG1a1cFBATo7bfftixr1aqV+vbtqxdffNGBlRWPmTNnKioqSnv27MnRZjab1axZMz3xxBOaMGGCJOnixYvy9/fXq6++quHDh+vo0aNq27atNm7cqHbt2kmS9uzZo+DgYO3fv1/+/v7FejxFrW7dunrjjTc0ZMgQSUU3JkuWLNFLL72kn3/+2RJ45syZow8//FA//fSTDAaDYw74Bl0/TtLV/7I9f/68Vq1ales6ycnJatKkiRYuXKgHH3xQknTq1CkFBgYqMjJSXbt21ZYtW/Tggw/q4MGDqlevniRp1apVGjt2rI4dO6Zq1arZ/+CKSFpamurXr68VK1YoODiYcykX14+RxHmUlwYNGujFF1/UsGHDOI/ycG2Mhg8f7hTnkVNcaXOky5cv68CBA+rSpYvV8i5dumjv3r0Oqqr4nThxQs2aNdPtt9+uxx57TCdOnJAknTx5UgkJCVbj4+bmpg4dOljGZ9++fapSpYrVyyPt2rWTu7t7qRzDohqTffv2qX379lZXqLp27aozZ87o5MmTxXQ09rdnzx41adJErVu31tixY63eFj9w4IAyMzOtxrJevXpq2rSp1Tg1bdrU8hekdHWcLl26pAMHDhTfgRSBtLQ0ZWdny8PDQxLnUm6uH6NrOI/+lpWVpc8//1zp6elq06YN51Eurh+ja0r6eVTiX0RwNCb4le68804tWrRI/v7+OnfunObMmaMePXooLi5OCQkJkpTr+Jw5c0aSdPbsWdWsWdPqv8IMBoNq1apVKsewqMbk7Nmz8vHxybGNa20NGjSw1yEUm27duql3797y8/PTb7/9phkzZqhPnz7atm2bKlasqLNnz8rFxUU1a9a0Wu+f//87e/ZsjrG+Nl2Qs51fU6ZMUWBgoOVfIpxLOV0/RhLn0TWHDh1Sjx49lJGRIXd3d3388ccKCAiwBArOo7zHSHKO84jQhgJ1797d6vedd96poKAgrVy5UnfddZeDqkJpMGDAAMufAwICFBQUpMDAQG3atEl9+vRxYGXF77nnnlNcXJw2btwoFxcXR5dTIuU1RpxHV/n7+2vHjh1KSUnR2rVrFRYWpnXr1jm6rBIlrzFq0aKFU5xH3B4tABP85lSlShU1a9ZM8fHx8vb2lqR8x8fLy0tJSUlWbxiZzWadO3euVI5hUY2Jl5dXrtu41lYa1alTRz4+PoqPj5d09TizsrKUlJRk1e/6sbx+nK5dIXeWcZo6dao+//xzRUVFWV2t4Fz6W15jlJuyeh65urqqUaNGCgoK0osvvqjAwEAtWrSI8+gf8hqj3JTE84jQVgAm+M0pIyNDx44dk7e3t/z8/OTt7W01PhkZGdqzZ49lfNq0aaO0tDTt27fP0mffvn1KT08vlWNYVGPSpk0b7dmzRxkZGZY+sbGxqlOnjvz8/IrpaIpXUlKSzpw5Y/mXTFBQkCpUqGA1ln/88YfloWnp6jgdPXrU6rX72NhYVaxYUUFBQcV7ADdg8uTJljDyz6l0JM6la/Ibo9yUxfMoN9nZ2bp8+TLnUT6ujVFuSuJ55DJlypSXbnorpVzVqlU1c+ZM1a5dW5UqVdKcOXO0e/duvfPOO6pevbqjy7O7adOmydXVVdnZ2frll180ceJExcfH680335SHh4eysrL01ltvqXHjxsrKytLzzz+vhIQEvfXWW6pYsaJq1aqlb775RpGRkQoMDNQff/yh8PBwtWrVymmn/UhLS9ORI0eUkJCgjz76SC1atFC1atV0+fJlVa9evUjGpHHjxvrPf/6jgwcPyt/fX3v27NELL/xfe3cfU3X1B3D8DReRZdBFQIoQaddHIAskxIdUsiKGziUPgj0MFELbcrqxwARH4oC02BwlbVhhRckzasPK5RiY9xrFNFHAaYU8WYjxpGIT+P3B+M7rBUS9Ptyfn9fGBt/zueee79mBfTjnfM/dzD6sg6sAAAvfSURBVPr1600m2R2pn1QqFVu2bOHRRx/l2rVrnDhxgnfeeYfe3l62b9/O2LFjsbKy4vz58+zatQt3d3c6OjrYsGEDNjY2vP/++5ibm+Pq6sr+/fs5dOgQ7u7u1NbWEhsbS0hICEuXLr3fXTCi2NhY9uzZQ3Z2Ns7Ozly6dIlLly4BA/8wmpmZPfRj6WZ91N3d/dCPI4CkpCTl73RTUxOZmZnk5eWRlJSkjJ2HeRzByH3k6OhoEuNIjvwYpV27drFjxw7+/vtvZsyYQUpKyj0/L+5+WbVqFUeOHKGtrQ17e3u8vb3ZtGkT06dPBwam0NPS0sjOzqa9vZ1Zs2bx4Ycf4ubmptTR3t7Ou+++y4EDBwAICAhg27ZtBk+AmYqKioohfwHDw8PJzMw0Wp+cPHmS2NhYqqqqUKvVREZGEhcXZzKP1o/UT+np6bz22mv8/vvvdHR04OjoyPPPP8+mTZv0nry6evUqCQkJFBQU0NPTw4IFC/joo4/0YhoaGoiNjaW8vBwrKytCQkJITk5m7Nix9+Q+b9dw4z8uLo6NGzcCxvv9MtWxdLM+unLlykM/jmDg2JOKigr++ecfbGxscHd3Z926dSxevBiQcQQj95GpjCNJ2oQQQgghTIDsaRNCCCGEMAGStAkhhBBCmABJ2oQQQgghTIAkbUIIIYQQJkCSNiGEEEIIEyBJmxBCCCGECZCkTQghRpCTk4Naraa+vv5+N0UI8ZCTpE0IcVdcuHCBpKQkfH19cXJy4oknnmDu3LkkJSXR0tJyv5t3R/Lz84f9vEJjWbt2LWq1GmdnZ65cuWJQ3tDQgK2tLWq1mtTUVACOHTuGWq1mx44dBvExMTGo1Wo+/vhjg7KoqCgcHBy4fPmy8W9ECGE0krQJIYzu2LFjzJkzh8zMTLy8vEhOTiYlJYW5c+fy5ZdfsmTJkvvdxFELCwvj/PnzuLi4KNcKCgrIzMy86++tUqno6elRTqi/XkFBgcEJ608//TTW1tZotVqDeJ1Oh4WFBTqdbsiymTNn8sgjjxiv8UIIo7O43w0QQvx/6ejo4PXXXwegrKyMGTNm6JUnJiYOORP0oFKpVKhUqvvy3hYWFixcuJD8/HyWL1+uV5afn8/LL7/Mvn37lGsqlQpvb29++eUX+vv7lY8Wamlpob6+ntDQUL0Pu4aBGbvGxkaWLVt2929ICHFHZKZNCGFU2dnZNDY2snXrVoOEDeCxxx5j8+bNys9HjhwhMjISDw8PJkyYwLRp01i3bh3//vuv3utSU1NRq9XU1tYSFRWFi4sLkyZNYv369XR3d+vFlpaWsmLFCtzc3JgwYQIeHh4kJibS09Nj0J4zZ86wevVqJk+ejKOjI15eXsTHxyvlN+5pCwwM5IcffqChoQG1Wq189fX14eHhQVhYmMF7XLt2jSlTphAZGXlrnQkEBwfz008/6fXHyZMnOXXqFCEhIQbxvr6+XLx4kbq6OuXa0aNHsbS0ZM2aNbS2tnLmzBm9MoA5c+bcctuEEPeWzLQJIYzqwIEDWFlZ8eqrr44qvqSkhM7OTiIiInBwcKC6upqvvvqKmpoafvzxR4MPol61ahVOTk4kJiZy4sQJsrOzaWpqIj8/X4nJyclh7NixxMTEYGNjQ2VlJTt37qSpqYnPP/9ciaupqcHf3x9zc3MiIiJwdXXl3LlzFBUVkZaWNmR7Y2Nj6ezspLm5mZSUFOW6ubk5oaGhZGRkcPHiRcaPH6+UHTp0iNbW1iETupsJDAxk/fr17N27l4iICGBgadTZ2XnIRMvX1xcYWPKcPn06AFqtlmeffRZPT09sbGzQarVMnjxZiQNJ2oQwBZK0CSGMqra2lsmTJ2NpaTmq+KSkJIO9VD4+PkRHR6PT6QySCScnJ/Lz85VkztHRke3bt1NWVsaiRYsAyMrK0qszMjISjUbD1q1b2bJlC87OzsBAAtbb20t5eTmurq5KfGJi4rDt9fPzw8nJifb2dlasWKFXFhYWRnp6OkVFRURFRSnX8/LysLe3Z/HixaPqk+uNGzeOgIAA8vLyiIiIoL+/n4KCAoKDgw0SWoDnnnsOCwsLtFqtkuTpdDoWLFiAmZkZPj4+6HQ63njjDWAgoZsyZQp2dna33DYhxL0ly6NCCKPq6urC2tp61PGDyVV/fz+dnZ20tbXh4+MDDDzQcKPo6Gi9ZGXNmjUAfP/99wZ19vX10dHRQVtbG76+vvT393P8+HFg4OnWn3/+mZUrV+olbMCQydBoTJ06lVmzZpGbm6tc6+7uprS0lKCgICwsbu//5ODgYLRaLY2Njeh0OhoaGoZcGoWBe585c6Yyg9bd3U11dTWzZ88GUJI2GNh/WFNTI7NsQpgISdqEEEZlbW1NV1fXqOMbGxtZtWoVLi4uuLi4oNFoeOaZZwDo7Ow0iNdoNHo/29nZoVarOXfunHJtcL/Xk08+yaRJk9BoNAQGBurV+ddffwEMue/uToSHh1NZWcmff/4JwP79+7l8+fJtLY0OevHFF1Gr1RQWFpKfn4+bmxvu7u7Dxvv6+lJfX09LSwu//vorvb29StI2e/Zszp49S2trK5WVlfT19SlLqkKIB5skbUIIo5o2bRpnzpzhv//+u2lsb28vy5cvp6ysjA0bNvD1119TXFxMYWEhMDBTdqs6OjpYunQptbW1JCQk8O2331JSUqKcq3Y7dd6KoKAgLC0tldm2vLw8pk6diqen523XOWbMGJYtW0Zubi579+4ddpZt0PX72rRaLRqNBgcHBwC8vb1RqVRotVrZzyaEiZE9bUIIowoICODo0aOUlJQQGho6YuzJkyc5ffo0O3fuZOXKlcr1s2fPDvuas2fPKpvoAdra2mhvb1fOUauoqKCtrY3du3czf/58Je7Goy6eeuopYOBhBGOytbXF399f2YNWXl7Oe++9d8f1BgcHk52djZmZGUFBQSPGDiZhWq2Wuro6vZm0cePG4eHhgU6n4/jx4zz++ONKXwghHmwy0yaEMKqIiAicnJxISEjQO3ZiUFdXF8nJyQDK+Wf9/f16MRkZGcPWn5WVpRf/6aefAuDv7z9snX19fXzyySd69djZ2TFv3jy++eYbZal00I3tudG4cePo6OgYNi48PJw//viDjRs30tfXd9PkdTTmzZtHQkICaWlpegf9DsXBwQGNRsPhw4f57bfflKXRQT4+PlRUVFBVVSVLo0KYEJlpE0IYlVqtJicnh5CQEBYuXEhwcDBeXl6Ym5tz6tQpCgsLsbW1JTExkalTp6LRaEhISKC5uRlbW1sOHjxIc3PzsPU3NzcTEhKCv78/1dXV7N69mxdeeAE/Pz9gYGlw/PjxrF27lpiYGCwsLNi3b5/BWW4A27ZtIyAggEWLFhEZGYmrqysNDQ0UFRVRVVU1bBs8PT0pKioiPj4eb29vzM3N9Wa/XnrpJezt7SkuLmb+/PlMnDjxDnp0gJmZGbGxsaOO9/X1JScnR/n+xrKsrKwhy4QQDy6ZaRNCGJ2npydarZaYmBgqKyvZtGkT8fHxHD58mIiICEpLS4GBvVp79uzBy8uLjIwMtm7dirW1tbKnbSifffYZarWa5ORkiouLefPNN8nOzlbKbW1tycvLw9nZmdTUVNLT03Fzc1Nm5K7n7u7OwYMHWbBgAV988QVxcXEUFxfzyiuvjHh/q1evJiwsjLy8PN566y1Wr16tVz5mzBglibvxWJB7ZTAZGz9+PFOmTNEru37mTZI2IUyHWXt7+8jrAEII8QBITU3lgw8+oK6uDkdHx/vdnJtKTEwkKyuL06dPY2Njc7+bI4T4PyAzbUIIYWRXr14lNzeXJUuWSMImhDAa2dMmhBBG0traSllZGd999x2tra28/fbbBjEXLlygt7d32DpUKhX29vZ3s5lCCBMlSZsQQhhJbW0t0dHR2Nvbk5KSgpeXl0GMn58fDQ0Nw9YxceJETpw4cTebKYQwUbKnTQgh7iGdTkdPT8+w5VZWVvJwgBBiSJK0CSGEEEKYAHkQQQghhBDCBEjSJoQQQghhAiRpE0IIIYQwAZK0CSGEEEKYAEnahBBCCCFMwP8A67kWNIxJVB0AAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(9,6))\n",
"num_x = len(your_source.where('PRICE' + str(hour), are.below_or_equal_to(price))[1])\n",
"plt.bar(new_x_yours2[:num_x], height_yours_marginal_cost[:num_x], width=width_yours2[:num_x], \n",
" color = energy_colors_dict[YOUR_PORTFOLIO],\n",
" edgecolor = \"black\")\n",
"plt.title(YOUR_PORTFOLIO)\n",
"plt.xlabel('Capacity_MW')\n",
"plt.ylabel('Marginal Cost (total)')\n",
"for new_x_i, height_i, label_i in zip(new_x_yours2[:num_x], height_yours_marginal_cost[:num_x], label_yours[:num_x]):\n",
" plt.text(new_x_i, height_i, label_i,\n",
" ha='center', va='bottom', fontsize=8)\n",
"price_line_plot(price)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can finally calculate profit. The graphic above should show the market price line along with the marginal costs for operating our plants. Thus we can calculate profit by calculating the area between the red line and the blue boxes, as that will give us the total revenue - total cost. The function defined below is designed to perform that calculation."
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"def profit(sorted_table, price, marg_prop, hour):\n",
" capacity_subset = sum(sorted_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"])\n",
" capacity_subset += sum(sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"] * marg_prop)\n",
" revenue = capacity_subset * price\n",
" cost = 0\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.below(price))[\"Var_Cost_USDperMWH\"])):\n",
" cost += sorted_table.where('PRICE' + str(hour), are.below(price))[\"Var_Cost_USDperMWH\"][i]\\\n",
" * sorted_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"][i]\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Var_Cost_USDperMWH\"])):\n",
" cost += sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Var_Cost_USDperMWH\"][i]\\\n",
" * (sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"][i] * marg_prop)\n",
" return revenue - cost\n",
"\n",
"def profit_pab(sorted_table, price, marg_prop, hour):\n",
" revenue = 0\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.below(price))['PRICE' + str(hour)])):\n",
" revenue += sorted_table.where('PRICE' + str(hour), are.below(price))['PRICE' + str(hour)][i]\\\n",
" * sorted_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"][i]\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.equal_to(price))['PRICE' + str(hour)])):\n",
" revenue += sorted_table.where('PRICE' + str(hour), are.equal_to(price))['PRICE' + str(hour)][i]\\\n",
" * (sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"][i] * marg_prop)\n",
" cost = 0\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.below(price))[\"Var_Cost_USDperMWH\"])):\n",
" cost += sorted_table.where('PRICE' + str(hour), are.below(price))[\"Var_Cost_USDperMWH\"][i]\\\n",
" * sorted_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"][i]\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Var_Cost_USDperMWH\"])):\n",
" cost += sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Var_Cost_USDperMWH\"][i]\\\n",
" * (sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"][i] * marg_prop)\n",
" return revenue - cost"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"10768.0"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"profit_pab(your_source, price, marg_proportion, hour)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can now calculate the amount of emissions in the current hour."
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [],
"source": [
"def emissions(sorted_table, price, marg_prop, hour):\n",
" emissions = 0\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.below(price))[\"Var_Cost_USDperMWH\"])):\n",
" emissions += sorted_table.where('PRICE' + str(hour), are.below(price))[\"Carbon_tonsperMWH\"][i]\\\n",
" * sorted_table.where('PRICE' + str(hour), are.below(price))[\"Capacity_MW\"][i]\n",
" for i in range(len(sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Var_Cost_USDperMWH\"])):\n",
" emissions += sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Carbon_tonsperMWH\"][i]\\\n",
" * (sorted_table.where('PRICE' + str(hour), are.equal_to(price))[\"Capacity_MW\"][i] * marg_prop)\n",
" return emissions"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2852.0"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"emissions(your_source, price, marg_proportion, hour)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's calculate a few more things. First, calculate total profits (up through and including the current round)."
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [],
"source": [
"# Load in auction prices.\n",
"auction_results = Table.read_table('auction_results.csv').where(\"world_id\", 'S' + str(section))\n",
"\n",
"def team_profit(portfolio, period):\n",
" # Merge auction results with sorted joined table\n",
" full_table = sorted_joined_table_all.join(\"TEAM\", auction_results, \"team\")\n",
" team_table = full_table.where(\"Group\", portfolio)\n",
" team_profit = -team_table.to_df().loc[0, \"adjustment\"] * 1.05**(period-1)\n",
" for period_i in range(1, (period+1)):\n",
" period_table = full_table.where(\"PERIOD\", period_i)\n",
" period_team_table = team_table.where(\"PERIOD\", period_i)\n",
" \n",
" period_team_profit = -sum(period_team_table[\"FixedCst_OandM_perDay\"])\n",
"\n",
" for hour_i in range(1, 5):\n",
" period_table_sort = period_table.sort(\"PRICE\" + str(hour_i), descending = False)\n",
" period_team_table_sort = period_team_table.sort(\"PRICE\" + str(hour_i), descending = False)\n",
"\n",
" demand_i = demand_table.where(\"round\", period_i).where(\"hour\", hour_i)[\"load\"].item()\n",
" price_i = price_calc(demand_i, period_table_sort, hour_i)\n",
"\n",
" nonmarg_capacity_i = sum(period_table_sort.where('PRICE' + str(hour_i), are.below(price_i))[\"Capacity_MW\"])\n",
" marg_capacity_i = sum(period_table_sort.where('PRICE' + str(hour_i), are.equal_to(price_i))[\"Capacity_MW\"])\n",
" marg_demand_i = demand_i - nonmarg_capacity_i\n",
" marg_proportion_i = marg_demand_i / marg_capacity_i\n",
"\n",
" if period_i in pab_periods:\n",
" period_team_profit += profit_pab(period_team_table_sort, price_i, marg_proportion_i, hour_i)\n",
" else:\n",
" period_team_profit += profit(period_team_table_sort, price_i, marg_proportion_i, hour_i)\n",
" \n",
" team_profit += period_team_profit * 1.05**(period-period_i)\n",
" if period_i == period:\n",
" team_profit_today = period_team_profit\n",
" \n",
" output_df = pd.DataFrame.from_dict({\"Current Round: \":team_profit_today, \"Total: \":team_profit}, orient = 'index', columns = [portfolio + ' Profit']).round().astype(int)\n",
" \n",
" return output_df"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" Big Coal Emissions\n",
"Current Round: 11408\n",
"Rounds 4 - Current: 0\n",
"Expected Rounds 4-6 30678"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"total_emissions(YOUR_PORTFOLIO, period)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We now have the ability to estimate the amount of profit our plants will generate based on a given amount of demand! Again, this does not include considerations of credit or carbon emmissions, but it should give you a general sens of how your plants performed for this hour. Try going back to the start of the notebook and changing the hour you are examining, or add more cells to do a deeper analysis of your performance on your own to make better decisions for your team in the future."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Conclusion and Resources"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Congratulations! You have completed your Jupyter Notebook for the ESG. If you have questions, please do not hesitate to post them on the dedicated Piazza thread (https://piazza.com/class/jr2lknh4q311x1?cid=41)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Module Developers: Alec Kan, Alma Pineda, Aarish Irfan, Elaine Chien, and Octavian Sima.\n",
"\n",
"Data Science Modules: http://data.berkeley.edu/education/modules"
]
}
],
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}