Skip to content

Commit

Permalink
EODC
Browse files Browse the repository at this point in the history
  • Loading branch information
romainsacchi committed Dec 6, 2023
1 parent acb9b3c commit 8a50baa
Show file tree
Hide file tree
Showing 6 changed files with 2,804 additions and 580 deletions.
133 changes: 64 additions & 69 deletions dev/Untitled.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 1,
"id": "efda341f-e317-4b8a-9869-880d232fdba4",
"metadata": {
"tags": []
Expand All @@ -12,7 +12,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"0.9.4 /opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/constructive_geometries/__init__.py\n"
"0.9.4 /opt/homebrew/Caskroom/miniforge/base/envs/premise_test/lib/python3.10/site-packages/constructive_geometries/__init__.py\n"
]
}
],
Expand All @@ -23,7 +23,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 2,
"id": "dd20bad3-930e-4041-b47b-cd550ea6a847",
"metadata": {
"tags": []
Expand All @@ -33,7 +33,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"/opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/wurst/__init__.py\n",
"/opt/homebrew/Caskroom/miniforge/base/envs/premise_test/lib/python3.10/site-packages/wurst/__init__.py\n",
"(0, 4)\n"
]
}
Expand All @@ -46,7 +46,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 3,
"id": "adc8fc9c-fe9a-4d61-9013-ee7461bde1d8",
"metadata": {
"tags": []
Expand All @@ -56,7 +56,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"/Users/romain/GitHub/premise/premise/__init__.py\n"
"/opt/homebrew/Caskroom/miniforge/base/envs/premise_test/lib/python3.10/site-packages/premise/__init__.py\n"
]
}
],
Expand All @@ -67,7 +67,7 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 4,
"id": "f8e0a4cb-a226-4ab7-a093-015ea48749d0",
"metadata": {
"tags": []
Expand Down Expand Up @@ -137,7 +137,7 @@
"scenarios = [\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-Base\", \"year\": 2030},\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-Base\", \"year\": 2040},\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-Base\", \"year\": 2050},\n",
" {\"model\": \"remind\", \"pathway\": \"SSP2-Base\", \"year\": 2050},\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-PkBudg1150\", \"year\": 2030},\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-PkBudg1150\", \"year\": 2040},\n",
" #{\"model\": \"remind\", \"pathway\": \"SSP2-PkBudg1150\", \"year\": 2050},\n",
Expand All @@ -152,14 +152,14 @@
" use_multiprocessing=False,\n",
" keep_uncertainty_data=True,\n",
" use_absolute_efficiency=True,\n",
" #external_scenarios=[ep2050,],\n",
" external_scenarios=[ep2050,],\n",
" \n",
")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 5,
"id": "c7996c75-e3e7-42ba-9ecb-c016b6462109",
"metadata": {
"tags": []
Expand All @@ -169,34 +169,42 @@
"name": "stdout",
"output_type": "stream",
"text": [
"`update_all()` will skip the following steps:\n",
"update_two_wheelers(), update_cars(), and update_buses()\n",
"If you want to update these steps, please run them separately afterwards.\n",
"Extracted 1 worksheets in 5.84 seconds\n",
"Migrating to 3.8 first\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Anomalies found: check the change report.\n",
"Done!\n",
"Done!\n",
"Extracted 1 worksheets in 5.59 seconds\n",
"Migrating to 3.8 first\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Applying strategy: migrate_datasets\n",
"Applying strategy: migrate_exchanges\n",
"Anomalies found: check the change report.\n",
"Done!\n",
"Done!\n",
"\n",
"//////////////// IMPORTING USER-DEFINED INVENTORIES ////////////////\n",
"Downloading datapackage from https://raw.githubusercontent.com/premise-community-scenarios/energy-perspective-2050-switzerland/main/inventories/lci-EP2050.csv\n",
"Extracted 1 worksheets in 0.00 seconds\n",
"Create custom markets.\n",
"\n",
"///////////////////////////// BIOMASS //////////////////////////////\n",
"BRA 0.3267164035321399 1.0 0.3267164035321399\n",
"CAN 0.8894289591305132 1.0 0.8894289591305132\n",
"CEU 0.8347346684520569 1.0 0.8347346684520569\n",
"CHN 0.8726509017280399 1.0 0.8726509017280399\n",
"EAF 0.18289682194195786 1.0 0.18289682194195786\n",
"INDIA 0.603063612728477 1.0 0.603063612728477\n",
"INDO 0.7577939984238399 1.0 0.7577939984238399\n",
"JAP 1.0 1.0 1.0\n",
"KOR 1.0 1.0 1.0\n",
"ME 0.9885082384952414 1.0 0.9885082384952414\n",
"MEX 0.14733726544664089 1.0 0.14733726544664089\n",
"NAF 0.8697871023640537 1.0 0.8697871023640537\n",
"OCE 0.19905139103299702 1.0 0.19905139103299702\n",
"RCAM 0.37079901424256695 1.0 0.37079901424256695\n",
"RSAF 0.10956547062630378 1.0 0.10956547062630378\n",
"RSAM 0.467321306480509 1.0 0.467321306480509\n",
"RSAS 0.848155047834036 1.0 0.848155047834036\n",
"RUS 0.8426607709630158 0.9999999999999999 0.8426607709630158\n",
"SAF 0.12908879651669708 1.0 0.12908879651669708\n",
"SEAS 0.7256001821232322 1.0 0.7256001821232322\n",
"STAN 0.16773021650930917 1.0 0.16773021650930917\n",
"TUR 0.04240196331769841 0.9999999999999999 0.04240196331769841\n",
"UKR 0.3825053056161494 1.0 0.3825053056161494\n",
"USA 0.8225556355209556 1.0 0.8225556355209556\n",
"WAF 0.704455440490909 1.0000000000000002 0.704455440490909\n",
"WEU 0.8810574587274471 0.9999999999999999 0.8810574587274471\n",
"//////////////// IMPORTING USER-DEFINED INVENTORIES ////////////////\n",
"Downloading datapackage from https://raw.githubusercontent.com/premise-community-scenarios/energy-perspective-2050-switzerland/main/inventories/lci-EP2050.csv\n",
"Extracted 1 worksheets in 0.00 seconds\n",
"Create custom markets.\n",
"Log file of exchanges saved under /opt/homebrew/Caskroom/miniforge/base/envs/premise_test/lib/python3.10/site-packages/premise/data/logs.\n",
"Done!\n",
"\n"
]
Expand All @@ -205,8 +213,8 @@
"source": [
"#ndb.update_external_scenario()\n",
"#ndb.update_dac()\n",
"#ndb.update_all()\n",
"ndb.update_biomass()\n",
"ndb.update_all()\n",
"#ndb.update_biomass()\n",
"#ndb.update_electricity()\n",
"#ndb.update_cement()\n",
"#ndb.update_steel()\n",
Expand All @@ -223,7 +231,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 6,
"id": "f24675ba-05d9-46ee-a2db-b7d6e18e3fe9",
"metadata": {
"tags": []
Expand All @@ -235,7 +243,8 @@
"text": [
"Write new database(s) to Brightway.\n",
"Running all checks...\n",
"Database test12 already exists: it will be overwritten.\n",
"Running all checks...\n",
"Database ecoinvent_cutoff_3.9_remind_SSP2-Base_2050 already exists: it will be overwritten.\n",
"Vacuuming database \n"
]
},
Expand All @@ -245,48 +254,34 @@
"text": [
"Writing activities to SQLite3 database:\n",
"0% [##############################] 100% | ETA: 00:00:00\n",
"Total time elapsed: 00:00:40\n"
"Total time elapsed: 00:00:36\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Title: Writing activities to SQLite3 database:\n",
" Started: 12/03/2023 13:08:43\n",
" Finished: 12/03/2023 13:09:24\n",
" Total time elapsed: 00:00:40\n",
" CPU %: 95.70\n",
" Memory %: 18.06\n",
"Created database: test12\n",
"Generate scenario report.\n",
"Report saved under /Users/romain/GitHub/premise/dev/export/scenario_report.\n",
"Generate change report.\n"
" Started: 12/03/2023 14:46:08\n",
" Finished: 12/03/2023 14:46:45\n",
" Total time elapsed: 00:00:36\n",
" CPU %: 95.60\n",
" Memory %: 15.26\n",
"Created database: ecoinvent_cutoff_3.9_remind_SSP2-Base_2050\n"
]
},
{
"ename": "ValueError",
"evalue": "Length mismatch: Expected axis has 25 elements, new values have 24 elements",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mndb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwrite_db_to_brightway\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mtest12\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/GitHub/premise/premise/ecoinvent_modification.py:1478\u001b[0m, in \u001b[0;36mNewDatabase.write_db_to_brightway\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 1476\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgenerate_scenario_report()\n\u001b[1;32m 1477\u001b[0m \u001b[38;5;66;03m# generate change report from logs\u001b[39;00m\n\u001b[0;32m-> 1478\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate_change_report\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/GitHub/premise/premise/ecoinvent_modification.py:1674\u001b[0m, in \u001b[0;36mNewDatabase.generate_change_report\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1669\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1670\u001b[0m \u001b[38;5;124;03mGenerate a report of the changes between the original database and the scenarios.\u001b[39;00m\n\u001b[1;32m 1671\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 1673\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGenerate change report.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 1674\u001b[0m \u001b[43mgenerate_change_report\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1675\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mversion\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msource_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msystem_model\u001b[49m\n\u001b[1;32m 1676\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1677\u001b[0m \u001b[38;5;66;03m# saved under working directory\u001b[39;00m\n\u001b[1;32m 1678\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mReport saved under \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mos\u001b[38;5;241m.\u001b[39mgetcwd()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"File \u001b[0;32m~/GitHub/premise/premise/report.py:486\u001b[0m, in \u001b[0;36mgenerate_change_report\u001b[0;34m(source, version, source_type, system_model)\u001b[0m\n\u001b[1;32m 483\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m os\u001b[38;5;241m.\u001b[39mstat(fp)\u001b[38;5;241m.\u001b[39mst_size \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 484\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m--> 486\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mconvert_log_to_excel_file\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 488\u001b[0m \u001b[38;5;66;03m# create a worksheet for this sector\u001b[39;00m\n\u001b[1;32m 489\u001b[0m worksheet \u001b[38;5;241m=\u001b[39m workbook\u001b[38;5;241m.\u001b[39mcreate_sheet(fetch_tab_name(filepath))\n",
"File \u001b[0;32m~/GitHub/premise/premise/report.py:550\u001b[0m, in \u001b[0;36mconvert_log_to_excel_file\u001b[0;34m(filepath)\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 549\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(filepath, sep\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m|\u001b[39m\u001b[38;5;124m\"\u001b[39m, header\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, on_bad_lines\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mskip\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 550\u001b[0m \u001b[43mdf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m \u001b[38;5;241m=\u001b[39m fetch_columns(filepath)\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m df\n\u001b[1;32m 553\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m EmptyDataError:\n\u001b[1;32m 554\u001b[0m \u001b[38;5;66;03m# return an empty dataframe\u001b[39;00m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/pandas/core/generic.py:6218\u001b[0m, in \u001b[0;36mNDFrame.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 6216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 6217\u001b[0m \u001b[38;5;28mobject\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__getattribute__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name)\n\u001b[0;32m-> 6218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mobject\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__setattr__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6219\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[1;32m 6220\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n",
"File \u001b[0;32mproperties.pyx:69\u001b[0m, in \u001b[0;36mpandas._libs.properties.AxisProperty.__set__\u001b[0;34m()\u001b[0m\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/pandas/core/generic.py:767\u001b[0m, in \u001b[0;36mNDFrame._set_axis\u001b[0;34m(self, axis, labels)\u001b[0m\n\u001b[1;32m 762\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 763\u001b[0m \u001b[38;5;124;03mThis is called from the cython code when we set the `index` attribute\u001b[39;00m\n\u001b[1;32m 764\u001b[0m \u001b[38;5;124;03mdirectly, e.g. `series.index = [1, 2, 3]`.\u001b[39;00m\n\u001b[1;32m 765\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 766\u001b[0m labels \u001b[38;5;241m=\u001b[39m ensure_index(labels)\n\u001b[0;32m--> 767\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_mgr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_axis\u001b[49m\u001b[43m(\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlabels\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 768\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_clear_item_cache()\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/pandas/core/internals/managers.py:227\u001b[0m, in \u001b[0;36mBaseBlockManager.set_axis\u001b[0;34m(self, axis, new_labels)\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mset_axis\u001b[39m(\u001b[38;5;28mself\u001b[39m, axis: AxisInt, new_labels: Index) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# Caller is responsible for ensuring we have an Index object.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_validate_set_axis\u001b[49m\u001b[43m(\u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnew_labels\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 228\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxes[axis] \u001b[38;5;241m=\u001b[39m new_labels\n",
"File \u001b[0;32m/opt/homebrew/Caskroom/miniforge/base/envs/premise_env/lib/python3.10/site-packages/pandas/core/internals/base.py:85\u001b[0m, in \u001b[0;36mDataManager._validate_set_axis\u001b[0;34m(self, axis, new_labels)\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m new_len \u001b[38;5;241m!=\u001b[39m old_len:\n\u001b[0;32m---> 85\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 86\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLength mismatch: Expected axis has \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mold_len\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m elements, new \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mvalues have \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnew_len\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m elements\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 88\u001b[0m )\n",
"\u001b[0;31mValueError\u001b[0m: Length mismatch: Expected axis has 25 elements, new values have 24 elements"
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"KeyboardInterrupt\n",
"\n"
]
}
],
"source": [
"ndb.write_db_to_brightway(\"test12\")"
"ndb.write_db_to_brightway()"
]
},
{
Expand Down
2 changes: 1 addition & 1 deletion dev/Untitled1.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -2383,7 +2383,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.0"
"version": "3.10.13"
}
},
"nbformat": 4,
Expand Down
Loading

0 comments on commit 8a50baa

Please sign in to comment.