diff --git a/energy-leaflet-cytoscape-visualizer/app.py b/energy-leaflet-cytoscape-visualizer/app.py
new file mode 100644
index 0000000..ed15488
--- /dev/null
+++ b/energy-leaflet-cytoscape-visualizer/app.py
@@ -0,0 +1,756 @@
+"""Dash Cytoscape + Leaflet + Context Menu demo for designing a BT (low-voltage)
+distribution network. UI chrome is built entirely with Dash Mantine Components.
+
+Left panel : search a transformer, toggle labels, pick a tree layout.
+Center map : the network overlaid on a real OpenStreetMap basemap (CyLeaflet),
+ right-click a node/edge to edit the topology (context menu).
+Right panel : the same network as a clean dagre tree.
+Bottom-left : selection info (updates the chart as soon as a node/edge is clicked).
+Bottom-right : time-series of the aggregated downstream load (kVA).
+"""
+import copy
+import math
+import time
+
+import dash
+import dash_cytoscape as cyto
+import dash_mantine_components as dmc
+import plotly.graph_objects as go
+from dash import Input, Output, State, callback_context, dcc, no_update
+from dash.exceptions import PreventUpdate
+
+import data as netdata
+
+cyto.load_extra_layouts()
+dmc.add_figure_templates()
+
+NETWORK = netdata.build_network()
+PR_IDS = netdata.all_pr_ids(NETWORK)
+LOAD_DF = netdata.build_load_curves(PR_IDS)
+
+DEFAULT_TRANSFO = next(iter(NETWORK))
+
+MAP_ID = "network-map"
+MAP_CY_ID = {"id": MAP_ID, "component": "cyleaflet", "sub": "cy"}
+
+CONTEXT_MENU_ITEMS = [
+ {
+ "id": "add-node",
+ "label": "Add Node",
+ "tooltipText": "Add a new node here",
+ "availableOn": ["canvas"],
+ },
+ {
+ "id": "remove-edge",
+ "label": "Remove Edge",
+ "tooltipText": "Remove this edge",
+ "availableOn": ["edge"],
+ },
+ {
+ "id": "revert-edge",
+ "label": "Revert Edge",
+ "tooltipText": "Reverse the direction of this edge",
+ "availableOn": ["edge"],
+ },
+ {
+ "id": "split-edge",
+ "label": "Split Edge",
+ "tooltipText": "Insert a node in the middle of this edge",
+ "availableOn": ["edge"],
+ },
+ {
+ "id": "link-nodes",
+ "label": "Link to selected node",
+ "tooltipText": "Draw an edge between the last selected node and this node",
+ "availableOn": ["node"],
+ },
+]
+
+CONVERSION_FACTOR = 20037508.34
+
+
+def xy_to_lonlat(x, y):
+ lon = x * 180.0 / CONVERSION_FACTOR
+ lat = 90.0 - math.atan(math.exp(-y * math.pi / CONVERSION_FACTOR)) * 360.0 / math.pi
+ return lon, lat
+
+
+def build_stylesheet(show_labels):
+ label_style = {"label": "data(label)", "font-size": 8, "text-wrap": "wrap"} if show_labels else {"label": ""}
+ return [
+ {
+ "selector": "node",
+ "style": {
+ **label_style,
+ "text-valign": "top",
+ "text-margin-y": -6,
+ },
+ },
+ {
+ "selector": 'node[kind = "transfo"]',
+ "style": {
+ "shape": "triangle",
+ "background-color": "#e03131",
+ "width": 22,
+ "height": 22,
+ },
+ },
+ {
+ "selector": 'node[kind = "pole"]',
+ "style": {
+ "shape": "ellipse",
+ "background-color": "#868e96",
+ "width": 14,
+ "height": 14,
+ },
+ },
+ {
+ "selector": 'node[kind = "pr"]',
+ "style": {
+ "shape": "rectangle",
+ "background-color": "#ffffff",
+ "border-color": "#495057",
+ "border-width": 2,
+ "width": 14,
+ "height": 14,
+ },
+ },
+ {
+ "selector": "node:selected",
+ "style": {"border-color": "#4263eb", "border-width": 3},
+ },
+ {
+ "selector": 'node[kind = "boundary"]',
+ "style": {"opacity": 0, "width": 1, "height": 1, "events": "no"},
+ },
+ {
+ "selector": "edge",
+ "style": {
+ "width": 3,
+ "line-color": "#f59f00",
+ "target-arrow-color": "#f59f00",
+ "target-arrow-shape": "triangle",
+ "curve-style": "straight",
+ },
+ },
+ {
+ "selector": "edge:selected",
+ "style": {"line-color": "#4263eb", "target-arrow-color": "#4263eb"},
+ },
+ ]
+
+
+def elements_index(elements):
+ nodes, edges = {}, {}
+ for el in elements:
+ d = el["data"]
+ if "source" in d:
+ edges[d["id"]] = el
+ else:
+ nodes[d["id"]] = el
+ return nodes, edges
+
+
+def downstream_pr_ids(elements, start_id):
+ if not start_id:
+ return []
+ nodes, edges = elements_index(elements)
+ adjacency = {}
+ for e in edges.values():
+ adjacency.setdefault(e["data"]["source"], []).append(e["data"]["target"])
+
+ result, seen, stack = [], set(), [start_id]
+ while stack:
+ cur = stack.pop()
+ if cur in seen:
+ continue
+ seen.add(cur)
+ node = nodes.get(cur)
+ if node is not None:
+ d = node["data"]
+ if d.get("kind") == "pr" or d.get("also_pr"):
+ result.append(cur)
+ for nxt in adjacency.get(cur, []):
+ stack.append(nxt)
+ return sorted(set(result))
+
+
+def apply_context_menu_action(menu_item_id, ctx, elements, last_node_id):
+ """Return updated elements, or None if nothing changed."""
+ elements = copy.deepcopy(elements)
+ nodes, edges = elements_index(elements)
+
+ if menu_item_id == "add-node":
+ lon, lat = xy_to_lonlat(ctx["x"], ctx["y"])
+ new_id = "N" + str(int(time.time() * 1000))[-8:]
+ elements.append(
+ {"data": {"id": new_id, "label": new_id, "kind": "pole", "lat": lat, "lon": lon}}
+ )
+ return elements
+
+ if menu_item_id == "remove-edge":
+ eid = ctx["elementId"]
+ return [e for e in elements if e["data"]["id"] != eid]
+
+ if menu_item_id == "revert-edge":
+ eid = ctx["elementId"]
+ for e in elements:
+ if e["data"]["id"] == eid:
+ e["data"]["source"], e["data"]["target"] = (
+ e["data"]["target"],
+ e["data"]["source"],
+ )
+ return elements
+
+ if menu_item_id == "split-edge":
+ eid, src, tgt = ctx["elementId"], ctx["edgeSource"], ctx["edgeTarget"]
+ src_node, tgt_node = nodes.get(src), nodes.get(tgt)
+ if src_node is None or tgt_node is None:
+ return None
+ mid_lat = (src_node["data"]["lat"] + tgt_node["data"]["lat"]) / 2
+ mid_lon = (src_node["data"]["lon"] + tgt_node["data"]["lon"]) / 2
+ new_id = "N" + str(int(time.time() * 1000))[-8:]
+ elements = [e for e in elements if e["data"]["id"] != eid]
+ elements.append(
+ {"data": {"id": new_id, "label": new_id, "kind": "pole", "lat": mid_lat, "lon": mid_lon}}
+ )
+ elements.append(
+ {"data": {"id": f"e-{src}-{new_id}", "source": src, "target": new_id, "kind": "conductor"}}
+ )
+ elements.append(
+ {"data": {"id": f"e-{new_id}-{tgt}", "source": new_id, "target": tgt, "kind": "conductor"}}
+ )
+ return elements
+
+ if menu_item_id == "connect-node-edge":
+ src = ctx["edgeSource"]
+ if not last_node_id or last_node_id not in nodes or last_node_id == src:
+ return None
+ new_edge_id = f"e-{last_node_id}-{src}-link"
+ if new_edge_id in edges:
+ return None
+ elements.append(
+ {"data": {"id": new_edge_id, "source": last_node_id, "target": src, "kind": "conductor"}}
+ )
+ return elements
+
+ if menu_item_id == "link-nodes":
+ tgt = ctx["elementId"]
+ if not last_node_id or last_node_id not in nodes or last_node_id == tgt or tgt not in nodes:
+ return None
+ new_edge_id = f"e-{last_node_id}-{tgt}-link"
+ if new_edge_id in edges:
+ return None
+ elements.append(
+ {"data": {"id": new_edge_id, "source": last_node_id, "target": tgt, "kind": "conductor"}}
+ )
+ return elements
+
+ return None
+
+
+MAP_ZOOM_OUT_PAD = 0.6 # fraction of the network's own lat/lon span added as margin
+MIN_PAD_DEG = 0.0008 # floor so a tiny/single-node network still gets some margin
+
+
+def with_map_padding(elements):
+ """Append two invisible nodes that widen the auto-fit bounding box, so the
+ CyLeaflet map shows some margin around the network instead of a tight crop."""
+ lats = [e["data"]["lat"] for e in elements if "source" not in e["data"] and "lat" in e["data"]]
+ lons = [e["data"]["lon"] for e in elements if "source" not in e["data"] and "lon" in e["data"]]
+ if not lats:
+ return elements
+ pad_lat = max((max(lats) - min(lats)) * MAP_ZOOM_OUT_PAD, MIN_PAD_DEG)
+ pad_lon = max((max(lons) - min(lons)) * MAP_ZOOM_OUT_PAD, MIN_PAD_DEG)
+ padding_nodes = [
+ {
+ "data": {
+ "id": "__pad_nw",
+ "kind": "boundary",
+ "lat": max(lats) + pad_lat,
+ "lon": min(lons) - pad_lon,
+ }
+ },
+ {
+ "data": {
+ "id": "__pad_se",
+ "kind": "boundary",
+ "lat": min(lats) - pad_lat,
+ "lon": max(lons) + pad_lon,
+ }
+ },
+ ]
+ return elements + padding_nodes
+
+
+def make_cy_leaflet(elements, show_labels):
+ return cyto.CyLeaflet(
+ id=MAP_ID,
+ cytoscape_props={
+ "elements": with_map_padding(elements),
+ "stylesheet": build_stylesheet(show_labels),
+ "contextMenu": CONTEXT_MENU_ITEMS,
+ "boxSelectionEnabled": False,
+ },
+ tiles=cyto.CyLeaflet.OSM,
+ width="100%",
+ height="100%",
+ )
+
+
+LAYOUT_OPTIONS = [
+ {"label": "Dagre (tree)", "value": "dagre"},
+ {"label": "Breadthfirst", "value": "breadthfirst"},
+ {"label": "Cose (force)", "value": "cose"},
+ {"label": "Circle", "value": "circle"},
+]
+
+PAPER_PROPS = dict(shadow="sm", radius="lg", withBorder=True)
+PAPER_BG = {"backgroundColor": "white"}
+
+app = dash.Dash(__name__)
+app.title = "LV Network - Cytoscape / Leaflet"
+server = app.server
+
+
+def section_label(text):
+ return dmc.Text(text, size="xs", fw=700, tt="uppercase", c="dimmed", lts="0.03em")
+
+
+control_panel = dmc.Paper(
+ **PAPER_PROPS,
+ p="md",
+ style={**PAPER_BG, "height": "100%", "flex": "0 0 300px", "overflowY": "auto"},
+ children=dmc.Stack(
+ gap="sm",
+ children=[
+ section_label("Control panel"),
+ dmc.Select(
+ id="transfo-search",
+ data=[
+ {
+ "label": tid
+ if not netdata.TRANSFO_META[tid].get("note")
+ else f"{tid} -> {netdata.TRANSFO_META[tid]['note']}",
+ "value": tid,
+ }
+ for tid in NETWORK
+ ],
+ value=DEFAULT_TRANSFO,
+ placeholder="Search transformer...",
+ leftSection=dmc.Text("🔍", size="sm"),
+ searchable=True,
+ allowDeselect=False,
+ radius="md",
+ ),
+ dmc.Divider(),
+ dmc.Stack(
+ gap=6,
+ children=[
+ section_label("Selected transformer"),
+ dmc.Badge(
+ DEFAULT_TRANSFO,
+ id="selected-transfo-display",
+ variant="light",
+ color="indigo",
+ size="lg",
+ radius="sm",
+ ),
+ ],
+ ),
+ dmc.Divider(),
+ dmc.Switch(id="show-labels", label="Show node labels", checked=True, color="indigo"),
+ dmc.Divider(),
+ dmc.Stack(
+ gap=6,
+ children=[
+ section_label("Tree layout"),
+ dmc.Select(
+ id="layout-dropdown",
+ data=LAYOUT_OPTIONS,
+ value="dagre",
+ allowDeselect=False,
+ radius="md",
+ ),
+ ],
+ ),
+ dmc.Paper(
+ id="edit-edge-panel",
+ withBorder=True,
+ radius="md",
+ p="sm",
+ style={"display": "none", "backgroundColor": "#f8f9fc"},
+ children=dmc.Stack(
+ gap="xs",
+ children=[
+ dmc.Text("Edit edge", fw=700, size="sm"),
+ dmc.NumberInput(id="edit-edge-length", label="Length (m)", min=0, radius="md"),
+ dmc.Select(
+ id="edit-edge-conductor",
+ label="Conductor type",
+ data=netdata.CONDUCTOR_TYPES,
+ radius="md",
+ ),
+ dmc.Group(
+ grow=True,
+ gap="xs",
+ children=[
+ dmc.Button("Apply", id="edit-edge-apply", n_clicks=0, color="indigo", size="xs"),
+ dmc.Button("Cancel", id="edit-edge-cancel", n_clicks=0, variant="default", size="xs"),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+)
+
+map_panel = dmc.Paper(
+ **PAPER_PROPS,
+ style={**PAPER_BG, "height": "100%", "flex": "1 1 0%", "position": "relative", "overflow": "hidden"},
+ children=[
+ dmc.Box(id="map-container", style={"height": "100%", "width": "100%"}, children=[
+ make_cy_leaflet(NETWORK[DEFAULT_TRANSFO], False)
+ ]),
+ ],
+)
+
+tree_panel = dmc.Paper(
+ **PAPER_PROPS,
+ style={**PAPER_BG, "height": "100%", "flex": "1 1 0%", "position": "relative", "overflow": "hidden"},
+ children=[
+ cyto.Cytoscape(
+ id="tree-view",
+ elements=NETWORK[DEFAULT_TRANSFO],
+ layout={"name": "dagre"},
+ stylesheet=build_stylesheet(False),
+ style={"width": "100%", "height": "100%"},
+ ),
+ ],
+)
+
+info_panel = dmc.Paper(
+ **PAPER_PROPS,
+ p="md",
+ style={**PAPER_BG, "height": "100%", "flex": "0 0 320px", "overflowY": "auto"},
+ children=dmc.Stack(
+ gap="sm",
+ children=[
+ section_label("Downstream load lookup"),
+ dmc.Text(
+ "Select a node or a conductor on the map or the tree view to see the "
+ "downstream load.",
+ size="sm",
+ c="dimmed",
+ ),
+ dmc.Divider(),
+ dmc.Group(
+ justify="space-between",
+ children=[
+ dmc.Text("Current selection", size="sm", fw=600),
+ dmc.Badge("-", id="current-selection", variant="light", color="gray"),
+ ],
+ ),
+ dmc.Stack(
+ gap=6,
+ children=[
+ dmc.Text("Downstream connection points (PR)", size="sm", fw=600),
+ dmc.Group(id="downstream-pr-display", gap=6),
+ ],
+ ),
+ dmc.Divider(),
+ dmc.Stack(
+ gap=0,
+ children=[
+ dmc.Text("Peak load", size="xs", c="dimmed", tt="uppercase", fw=700),
+ dmc.Text("-", id="peak-display", fz=28, fw=800, c="indigo"),
+ ],
+ ),
+ ],
+ ),
+)
+
+chart_panel = dmc.Paper(
+ **PAPER_PROPS,
+ p="md",
+ style={**PAPER_BG, "height": "100%", "flex": "1 1 0%"},
+ children=dmc.Stack(
+ gap="xs",
+ style={"height": "100%"},
+ children=[
+ section_label("Downstream load (kVA)"),
+ dcc.Graph(
+ id="load-chart",
+ style={"flex": "1 1 auto", "minHeight": 0},
+ config={"displayModeBar": False},
+ ),
+ ],
+ ),
+)
+
+app.layout = dmc.MantineProvider(
+ theme={
+ "primaryColor": "indigo",
+ "defaultRadius": "md",
+ "fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif",
+ },
+ children=dmc.Box(
+ style={
+ "height": "100vh",
+ "backgroundColor": "#eef1f8",
+ "display": "flex",
+ "flexDirection": "column",
+ "overflow": "hidden",
+ },
+ children=[
+ dmc.Box(
+ style={
+ "background": "linear-gradient(135deg, #1e1b4b 0%, #4338ca 100%)",
+ "padding": "12px 28px",
+ "flex": "0 0 auto",
+ },
+ children=dmc.Stack(
+ gap=0,
+ children=[
+ dmc.Title("LV Network Studio", order=3, c="white"),
+ dmc.Text(
+ "Cytoscape + Leaflet context-menu network editor",
+ size="xs",
+ c="indigo.1",
+ ),
+ ],
+ ),
+ ),
+ dmc.Box(
+ style={
+ "flex": "1 1 auto",
+ "display": "flex",
+ "flexDirection": "column",
+ "gap": "12px",
+ "padding": "12px 20px",
+ "minHeight": 0,
+ },
+ children=[
+ dmc.Box(
+ style={"flex": "3 1 0%", "display": "flex", "gap": "12px", "minHeight": 0},
+ children=[control_panel, map_panel, tree_panel],
+ ),
+ dmc.Box(
+ style={"flex": "2 1 0%", "display": "flex", "gap": "12px", "minHeight": 0},
+ children=[info_panel, chart_panel],
+ ),
+ ],
+ ),
+ dcc.Store(id="network-elements", data=NETWORK[DEFAULT_TRANSFO]),
+ dcc.Store(id="selected-transfo", data=DEFAULT_TRANSFO),
+ dcc.Store(id="last-tapped-node", data=DEFAULT_TRANSFO),
+ dcc.Store(id="current-selection-store", data={"id": DEFAULT_TRANSFO, "kind": "node"}),
+ dcc.Store(id="downstream-pr-store", data=[]),
+ dcc.Store(id="edit-edge-target"),
+ ],
+ ),
+)
+
+
+# ---------------------------------------------------------------------------
+# Transformer search
+# ---------------------------------------------------------------------------
+@app.callback(
+ Output("selected-transfo", "data"),
+ Output("network-elements", "data", allow_duplicate=True),
+ Output("selected-transfo-display", "children"),
+ Output("current-selection-store", "data", allow_duplicate=True),
+ Input("transfo-search", "value"),
+ prevent_initial_call=True,
+)
+def pick_transfo(tid):
+ if not tid or tid not in NETWORK:
+ raise PreventUpdate
+ return tid, NETWORK[tid], tid, {"id": tid, "kind": "node"}
+
+
+# ---------------------------------------------------------------------------
+# Render the map (CyLeaflet) and the tree view whenever the data changes
+# ---------------------------------------------------------------------------
+@app.callback(
+ Output("map-container", "children"),
+ Input("network-elements", "data"),
+ Input("show-labels", "checked"),
+)
+def render_map(elements, show_labels):
+ return make_cy_leaflet(elements or [], bool(show_labels))
+
+
+@app.callback(
+ Output("tree-view", "elements"),
+ Output("tree-view", "stylesheet"),
+ Output("tree-view", "layout"),
+ Input("network-elements", "data"),
+ Input("show-labels", "checked"),
+ Input("layout-dropdown", "value"),
+)
+def render_tree(elements, show_labels, layout_name):
+ layout = {"name": layout_name or "dagre", "animate": True}
+ if layout_name == "dagre":
+ layout["rankDir"] = "TB"
+ return elements or [], build_stylesheet(bool(show_labels)), layout
+
+
+# ---------------------------------------------------------------------------
+# Context menu (add/remove/revert/edit/split/connect/link)
+# ---------------------------------------------------------------------------
+@app.callback(
+ Output("network-elements", "data", allow_duplicate=True),
+ Output("edit-edge-panel", "style"),
+ Output("edit-edge-target", "data"),
+ Output("edit-edge-length", "value"),
+ Output("edit-edge-conductor", "value"),
+ Input(MAP_CY_ID, "contextMenuData"),
+ State("network-elements", "data"),
+ State("last-tapped-node", "data"),
+ prevent_initial_call=True,
+)
+def handle_context_menu(ctx, elements, last_node_id):
+ if not ctx:
+ raise PreventUpdate
+
+ if ctx["menuItemId"] == "edit-edge":
+ nodes, edges = elements_index(elements or [])
+ edge = edges.get(ctx["elementId"])
+ length = edge["data"].get("length_m") if edge else None
+ conductor = edge["data"].get("conductor_type") if edge else None
+ return no_update, {"display": "block", "backgroundColor": "#f8f9fc"}, ctx["elementId"], length, conductor
+
+ new_elements = apply_context_menu_action(ctx["menuItemId"], ctx, elements or [], last_node_id)
+ if new_elements is None:
+ raise PreventUpdate
+ return new_elements, {"display": "none"}, None, no_update, no_update
+
+
+@app.callback(
+ Output("network-elements", "data", allow_duplicate=True),
+ Output("edit-edge-panel", "style", allow_duplicate=True),
+ Input("edit-edge-apply", "n_clicks"),
+ State("edit-edge-target", "data"),
+ State("edit-edge-length", "value"),
+ State("edit-edge-conductor", "value"),
+ State("network-elements", "data"),
+ prevent_initial_call=True,
+)
+def apply_edit_edge(n_clicks, edge_id, length, conductor, elements):
+ if not n_clicks or not edge_id:
+ raise PreventUpdate
+ elements = copy.deepcopy(elements)
+ for e in elements:
+ if e["data"].get("id") == edge_id:
+ if length is not None:
+ e["data"]["length_m"] = length
+ if conductor is not None:
+ e["data"]["conductor_type"] = conductor
+ return elements, {"display": "none"}
+
+
+@app.callback(
+ Output("edit-edge-panel", "style", allow_duplicate=True),
+ Input("edit-edge-cancel", "n_clicks"),
+ prevent_initial_call=True,
+)
+def cancel_edit_edge(n_clicks):
+ if not n_clicks:
+ raise PreventUpdate
+ return {"display": "none"}
+
+
+# ---------------------------------------------------------------------------
+# Selection tracking (map + tree) -> downstream PR computation
+# ---------------------------------------------------------------------------
+@app.callback(
+ Output("last-tapped-node", "data"),
+ Output("current-selection-store", "data", allow_duplicate=True),
+ Input(MAP_CY_ID, "tapNodeData"),
+ Input(MAP_CY_ID, "tapEdgeData"),
+ Input("tree-view", "tapNodeData"),
+ Input("tree-view", "tapEdgeData"),
+ prevent_initial_call=True,
+)
+def track_selection(map_node, map_edge, tree_node, tree_edge):
+ # prop_id looks like "tree-view.tapNodeData" or '{"component":...}.tapEdgeData'
+ prop_id = callback_context.triggered[0]["prop_id"]
+ _, _, prop_name = prop_id.rpartition(".")
+
+ if prop_id.startswith("tree-view."):
+ data = tree_node if prop_name == "tapNodeData" else tree_edge
+ kind = "node" if prop_name == "tapNodeData" else "edge"
+ else:
+ data = map_node if prop_name == "tapNodeData" else map_edge
+ kind = "node" if prop_name == "tapNodeData" else "edge"
+
+ if not data:
+ raise PreventUpdate
+
+ selection = {"id": data.get("id"), "kind": kind}
+ last_node = data.get("id") if kind == "node" else no_update
+ return last_node, selection
+
+
+EMPTY_FIGURE = go.Figure(go.Scatter(x=[], y=[], mode="lines"))
+EMPTY_FIGURE.update_layout(
+ margin={"l": 50, "r": 20, "t": 10, "b": 30},
+ yaxis_title="Load (kVA)",
+ template="mantine_light",
+)
+
+
+def make_chart(series):
+ fig = go.Figure(
+ go.Scatter(x=series.index, y=series.values, mode="lines", line={"width": 1, "color": "#4263eb"})
+ )
+ fig.update_layout(
+ margin={"l": 50, "r": 20, "t": 10, "b": 30},
+ yaxis_title="Load (kVA)",
+ template="mantine_light",
+ )
+ return fig
+
+
+@app.callback(
+ Output("current-selection", "children"),
+ Output("current-selection", "color"),
+ Output("downstream-pr-display", "children"),
+ Output("downstream-pr-store", "data"),
+ Output("load-chart", "figure"),
+ Output("peak-display", "children"),
+ Input("current-selection-store", "data"),
+ State("network-elements", "data"),
+)
+def update_selection_display(selection, elements):
+ empty_pr = [dmc.Text("-", size="sm", c="dimmed")]
+ if not selection:
+ return "-", "gray", empty_pr, [], EMPTY_FIGURE, "-"
+ start_id = selection["id"]
+ if selection["kind"] == "edge":
+ nodes, edges = elements_index(elements or [])
+ edge = edges.get(start_id)
+ start_id = edge["data"]["target"] if edge else None
+ pr_ids = downstream_pr_ids(elements or [], start_id)
+ label = selection["id"]
+ badge_color = "blue" if selection["kind"] == "node" else "orange"
+ pr_badges = (
+ [dmc.Badge(pr, variant="dot", color="gray", size="sm") for pr in pr_ids]
+ if pr_ids
+ else [dmc.Text("-", size="sm", c="dimmed")]
+ )
+
+ cols = [c for c in pr_ids if c in LOAD_DF.columns]
+ if not cols:
+ return label, badge_color, pr_badges, pr_ids, EMPTY_FIGURE, "-"
+
+ series = LOAD_DF[cols].sum(axis=1)
+ peak = series.max()
+ fig = make_chart(series)
+ return label, badge_color, pr_badges, pr_ids, fig, f"{peak:.1f} kVA"
+
+
+if __name__ == "__main__":
+ app.run(debug=True, port=8080)
diff --git a/energy-leaflet-cytoscape-visualizer/assets/style.css b/energy-leaflet-cytoscape-visualizer/assets/style.css
new file mode 100644
index 0000000..85981e7
--- /dev/null
+++ b/energy-leaflet-cytoscape-visualizer/assets/style.css
@@ -0,0 +1,8 @@
+html, body {
+ margin: 0;
+ padding: 0;
+}
+
+#react-entry-point, #_dash-app-content {
+ min-height: 100vh;
+}
diff --git a/energy-leaflet-cytoscape-visualizer/data.py b/energy-leaflet-cytoscape-visualizer/data.py
new file mode 100644
index 0000000..91cce94
--- /dev/null
+++ b/energy-leaflet-cytoscape-visualizer/data.py
@@ -0,0 +1,194 @@
+"""Synthetic data generation for the BT (low-voltage) network demo.
+
+Builds a handful of fake distribution-network trees (one per transformer)
+with realistic-looking lat/lon positions, plus synthetic hourly load
+curves for every connection point (PR - Point de Raccordement).
+
+Everything is deterministic (seeded) so the app looks the same on every run.
+"""
+import math
+import random
+
+import numpy as np
+import pandas as pd
+
+# ---------------------------------------------------------------------------
+# Transformer metadata (shown in the search box on the left)
+# ---------------------------------------------------------------------------
+TRANSFO_META = {
+ "IDM_K7G2R": {
+ "note": None,
+ "base": (45.5230, -73.5820), # Plateau-Mont-Royal, Montreal
+ "n_nodes": 11,
+ "also_pr": False,
+ },
+ "IDM_H7Y8R": {
+ "note": "transformer and PR on the same node",
+ "base": (45.5450, -73.5800), # Rosemont, Montreal
+ "n_nodes": 9,
+ "also_pr": True,
+ },
+ "IDM_9X3LQ": {
+ "note": None,
+ "base": (45.4590, -73.5680), # Verdun, Montreal
+ "n_nodes": 14,
+ "also_pr": False,
+ },
+ "IDM_3F9PL": {
+ "note": None,
+ "base": (45.5240, -73.6050), # Mile End, Montreal
+ "n_nodes": 7,
+ "also_pr": False,
+ },
+ "IDM_Q2N6Z": {
+ "note": "large feeder, many downstream PRs",
+ "base": (45.5480, -73.5560), # Hochelaga-Maisonneuve, Montreal
+ "n_nodes": 19,
+ "also_pr": False,
+ },
+}
+
+CONDUCTOR_TYPES = ["Alu 50mm2", "Alu 95mm2", "Cu 95mm2", "Cu 150mm2"]
+
+EARTH_RADIUS_M = 6378137.0
+
+
+def _local_to_latlon(base_lat, base_lon, dx_m, dy_m):
+ """Offset (in meters) from a base lat/lon -> new lat/lon."""
+ dlat = (dy_m / EARTH_RADIUS_M) * (180.0 / math.pi)
+ dlon = (dx_m / (EARTH_RADIUS_M * math.cos(math.radians(base_lat)))) * (
+ 180.0 / math.pi
+ )
+ return base_lat + dlat, base_lon + dlon
+
+
+def _random_tree(rng, n_total):
+ """Return {child_index: parent_index} for a uniform random recursive tree."""
+ parent = {0: None}
+ for i in range(1, n_total):
+ p = rng.randint(0, i - 1)
+ parent[i] = p
+ return parent
+
+
+def _gen_pr_id(rng, used):
+ while True:
+ pid = str(rng.randint(100000, 999999))
+ if pid not in used:
+ used.add(pid)
+ return pid
+
+
+def build_transfo_elements(transfo_id, meta, seed):
+ """Build the cytoscape elements (nodes + edges) for one transformer's subtree."""
+ rng = random.Random(seed)
+ n_total = meta["n_nodes"]
+ parent = _random_tree(rng, n_total)
+
+ children = {i: [] for i in range(n_total)}
+ for child, p in parent.items():
+ if p is not None:
+ children[p].append(child)
+
+ # local xy layout: root at origin, children fan out generally eastwards
+ xy = {0: (0.0, 0.0)}
+ order = sorted(parent.keys())
+ for i in order[1:]:
+ p = parent[i]
+ px, py = xy[p]
+ dx = rng.uniform(25, 55)
+ dy = rng.uniform(-30, 30)
+ xy[i] = (px + dx, py + dy)
+
+ base_lat, base_lon = meta["base"]
+ used_ids = set()
+ node_id = {}
+ node_kind = {}
+
+ elements = []
+ for i in order:
+ dx, dy = xy[i]
+ lat, lon = _local_to_latlon(base_lat, base_lon, dx, dy)
+ if i == 0:
+ nid = transfo_id
+ kind = "transfo"
+ else:
+ is_leaf = len(children[i]) == 0
+ kind = "pr" if is_leaf else rng.choice(["pole", "pole", "pr"])
+ nid = _gen_pr_id(rng, used_ids) if kind == "pr" else f"N{seed}{i:02d}"
+ node_id[i] = nid
+ node_kind[i] = kind
+ data = {"id": nid, "label": nid, "kind": kind, "lat": lat, "lon": lon}
+ if kind == "transfo" and meta.get("also_pr"):
+ data["also_pr"] = True
+ elements.append({"data": data})
+
+ for i in order[1:]:
+ p = parent[i]
+ eid = f"e-{node_id[p]}-{node_id[i]}"
+ elements.append(
+ {
+ "data": {
+ "id": eid,
+ "source": node_id[p],
+ "target": node_id[i],
+ "kind": "conductor",
+ "length_m": round(math.hypot(*[a - b for a, b in zip(xy[i], xy[p])]), 1),
+ "conductor_type": rng.choice(CONDUCTOR_TYPES),
+ }
+ }
+ )
+
+ return elements
+
+
+def build_network():
+ """Return {transfo_id: elements} for every transformer in TRANSFO_META."""
+ network = {}
+ for seed, (tid, meta) in enumerate(TRANSFO_META.items()):
+ network[tid] = build_transfo_elements(tid, meta, seed=seed + 1)
+ return network
+
+
+def all_pr_ids(network):
+ ids = []
+ for elements in network.values():
+ for el in elements:
+ d = el["data"]
+ if "source" in d:
+ continue
+ if d.get("kind") == "pr" or d.get("also_pr"):
+ ids.append(d["id"])
+ return ids
+
+
+def build_load_curves(pr_ids, start="2022-06-01", end="2023-05-31", freq="30min", seed=0):
+ """Synthetic half-hourly load curves (kVA) for every PR, June 2022 - May 2023."""
+ rng = np.random.default_rng(seed)
+ idx = pd.date_range(start=start, end=end, freq=freq, inclusive="left")
+ n = len(idx)
+
+ hour = idx.hour.values + idx.minute.values / 60.0
+ day_of_year = idx.dayofyear.values
+
+ # winter (heating) ramp: higher consumption from ~Nov to ~Mar
+ winter_factor = 1 + 1.4 * np.clip(
+ np.cos(2 * np.pi * (day_of_year - 15) / 365.0), 0, None
+ )
+ daily_pattern = 1 + 0.6 * np.exp(-((hour - 12.5) ** 2) / (2 * 4.0 ** 2)) + 0.5 * np.exp(
+ -((hour - 20) ** 2) / (2 * 2.5 ** 2)
+ )
+
+ data = {}
+ for pid in pr_ids:
+ base = rng.uniform(2.5, 6.5)
+ noise = rng.normal(0, 0.6, size=n)
+ walk = np.cumsum(rng.normal(0, 0.03, size=n))
+ walk -= walk.mean()
+ series = base * daily_pattern * winter_factor + noise + walk
+ spikes_idx = rng.choice(n, size=max(1, n // 900), replace=False)
+ series[spikes_idx] += rng.uniform(8, 25, size=len(spikes_idx))
+ series = np.clip(series, 0.1, None)
+ data[pid] = series
+
+ return pd.DataFrame(data, index=idx)
diff --git a/energy-leaflet-cytoscape-visualizer/requirements.txt b/energy-leaflet-cytoscape-visualizer/requirements.txt
new file mode 100644
index 0000000..9680675
--- /dev/null
+++ b/energy-leaflet-cytoscape-visualizer/requirements.txt
@@ -0,0 +1,6 @@
+dash>=2.17
+dash-cytoscape>=1.0.2
+dash-leaflet>=1.0.15
+dash-mantine-components>=2.0.0
+pandas
+numpy
diff --git a/lithium-supply-chain/Procfile b/lithium-supply-chain/Procfile
new file mode 100644
index 0000000..75f6e60
--- /dev/null
+++ b/lithium-supply-chain/Procfile
@@ -0,0 +1,2 @@
+
+web: gunicorn app:server --workers 4
\ No newline at end of file
diff --git a/lithium-supply-chain/app.py b/lithium-supply-chain/app.py
new file mode 100644
index 0000000..d18d802
--- /dev/null
+++ b/lithium-supply-chain/app.py
@@ -0,0 +1,51 @@
+import dash_mantine_components as dmc
+from dash import html
+
+import pages
+from constants import MANTINE_THEME, NAVY, app
+
+server = app.server
+
+header = html.Div(
+ dmc.Group(
+ gap=14,
+ style={"height": "100%"},
+ children=[
+ dmc.Text(
+ "Lithium Supply Chain Tracker",
+ c="white",
+ fw=600,
+ size="lg",
+ style={"lineHeight": 1.2},
+ ),
+ ],
+ ),
+ className="app-header",
+)
+
+
+
+app.layout = dmc.MantineProvider(
+ theme=MANTINE_THEME,
+ children=[
+ html.Meta(
+ name="viewport",
+ content="width=device-width, initial-scale=1, shrink-to-fit=no",
+ ),
+ html.Link(
+ rel="stylesheet",
+ href="https://fonts.googleapis.com/css?family=Poppins",
+ ),
+ html.Meta(name="theme-color", content=NAVY),
+ header,
+ html.Div(
+ id="content",
+ className="app-content",
+ children=pages.supply_sankey.layout(),
+ )
+ ],
+)
+
+
+if __name__ == "__main__":
+ app.run(debug=True,port=8060)
diff --git a/lithium-supply-chain/assets/media_queries.css b/lithium-supply-chain/assets/media_queries.css
new file mode 100644
index 0000000..e69de29
diff --git a/lithium-supply-chain/assets/styles.css b/lithium-supply-chain/assets/styles.css
new file mode 100644
index 0000000..7417ba5
--- /dev/null
+++ b/lithium-supply-chain/assets/styles.css
@@ -0,0 +1,133 @@
+:root {
+ --brand: #3a92d4;
+ --brand-dark: #2778b8;
+ --navy: #155d90;
+ --page-bg: #fbfaf8;
+ --card-border: #e7e3dd;
+ --text-muted: #877869;
+}
+
+* {
+ font-family: "Poppins", sans-serif;
+}
+
+body {
+ background-color: var(--page-bg);
+ margin: 0;
+}
+
+.app-header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 68px;
+ padding: 0px 24px;
+ background-color: var(--navy);
+ z-index: 100;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+}
+
+.app-content {
+ margin-top: 68px;
+ min-height: calc(100vh - 68px);
+}
+
+/* layout utilities */
+.flex-row {
+ display: flex !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ display: flex;
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.flex-start {
+ justify-content: flex-start;
+}
+
+.flex-end {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+ width: 100%;
+}
+
+.space-between {
+ justify-content: space-between;
+ width: 100%;
+}
+
+.space-evenly {
+ justify-content: space-evenly;
+ width: 100%;
+}
+
+.center-align {
+ display: flex;
+ align-items: center;
+}
+
+.left-align {
+ justify-content: left;
+ width: 100%;
+}
+
+.flex-grow-1 {
+ display: flex;
+ flex-grow: 1;
+}
+
+.page-div {
+ padding: 20px;
+ gap: 20px;
+ box-sizing: border-box;
+}
+
+.node-container {
+ overflow-x: auto;
+ /* overflow-y left unset (not "hidden"): with overflow-x:auto, browsers
+ force overflow-y to compute as "auto" too (never truly "visible"),
+ so it still clips an open dropdown's popup at the row's bottom edge.
+ The :focus-within rule below is what actually lets it escape. */
+}
+
+/* While a node dropdown is open (its card has focus), drop clipping on
+ the whole row so the popup isn't cut off. Horizontal scrolling still
+ works the rest of the time, which is the only time it's needed. */
+.node-container:focus-within {
+ overflow: visible;
+}
+
+.filter-container {
+ overflow-x: auto;
+ white-space: nowrap;
+}
+
+.node-card {
+ min-width: 240px !important;
+ max-width: 280px !important;
+ margin: 8px !important;
+ flex-shrink: 0 !important;
+}
+
+/* Without this, an open dropdown still loses to sibling node cards:
+ z-index on the (unportaled) dropdown only wins within its own
+ stacking context, and a plain position:relative card doesn't start
+ one. Bumping the whole card while it has focus does.
+ overflow only goes visible while focused (dropdown open) so the
+ card's rounded top corners are clipped/visible normally. */
+.node-card:focus-within {
+ position: relative;
+ z-index: 1000;
+ overflow: visible;
+}
diff --git a/lithium-supply-chain/constants.py b/lithium-supply-chain/constants.py
new file mode 100644
index 0000000..8345b65
--- /dev/null
+++ b/lithium-supply-chain/constants.py
@@ -0,0 +1,68 @@
+import os
+
+import dash
+
+
+app = dash.Dash(
+ __name__,
+ suppress_callback_exceptions=True,
+ external_stylesheets=[
+ "assets/styles.css",
+ "assets/media_queries.css",
+ ],
+)
+
+app.title = "Lithium Supply Chain Tracker"
+
+# Dash always renders a favicon (falling back to its own default
+# icon when assets/favicon.ico is absent), so the only way to have none
+# at all is to drop the {%favicon%} placeholder from the index template.
+app.index_string = """
+
+
+ {%metas%}
+ {%title%}
+ {%css%}
+
+
+ {%app_entry%}
+
+
+"""
+
+
+DEFAULT_SANKEY_NODES = [
+ "Resource Country",
+ "Product",
+]
+
+# Brand color ramp (light -> dark) used as the Mantine primary color
+# (drives buttons and other primary-colored controls).
+BRAND_COLOR = [
+ "#eef6fd",
+ "#dcedfb",
+ "#c3e0f7",
+ "#a0cdf0",
+ "#7ab9e8",
+ "#56a5df",
+ "#3a92d4",
+ "#2778b8",
+ "#1a6099",
+ "#0f4a7a",
+]
+NAVY = "#155d90"
+PAGE_BACKGROUND = "#fbfaf8"
+CARD_BORDER = "#e7e3dd"
+
+MANTINE_THEME = {
+ "fontFamily": "'Poppins', sans-serif",
+ "headings": {"fontFamily": "'Poppins', sans-serif", "fontWeight": 600},
+ "primaryColor": "brand",
+ "defaultRadius": "md",
+ "colors": {"brand": BRAND_COLOR},
+ "black": "#2f2821",
+}
diff --git a/lithium-supply-chain/data/colors.csv b/lithium-supply-chain/data/colors.csv
new file mode 100644
index 0000000..462728b
--- /dev/null
+++ b/lithium-supply-chain/data/colors.csv
@@ -0,0 +1,573 @@
+name,color
+Northstar Industries,#afa28e
+Atlas Corp,#afa28e
+Blue Horizon Minerals,#afa28e
+Granite Energy,#afa28e
+Pioneer Materials,#afa28e
+Northstar Minerals,#afa28e
+Cobalt Bay Mining,#afa28e
+Atlas Energy,#afa28e
+Atlas Holdings,#afa28e
+Vantage Materials,#afa28e
+Cascade Mining,#afa28e
+Granite Industries,#afa28e
+Golden Peak Industries,#a29486
+Sierra Holdings,#afa28e
+Frontier Industries,#afa28e
+Summit Holdings,#afa28e
+Ironclad Holdings,#436d95
+Summit Industries,#afa28e
+Highland Minerals,#afa28e
+Horizon Materials,#afa28e
+Summit Materials,#afa28e
+Falcon Energy,#afa28e
+Cobalt Bay Materials,#afa28e
+Amber Metals,#8bb094
+Frontier Group,#7fa1bd
+Amber Resources,#afa28e
+Amber Corp,#afa28e
+Vantage Energy,#afa28e
+Cascade Materials,#afa28e
+Stonebridge Holdings,#afa28e
+Blue Horizon Mining,#afa28e
+Redwood Metals,#afa28e
+Golden Peak Holdings,#afa28e
+Amber Energy,#788a98
+Pioneer Mining,#afa28e
+Ironclad Energy,#afa28e
+Copper Creek Group,#afa28e
+Pioneer Resources,#afa28e
+Ironclad Industries,#afa28e
+Silverridge Industries,#afa28e
+Cobalt Bay Corp,#afa28e
+Frontier Holdings,#afa28e
+Frontier Metals,#afa28e
+Titan Corp,#afa28e
+Silverridge Minerals,#afa28e
+Northstar Metals,#afa28e
+Titan Resources,#afa28e
+Crescent Corp,#afa28e
+Pioneer Energy,#afa28e
+Blue Horizon Corp,#afa28e
+Atlas Materials,#afa28e
+Pioneer Industries,#afa28e
+Northstar Corp,#afa28e
+Ironclad Corp,#afa28e
+Redwood Industries,#afa28e
+Horizon Energy,#afa28e
+Cascade Energy,#afa28e
+Cascade Resources,#afa28e
+Falcon Materials,#afa28e
+Silverridge Group,#afa28e
+Atlas Resources,#afa28e
+Vantage Metals,#afa28e
+Atlas Industries,#afa28e
+Sierra Metals,#afa28e
+Stonebridge Energy,#afa28e
+Meridian Corp,#afa28e
+Blue Horizon Group,#afa28e
+Titan Holdings,#ddbd5f
+Falcon Mining,#d2af6a
+Summit Corp,#afa28e
+Blue Horizon Resources,#afa28e
+Granite Resources,#afa28e
+Cobalt Bay Industries,#afa28e
+Falcon Minerals,#afa28e
+Golden Peak Group,#afa28e
+Redwood Holdings,#afa28e
+Summit Mining,#afa28e
+Granite Mining,#afa28e
+Golden Peak Resources,#afa28e
+Vantage Mining,#afa28e
+Titan Mining,#afa28e
+Ironclad Minerals,#afa28e
+Sierra Mining,#afa28e
+Horizon Minerals,#afa28e
+Pioneer Corp,#afa28e
+Stonebridge Metals,#afa28e
+Horizon Resources,#afa28e
+Meridian Mining,#c6b775
+Vantage Minerals,#afa28e
+Frontier Energy,#afa28e
+Atlas Group,#afa28e
+Silverridge Mining,#afa28e
+Stonebridge Minerals,#afa28e
+Northstar Holdings,#afa28e
+Highland Resources,#85b7a3
+Horizon Industries,#d4a72b
+Germany,#c7422b
+Argentina,#afa28e
+South Korea,#638759
+Norway,#afa28e
+Vietnam,#833b45
+Indonesia,#9b963b
+Zambia,#afa28e
+Japan,#e2713d
+United States,#71442f
+Austria,#afa28e
+France,#afa28e
+Kazakhstan,#4d9889
+India,#afa28e
+Bolivia,#574a3d
+Finland,#afa28e
+Poland,#d0846d
+Sweden,#d2571e
+Morocco,#dfae2a
+DR Congo,#7b984c
+United Kingdom,#7c7928
+Spain,#5daa98
+Serbia,#5e8eaf
+Italy,#874927
+South Africa,#d6a94b
+Mexico,#afa28e
+Ghana,#905f78
+Ireland,#afa28e
+Lithium Carbonate,#5f6f7c
+Lithium Hydroxide,#b4a388
+Spodumene Concentrate,#e4a63f
+Lithium Metal,#e05d23
+North America,#4b8053
+South America,#9f7480
+Europe,#c8b174
+Asia Pacific,#a89581
+Middle East & Africa,#829946
+Oceania,#afa28e
+RES-1094,#afa28e
+Spot Market Spod,#d07c51
+RES-1211,#afa28e
+RES-1089,#afa28e
+RES-1185,#afa28e
+RES-1242,#afa28e
+RES-1129,#afa28e
+RES-1054,#afa28e
+RES-1137,#afa28e
+RES-1179,#afa28e
+RES-1265,#afa28e
+RES-1196,#afa28e
+RES-1159,#afa28e
+RES-1181,#afa28e
+RES-1002,#afa28e
+RES-1018,#afa28e
+RES-1189,#afa28e
+RES-1117,#afa28e
+RES-1076,#afa28e
+RES-1165,#afa28e
+RES-1227,#afa28e
+RES-1033,#afa28e
+RES-1101,#afa28e
+RES-1250,#afa28e
+Spot Market Lep,#6f95bb
+RES-1194,#afa28e
+RES-1238,#afa28e
+RES-1171,#afa28e
+RES-1052,#afa28e
+RES-1066,#afa28e
+RES-1226,#afa28e
+RES-1133,#afa28e
+RES-1144,#afa28e
+RES-1223,#afa28e
+RES-1168,#afa28e
+RES-1107,#afa28e
+RES-1215,#afa28e
+RES-1158,#afa28e
+RES-1010,#afa28e
+RES-1212,#afa28e
+RES-1231,#afa28e
+RES-1063,#afa28e
+RES-1145,#afa28e
+RES-1255,#afa28e
+RES-1103,#afa28e
+RES-1060,#afa28e
+RES-1172,#afa28e
+RES-1213,#afa28e
+RES-1152,#afa28e
+RES-1017,#afa28e
+RES-1263,#afa28e
+RES-1020,#afa28e
+RES-1130,#afa28e
+RES-1225,#afa28e
+RES-1040,#afa28e
+RES-1135,#afa28e
+RES-1218,#afa28e
+RES-1128,#afa28e
+RES-1122,#afa28e
+RES-1149,#afa28e
+RES-1012,#afa28e
+RES-1232,#afa28e
+RES-1080,#afa28e
+RES-1191,#afa28e
+RES-1015,#afa28e
+RES-1138,#afa28e
+RES-1188,#afa28e
+RES-1148,#afa28e
+RES-1014,#afa28e
+RES-1055,#afa28e
+RES-1075,#afa28e
+RES-1048,#afa28e
+RES-1039,#afa28e
+RES-1124,#afa28e
+RES-1183,#afa28e
+RES-1169,#afa28e
+RES-1142,#afa28e
+RES-1247,#afa28e
+RES-1187,#afa28e
+RES-1178,#afa28e
+RES-1108,#afa28e
+RES-1073,#afa28e
+RES-1116,#afa28e
+RES-1259,#afa28e
+RES-1200,#afa28e
+RES-1237,#afa28e
+RES-1067,#afa28e
+RES-1099,#afa28e
+RES-1000,#afa28e
+RES-1097,#afa28e
+RES-1042,#afa28e
+RES-1030,#afa28e
+RES-1205,#afa28e
+RES-1109,#afa28e
+RES-1246,#afa28e
+RES-1248,#afa28e
+RES-1208,#afa28e
+RES-1085,#afa28e
+RES-1121,#afa28e
+RES-1047,#afa28e
+RES-1007,#afa28e
+RES-1025,#afa28e
+Spodumene,#d07c51
+Petalite,#8db255
+Lepidolite,#d3aa65
+Brine,#8b9284
+Hard Rock,#dfb55d
+Pegmatite,#a0ba82
+Clay,#3a6644
+Salar Brine,#722d37
+China,#5c3a23
+Australia,#afa28e
+Netherlands,#9e4b29
+Falcon Holdings,#b59e87
+Crescent Energy,#afa28e
+Amber Mining,#afa28e
+Highland Corp,#afa28e
+Cascade Corp,#afa28e
+Redwood Group,#da7231
+CNV-1036,#afa28e
+CNV-1228,#afa28e
+CNV-1160,#afa28e
+CNV-1193,#afa28e
+CNV-1262,#afa28e
+CNV-1257,#afa28e
+CNV-1249,#afa28e
+CNV-1120,#afa28e
+CNV-1102,#afa28e
+CNV-1245,#afa28e
+CNV-1110,#afa28e
+CNV-1091,#afa28e
+CNV-1256,#afa28e
+CNV-1176,#afa28e
+CNV-1162,#afa28e
+CNV-1068,#afa28e
+CNV-1082,#afa28e
+CNV-1202,#afa28e
+CNV-1161,#afa28e
+CNV-1092,#afa28e
+CNV-1078,#afa28e
+CNV-1206,#afa28e
+CNV-1100,#afa28e
+CNV-1229,#afa28e
+CNV-1177,#afa28e
+CNV-1136,#afa28e
+CNV-1083,#afa28e
+CNV-1154,#afa28e
+CNV-1056,#afa28e
+CNV-1216,#afa28e
+CNV-1132,#afa28e
+CNV-1164,#afa28e
+CNV-1095,#afa28e
+CNV-1104,#afa28e
+CNV-1224,#afa28e
+CNV-1140,#afa28e
+CNV-1050,#afa28e
+CNV-1057,#afa28e
+CNV-1157,#afa28e
+CNV-1065,#afa28e
+CNV-1180,#afa28e
+CNV-1059,#afa28e
+CNV-1197,#afa28e
+CNV-1038,#afa28e
+CNV-1006,#afa28e
+CNV-1201,#afa28e
+CNV-1190,#afa28e
+CNV-1037,#afa28e
+CNV-1195,#afa28e
+CNV-1199,#afa28e
+CNV-1264,#afa28e
+CNV-1222,#afa28e
+CNV-1021,#afa28e
+CNV-1081,#afa28e
+CNV-1175,#afa28e
+CNV-1043,#afa28e
+CNV-1111,#afa28e
+CNV-1032,#afa28e
+CNV-1221,#afa28e
+CNV-1253,#afa28e
+CNV-1166,#afa28e
+CNV-1049,#afa28e
+CNV-1230,#afa28e
+CNV-1008,#afa28e
+CNV-1035,#afa28e
+CNV-1084,#afa28e
+CNV-1051,#afa28e
+CNV-1024,#afa28e
+CNV-1086,#afa28e
+CNV-1234,#afa28e
+CNV-1150,#afa28e
+CNV-1105,#afa28e
+CNV-1044,#afa28e
+CNV-1058,#afa28e
+CNV-1174,#afa28e
+CNV-1028,#afa28e
+CNV-1209,#afa28e
+CNV-1114,#afa28e
+CNV-1235,#afa28e
+CNV-1096,#afa28e
+CNV-1167,#afa28e
+CNV-1203,#afa28e
+CNV-1098,#afa28e
+CNV-1251,#afa28e
+CNV-1254,#afa28e
+CNV-1118,#afa28e
+CNV-1003,#afa28e
+CNV-1093,#afa28e
+CNV-1022,#afa28e
+CNV-1241,#afa28e
+CNV-1207,#afa28e
+CNV-1258,#afa28e
+CNV-1079,#afa28e
+CNV-1240,#afa28e
+CNV-1123,#afa28e
+CNV-1260,#afa28e
+CNV-1210,#afa28e
+CNV-1131,#afa28e
+CNV-1031,#afa28e
+CNV-1143,#afa28e
+CNV-1153,#afa28e
+CNV-1045,#afa28e
+CNV-1119,#afa28e
+CNV-1186,#afa28e
+CNV-1046,#afa28e
+CNV-1147,#afa28e
+CNV-1005,#afa28e
+CNV-1016,#afa28e
+CNV-1233,#afa28e
+CNV-1173,#afa28e
+CNV-1126,#afa28e
+CNV-1074,#afa28e
+CNV-1214,#afa28e
+CNV-1106,#afa28e
+CNV-1004,#afa28e
+CNV-1146,#afa28e
+CNV-1019,#afa28e
+CNV-1115,#afa28e
+CNV-1088,#afa28e
+CNV-1127,#afa28e
+CNV-1009,#afa28e
+CNV-1217,#afa28e
+CNV-1001,#afa28e
+CNV-1071,#afa28e
+CNV-1184,#afa28e
+CNV-1090,#afa28e
+CNV-1134,#afa28e
+CNV-1113,#afa28e
+CNV-1041,#afa28e
+CNV-1204,#afa28e
+CNV-1198,#afa28e
+CNV-1261,#afa28e
+CNV-1252,#afa28e
+CNV-1011,#afa28e
+CNV-1070,#afa28e
+CNV-1244,#afa28e
+CNV-1023,#afa28e
+CNV-1013,#afa28e
+CNV-1064,#afa28e
+CNV-1125,#afa28e
+CNV-1170,#afa28e
+CNV-1151,#afa28e
+CNV-1192,#afa28e
+CNV-1087,#afa28e
+CNV-1053,#afa28e
+CNV-1163,#afa28e
+CNV-1069,#afa28e
+CNV-1236,#afa28e
+CNV-1155,#afa28e
+CNV-1027,#afa28e
+CNV-1029,#afa28e
+CNV-1239,#afa28e
+CNV-1034,#afa28e
+CNV-1026,#afa28e
+CNV-1182,#afa28e
+CNV-1141,#afa28e
+CNV-1243,#afa28e
+CNV-1219,#afa28e
+CNV-1156,#afa28e
+CNV-1077,#afa28e
+CNV-1139,#afa28e
+CNV-1112,#afa28e
+CNV-1220,#afa28e
+CNV-1072,#afa28e
+Highland Group,#afa28e
+Highland Metals,#afa28e
+Vantage Holdings,#afa28e
+Granite Corp,#afa28e
+Highland Materials,#afa28e
+Northstar Group,#afa28e
+Meridian Energy,#afa28e
+Cascade Metals,#afa28e
+Vantage Group,#afa28e
+Ironclad Resources,#afa28e
+Summit Group,#afa28e
+Silverridge Metals,#afa28e
+Granite Metals,#afa28e
+Meridian Materials,#afa28e
+Falcon Group,#afa28e
+Golden Peak Minerals,#afa28e
+Horizon Metals,#afa28e
+Highland Energy,#afa28e
+Czech Republic,#db8261
+Nigeria,#afa28e
+Canada,#afa28e
+Brazil,#afa28e
+Portugal,#7f6851
+Namibia,#afa28e
+Mali,#afa28e
+Peru,#afa28e
+Tier 1 Priority,#ceac6f
+Tier 2 Priority,#aba291
+Tier 3 Priority,#afa28e
+Strategic Reserve,#9cae8e
+Highland Park Deposit,#afa28e
+Moonlight Basin Prospect,#afa28e
+Rustic Hollow Prospect,#afa28e
+Crystal Springs Project,#afa28e
+Green Hollow Deposit,#afa28e
+Willow Bend Claim,#afa28e
+Amber Hills Claim,#afa28e
+Thunder Ridge Prospect,#afa28e
+Cedar Grove Mine,#afa28e
+Crystal Springs Claim,#afa28e
+Sunset Basin Deposit,#afa28e
+Copperhead Mine,#afa28e
+Silver Creek Mine,#afa28e
+Eagle Point Claim,#afa28e
+Amber Hills Mine,#afa28e
+Falcon Crest Mine,#afa28e
+Golden Ridge Project,#afa28e
+Granite Falls Deposit,#afa28e
+Blue Mesa Claim,#afa28e
+Silver Creek Claim,#afa28e
+Thunder Ridge Deposit,#afa28e
+Painted Mesa Project,#afa28e
+Stone Valley Prospect,#afa28e
+Highland Park Mine,#afa28e
+Black Rock Project,#afa28e
+Timber Creek Mine,#afa28e
+Moonlight Basin Deposit,#afa28e
+Timber Creek Prospect,#afa28e
+Silver Creek Project,#afa28e
+Amber Hills Project,#afa28e
+Maple Run Deposit,#afa28e
+White Pine Claim,#afa28e
+Falcon Crest Project,#afa28e
+Blue Mesa Project,#afa28e
+Falcon Crest Claim,#afa28e
+Blue Mesa Mine,#afa28e
+Green Hollow Prospect,#afa28e
+Crystal Springs Prospect,#afa28e
+Thunder Ridge Mine,#afa28e
+Crystal Springs Mine,#afa28e
+Highland Park Project,#afa28e
+Eagle Point Project,#afa28e
+White Pine Project,#afa28e
+Granite Falls Project,#afa28e
+Willow Bend Project,#afa28e
+Stone Valley Deposit,#afa28e
+Rustic Hollow Deposit,#afa28e
+Moonlight Basin Project,#afa28e
+Cedar Grove Prospect,#afa28e
+Painted Mesa Claim,#afa28e
+Sunset Basin Project,#afa28e
+Copperhead Prospect,#afa28e
+Iron Bluff Project,#afa28e
+Copperhead Project,#afa28e
+Blue Mesa Deposit,#afa28e
+Black Rock Deposit,#afa28e
+Timber Creek Project,#afa28e
+Red Canyon Claim,#afa28e
+White Pine Prospect,#afa28e
+Green Hollow Claim,#afa28e
+Falcon Crest Prospect,#afa28e
+Willow Bend Prospect,#afa28e
+Golden Ridge Claim,#afa28e
+Sunset Basin Claim,#afa28e
+Golden Ridge Prospect,#afa28e
+Rustic Hollow Mine,#afa28e
+Eagle Point Prospect,#afa28e
+Maple Run Mine,#afa28e
+Rustic Hollow Claim,#afa28e
+Amber Hills Prospect,#afa28e
+Highland Park Claim,#afa28e
+Stone Valley Claim,#afa28e
+Sunset Basin Prospect,#afa28e
+Iron Bluff Prospect,#afa28e
+Copperhead Claim,#afa28e
+Painted Mesa Prospect,#afa28e
+White Pine Mine,#afa28e
+Copperhead Deposit,#afa28e
+Silver Creek Prospect,#afa28e
+Blue Mesa Prospect,#afa28e
+Red Canyon Deposit,#afa28e
+Red Canyon Prospect,#afa28e
+Black Rock Claim,#afa28e
+White Pine Deposit,#afa28e
+Golden Ridge Mine,#afa28e
+Green Hollow Project,#afa28e
+Maple Run Claim,#afa28e
+Granite Falls Mine,#afa28e
+Thunder Ridge Project,#afa28e
+Eagle Point Mine,#afa28e
+Moonlight Basin Claim,#afa28e
+Golden Ridge Deposit,#afa28e
+Granite Falls Claim,#afa28e
+Stone Valley Mine,#afa28e
+Thunder Ridge Claim,#afa28e
+Amber Hills Deposit,#afa28e
+Falcon Crest Deposit,#afa28e
+Red Canyon Project,#afa28e
+Painted Mesa Mine,#afa28e
+Rustic Hollow Project,#afa28e
+Iron Bluff Mine,#afa28e
+Iron Bluff Claim,#afa28e
+Green Hollow Mine,#afa28e
+Granite Falls Prospect,#afa28e
+Maple Run Project,#afa28e
+Cedar Grove Claim,#afa28e
+Crystal Springs Deposit,#afa28e
+Iron Bluff Deposit,#afa28e
+Red Canyon Mine,#afa28e
+Black Rock Mine,#afa28e
+Timber Creek Claim,#afa28e
+Silver Creek Deposit,#afa28e
+Moonlight Basin Mine,#d4a72b
+Cedar Grove Deposit,#afa28e
+Sunset Basin Mine,#afa28e
+Zinnwaldite,#8b9284
+Exploration,#afa28e
+Feasibility Study,#afa28e
+Permitting,#afa28e
+Construction,#afa28e
+Production,#afa28e
+Expansion,#afa28e
+Care & Maintenance,#afa28e
+RES-1062,#afa28e
+RES-1061,#afa28e
+Other,#d67f4b
diff --git a/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_resource_data.csv b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_resource_data.csv
new file mode 100644
index 0000000..1274dcd
--- /dev/null
+++ b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_resource_data.csv
@@ -0,0 +1,182 @@
+,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,Resource Company,Resource Country,Resource Region,Criteria,Resource Name,Resource SubType,Stage
+0,0.0,0.0,0.0,0.27974100031552673,0.7459760008414048,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,Highland Group,Netherlands,North America,Tier 1 Priority,Highland Park Deposit,Spodumene,Exploration
+1,0.0,0.0,0.11314285714285714,0.3017142857142857,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,Blue Horizon Corp,DR Congo,South America,Tier 1 Priority,Blue Horizon Corp,Spodumene,Exploration
+2,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Frontier Group,Germany,Germany,Tier 2 Priority,Moonlight Basin Prospect,Petalite,Feasibility Study
+3,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Amber Resources,Germany,Germany,Tier 2 Priority,Moonlight Basin Prospect,Petalite,Feasibility Study
+4,0.0,0.0,0.0,0.0,0.0,0.0,0.6,1.5999999999999999,1.833,1.833,1.833,Summit Holdings,Indonesia,Europe,Tier 2 Priority,Rustic Hollow Prospect,Petalite,Permitting
+5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Summit Mining,Germany,Germany,Tier 1 Priority,Crystal Springs Project,Spodumene,Construction
+6,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Horizon Materials,Germany,Germany,Tier 2 Priority,Green Hollow Deposit,Petalite,Feasibility Study
+7,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,Horizon Energy,Spain,Europe,Tier 2 Priority,Willow Bend Claim,Spodumene,Feasibility Study
+8,0.0,0.0,0.0,3.2488102536644132,8.66349400977177,9.925115324944782,9.925115324944782,9.925115324944782,9.925115324944782,9.925115324944782,9.925115324944782,Crescent Energy,Bolivia,Bolivia,Tier 2 Priority,Amber Hills Claim,Spodumene,Exploration
+9,0.0,0.0,0.0,0.07896325508906459,0.21056868023750558,0.24123274429709235,0.24123274429709235,0.24123274429709235,0.24123274429709235,0.24123274429709235,0.24123274429709235,Highland Metals,Czech Republic,North America,Tier 1 Priority,Thunder Ridge Prospect,Spodumene,Exploration
+10,0.0,0.0,0.0,0.01885496727126698,0.050279912723378624,0.05760192501372064,0.05760192501372064,0.05760192501372064,0.05760192501372064,0.05760192501372064,0.05760192501372064,Highland Metals,Czech Republic,North America,Tier 1 Priority,Cedar Grove Mine,Zinnwaldite,Exploration
+11,0.0,0.0,0.0,0.10681020012047386,0.28482720032126363,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,Vantage Holdings,Czech Republic,North America,Tier 1 Priority,Crystal Springs Claim,Spodumene,Production
+12,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Granite Corp,Germany,Germany,Tier 3 Priority,Sunset Basin Deposit,Brine,Exploration
+13,0.0,0.0,0.0,4.450425005019743,11.867800013385985,13.596048390335314,13.596048390335314,13.596048390335314,13.596048390335314,13.596048390335314,13.596048390335314,Amber Mining,China,North America,Tier 2 Priority,Copperhead Mine,Spodumene,Exploration
+14,0.0,0.0,0.0,0.04132537504661191,0.11020100012429844,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,Vantage Holdings,Czech Republic,North America,Tier 1 Priority,Silver Creek Mine,Zinnwaldite,Production
+15,0.0,0.0,0.0,0.0,0.46247142857142853,1.233257142857143,1.4128502142857144,1.4128502142857144,1.4128502142857144,1.4128502142857144,1.4128502142857144,Northstar Metals,Japan,Middle East & Africa,Tier 3 Priority,Eagle Point Claim,Petalite,Permitting
+16,0.0,1.0632277261992407,2.835273936531309,3.2481607035386806,3.2481607035386806,3.2481607035386806,3.2481607035386806,3.2481607035386806,3.2481607035386806,3.2481607035386806,3.2481607035386806,Cascade Corp,Bolivia,Bolivia,Tier 2 Priority,Amber Hills Mine,Spodumene,Feasibility Study
+17,0.0,1.311285938979032,3.496762503944086,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,Redwood Group,Bolivia,Bolivia,Tier 2 Priority,Falcon Crest Mine,Spodumene,Feasibility Study
+18,0.0,1.311285938979032,3.496762503944086,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,Frontier Group,Bolivia,Bolivia,Tier 2 Priority,Falcon Crest Mine,Spodumene,Feasibility Study
+19,0.0,0.0,0.0,0.0,0.07542857142857143,0.2011428571428572,0.23043428571428579,0.23043428571428579,0.23043428571428579,0.23043428571428579,0.23043428571428579,Atlas Group,South Korea,South America,Tier 1 Priority,Golden Ridge Project,Clay,Exploration
+20,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Ironclad Holdings,Indonesia,Europe,Tier 2 Priority,Granite Falls Deposit,Petalite,Feasibility Study
+21,0.0,0.0,0.0,0.08571428571428572,0.2285714285714286,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,Pioneer Resources,Indonesia,Europe,Tier 1 Priority,Blue Mesa Claim,Petalite,Production
+22,0.0,3.857142857142857,10.285714285714286,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,Titan Holdings,Vietnam,Europe,Tier 2 Priority,Silver Creek Claim,Petalite,Expansion
+23,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,0.49098214285714287,Pioneer Industries,Germany,Germany,Tier 2 Priority,Thunder Ridge Deposit,Spodumene,Feasibility Study
+24,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,Summit Corp,Germany,Germany,Tier 1 Priority,Painted Mesa Project,Spodumene,Feasibility Study
+25,0.0,0.0,0.0,0.06574973132416076,0.1753326168644287,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,Highland Materials,Serbia,Middle East & Africa,Tier 1 Priority,Stone Valley Prospect,Zinnwaldite,Exploration
+26,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Stonebridge Minerals,Germany,Germany,Tier 2 Priority,Highland Park Mine,Petalite,Feasibility Study
+27,0.0,0.0,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Summit Holdings,Indonesia,Europe,Tier 2 Priority,Black Rock Project,Petalite,Permitting
+28,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,Redwood Group,Bolivia,Bolivia,Tier 2 Priority,Falcon Crest Mine,Spodumene,Feasibility Study
+29,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,4.005978543580942,Frontier Group,Bolivia,Bolivia,Tier 2 Priority,Falcon Crest Mine,Spodumene,Feasibility Study
+30,0.0,1.5735431267748383,4.196115004732901,4.807174252297131,4.807174252297131,4.807174252297131,4.807174252297131,4.807174252297131,4.807174252297131,4.807174252297131,4.807174252297131,Highland Corp,Spain,Europe,Tier 2 Priority,Timber Creek Mine,Spodumene,Feasibility Study
+31,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.19714285714285712,0.5257142857142858,0.6022714285714287,Titan Resources,Morocco,Europe,Tier 1 Priority,Moonlight Basin Deposit,Hard Rock,Production
+32,0.0,0.0,0.0,2.403229502710662,6.4086120072284345,7.3418661307810735,7.3418661307810735,7.3418661307810735,7.3418661307810735,7.3418661307810735,7.3418661307810735,Falcon Holdings,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Prospect,Spodumene,Exploration
+33,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Northstar Group,Germany,Germany,Tier 2 Priority,Silver Creek Project,Brine,Feasibility Study
+34,0.0,0.9536625010756596,2.543100002868426,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Meridian Energy,Germany,Germany,Tier 2 Priority,Amber Hills Project,Spodumene,Feasibility Study
+35,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,1.5732570280245157,Highland Minerals,Spain,Europe,Tier 2 Priority,Maple Run Deposit,Spodumene,Feasibility Study
+36,0.0,0.0,0.0,0.7119355476780098,1.898494793808026,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,Cascade Metals,Serbia,Middle East & Africa,Tier 2 Priority,White Pine Claim,Spodumene,Exploration
+37,0.0,0.0,0.0,0.7119355476780098,1.898494793808026,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,Ironclad Holdings,Serbia,Middle East & Africa,Tier 2 Priority,White Pine Claim,Spodumene,Exploration
+38,0.0,0.0,0.0,0.0,1.9073250021513186,5.08620000573685,5.82687788157228,5.82687788157228,5.82687788157228,5.82687788157228,5.82687788157228,Highland Corp,Australia,North America,Tier 2 Priority,Falcon Crest Project,Spodumene,Permitting
+39,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Granite Industries,Germany,Germany,Tier 2 Priority,Blue Mesa Project,Petalite,Feasibility Study
+40,0.0,0.0,0.0,0.0,0.14791403286978508,0.39443742098609375,0.4518773704171935,0.4518773704171935,0.4518773704171935,0.4518773704171935,0.4518773704171935,Atlas Materials,United Kingdom,South America,Tier 1 Priority,Falcon Crest Claim,Brine,Production
+41,0.0,0.0,0.22887900025815835,0.6103440006884222,0.6992253457886737,0.6992253457886737,0.6992253457886737,0.6992253457886737,0.6992253457886737,0.6992253457886737,0.6992253457886737,Highland Minerals,Spain,Europe,Tier 2 Priority,Maple Run Deposit,Spodumene,Expansion
+42,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Frontier Group,Indonesia,Europe,Tier 3 Priority,Blue Mesa Mine,Petalite,Permitting
+43,0.0,0.778503309503093,2.076008825341581,2.3783276105319486,2.3783276105319486,2.3783276105319486,2.3783276105319486,2.3783276105319486,2.3783276105319486,2.3783276105319486,2.3783276105319486,Cascade Materials,Serbia,Middle East & Africa,Tier 2 Priority,Green Hollow Prospect,Spodumene,Feasibility Study
+44,0.0,0.25950110316769764,0.6920029417805269,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,Vantage Group,Serbia,Middle East & Africa,Tier 2 Priority,Green Hollow Prospect,Spodumene,Feasibility Study
+45,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Meridian Mining,Germany,Germany,Brine,Crystal Springs Prospect,Brine,Expansion
+46,3.666,3.666,3.666,3.666,3.666,3.666,3.666,3.666,3.666,3.666,3.666,Titan Holdings,Vietnam,Europe,Tier 2 Priority,Silver Creek Claim,Petalite,Feasibility Study
+47,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Redwood Holdings,Germany,Germany,Tier 2 Priority,Thunder Ridge Mine,Petalite,Feasibility Study
+48,0.0,0.34285714285714286,0.9142857142857144,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Silverridge Minerals,Sweden,Europe,Tier 1 Priority,Crystal Springs Mine,Petalite,Expansion
+49,0.0,0.34285714285714286,0.9142857142857144,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Atlas Resources,Germany,Germany,Tier 2 Priority,Highland Park Project,Petalite,Expansion
+50,0.0,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Cascade Resources,Indonesia,Europe,Tier 2 Priority,Eagle Point Project,Petalite,Feasibility Study
+51,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Frontier Group,Indonesia,Europe,Tier 2 Priority,Eagle Point Project,Petalite,Feasibility Study
+52,0.0,0.0,0.0,1.6085107518142787,4.289362004838075,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,Frontier Group,Netherlands,North America,Tier 2 Priority,White Pine Project,Spodumene,Expansion
+53,0.0,0.0,0.0,1.6085107518142787,4.289362004838075,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,4.914000346792621,Ironclad Resources,Netherlands,North America,Tier 2 Priority,White Pine Project,Spodumene,Expansion
+54,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,Cobalt Bay Materials,Germany,Germany,Tier 1 Priority,Granite Falls Project,Spodumene,Feasibility Study
+55,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Golden Peak Industries,Indonesia,Europe,Tier 2 Priority,Willow Bend Project,Petalite,Feasibility Study
+56,0.0,1.0714285714285714,2.857142857142857,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Silverridge Mining,Indonesia,Europe,Tier 2 Priority,Willow Bend Project,Petalite,Feasibility Study
+57,0.0,0.0,0.0,0.0,1.5385755017353973,4.102868004627727,4.7003481578016375,4.7003481578016375,4.7003481578016375,4.7003481578016375,4.7003481578016375,Cascade Materials,Japan,Middle East & Africa,Tier 2 Priority,Stone Valley Deposit,Spodumene,Production
+58,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,Granite Corp,Germany,Germany,Tier 2 Priority,Rustic Hollow Deposit,Brine,Feasibility Study
+59,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Meridian Mining,Germany,Germany,Tier 1 Priority,Moonlight Basin Project,Spodumene,Construction
+60,0.0,0.0,0.15085714285714286,0.4022857142857144,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,Stonebridge Energy,Japan,Middle East & Africa,Tier 1 Priority,Cedar Grove Prospect,Lepidolite,Exploration
+61,0.0,0.0,0.0,0.0,0.9,2.4,2.7495000000000003,2.7495000000000003,2.7495000000000003,2.7495000000000003,2.7495000000000003,Cascade Resources,Indonesia,Europe,Tier 3 Priority,Painted Mesa Claim,Petalite,Exploration
+62,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Summit Group,Germany,Germany,Tier 2 Priority,Sunset Basin Project,Brine,Feasibility Study
+63,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Golden Peak Industries,Indonesia,Europe,Tier 2 Priority,Willow Bend Project,Petalite,Feasibility Study
+64,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,1.6497,Silverridge Mining,Indonesia,Europe,Tier 2 Priority,Willow Bend Project,Petalite,Feasibility Study
+65,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,Cascade Resources,Japan,Middle East & Africa,Tier 2 Priority,Copperhead Prospect,Hard Rock,Production
+66,0.0,0.0,0.0,0.0,0.5142857142857143,1.3714285714285714,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,Frontier Energy,Japan,Middle East & Africa,Tier 1 Priority,Iron Bluff Project,Lepidolite,Permitting
+67,0.0,0.0,0.0,1.1742857142857142,3.1314285714285717,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,Pioneer Corp,Japan,Middle East & Africa,Tier 2 Priority,Copperhead Project,Hard Rock,Production
+68,0.0,0.0,4.285714285714286,11.428571428571429,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,Meridian Mining,Germany,Germany,Brine,Crystal Springs Prospect,Brine,Exploration
+69,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.27600857142857144,0.7360228571428573,0.843206185714286,Sierra Metals,Japan,Middle East & Africa,Tier 1 Priority,Blue Mesa Deposit,Hard Rock,Permitting
+70,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Ironclad Holdings,Indonesia,Europe,Tier 2 Priority,Granite Falls Deposit,Petalite,Exploration
+71,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,5.721975006453955,15.258600017210549,17.480633644716836,Amber Mining,China,North America,Tier 2 Priority,Copperhead Mine,Spodumene,Exploration
+72,0.0,0.0,0.0,1.5216744829663342,4.057798621243559,4.648715545462151,4.648715545462151,4.648715545462151,4.648715545462151,4.648715545462151,4.648715545462151,Highland Corp,Spain,Europe,Tier 3 Priority,Timber Creek Mine,Spodumene,Production
+73,0.0,0.0,0.0,0.0,0.0,0.0,0.2225212502509872,0.5933900006692994,0.6798024195167659,0.6798024195167659,0.6798024195167659,Silverridge Metals,Kazakhstan,South America,Tier 1 Priority,Black Rock Deposit,Spodumene,Production
+74,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,3.5089225527713,Silverridge Mining,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Project,Spodumene,Feasibility Study
+75,0.0,0.0,0.0,0.0,1.1656934638148144,3.1085159035061714,3.5611935319542583,3.5611935319542583,3.5611935319542583,3.5611935319542583,3.5611935319542583,Amber Energy,Bolivia,Bolivia,Tier 2 Priority,Red Canyon Claim,Spodumene,Permitting
+76,0.0,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Titan Corp,Indonesia,Europe,Tier 2 Priority,White Pine Prospect,Petalite,Exploration
+77,0.0,0.0,0.0,0.0,0.0,0.04285714285714286,0.1142857142857143,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,Frontier Metals,Indonesia,Europe,Tier 1 Priority,Green Hollow Claim,Petalite,Permitting
+78,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Stonebridge Metals,Germany,Germany,Tier 2 Priority,Falcon Crest Prospect,Petalite,Feasibility Study
+79,0.0,0.0,0.0,0.19165865992414668,0.5110897597977245,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,Blue Horizon Resources,Italy,South America,Tier 1 Priority,Willow Bend Prospect,Clay,Production
+80,0.0,0.0,0.504,1.3439999999999999,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,Falcon Minerals,Indonesia,Europe,Tier 3 Priority,Golden Ridge Claim,Petalite,Expansion
+81,0.0,0.0,0.5245714285714286,1.398857142857143,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,Meridian Corp,Indonesia,Europe,Tier 3 Priority,Golden Ridge Claim,Petalite,Expansion
+82,0.0,0.0,0.0,1.0714285714285714,2.857142857142857,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Cobalt Bay Industries,Bolivia,Bolivia,Tier 2 Priority,Sunset Basin Claim,Spodumene,Exploration
+83,0.0,0.0,0.0,1.0714285714285714,2.857142857142857,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Titan Holdings,Bolivia,Bolivia,Tier 2 Priority,Sunset Basin Claim,Spodumene,Exploration
+84,1.1314285714285712,3.0171428571428573,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,3.4565142857142854,Titan Holdings,Germany,Germany,Tier 2 Priority,Silver Creek Claim,Petalite,Feasibility Study
+85,0.0,0.0,0.0,0.0,0.0,0.0,0.38095638042969016,1.0158836811458403,1.1638217422127035,1.1638217422127035,1.1638217422127035,Silverridge Mining,Serbia,Middle East & Africa,Tier 1 Priority,Golden Ridge Prospect,Spodumene,Production
+86,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Atlas Resources,Germany,Germany,Tier 3 Priority,Rustic Hollow Mine,Petalite,Expansion
+87,0.0,0.0,0.7255209998183328,1.934722666182221,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,Vantage Group,Serbia,Middle East & Africa,Tier 3 Priority,Eagle Point Prospect,Spodumene,Exploration
+88,0.0,0.0,0.0,0.21428571428571427,0.5714285714285714,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Titan Corp,Japan,Middle East & Africa,Tier 3 Priority,Maple Run Mine,Pegmatite,Production
+89,0.0,0.0,1.7142857142857142,4.571428571428571,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,Stonebridge Minerals,Germany,Germany,Tier 3 Priority,Rustic Hollow Claim,Petalite,Expansion
+90,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.9345892510541461,2.4922380028110562,Crescent Energy,Bolivia,Bolivia,Tier 2 Priority,Amber Hills Claim,Spodumene,Exploration
+91,0.0,0.08571428571428572,0.2285714285714286,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,Pioneer Resources,Indonesia,Europe,Tier 2 Priority,Blue Mesa Claim,Petalite,Feasibility Study
+92,0.0,0.0,0.0,0.1287711401952441,0.34338970718731776,0.3933958332964709,0.3933958332964709,0.3933958332964709,0.3933958332964709,0.3933958332964709,0.3933958332964709,Granite Energy,Serbia,Middle East & Africa,Tier 1 Priority,Amber Hills Prospect,Spodumene,Production
+93,0.0,0.0,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Ironclad Holdings,Indonesia,Europe,Tier 2 Priority,Granite Falls Deposit,Petalite,Expansion
+94,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Northstar Minerals,Germany,Germany,Tier 2 Priority,Highland Park Claim,Petalite,Feasibility Study
+95,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Pioneer Energy,Germany,Germany,Tier 2 Priority,Stone Valley Claim,Petalite,Expansion
+96,0.0,0.0,0.0,0.375,1.0,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,Horizon Resources,South Africa,Middle East & Africa,Tier 2 Priority,Sunset Basin Prospect,Hard Rock,Exploration
+97,0.0,0.0,0.0,0.375,1.0,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,1.1456250000000001,Frontier Group,South Africa,Middle East & Africa,Tier 2 Priority,Sunset Basin Prospect,Hard Rock,Exploration
+98,0.0,0.0,0.0,0.0,0.21857142857142858,0.582857142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,Atlas Energy,Indonesia,Europe,Tier 1 Priority,Iron Bluff Prospect,Petalite,Production
+99,0.0,0.0,0.0,0.0,0.6514285714285714,1.737142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,Pioneer Materials,Vietnam,Europe,Tier 2 Priority,Copperhead Claim,Petalite,Exploration
+100,0.0,0.0,0.6428571428571429,1.7142857142857142,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,Silverridge Mining,Indonesia,Europe,Tier 2 Priority,Painted Mesa Prospect,Petalite,Expansion
+101,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Horizon Materials,Germany,Germany,Tier 3 Priority,White Pine Mine,Petalite,Expansion
+102,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Horizon Materials,Germany,Germany,Tier 3 Priority,White Pine Mine,Petalite,Expansion
+103,0.0,0.0,0.0,0.0,0.9536625010756593,2.543100002868425,2.913438940786139,2.913438940786139,2.913438940786139,2.913438940786139,2.913438940786139,Frontier Group,Netherlands,North America,Tier 2 Priority,White Pine Project,Spodumene,Expansion
+104,0.0,0.0,0.0,0.0,0.9536625010756593,2.543100002868425,2.913438940786139,2.913438940786139,2.913438940786139,2.913438940786139,2.913438940786139,Ironclad Resources,Netherlands,North America,Tier 2 Priority,White Pine Project,Spodumene,Expansion
+105,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6921428571428571,1.8457142857142856,2.1144964285714285,Ironclad Industries,Japan,Middle East & Africa,Tier 2 Priority,Copperhead Deposit,Hard Rock,Permitting
+106,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6921428571428571,1.8457142857142856,2.1144964285714285,Frontier Holdings,Japan,Middle East & Africa,Tier 2 Priority,Copperhead Deposit,Hard Rock,Permitting
+107,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,5.768609102756558,Falcon Holdings,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Prospect,Spodumene,Feasibility Study
+108,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,0.8740316822358419,Frontier Group,Germany,Germany,Tier 2 Priority,Silver Creek Prospect,Spodumene,Feasibility Study
+109,0.17165925019361875,0.45775800051631677,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,0.5244190093415052,Falcon Holdings,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Prospect,Spodumene,Feasibility Study
+110,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Sierra Holdings,Germany,Germany,Tier 2 Priority,Blue Mesa Prospect,Brine,Feasibility Study
+111,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,Granite Metals,Czech Republic,North America,Tier 2 Priority,Red Canyon Deposit,Zinnwaldite,Feasibility Study
+112,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Cascade Resources,Japan,Middle East & Africa,Tier 2 Priority,Copperhead Prospect,Hard Rock,Expansion
+113,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,Ironclad Holdings,Indonesia,Europe,Tier 2 Priority,Granite Falls Deposit,Petalite,Production
+114,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Meridian Energy,Germany,Germany,Tier 2 Priority,Crystal Springs Project,Spodumene,Feasibility Study
+115,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,Horizon Energy,Spain,Europe,Tier 2 Priority,Red Canyon Prospect,Spodumene,Feasibility Study
+116,0.0,0.0,0.7457142857142857,1.9885714285714287,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,Frontier Group,Indonesia,Europe,Tier 2 Priority,Black Rock Claim,Petalite,Expansion
+117,0.0,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Ironclad Holdings,Indonesia,Europe,Tier 2 Priority,Granite Falls Deposit,Petalite,Expansion
+118,0.0,0.0,0.0,0.0,0.0,0.0,1.0451382857142855,2.7870354285714285,3.1928974628571427,3.1928974628571427,3.1928974628571427,Northstar Metals,Japan,Middle East & Africa,Tier 3 Priority,Eagle Point Claim,Petalite,Permitting
+119,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Germany,Tier 1 Priority,White Pine Deposit,Spodumene,Construction
+120,0.0,0.0,0.0,0.0,0.0,0.0,0.0375,0.1,0.1145625,0.1145625,0.1145625,Horizon Resources,South Africa,Middle East & Africa,Tier 1 Priority,Sunset Basin Prospect,Hard Rock,Exploration
+121,0.0,0.0,0.0,0.0,0.0,0.0,0.1125,0.3,0.34368750000000003,0.34368750000000003,0.34368750000000003,Frontier Group,South Africa,Middle East & Africa,Tier 1 Priority,Sunset Basin Prospect,Hard Rock,Exploration
+122,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,8.117571428571429,Titan Holdings,Vietnam,Europe,Tier 2 Priority,Silver Creek Claim,Petalite,Feasibility Study
+123,0.0,0.0,0.0,0.0,0.0,0.058834285714285714,0.15689142857142854,0.17973874285714286,0.17973874285714286,0.17973874285714286,0.17973874285714286,Ironclad Energy,Finland,South America,Tier 1 Priority,Golden Ridge Mine,Brine,Permitting
+124,0.0,0.0,0.0,0.011469381012936597,0.030585016034497592,0.03503895899452131,0.03503895899452131,0.03503895899452131,0.03503895899452131,0.03503895899452131,0.03503895899452131,Highland Metals,Czech Republic,North America,Tier 1 Priority,Green Hollow Project,Zinnwaldite,Exploration
+125,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,Granite Corp,Germany,Germany,Tier 2 Priority,Maple Run Claim,Brine,Feasibility Study
+126,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Summit Corp,Germany,Germany,Tier 1 Priority,Granite Falls Mine,Spodumene,Care & Maintenance
+127,0.0,0.0,0.0,0.11314285714285714,0.3017142857142857,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,Cobalt Bay Mining,South Korea,South America,Tier 1 Priority,Thunder Ridge Project,Lepidolite,Production
+128,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Ironclad Corp,Germany,Germany,Tier 2 Priority,Falcon Crest Prospect,Petalite,Feasibility Study
+129,0.0,0.0,0.0,0.00921026051038848,0.02456069469436928,0.028137345859236808,0.028137345859236808,0.028137345859236808,0.028137345859236808,0.028137345859236808,0.028137345859236808,Highland Metals,Czech Republic,North America,Tier 1 Priority,Green Hollow Project,Zinnwaldite,Exploration
+130,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Atlas Industries,Indonesia,Europe,Tier 2 Priority,Eagle Point Mine,Petalite,Exploration
+131,0.0,0.0,0.7542857142857143,2.0114285714285716,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,Titan Mining,Germany,Germany,Tier 2 Priority,Moonlight Basin Claim,Petalite,Expansion
+132,0.0,0.0,0.06,0.16,0.1833,0.1833,0.1833,0.1833,0.1833,0.1833,0.1833,Ironclad Minerals,Ghana,North America,Tier 1 Priority,Atlas Corp,Brine,Exploration
+133,0.0,0.0,0.0,0.0,0.0,0.0,0.04285714285714286,0.1142857142857143,0.13092857142857142,0.13092857142857142,0.13092857142857142,Falcon Energy,Japan,Middle East & Africa,Tier 1 Priority,Golden Ridge Deposit,Petalite,Permitting
+134,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,Meridian Materials,Germany,Germany,Tier 2 Priority,Granite Falls Claim,Spodumene,Feasibility Study
+135,0.0,0.0,0.0,0.0,0.15170670037926676,0.4045512010113782,0.46346396965866005,0.46346396965866005,0.46346396965866005,0.46346396965866005,0.46346396965866005,Vantage Minerals,Serbia,Middle East & Africa,Tier 1 Priority,Stone Valley Mine,Salar Brine,Permitting
+136,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,Northstar Industries,Germany,Germany,Tier 1 Priority,Thunder Ridge Claim,Spodumene,Feasibility Study
+137,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Silverridge Mining,Indonesia,Europe,Tier 2 Priority,Painted Mesa Prospect,Petalite,Exploration
+138,0.0,0.0,0.0,0.07683185840707965,0.20488495575221238,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,Cobalt Bay Corp,Poland,South America,Tier 1 Priority,Amber Hills Deposit,Spodumene,Production
+139,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Cascade Mining,Japan,Middle East & Africa,Tier 2 Priority,Falcon Crest Deposit,Petalite,Feasibility Study
+140,0.0,0.0,0.0,0.03692793129165193,0.09847448344440515,0.11281483009599662,0.11281483009599662,0.11281483009599662,0.11281483009599662,0.11281483009599662,0.11281483009599662,Highland Metals,Czech Republic,North America,Tier 1 Priority,Cedar Grove Mine,Zinnwaldite,Exploration
+141,0.0,0.0,0.0,0.0,0.17142857142857143,0.4571428571428572,0.5237142857142858,0.5237142857142858,0.5237142857142858,0.5237142857142858,0.5237142857142858,Frontier Energy,Japan,Middle East & Africa,Tier 1 Priority,Iron Bluff Project,Lepidolite,Permitting
+142,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Stonebridge Minerals,Germany,Germany,Tier 3 Priority,Red Canyon Project,Petalite,Expansion
+143,0.0,0.0,0.0,0.0,0.0,0.873990857142857,2.330642285714286,2.6700420685714286,2.6700420685714286,2.6700420685714286,2.6700420685714286,Vantage Metals,Serbia,Middle East & Africa,Tier 3 Priority,Painted Mesa Mine,Spodumene,Permitting
+144,0.0,0.0,0.0,0.0,0.1791428571428571,0.4777142857142857,0.5472814285714286,0.5472814285714286,0.5472814285714286,0.5472814285714286,0.5472814285714286,Horizon Minerals,Japan,Middle East & Africa,Tier 1 Priority,Rustic Hollow Project,Salar Brine,Permitting
+145,0.0,0.0,0.0,0.0,0.17657142857142857,0.4708571428571429,0.5394257142857143,0.5394257142857143,0.5394257142857143,0.5394257142857143,0.5394257142857143,Northstar Corp,Japan,Middle East & Africa,Tier 1 Priority,Iron Bluff Mine,Hard Rock,Exploration
+146,0.0,1.9285714285714286,5.142857142857143,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,Sierra Holdings,Germany,Germany,Brine,Iron Bluff Claim,Brine,Expansion
+147,0.8212093759262624,2.1898916691367,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,Falcon Group,Bolivia,Bolivia,Tier 2 Priority,Green Hollow Mine,Spodumene,Feasibility Study
+148,0.0,0.0,0.0,0.0,0.0,0.0,0.19407031896889676,0.5175208505837247,0.5928848244499795,0.5928848244499795,0.5928848244499795,Golden Peak Minerals,Serbia,Middle East & Africa,Tier 1 Priority,Granite Falls Prospect,Spodumene,Exploration
+149,0.0,0.0,0.0,0.18857142857142858,0.5028571428571429,0.5760857142857143,0.5760857142857143,0.5760857142857143,0.5760857142857143,0.5760857142857143,0.5760857142857143,Cobalt Bay Mining,South Korea,South America,Tier 1 Priority,Thunder Ridge Project,Lepidolite,Production
+150,0.0,0.0,0.0705710250795988,0.18818940021226346,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,Golden Peak Minerals,Serbia,Middle East & Africa,Tier 1 Priority,Maple Run Project,Spodumene,Exploration
+151,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,Horizon Metals,Germany,Germany,Tier 2 Priority,Cedar Grove Claim,Brine,Feasibility Study
+152,1.1787268513295153,3.1432716035453745,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,3.6010105308116684,Falcon Holdings,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Prospect,Spodumene,Feasibility Study
+153,0.0,0.572197500645396,1.525860001721055,1.7480633644716839,1.7480633644716839,1.7480633644716839,1.7480633644716839,1.7480633644716839,1.7480633644716839,1.7480633644716839,1.7480633644716839,Falcon Holdings,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Prospect,Spodumene,Expansion
+154,0.0,0.0,0.0,0.011253217512692785,0.03000858003384743,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,Highland Materials,Serbia,Middle East & Africa,Tier 1 Priority,Crystal Springs Deposit,Brine,Exploration
+155,0.0,0.0,0.0,0.0,0.21428571428571427,0.5714285714285714,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Cascade Resources,Indonesia,Europe,Tier 2 Priority,Eagle Point Project,Petalite,Exploration
+156,0.0,0.0,0.0,0.0,0.6428571428571429,1.7142857142857142,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,1.9639285714285715,Frontier Group,Indonesia,Europe,Tier 2 Priority,Eagle Point Project,Petalite,Exploration
+157,0.40117402545249403,1.069797401206651,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,Granite Metals,Serbia,Middle East & Africa,Tier 2 Priority,Iron Bluff Deposit,Zinnwaldite,Feasibility Study
+158,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,0.2618571428571429,Frontier Industries,Germany,Germany,Tier 2 Priority,Red Canyon Mine,Petalite,Feasibility Study
+159,0.0,0.0,0.2571428571428571,0.6857142857142859,0.7855714285714285,0.7855714285714285,0.7855714285714285,0.7855714285714285,0.7855714285714285,0.7855714285714285,0.7855714285714285,Frontier Industries,Germany,Germany,Tier 3 Priority,Red Canyon Mine,Petalite,Expansion
+160,0.0,0.0,0.0,0.09384039010584488,0.250241040282253,0.2866823917733562,0.2866823917733562,0.2866823917733562,0.2866823917733562,0.2866823917733562,0.2866823917733562,Highland Metals,Czech Republic,North America,Tier 1 Priority,Thunder Ridge Prospect,Spodumene,Exploration
+161,0.0,0.0,1.9285714285714286,5.142857142857143,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,Sierra Holdings,Germany,Germany,Brine,Iron Bluff Claim,Brine,Expansion
+162,7.771428571428573,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,8.903142857142857,Titan Holdings,Vietnam,Europe,Tier 2 Priority,Silver Creek Claim,Petalite,Feasibility Study
+163,10.427098214285715,9.305948807142856,10.220109521428574,12.692741907142857,13.58257635,16.950222857142858,18.178401828571428,18.08341,17.93101,17.887499285714288,17.723225235714285,Amber Energy,Bolivia,Bolivia,Tier 2 Priority,Black Rock Mine,Spodumene,Feasibility Study
+164,10.427098214285715,9.305948807142856,10.220109521428574,12.692741907142857,13.58257635,16.950222857142858,18.178401828571428,18.08341,17.93101,17.887499285714288,17.723225235714285,Horizon Industries,Bolivia,Bolivia,Tier 2 Priority,Black Rock Mine,Spodumene,Feasibility Study
+165,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,Amber Energy,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Claim,Spodumene,Feasibility Study
+166,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,1.6071428571428572,Horizon Industries,Bolivia,Bolivia,Tier 2 Priority,Timber Creek Claim,Spodumene,Feasibility Study
+167,0.5627142857142857,0.6414688860000001,0.6911515677142857,0.9864018591428572,0.985468888,0.9834067544285715,0.96318649,0.9511210355714285,0.9399575765714288,0.9399575765714288,0.9399575765714288,Horizon Industries,Japan,Middle East & Africa,Tier 2 Priority,Silver Creek Deposit,Petalite,Feasibility Study
+168,8.077142857142857,7.994959685714286,9.312134147142856,10.602312427142857,10.940388254285713,11.71587896,11.752527795714286,11.716736107142856,11.678756708571429,11.678756708571429,11.678756708571429,Horizon Industries,Vietnam,Europe,Tier 2 Priority,Moonlight Basin Mine,Petalite,Feasibility Study
+169,0.0,0.0,0.0,0.0,0.0,1.9701104757142858,6.064624761428571,8.074838094285715,8.95408381,9.404727618571428,9.420546667142858,Horizon Industries,Japan,Middle East & Africa,Tier 2 Priority,Cedar Grove Deposit,Spodumene,Exploration
+170,0.4891666666428572,2.4685777378571427,3.1394097142857142,5.796613713571429,5.026247857857143,7.2086347642857165,7.78684487857143,8.266476428571428,8.59667642857143,8.690949642857143,8.76250405,Redwood Group,Bolivia,Bolivia,Tier 2 Priority,Sunset Basin Mine,Spodumene,Feasibility Study
+171,0.4891666666428572,2.4685777378571427,3.1394097142857142,5.796613713571429,5.026247857857143,7.2086347642857165,7.78684487857143,8.266476428571428,8.59667642857143,8.690949642857143,8.76250405,Horizon Industries,Bolivia,Bolivia,Tier 2 Priority,Sunset Basin Mine,Spodumene,Feasibility Study
+172,0.35813276891147766,0.43372816351257776,0.531171617947814,0.6510403806823432,0.7859818861451698,0.9058768305014062,1.1355949169863302,1.4371903012082805,1.8775436608377267,2.4355763050897936,3.2379858227339775,Highland Energy,Nigeria,Mali,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+173,0.00029393425393154217,0.0008967394181953907,0.0020978383280021097,0.004896682999672312,0.008565526981747767,0.015750947354419877,0.028031363023666912,0.0501997265205662,0.08670126987539699,0.1434586362007026,0.22550014473192861,Highland Energy,Canada,South America,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+174,4.487819801067526,5.757831020367383,7.208974489638391,9.279057907797096,11.703599355916804,13.940118219813126,17.097320323386825,21.08162670958891,25.93133085742387,31.295445017638922,38.34643570978903,Highland Energy,Germany,Germany,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+175,0.659966607987949,0.945669739511419,1.3271680748335093,1.9813332688065715,2.7627295785578845,3.7651617602252045,5.140529954333063,6.862687943062185,9.306772859544436,12.174523322296604,15.320299319078293,Highland Energy,Brazil,South America,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+176,0.012924196587504416,0.023769530586304672,0.04139860972533127,0.06832524273239919,0.10169105617581252,0.14790315726062506,0.21403520879207086,0.3064705885027381,0.43875231929876257,0.6090027555439603,0.8355369112989572,Highland Energy,Zambia,Mali,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+177,0.006769133625808852,0.014726796676726914,0.026440797925274647,0.0447246286438994,0.06734415083117996,0.09759442264204467,0.14350902535102278,0.2166185219423733,0.32626238422270065,0.4795270497936838,0.7026933937518631,Highland Energy,Portugal,Mali,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+178,0.0051627228255365165,0.010026168423114174,0.019285923383422048,0.03671423633318125,0.059064077509973716,0.09164222768886253,0.14166842623392856,0.21661719047607156,0.3250951996971719,0.47316839925222165,0.677745913201961,Highland Energy,Namibia,Europe,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+179,0.006093465173688509,0.012480091478090162,0.025045639835196264,0.05443416549197814,0.0796244794320115,0.1334484449982953,0.18556026866765749,0.25652670914547626,0.4272470842326275,0.5612551922023163,0.7390598418086041,Highland Energy,Mali,Mali,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
+180,0.622753302708026,0.9486833388966611,1.3434463459872499,1.9501027455483346,2.646911239881392,3.3805209139382546,4.3001465224986095,5.636874465927327,7.3307481434292905,9.276354551787898,11.631331878214766,Highland Energy,Peru,Middle East & Africa,Strategic Reserve,Highland Energy,Strategic Reserve,Highland Energy
diff --git a/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_spot_data.csv b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_spot_data.csv
new file mode 100644
index 0000000..4fa7377
--- /dev/null
+++ b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_spot_data.csv
@@ -0,0 +1,37 @@
+,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,Resource Company,Resource Country,Resource SubType,Resource Region,Offtake Owner,Resource ID
+0,0.0,0.0,0.0,0.27974100031552673,0.7459760008414048,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,0.8546087559639342,Highland Group,Netherlands,Spodumene,North America,Spot Market Spod,RES-1094
+0,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,0.6231522178903689,Horizon Energy,Spain,Spodumene,Europe,Spot Market Spod,RES-1062
+0,0.0,0.0,0.0,0.0,0.4087503442110401,1.1847985025863628,1.1847985025863628,1.1847985025863628,1.1847985025863628,2.1193877536405097,3.6770365053974183,Crescent Energy,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1101
+0,0.0,0.0,0.0,0.17280364519490948,0.46080972051975866,0.5279151360704485,0.5279151360704485,0.5279151360704485,0.5279151360704485,0.5279151360704485,0.5279151360704485,Highland Metals,Czech Republic,Spodumene,North America,Spot Market Spod,RES-1089
+0,0.0,0.0,0.0,0.05578289856291891,0.14875439616778377,0.17041675510971727,0.17041675510971727,0.17041675510971727,0.17041675510971727,0.17041675510971727,0.17041675510971727,Highland Metals,Czech Republic,Zinnwaldite,North America,Spot Market Spod,RES-1185
+0,0.0,0.0,0.0,0.10681020012047386,0.28482720032126363,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,0.3263051613680476,Vantage Holdings,Czech Republic,Spodumene,North America,Spot Market Spod,RES-1242
+0,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Granite Corp,Germany,Brine,Germany,Spot Market Lep,RES-1129
+0,0.0,0.0,0.0,0.0,1.379419826555883,3.107668203505213,3.107668203505213,3.107668203505213,8.82964320995917,18.366268220715764,20.58830184822205,Amber Mining,China,Spodumene,North America,Spot Market Spod,RES-1238
+0,0.0,0.0,0.0,0.04132537504661191,0.11020100012429844,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,0.12624902076739938,Vantage Holdings,Czech Republic,Zinnwaldite,North America,Spot Market Spod,RES-1137
+0,0.0,0.0,0.0,0.0,0.0,0.3347217627525408,0.3347217627525408,0.3347217627525408,0.3347217627525408,0.3347217627525408,0.3347217627525408,Cascade Corp,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1213
+0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Redwood Group,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1039
+0,0.0,0.0,0.0,0.06574973132416076,0.1753326168644287,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,0.2008654291953111,Highland Materials,Serbia,Zinnwaldite,Middle East & Africa,Spot Market Spod,RES-1196
+0,0.0,1.5735431267748383,4.196115004732901,6.328848735263465,8.86497287354069,9.455889797759282,9.455889797759282,9.455889797759282,9.455889797759282,9.455889797759282,9.455889797759282,Highland Corp,Spain,Spodumene,Europe,Spot Market Spod,RES-1159
+0,0.0,0.0,0.0,0.0,1.38584327331313,2.3190973968657693,2.3190973968657693,2.3190973968657693,2.3190973968657693,2.3190973968657693,2.3190973968657693,Falcon Holdings,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1165
+0,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Northstar Group,Germany,Brine,Germany,Spot Market Lep,RES-1002
+0,0.0,0.9536625010756596,2.543100002868426,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Meridian Energy,Germany,Spodumene,Germany,Spot Market Spod,RES-1018
+0,0.0,0.0,0.0,0.7119355476780098,1.898494793808026,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,2.1749630981563195,Cascade Metals,Serbia,Spodumene,Middle East & Africa,Spot Market Spod,RES-1189
+0,0.0,0.0,0.0,0.0,0.9536625010756593,2.543100002868425,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Highland Corp,Australia,Spodumene,North America,Spot Market Spod,RES-1171
+0,0.0,0.25950110316769764,0.6920029417805269,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,0.7927758701773163,Vantage Group,Serbia,Spodumene,Middle East & Africa,Spot Market Spod,RES-1076
+0,0.0,0.0,0.0,1.6085107518142787,5.243024505913735,7.457100349661046,7.82743928757876,7.82743928757876,7.82743928757876,7.82743928757876,7.82743928757876,Ironclad Resources,Netherlands,Spodumene,North America,Spot Market Spod,RES-1165
+0,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,1.571142857142857,Granite Corp,Germany,Brine,Germany,Spot Market Lep,RES-1227
+0,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Summit Group,Germany,Brine,Germany,Spot Market Lep,RES-1033
+0,0.0,0.0,0.0,0.0,0.0,0.0,0.2225212502509872,0.5933900006692994,0.6798024195167659,0.6798024195167659,0.6798024195167659,Silverridge Metals,Kazakhstan,Spodumene,South America,Spot Market Spod,RES-1101
+0,0.0,0.0,0.7255209998183328,1.934722666182221,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,2.216466654445007,Vantage Group,Serbia,Spodumene,Middle East & Africa,Spot Market Spod,RES-1250
+0,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,0.06403091360972203,Granite Metals,Czech Republic,Zinnwaldite,North America,Spot Market Spod,RES-1061
+0,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Meridian Energy,Germany,Spodumene,Germany,Spot Market Spod,RES-1194
+0,0.0,0.0,0.0,0.020679641523325076,0.05514571072886687,0.06317630485375812,0.06317630485375812,0.06317630485375812,0.06317630485375812,0.06317630485375812,0.06317630485375812,Highland Metals,Czech Republic,Zinnwaldite,North America,Spot Market Spod,RES-1238
+0,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,Granite Corp,Germany,Brine,Germany,Spot Market Lep,RES-1171
+0,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,3.011357142857143,Meridian Materials,Germany,Spodumene,Germany,Spot Market Spod,RES-1052
+0,0.8212093759262624,2.1898916691367,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,2.5087946434547317,Falcon Group,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1066
+0,0.0,0.0,0.0,0.0,0.0,0.0,0.19407031896889676,0.5175208505837247,0.5928848244499795,0.5928848244499795,0.5928848244499795,Golden Peak Minerals,Serbia,Spodumene,Middle East & Africa,Spot Market Spod,RES-1226
+0,0.0,0.0,0.0705710250795988,0.18818940021226346,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,0.21559448161817435,Golden Peak Minerals,Serbia,Spodumene,Middle East & Africa,Spot Market Spod,RES-1133
+0,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,3.142285714285714,Horizon Metals,Germany,Brine,Germany,Spot Market Lep,RES-1144
+0,0.0,0.0,0.0,0.011253217512692785,0.03000858003384743,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,0.03437857950127646,Highland Materials,Serbia,Brine,Middle East & Africa,Spot Market Lep,RES-1223
+0,0.40117402545249403,1.069797401206651,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,1.2255866477573694,Granite Metals,Serbia,Zinnwaldite,Middle East & Africa,Spot Market Spod,RES-1168
+0,0.4891666666428572,2.4685777378571427,3.1394097142857142,5.796613713571429,5.026247857857143,7.2086347642857165,7.78684487857143,8.266476428571428,8.59667642857143,8.690949642857143,8.76250405,Redwood Group,Bolivia,Spodumene,Bolivia,Spot Market Spod,RES-1107
diff --git a/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_supply_data.csv b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_supply_data.csv
new file mode 100644
index 0000000..48a0b96
--- /dev/null
+++ b/lithium-supply-chain/data/forecast_version/forecast_version_1/dummy_supply_data.csv
@@ -0,0 +1,307 @@
+,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,Conversion Company,Conversion Country,Product,Conversion Region,Resource ID,Conversion Resource SubType,Resource Region,Resource Country,Resource Company,Conversion ID
+0,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,0.06546428571428571,Northstar Industries,Germany,Lithium Carbonate,Germany,RES-1094,Spodumene,Germany,Germany,Northstar Industries,CNV-1036
+1,0.0,0.02476603943551971,0.029521112017942167,0.038854745093444165,0.05528173212466597,0.0691522850330925,0.07170075659398135,0.0688903779983981,0.07088784620348448,0.08171920016569952,0.08643193372910254,Atlas Corp,Argentina,Lithium Hydroxide,North America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1228
+2,0.06682173896817736,0.19972612447999763,0.3007244008618896,0.4700170777432759,0.6687306305403141,0.8365195770132158,0.867347862023968,0.8333513467548156,0.857514268590538,0.9885387116818489,1.0455475854326919,Blue Horizon Minerals,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1160
+3,0.08820469543799413,0.2636384843135969,0.42452261255003415,0.6893583806901379,0.9808049247924605,1.226895379619383,1.2721101976351528,1.2222486419070628,1.2576875939327892,1.4498567771333783,1.533469791967948,Blue Horizon Minerals,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1193
+4,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2851437984494978,0.327881610071881,0.32788161007188105,0.327881610071881,Granite Energy,South Korea,Lithium Hydroxide,South America,RES-1211,Spodumene,Middle East & Africa,Serbia,Granite Energy,CNV-1262
+5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,2.97105798803211,5.898785214855245,6.800093888076539,7.192254244952882,Granite Energy,South Korea,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1262
+6,0.0,0.0,0.0,0.1287711401952441,0.34338970718731776,0.3933958332964709,0.3933958332964708,0.10825203484697317,0.06551422322458987,0.06551422322458988,0.06551422322458987,Granite Energy,Norway,Lithium Hydroxide,South America,RES-1211,Spodumene,Middle East & Africa,Serbia,Granite Energy,CNV-1257
+7,0.2678883515234231,0.42142212265279505,0.5023350512730481,0.6314259563704068,0.8278778232506382,1.0150492427196094,1.0524568876981486,1.1279329047368114,1.1786398488015692,1.3587308810455967,1.437088679626002,Granite Energy,Norway,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1257
+8,0.0,0.0,0.0,0.0,0.6514285714285714,1.737142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,1.9901142857142857,Pioneer Materials,Vietnam,Lithium Carbonate,Europe,RES-1089,Petalite,Europe,Vietnam,Pioneer Materials,CNV-1249
+9,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Northstar Minerals,Germany,Lithium Carbonate,Germany,RES-1185,Petalite,Germany,Germany,Northstar Minerals,CNV-1120
+10,0.0,0.0,0.0,0.3017142857142857,0.8045714285714286,0.9217371428571429,0.9217371428571429,0.9217371428571429,0.9217371428571429,0.9217371428571429,0.9217371428571429,Cobalt Bay Mining,South Korea,Lithium Hydroxide,South America,RES-1242,Lepidolite,South America,South Korea,Cobalt Bay Mining,CNV-1102
+11,0.0,0.0,0.0,0.0,0.21857142857142858,0.582857142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,0.6677357142857143,Atlas Energy,Indonesia,Lithium Carbonate,Europe,RES-1129,Petalite,Europe,Indonesia,Atlas Energy,CNV-1245
+12,0.20313808646325895,0.31956179916799615,0.38091757442505997,0.5013515495928276,0.713312672576335,0.8922875488140968,0.9251710528255658,0.8889081032051368,0.914681886496574,1.0544412924606388,1.1152507577948714,Atlas Holdings,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1110
+13,0.0444364564138379,0.06990414356799918,0.08332571940548186,0.10967065147343105,0.1560371471260733,0.1951879013030837,0.20238116780559254,0.1944486475761237,0.2000866626711256,0.23065903272576477,0.24396110326762813,Atlas Holdings,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1091
+14,0.0,0.0,0.0,0.0,0.11732116325268668,0.2788398590044053,0.28911595400798934,0.2777837822516052,0.28583808953017936,0.3295129038939496,0.3485158618108972,Vantage Materials,Zambia,Lithium Carbonate,Asia Pacific,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1256
+15,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Cascade Mining,Japan,Lithium Carbonate,Middle East & Africa,RES-1054,Petalite,Middle East & Africa,Japan,Cascade Mining,CNV-1176
+16,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Granite Industries,Germany,Lithium Carbonate,Germany,RES-1137,Petalite,Germany,Germany,Granite Industries,CNV-1162
+17,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Golden Peak Industries,Indonesia,Lithium Carbonate,Europe,RES-1179,Petalite,Europe,Indonesia,Golden Peak Industries,CNV-1068
+18,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Sierra Holdings,Germany,Lithium Carbonate,Germany,RES-1265,Brine,Germany,Germany,Sierra Holdings,CNV-1082
+19,0.0,1.9285714285714286,7.071428571428571,11.034642857142858,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,11.78357142857143,Sierra Holdings,Germany,Lithium Carbonate,Germany,RES-1196,Brine,Germany,Germany,Sierra Holdings,CNV-1202
+20,0.2618571428571429,0.2618571428571429,0.519,0.9475714285714288,1.0474285714285714,1.0474285714285714,1.0474285714285714,1.0474285714285714,1.0474285714285714,1.0474285714285714,1.0474285714285714,Frontier Industries,Germany,Lithium Carbonate,Germany,RES-1159,Petalite,Germany,Germany,Frontier Industries,CNV-1161
+21,0.0,0.0,0.0,0.0,0.0,0.0,0.6,1.5999999999999999,1.833,1.833,1.833,Summit Holdings,Indonesia,Lithium Carbonate,Europe,RES-1181,Petalite,Europe,Indonesia,Summit Holdings,CNV-1092
+22,0.0,0.0,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Summit Holdings,Indonesia,Lithium Carbonate,Europe,RES-1002,Petalite,Europe,Indonesia,Summit Holdings,CNV-1078
+23,2.6185714285714283,3.0471428571428567,4.1899999999999995,5.070714285714286,6.522857142857142,8.665714285714285,9.165000000000001,9.165000000000001,10.450714285714286,12.593571428571428,13.092857142857143,Ironclad Holdings,Indonesia,Lithium Carbonate,Europe,RES-1018,Petalite,Europe,Indonesia,Ironclad Holdings,CNV-1206
+24,0.3516828121895175,0.5532413648095934,0.6594635507233855,0.8679648702325828,1.23492256439778,1.5447728188844052,1.6017023852042604,1.5389221536738928,1.5835430159971935,1.825501487572481,1.9307778744323707,Summit Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1100
+25,0.2831237080081675,0.4453892575903947,0.5309038693549276,0.6987587222450035,0.9941795374032668,1.2436257711596475,1.2894571548756322,1.238915668842159,1.2748378793045998,1.4696275513670154,1.5543807436766015,Summit Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1229
+26,1.5732570280245157,1.5732570280245157,1.8021360282826742,2.183601028712938,2.2724823738131894,2.2724823738131894,2.2724823738131894,2.2724823738131894,2.2724823738131894,2.2724823738131894,2.2724823738131894,Highland Minerals,South Korea,Lithium Hydroxide,South America,RES-1189,Spodumene,Europe,Spain,Highland Minerals,CNV-1177
+27,0.0,0.0,0.10287400339768883,0.04732471007421115,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Highland Minerals,South Korea,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1177
+28,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Horizon Materials,Germany,Lithium Carbonate,Germany,RES-1117,Petalite,Germany,Germany,Horizon Materials,CNV-1136
+29,0.0,0.0,4.285714285714286,11.428571428571429,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,13.092857142857143,Horizon Materials,Germany,Lithium Carbonate,Germany,RES-1076,Petalite,Germany,Germany,Horizon Materials,CNV-1083
+30,0.0,0.0,4.192620131770044,5.156502827131708,6.118221775650894,6.118221775650894,6.118221775650894,6.118221775650894,6.118221775650894,6.118221775650894,6.118221775650894,Summit Materials,United States,Lithium Hydroxide,Oceania,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1154
+31,0.2399568646347246,0.576157309618351,0.16443758289784607,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Summit Materials,United States,Lithium Hydroxide,Oceania,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1154
+32,0.0,0.0,0.0,0.0,0.0,0.0,0.04285714285714286,0.1142857142857143,0.13092857142857142,0.13092857142857142,0.13092857142857142,Falcon Energy,Japan,Lithium Hydroxide,Middle East & Africa,RES-1227,Petalite,Middle East & Africa,Japan,Falcon Energy,CNV-1056
+33,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,0.34041428571428567,Cobalt Bay Materials,Germany,Lithium Carbonate,Germany,RES-1033,Spodumene,Germany,Germany,Cobalt Bay Materials,CNV-1216
+34,0.0,0.0,0.0,1.1813855467870593,2.9134389407861394,2.9134389407861394,2.9134389407861394,2.9134389407861394,2.9134389407861394,2.9134389407861394,2.9134389407861394,Amber Metals,Germany,Lithium Hydroxide,Germany,RES-1101,Spodumene,Bolivia,Bolivia,Crescent Energy,CNV-1132
+35,0.0,0.0,0.6105908309828181,0.6995081207446908,0.6995081207446907,0.6995081207446907,0.6995081207446907,0.6995081207446907,0.6995081207446907,0.6995081207446907,0.6995081207446907,Amber Metals,Germany,Lithium Hydroxide,Germany,RES-1250,Spodumene,Middle East & Africa,Serbia,Cascade Materials,CNV-1132
+36,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Metals,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1132
+37,0.4163741628383239,0.32100535106210465,0.35019296254256516,0.3992221786407759,0.41119536270587115,0.41134417086026714,0.41134417086026714,0.41134417086026714,0.41134417086026714,0.41134417086026714,0.41134417086026714,Frontier Group,Germany,Lithium Carbonate,Germany,Spot Market Lep,Brine,Spot Market Lep,Spot Market Lep,Spot Market Lep,CNV-1164
+38,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Amber Resources,Germany,Lithium Carbonate,Germany,RES-1194,Petalite,Germany,Germany,Amber Resources,CNV-1095
+39,0.07617678242372208,0.11983567468799854,0.14284409040939752,0.1880068310973104,0.26749225221612555,0.33460783080528617,0.34693914480958704,0.3333405387019261,0.3430057074362152,0.3954154846727395,0.41821903417307654,Amber Corp,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1104
+40,0.0,0.0,0.0,0.12508220924732277,0.2947830294218692,0.2947830294218691,0.2947830294218691,0.2947830294218691,0.2947830294218691,0.2947830294218692,0.2947830294218691,Vantage Energy,Austria,Lithium Carbonate,Oceania,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1224
+41,0.06682173896817736,0.1997261244799975,0.23807348401566245,0.2844650398094333,0.34898441418722037,0.43654691621382147,0.4526349948714139,0.4348935405043154,0.4475032262832935,0.5158797689870172,0.5456304750274096,Vantage Energy,Austria,Lithium Carbonate,Oceania,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1224
+42,0.0,0.0,0.0,0.5503617206882202,1.297045329456224,1.2970453294562243,1.297045329456224,1.297045329456224,1.297045329456224,1.2970453294562243,1.297045329456224,Vantage Energy,Austria,Lithium Hydroxide,Oceania,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1140
+43,0.29401565145998043,0.8787949477119888,1.0475233296689148,1.2516461751615062,1.5355314224237695,1.9208064313408144,1.991593977434221,1.9135315782189877,1.9690141956464908,2.269870983542875,2.400774090120602,Vantage Energy,Austria,Lithium Hydroxide,Oceania,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1140
+44,0.0,0.0,0.0,0.3302170324129321,0.7782271976737345,0.7782271976737345,0.7782271976737344,0.7782271976737344,0.7782271976737344,0.7782271976737345,0.7782271976737344,Vantage Energy,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1050
+45,0.33517784266437767,0.5272769686271933,0.6285139978013489,0.7509877050969038,0.9213188534542617,1.1524838588044886,1.1949563864605326,1.1481189469313924,1.1814085173878943,1.3619225901257253,1.4404644540723608,Vantage Energy,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1050
+46,0.0,0.0,0.0,0.31270552311830696,0.7369575735546728,0.7369575735546728,0.7369575735546727,0.7369575735546727,0.7369575735546726,0.7369575735546728,0.7369575735546727,Vantage Energy,Germany,Lithium Carbonate,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1057
+47,0.3174032600988425,0.49931531119999367,0.5951837100391562,0.7111625995235832,0.872461035468051,1.0913672905345537,1.1315874871785347,1.0872338512607884,1.1187580657082334,1.2896994224675429,1.3640761875685237,Vantage Energy,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1057
+48,0.0,0.0,0.0,0.16510851620646605,0.38911359883686725,0.38911359883686725,0.3891135988368672,0.3891135988368672,0.3891135988368672,0.38911359883686725,0.3891135988368672,Vantage Energy,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1157
+49,0.16758892133218883,0.26363848431359665,0.31425699890067443,0.3754938525484519,0.46065942672713084,0.5762419294022443,0.5974781932302663,0.5740594734656962,0.5907042586939472,0.6809612950628626,0.7202322270361804,Vantage Energy,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1157
+50,0.0,0.0,0.0,0.0,0.9536625010756593,2.543100002868425,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Cascade Materials,France,Lithium Hydroxide,Middle East & Africa,RES-1171,Spodumene,North America,Australia,Highland Corp,CNV-1065
+51,0.0,0.0,0.0,0.0,1.5385755017353973,4.102868004627727,4.7003481578016375,4.7003481578016375,4.7003481578016375,4.7003481578016375,4.7003481578016375,Cascade Materials,France,Lithium Hydroxide,Middle East & Africa,RES-1052,Spodumene,Middle East & Africa,Japan,Cascade Materials,CNV-1065
+52,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Cascade Materials,France,Lithium Hydroxide,Middle East & Africa,RES-1250,Spodumene,Middle East & Africa,Serbia,Cascade Materials,CNV-1065
+53,0.0,0.0,0.0,0.4353842404358766,0.3582675772923845,0.0,0.0,0.0,0.0,0.0,0.0,Cascade Materials,France,Lithium Hydroxide,Middle East & Africa,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1065
+54,4.16374162838324,3.2100535106210475,3.5019296254256527,3.99222178640776,4.111953627058712,4.113441708602672,4.113441708602672,4.113441708602672,4.113441708602672,4.113441708602672,4.113441708602672,Stonebridge Holdings,Germany,Lithium Carbonate,Germany,Spot Market Lep,Brine,Spot Market Lep,Spot Market Lep,Spot Market Lep,CNV-1180
+55,1.285646537886755,1.8832313928976812,2.054465380249716,2.3421034480258855,2.4123461278744442,2.4132191357135677,2.4132191357135677,2.4132191357135677,2.4132191357135677,2.4132191357135677,2.4132191357135677,Stonebridge Holdings,Germany,Lithium Hydroxide,Germany,Spot Market Lep,Brine,Spot Market Lep,Spot Market Lep,Spot Market Lep,CNV-1059
+56,0.0,0.0,0.0,0.0,0.72269836563655,1.7176535314671366,1.7809542766892137,1.7111480986698884,1.7607626315059053,2.0297994879867294,2.1468577087551273,Blue Horizon Mining,Kazakhstan,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1197
+57,0.0,0.11100567760572501,0.2514055991205397,0.3308920227312662,0.47078636390038114,0.5889097822173038,0.6106128948648734,0.5866793481153902,0.6036900450877389,0.6959312530240217,0.7360655001446149,Redwood Metals,South Korea,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1038
+58,0.12315246491835072,0.19373434074559764,0.23093127949519254,0.3039443769406517,0.8454163023988606,1.5224656301640525,1.5785731088836212,1.5166994510937644,1.5606759688347789,1.7991404552609647,1.9028966054874985,Golden Peak Holdings,India,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1006
+59,0.0002329921617385587,1.7089980656217125,2.597166885977425,3.821249088797399,4.7763233145731,5.960558772767826,6.392448843144842,6.359044894305663,6.3054533182759105,6.290152742470453,6.232385647717891,Amber Energy,Bolivia,Lithium Hydroxide,Bolivia,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1201
+60,3.591139939541165e-05,0.2951449756446884,0.40841227785816603,0.48384290985767003,0.5651530093126297,0.5651530093126297,0.5651530093126297,0.5651530093126297,0.5651530093126297,0.5651530093126297,0.5651530093126296,Amber Energy,Bolivia,Lithium Hydroxide,Bolivia,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1201
+61,0.0,0.0,0.0,0.0,0.4099169940512922,1.0931119841367793,1.2522964168266977,1.2522964168266977,1.2522964168266977,1.2522964168266977,1.2522964168266975,Amber Energy,Bolivia,Lithium Hydroxide,Bolivia,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1201
+62,0.0,0.0,0.0,0.015151239943075347,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Bolivia,Lithium Hydroxide,Bolivia,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1201
+63,0.708529163846957,0.8408121465872724,0.9232470931594896,1.2895700879827796,1.5733238305917128,1.96341171717273,2.105676571364415,2.094673290119992,2.077020192091783,2.0719801730329697,2.0529516565753525,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1190
+64,0.10920656556144683,0.14520875448503245,0.14518337284332491,0.1632841328413284,0.186161748047756,0.18616174804775604,0.186161748047756,0.18616174804775604,0.186161748047756,0.186161748047756,0.186161748047756,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1190
+65,0.0,0.0,0.0,0.0,0.13502690936722367,0.3600717583125966,0.41250720811686836,0.4125072081168684,0.41250720811686836,0.4125072081168683,0.4125072081168683,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1190
+66,0.0,0.0,0.0,0.00511314111496169,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Spodumene Concentrate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1190
+67,4.427084065194354,3.0776866879801124,2.4617763144995033,2.3730587575470037,2.2637230126513055,2.8249875842798002,3.0296804886033057,3.0138487949091295,2.9884492404918954,2.981197581992993,2.9538190539594327,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1037
+68,0.6823524999122167,0.5315183093758625,0.38712170465843626,0.30047443331576174,0.2678524439387712,0.2678524439387712,0.26785244393877117,0.2678524439387712,0.2678524439387712,0.2678524439387712,0.26785244393877117,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1037
+69,0.0,0.0,0.0,0.0,0.19427883574788865,0.5180768953277031,0.5935218432097998,0.5935218432097998,0.5935218432097998,0.5935218432097997,0.5935218432097997,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1037
+70,0.0,0.0,0.0,0.009409170090486405,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1037
+71,3.209700020110384,2.231367391906427,1.784823457109897,1.7204675992215779,1.6412319468598695,2.0481568844291638,2.1965622025682405,2.1850839955090873,2.16666895095081,2.1614113935864143,2.14156156451477,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1195
+72,0.49471543807119084,0.38535846692078735,0.2806688386597872,0.2178439641539273,0.19419689846326574,0.1941968984632658,0.19419689846326568,0.19419689846326574,0.19419689846326574,0.19419689846326568,0.19419689846326568,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1195
+73,0.0,0.0,0.0,0.0,0.14085496769974812,0.3756132471993284,0.43031192632273046,0.4303119263227305,0.4303119263227305,0.43031192632273035,0.43031192632273035,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1195
+74,0.0,0.0,0.0,0.0068216483156026434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1195
+75,0.9741402282289139,0.6772174118438424,0.5416918462671662,0.5220729266603408,0.498111989679233,0.6216132356125386,0.6666540773038483,0.6631704547926461,0.6575815101571819,0.6559858476034262,0.6499614475345712,Amber Energy,Germany,Lithium Hydroxide,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1199
+76,0.15014556087221612,0.11695584713964956,0.0851826665531773,0.06610437532946757,0.0589385331355193,0.05893853313551932,0.0589385331355193,0.05893853313551931,0.05893853313551931,0.05893853313551931,0.05893853313551929,Amber Energy,Germany,Lithium Hydroxide,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1199
+77,0.0,0.0,0.0,0.0,0.04274931910225368,0.11399818427267652,0.13059916985738504,0.13059916985738504,0.13059916985738504,0.130599169857385,0.13059916985738498,Amber Energy,Germany,Lithium Hydroxide,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1199
+78,0.0,0.0,0.0,0.002070017419907009,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1199
+79,0.8634689514030984,0.6002792940189619,0.4801506774135656,0.4627464577216657,0.4415218927891025,0.5509922628988443,0.5909160513006606,0.5878282003017332,0.5828742111079924,0.5814598304755555,0.5761198575850565,Amber Energy,Germany,Lithium Metal,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1264
+80,0.13308764615939556,0.10366858873464271,0.07550513328057284,0.05859251449657354,0.0522425744559279,0.052242574455927906,0.0522425744559279,0.0522425744559279,0.0522425744559279,0.0522425744559279,0.05224257445592789,Amber Energy,Germany,Lithium Metal,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1264
+81,0.0,0.0,0.0,0.0,0.03789260382515001,0.10104694353373336,0.11576190468583328,0.11576190468583328,0.11576190468583328,0.11576190468583326,0.11576190468583325,Amber Energy,Germany,Lithium Metal,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1264
+82,0.0,0.0,0.0,0.0018347881676448491,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Metal,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1264
+83,0.24370980117853233,0.1694258341996314,0.13552013183340245,0.1305182316650852,0.12461735020437159,0.15551481570215625,0.1667831056828092,0.16591157515262084,0.16451333643253102,0.16411413455947946,0.1626069538677736,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1222
+84,0.037563323767600576,0.029259941666604488,0.021310946953987907,0.016526093832366893,0.01474520585021602,0.014745205850216023,0.014745205850216022,0.014745205850216022,0.01474520585021602,0.01474520585021602,0.014745205850216018,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1222
+85,0.0,0.0,0.0,0.0,0.010694998273369371,0.02851999539565167,0.03267321972514344,0.03267321972514344,0.032673219725143435,0.032673219725143435,0.032673219725143435,Amber Energy,Germany,Spodumene Concentrate,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1222
+86,0.0,0.0,0.0,0.0005175043549767522,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Spodumene Concentrate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1222
+87,0.0002329921617385587,0.00016197498489448517,1.2957331151681242,2.3730587575470037,2.2637230126513055,2.8249875842798002,3.0296804886033057,3.0138487949091295,2.9884492404918954,2.981197581992993,2.9538190539594327,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1066,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1021
+88,3.591139939541165e-05,2.7973175589488053e-05,0.20375791633540444,0.30047443331576174,0.2678524439387712,0.2678524439387712,0.26785244393877117,0.2678524439387712,0.2678524439387712,0.2678524439387712,0.26785244393877117,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1226,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1021
+89,0.0,0.0,0.0,0.0,0.19427883574788865,0.5180768953277031,0.5935218432097998,0.5935218432097998,0.5935218432097998,0.5935218432097997,0.5935218432097997,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1133,Spodumene,Bolivia,Bolivia,Amber Energy,CNV-1021
+90,0.0,0.0,0.0,0.009409170090486405,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1021
+91,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Amber Energy,Germany,Lithium Carbonate,Germany,RES-1144,Spodumene,Germany,Germany,Amber Energy,CNV-1081
+92,1.7348923451596832,1.3375222960921036,1.4591373439273554,1.6634257443365665,1.7133140112744634,1.7139340452511136,1.7139340452511136,1.7139340452511136,1.7139340452511136,1.7139340452511136,1.7139340452511136,Pioneer Mining,Germany,Lithium Carbonate,Germany,Spot Market Lep,Brine,Spot Market Lep,Spot Market Lep,Spot Market Lep,CNV-1175
+93,0.0,0.0,0.0,0.0,0.0,0.058834285714285714,0.15689142857142854,0.17973874285714286,0.17973874285714286,0.17973874285714286,0.17973874285714286,Ironclad Energy,Finland,Lithium Hydroxide,South America,RES-1223,Brine,South America,Finland,Ironclad Energy,CNV-1043
+94,0.0,0.0,0.0,0.1451280801452923,0.39232196991698426,0.4907581518477532,0.5088440790540611,0.48889945676282515,0.5030750375731158,0.5799427108533513,0.6133879167871791,Copper Creek Group,Finland,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1111
+95,0.0,0.08571428571428572,0.2285714285714286,0.3475714285714286,0.4904285714285715,0.5237142857142858,0.5237142857142858,0.5237142857142858,0.5237142857142858,0.5237142857142858,0.5237142857142858,Pioneer Resources,Indonesia,Lithium Carbonate,Europe,RES-1168,Petalite,Europe,Indonesia,Pioneer Resources,CNV-1032
+96,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6921428571428571,1.8457142857142856,2.1144964285714285,Ironclad Industries,Japan,Lithium Carbonate,Middle East & Africa,RES-1107,Hard Rock,Middle East & Africa,Japan,Ironclad Industries,CNV-1221
+97,0.253922608079074,0.39945224895999526,0.4761469680313252,0.6266894369910345,0.8916408407204187,1.115359436017621,1.156463816031957,1.1111351290064209,1.1433523581207174,1.3180516155757986,1.3940634472435889,Silverridge Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1253
+98,0.2004652169045321,0.5991783734399929,0.7142204520469878,0.9400341554865518,1.3374612610806282,1.6730391540264316,1.7346957240479355,1.6667026935096312,1.715028537181076,1.9770774233636979,2.0910951708653833,Silverridge Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1166
+99,0.0,0.0,0.0,0.07683185840707965,0.20488495575221238,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,0.23472132743362834,Cobalt Bay Corp,Poland,Lithium Hydroxide,South America,RES-1215,Spodumene,South America,Poland,Cobalt Bay Corp,CNV-1049
+100,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6921428571428571,1.8457142857142856,2.1144964285714285,Frontier Holdings,Japan,Lithium Carbonate,Middle East & Africa,RES-1158,Hard Rock,Middle East & Africa,Japan,Frontier Holdings,CNV-1221
+101,0.0,0.0,0.0,0.0,0.0,0.04285714285714286,0.1142857142857143,0.13092857142857142,0.13092857142857142,0.13092857142857142,0.13092857142857142,Frontier Metals,Indonesia,Lithium Carbonate,Europe,RES-1010,Petalite,Europe,Indonesia,Frontier Metals,CNV-1230
+102,0.0,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Titan Corp,Indonesia,Lithium Carbonate,Europe,RES-1212,Petalite,Europe,Indonesia,Titan Corp,CNV-1008
+103,0.0,0.0,0.0,0.21428571428571427,0.5714285714285714,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Titan Corp,Japan,Lithium Carbonate,Middle East & Africa,RES-1231,Pegmatite,Middle East & Africa,Japan,Titan Corp,CNV-1035
+104,0.0,0.34285714285714286,0.9142857142857144,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Silverridge Minerals,Sweden,Lithium Carbonate,Europe,RES-1063,Petalite,Europe,Sweden,Silverridge Minerals,CNV-1084
+105,0.0,0.0,0.0,0.0,0.46247142857142853,1.233257142857143,2.4579885,4.199885642857143,4.605747677142857,4.605747677142857,4.605747677142857,Northstar Metals,Japan,Lithium Carbonate,Middle East & Africa,RES-1145,Petalite,Middle East & Africa,Japan,Northstar Metals,CNV-1051
+106,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.19714285714285712,0.5257142857142858,0.6022714285714287,Titan Resources,Morocco,Lithium Carbonate,Europe,RES-1255,Hard Rock,Europe,Morocco,Titan Resources,CNV-1024
+107,0.126961304039537,0.19972612447999763,0.23807348401566245,0.31334471849551726,0.44582042036020936,0.5576797180088106,0.5782319080159787,0.5555675645032104,0.5716761790603588,0.6590258077878992,0.6970317236217944,Crescent Corp,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1086
+108,0.055862973777396276,0.08787949477119895,0.10475233296689147,0.1378716761380276,0.19616098495849213,0.2453790759238766,0.2544220395270306,0.24444972838141257,0.2515375187865579,0.2899713554266756,0.30669395839358954,Crescent Corp,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1234
+109,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Pioneer Energy,Germany,Lithium Carbonate,Germany,RES-1103,Petalite,Germany,Germany,Pioneer Energy,CNV-1150
+110,0.0,0.0,0.11314285714285714,0.3017142857142857,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,0.34565142857142855,Blue Horizon Corp,DR Congo,Lithium Hydroxide,South America,RES-1060,Spodumene,South America,DR Congo,Blue Horizon Corp,CNV-1105
+111,0.0,0.0,0.0,0.0,0.14791403286978508,0.39443742098609375,0.4518773704171935,0.4518773704171935,0.4518773704171935,0.4518773704171935,0.4518773704171935,Atlas Materials,United Kingdom,Lithium Hydroxide,South America,RES-1172,Brine,South America,United Kingdom,Atlas Materials,CNV-1044
+112,0.0,0.022865031875643288,0.05255654803631082,0.06021009534409858,0.06021009534409859,0.09360947651663727,0.09360947651663722,0.09360947651663724,0.09360947651663724,0.09360947651663723,0.09360947651663724,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1058
+113,0.03592552264808362,0.03660355774207351,0.031550742820422584,0.031550742820422584,0.03155074282042259,0.03155074282042259,0.03155074282042258,0.03155074282042259,0.0315507428204226,0.03155074282042259,0.0315507428204226,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1058
+114,0.1705427672655301,0.17376148122454182,0.14977516242661956,0.14977516242661956,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1058
+115,0.02077784513756756,0.08551199393740515,0.1018158300385461,0.1322396510149578,0.23734888504751678,0.28317675598626657,0.29361267880487485,0.28210425369051084,0.2902838325176081,0.3346379370347799,0.35393645481583996,Pioneer Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1058
+116,0.0,0.023474766058993773,0.05395805598394577,0.06181569788660788,0.06181569788660789,0.09610572922374758,0.09610572922374756,0.09610572922374759,0.09610572922374758,0.09610572922374758,0.09610572922374758,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1174
+117,0.036883536585365854,0.03757965261519546,0.03239209596230052,0.03239209596230052,0.03239209596230053,0.03239209596230053,0.03239209596230051,0.032392095962300534,0.03239209596230053,0.03239209596230053,0.032392095962300534,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1174
+118,0.17509057439261094,0.17839512072386296,0.1537691667579961,0.1537691667579961,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1174
+119,0.0213319210079027,0.08779231377573594,0.10453091883957401,0.13576604170869003,0.24367818864878385,0.2907281361459003,0.30144235023967153,0.2896270337889245,0.29802473471807767,0.3435616153557074,0.3633747602775957,Pioneer Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1174
+120,0.0,0.038108386459405494,0.08759424672718473,0.100350158906831,0.100350158906831,0.15601579419439546,0.1560157941943954,0.15601579419439543,0.15601579419439543,0.15601579419439543,0.15601579419439543,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1028
+121,0.05987587108013938,0.061005929570122526,0.05258457136737099,0.05258457136737099,0.05258457136737099,0.052584571367371005,0.052584571367370984,0.052584571367371,0.052584571367371,0.05258457136737099,0.052584571367371,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1028
+122,0.2842379454425502,0.28960246870756984,0.2496252707110327,0.2496252707110327,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Carbonate,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1028
+123,0.034629741895945934,0.1425199898956753,0.16969305006424357,0.2203994183582631,0.39558147507919467,0.47196125997711114,0.48935446467479154,0.47017375615085155,0.4838063875293469,0.5577298950579667,0.5898940913597334,Pioneer Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1028
+124,0.0,0.06707076016855366,0.1541658742398451,0.17661627967602253,0.1766162796760226,0.274587797782136,0.27458779778213593,0.274587797782136,0.27458779778213593,0.27458779778213593,0.274587797782136,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1209
+125,0.20022491289198605,0.10737043604341565,0.09254884560657294,0.09254884560657294,0.09254884560657295,0.09254884560657295,0.09254884560657292,0.09254884560657296,0.09254884560657295,0.09254884560657295,0.09254884560657296,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1209
+126,0.9504916895598878,0.5097003449253228,0.4393404764514175,0.4393404764514175,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1209
+127,0.11580185690004322,0.25083518221638845,0.29865976811306866,0.38790297631054305,0.6962233961393827,0.8306518175597154,0.861263857827633,0.8275058108254988,0.8514992420516504,0.9816046153020211,1.0382136007931309,Pioneer Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1209
+128,0.0,0.1006061402528305,0.23124881135976763,0.26492441951403384,0.26492441951403384,0.411881696673204,0.4118816966732039,0.411881696673204,0.4118816966732039,0.4118816966732039,0.411881696673204,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1114
+129,0.15807229965156794,0.16105565406512348,0.1388232684098594,0.13882326840985942,0.13882326840985942,0.13882326840985942,0.1388232684098594,0.13882326840985942,0.13882326840985942,0.13882326840985942,0.13882326840985945,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1114
+130,0.7503881759683324,0.7645505173879842,0.6590107146771261,0.6590107146771264,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1114
+131,0.09142251860529726,0.3762527733245827,0.44798965216960296,0.5818544644658145,1.0443350942090739,1.2459777263395733,1.2918957867414496,1.241258716238248,1.2772488630774759,1.4724069229530319,1.557320401189696,Pioneer Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1114
+132,0.0,0.03530040008871246,0.1541658742398451,0.17661627967602253,0.1766162796760226,0.274587797782136,0.27458779778213593,0.274587797782136,0.27458779778213593,0.27458779778213593,0.274587797782136,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1235
+133,0.0,0.05651075581232402,0.09254884560657294,0.09254884560657294,0.09254884560657295,0.09254884560657295,0.09254884560657292,0.09254884560657296,0.09254884560657295,0.09254884560657295,0.09254884560657296,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1235
+134,0.0,0.26826333943438047,0.4393404764514175,0.4393404764514175,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1235
+135,0.0,0.13201851695599395,0.29865976811306866,0.38790297631054305,0.6962233961393827,0.8306518175597154,0.861263857827633,0.8275058108254988,0.8514992420516504,0.9816046153020211,1.0382136007931309,Pioneer Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1235
+136,0.0,0.019274820730257197,0.08417807110482449,0.09643650270946458,0.09643650270946458,0.149931178220814,0.14993117822081395,0.149931178220814,0.149931178220814,0.149931178220814,0.149931178220814,Pioneer Industries,Germany,Lithium Metal,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1096
+137,0.0,0.030856157008888285,0.050533773084043505,0.05053377308404351,0.05053377308404352,0.05053377308404353,0.050533773084043505,0.05053377308404353,0.05053377308404353,0.05053377308404352,0.05053377308404353,Pioneer Industries,Germany,Lithium Metal,Germany,RES-1152,Spodumene,Germany,Germany,Pioneer Industries,CNV-1096
+138,0.0,0.14647788022524977,0.23988988515330237,0.2398898851533024,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Pioneer Industries,Germany,Lithium Metal,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1096
+139,0.0,0.0720851106788126,0.16307502111173802,0.2118038410422908,0.38015379755110607,0.4535547708380037,0.4702696405524746,0.4518369796609683,0.46493793841570236,0.5359784291507059,0.5668882217967036,Pioneer Industries,Germany,Lithium Metal,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1096
+140,0.0,0.0,0.0,0.0,0.17657142857142857,0.4708571428571429,0.5394257142857143,0.5394257142857143,0.5394257142857143,0.5394257142857143,0.5394257142857143,Northstar Corp,Japan,Lithium Hydroxide,Middle East & Africa,RES-1263,Hard Rock,Middle East & Africa,Japan,Northstar Corp,CNV-1167
+141,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Ironclad Corp,Germany,Lithium Carbonate,Germany,RES-1020,Petalite,Germany,Germany,Ironclad Corp,CNV-1203
+142,0.5846902159715519,1.2982198091199846,1.5474776461018058,2.0367406702208624,2.89783273234136,3.624918167057267,3.7585074021038616,3.6111891692708684,3.7158951638923328,4.283667750621346,4.530706203541665,Redwood Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1098
+143,0.11172594755479255,0.1757589895423979,0.20950466593378295,0.2757433522760552,0.3923219699169841,0.49075815184775307,0.5088440790540611,0.48889945676282526,0.5030750375731158,0.5799427108533514,0.6133879167871792,Redwood Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1251
+144,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,0.19639285714285712,Horizon Energy,Spain,Lithium Carbonate,Europe,RES-1130,Spodumene,Europe,Spain,Horizon Energy,CNV-1254
+145,1.8262024685891405,2.675044592184207,2.918274687854711,3.326851488673133,3.4266280225489267,3.427868090502227,3.427868090502227,3.427868090502227,3.427868090502227,3.427868090502227,3.427868090502227,Cascade Energy,Germany,Lithium Carbonate,Germany,Spot Market Lep,Brine,Spot Market Lep,Spot Market Lep,Spot Market Lep,CNV-1118
+146,0.126961304039537,0.19972612447999763,0.2380734840156626,0.31334471849551726,0.44582042036020925,0.5576797180088106,0.5782319080159785,0.5555675645032104,0.5716761790603588,0.6590258077878992,0.6970317236217946,Cascade Energy,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1003
+147,0.11172594755479255,0.1757589895423979,0.20950466593378309,0.2757433522760552,0.3923219699169841,0.4907581518477532,0.508844079054061,0.48889945676282515,0.5030750375731158,0.5799427108533513,0.6133879167871792,Cascade Energy,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1093
+148,0.0,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.5235714285714284,1.8807142857142856,1.9639285714285712,1.9639285714285712,1.9639285714285712,1.9639285714285712,1.9639285714285712,Cascade Resources,Indonesia,Lithium Carbonate,Europe,RES-1225,Petalite,Europe,Indonesia,Cascade Resources,CNV-1022
+149,0.0,0.0,0.0,0.0,0.9,2.4,2.7495000000000003,2.7495000000000003,2.7495000000000003,2.7495000000000003,2.7495000000000003,Cascade Resources,Indonesia,Lithium Carbonate,Europe,RES-1040,Petalite,Europe,Indonesia,Cascade Resources,CNV-1241
+150,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,5.213571428571429,7.356428571428572,7.855714285714286,7.855714285714286,Cascade Resources,Japan,Lithium Carbonate,Middle East & Africa,RES-1135,Hard Rock,Middle East & Africa,Japan,Cascade Resources,CNV-1207
+151,0.0,0.04204760515368371,0.09522939360626503,0.1253378873982069,0.1783281681440838,0.2230718872035242,0.2312927632063914,0.2222270258012842,0.22867047162414345,0.26361032311515964,0.2788126894487178,Falcon Materials,Serbia,Lithium Carbonate,Middle East & Africa,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1258
+152,0.0,0.0,0.0,0.4824308948530888,1.45671947039307,1.4567194703930701,1.45671947039307,1.4567194703930701,1.45671947039307,1.45671947039307,1.4567194703930697,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1079
+153,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1079
+154,0.0,0.0,0.0,0.3593381761067392,0.5462698013974012,0.5462698013974012,0.5462698013974012,0.5462698013974012,0.5462698013974012,0.5462698013974012,0.5462698013974012,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1079
+155,0.0,0.0,0.0,0.676416138972071,1.695951331724398,2.1214767588899424,2.1996596155306216,2.113441887926126,2.174720880683697,2.507008753559531,2.6515875584510193,Silverridge Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1079
+156,0.0,0.0,0.0,0.4020257457109073,1.2139328919942252,1.2139328919942252,1.2139328919942252,1.2139328919942252,1.2139328919942247,1.2139328919942252,1.2139328919942247,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1240
+157,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1240
+158,0.0,0.0,0.0,0.29944848008894936,0.45522483449783435,0.45522483449783435,0.45522483449783435,0.45522483449783435,0.45522483449783435,0.45522483449783435,0.4552248344978343,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1240
+159,0.0,0.0,0.0,0.5636801158100592,1.4132927764369982,1.7678972990749522,1.8330496796088516,1.7612015732717716,1.8122674005697477,2.0891739612996094,2.2096562987091826,Silverridge Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1240
+160,0.0,0.0,0.0,0.381924458425362,0.6069664459971126,0.6069664459971126,0.6069664459971126,0.6069664459971126,0.6069664459971124,0.6069664459971126,0.6069664459971124,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1123
+161,0.7635219293094709,0.582687788157228,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1123
+162,0.890108639650659,0.6865908983055004,0.4991214442583387,0.28447605608450194,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891715,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1123
+163,0.12461701056658789,0.25260202222169587,0.4362044997533435,0.5354961100195562,0.7066463882184991,0.8839486495374761,0.9165248398044258,0.8806007866358858,0.9061337002848738,1.0445869806498047,1.1048281493545913,Silverridge Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1123
+164,0.0,0.0,0.0,0.381924458425362,0.6069664459971126,0.6069664459971126,0.6069664459971126,0.6069664459971126,0.6069664459971124,0.6069664459971126,0.6069664459971124,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1260
+165,0.40185364700498477,0.582687788157228,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1017,Spodumene,Bolivia,Bolivia,Silverridge Mining,CNV-1260
+166,0.4684782313950837,0.6865908983055004,0.4991214442583387,0.28447605608450194,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891718,0.22761241724891715,Silverridge Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1260
+167,0.06558790029820416,0.25260202222169587,0.4362044997533435,0.5354961100195562,0.7066463882184991,0.8839486495374761,0.9165248398044258,0.8806007866358858,0.9061337002848738,1.0445869806498047,1.1048281493545913,Silverridge Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1260
+168,0.0,0.34285714285714286,0.9142857142857144,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,1.0474285714285716,Atlas Resources,Germany,Lithium Carbonate,Germany,RES-1218,Petalite,Germany,Germany,Atlas Resources,CNV-1210
+169,0.0,0.0,2.142857142857143,5.714285714285714,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,6.546428571428572,Atlas Resources,Germany,Lithium Carbonate,Germany,RES-1128,Petalite,Germany,Germany,Atlas Resources,CNV-1131
+170,0.0,0.0,0.0,0.0,0.0,0.873990857142857,2.330642285714286,2.6700420685714286,2.6700420685714286,2.6700420685714286,2.6700420685714286,Vantage Metals,Serbia,Lithium Hydroxide,Middle East & Africa,RES-1122,Spodumene,Middle East & Africa,Serbia,Vantage Metals,CNV-1031
+171,0.0,0.0,0.8571428571428571,2.2857142857142856,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,2.6185714285714283,Atlas Industries,Indonesia,Lithium Carbonate,Europe,RES-1149,Petalite,Europe,Indonesia,Atlas Industries,CNV-1143
+172,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.27600857142857144,0.7360228571428573,0.843206185714286,Sierra Metals,Japan,Lithium Carbonate,Middle East & Africa,RES-1012,Hard Rock,Middle East & Africa,Japan,Sierra Metals,CNV-1153
+173,0.0,0.0,0.15085714285714286,0.4022857142857144,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,0.4608685714285715,Stonebridge Energy,Japan,Lithium Hydroxide,Middle East & Africa,RES-1232,Lepidolite,Middle East & Africa,Japan,Stonebridge Energy,CNV-1045
+174,0.0,0.0,0.5245714285714286,1.398857142857143,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,1.6025657142857141,Meridian Corp,Indonesia,Lithium Carbonate,Europe,RES-1080,Petalite,Europe,Indonesia,Meridian Corp,CNV-1119
+175,0.11760626058399218,0.3515179790847958,0.41900933186756617,0.5514867045521104,0.7846439398339685,0.9815163036955064,1.0176881581081223,0.9777989135256503,1.0061500751462316,1.1598854217067025,1.2267758335743582,Blue Horizon Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1186
+176,20.68642857142857,27.561000000000003,34.428942857142864,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,Titan Holdings,Vietnam,Lithium Carbonate,Europe,RES-1191,Petalite,Europe,Vietnam,Titan Holdings,CNV-1046
+177,20.68642857142857,27.561000000000003,34.428942857142864,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,35.92680000000001,Titan Holdings,Vietnam,Lithium Carbonate,Europe,RES-1191,Petalite,Germany,Germany,Titan Holdings,CNV-1046
+178,0.0,0.0,0.0,1.0714285714285714,2.857142857142857,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Titan Holdings,Bolivia,Lithium Hydroxide,Bolivia,RES-1015,Spodumene,Bolivia,Bolivia,Titan Holdings,CNV-1147
+179,0.0,0.0,0.0,0.8860391600902944,2.4278657839884494,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Falcon Mining,Germany,Lithium Hydroxide,Germany,RES-1101,Spodumene,Bolivia,Bolivia,Crescent Energy,CNV-1005
+180,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Falcon Mining,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1005
+181,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,1.2464400000000002,Summit Corp,Germany,Lithium Carbonate,Germany,RES-1138,Spodumene,Germany,Germany,Summit Corp,CNV-1016
+182,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Summit Corp,Germany,Lithium Carbonate,Germany,RES-1188,Spodumene,Germany,Germany,Summit Corp,CNV-1233
+183,0.0,0.0,0.0,0.19165865992414668,0.5110897597977245,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,0.5855172060682682,Blue Horizon Resources,Italy,Lithium Hydroxide,South America,RES-1148,Clay,South America,Italy,Blue Horizon Resources,CNV-1173
+184,0.0,0.0,0.0,0.0,0.7039269795161198,1.6730391540264316,1.7346957240479355,1.6667026935096316,1.715028537181076,1.9770774233636974,2.0910951708653833,Granite Resources,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1126
+185,0.0,0.0,0.0,1.0714285714285714,2.857142857142857,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,3.273214285714286,Cobalt Bay Industries,Bolivia,Lithium Hydroxide,Bolivia,RES-1014,Spodumene,Bolivia,Bolivia,Cobalt Bay Industries,CNV-1147
+186,0.0,0.0,0.504,1.3439999999999999,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,1.5397200000000002,Falcon Minerals,Indonesia,Lithium Carbonate,Europe,RES-1055,Petalite,Europe,Indonesia,Falcon Minerals,CNV-1119
+187,0.0,0.013857216115697115,0.0314389401692231,0.0323371676863876,0.032340394545621494,0.05028006327603103,0.050280063276031024,0.050280063276031024,0.050280063276031024,0.050280063276031024,0.050280063276031024,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1074
+188,0.0,0.0,0.0,0.055513744670035496,0.18096799642829708,0.25738893799195167,0.27017154000320664,0.27017154000320664,0.27017154000320664,0.27017154000320664,0.27017154000320664,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1074
+189,0.0,0.0,0.0,0.04550973066201124,0.1072641349888662,0.1072641349888662,0.10726413498886618,0.10726413498886618,0.10726413498886618,0.10726413498886618,0.10726413498886618,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1074
+190,0.21431393024929718,0.2402426138009381,0.28840641323752064,0.2765127553809105,0.2765403480181706,0.2765403480181707,0.2765403480181706,0.2765403480181706,0.2765403480181706,0.2765403480181706,0.2765403480181706,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1074
+191,0.21431393024929718,0.2402426138009381,0.28840641323752064,0.2765127553809105,0.2765403480181706,0.2765403480181707,0.2765403480181706,0.2765403480181706,0.2765403480181706,0.2765403480181706,0.2765403480181706,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1074
+192,0.04675940296348303,0.03949016577487901,0.03359789987857163,0.0301650278597357,0.030168037965618618,0.03016803796561862,0.030168037965618618,0.030168037965618618,0.030168037965618618,0.030168037965618618,0.030168037965618618,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1074
+193,0.15505576377977598,0.2564426461221503,0.15860673008246362,0.17513903626945276,0.20782426154092826,0.20782426154092826,0.20782426154092823,0.20782426154092823,0.20782426154092823,0.20782426154092823,0.20782426154092823,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1074
+194,0.04259082407070187,0.043478762896165625,0.050040671212832497,0.044797359826699294,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1074
+195,0.0,0.08141114467972056,0.1847037734941857,0.18998086015752716,0.18997907602375277,0.29536312397553754,0.2953631239755376,0.2953631239755376,0.2953631239755376,0.2953631239755376,0.2953631239755376,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1214
+196,0.0,0.0,0.0,0.32614324993645855,1.0630709128430327,1.511994930966798,1.5870845194952217,1.5870845194952217,1.5870845194952217,1.5870845194952217,1.5870845194952217,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1214
+197,0.0,0.0,0.0,0.267369667639316,0.63010799781448,0.63010799781448,0.6301079978144802,0.6301079978144802,0.6301079978144802,0.6301079978144802,0.6301079978144802,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1214
+198,0.6626812316919058,1.4114253560805115,1.694387677770434,1.6245124378628493,1.6244971818654563,1.6244971818654566,1.624497181865457,1.624497181865457,1.624497181865457,1.624497181865457,1.624497181865457,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1214
+199,0.6626812316919058,1.4114253560805115,1.694387677770434,1.6245124378628493,1.6244971818654563,1.6244971818654566,1.624497181865457,1.624497181865457,1.624497181865457,1.624497181865457,1.624497181865457,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1214
+200,0.14458499600550676,0.2320047239274142,0.19738766178660838,0.17721953867594722,0.17721787438532255,0.17721787438532255,0.17721787438532258,0.17721787438532258,0.17721787438532258,0.17721787438532258,0.17721787438532258,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1214
+201,0.4794487432664125,1.506600545967633,0.9318145392344739,1.028941838083035,1.2208342457655552,1.2208342457655552,1.2208342457655554,1.2208342457655554,1.2208342457655554,1.2208342457655554,1.2208342457655554,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1214
+202,0.1316953112712492,0.25543773201497305,0.29398894337539094,0.2631844889818583,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1214
+203,0.0,0.035098869766732835,0.0982466880288222,0.10105364901996126,0.10105469160019155,0.15711114101684157,0.1571111410168416,0.1571111410168416,0.1571111410168416,0.1571111410168416,0.1571111410168416,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1106
+204,0.0,0.0,0.0,0.17348045209386093,0.5654743958911307,0.8042684733912437,0.8442105310638287,0.8442105310638287,0.8442105310638287,0.8442105310638287,0.8442105310638287,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1106
+205,0.0,0.0,0.0,0.14221790831878514,0.335170434169262,0.335170434169262,0.33517043416926207,0.33517043416926207,0.33517043416926207,0.33517043416926207,0.33517043416926207,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1106
+206,0.4018386192174322,0.6085092520615867,0.9012700413672521,0.8641023605653455,0.8641112755926287,0.8641112755926288,0.8641112755926289,0.8641112755926289,0.8641112755926289,0.8641112755926289,0.8641112755926289,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1106
+207,0.4018386192174322,0.6085092520615867,0.9012700413672521,0.8641023605653455,0.8641112755926287,0.8641112755926288,0.8641112755926289,0.8641112755926289,0.8641112755926289,0.8641112755926289,0.8641112755926289,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1106
+208,0.08767388055653068,0.10002443304821329,0.10499343712053635,0.09426571206167407,0.09426668461010494,0.09426668461010497,0.09426668461010497,0.09426668461010497,0.09426668461010497,0.09426668461010497,0.09426668461010497,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1106
+209,0.2907295570870799,0.649542228664657,0.4956460315076988,0.54730948834204,0.6493927162029453,0.6493927162029453,0.6493927162029454,0.6493927162029454,0.6493927162029454,0.6493927162029454,0.6493927162029454,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1106
+210,0.079857795132566,0.11012712970410374,0.15637709754010157,0.13999174945843532,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1106
+211,0.0,0.12350243863115055,0.2801995542582009,0.2882050070049295,0.28820010063705004,0.4480687233344609,0.4480687233344609,0.4480687233344609,0.4480687233344609,0.4480687233344609,0.4480687233344609,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1004
+212,0.0,0.0,0.0,0.4947662493716914,1.6126888838399067,2.2937109727434333,2.4076226067171693,2.4076226067171693,2.4076226067171693,2.4076226067171693,2.4076226067171693,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1004
+213,0.0,0.0,0.0,0.4056054745251752,0.9558799431135167,0.9558799431135165,0.9558799431135165,0.9558799431135165,0.9558799431135165,0.9558799431135165,0.9558799431135165,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1004
+214,1.9100729033468613,2.141162295500861,2.570422157979403,2.464419932332365,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1004
+215,1.9100729033468613,2.141162295500861,2.570422157979403,2.464419932332365,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,2.464377978339535,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1004
+216,0.4167431789120425,0.3519561024686092,0.29944128266776976,0.26884581079989445,0.2688412340006766,0.2688412340006766,0.26884123400067655,0.26884123400067655,0.26884123400067655,0.26884123400067655,0.26884123400067655,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1004
+217,1.3819344946872534,2.285545083563665,1.413582481859957,1.560926660751498,1.8520173897824386,1.8520173897824386,1.8520173897824386,1.8520173897824386,1.8520173897824386,1.8520173897824386,1.8520173897824386,Frontier Group,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1004
+218,0.3795907195301304,0.3875044743120762,0.44598748218436973,0.39925646945545745,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1004
+219,0.0,0.018187596151852465,0.04126360897210531,0.04244253258838373,0.04244543823011709,0.06599051588497375,0.06599051588497376,0.06599051588497376,0.06599051588497376,0.06599051588497376,0.06599051588497376,Frontier Group,Germany,Lithium Metal,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1146
+220,0.0,0.0,0.0,0.07286178987942159,0.23751305517283142,0.33781239908008276,0.3545890386885922,0.3545890386885922,0.3545890386885922,0.3545890386885922,0.3545890386885922,Frontier Group,Germany,Lithium Metal,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1146
+221,0.0,0.0,0.0,0.05973152149388976,0.14077976722127733,0.14077976722127733,0.14077976722127733,0.14077976722127733,0.14077976722127733,0.14077976722127733,0.14077976722127733,Frontier Group,Germany,Lithium Metal,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1146
+222,0.2812870334522026,0.31531843061373127,0.37853341737424584,0.3629229914374451,0.36294783736735553,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,Frontier Group,Germany,Lithium Metal,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1146
+223,0.2812870334522026,0.31531843061373127,0.37853341737424584,0.3629229914374451,0.36294783736735553,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,0.36294783736735564,Frontier Group,Germany,Lithium Metal,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1146
+224,0.06137171638957147,0.0518308425795287,0.04409724359062527,0.0395915990659031,0.03959430953098425,0.03959430953098425,0.03959430953098425,0.03959430953098425,0.03959430953098425,0.03959430953098425,0.03959430953098425,Frontier Group,Germany,Lithium Metal,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1146
+225,0.20351068996095595,0.33658097303532225,0.2081713332332335,0.22986998510365675,0.2727607989912248,0.27276079899122485,0.27276079899122485,0.27276079899122485,0.27276079899122485,0.27276079899122485,0.27276079899122485,Frontier Group,Germany,Lithium Metal,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1146
+226,0.055900456592796195,0.057065876301217386,0.06567838096684266,0.05879653477254282,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Metal,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1146
+227,0.0,0.03464304028924279,0.07859735042305775,0.080842919215969,0.08084460423120036,0.12569023579895613,0.12569023579895613,0.12569023579895613,0.12569023579895613,0.12569023579895613,0.12569023579895613,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1019
+228,0.0,0.0,0.0,0.13878436167508873,0.4523842784020619,0.6434215512149812,0.6753755336930575,0.6753755336930575,0.6753755336930575,0.6753755336930575,0.6753755336930575,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1019
+229,0.0,0.0,0.0,0.11377432665502811,0.2681391697044397,0.2681391697044397,0.26813916970443974,0.26813916970443974,0.26813916970443974,0.26813916970443974,0.26813916970443974,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1019
+230,0.5357848256232429,0.6006065345023452,0.7210160330938017,0.6912818884522763,0.6912962968942586,0.6912962968942586,0.6912962968942588,0.6912962968942588,0.6912962968942588,0.6912962968942588,0.6912962968942588,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1019
+231,0.5357848256232429,0.6006065345023452,0.7210160330938017,0.6912818884522763,0.6912962968942586,0.6912962968942586,0.6912962968942588,0.6912962968942588,0.6912962968942588,0.6912962968942588,0.6912962968942588,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1019
+232,0.11689850740870757,0.09872541443719753,0.08399474969642909,0.07541256964933925,0.07541414147937367,0.07541414147937368,0.07541414147937368,0.07541414147937368,0.07541414147937368,0.07541414147937368,0.07541414147937368,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1019
+233,0.38763940944943986,0.6411066153053758,0.39651682520615905,0.43784759067363194,0.519519641302352,0.519519641302352,0.5195196413023521,0.5195196413023521,0.5195196413023521,0.5195196413023521,0.5195196413023521,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1019
+234,0.10647706017675466,0.10869690724041406,0.12510167803208125,0.11199339956674823,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1019
+235,0.0,0.0,0.10341756634612861,0.20210729803992253,0.20210512844514755,0.3142156671062688,0.31421566710626886,0.31421566710626886,0.31421566710626886,0.31421566710626886,0.31421566710626886,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1115
+236,0.0,0.0,0.0,0.34696090418772185,1.130924983336474,1.6085030842725554,1.6883855179176843,1.6883855179176843,1.6883855179176843,1.6883855179176843,1.6883855179176843,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1075,Spodumene,North America,Netherlands,Frontier Group,CNV-1115
+237,0.0,0.0,0.0,0.2844358166375703,0.6703267564933736,0.6703267564933734,0.6703267564933736,0.6703267564933736,0.6703267564933736,0.6703267564933736,0.6703267564933736,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1238,Spodumene,North America,China,Amber Mining,CNV-1115
+238,0.0,0.0,0.9487053067023705,1.728204721130691,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1048,Spodumene,Bolivia,Bolivia,Frontier Group,CNV-1115
+239,0.0,0.0,0.9487053067023705,1.728204721130691,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,1.7281861690844786,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1039,Spodumene,Bolivia,Bolivia,Redwood Group,CNV-1115
+240,0.0,0.0,0.11051940749530142,0.18853142412334814,0.18852940026376133,0.18852940026376133,0.18852940026376133,0.18852940026376133,0.18852940026376133,0.18852940026376133,0.18852940026376133,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1124,Spodumene,Germany,Germany,Frontier Group,CNV-1115
+241,0.0,0.0,0.5217326647449461,1.09461897668408,1.2987580907059113,1.2987580907059113,1.2987580907059113,1.2987580907059113,1.2987580907059113,1.2987580907059113,1.2987580907059113,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1115
+242,0.0,0.0,0.16460747109484375,0.27998349891687063,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Frontier Group,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1115
+243,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,0.6546428571428571,Frontier Group,Germany,Lithium Carbonate,Germany,RES-1183,Petalite,Germany,Germany,Frontier Group,CNV-1095
+244,0.0,0.0,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Frontier Group,Indonesia,Lithium Carbonate,Europe,RES-1169,Petalite,Europe,Indonesia,Frontier Group,CNV-1088
+245,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,4.570714285714286,5.642142857142858,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,Frontier Group,Indonesia,Lithium Carbonate,Europe,RES-1142,Petalite,Europe,Indonesia,Frontier Group,CNV-1022
+246,0.0,0.0,0.0,0.375,1.0,1.1456250000000001,1.258125,1.445625,1.4893125,1.4893125,1.4893125,Frontier Group,South Africa,Lithium Carbonate,Middle East & Africa,RES-1247,Hard Rock,Middle East & Africa,South Africa,Frontier Group,CNV-1127
+247,0.0,0.0,0.7457142857142857,1.9885714285714287,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,2.2781571428571428,Frontier Group,Indonesia,Lithium Carbonate,Europe,RES-1187,Petalite,Europe,Indonesia,Frontier Group,CNV-1009
+248,0.32606084905097815,0.3295636311866401,0.2395782932440025,0.2946573044075261,0.34961267289433673,0.34961267289433673,0.34961267289433673,0.34961267289433673,0.34961267289433673,0.34961267289433673,0.34961267289433673,Golden Peak Group,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1217
+249,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Golden Peak Group,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1217
+250,0.42857142857142855,1.1428571428571428,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Redwood Holdings,Germany,Lithium Carbonate,Germany,RES-1178,Petalite,Germany,Germany,Redwood Holdings,CNV-1001
+251,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Summit Mining,Germany,Lithium Carbonate,Germany,RES-1108,Spodumene,Germany,Germany,Summit Mining,CNV-1071
+252,0.3006978253567981,0.8987675601599887,1.071330678070481,1.4100512332298278,2.0061918916209422,2.509558731039647,2.602043586071903,2.500054040264447,2.572542805771614,2.965616135045547,3.1366427562980754,Granite Mining,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1184
+253,0.08820469543799413,0.26363848431359665,0.31425699890067443,0.41361502841408276,0.5884829548754763,0.7361372277716297,0.7632661185810915,0.7333491851442376,0.7546125563596734,0.8699140662800271,0.9200818751807686,Granite Mining,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1090
+254,0.126961304039537,0.19972612447999763,0.23807348401566245,0.31334471849551726,0.44582042036020936,0.5576797180088106,0.5782319080159787,0.5555675645032104,0.5716761790603588,0.6590258077878992,0.6970317236217944,Golden Peak Resources,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1134
+255,0.055862973777396276,0.08787949477119895,0.10475233296689147,0.1378716761380276,0.19616098495849213,0.2453790759238766,0.2544220395270306,0.24444972838141257,0.2515375187865579,0.2899713554266756,0.30669395839358954,Golden Peak Resources,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1113
+256,0.0,0.0,0.5513280682467976,1.3787167613802758,1.961609849584921,2.453790759238766,2.5442203952703055,2.4444972838141257,2.5153751878655783,2.8997135542667567,3.0669395839358953,Vantage Mining,Mexico,Lithium Hydroxide,North America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1041
+257,0.0,0.0,0.7542857142857143,2.0114285714285716,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,2.3043428571428572,Titan Mining,Germany,Lithium Hydroxide,Germany,RES-1073,Petalite,Germany,Germany,Titan Mining,CNV-1204
+258,0.0,0.0,0.06,0.16,0.1833,0.1833,0.1833,0.1833,0.1833,0.1833,0.1833,Ironclad Minerals,Ghana,Lithium Hydroxide,North America,RES-1116,Brine,North America,Ghana,Ironclad Minerals,CNV-1198
+259,0.0,0.0,0.26438686909107795,0.6611573560255412,0.9406810869600418,1.17670420499859,1.2200693259137148,1.1722475611017742,1.2062367378173569,1.3905444544324672,1.470736936841987,Sierra Mining,Finland,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1261
+260,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6348614409565035,1.3905444544324672,1.470736936841987,Sierra Mining,Finland,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1252
+261,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6348614409565035,1.3905444544324672,1.470736936841987,Sierra Mining,Finland,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1011
+262,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.6348614409565035,1.3905444544324672,1.470736936841987,Sierra Mining,Finland,Lithium Hydroxide,South America,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1070
+263,0.0,0.0,0.0,0.0,0.1791428571428571,0.4777142857142857,0.5472814285714286,0.5472814285714286,0.5472814285714286,0.5472814285714286,0.5472814285714286,Horizon Minerals,Japan,Lithium Carbonate,Middle East & Africa,RES-1259,Salar Brine,Middle East & Africa,Japan,Horizon Minerals,CNV-1244
+264,0.0,0.0,0.0,1.1742857142857142,3.1314285714285717,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,3.5874428571428574,Pioneer Corp,Japan,Lithium Hydroxide,Middle East & Africa,RES-1200,Hard Rock,Middle East & Africa,Japan,Pioneer Corp,CNV-1023
+265,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,1.3092857142857142,Stonebridge Metals,Germany,Lithium Carbonate,Germany,RES-1237,Petalite,Germany,Germany,Stonebridge Metals,CNV-1013
+266,0.0,0.0,0.0,0.375,1.0,1.1456250000000001,1.183125,1.245625,1.2601875,1.2601875,1.2601875,Horizon Resources,South Africa,Lithium Carbonate,Middle East & Africa,RES-1067,Hard Rock,Middle East & Africa,South Africa,Horizon Resources,CNV-1127
+267,0.0,2.142857142857143,10.0,17.975,19.639285714285716,19.639285714285716,19.639285714285716,19.639285714285716,19.639285714285716,19.639285714285716,19.639285714285716,Meridian Mining,Germany,Lithium Carbonate,Germany,RES-1099,Brine,Germany,Germany,Meridian Mining,CNV-1064
+268,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Meridian Mining,Germany,Lithium Carbonate,Germany,RES-1000,Spodumene,Germany,Germany,Meridian Mining,CNV-1125
+269,0.0,0.0,0.0,0.0,0.15170670037926676,0.4045512010113782,0.46346396965866005,0.46346396965866005,0.46346396965866005,0.46346396965866005,0.46346396965866005,Vantage Minerals,Serbia,Lithium Hydroxide,Middle East & Africa,RES-1097,Salar Brine,Middle East & Africa,Serbia,Vantage Minerals,CNV-1170
+270,0.0,0.0,0.0,0.0,0.6857142857142857,1.8285714285714287,2.0948571428571428,2.0948571428571428,2.0948571428571428,2.0948571428571428,2.0948571428571428,Frontier Energy,Japan,Lithium Carbonate,Middle East & Africa,RES-1042,Lepidolite,Middle East & Africa,Japan,Frontier Energy,CNV-1151
+271,0.0,0.0,0.0,0.0,0.07542857142857143,0.2011428571428572,0.23043428571428579,0.23043428571428579,0.23043428571428579,0.23043428571428579,0.23043428571428579,Atlas Group,South Korea,Lithium Hydroxide,South America,RES-1030,Clay,South America,South Korea,Atlas Group,CNV-1192
+272,1.6497,2.7211285714285713,4.506842857142857,4.922914285714286,4.922914285714286,4.922914285714286,4.922914285714286,4.922914285714286,4.922914285714286,4.922914285714286,4.922914285714286,Silverridge Mining,Indonesia,Lithium Carbonate,Europe,RES-1205,Petalite,Europe,Indonesia,Silverridge Mining,CNV-1068
+273,0.0,0.0,0.6428571428571429,1.7142857142857142,3.2496428571428573,5.3925,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,5.891785714285715,Silverridge Mining,Indonesia,Lithium Carbonate,Europe,RES-1109,Petalite,Europe,Indonesia,Silverridge Mining,CNV-1087
+274,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Stonebridge Minerals,Germany,Lithium Carbonate,Germany,RES-1246,Petalite,Germany,Germany,Stonebridge Minerals,CNV-1053
+275,0.0,0.0,1.7142857142857142,4.571428571428571,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,5.237142857142857,Stonebridge Minerals,Germany,Lithium Carbonate,Germany,RES-1248,Petalite,Germany,Germany,Stonebridge Minerals,CNV-1163
+276,0.0,0.0,1.2857142857142858,3.4285714285714284,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,3.927857142857143,Stonebridge Minerals,Germany,Lithium Carbonate,Germany,RES-1208,Petalite,Germany,Germany,Stonebridge Minerals,CNV-1069
+277,0.9595043928213836,0.9698120849470901,0.7050652473847521,0.8671596345927197,0.7676817813265113,0.6249004512957795,0.6249004512957796,0.6249004512957795,0.6249004512957795,0.6249004512957796,0.6249004512957795,Northstar Holdings,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1236
+278,0.0,0.0,0.04296708309277741,0.019126645984238997,0.05989139939140792,0.13359052342348723,0.13851373962069735,0.13308456331188173,0.13694333418129792,0.1578676788288382,0.16697188331303076,Northstar Holdings,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1236
+279,1.3706587334530091,1.3853833437200873,1.007236067692503,1.2387994779895994,1.096688259037873,0.8927149304225422,0.8927149304225424,0.8927149304225422,0.8927149304225421,0.8927149304225422,0.8927149304225422,Northstar Holdings,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1155
+280,0.0,0.0,0.06138154727539629,0.02732377997748428,0.08555914198772559,0.19084360489069607,0.1978767708867105,0.1901208047312596,0.1956333345447113,0.22552525546976884,0.23853126187575824,Northstar Holdings,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1155
+281,0.00014426468092337748,0.00014581447676245528,0.0,0.0,0.6903363988469982,1.0676870567853605,1.0676870567853605,1.0676870567853605,1.0676870567853605,1.0676870567853605,1.0676870567853605,Northstar Holdings,Germany,Lithium Hydroxide,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1027
+282,0.0,0.0,0.0,0.0,0.05385722832490517,0.2282489514492725,0.23666061798050572,0.2273844824585865,0.2339774681154747,0.26972820554184357,0.28528338920340685,Northstar Holdings,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1027
+283,0.2057214349967362,0.20793144386326118,0.15108541015387544,0.18581992169843992,0.164503238855681,0.13390723956338133,0.13390723956338133,0.13390723956338133,0.1339072395633813,0.13390723956338133,0.1339072395633813,Northstar Holdings,Germany,Lithium Carbonate,Germany,RES-1165,Spodumene,Bolivia,Bolivia,Falcon Holdings,CNV-1029
+284,0.0,0.0,0.009207232091309444,0.004098566996622642,0.012833871298158838,0.028626540733604405,0.029681515633006573,0.028518120709688937,0.02934500018170669,0.033828788320465326,0.03577968928136373,Northstar Holdings,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1029
+285,0.0,0.4498271149304479,1.1995389731478614,1.3742218361125187,1.3742218361125187,0.0,0.0,0.0,0.0,0.0,0.0,Highland Resources,France,Lithium Hydroxide,Middle East & Africa,RES-1213,Spodumene,Bolivia,Bolivia,Cascade Corp,CNV-1239
+286,0.0,0.0,0.0,1.1813855467870593,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,2.91343894078614,Highland Resources,France,Lithium Hydroxide,Middle East & Africa,RES-1101,Spodumene,Bolivia,Bolivia,Crescent Energy,CNV-1239
+287,0.0,0.778503309503093,1.4654179943587633,1.678819489787258,1.678819489787258,1.678819489787258,1.678819489787258,1.678819489787258,1.678819489787258,1.678819489787258,1.678819489787258,Highland Resources,France,Lithium Hydroxide,Middle East & Africa,RES-1250,Spodumene,Middle East & Africa,Serbia,Cascade Materials,CNV-1239
+288,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Highland Resources,France,Lithium Hydroxide,Middle East & Africa,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1239
+289,0.8751666667142858,0.7083095238571427,0.7142857142857143,0.7142857142857143,0.2976190475714286,0.0,0.0,0.0,0.0,0.0,0.0,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1034
+290,0.7736666667142859,4.810142857142857,5.213047618571429,7.46052381,7.147142857142858,7.143142857142856,7.143142857142856,7.143142857142856,7.143142857142856,7.143142857142856,7.143142857142856,Horizon Industries,Bolivia,Lithium Hydroxide,Bolivia,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1026
+291,0.0,0.0,0.0,0.0,3.0813148142857143,5.974409391428572,7.3869206342857145,7.147482142857143,7.143142857142856,7.143142857142856,7.143142857142856,Horizon Industries,Bolivia,Lithium Hydroxide,Bolivia,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1182
+292,8.077142857142857,8.857142857142858,10.285714285714286,11.571428571428571,11.857142857142858,12.714285714285714,12.714285714285714,12.714285714285714,13.428571428571429,14.0,15.428571428571429,Horizon Industries,Vietnam,Lithium Carbonate,Europe,RES-1121,Petalite,Europe,Vietnam,Horizon Industries,CNV-1141
+293,0.0,0.0,0.0,0.0,0.0,0.0,3.7256666671428573,6.368095238571429,6.451238095714286,7.242238095714286,7.147285714285715,Horizon Industries,Ireland,Lithium Hydroxide,South America,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1243
+294,0.0,0.0,0.0,0.0,3.7256666671428573,4.455418367142857,2.288346938571429,3.120918367142857,3.4214659857142853,3.3698469385714285,2.218428571428572,Horizon Industries,Japan,Lithium Hydroxide,Middle East & Africa,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1219
+295,0.0,0.0,0.0,0.0,0.0,3.7755102042857147,7.346938775714285,7.346938775714285,7.346938775714285,7.346938775714285,8.496285714285714,Horizon Industries,Japan,Lithium Hydroxide,Middle East & Africa,RES-1047,Spodumene,Middle East & Africa,Japan,Horizon Industries,CNV-1219
+296,0.0,0.0,1.5546666671428573,5.660571428571429,6.440285714285714,6.965238095714286,7.190047618571429,7.143142857142856,7.143142857142856,7.143142857142856,7.143142857142856,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1007,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1156
+297,0.9783333332857141,2.8604047614285717,2.904771428571429,3.273838095714286,6.171114285714286,7.206047618571428,7.167357142857143,7.143142857142856,7.143142857142856,7.143142857142856,7.143142857142856,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1007,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1077
+298,0.5627142857142856,0.6642857142857144,0.7124285714285714,1.054142857142857,1.0222857142857145,1.0212857142857144,0.9989999999999999,0.9884285714285713,0.9778571428571429,0.9662857142857142,0.9555714285714286,Horizon Industries,Japan,Lithium Carbonate,Middle East & Africa,RES-1025,Petalite,Middle East & Africa,Japan,Horizon Industries,CNV-1139
+299,1.7666666671428572,2.0380952385714286,1.8142857142857143,2.12247619,0.0,0.37294047614285714,0.0,0.0,0.0,0.0,0.0,Horizon Industries,Germany,Lithium Carbonate,Germany,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1112
+300,0.0,0.0,0.0,1.9262857142857146,2.521008402857143,2.521008402857143,2.521008402857143,2.521008402857143,2.521008402857143,2.521008402857143,2.521008402857143,Horizon Industries,Germany,Lithium Carbonate,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1112
+301,0.0,1.042857142857143,1.042857142857143,0.9657142857142856,1.9549320728571427,4.19257493,4.69372374,4.622134454285714,4.622134454285714,4.622134454285714,4.622134454285714,Horizon Industries,Germany,Lithium Carbonate,Germany,RES-1007,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1112
+302,0.5,1.2339464285714286,1.0,1.25,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1220
+303,0.0,5.694625,5.0,5.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1007,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1220
+304,4.994166667142857,4.336547618571428,1.77755102,1.7673469385714287,2.4792516999999994,2.3673469385714285,2.3673469385714285,2.3673469385714285,2.3673469385714285,2.3673469385714285,2.3673469385714285,Horizon Industries,Germany,Lithium Hydroxide,Germany,RES-1085,Spodumene,Bolivia,Bolivia,Horizon Industries,CNV-1072
+305,0.0,0.0,2.5510204085714285,3.0612244900000003,3.0612244900000003,3.0612244900000003,3.0612244900000003,3.0612244900000003,3.0612244900000003,3.0612244900000003,3.0612244900000003,Horizon Industries,Germany,Lithium Hydroxide,Germany,Spot Market Spod,Spodumene,Spot Market Spod,Spot Market Spod,Spot Market Spod,CNV-1072
diff --git a/lithium-supply-chain/pages/__init__.py b/lithium-supply-chain/pages/__init__.py
new file mode 100644
index 0000000..380a2a4
--- /dev/null
+++ b/lithium-supply-chain/pages/__init__.py
@@ -0,0 +1 @@
+from . import supply_sankey
diff --git a/lithium-supply-chain/pages/supply_sankey.py b/lithium-supply-chain/pages/supply_sankey.py
new file mode 100644
index 0000000..d52b6b5
--- /dev/null
+++ b/lithium-supply-chain/pages/supply_sankey.py
@@ -0,0 +1,199 @@
+import dash_mantine_components as dmc
+from dash import (
+ ALL,
+ MATCH,
+ Input,
+ Output,
+ State,
+ callback,
+ ctx,
+ dash,
+ dcc,
+ html,
+)
+
+from constants import DEFAULT_SANKEY_NODES
+from utils import chart_utils, data_utils, ui_utils
+
+DEFAULT_FORECAST_VERSION = data_utils.get_forecast_version_values()[0][
+ "value"
+]
+
+
+def layout():
+ return html.Div(
+ [
+ html.Div(
+ ui_utils.sidebar_controls_supply_sankey(
+ data_utils.get_supply_data(DEFAULT_FORECAST_VERSION),
+ data_utils.supply_filter_values(),
+ ),
+ id="controls-filters-sankey",
+ className="flex-row",
+ style={
+ "flexGrow": "1",
+ "height": "100%",
+ "minHeight": "0px",
+ },
+ ),
+ html.Div(
+ [
+ dmc.Card(
+ html.Div(
+ [
+ html.Div(
+ [
+ *ui_utils.get_default_nodes(),
+ ],
+ id="node-row",
+ className="node-container flex-row",
+ style={
+ "alignItems": "flex-start",
+ "minWidth": "0px",
+ "flex": "1 1 0%",
+ },
+ ),
+ dmc.Space(w=10),
+ html.Div(
+ dmc.Button(
+ "+ Node",
+ radius="md",
+ variant="outline",
+ id="add-node-btn",
+ ),
+ style={
+ "margin-left": "auto",
+ "marginTop": "16px",
+ "flexShrink": "0",
+ },
+ ),
+ dmc.Space(w=20),
+ ],
+ className="flex-row",
+ style={
+ "height": "inherit",
+ "alignItems": "flex-start",
+ "minWidth": "0px",
+ },
+ ),
+ shadow="sm",
+ radius="md",
+ withBorder=True,
+ style={
+ "marginBottom": "20px",
+ "minWidth": "0px",
+ "overflow": "visible",
+ "position": "relative",
+ "zIndex": 2,
+ },
+ ),
+ dmc.Card(
+ dcc.Graph(
+ id="sankey-diagram-div",
+ config={
+ "displaylogo": False,
+ "responsive": True,
+ },
+ style={"flexGrow": "1", "width": "100%"},
+ ),
+ shadow="sm",
+ radius="md",
+ withBorder=True,
+ style={
+ "flexGrow": "1",
+ "display": "flex",
+ "flexDirection": "column",
+ "minWidth": "0px",
+ },
+ ),
+ ],
+ className="flex-column",
+ style={
+ "width": "calc(100vw - 300px)",
+ "height": "100%",
+ "minHeight": "0px",
+ "minWidth": "0px",
+ },
+ ),
+ ],
+ className="page-div flex-row",
+ style={"height": "calc(100vh - 68px)"},
+ )
+
+
+@callback(
+ Output("node-row", "children"),
+ Output("add-node-btn", "disabled"),
+ Input("add-node-btn", "n_clicks"),
+ Input({"type": "delete-single-node", "index": ALL}, "n_clicks"),
+ State("node-row", "children"),
+ prevent_initial_call=True,
+)
+def add_remove_node_selector_cards(add_node, delete_single_node, node_div):
+ if ctx.triggered_id == "add-node-btn":
+ node_div.append(
+ # get id number of last node in the node_div to make the next node with that id + 1
+ ui_utils.get_node_card(
+ int(node_div[-1]["props"]["id"]["index"]) + 1, None
+ )
+ )
+ if len(node_div) == 8:
+ return node_div, True
+ return node_div, False
+ if ctx.triggered_id["type"] == "delete-single-node":
+ # Adding a node registers a new delete button matching this ALL
+ # pattern, which re-fires this callback with that button's n_clicks
+ # still None (nobody clicked it) - ignore that phantom trigger
+ # instead of treating it as a real delete.
+ if not ctx.triggered[0]["value"]:
+ return dash.no_update, dash.no_update
+ node_to_remove = str(ctx.triggered_id["index"])
+ current_nodes = [
+ node_div[i]["props"]["id"]["index"]
+ for i in range(0, len(node_div))
+ ]
+ # get index of node to delete and remove it from node_div
+ node_div.pop(current_nodes.index(node_to_remove))
+ return node_div, False
+ return dash.no_update, False
+
+
+@callback(
+ Output("sankey-diagram-div", "figure"),
+ Input({"type": "node-selector", "index": ALL}, "value"),
+ Input({"type": "global-filters", "index": ALL}, "value"),
+ Input("year-filter-selection", "value"),
+ Input("view-top-data", "value"),
+)
+def update_sankey_diagram(nodes, filters, year, view_top):
+ df = data_utils.get_supply_data(DEFAULT_FORECAST_VERSION)
+ spot_df = data_utils.get_spot_data(DEFAULT_FORECAST_VERSION)
+ # case: same node selected twice
+ if len(set(nodes)) != len(nodes):
+ return dash.no_update
+ # case: a node has been added, but no selection has been made yet
+ if not all(nodes):
+ nodes = [node for node in nodes if node]
+ for column, filter in zip(
+ data_utils.supply_filter_values().values(), filters
+ ):
+ if not filter:
+ # no filter selected means use all the data
+ continue
+ df = df[df[column].isin(filter)]
+ df = df[[str(year)] + nodes]
+ if view_top != "view_all":
+ view_top = int(view_top)
+ return chart_utils.generate_sankey(nodes, df, year, spot_df, view_top)
+
+
+@callback(
+ Output({"type": "node-selector", "index": MATCH}, "error"),
+ Input({"type": "node-selector", "index": MATCH}, "value"),
+ State({"type": "node-selector", "index": ALL}, "value"),
+)
+def select_value(new_node, nodes):
+ node_already_selected = new_node is not None and nodes.count(new_node) >= 2
+ return (
+ "This node has already been selected!" if node_already_selected else ""
+ )
diff --git a/lithium-supply-chain/requirements.txt b/lithium-supply-chain/requirements.txt
new file mode 100644
index 0000000..c48a276
--- /dev/null
+++ b/lithium-supply-chain/requirements.txt
@@ -0,0 +1,10 @@
+dash_mantine_components==2.8.0
+dash==4.4.1
+gunicorn==26.2.0
+pandas==1.4.0
+werkzeug==3.1.8
+psycopg2-binary==2.9.12
+pytest==7.2.2
+dash_iconify==0.1.2
+dash-ag-grid==35.3.0
+numpy<2.0.0
diff --git a/lithium-supply-chain/runtime.txt b/lithium-supply-chain/runtime.txt
new file mode 100644
index 0000000..f24fc1b
--- /dev/null
+++ b/lithium-supply-chain/runtime.txt
@@ -0,0 +1 @@
+python-3.8.3
\ No newline at end of file
diff --git a/lithium-supply-chain/tests/__init__.py b/lithium-supply-chain/tests/__init__.py
new file mode 100644
index 0000000..8f2a5a1
--- /dev/null
+++ b/lithium-supply-chain/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_chart_utils, test_data_utils, test_ui_utils, mock_data
diff --git a/lithium-supply-chain/tests/mock_data.py b/lithium-supply-chain/tests/mock_data.py
new file mode 100644
index 0000000..64f7274
--- /dev/null
+++ b/lithium-supply-chain/tests/mock_data.py
@@ -0,0 +1,43 @@
+import pandas as pd
+
+supply_df = pd.DataFrame(
+ [
+ [1, "Resource ID_0", "P1"],
+ [3, "Spot Market Lep", "P2"],
+ [5, "Resource ID_2", "P1"],
+ [7, "Resource ID_3", "P3"],
+ [4, "Spot Market Spod", "P1"],
+ [3, "Spot Market Lep", "P2"],
+ [5, "Resource ID_2", "P3"],
+ [4, "Spot Market Spod", "P3"],
+ ],
+ columns=["2023", "Resource 1", "Product"],
+)
+
+spod_df = pd.DataFrame(
+ [
+ [3, "Resource ID_4", "Spot Market Spod"],
+ [2, "Resource ID_5", "Spot Market Spod"],
+ [1, "Resource ID_5", "Spot Market Spod"],
+ [2, "Resource ID_2", "Spot Market Spod"],
+ [1, "Resource ID_3", "Spot Market Lep"],
+ [5, "Resource ID_0", "Spot Market Lep"],
+ ],
+ columns=["2023", "Resource 1", "Offtake Owner"],
+)
+
+
+test_links = [
+ ((0, 7), 1),
+ ((1, 8), 6),
+ ((2, 7), 5),
+ ((3, 9), 7),
+ ((4, 7), 4),
+ ((2, 9), 5),
+ ((4, 9), 4),
+ ((5, 4), 3),
+ ((6, 4), 3),
+ ((2, 4), 2),
+ ((3, 1), 1),
+ ((0, 1), 5),
+]
diff --git a/lithium-supply-chain/tests/test_chart_utils.py b/lithium-supply-chain/tests/test_chart_utils.py
new file mode 100644
index 0000000..0ac590c
--- /dev/null
+++ b/lithium-supply-chain/tests/test_chart_utils.py
@@ -0,0 +1,46 @@
+import pytest
+
+from utils import chart_utils
+from .mock_data import spod_df, supply_df, test_links
+
+
+@pytest.fixture
+def get_supply_df():
+ return supply_df
+
+
+@pytest.fixture
+def get_spod_df():
+ return spod_df
+
+
+@pytest.fixture
+def get_links():
+ return test_links
+
+
+def test_generate_sankey_data(get_supply_df, get_spod_df, get_links):
+ columns = ["Resource 1", "Product"]
+ year = "2023"
+ view_top = "view_all"
+ (
+ labels,
+ sources,
+ targets,
+ values,
+ link_colors,
+ node_colors,
+ ) = chart_utils.generate_sankey_data(
+ columns, get_supply_df, year, get_spod_df, view_top
+ )
+ fn_links = [(a, b) for a, b in zip(sources, targets)]
+ test_links = [link[0] for link in get_links]
+ nb_test_links = len(test_links)
+ assert len(labels) == len(node_colors)
+ assert len(sources) == nb_test_links
+ assert len(targets) == nb_test_links
+ assert len(values) == nb_test_links
+ assert sorted(sources) == sorted([val[0][0] for val in get_links])
+ assert fn_links.sort() == test_links.sort()
+ assert sum(values) == sum([val[1] for val in get_links])
+ assert len(link_colors) == nb_test_links
diff --git a/lithium-supply-chain/tests/test_data_utils.py b/lithium-supply-chain/tests/test_data_utils.py
new file mode 100644
index 0000000..e3b88d4
--- /dev/null
+++ b/lithium-supply-chain/tests/test_data_utils.py
@@ -0,0 +1,9 @@
+import pandas as pd
+import pytest
+
+from utils import chart_utils, data_utils
+
+
+def test_get_supply_data():
+ df = data_utils.get_supply_data("forecast_version_1")
+ assert type(df) == pd.DataFrame
diff --git a/lithium-supply-chain/tests/test_ui_utils.py b/lithium-supply-chain/tests/test_ui_utils.py
new file mode 100644
index 0000000..386752e
--- /dev/null
+++ b/lithium-supply-chain/tests/test_ui_utils.py
@@ -0,0 +1,3 @@
+import pytest
+
+from utils import chart_utils, data_utils, ui_utils
diff --git a/lithium-supply-chain/utils/__init__.py b/lithium-supply-chain/utils/__init__.py
new file mode 100644
index 0000000..5cd96a3
--- /dev/null
+++ b/lithium-supply-chain/utils/__init__.py
@@ -0,0 +1 @@
+from . import chart_utils, data_utils, ui_utils
diff --git a/lithium-supply-chain/utils/chart_utils.py b/lithium-supply-chain/utils/chart_utils.py
new file mode 100644
index 0000000..4e21d64
--- /dev/null
+++ b/lithium-supply-chain/utils/chart_utils.py
@@ -0,0 +1,300 @@
+import pandas as pd
+import plotly.graph_objects as go
+import plotly.io as pio
+
+from utils import data_utils
+from typing import Tuple
+
+pio.templates["app_theme"] = go.layout.Template(
+ layout=go.Layout(
+ font=dict(family="Poppins, sans-serif", color="#514338"),
+ paper_bgcolor="rgba(0, 0, 0, 0)",
+ plot_bgcolor="rgba(0, 0, 0, 0)",
+ margin=dict(t=40, l=20, r=20, b=20),
+ )
+)
+pio.templates.default = "app_theme"
+
+
+def add_spot_market_links_for_node(
+ spot_market_node: str,
+ link_mappings: dict,
+ col: str,
+ spod_data: pd.DataFrame,
+ year: str,
+ links: list,
+):
+ """
+ This function is a helper function to add_spot_market_links. This loops through the
+ spot data (either Spod or Lep data) to create each link.
+ """
+ color_dict = data_utils.get_color_dict()
+ # check in case spod market is not a value in the currently selected nodes/filters
+ if spot_market_node in link_mappings[col].keys():
+ # looping through the spod-df
+ for node_value, link_weight in zip(spod_data[col], spod_data[year]):
+ # getting link color
+ if not node_value in link_mappings[col].keys():
+ link_color = color_dict.get("Other")
+ else:
+ link_color = color_dict.get(node_value)
+ links.append(
+ (
+ (
+ link_mappings[col].get(
+ node_value, link_mappings[col].get("Other")
+ ),
+ link_mappings[col][spot_market_node],
+ ),
+ link_weight,
+ link_color,
+ )
+ )
+ return links
+
+
+def add_spot_market_links(
+ links: list,
+ link_mappings: dict,
+ columns: list,
+ spot_df: pd.DataFrame,
+ year: str,
+):
+ """
+ This function handles the Spot Market links. It aggregates the data in the spot market df
+ (seperating spod nodes from lep nodes) and creates a link from this aggregation to
+ the appropriate Spot Node.
+ """
+ spod_str = "Spot Market Spod"
+ lep_str = "Spot Market Lep"
+ for col in columns:
+ if col.startswith("Resource"):
+ if "Offtake Owner" in spot_df.columns:
+ spod_data = spot_df.loc[spot_df["Offtake Owner"] == spod_str]
+ lep_data = spot_df.loc[spot_df["Offtake Owner"] == lep_str]
+ # creating 2 dfs: one with spod data and one with lep data, grouped by each node type
+ # to link to the spot market node
+ spod_data = spod_data.groupby([col], as_index=False).sum()
+ lep_data = lep_data.groupby([col], as_index=False).sum()
+
+ add_spot_market_links_for_node(
+ spod_str,
+ link_mappings,
+ col,
+ spod_data,
+ year,
+ links,
+ )
+ add_spot_market_links_for_node(
+ lep_str,
+ link_mappings,
+ col,
+ lep_data,
+ year,
+ links,
+ )
+
+
+def get_top_values(
+ columns: list,
+ df: pd.DataFrame,
+ year: str,
+ spot_df: pd.DataFrame,
+ view_top,
+) -> list:
+ """
+ This function keeps the top_x nodes of each columns in the sankey diagram.
+ The top_x value is selected from the dropdown in the app.
+ The nodes not in the top_x are aggregated into one "Other" category.
+ Params:
+ columns: list of selected "nodes" in the app, they actally represent columns in the dataframe
+ df: the supply dataframe
+ year: the selected year from the year dropdown (as a string)
+ spot_df: the the spot market dataframe
+ view_top: number of nodes to be shown per columns (5,10, 15 or all)
+ Returns:
+ column_values: a list of lists, each of these is a list of nodes for each selected column
+ """
+ column_values = []
+ spot_market_nodes = ["Spot Market Spod", "Spot Market Lep"]
+ if view_top == "view_all":
+ view_top = df.shape[0]
+ for col in columns:
+ # We need to add the resource cols from spod-market-df to the supply-df so we can create
+ # the links (this is because some nodes from spot-market-df are not in the supply-df)
+ if col.startswith("Resource"):
+ # get all Resource nodes from the supply and spod dataframe
+ all_resource_nodes = df[[col, year]].append(spot_df[[col, year]])
+ # group by year and sort in descending order
+ grouped_resource_nodes = (
+ all_resource_nodes.groupby([col], as_index=False)
+ .sum()
+ .sort_values(by=year, ascending=False)
+ )
+ # remove spot market nodes from the dataframe so they don't get removed if they don't
+ # appear in the top_x (as these should always be present)
+ grouped_resource_nodes = grouped_resource_nodes[
+ ~grouped_resource_nodes[col].isin(spot_market_nodes)
+ ]
+ # keep top_x values only and add back the spot market nodes
+ top_x_resource_nodes = (
+ list(grouped_resource_nodes.head(view_top)[col])
+ + spot_market_nodes
+ )
+ # replacing all nodes NOT in the top_x with the "Other" keyword
+ all_resource_nodes.loc[
+ ~all_resource_nodes[col].isin(top_x_resource_nodes), col
+ ] = "Other"
+ column_values.append(all_resource_nodes[col])
+ else:
+ # Same logic as above but without the spod market nodes
+ all_nodes = df[[col, year]]
+ grouped_nodes = (
+ all_nodes.groupby([col], as_index=False)
+ .sum()
+ .sort_values(by=year, ascending=False)
+ )
+ top_x_nodes = list(grouped_nodes.head(view_top)[col])
+ all_nodes.loc[~all_nodes[col].isin(top_x_nodes), col] = "Other"
+ column_values.append(all_nodes[col])
+ return column_values
+
+
+def generate_sankey_data(
+ columns: list,
+ df: pd.DataFrame,
+ year: int,
+ spot_df: pd.DataFrame,
+ view_top,
+) -> Tuple[list, list, list, list, list, list]:
+ """
+ This function creates the data required to generate the sankey diragram.
+ Params:
+ columns: list of selected "nodes" in the app, they actally represent columns in the dataframe
+ df: the supply dataframe
+ year: the selected year from the year dropdown
+ spot_df: the the spot market dataframe
+
+ Returns:
+ labels: labels that get assigned to each node
+ sources: a list of nubmers, each number represents a node in the sankey.
+ targets: a list of nubmers, same as above. The link is created between the source and target by using the numbers placed as the same index in the list.
+ values: the weight of each link.
+ colors: a list of the color to be used for each link
+ """
+ color_dict = data_utils.get_color_dict()
+ df = df.fillna("(No Value)")
+ year = str(year)
+ # list of dfs that contain a list of nodes for each selected column
+
+ column_values = get_top_values(columns, df, year, spot_df, view_top)
+
+ # list of all unique nodes in all of the columns
+ labels = sum(
+ [list(node_values.unique()) for node_values in column_values], []
+ )
+ # list of empty dicts (one per column) to create a numerical mapping
+ link_mappings = {}
+ for col in columns:
+ link_mappings[col] = {}
+
+ # assigning a number to each unique node, repeating for each column. Numbers must be
+ # continuous from column to column
+ i = 0
+ for col, nodes in zip(columns, column_values):
+ for node in nodes.unique():
+ link_mappings[col][node] = i
+ i = i + 1
+
+ source_nodes = column_values[: len(columns) - 1]
+ target_nodes = column_values[1:]
+ source_cols = columns[: len(columns) - 1]
+ target_cols = columns[1:]
+ links = []
+ # Create links (tuples) between source and target nodes, and their respective weight and color, by using the list of mappings
+ # Note: resource columns will be longer than other columns becasue spot nodes were added. By default, the loop
+ # will operate on the shortest column. This is what we want since the extra nodes from the resource colums come from the
+ # spot-df and those links will be added afterwards.
+ for source, target, source_col, target_col in zip(
+ source_nodes, target_nodes, source_cols, target_cols
+ ):
+ for val1, val2, link_weight in zip(source, target, df[year]):
+ links.append(
+ (
+ (
+ link_mappings[source_col][val1],
+ link_mappings[target_col][val2],
+ ),
+ link_weight,
+ color_dict.get(val1),
+ )
+ )
+ # adding spot market links to current links
+ add_spot_market_links(links, link_mappings, columns, spot_df, year)
+ df_links = pd.DataFrame(links, columns=["link", "weight", "color"])
+ df_links = df_links.groupby(by=["link"], as_index=False).agg(
+ {"weight": sum, "color": "first"}
+ )
+ sources = [val[0] for val in df_links["link"]]
+ targets = [val[1] for val in df_links["link"]]
+ values = df_links["weight"].tolist()
+ link_hex_colors = df_links["color"]
+ link_colors = [data_utils.hex2rgb(color) for color in link_hex_colors]
+ node_colors = [color_dict.get(color, "#afa28e") for color in labels]
+ return labels, sources, targets, values, link_colors, node_colors
+
+
+def generate_sankey(nodes, df, year, spot_df, view_top):
+ (
+ labels,
+ sources,
+ targets,
+ values,
+ link_colors,
+ node_colors,
+ ) = generate_sankey_data(nodes, df, year, spot_df, view_top)
+ fig = go.Figure(
+ data=[
+ go.Sankey(
+ node=dict(
+ pad=15,
+ thickness=20,
+ line=dict(width=0),
+ label=labels if len(labels) < 50 else [],
+ customdata=labels,
+ hovertemplate="%{customdata}",
+ color=node_colors,
+ ),
+ link=dict(
+ source=sources,
+ target=targets,
+ value=values,
+ hovertemplate="%{source.customdata} to %{target.customdata}",
+ color=link_colors,
+ ),
+ )
+ ],
+ )
+ # Add annotations for each node name
+ for i, node in enumerate(nodes):
+ if i == 0:
+ xanchor = "left"
+ elif i == len(nodes) - 1:
+ xanchor = "right"
+ else:
+ xanchor = "center"
+
+ fig.add_annotation(
+ text=node,
+ xref="paper",
+ yref="paper",
+ xanchor=xanchor,
+ x=i / (len(nodes) - 1),
+ y=1.1,
+ font=dict(size=14),
+ showarrow=False,
+ )
+ # Create space at top for annotations
+ fig.update_layout(margin=dict(t=50, l=20, r=20))
+ return fig
+
diff --git a/lithium-supply-chain/utils/data_utils.py b/lithium-supply-chain/utils/data_utils.py
new file mode 100644
index 0000000..253bdb1
--- /dev/null
+++ b/lithium-supply-chain/utils/data_utils.py
@@ -0,0 +1,91 @@
+import os
+
+import pandas as pd
+
+
+def get_spot_data(forecast_version):
+ path = f"data/forecast_version/{forecast_version}/dummy_spot_data.csv"
+ df = pd.read_csv(path)
+ return df
+
+
+def get_supply_data(forecast_version):
+ path = f"data/forecast_version/{forecast_version}/dummy_supply_data.csv"
+ df = pd.read_csv(path)
+ return df
+
+
+def get_color_dict():
+ path = "data/colors.csv"
+ df = pd.read_csv(path)
+ color_dict = dict(zip(df.name, df.color))
+ return color_dict
+
+
+def supply_filter_values():
+ columns = [
+ "Conversion Country",
+ "Product",
+ "Conversion Region",
+ "Conversion Resource SubType",
+ "Resource Region",
+ "Resource Company",
+ ]
+ return {key: value for key, value in zip(columns, columns)}
+
+
+def get_year_dropdown_vals(df):
+ columns = df.columns
+ years = [col for col in columns if col.isnumeric()]
+ return years
+
+
+def get_node_dropdown_vals(first_node):
+ resource_columns = [
+ "Resource Region",
+ "Resource Country",
+ "Resource Company",
+ "Resource ID",
+ ]
+ columns = [
+ "Conversion Company",
+ "Conversion Country",
+ "Product",
+ "Conversion Region",
+ "Conversion Resource SubType",
+ "Conversion ID",
+ ]
+ if first_node:
+ columns = resource_columns + columns
+ data = [{"value": value, "label": value} for value in columns]
+ return data
+
+
+def get_filter_dropdown_vals(df, col):
+ filters = df[col].unique()
+ data = [{"value": filter, "label": filter} for filter in filters]
+ return data
+
+
+def get_top_x_values():
+ options = [
+ {"label": f"Top {val}", "value": str(val)} for val in range(5, 20, 5)
+ ] + [{"label": "View All", "value": "view_all"}]
+ return options
+
+
+def get_forecast_version_values():
+ forecast_versions = os.listdir("data/forecast_version")
+ forecast_versions = [
+ fv for fv in forecast_versions if not fv.startswith(".")
+ ]
+ dropdown_items = [{"label": fv, "value": fv} for fv in forecast_versions]
+ return dropdown_items
+
+
+def hex2rgb(hex_value):
+ h = hex_value.strip("#")
+ rgb = tuple(int(h[i : i + 2], 16) for i in (0, 2, 4))
+ transparency_level = (0.2,)
+ rgb_transparent = rgb + transparency_level
+ return f"rgba{rgb_transparent}"
diff --git a/lithium-supply-chain/utils/ui_utils.py b/lithium-supply-chain/utils/ui_utils.py
new file mode 100644
index 0000000..37610b9
--- /dev/null
+++ b/lithium-supply-chain/utils/ui_utils.py
@@ -0,0 +1,192 @@
+import dash_mantine_components as dmc
+from dash import ALL, Input, Output, State, callback, ctx, html
+from dash_iconify import DashIconify
+
+from constants import DEFAULT_SANKEY_NODES, NAVY
+from utils import data_utils
+
+
+def panel_header(title):
+ return dmc.CardSection(
+ dmc.Text(title, c="white", fw=600, size="sm", ta="center"),
+ style={
+ "backgroundColor": NAVY,
+ "padding": "10px 14px",
+ },
+ )
+
+
+def sidebar_controls_supply_sankey(df, filter_values):
+ years = data_utils.get_year_dropdown_vals(df)
+ return dmc.Card(
+ [
+ panel_header("Basic Controls & Filters"),
+ html.Div(
+ [
+ dmc.Space(h=10),
+ html.Div(
+ [
+ dmc.Select(
+ label="Year",
+ value=years[0],
+ data=[
+ {"value": year, "label": year}
+ for year in years
+ ],
+ radius="md",
+ id="year-filter-selection",
+ ),
+ dmc.Space(h=10),
+ dmc.Select(
+ label="View Top",
+ placeholder="Select...",
+ value=data_utils.get_top_x_values()[0][
+ "value"
+ ],
+ data=data_utils.get_top_x_values(),
+ radius="md",
+ id="view-top-data",
+ ),
+ ],
+ style={"padding": "0px 12px"},
+ ),
+ dmc.Space(h=10),
+ dmc.Divider(variant="dashed", mx=12),
+ dmc.Space(h=8),
+ html.Div(
+ generate_filter_controls(df, filter_values),
+ style={"padding": "0px 12px"},
+ ),
+ dmc.Space(h=8),
+ html.Div(
+ dmc.Button(
+ "Clear Filters",
+ radius="md",
+ variant="outline",
+ id="clear-node-filters-btn",
+ ),
+ className="flex-row justify-center",
+ style={"padding": "0px 12px 12px 12px"},
+ ),
+ ],
+ style={
+ "flexGrow": "1",
+ "overflowY": "auto",
+ "minHeight": "0px",
+ },
+ ),
+ ],
+ shadow="sm",
+ radius="md",
+ withBorder=True,
+ style={
+ "width": "280px",
+ "height": "100%",
+ "display": "flex",
+ "flexDirection": "column",
+ },
+ )
+
+
+def generate_filter_controls(df, filter_values):
+ controls = []
+ for label, column in filter_values.items():
+ controls.extend(
+ [
+ dmc.MultiSelect(
+ label=label,
+ placeholder="Select value(s)...",
+ data=data_utils.get_filter_dropdown_vals(df, column),
+ searchable=True,
+ clearable=True,
+ id={"type": "global-filters", "index": column},
+ ),
+ dmc.Space(h=8),
+ ]
+ )
+ return controls
+
+
+def get_node_card(node_nb, value):
+ # Cant delete first 2 nodes, only add "X" on third node and up.
+ delete_icon = (
+ []
+ if node_nb == 1 or node_nb == 2
+ else [
+ dmc.ActionIcon(
+ DashIconify(icon="humbleicons:times", width=16, color="white"),
+ variant="transparent",
+ size="sm",
+ id={
+ "type": "delete-single-node",
+ "index": f"{node_nb}",
+ },
+ )
+ ]
+ )
+ # Wrapped in a plain html.Div (rather than putting id/className directly
+ # on the dmc.Card) because Dash's Card wrapper doesn't accept a `key`
+ # prop, and html.Div does. Without a stable `key` here, React reconciles
+ # this list by position instead of identity: deleting a middle card then
+ # recycles a DOM node (and any stuck focus/CSS state) onto the wrong
+ # card instead of actually removing it.
+ return html.Div(
+ dmc.Card(
+ [
+ dmc.CardSection(
+ dmc.Group(
+ [dmc.Text("Node", c="white", fw=600, size="sm")]
+ + delete_icon,
+ justify="space-between",
+ style={"height": "100%"},
+ ),
+ style={
+ "backgroundColor": NAVY,
+ "padding": "0px 14px",
+ "height": "44px",
+ },
+ ),
+ dmc.CardSection(
+ dmc.Select(
+ placeholder="Select Node...",
+ data=data_utils.get_node_dropdown_vals(node_nb == 1),
+ value=value,
+ radius="md",
+ comboboxProps={"position": "bottom", "zIndex": 1000},
+ maxDropdownHeight=160,
+ id={
+ "type": "node-selector",
+ "index": f"{node_nb}",
+ },
+ ),
+ style={"padding": "12px"},
+ ),
+ ],
+ shadow="sm",
+ radius="md",
+ withBorder=True,
+ ),
+ className="node-card",
+ key=f"node-card-{node_nb}",
+ id={
+ "type": "node-card",
+ "index": f"{node_nb}",
+ },
+ )
+
+
+def get_default_nodes():
+ return [
+ get_node_card(i + 1, value)
+ for i, value in enumerate(DEFAULT_SANKEY_NODES)
+ ]
+
+
+@callback(
+ Output({"type": "global-filters", "index": ALL}, "value"),
+ Input("clear-node-filters-btn", "n_clicks"),
+ State({"type": "global-filters", "index": ALL}, "value"),
+ prevent_initial_call=True,
+)
+def clear_node_and_filter_selections(n_clicks_filter, filters):
+ return [[]] * len(ctx.args_grouping[1])