diff --git a/.gitignore b/.gitignore index 9063c58..2d52df8 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,7 @@ ENV/ # Simulation output src/provider_simenv/data/output/ + +# Web frontend (Issue #23) +web/node_modules/ +web/dist/ diff --git a/src/provider_simenv/export_bundle.py b/src/provider_simenv/export_bundle.py new file mode 100644 index 0000000..4e6d1a6 --- /dev/null +++ b/src/provider_simenv/export_bundle.py @@ -0,0 +1,206 @@ +""" +Export a simulation run's CSV output into the JSON bundle the web view consumes. + +Reads the ``Result_Simulator_*.csv`` files a run writes to ``data/output`` and emits +a single ``bundle.json`` matching the frontend ``Bundle`` contract +(``web/src/data/types.ts``): nodes, edges, per-node time-series (``ticks``) and the +environment time-series (``env``). + +Each recorded agent list holds many instances; a map node is the aggregate of its +list per step — extensive quantities are summed, prices/utilisation are averaged, +and ``active`` is true if any instance is active. Ports and sea-lanes are +geographically real but produce no recorded rows, so they carry no ticks +(``hasRecordedData: false``), exactly as the frontend expects. + +Geography is deliberately NOT emitted: placement is the frontend gazetteer's job +(keyed by the PDL entity ids carried in ``entityIds``). This is the geolocatable +projection of the model graph — sea crossings are drawn port-to-port rather than +routed through the sea-lane agents, which have no single map location. + +Usage: + python -m provider_simenv.export_bundle [--scenario 1] [--input DIR] [--output FILE] +""" +from __future__ import annotations + +import argparse +import json +import logging +import os +from datetime import datetime, timezone + +import pandas as pd + +from .tick_writer import AGENT_TABLES + +logger = logging.getLogger(__name__) + +# Column aggregation rules for collapsing a list's instances into one node/step. +SUM_COLS = { + "quantity_available", "bra_volume", "arg_volume", "usa_volume", + "feed_received", "livestock_output", +} +MEAN_COLS = {"unit_price", "storage_utilization"} +BOOL_ANY_COLS = {"active"} + +# The geolocatable node overlay: display name, agent role, and the PDL entity ids +# the gazetteer places by. Recorded nodes come from AGENT_TABLES; ports are added +# here (they are real places but the DataCollector records no series for them). +NODE_META: dict[str, dict] = { + "bra_farmers": {"label": "Brazil soy farms", "role": "producer", "entityIds": ["brazil_farms"]}, + "arg_farmers": {"label": "Argentina soy farms","role": "producer", "entityIds": ["argentina_farms"]}, + "usa_farmers": {"label": "US soy farms", "role": "producer", "entityIds": ["us_farms"]}, + "wholesalers": {"label": "Wholesalers", "role": "wholesaler", "entityIds": []}, + "feed_traders": {"label": "Feed traders", "role": "feed_trader", "entityIds": []}, + "processors": {"label": "EU oil mills", "role": "processor", "entityIds": ["eu_oil_mills"]}, + "feed_manufacturers": {"label": "Feed mills", "role": "feed_manufacturer", "entityIds": ["feed_mills"]}, + "eu_farmers": {"label": "EU livestock farms", "role": "consumer", "entityIds": ["poultry_farms", "pig_farms", "dairy_farms"]}, +} + +PORT_META: dict[str, dict] = { + "transport_sa_santos": {"label": "Port of Santos", "role": "sa_santos", "entityIds": ["santos_port"]}, + "transport_sa_paranagua": {"label": "Port of Paranaguá", "role": "sa_paranagua", "entityIds": ["paranagua_port"]}, + "transport_eu_rtm": {"label": "Port of Rotterdam", "role": "eu_rtm", "entityIds": ["rotterdam_port"]}, + "transport_eu_ham": {"label": "Port of Hamburg", "role": "eu_ham", "entityIds": ["hamburg_port"]}, +} + +# Geolocatable flow overlay (sea crossings collapsed port-to-port). Mirrors the +# frontend fixture so the gazetteer/resolveScene contract is unchanged. +EDGES: list[tuple[str, str, bool]] = [ + ("bra_farmers", "wholesalers", False), + ("arg_farmers", "wholesalers", False), + ("usa_farmers", "wholesalers", False), + ("wholesalers", "transport_sa_santos", False), + ("wholesalers", "transport_sa_paranagua", False), + ("transport_sa_santos", "transport_eu_rtm", True), + ("transport_sa_paranagua", "transport_eu_ham", True), + ("arg_farmers", "transport_eu_rtm", True), + ("usa_farmers", "transport_eu_rtm", True), + ("transport_eu_rtm", "processors", False), + ("transport_eu_ham", "processors", False), + ("processors", "feed_manufacturers", False), + ("feed_manufacturers", "feed_traders", False), + ("feed_traders", "eu_farmers", False), +] + +ENV_COLS = [ + ("soja_price", "sojaPrice"), + ("feed_price", "feedPrice"), + ("shock_scale", "shockScale"), + ("drought_severity", "droughtSeverity"), + ("total_soja_supply", "totalSojaSupply"), + ("transport_utilisation", "transportUtilisation"), + ("current_step", "currentStep"), +] + +HONESTY_NOTE = "Approximate geographic positions — not GIS accurate" + + +def _aggregate(df: pd.DataFrame, props: list[str]) -> dict[int, dict]: + """Collapse a list's per-instance rows into one value dict per period.""" + out: dict[int, dict] = {} + grouped = df.groupby("period") + for period, group in grouped: + values: dict = {} + for prop in props: + if prop not in group.columns: + continue + if prop in SUM_COLS: + values[prop] = round(float(group[prop].sum()), 4) + elif prop in MEAN_COLS: + values[prop] = round(float(group[prop].mean()), 4) + elif prop in BOOL_ANY_COLS: + values[prop] = bool(group[prop].astype(bool).any()) + else: + values[prop] = round(float(group[prop].mean()), 4) + out[int(period)] = values + return out + + +def build_bundle(input_dir: str, scenario: int, pdl: str) -> dict: + nodes: list[dict] = [] + ticks: list[dict] = [] + + # Recorded nodes + their aggregated series. + for table, (node_id, props) in AGENT_TABLES.items(): + meta = NODE_META.get(node_id) + if meta is None: + logger.warning("no geolocatable metadata for recorded node %r — skipping", node_id) + continue + nodes.append({ + "id": node_id, "label": meta["label"], "role": meta["role"], + "entityIds": meta["entityIds"], "hasRecordedData": True, + }) + path = os.path.join(input_dir, f"{table}.csv") + if not os.path.exists(path): + logger.warning("missing CSV for %s: %s", node_id, path) + continue + df = pd.read_csv(path) + df = df[df["id_scenario"] == scenario] + for period, values in _aggregate(df, props).items(): + ticks.append({"period": period, "nodeId": node_id, "values": values}) + + # Ports — real places, no recorded series. + for node_id, meta in PORT_META.items(): + nodes.append({ + "id": node_id, "label": meta["label"], "role": meta["role"], + "entityIds": meta["entityIds"], "hasRecordedData": False, + }) + + edges = [ + {"id": f"{s}->{t}", "source": s, "target": t, "isSeaCrossing": sea} + for (s, t, sea) in EDGES + ] + + # Environment series. + env: list[dict] = [] + env_path = os.path.join(input_dir, "Result_Simulator_Environment.csv") + edf = pd.read_csv(env_path) + edf = edf[edf["id_scenario"] == scenario].sort_values("period") + for _, row in edf.iterrows(): + snapshot = {"period": int(row["period"])} + for csv_col, out_key in ENV_COLS: + snapshot[out_key] = round(float(row[csv_col]), 4) + env.append(snapshot) + + return { + "meta": { + "pdl": os.path.basename(pdl) if pdl else "s1-soja.pdl.yaml", + "scenario": f"scenario_{scenario}", + "ticks": len(env), + "generatedAt": datetime.now(timezone.utc).replace(microsecond=0).isoformat(), + "honestyNote": HONESTY_NOTE, + }, + "nodes": nodes, + "edges": edges, + "ticks": ticks, + "env": env, + } + + +def main() -> None: + logging.basicConfig(level=logging.INFO, format="%(levelname)s %(name)s: %(message)s") + here = os.path.dirname(os.path.abspath(__file__)) + repo_root = os.path.abspath(os.path.join(here, "..", "..")) + + parser = argparse.ArgumentParser(description="Export a run's CSVs to the web bundle.json") + parser.add_argument("--scenario", type=int, default=1, + help="id_scenario to export (0 = baseline, 1 = PDL shock). Default 1.") + parser.add_argument("--input", type=str, default=os.path.join(here, "data", "output"), + help="Directory holding Result_Simulator_*.csv.") + parser.add_argument("--output", type=str, default=os.path.join(repo_root, "web", "public", "bundle.json"), + help="Path to write bundle.json.") + parser.add_argument("--pdl", type=str, default="s1-soja.pdl.yaml", help="PDL name for metadata.") + args = parser.parse_args() + + bundle = build_bundle(args.input, args.scenario, args.pdl) + os.makedirs(os.path.dirname(args.output), exist_ok=True) + with open(args.output, "w", encoding="utf-8") as fh: + json.dump(bundle, fh, ensure_ascii=False, separators=(",", ":")) + + logger.info("wrote %s — %d nodes, %d edges, %d ticks, %d env steps (scenario %d)", + args.output, len(bundle["nodes"]), len(bundle["edges"]), + len(bundle["ticks"]), len(bundle["env"]), args.scenario) + + +if __name__ == "__main__": + main() diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..efd2d22 --- /dev/null +++ b/web/README.md @@ -0,0 +1,170 @@ +# provider-simenv — web frontend (Issue #23) + +World map / globe view for the PROVIDER simulation environment. Renders the geolocatable +projection of the soy supply chain — producers, ports, EU processing, livestock — and plays +back an exported simulation run on a 3D globe. + +This directory is a standalone Vite application. It does **not** need the Python simulation +to run: a pre-exported `public/bundle.json` is committed, so `npm install && npm run dev` is +enough to see the view. + +--- + +## Components + +| Component | Required? | Purpose | +|---|---|---| +| **Node.js + npm** | yes | Builds and serves the frontend. | +| **`public/bundle.json`** | yes | The run data the view renders. A committed export is already in the repo. | +| **Python simulation** (`src/provider_simenv`) | only to regenerate data | Produces the CSVs that `export_bundle.py` turns into a new `bundle.json`. | +| **PostgreSQL** | no | Not used by the frontend. It is an output target of the simulation only. | + +--- + +## Prerequisites + +- **Node.js 20 LTS or newer** (Vite 5 requires `^18.0.0 || >=20.0.0`; Node 18 is end-of-life) +- **npm 10+** (ships with Node 20) + +Check with: + +```bash +node -v +npm -v +``` + +A WebGL-capable browser is required — the globe is rendered with three.js. + +--- + +## Install + +From this directory (`web/`): + +```bash +npm install +``` + +`package-lock.json` is committed; use `npm ci` instead if you want an exact, reproducible +install. + +--- + +## Start + +```bash +# Development server with hot reload — http://localhost:5173 +npm run dev + +# Production build into web/dist/ +npm run build + +# Serve the production build locally +npm run preview +``` + +Quality gates, both used in review: + +```bash +npm run typecheck # tsc --noEmit against tsconfig.app.json +npm run lint # eslint src +``` + +`npm run build` runs `tsc -b` first, so a type error fails the build. + +--- + +## Where the data comes from + +The view never talks to the simulation directly. It reads a single JSON bundle through the +`DataSource` seam: + +``` +simulation run (Melodie) + └─ src/provider_simenv/data/output/Result_Simulator_*.csv + └─ python -m provider_simenv.export_bundle + └─ web/public/bundle.json + └─ staticJsonSource → DataSource → views +``` + +- `src/data/source.ts` — the `DataSource` interface. Every view depends on this and never on + a concrete source. +- `src/data/staticJsonSource.ts` — fetches `/bundle.json` and validates it structurally + (`parseBundle`) before any view sees it. +- `src/data/fixtureSource.ts` — hand-written bundle, kept for reference and offline work. +- `src/main.tsx` — the composition root and the **only** place a concrete source is chosen. + Swapping sources touches no view file. + +Geography is deliberately *not* in the bundle. Coordinates live in the frontend gazetteer +(`src/data/gazetteer.ts`), keyed by PDL entity id. Entities the gazetteer does not know are +not rendered and a console warning is logged — a visible gap is preferred over a confident +wrong placement. Positions are approximate, not GIS accurate. + +### Regenerating `bundle.json` + +Only needed after a new simulation run. From the **repository root**, with the Python +environment installed (`pip install -e '.[dev]'`): + +```bash +# 1. Run the simulation (writes Result_Simulator_*.csv to data/output/). +# Run from the package directory — Melodie resolves data/ paths from the cwd. +cd src/provider_simenv +python main.py --pdl scenarios/s1-soja.pdl.yaml +cd ../.. + +# 2. Export the CSVs to the web bundle +python -m provider_simenv.export_bundle --scenario 1 +``` + +This writes `web/public/bundle.json`. Options: + +| Flag | Default | Meaning | +|---|---|---| +| `--scenario` | `1` | `id_scenario` to export. `0` = baseline, `1` = PDL shock. | +| `--input` | `src/provider_simenv/data/output` | Directory holding the `Result_Simulator_*.csv` files. | +| `--output` | `web/public/bundle.json` | Target path. | +| `--pdl` | `s1-soja.pdl.yaml` | PDL name recorded in the bundle metadata. | + +On Windows, set `PYTHONIOENCODING=utf-8` before running either step — the scenario summary +prints box-drawing characters that raise `UnicodeEncodeError` on a cp1252 console. + +--- + +## Layout + +``` +web/ +├── index.html +├── package.json +├── vite.config.ts three/globe.gl split into vendor chunks +├── public/ +│ ├── bundle.json exported run data (committed) +│ └── textures/ blue-marble, topology, night-sky +└── src/ + ├── main.tsx composition root — picks the DataSource + ├── App.tsx loads the bundle, owns playback state + ├── data/ types, DataSource seam, sources, gazetteer + ├── design/tokens.ts colours, globe/atmosphere and arc settings + ├── globe/ GlobeView + arc geometry helpers + └── playback/ timeline scrubber + per-period intensity +``` + +`node_modules/` and `dist/` are gitignored. + +--- + +## Troubleshooting + +**"Failed to load the simulation bundle"** — `public/bundle.json` is missing or malformed. +Restore it from git or regenerate it (see above). + +**Blank globe, no errors** — the browser has no WebGL. Check `chrome://gpu`, or run the dev +server in a normal browser window rather than an embedded IDE preview pane. + +**Markers missing from the map** — the gazetteer has no entry for that PDL entity id. Open +the console; each drop is logged as `[gazetteer] not rendered — …`. Add the entity to +`src/data/gazetteer.ts` to place it. + +**Large chunk warning on build** — expected and configured for. three.js and globe.gl exceed +Vite's 500 kB default and are split into their own long-cached vendor chunks +(`vite.config.ts`). diff --git a/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..cd83a56 --- /dev/null +++ b/web/index.html @@ -0,0 +1,14 @@ + + + + + + + + PROVIDER simenv — World Supply Network + + +
+ + + diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..e53c6e2 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,3866 @@ +{ + "name": "provider-simenv-web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "provider-simenv-web", + "version": "0.0.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-globe.gl": "^2.38.0", + "three": "^0.185.1" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/three": "^0.185.1", + "@vitejs/plugin-react": "^4.3.3", + "eslint": "^9.13.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.11.0", + "typescript": "~5.6.3", + "typescript-eslint": "^8.11.0", + "vite": "^5.4.10" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@turf/boolean-point-in-polygon": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.3.5.tgz", + "integrity": "sha512-ba7+B0wzaS9GtERZOoXUZ6oW8IcIJHNQZf3c+tiD9ESjcsPO1Q/4qIJGTKl92nBLhhracHJxMWBM/U6hAVkaRg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.3.5", + "@turf/invariant": "7.3.5", + "@types/geojson": "^7946.0.10", + "point-in-polygon-hao": "^1.1.0", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.5.tgz", + "integrity": "sha512-E/NMGV5MwbjjP7AJXBtsanC3yY8N2MQ87IGdIgkB2ji5AtBpwnH4L3gEqpYN4RlCJJWbLbzO91BbKv2waUd0eg==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.3.5.tgz", + "integrity": "sha512-ZVIvsBvjr8lO7WxC5zYNjRsjSDvyGvWkJMjuWaJjTU8x+1tmfNnw3gDX/TI2Sit83gcRYLYkNo23lB/udqx/Hg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "7.3.5", + "@types/geojson": "^7946.0.10", + "tslib": "^2.8.1" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", + "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.185.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.185.1.tgz", + "integrity": "sha512-db1xTb+EgYF2didW+eudSvVPtn75zo+fGsY8ShQrJY/B5ZBmC2Fiaykv3aImHAlCNEGuMPkPGXBJGLwzu5mC7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "fflate": "~0.8.2", + "meshoptimizer": "~1.1.1" + } + }, + "node_modules/@types/three/node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/accessor-fn": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", + "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.5.tgz", + "integrity": "sha512-xJo6a6YZnwZfnyGmQKWMbVOcii7XRibjOskRh+WJ9UHQoX16xrQrcIgAMQOzfvs8XiLMx6ih/fsLPF73iY2D1A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-voronoi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-geo-voronoi/-/d3-geo-voronoi-2.1.0.tgz", + "integrity": "sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-delaunay": "6", + "d3-geo": "3", + "d3-tricontour": "1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-octree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", + "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", + "license": "MIT" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-tricontour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-tricontour/-/d3-tricontour-1.1.0.tgz", + "integrity": "sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ==", + "license": "ISC", + "dependencies": { + "d3-delaunay": "6", + "d3-scale": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-bind-mapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz", + "integrity": "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==", + "license": "MIT", + "dependencies": { + "accessor-fn": "1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/earcut": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", + "license": "ISC" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.397", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.397.tgz", + "integrity": "sha512-khGTy9U9x02KEtsKM8vx5A62BsRmcOsIgDpWr1ImE32Ax8GxHGPHZf+Eu9H8zOOyHJnB0jTbseyTHbq2XCT8yw==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/float-tooltip": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", + "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", + "license": "MIT", + "dependencies": { + "d3-selection": "2 - 3", + "kapsule": "^1.16", + "preact": "10" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/frame-ticker": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/frame-ticker/-/frame-ticker-1.0.3.tgz", + "integrity": "sha512-E0X2u2JIvbEMrqEg5+4BpTqaD22OwojJI63K7MdKHdncjtAhGRbCR8nJCr2vwEt9NWBPCPcu70X9smPviEBy8Q==", + "license": "MIT", + "dependencies": { + "simplesignal": "^2.1.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globe.gl": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/globe.gl/-/globe.gl-2.46.1.tgz", + "integrity": "sha512-h+OvX52EBIPLtM0/2JkM+JZ9gPAhPJ4y3+hxUwD5Ey/O0Zk2ockuTiJ71bZbnNBGmNiIZzA5Vr3TMT0b3d35IQ==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "kapsule": "^1.16", + "three": ">=0.179 <1", + "three-globe": "^2.45", + "three-render-objects": "^1.41" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/h3-js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.5.0.tgz", + "integrity": "sha512-uKmdPc+DuarnR+XqZxEuWOMw7KzzKROrx3MLeJpFnMOs78S9M5eZ+X5RieS9UcSFQqbeXzbfWuX/W9Pyajinqw==", + "license": "Apache-2.0", + "engines": { + "node": ">=4", + "npm": ">=3", + "yarn": ">=1.3.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/index-array-by": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", + "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jerrypick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz", + "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kapsule": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", + "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", + "license": "MIT", + "dependencies": { + "lodash-es": "4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/meshoptimizer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.1.1.tgz", + "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/point-in-polygon-hao": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz", + "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", + "license": "MIT", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.5.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.24.tgz", + "integrity": "sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.7", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz", + "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-globe.gl": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/react-globe.gl/-/react-globe.gl-2.38.0.tgz", + "integrity": "sha512-NQkMy5BGD269lkdjm9BJ2PEK81++y9H82+j4/QuWVlfXPJPTVfzaxnkC3MvaiGmpus8P6czq58OfMeYvn/4Xqg==", + "license": "MIT", + "dependencies": { + "globe.gl": "^2.46", + "prop-types": "15", + "react-kapsule": "^2.5" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-kapsule": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.6.0.tgz", + "integrity": "sha512-HzLJoYb1n1kfwjXbqFFcRR0EA6oPsJ64tNdDmCSaL/bz2o9wUZRSb0cMe//grLFeF9EVoL4CD/e6ozLyzEv+PQ==", + "license": "MIT", + "dependencies": { + "jerrypick": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simplesignal": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/simplesignal/-/simplesignal-2.1.7.tgz", + "integrity": "sha512-PEo2qWpUke7IMhlqiBxrulIFvhJRLkl1ih52Rwa+bPjzhJepcd4GIjn2RiQmFSx3dQvsEAgF0/lXMwMN7vODaA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/three": { + "version": "0.185.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.185.1.tgz", + "integrity": "sha512-5aojFCXKwnjBRZvUnt3WFfEcvUJgkN5LlijRFN95hMy8WVkG4I0QNcJE+OuWvuJ0bOdStrbfXn0pkd6/QyiAlg==", + "license": "MIT", + "peer": true + }, + "node_modules/three-conic-polygon-geometry": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/three-conic-polygon-geometry/-/three-conic-polygon-geometry-2.1.3.tgz", + "integrity": "sha512-7KYcgd7rYg91L8AnCEddeyhw4qlv9+8NAI0luHq7QGt26icWUGNCsvLyD+u6FPKjP+un3zGBi4JGzqgGpmBSWA==", + "license": "MIT", + "dependencies": { + "@turf/boolean-point-in-polygon": "^7.2", + "d3-array": "1 - 3", + "d3-geo": "1 - 3", + "d3-geo-voronoi": "2", + "d3-scale": "1 - 4", + "delaunator": "5", + "earcut": "3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.72.0" + } + }, + "node_modules/three-geojson-geometry": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/three-geojson-geometry/-/three-geojson-geometry-2.1.1.tgz", + "integrity": "sha512-dC7bF3ri1goDcihYhzACHOBQqu7YNNazYLa2bSydVIiJUb3jDFojKSy+gNj2pMkqZNSVjssSmdY9zlmnhEpr1w==", + "license": "MIT", + "dependencies": { + "d3-geo": "1 - 3", + "d3-interpolate": "1 - 3", + "earcut": "3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.72.0" + } + }, + "node_modules/three-globe": { + "version": "2.45.2", + "resolved": "https://registry.npmjs.org/three-globe/-/three-globe-2.45.2.tgz", + "integrity": "sha512-3qJE2LAdyHsUPt02mgMRc+PG3j9kGEA0fUYrwKPGIVtvMR1XjDn9hCXu31AWocdgHOFcXkrRVz7jJZzTIvR0eQ==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "d3-array": "3", + "d3-color": "3", + "d3-geo": "3", + "d3-interpolate": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "data-bind-mapper": "1", + "frame-ticker": "1", + "h3-js": "4", + "index-array-by": "1", + "kapsule": "^1.16", + "three-conic-polygon-geometry": "2", + "three-geojson-geometry": "2", + "three-slippy-map-globe": "1", + "tinycolor2": "1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.154" + } + }, + "node_modules/three-render-objects": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.42.0.tgz", + "integrity": "sha512-KYfkPrYGEbIK8ChFocWqOF1aAN80FBUBWVYB8mB2oBpVuVN+52FvvngVYB5ieFANQu7Rt21rPYZ/xKaAgVWWRQ==", + "license": "MIT", + "dependencies": { + "@tweenjs/tween.js": "18 - 25", + "accessor-fn": "1", + "float-tooltip": "^1.7", + "kapsule": "^1.16", + "polished": "4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.179" + } + }, + "node_modules/three-slippy-map-globe": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/three-slippy-map-globe/-/three-slippy-map-globe-1.0.6.tgz", + "integrity": "sha512-PCUR+X+1kYFYtQBf8+b/ct8xBHtnkeu7FItRYBeFxyIe3ksnGuLi0H9RAxAfVSSUsZVbKIKNz9q1atEjynrrkg==", + "license": "MIT", + "dependencies": { + "d3-geo": "1 - 3", + "d3-octree": "^1.1", + "d3-scale": "1 - 4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "three": ">=0.154" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..cf1ee73 --- /dev/null +++ b/web/package.json @@ -0,0 +1,34 @@ +{ + "name": "provider-simenv-web", + "private": true, + "version": "0.0.0", + "type": "module", + "description": "PROVIDER simenv — world map / globe view (Issue #23). Map substrate + placement APIs.", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "typecheck": "tsc -p tsconfig.app.json --noEmit", + "lint": "eslint src", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-globe.gl": "^2.38.0", + "three": "^0.185.1" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@types/three": "^0.185.1", + "@vitejs/plugin-react": "^4.3.3", + "eslint": "^9.13.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.11.0", + "typescript": "~5.6.3", + "typescript-eslint": "^8.11.0", + "vite": "^5.4.10" + } +} diff --git a/web/public/bundle.json b/web/public/bundle.json new file mode 100644 index 0000000..a76acc4 --- /dev/null +++ b/web/public/bundle.json @@ -0,0 +1 @@ +{"meta":{"pdl":"s1-soja.pdl.yaml","scenario":"scenario_1","ticks":365,"generatedAt":"2026-08-04T11:40:16+00:00","honestyNote":"Approximate geographic positions — not GIS accurate"},"nodes":[{"id":"bra_farmers","label":"Brazil soy farms","role":"producer","entityIds":["brazil_farms"],"hasRecordedData":true},{"id":"arg_farmers","label":"Argentina soy farms","role":"producer","entityIds":["argentina_farms"],"hasRecordedData":true},{"id":"usa_farmers","label":"US soy farms","role":"producer","entityIds":["us_farms"],"hasRecordedData":true},{"id":"wholesalers","label":"Wholesalers","role":"wholesaler","entityIds":[],"hasRecordedData":true},{"id":"processors","label":"EU oil mills","role":"processor","entityIds":["eu_oil_mills"],"hasRecordedData":true},{"id":"feed_manufacturers","label":"Feed mills","role":"feed_manufacturer","entityIds":["feed_mills"],"hasRecordedData":true},{"id":"feed_traders","label":"Feed traders","role":"feed_trader","entityIds":[],"hasRecordedData":true},{"id":"eu_farmers","label":"EU livestock farms","role":"consumer","entityIds":["poultry_farms","pig_farms","dairy_farms"],"hasRecordedData":true},{"id":"transport_sa_santos","label":"Port of Santos","role":"sa_santos","entityIds":["santos_port"],"hasRecordedData":false},{"id":"transport_sa_paranagua","label":"Port of Paranaguá","role":"sa_paranagua","entityIds":["paranagua_port"],"hasRecordedData":false},{"id":"transport_eu_rtm","label":"Port of Rotterdam","role":"eu_rtm","entityIds":["rotterdam_port"],"hasRecordedData":false},{"id":"transport_eu_ham","label":"Port of Hamburg","role":"eu_ham","entityIds":["hamburg_port"],"hasRecordedData":false}],"edges":[{"id":"bra_farmers->wholesalers","source":"bra_farmers","target":"wholesalers","isSeaCrossing":false},{"id":"arg_farmers->wholesalers","source":"arg_farmers","target":"wholesalers","isSeaCrossing":false},{"id":"usa_farmers->wholesalers","source":"usa_farmers","target":"wholesalers","isSeaCrossing":false},{"id":"wholesalers->transport_sa_santos","source":"wholesalers","target":"transport_sa_santos","isSeaCrossing":false},{"id":"wholesalers->transport_sa_paranagua","source":"wholesalers","target":"transport_sa_paranagua","isSeaCrossing":false},{"id":"transport_sa_santos->transport_eu_rtm","source":"transport_sa_santos","target":"transport_eu_rtm","isSeaCrossing":true},{"id":"transport_sa_paranagua->transport_eu_ham","source":"transport_sa_paranagua","target":"transport_eu_ham","isSeaCrossing":true},{"id":"arg_farmers->transport_eu_rtm","source":"arg_farmers","target":"transport_eu_rtm","isSeaCrossing":true},{"id":"usa_farmers->transport_eu_rtm","source":"usa_farmers","target":"transport_eu_rtm","isSeaCrossing":true},{"id":"transport_eu_rtm->processors","source":"transport_eu_rtm","target":"processors","isSeaCrossing":false},{"id":"transport_eu_ham->processors","source":"transport_eu_ham","target":"processors","isSeaCrossing":false},{"id":"processors->feed_manufacturers","source":"processors","target":"feed_manufacturers","isSeaCrossing":false},{"id":"feed_manufacturers->feed_traders","source":"feed_manufacturers","target":"feed_traders","isSeaCrossing":false},{"id":"feed_traders->eu_farmers","source":"feed_traders","target":"eu_farmers","isSeaCrossing":false}],"ticks":[{"period":0,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":1,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":2,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":3,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":4,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":5,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":6,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":7,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":8,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":9,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":10,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":11,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":12,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":13,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":14,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":15,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":16,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":17,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":18,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":19,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":20,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":21,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":22,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":23,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":24,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":25,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":26,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":27,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":28,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":29,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":30,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":31,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":32,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":33,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":34,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":35,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":36,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":37,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":38,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":39,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":40,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":41,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":42,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":43,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":44,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":45,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":46,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":47,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":48,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":49,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":50,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":51,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":52,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":53,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":54,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":55,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":56,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":57,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":58,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":59,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":60,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":61,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":62,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":63,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":64,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":65,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":66,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":67,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":68,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":69,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":70,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":71,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":72,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":73,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":74,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":75,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":76,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":77,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":78,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":79,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":80,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":81,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":82,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":83,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":84,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":85,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":86,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":87,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":88,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":89,"nodeId":"bra_farmers","values":{"quantity_available":600.0,"unit_price":660.0,"active":true}},{"period":90,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":91,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":92,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":93,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":94,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":95,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":96,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":97,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":98,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":99,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":100,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":101,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":102,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":103,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":104,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":105,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":106,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":107,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":108,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":109,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":110,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":111,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":112,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":113,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":114,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":115,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":116,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":117,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":118,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":119,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":120,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":121,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":122,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":123,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":124,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":125,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":126,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":127,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":128,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":129,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":130,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":131,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":132,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":133,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":134,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":135,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":136,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":137,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":138,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":139,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":140,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":141,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":142,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":143,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":144,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":145,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":146,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":147,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":148,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":149,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":150,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":151,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":152,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":153,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":154,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":155,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":156,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":157,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":158,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":159,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":160,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":161,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":162,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":163,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":164,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":165,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":166,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":167,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":168,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":169,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":170,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":171,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":172,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":173,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":174,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":175,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":176,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":177,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":178,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":179,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":180,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":181,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":182,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":183,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":184,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":185,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":186,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":187,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":188,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":189,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":190,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":191,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":192,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":193,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":194,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":195,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":196,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":197,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":198,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":199,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":200,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":201,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":202,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":203,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":204,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":205,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":206,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":207,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":208,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":209,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":210,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":211,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":212,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":213,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":214,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":215,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":216,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":217,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":218,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":219,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":220,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":221,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":222,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":223,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":224,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":225,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":226,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":227,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":228,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":229,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":230,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":231,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":232,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":233,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":234,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":235,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":236,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":237,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":238,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":239,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":240,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":241,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":242,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":243,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":244,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":245,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":246,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":247,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":248,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":249,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":250,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":251,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":252,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":253,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":254,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":255,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":256,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":257,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":258,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":259,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":260,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":261,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":262,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":263,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":264,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":265,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":266,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":267,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":268,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":269,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":270,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":271,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":272,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":273,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":274,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":275,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":276,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":277,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":278,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":279,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":280,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":281,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":282,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":283,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":284,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":285,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":286,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":287,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":288,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":289,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":290,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":291,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":292,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":293,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":294,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":295,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":296,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":297,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":298,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":299,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":300,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":301,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":302,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":303,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":304,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":305,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":306,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":307,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":308,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":309,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":310,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":311,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":312,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":313,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":314,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":315,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":316,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":317,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":318,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":319,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":320,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":321,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":322,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":323,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":324,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":325,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":326,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":327,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":328,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":329,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":330,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":331,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":332,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":333,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":334,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":335,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":336,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":337,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":338,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":339,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":340,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":341,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":342,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":343,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":344,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":345,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":346,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":347,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":348,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":349,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":350,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":351,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":352,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":353,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":354,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":355,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":356,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":357,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":358,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":359,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":360,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":361,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":362,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":363,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":364,"nodeId":"bra_farmers","values":{"quantity_available":1000.0,"unit_price":396.0,"active":true}},{"period":0,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":1,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":2,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":3,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":4,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":5,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":6,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":7,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":8,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":9,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":10,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":11,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":12,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":13,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":14,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":15,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":16,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":17,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":18,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":19,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":20,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":21,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":22,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":23,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":24,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":25,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":26,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":27,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":28,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":29,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":30,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":31,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":32,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":33,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":34,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":35,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":36,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":37,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":38,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":39,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":40,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":41,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":42,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":43,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":44,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":45,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":46,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":47,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":48,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":49,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":50,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":51,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":52,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":53,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":54,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":55,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":56,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":57,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":58,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":59,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":60,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":61,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":62,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":63,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":64,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":65,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":66,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":67,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":68,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":69,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":70,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":71,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":72,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":73,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":74,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":75,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":76,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":77,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":78,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":79,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":80,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":81,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":82,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":83,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":84,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":85,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":86,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":87,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":88,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":89,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":90,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":91,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":92,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":93,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":94,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":95,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":96,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":97,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":98,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":99,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":100,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":101,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":102,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":103,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":104,"nodeId":"arg_farmers","values":{"quantity_available":550.0,"unit_price":420.0,"active":true}},{"period":105,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":106,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":107,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":108,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":109,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":110,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":111,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":112,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":113,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":114,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":115,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":116,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":117,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":118,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":119,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":120,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":121,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":122,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":123,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":124,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":125,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":126,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":127,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":128,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":129,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":130,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":131,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":132,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":133,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":134,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":135,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":136,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":137,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":138,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":139,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":140,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":141,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":142,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":143,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":144,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":145,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":146,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":147,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":148,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":149,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":150,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":151,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":152,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":153,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":154,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":155,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":156,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":157,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":158,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":159,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":160,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":161,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":162,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":163,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":164,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":165,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":166,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":167,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":168,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":169,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":170,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":171,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":172,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":173,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":174,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":175,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":176,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":177,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":178,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":179,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":180,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":181,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":182,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":183,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":184,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":185,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":186,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":187,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":188,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":189,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":190,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":191,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":192,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":193,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":194,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":195,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":196,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":197,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":198,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":199,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":200,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":201,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":202,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":203,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":204,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":205,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":206,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":207,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":208,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":209,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":210,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":211,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":212,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":213,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":214,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":215,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":216,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":217,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":218,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":219,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":220,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":221,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":222,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":223,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":224,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":225,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":226,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":227,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":228,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":229,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":230,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":231,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":232,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":233,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":234,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":235,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":236,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":237,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":238,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":239,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":240,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":241,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":242,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":243,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":244,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":245,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":246,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":247,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":248,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":249,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":250,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":251,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":252,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":253,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":254,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":255,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":256,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":257,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":258,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":259,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":260,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":261,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":262,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":263,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":264,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":265,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":266,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":267,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":268,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":269,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":270,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":271,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":272,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":273,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":274,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":275,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":276,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":277,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":278,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":279,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":280,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":281,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":282,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":283,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":284,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":285,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":286,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":287,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":288,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":289,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":290,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":291,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":292,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":293,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":294,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":295,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":296,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":297,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":298,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":299,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":300,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":301,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":302,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":303,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":304,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":305,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":306,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":307,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":308,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":309,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":310,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":311,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":312,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":313,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":314,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":315,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":316,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":317,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":318,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":319,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":320,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":321,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":322,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":323,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":324,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":325,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":326,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":327,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":328,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":329,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":330,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":331,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":332,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":333,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":334,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":335,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":336,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":337,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":338,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":339,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":340,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":341,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":342,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":343,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":344,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":345,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":346,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":347,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":348,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":349,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":350,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":351,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":352,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":353,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":354,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":355,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":356,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":357,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":358,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":359,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":360,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":361,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":362,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":363,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":364,"nodeId":"arg_farmers","values":{"quantity_available":500.0,"unit_price":462.0,"active":true}},{"period":0,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":1,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":2,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":3,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":4,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":5,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":6,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":7,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":8,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":9,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":10,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":11,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":12,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":13,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":14,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":15,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":16,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":17,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":18,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":19,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":20,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":21,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":22,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":23,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":24,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":25,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":26,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":27,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":28,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":29,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":30,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":31,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":32,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":33,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":34,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":35,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":36,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":37,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":38,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":39,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":40,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":41,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":42,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":43,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":44,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":45,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":46,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":47,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":48,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":49,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":50,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":51,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":52,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":53,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":54,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":55,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":56,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":57,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":58,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":59,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":60,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":61,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":62,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":63,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":64,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":65,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":66,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":67,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":68,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":69,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":70,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":71,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":72,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":73,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":74,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":75,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":76,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":77,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":78,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":79,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":80,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":81,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":82,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":83,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":84,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":85,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":86,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":87,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":88,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":89,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":90,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":91,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":92,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":93,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":94,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":95,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":96,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":97,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":98,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":99,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":100,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":101,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":102,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":103,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":104,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":105,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":106,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":107,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":108,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":109,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":110,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":111,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":112,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":113,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":114,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":115,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":116,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":117,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":118,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":119,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":120,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":121,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":122,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":123,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":124,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":125,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":126,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":127,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":128,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":129,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":130,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":131,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":132,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":133,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":134,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":135,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":136,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":137,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":138,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":139,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":140,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":141,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":142,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":143,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":144,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":145,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":146,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":147,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":148,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":149,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":150,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":151,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":152,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":153,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":154,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":155,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":156,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":157,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":158,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":159,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":160,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":161,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":162,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":163,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":164,"nodeId":"usa_farmers","values":{"quantity_available":920.0,"unit_price":459.1304,"active":true}},{"period":165,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":166,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":167,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":168,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":169,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":170,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":171,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":172,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":173,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":174,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":175,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":176,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":177,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":178,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":179,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":180,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":181,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":182,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":183,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":184,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":185,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":186,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":187,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":188,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":189,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":190,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":191,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":192,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":193,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":194,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":195,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":196,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":197,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":198,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":199,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":200,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":201,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":202,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":203,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":204,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":205,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":206,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":207,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":208,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":209,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":210,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":211,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":212,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":213,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":214,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":215,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":216,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":217,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":218,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":219,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":220,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":221,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":222,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":223,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":224,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":225,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":226,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":227,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":228,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":229,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":230,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":231,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":232,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":233,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":234,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":235,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":236,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":237,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":238,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":239,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":240,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":241,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":242,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":243,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":244,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":245,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":246,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":247,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":248,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":249,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":250,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":251,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":252,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":253,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":254,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":255,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":256,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":257,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":258,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":259,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":260,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":261,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":262,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":263,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":264,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":265,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":266,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":267,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":268,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":269,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":270,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":271,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":272,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":273,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":274,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":275,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":276,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":277,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":278,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":279,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":280,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":281,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":282,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":283,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":284,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":285,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":286,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":287,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":288,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":289,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":290,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":291,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":292,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":293,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":294,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":295,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":296,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":297,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":298,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":299,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":300,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":301,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":302,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":303,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":304,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":305,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":306,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":307,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":308,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":309,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":310,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":311,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":312,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":313,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":314,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":315,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":316,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":317,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":318,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":319,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":320,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":321,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":322,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":323,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":324,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":325,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":326,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":327,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":328,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":329,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":330,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":331,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":332,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":333,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":334,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":335,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":336,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":337,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":338,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":339,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":340,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":341,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":342,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":343,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":344,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":345,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":346,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":347,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":348,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":349,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":350,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":351,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":352,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":353,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":354,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":355,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":356,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":357,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":358,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":359,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":360,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":361,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":362,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":363,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":364,"nodeId":"usa_farmers","values":{"quantity_available":800.0,"unit_price":528.0,"active":true}},{"period":0,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":1,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":2,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":3,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":4,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":5,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":6,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":7,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":8,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":9,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":10,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":11,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":12,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":13,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":14,"nodeId":"wholesalers","values":{"quantity_available":1900.0,"unit_price":633.6,"bra_volume":600.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2217}},{"period":15,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":16,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":17,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":18,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":19,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":20,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":21,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":22,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":23,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":24,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":25,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":26,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":27,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":28,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":29,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":30,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":31,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":32,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":33,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":34,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":35,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":36,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":37,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":38,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":39,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":40,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":41,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":42,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":43,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":44,"nodeId":"wholesalers","values":{"quantity_available":1950.0,"unit_price":617.3538,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":800.0,"storage_utilization":0.2275}},{"period":45,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":46,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":47,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":48,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":49,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":50,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":51,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":52,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":53,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":54,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":55,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":56,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":57,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":58,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":59,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":60,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":61,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":62,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":63,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":64,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":65,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":66,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":67,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":68,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":69,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":70,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":71,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":72,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":73,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":74,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":75,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":76,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":77,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":78,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":79,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":80,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":81,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":82,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":83,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":84,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":85,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":86,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":87,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":88,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":89,"nodeId":"wholesalers","values":{"quantity_available":2070.0,"unit_price":581.5652,"bra_volume":600.0,"arg_volume":550.0,"usa_volume":920.0,"storage_utilization":0.2415}},{"period":90,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":91,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":92,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":93,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":94,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":95,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":96,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":97,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":98,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":99,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":100,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":101,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":102,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":103,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":104,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":486.0794,"bra_volume":1000.0,"arg_volume":550.0,"usa_volume":750.0,"storage_utilization":0.2683}},{"period":105,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":106,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":107,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":108,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":109,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":110,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":111,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":112,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":113,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":114,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":115,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":116,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":117,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":118,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":119,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":120,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":121,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":122,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":123,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":124,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":125,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":126,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":127,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":128,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":129,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":130,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":131,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":132,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":133,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":134,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":135,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":136,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":137,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":138,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":139,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":140,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":141,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":142,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":143,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":144,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":145,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":146,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":147,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":148,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":149,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":150,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":151,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":152,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":153,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":154,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":155,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":156,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":157,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":158,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":159,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":160,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":161,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":162,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":163,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":164,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":496.8939,"bra_volume":1000.0,"arg_volume":380.0,"usa_volume":920.0,"storage_utilization":0.2683}},{"period":165,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":166,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":167,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":168,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":169,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":170,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":171,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":172,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":173,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":174,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":175,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":176,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":177,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":178,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":179,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":180,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":181,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":182,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":183,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":184,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":185,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":186,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":187,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":188,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":189,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":190,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":191,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":192,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":193,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":194,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":195,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":196,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":197,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":198,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":199,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":200,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":201,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":202,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":203,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":204,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":205,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":206,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":207,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":208,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":209,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":210,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":211,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":212,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":213,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":214,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":215,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":216,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":217,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":218,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":219,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":220,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":221,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":222,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":223,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":224,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":225,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":226,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":227,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":228,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":229,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":230,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":231,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":232,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":233,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":234,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":235,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":236,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":237,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":238,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":239,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":240,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":241,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":242,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":243,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":244,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":245,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":246,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":247,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":248,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":249,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":250,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":251,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":252,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":253,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":254,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":255,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":256,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":257,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":258,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":259,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":260,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":261,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":262,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":263,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":264,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":265,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":266,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":267,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":268,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":269,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":270,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":271,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":272,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":273,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":274,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":275,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":276,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":277,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":278,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":279,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":280,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":281,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":282,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":283,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":284,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":285,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":286,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":287,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":288,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":289,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":290,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":291,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":292,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":293,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":294,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":295,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":296,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":297,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":298,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":299,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":300,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":301,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":302,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":303,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":304,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":305,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":306,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":307,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":308,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":309,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":310,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":311,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":312,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":313,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":314,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":315,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":316,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":317,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":318,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":319,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":320,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":321,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":322,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":323,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":324,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":325,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":326,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":327,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":328,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":329,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":330,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":331,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":332,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":333,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":334,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":335,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":336,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":337,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":338,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":339,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":340,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":341,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":342,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":343,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":344,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":345,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":346,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":347,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":348,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":349,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":350,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":351,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":352,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":353,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":354,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":355,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":356,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":357,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":358,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":359,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":360,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":361,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":362,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":363,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":364,"nodeId":"wholesalers","values":{"quantity_available":2300.0,"unit_price":523.4087,"bra_volume":1000.0,"arg_volume":500.0,"usa_volume":800.0,"storage_utilization":0.2683}},{"period":0,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":1,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":2,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":3,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":4,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":5,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":6,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":7,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":8,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":9,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":10,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":11,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":12,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":13,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":14,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1259.3711}},{"period":15,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":16,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":17,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":18,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":19,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":20,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1233.9484}},{"period":21,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":22,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":23,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":24,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":25,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":26,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":27,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":28,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":29,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":30,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":31,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":32,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":33,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":34,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":35,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":36,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":37,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":38,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":39,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":40,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":41,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":42,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":43,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":44,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1235.0013}},{"period":45,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":46,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":47,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":48,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":49,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":50,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1178.9179}},{"period":51,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":52,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":53,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":54,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":55,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":56,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":57,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":58,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":59,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":60,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":61,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":62,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":63,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":64,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":65,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":66,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":67,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":68,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":69,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":70,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":71,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":72,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":73,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":74,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":75,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":76,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":77,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":78,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":79,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":80,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":81,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":82,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":83,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":84,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":85,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":86,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":87,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":88,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":89,"nodeId":"processors","values":{"quantity_available":544.0,"unit_price":1177.9952}},{"period":90,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":91,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":92,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":93,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":94,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":95,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":96,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":97,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":98,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":99,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":100,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":101,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":102,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":103,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":104,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":996.0663}},{"period":105,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":106,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":107,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":108,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":109,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":110,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":111,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":112,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":113,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":114,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":115,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":116,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":117,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":118,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":119,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":120,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":121,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":122,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":123,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":124,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":125,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":126,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":127,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":128,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":129,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":130,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":131,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":132,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":133,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1011.2067}},{"period":134,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":135,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":136,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":137,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":138,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":139,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":140,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":141,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":142,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":143,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":144,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":145,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":146,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":147,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":148,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":149,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":150,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":151,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":152,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":153,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":154,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":155,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":156,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":157,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":158,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":159,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":160,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":161,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":162,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":163,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":164,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1008.5515}},{"period":165,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":166,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":167,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":168,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":169,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":170,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":171,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":172,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":173,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":174,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":175,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":176,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":177,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":178,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":179,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":180,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":181,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":182,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":183,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":184,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":185,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":186,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":187,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":188,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":189,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":190,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":191,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":192,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":193,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":194,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":195,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":196,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":197,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":198,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":199,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":200,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":201,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":202,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":203,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":204,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":205,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":206,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":207,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":208,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":209,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":210,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":211,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":212,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":213,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":214,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":215,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":216,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":217,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":218,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":219,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":220,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":221,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":222,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":223,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":224,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":225,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":226,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":227,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":228,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":229,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":230,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":231,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":232,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":233,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":234,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":235,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":236,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":237,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":238,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":239,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":240,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":241,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":242,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":243,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":244,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":245,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":246,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":247,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":248,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":249,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":250,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":251,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":252,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":253,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":254,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":255,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":256,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":257,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":258,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":259,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":260,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":261,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":262,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":263,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":264,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":265,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":266,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":267,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":268,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":269,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":270,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":271,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":272,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":273,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":274,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":275,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":276,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":277,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":278,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":279,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":280,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":281,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":282,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":283,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":284,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":285,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":286,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":287,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":288,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":289,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":290,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":291,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":292,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":293,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":294,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":295,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":296,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":297,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":298,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":299,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":300,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":301,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":302,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":303,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":304,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":305,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":306,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":307,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":308,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":309,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":310,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":311,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":312,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":313,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":314,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":315,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":316,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":317,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":318,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":319,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":320,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":321,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":322,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":323,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":324,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":325,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":326,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":327,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":328,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":329,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":330,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":331,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":332,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":333,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":334,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":335,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":336,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":337,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":338,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":339,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":340,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":341,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":342,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":343,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":344,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":345,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":346,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":347,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":348,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":349,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":350,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":351,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":352,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":353,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":354,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":355,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":356,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":357,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":358,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":359,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":360,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":361,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":362,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":363,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":364,"nodeId":"processors","values":{"quantity_available":640.0,"unit_price":1045.6722}},{"period":0,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":1,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":2,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":3,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":4,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":5,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":6,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":7,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":8,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":9,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":10,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":11,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":12,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":13,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":14,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1458.1023}},{"period":15,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":16,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":17,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":18,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":19,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":20,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1430.1374}},{"period":21,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":22,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":23,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":24,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":25,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":26,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":27,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":28,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":29,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":30,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":31,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":32,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":33,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":34,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":35,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":36,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":37,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":38,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":39,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":40,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":41,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":42,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":43,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":44,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1431.2955}},{"period":45,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":46,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":47,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":48,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":49,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":50,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1369.6039}},{"period":51,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":52,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":53,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":54,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":55,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":56,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":57,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":58,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":59,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":60,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":61,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":62,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":63,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":64,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":65,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":66,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":67,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":68,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":69,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":70,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":71,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":72,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":73,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":74,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":75,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":76,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":77,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":78,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":79,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":80,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":81,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":82,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":83,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":84,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":85,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":86,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":87,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":88,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":89,"nodeId":"feed_manufacturers","values":{"quantity_available":544.0,"unit_price":1368.5889}},{"period":90,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":91,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":92,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":93,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":94,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":95,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":96,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":97,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":98,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":99,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":100,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":101,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":102,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":103,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":104,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1157.548}},{"period":105,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":106,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":107,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":108,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":109,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":110,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":111,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":112,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":113,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":114,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":115,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":116,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":117,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":118,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":119,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":120,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":121,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":122,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":123,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":124,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":125,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":126,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":127,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":128,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":129,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":130,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":131,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":132,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":133,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1174.2023}},{"period":134,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":135,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":136,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":137,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":138,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":139,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":140,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":141,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":142,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":143,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":144,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":145,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":146,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":147,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":148,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":149,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":150,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":151,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":152,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":153,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":154,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":155,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":156,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":157,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":158,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":159,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":160,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":161,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":162,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":163,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":164,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1171.2816}},{"period":165,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":166,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":167,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":168,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":169,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":170,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":171,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":172,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":173,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":174,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":175,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":176,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":177,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":178,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":179,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":180,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":181,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":182,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":183,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":184,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":185,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":186,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":187,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":188,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":189,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":190,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":191,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":192,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":193,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":194,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":195,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":196,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":197,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":198,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":199,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":200,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":201,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":202,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":203,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":204,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":205,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":206,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":207,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":208,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":209,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":210,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":211,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":212,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":213,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":214,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":215,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":216,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":217,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":218,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":219,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":220,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":221,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":222,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":223,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":224,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":225,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":226,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":227,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":228,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":229,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":230,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":231,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":232,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":233,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":234,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":235,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":236,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":237,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":238,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":239,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":240,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":241,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":242,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":243,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":244,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":245,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":246,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":247,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":248,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":249,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":250,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":251,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":252,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":253,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":254,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":255,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":256,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":257,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":258,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":259,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":260,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":261,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":262,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":263,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":264,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":265,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":266,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":267,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":268,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":269,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":270,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":271,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":272,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":273,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":274,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":275,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":276,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":277,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":278,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":279,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":280,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":281,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":282,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":283,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":284,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":285,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":286,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":287,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":288,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":289,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":290,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":291,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":292,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":293,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":294,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":295,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":296,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":297,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":298,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":299,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":300,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":301,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":302,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":303,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":304,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":305,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":306,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":307,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":308,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":309,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":310,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":311,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":312,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":313,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":314,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":315,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":316,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":317,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":318,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":319,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":320,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":321,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":322,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":323,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":324,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":325,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":326,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":327,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":328,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":329,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":330,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":331,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":332,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":333,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":334,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":335,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":336,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":337,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":338,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":339,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":340,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":341,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":342,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":343,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":344,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":345,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":346,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":347,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":348,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":349,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":350,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":351,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":352,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":353,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":354,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":355,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":356,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":357,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":358,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":359,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":360,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":361,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":362,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":363,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":364,"nodeId":"feed_manufacturers","values":{"quantity_available":640.0,"unit_price":1212.1144}},{"period":0,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":1,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":2,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":3,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":4,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":5,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":6,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":7,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":8,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":9,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":10,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":11,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":12,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":13,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":14,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1622.3975}},{"period":15,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":16,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":17,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":18,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":19,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":20,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1592.1954}},{"period":21,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":22,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":23,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":24,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":25,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":26,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":27,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":28,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":29,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":30,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":31,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":32,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":33,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":34,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":35,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":36,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":37,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":38,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":39,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":40,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":41,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":42,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":43,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":44,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1593.4462}},{"period":45,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":46,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":47,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":48,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":49,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":50,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1526.8192}},{"period":51,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":52,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":53,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":54,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":55,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":56,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":57,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":58,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":59,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":60,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":61,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":62,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":63,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":64,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":65,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":66,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":67,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":68,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":69,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":70,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":71,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":72,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":73,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":74,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":75,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":76,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":77,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":78,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":79,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":80,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":81,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":82,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":83,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":84,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":85,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":86,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":87,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":88,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":89,"nodeId":"feed_traders","values":{"quantity_available":544.0,"unit_price":1525.723}},{"period":90,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":91,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":92,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":93,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":94,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":95,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":96,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":97,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":98,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":99,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":100,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":101,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":102,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":103,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":104,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1290.6518}},{"period":105,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":106,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":107,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":108,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":109,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":110,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":111,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":112,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":113,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":114,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":115,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":116,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":117,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":118,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":119,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":120,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":121,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":122,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":123,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":124,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":125,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":126,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":127,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":128,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":129,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":130,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":131,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":132,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":133,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1308.6385}},{"period":134,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":135,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":136,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":137,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":138,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":139,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":140,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":141,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":142,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":143,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":144,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":145,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":146,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":147,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":148,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":149,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":150,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":151,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":152,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":153,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":154,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":155,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":156,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":157,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":158,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":159,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":160,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":161,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":162,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":163,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":164,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1305.4842}},{"period":165,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":166,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":167,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":168,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":169,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":170,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":171,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":172,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":173,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":174,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":175,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":176,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":177,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":178,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":179,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":180,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":181,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":182,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":183,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":184,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":185,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":186,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":187,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":188,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":189,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":190,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":191,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":192,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":193,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":194,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":195,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":196,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":197,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":198,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":199,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":200,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":201,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":202,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":203,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":204,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":205,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":206,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":207,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":208,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":209,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":210,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":211,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":212,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":213,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":214,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":215,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":216,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":217,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":218,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":219,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":220,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":221,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":222,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":223,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":224,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":225,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":226,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":227,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":228,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":229,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":230,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":231,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":232,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":233,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":234,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":235,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":236,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":237,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":238,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":239,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":240,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":241,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":242,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":243,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":244,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":245,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":246,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":247,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":248,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":249,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":250,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":251,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":252,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":253,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":254,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":255,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":256,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":257,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":258,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":259,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":260,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":261,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":262,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":263,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":264,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":265,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":266,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":267,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":268,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":269,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":270,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":271,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":272,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":273,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":274,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":275,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":276,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":277,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":278,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":279,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":280,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":281,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":282,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":283,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":284,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":285,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":286,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":287,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":288,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":289,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":290,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":291,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":292,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":293,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":294,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":295,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":296,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":297,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":298,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":299,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":300,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":301,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":302,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":303,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":304,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":305,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":306,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":307,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":308,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":309,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":310,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":311,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":312,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":313,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":314,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":315,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":316,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":317,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":318,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":319,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":320,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":321,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":322,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":323,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":324,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":325,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":326,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":327,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":328,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":329,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":330,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":331,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":332,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":333,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":334,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":335,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":336,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":337,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":338,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":339,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":340,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":341,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":342,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":343,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":344,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":345,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":346,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":347,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":348,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":349,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":350,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":351,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":352,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":353,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":354,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":355,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":356,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":357,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":358,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":359,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":360,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":361,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":362,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":363,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":364,"nodeId":"feed_traders","values":{"quantity_available":640.0,"unit_price":1349.5835}},{"period":0,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":1,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":2,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":3,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":4,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":5,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":6,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":7,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":8,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":9,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":10,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":11,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":12,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":13,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":14,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":15,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":16,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":17,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":18,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":19,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":20,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":21,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":22,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":23,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":24,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":25,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":26,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":27,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":28,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":29,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":30,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":31,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":32,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":33,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":34,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":35,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":36,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":37,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":38,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":39,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":40,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":41,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":42,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":43,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":44,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":45,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":46,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":47,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":48,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":49,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":50,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":51,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":52,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":53,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":54,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":55,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":56,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":57,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":58,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":59,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":60,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":61,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":62,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":63,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":64,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":65,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":66,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":67,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":68,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":69,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":70,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":71,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":72,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":73,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":74,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":75,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":76,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":77,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":78,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":79,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":80,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":81,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":82,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":83,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":84,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":85,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":86,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":87,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":88,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":89,"nodeId":"eu_farmers","values":{"feed_received":544.0,"livestock_output":544.0,"active":true}},{"period":90,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":91,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":92,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":93,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":94,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":95,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":96,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":97,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":98,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":99,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":100,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":101,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":102,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":103,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":104,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":105,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":106,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":107,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":108,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":109,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":110,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":111,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":112,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":113,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":114,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":115,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":116,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":117,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":118,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":119,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":120,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":121,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":122,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":123,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":124,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":125,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":126,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":127,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":128,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":129,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":130,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":131,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":132,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":133,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":134,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":135,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":136,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":137,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":138,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":139,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":140,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":141,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":142,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":143,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":144,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":145,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":146,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":147,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":148,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":149,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":150,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":151,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":152,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":153,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":154,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":155,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":156,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":157,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":158,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":159,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":160,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":161,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":162,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":163,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":164,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":165,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":166,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":167,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":168,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":169,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":170,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":171,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":172,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":173,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":174,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":175,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":176,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":177,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":178,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":179,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":180,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":181,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":182,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":183,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":184,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":185,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":186,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":187,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":188,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":189,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":190,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":191,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":192,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":193,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":194,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":195,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":196,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":197,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":198,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":199,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":200,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":201,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":202,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":203,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":204,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":205,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":206,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":207,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":208,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":209,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":210,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":211,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":212,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":213,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":214,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":215,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":216,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":217,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":218,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":219,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":220,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":221,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":222,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":223,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":224,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":225,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":226,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":227,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":228,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":229,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":230,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":231,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":232,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":233,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":234,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":235,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":236,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":237,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":238,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":239,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":240,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":241,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":242,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":243,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":244,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":245,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":246,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":247,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":248,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":249,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":250,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":251,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":252,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":253,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":254,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":255,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":256,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":257,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":258,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":259,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":260,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":261,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":262,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":263,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":264,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":265,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":266,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":267,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":268,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":269,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":270,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":271,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":272,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":273,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":274,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":275,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":276,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":277,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":278,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":279,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":280,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":281,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":282,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":283,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":284,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":285,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":286,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":287,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":288,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":289,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":290,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":291,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":292,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":293,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":294,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":295,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":296,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":297,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":298,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":299,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":300,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":301,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":302,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":303,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":304,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":305,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":306,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":307,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":308,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":309,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":310,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":311,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":312,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":313,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":314,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":315,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":316,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":317,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":318,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":319,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":320,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":321,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":322,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":323,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":324,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":325,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":326,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":327,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":328,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":329,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":330,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":331,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":332,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":333,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":334,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":335,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":336,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":337,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":338,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":339,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":340,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":341,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":342,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":343,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":344,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":345,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":346,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":347,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":348,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":349,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":350,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":351,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":352,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":353,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":354,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":355,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":356,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":357,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":358,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":359,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":360,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":361,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":362,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":363,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}},{"period":364,"nodeId":"eu_farmers","values":{"feed_received":640.0,"livestock_output":640.0,"active":true}}],"env":[{"period":0,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":1.0},{"period":1,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":2.0},{"period":2,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":3.0},{"period":3,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":4.0},{"period":4,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":5.0},{"period":5,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":6.0},{"period":6,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":7.0},{"period":7,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":8.0},{"period":8,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":9.0},{"period":9,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":10.0},{"period":10,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":11.0},{"period":11,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":12.0},{"period":12,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":13.0},{"period":13,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5575,"currentStep":14.0},{"period":14,"sojaPrice":633.6,"feedPrice":1622.3975,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1900.0,"transportUtilisation":0.5718,"currentStep":15.0},{"period":15,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":16.0},{"period":16,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":17.0},{"period":17,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":18.0},{"period":18,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":19.0},{"period":19,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":20.0},{"period":20,"sojaPrice":617.3538,"feedPrice":1592.1954,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5781,"currentStep":21.0},{"period":21,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5813,"currentStep":22.0},{"period":22,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":23.0},{"period":23,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":24.0},{"period":24,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":25.0},{"period":25,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":26.0},{"period":26,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":27.0},{"period":27,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":28.0},{"period":28,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":29.0},{"period":29,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":30.0},{"period":30,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":31.0},{"period":31,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":32.0},{"period":32,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":33.0},{"period":33,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":34.0},{"period":34,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":35.0},{"period":35,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":36.0},{"period":36,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":37.0},{"period":37,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":38.0},{"period":38,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":39.0},{"period":39,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":40.0},{"period":40,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":41.0},{"period":41,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":42.0},{"period":42,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":43.0},{"period":43,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":44.0},{"period":44,"sojaPrice":617.3538,"feedPrice":1593.4462,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":1950.0,"transportUtilisation":0.5836,"currentStep":45.0},{"period":45,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":46.0},{"period":46,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":47.0},{"period":47,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":48.0},{"period":48,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":49.0},{"period":49,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":50.0},{"period":50,"sojaPrice":581.5652,"feedPrice":1526.8192,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5986,"currentStep":51.0},{"period":51,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5954,"currentStep":52.0},{"period":52,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":53.0},{"period":53,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":54.0},{"period":54,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":55.0},{"period":55,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":56.0},{"period":56,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":57.0},{"period":57,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":58.0},{"period":58,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":59.0},{"period":59,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":60.0},{"period":60,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":61.0},{"period":61,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":62.0},{"period":62,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":63.0},{"period":63,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":64.0},{"period":64,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":65.0},{"period":65,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":66.0},{"period":66,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":67.0},{"period":67,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":68.0},{"period":68,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":69.0},{"period":69,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":70.0},{"period":70,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":71.0},{"period":71,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":72.0},{"period":72,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":73.0},{"period":73,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":74.0},{"period":74,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":75.0},{"period":75,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":76.0},{"period":76,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":77.0},{"period":77,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":78.0},{"period":78,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":79.0},{"period":79,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":80.0},{"period":80,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":81.0},{"period":81,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":82.0},{"period":82,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":83.0},{"period":83,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":84.0},{"period":84,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":85.0},{"period":85,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":86.0},{"period":86,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":87.0},{"period":87,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":88.0},{"period":88,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":89.0},{"period":89,"sojaPrice":581.5652,"feedPrice":1525.723,"shockScale":1.0,"droughtSeverity":0.4,"totalSojaSupply":2070.0,"transportUtilisation":0.5931,"currentStep":90.0},{"period":90,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":91.0},{"period":91,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":92.0},{"period":92,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":93.0},{"period":93,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":94.0},{"period":94,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":95.0},{"period":95,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":96.0},{"period":96,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":97.0},{"period":97,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":98.0},{"period":98,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":99.0},{"period":99,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":100.0},{"period":100,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":101.0},{"period":101,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":102.0},{"period":102,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":103.0},{"period":103,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":104.0},{"period":104,"sojaPrice":486.0794,"feedPrice":1290.6518,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2470.0,"transportUtilisation":0.655,"currentStep":105.0},{"period":105,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":106.0},{"period":106,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":107.0},{"period":107,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":108.0},{"period":108,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":109.0},{"period":109,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":110.0},{"period":110,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":111.0},{"period":111,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":112.0},{"period":112,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":113.0},{"period":113,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":114.0},{"period":114,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":115.0},{"period":115,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":116.0},{"period":116,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":117.0},{"period":117,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":118.0},{"period":118,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":119.0},{"period":119,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":120.0},{"period":120,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":121.0},{"period":121,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":122.0},{"period":122,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":123.0},{"period":123,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":124.0},{"period":124,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":125.0},{"period":125,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":126.0},{"period":126,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":127.0},{"period":127,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":128.0},{"period":128,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":129.0},{"period":129,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":130.0},{"period":130,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":131.0},{"period":131,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":132.0},{"period":132,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":133.0},{"period":133,"sojaPrice":496.8939,"feedPrice":1308.6385,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.655,"currentStep":134.0},{"period":134,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":135.0},{"period":135,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":136.0},{"period":136,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":137.0},{"period":137,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":138.0},{"period":138,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":139.0},{"period":139,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":140.0},{"period":140,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":141.0},{"period":141,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":142.0},{"period":142,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":143.0},{"period":143,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":144.0},{"period":144,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":145.0},{"period":145,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":146.0},{"period":146,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":147.0},{"period":147,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":148.0},{"period":148,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":149.0},{"period":149,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":150.0},{"period":150,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":151.0},{"period":151,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":152.0},{"period":152,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":153.0},{"period":153,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":154.0},{"period":154,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":155.0},{"period":155,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":156.0},{"period":156,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":157.0},{"period":157,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":158.0},{"period":158,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":159.0},{"period":159,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":160.0},{"period":160,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":161.0},{"period":161,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":162.0},{"period":162,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":163.0},{"period":163,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":164.0},{"period":164,"sojaPrice":496.8939,"feedPrice":1305.4842,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2420.0,"transportUtilisation":0.6625,"currentStep":165.0},{"period":165,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":166.0},{"period":166,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":167.0},{"period":167,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":168.0},{"period":168,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":169.0},{"period":169,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":170.0},{"period":170,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":171.0},{"period":171,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":172.0},{"period":172,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":173.0},{"period":173,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":174.0},{"period":174,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":175.0},{"period":175,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":176.0},{"period":176,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":177.0},{"period":177,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":178.0},{"period":178,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":179.0},{"period":179,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":180.0},{"period":180,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":181.0},{"period":181,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":182.0},{"period":182,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":183.0},{"period":183,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":184.0},{"period":184,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":185.0},{"period":185,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":186.0},{"period":186,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":187.0},{"period":187,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":188.0},{"period":188,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":189.0},{"period":189,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":190.0},{"period":190,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":191.0},{"period":191,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":192.0},{"period":192,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":193.0},{"period":193,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":194.0},{"period":194,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":195.0},{"period":195,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":196.0},{"period":196,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":197.0},{"period":197,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":198.0},{"period":198,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":199.0},{"period":199,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":200.0},{"period":200,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":201.0},{"period":201,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":202.0},{"period":202,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":203.0},{"period":203,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":204.0},{"period":204,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":205.0},{"period":205,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":206.0},{"period":206,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":207.0},{"period":207,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":208.0},{"period":208,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":209.0},{"period":209,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":210.0},{"period":210,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":211.0},{"period":211,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":212.0},{"period":212,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":213.0},{"period":213,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":214.0},{"period":214,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":215.0},{"period":215,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":216.0},{"period":216,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":217.0},{"period":217,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":218.0},{"period":218,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":219.0},{"period":219,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":220.0},{"period":220,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":221.0},{"period":221,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":222.0},{"period":222,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":223.0},{"period":223,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":224.0},{"period":224,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":225.0},{"period":225,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":226.0},{"period":226,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":227.0},{"period":227,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":228.0},{"period":228,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":229.0},{"period":229,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":230.0},{"period":230,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":231.0},{"period":231,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":232.0},{"period":232,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":233.0},{"period":233,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":234.0},{"period":234,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":235.0},{"period":235,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":236.0},{"period":236,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":237.0},{"period":237,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":238.0},{"period":238,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":239.0},{"period":239,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":240.0},{"period":240,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":241.0},{"period":241,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":242.0},{"period":242,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":243.0},{"period":243,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":244.0},{"period":244,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":245.0},{"period":245,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":246.0},{"period":246,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":247.0},{"period":247,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":248.0},{"period":248,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":249.0},{"period":249,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":250.0},{"period":250,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":251.0},{"period":251,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":252.0},{"period":252,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":253.0},{"period":253,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":254.0},{"period":254,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":255.0},{"period":255,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":256.0},{"period":256,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":257.0},{"period":257,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":258.0},{"period":258,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":259.0},{"period":259,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":260.0},{"period":260,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":261.0},{"period":261,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":262.0},{"period":262,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":263.0},{"period":263,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":264.0},{"period":264,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":265.0},{"period":265,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":266.0},{"period":266,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":267.0},{"period":267,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":268.0},{"period":268,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":269.0},{"period":269,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":270.0},{"period":270,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":271.0},{"period":271,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":272.0},{"period":272,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":273.0},{"period":273,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":274.0},{"period":274,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":275.0},{"period":275,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":276.0},{"period":276,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":277.0},{"period":277,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":278.0},{"period":278,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":279.0},{"period":279,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":280.0},{"period":280,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":281.0},{"period":281,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":282.0},{"period":282,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":283.0},{"period":283,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":284.0},{"period":284,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":285.0},{"period":285,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":286.0},{"period":286,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":287.0},{"period":287,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":288.0},{"period":288,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":289.0},{"period":289,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":290.0},{"period":290,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":291.0},{"period":291,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":292.0},{"period":292,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":293.0},{"period":293,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":294.0},{"period":294,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":295.0},{"period":295,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":296.0},{"period":296,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":297.0},{"period":297,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":298.0},{"period":298,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":299.0},{"period":299,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":1.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":300.0},{"period":300,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":301.0},{"period":301,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":302.0},{"period":302,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":303.0},{"period":303,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":304.0},{"period":304,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":305.0},{"period":305,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":306.0},{"period":306,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":307.0},{"period":307,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":308.0},{"period":308,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":309.0},{"period":309,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":310.0},{"period":310,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":311.0},{"period":311,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":312.0},{"period":312,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":313.0},{"period":313,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":314.0},{"period":314,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":315.0},{"period":315,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":316.0},{"period":316,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":317.0},{"period":317,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":318.0},{"period":318,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":319.0},{"period":319,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":320.0},{"period":320,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":321.0},{"period":321,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":322.0},{"period":322,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":323.0},{"period":323,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":324.0},{"period":324,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":325.0},{"period":325,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":326.0},{"period":326,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":327.0},{"period":327,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":328.0},{"period":328,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":329.0},{"period":329,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":330.0},{"period":330,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":331.0},{"period":331,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":332.0},{"period":332,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":333.0},{"period":333,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":334.0},{"period":334,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":335.0},{"period":335,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":336.0},{"period":336,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":337.0},{"period":337,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":338.0},{"period":338,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":339.0},{"period":339,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":340.0},{"period":340,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":341.0},{"period":341,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":342.0},{"period":342,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":343.0},{"period":343,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":344.0},{"period":344,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":345.0},{"period":345,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":346.0},{"period":346,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":347.0},{"period":347,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":348.0},{"period":348,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":349.0},{"period":349,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":350.0},{"period":350,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":351.0},{"period":351,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":352.0},{"period":352,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":353.0},{"period":353,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":354.0},{"period":354,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":355.0},{"period":355,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":356.0},{"period":356,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":357.0},{"period":357,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":358.0},{"period":358,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":359.0},{"period":359,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":360.0},{"period":360,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":361.0},{"period":361,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":362.0},{"period":362,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":363.0},{"period":363,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":364.0},{"period":364,"sojaPrice":523.4087,"feedPrice":1349.5835,"shockScale":0.0,"droughtSeverity":0.0,"totalSojaSupply":2300.0,"transportUtilisation":0.6625,"currentStep":365.0}]} \ No newline at end of file diff --git a/web/public/textures/earth-blue-marble.jpg b/web/public/textures/earth-blue-marble.jpg new file mode 100644 index 0000000..e673a7c Binary files /dev/null and b/web/public/textures/earth-blue-marble.jpg differ diff --git a/web/public/textures/earth-topology.png b/web/public/textures/earth-topology.png new file mode 100644 index 0000000..666be00 Binary files /dev/null and b/web/public/textures/earth-topology.png differ diff --git a/web/public/textures/night-sky.png b/web/public/textures/night-sky.png new file mode 100644 index 0000000..f5d4f2b Binary files /dev/null and b/web/public/textures/night-sky.png differ diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 0000000..81631fd --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,156 @@ +import { useEffect, useMemo, useState, type CSSProperties } from 'react' +import type { DataSource } from './data/source' +import type { Bundle } from './data/types' +import { resolveScene } from './data/gazetteer' +import { designVars } from './design/tokens' +import GlobeView from './globe/GlobeView' +import { buildDynamics } from './playback/dynamics' +import Timeline from './playback/Timeline' +import './app.css' + +/** How long each playback step is held, in milliseconds. */ +const STEP_INTERVAL_MS = 60 + +interface AppProps { + /** Injected at the composition root. The view never names a concrete source. */ + source: DataSource +} + +function App({ source }: AppProps) { + const [bundle, setBundle] = useState(null) + const [error, setError] = useState(null) + + useEffect(() => { + let cancelled = false + source + .getBundle() + .then((nextBundle) => { + if (!cancelled) setBundle(nextBundle) + }) + .catch((reason: unknown) => { + if (!cancelled) setError(reason instanceof Error ? reason.message : String(reason)) + }) + return () => { + cancelled = true + } + }, [source]) + + return +} + +interface MapViewProps { + bundle: Bundle | null + sourceName: string + error: string | null +} + +const themeStyle = designVars as CSSProperties + +function MapView({ bundle, sourceName, error }: MapViewProps) { + // Unknown placements are deliberately absent, never silently replaced by a + // country centroid. The console warning is the visible integration signal. + const scene = useMemo( + () => (bundle ? resolveScene(bundle.nodes, bundle.edges) : null), + [bundle], + ) + + const dynamics = useMemo(() => (bundle ? buildDynamics(bundle) : null), [bundle]) + const stepCount = dynamics?.periods.length ?? 0 + + const [index, setIndex] = useState(0) + const [playing, setPlaying] = useState(false) + + // Reset and auto-play whenever a new bundle (with more than one step) loads. + useEffect(() => { + setIndex(0) + setPlaying(stepCount > 1) + }, [stepCount]) + + useEffect(() => { + if (!playing || stepCount <= 1) return + const id = window.setInterval(() => setIndex((i) => (i + 1) % stepCount), STEP_INTERVAL_MS) + return () => window.clearInterval(id) + }, [playing, stepCount]) + + useEffect(() => { + if (!scene) return + for (const unplaced of scene.unplaced) { + console.warn( + `[gazetteer] not rendered — ${unplaced.kind} "${unplaced.id}": ${unplaced.reason}`, + ) + } + }, [scene]) + + if (error) { + return ( +
+

Failed to load the simulation bundle: {error}

+
+ ) + } + + if (!bundle || !scene || !dynamics) { + return ( +
+

Resolving simulation geography…

+
+ ) + } + + const firstPeriod = dynamics.periods[0] ?? 0 + const lastPeriod = dynamics.periods[stepCount - 1] ?? 0 + const period = dynamics.periods[index] ?? firstPeriod + const frame = dynamics.frameAt(period) + const env = dynamics.envAt(period) + + return ( +
+ + +
+

PROVIDER · SIMENV / GEOGRAPHY

+

World supply network

+

Soy flows across the Atlantic system

+
+ + {stepCount > 1 && ( + { + setPlaying(false) + setIndex(Math.max(0, Math.min(stepCount - 1, next - firstPeriod))) + }} + onTogglePlay={() => setPlaying((value) => !value)} + /> + )} + +
+
+
+

{bundle.meta.honestyNote}

+
+
+ ) +} + +export default App diff --git a/web/src/app.css b/web/src/app.css new file mode 100644 index 0000000..01a0453 --- /dev/null +++ b/web/src/app.css @@ -0,0 +1,206 @@ +:root { + color-scheme: dark; + background: #02050c; + font-synthesis: none; + text-rendering: geometricPrecision; +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + width: 100%; + height: 100%; + margin: 0; +} + +body { + overflow: hidden; +} + +.sim-app { + position: fixed; + inset: 0; + overflow: hidden; + background: var(--sim-color-base); + color: var(--sim-color-text); + font-family: var(--sim-font-body); + isolation: isolate; +} + +.sim-app::before { + position: absolute; + inset: 0; + z-index: 1; + background: + linear-gradient(90deg, rgba(2, 5, 12, 0.54), transparent 24%, transparent 76%, rgba(2, 5, 12, 0.2)), + linear-gradient(0deg, rgba(2, 5, 12, 0.7), transparent 22%); + content: ''; + pointer-events: none; +} + +.sim-app--message { + display: grid; + place-items: center; + padding: 24px; + color: var(--sim-color-text-muted); + letter-spacing: 0.04em; +} + +.sim-frame-heading { + position: fixed; + top: 30px; + left: 32px; + z-index: 4; + max-width: min(410px, calc(100vw - 64px)); + padding-left: 17px; + pointer-events: none; +} + +.sim-frame-heading::before { + position: absolute; + top: 1px; + bottom: 2px; + left: 0; + width: 1px; + background: linear-gradient(var(--sim-color-accent-bright), rgba(67, 183, 255, 0.08)); + box-shadow: var(--sim-shadow-cyan); + content: ''; +} + +.sim-frame-heading h1, +.sim-frame-heading p, +.sim-frame-meta p { + margin: 0; +} + +.sim-frame-eyebrow { + margin-bottom: 7px !important; + color: var(--sim-color-accent-bright); + font: 600 9px/1.1 var(--sim-font-mono); + letter-spacing: 0.18em; +} + +.sim-frame-heading h1 { + font: 520 clamp(24px, 2.25vw, 34px)/1 var(--sim-font-display); + letter-spacing: -0.025em; + text-shadow: 0 5px 24px rgba(0, 0, 0, 0.58); +} + +.sim-frame-subtitle { + margin-top: 7px !important; + color: var(--sim-color-text-muted); + font-size: 12px; + letter-spacing: 0.03em; +} + +.sim-frame-meta { + position: fixed; + right: 28px; + bottom: 24px; + left: 28px; + z-index: 4; + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 24px; + color: var(--sim-color-text-muted); + font: 500 10px/1.4 var(--sim-font-mono); + letter-spacing: 0.035em; + pointer-events: none; +} + +.sim-frame-stats { + display: flex; + align-items: center; + gap: 9px; + min-width: 0; + padding: 9px 12px; + border: 1px solid var(--sim-color-border); + border-radius: var(--sim-radius-md); + background: rgba(5, 13, 24, 0.68); + box-shadow: var(--sim-shadow-ambient); + backdrop-filter: blur(14px); + white-space: nowrap; +} + +.sim-frame-stats code { + color: var(--sim-color-text); + font-family: inherit; +} + +.sim-frame-signal { + width: 5px; + height: 5px; + border-radius: 50%; + background: var(--sim-color-positive); + box-shadow: 0 0 10px rgba(81, 227, 165, 0.8); +} + +.sim-frame-divider { + width: 1px; + height: 10px; + background: var(--sim-color-border); +} + +.sim-frame-unplaced { + color: var(--sim-color-warning); +} + +.sim-frame-honesty { + max-width: 360px; + color: var(--sim-color-text-faint); + text-align: right; +} + +@media (max-width: 600px) { + .sim-frame-heading { + top: 18px; + left: 18px; + max-width: calc(100vw - 36px); + padding-left: 13px; + } + + .sim-frame-eyebrow { + font-size: 8px; + } + + .sim-frame-heading h1 { + font-size: 24px; + } + + .sim-frame-subtitle { + font-size: 10px; + } + + .sim-frame-meta { + right: 14px; + bottom: 13px; + left: 14px; + display: grid; + gap: 6px; + font-size: 8px; + } + + .sim-frame-stats { + max-width: 100%; + gap: 6px; + padding: 7px 9px; + overflow: hidden; + } + + .sim-frame-honesty { + max-width: none; + padding-left: 3px; + text-align: left; + } +} + +@media (prefers-reduced-motion: reduce) { + * { + scroll-behavior: auto !important; + } +} diff --git a/web/src/data/fixtureSource.ts b/web/src/data/fixtureSource.ts new file mode 100644 index 0000000..5d2c0a1 --- /dev/null +++ b/web/src/data/fixtureSource.ts @@ -0,0 +1,157 @@ +/** + * fixtureSource — a hand-written `DataSource` for developing views before the + * real Python exporter exists (Batch 5 replaces this with `staticJsonSource`). + * + * The fixture is deliberately shaped to exercise every awkward case the F1 audit + * surfaced, so views are correct from day one rather than only against the happy + * path: + * + * - `transport_sa_santos` and `transport_eu_rtm` are ports: real coordinates, + * but `hasRecordedData: false` and NO entries in `ticks`. Views must render + * them without expecting a series. + * - `wholesalers` is a synthetic hub: `entityIds: []`, illustrative position. + * - `eu_farmers` is a pooled consumer: three `entityIds`, illustrative position, + * ONE recorded series. + * - one edge is an ocean crossing (`isSeaCrossing: true`). + * + * The flow spine is collapsed for the fixture (e.g. the Santos→Rotterdam crossing + * is drawn as a single sea edge rather than routed through a `sea_lane_*` node, + * and the EU processing tail skips `feed_manufacturers`/`feed_traders`). The real + * exporter will emit the full model graph; this is illustrative scaffolding. + */ + +import type { DataSource } from './source' +import type { Bundle, EnvState, Node, Tick } from './types' + +const HONESTY_NOTE = 'Approximate geographic positions — not GIS accurate' + +const PERIODS = [0, 1, 2] as const + +// The full geolocatable roster (from the F1 audit). Node `label`s are node-level +// English names (used for edge annotations); per-marker display names + +// coordinates come from the gazetteer, keyed by the entity ids below. Ports and +// sea-lanes carry no recorded series (`hasRecordedData: false`). `food_retail` is +// deliberately an entity the gazetteer does NOT know, to keep exercising outcome +// 3 (drop + warn) end-to-end. The real exporter (Batch 5) emits this same shape. +const nodes: Node[] = [ + // Producers (real coords, recorded data) + { id: 'bra_farmers', label: 'Brazil soy farms', role: 'producer', entityIds: ['brazil_farms'], hasRecordedData: true }, + { id: 'arg_farmers', label: 'Argentina soy farms', role: 'producer', entityIds: ['argentina_farms'], hasRecordedData: true }, + { id: 'usa_farmers', label: 'US soy farms', role: 'producer', entityIds: ['us_farms'], hasRecordedData: true }, + // Synthetic hubs (illustrative, recorded data) + { id: 'wholesalers', label: 'Wholesalers', role: 'wholesaler', entityIds: [], hasRecordedData: true }, + { id: 'feed_traders', label: 'Feed traders', role: 'feed_trader', entityIds: [], hasRecordedData: true }, + // Ports (real coords, NO recorded data) + { id: 'transport_sa_santos', label: 'Port of Santos', role: 'sa_santos', entityIds: ['santos_port'], hasRecordedData: false }, + { id: 'transport_sa_paranagua', label: 'Port of Paranaguá', role: 'sa_paranagua', entityIds: ['paranagua_port'], hasRecordedData: false }, + { id: 'transport_eu_rtm', label: 'Port of Rotterdam', role: 'eu_rtm', entityIds: ['rotterdam_port'], hasRecordedData: false }, + { id: 'transport_eu_ham', label: 'Port of Hamburg', role: 'eu_ham', entityIds: ['hamburg_port'], hasRecordedData: false }, + // EU processing (illustrative, recorded data) + { id: 'processors', label: 'EU oil mills', role: 'processor', entityIds: ['eu_oil_mills'], hasRecordedData: true }, + { id: 'feed_manufacturers', label: 'Feed mills', role: 'feed_manufacturer', entityIds: ['feed_mills'], hasRecordedData: true }, + // EU livestock — pooled, splits into three illustrative markers + { id: 'eu_farmers', label: 'EU livestock farms', role: 'consumer', entityIds: ['poultry_farms', 'pig_farms', 'dairy_farms'], hasRecordedData: true }, + // Unknown entity — must NOT render; resolveScene should log a warning. + { id: 'food_retail', label: 'Food retail', role: 'service', entityIds: ['food_retail'], hasRecordedData: false }, +] + +const edges = [ + // Producers -> market hub + { id: 'bra_farmers->wholesalers', source: 'bra_farmers', target: 'wholesalers', isSeaCrossing: false }, + { id: 'arg_farmers->wholesalers', source: 'arg_farmers', target: 'wholesalers', isSeaCrossing: false }, + { id: 'usa_farmers->wholesalers', source: 'usa_farmers', target: 'wholesalers', isSeaCrossing: false }, + // Hub -> export ports + { id: 'wholesalers->transport_sa_santos', source: 'wholesalers', target: 'transport_sa_santos', isSeaCrossing: false }, + { id: 'wholesalers->transport_sa_paranagua', source: 'wholesalers', target: 'transport_sa_paranagua', isSeaCrossing: false }, + // Atlantic sea crossings (materialised sea-lanes, collapsed to port->port here) + { id: 'transport_sa_santos->transport_eu_rtm', source: 'transport_sa_santos', target: 'transport_eu_rtm', isSeaCrossing: true }, + { id: 'transport_sa_paranagua->transport_eu_ham', source: 'transport_sa_paranagua', target: 'transport_eu_ham', isSeaCrossing: true }, + // Argentina alt route + US emergency route (direct sea bypass to Rotterdam) + { id: 'arg_farmers->transport_eu_rtm', source: 'arg_farmers', target: 'transport_eu_rtm', isSeaCrossing: true }, + { id: 'usa_farmers->transport_eu_rtm', source: 'usa_farmers', target: 'transport_eu_rtm', isSeaCrossing: true }, + // EU processing chain + { id: 'transport_eu_rtm->processors', source: 'transport_eu_rtm', target: 'processors', isSeaCrossing: false }, + { id: 'transport_eu_ham->processors', source: 'transport_eu_ham', target: 'processors', isSeaCrossing: false }, + { id: 'processors->feed_manufacturers', source: 'processors', target: 'feed_manufacturers', isSeaCrossing: false }, + { id: 'feed_manufacturers->feed_traders', source: 'feed_manufacturers', target: 'feed_traders', isSeaCrossing: false }, + { id: 'feed_traders->eu_farmers', source: 'feed_traders', target: 'eu_farmers', isSeaCrossing: false }, + // Edge into the unknown node — must be dropped (endpoint has no placement). + { id: 'eu_farmers->food_retail', source: 'eu_farmers', target: 'food_retail', isSeaCrossing: false }, +] + +/** + * Per-node per-tick values, one small ramp per period so views have something + * that changes over time. Keys match the recorded CSV schema for each node type + * (see F1). Ports carry no series and are intentionally absent. + */ +function valuesFor(nodeId: string, period: number): Record | null { + const k = period // 0,1,2 — a tiny deterministic ramp + switch (nodeId) { + case 'bra_farmers': + return { quantity_available: 100.0 - 5 * k, unit_price: 396.0 + 12 * k, active: true } + case 'arg_farmers': + return { quantity_available: 100.0 - 3 * k, unit_price: 462.0 + 10 * k, active: true } + case 'usa_farmers': + return { quantity_available: 100.0 + 4 * k, unit_price: 528.0 - 8 * k, active: true } + case 'feed_manufacturers': + return { quantity_available: 213.3 - 6 * k, unit_price: 1212.1 + 34 * k } + case 'feed_traders': + return { quantity_available: 213.3 - 6 * k, unit_price: 1349.6 + 40 * k } + case 'wholesalers': + return { + quantity_available: 766.7 - 20 * k, + unit_price: 523.4 + 15 * k, + bra_volume: 333.3 - 10 * k, + arg_volume: 166.7, + usa_volume: 266.7 + 10 * k, + storage_utilization: 0.268 - 0.007 * k, + } + case 'processors': + return { quantity_available: 213.3 - 6 * k, unit_price: 1045.7 + 30 * k } + case 'eu_farmers': + return { feed_received: 64.0 - 2 * k, livestock_output: 64.0 - 2 * k, active: true } + default: + return null // ports / anything without a recorded series + } +} + +const ticks: Tick[] = [] +for (const n of nodes) { + if (!n.hasRecordedData) continue + for (const period of PERIODS) { + const values = valuesFor(n.id, period) + if (values !== null) ticks.push({ period, nodeId: n.id, values }) + } +} + +const env: EnvState[] = PERIODS.map((period) => ({ + period, + sojaPrice: 523.4 + 15 * period, + feedPrice: 1349.6 + 40 * period, + shockScale: 0.0, + droughtSeverity: 0.0, + totalSojaSupply: 2300.0 - 60 * period, + transportUtilisation: 0.6625, + currentStep: period + 1, +})) + +const bundle: Bundle = { + meta: { + pdl: 's1-soja.pdl.yaml', + scenario: 'soy_feed_disruption', + ticks: PERIODS.length, + generatedAt: '2026-07-28T00:00:00Z', + honestyNote: HONESTY_NOTE, + }, + nodes, + edges, + ticks, + env, +} + +export const fixtureSource: DataSource = { + name: 'fixture', + getBundle(): Promise { + return Promise.resolve(bundle) + }, +} diff --git a/web/src/data/gazetteer.ts b/web/src/data/gazetteer.ts new file mode 100644 index 0000000..458c4ba --- /dev/null +++ b/web/src/data/gazetteer.ts @@ -0,0 +1,188 @@ +/** + * Gazetteer — the frontend coordinate authority (locked decision). + * + * Coordinates live HERE, keyed by PDL entity id, NOT in any DataSource. lat/lon + * are ported from branch 21's `visualization/config/layout.py` (`GROUP_ANCHORS`, + * `PORTS`) — projection-independent, so they carry to the globe unchanged. The + * equirectangular `project()` from that file is dead on a globe and not ported. + * + * This is explicitly "approximate geographic positions — not GIS accurate": some + * positions are real (ports, growing regions), others are illustrative (EU + * processing nodes and synthetic hubs have no location in the sim data). + * + * Resolution follows the THREE-outcome rule (never two): + * 1. Known entity -> real coordinates, rendered normally. + * 2. Known-illustrative -> chosen position, `illustrative: true`, visible marking. + * 3. Unknown entity -> NOT rendered, a warning is logged. Never fall back to a + * country centroid: a confident wrong placement is worse than a visible gap. + */ + +import type { Edge, GeoCoord, Node } from './types' + +export interface GazEntry { + lat: number + lng: number + /** English display name for this entity's marker. */ + label: string + /** True when the position is a chosen approximation, not a real location. */ + illustrative: boolean +} + +/** + * PDL entity id -> position. Ports and growing regions are real; EU processing + * entities are illustrative (no location in the sim). The three livestock + * entities are given distinct illustrative spots around the branch-21 EuFarmers + * anchor (46.5, 2.5) so the pooled `eu_farmers` node splits into three markers. + */ +export const GAZETTEER: Record = { + // Producers — real growing regions + brazil_farms: { lat: -13.0, lng: -56.0, label: 'Brazil soy farms', illustrative: false }, + argentina_farms: { lat: -34.0, lng: -62.0, label: 'Argentina soy farms', illustrative: false }, + us_farms: { lat: 42.0, lng: -93.0, label: 'US soy farms', illustrative: false }, + + // Ports — real locations + santos_port: { lat: -24.0, lng: -46.3, label: 'Port of Santos', illustrative: false }, + paranagua_port: { lat: -25.5, lng: -48.5, label: 'Port of Paranaguá', illustrative: false }, + rotterdam_port: { lat: 51.95, lng: 4.14, label: 'Port of Rotterdam', illustrative: false }, + hamburg_port: { lat: 53.55, lng: 9.99, label: 'Port of Hamburg', illustrative: false }, + + // EU processing — illustrative (no location in the sim data) + eu_oil_mills: { lat: 52.0, lng: 4.5, label: 'EU oil mills', illustrative: true }, + feed_mills: { lat: 52.5, lng: 13.0, label: 'Feed mills', illustrative: true }, + + // EU livestock — illustrative, three distinct spots so the pool splits visibly + poultry_farms: { lat: 47.6, lng: 1.2, label: 'EU poultry farms', illustrative: true }, + pig_farms: { lat: 46.4, lng: 3.6, label: 'EU pig farms', illustrative: true }, + dairy_farms: { lat: 45.4, lng: 2.0, label: 'EU dairy farms', illustrative: true }, +} + +/** + * Synthetic hubs have no PDL entity, so they are keyed by roster list name and + * are always illustrative (they are model constructs, not places). + */ +export const SYNTHETIC_PLACEMENTS: Record = { + wholesalers: { lat: -23.0, lng: -47.0, label: 'Wholesalers (hub)', illustrative: true }, + feed_traders: { lat: 47.5, lng: 16.0, label: 'Feed traders (hub)', illustrative: true }, +} + +/** A single rendered marker (one node may yield several — see the pool split). */ +export interface Marker { + /** Unique marker id: node id, or `${nodeId}::${entityId}` for a split node. */ + id: string + /** Owning bundle node id (the join key for time-series). */ + nodeId: string + label: string + role: string + lat: number + lng: number + illustrative: boolean + hasRecordedData: boolean +} + +/** An edge with both endpoints resolved to coordinates, ready for `arcsData`. */ +export interface ResolvedEdge { + id: string + startLat: number + startLng: number + endLat: number + endLng: number + isSeaCrossing: boolean + /** "Source → Target" in English, for the edge annotation. */ + label: string +} + +/** A node/edge that could not be placed, with the reason (for logging/UI). */ +export interface Unplaced { + kind: 'node' | 'edge' + id: string + reason: string +} + +export interface Scene { + markers: Marker[] + edges: ResolvedEdge[] + unplaced: Unplaced[] +} + +/** Average of a node's marker coordinates — the endpoint an edge attaches to. */ +function centroid(coords: GeoCoord[]): GeoCoord { + const n = coords.length + const sum = coords.reduce((a, c) => ({ lat: a.lat + c.lat, lng: a.lng + c.lng }), { lat: 0, lng: 0 }) + return { lat: sum.lat / n, lng: sum.lng / n } +} + +/** + * Resolve bundle nodes + edges into renderable markers + resolved edges, applying + * the three-outcome rule. Unknown entities are dropped and reported (outcome 3); + * an edge whose source or target has no placement is likewise dropped. + */ +export function resolveScene(nodes: Node[], edges: Edge[]): Scene { + const markers: Marker[] = [] + const unplaced: Unplaced[] = [] + const repById = new Map() + + for (const node of nodes) { + const placed: GeoCoord[] = [] + + if (node.entityIds.length === 0) { + // Synthetic hub — keyed by list name. + const g = SYNTHETIC_PLACEMENTS[node.id] + if (g) { + markers.push(toMarker(node.id, node, g)) + placed.push({ lat: g.lat, lng: g.lng }) + } else { + unplaced.push({ kind: 'node', id: node.id, reason: 'synthetic hub with no placement' }) + } + } else { + // One marker per entity id. A single-entity node yields one; a pooled node + // (e.g. eu_farmers) yields several — the required 3-way livestock split. + for (const eid of node.entityIds) { + const g = GAZETTEER[eid] + if (g) { + const markerId = node.entityIds.length > 1 ? `${node.id}::${eid}` : node.id + markers.push(toMarker(markerId, node, g)) + placed.push({ lat: g.lat, lng: g.lng }) + } else { + unplaced.push({ kind: 'node', id: `${node.id} (${eid})`, reason: 'entity not in gazetteer' }) + } + } + } + + if (placed.length > 0) repById.set(node.id, centroid(placed)) + } + + const nameById = new Map(nodes.map((n) => [n.id, n.label])) + const resolvedEdges: ResolvedEdge[] = [] + for (const e of edges) { + const s = repById.get(e.source) + const t = repById.get(e.target) + if (!s || !t) { + unplaced.push({ kind: 'edge', id: e.id, reason: 'endpoint has no placement' }) + continue + } + resolvedEdges.push({ + id: e.id, + startLat: s.lat, + startLng: s.lng, + endLat: t.lat, + endLng: t.lng, + isSeaCrossing: e.isSeaCrossing, + label: `${nameById.get(e.source) ?? e.source} → ${nameById.get(e.target) ?? e.target}`, + }) + } + + return { markers, edges: resolvedEdges, unplaced } +} + +function toMarker(id: string, node: Node, g: GazEntry): Marker { + return { + id, + nodeId: node.id, + label: g.label, + role: node.role, + lat: g.lat, + lng: g.lng, + illustrative: g.illustrative, + hasRecordedData: node.hasRecordedData, + } +} diff --git a/web/src/data/source.ts b/web/src/data/source.ts new file mode 100644 index 0000000..7ebef34 --- /dev/null +++ b/web/src/data/source.ts @@ -0,0 +1,22 @@ +/** + * The DataSource seam (Issue #23, locked decision). + * + * Every view depends on THIS interface and never on a concrete source. Today the + * only implementation is `fixtureSource` (hand-written JSON); Batch 5 adds a + * `staticJsonSource` reading an exported bundle, and a `PostgresSource` follows + * later when palaestrAI connects. Because views only ever see `DataSource`, those + * swaps touch zero view files — that swappability is the whole point of the seam. + * + * The interface is intentionally async (returns a Promise) so a network- or + * DB-backed implementation fits without changing any caller. + */ + +import type { Bundle } from './types' + +export interface DataSource { + /** A short identifier for the active source, useful for diagnostics/UI. */ + readonly name: string + + /** Load the full bundle for the current run. */ + getBundle(): Promise +} diff --git a/web/src/data/staticJsonSource.ts b/web/src/data/staticJsonSource.ts new file mode 100644 index 0000000..c83bdf6 --- /dev/null +++ b/web/src/data/staticJsonSource.ts @@ -0,0 +1,100 @@ +/** + * staticJsonSource — a `DataSource` backed by an exported `bundle.json`. + * + * This is the Batch-5 swap target: it reads the JSON the Python exporter + * (`provider_simenv.export_bundle`) writes from a simulation run's CSVs, and is + * selected at the composition root (`main.tsx`) in place of `fixtureSource` + * without touching any view file. + * + * The fetched payload is untrusted input, so it crosses a structural check + * (`parseBundle`) before any view sees it, rather than being cast blindly. + */ + +import type { DataSource } from './source' +import type { Bundle, Edge, EnvState, Node, Tick } from './types' + +const BUNDLE_URL = '/bundle.json' + +function isObject(value: unknown): value is Record { + return typeof value === 'object' && value !== null +} + +function requireArray(value: unknown, field: string): unknown[] { + if (!Array.isArray(value)) throw new Error(`bundle.${field} must be an array`) + return value +} + +/** Validate the fetched payload at the trust boundary and return a typed Bundle. */ +export function parseBundle(input: unknown): Bundle { + if (!isObject(input)) throw new Error('bundle must be an object') + if (!isObject(input.meta)) throw new Error('bundle.meta must be an object') + + const nodes = requireArray(input.nodes, 'nodes').map((n): Node => { + if (!isObject(n)) throw new Error('bundle.nodes[] must be objects') + return { + id: String(n.id), + label: String(n.label), + role: String(n.role), + entityIds: requireArray(n.entityIds, 'nodes[].entityIds').map(String), + hasRecordedData: Boolean(n.hasRecordedData), + } + }) + + const edges = requireArray(input.edges, 'edges').map((e): Edge => { + if (!isObject(e)) throw new Error('bundle.edges[] must be objects') + return { + id: String(e.id), + source: String(e.source), + target: String(e.target), + isSeaCrossing: Boolean(e.isSeaCrossing), + } + }) + + const ticks = requireArray(input.ticks, 'ticks').map((t): Tick => { + if (!isObject(t) || !isObject(t.values)) throw new Error('bundle.ticks[] malformed') + return { + period: Number(t.period), + nodeId: String(t.nodeId), + values: t.values as Record, + } + }) + + const env = requireArray(input.env, 'env').map((s): EnvState => { + if (!isObject(s)) throw new Error('bundle.env[] must be objects') + return { + period: Number(s.period), + sojaPrice: Number(s.sojaPrice), + feedPrice: Number(s.feedPrice), + shockScale: Number(s.shockScale), + droughtSeverity: Number(s.droughtSeverity), + totalSojaSupply: Number(s.totalSojaSupply), + transportUtilisation: Number(s.transportUtilisation), + currentStep: Number(s.currentStep), + } + }) + + const meta = input.meta as Record + return { + meta: { + pdl: String(meta.pdl ?? ''), + scenario: String(meta.scenario ?? ''), + ticks: Number(meta.ticks ?? env.length), + generatedAt: String(meta.generatedAt ?? ''), + honestyNote: String(meta.honestyNote ?? ''), + }, + nodes, + edges, + ticks, + env, + } +} + +export const staticJsonSource: DataSource = { + name: 'bundle.json', + async getBundle(): Promise { + const response = await fetch(BUNDLE_URL) + if (!response.ok) throw new Error(`bundle request failed with HTTP ${response.status}`) + const input: unknown = await response.json() + return parseBundle(input) + }, +} diff --git a/web/src/data/types.ts b/web/src/data/types.ts new file mode 100644 index 0000000..e8ce881 --- /dev/null +++ b/web/src/data/types.ts @@ -0,0 +1,133 @@ +/** + * Frozen value objects for the world-map view (Issue #23). + * + * These types are the contract between the data layer (a `DataSource`) and every + * view. They are shaped by the F1 schema audit of the Python model — see + * `web/.planning/forge/PLAN.md` and the audit notes. Key facts baked in here: + * + * - A node's stable identity is its **roster list name** (e.g. "bra_farmers", + * "sea_lane_santos"), NOT a PDL entity id. That is what the simulation CSV + * tables and `FLOW_ADJACENCY` use, and it is the only key that cleanly covers + * synthetic hubs (no entity) and pooled nodes (many entities). The PDL entity + * ids a node represents are carried alongside in `entityIds`. + * + * - Ports and sea-lanes are geographically real but carry **no recorded + * time-series** (they are absent from the model's DataCollector / TickWriter). + * `hasRecordedData` marks that so views never expect a series that isn't there. + * + * - `eu_farmers` pools three PDL entities (poultry/pig/dairy) into ONE recorded + * series. On the map they may appear as several illustrative markers sharing + * that series; `positionIsIllustrative` marks any node whose coordinate is a + * chosen approximation rather than a real location. + * + * - Per-tick fields differ by node type, so `Tick.values` is a keyed record + * rather than a fixed struct. That is the honest shape of the CSV data. + */ + +/** A geographic coordinate. globe.gl consumes `lat` / `lng` directly. */ +export interface GeoCoord { + lat: number + lng: number +} + +/** + * A supply-chain actor rendered on the map. + * + * `id` is the roster list name and is the join key for `Edge.source`/`Edge.target` + * and for `Tick.nodeId`. + */ +export interface Node { + /** Stable key = roster model-attr list name, e.g. "bra_farmers". */ + id: string + /** Node-level English display name (used for edge labels), e.g. "Brazil soy farms". */ + label: string + /** Agent role, e.g. "producer" | "wholesaler" | "sea_santos". */ + role: string + /** PDL entity ids this node represents. Empty for synthetic hubs. */ + entityIds: string[] + /** + * False for ports and sea-lanes, which exist structurally but produce no + * per-tick rows. Views must not expect a time-series for these nodes. + */ + hasRecordedData: boolean +} + +/* + * NOTE — coordinates are deliberately NOT on `Node`. Per the locked decision, + * placement is a FRONTEND concern resolved from `gazetteer.ts` keyed by PDL + * entity id, so a DataSource (fixture now, exported JSON / Postgres later) never + * carries geography. This is the documented seam boundary: swapping the data + * source can never move a marker. + */ + +/** + * A directed flow between two nodes, from the model's `FLOW_ADJACENCY`. + * + * `source`/`target` are node ids. Some edges pass through synthetic hubs + * (`wholesalers`, `feed_traders`) that have no real location. + */ +export interface Edge { + /** Stable key, e.g. "bra_farmers->wholesalers". */ + id: string + /** Upstream node id (the source of the flow). */ + source: string + /** Downstream node id (the destination of the flow). */ + target: string + /** True when this edge is an ocean crossing (a materialised sea-lane). */ + isSeaCrossing: boolean +} + +/** + * One recorded state snapshot for a single node at a single simulation step. + * + * `values` keys vary by node type — e.g. producers carry + * `quantity_available` / `unit_price` / `active`; wholesalers additionally carry + * per-origin volumes and storage utilisation; `eu_farmers` carries + * `feed_received` / `livestock_output` / `active`. + */ +export interface Tick { + /** Simulation step (the CSV `period`). */ + period: number + /** Node id this snapshot belongs to. */ + nodeId: string + /** Recorded properties for this node at this step. */ + values: Record +} + +/** One environment-level state snapshot for a single simulation step. */ +export interface EnvState { + period: number + sojaPrice: number + feedPrice: number + shockScale: number + droughtSeverity: number + totalSojaSupply: number + transportUtilisation: number + currentStep: number +} + +/** Metadata describing the run a bundle came from. */ +export interface BundleMeta { + /** PDL file the run was driven by, e.g. "s1-soja.pdl.yaml". */ + pdl: string + /** Scenario id, e.g. "soy_feed_disruption". */ + scenario: string + /** Number of simulation steps present in `ticks` / `env`. */ + ticks: number + /** ISO timestamp the bundle was produced. */ + generatedAt: string + /** On-screen honesty note about approximate positions. */ + honestyNote: string +} + +/** + * The complete payload a `DataSource` yields: the map's nodes and edges, plus the + * per-node and environment time-series for the whole run. + */ +export interface Bundle { + meta: BundleMeta + nodes: Node[] + edges: Edge[] + ticks: Tick[] + env: EnvState[] +} diff --git a/web/src/design/tokens.ts b/web/src/design/tokens.ts new file mode 100644 index 0000000..3f94277 --- /dev/null +++ b/web/src/design/tokens.ts @@ -0,0 +1,123 @@ +/** + * Visual system for the Issue #23 globe. + * + * The globe is a realistic blue-marble Earth (NASA texture + topology bump on a + * night-sky field), matching the reference explorer's renderer treatment: a + * light-blue atmosphere rim, a slow spin, and teal supply corridors drawn as a + * layered glow. Keeping the values here lets later chrome reuse the same + * language without shipping that out-of-scope chrome in this batch. + */ + +export const color = { + base: '#02050C', + surface: '#08111E', + surfaceRaised: '#0B1727', + border: 'rgba(151, 201, 239, 0.16)', + + accent: '#43B7FF', + accentBright: '#B9E9FF', + positive: '#51E3A5', + warning: '#F6C55B', + muted: '#60758E', + + text: '#F2F8FF', + textMuted: '#8298B1', + textFaint: '#536980', +} as const + +export const typography = { + display: 'Bahnschrift, "Avenir Next Condensed", "Segoe UI Variable Display", sans-serif', + body: 'Aptos, "Segoe UI Variable Text", "Segoe UI", sans-serif', + mono: '"Cascadia Code", "SFMono-Regular", Consolas, monospace', + eyebrowTracking: '0.18em', +} as const + +export const spacing = { + xs: 4, + sm: 8, + md: 16, + lg: 24, + xl: 32, +} as const + +export const radius = { + sm: 6, + md: 12, + lg: 18, + pill: 999, +} as const + +export const shadow = { + ambient: '0 18px 60px rgba(0, 0, 0, 0.36)', + cyanGlow: '0 0 26px rgba(67, 183, 255, 0.22)', +} as const + +/** Static texture assets (bundled offline in web/public/textures). */ +export const texture = { + earth: '/textures/earth-blue-marble.jpg', + bump: '/textures/earth-topology.png', + nightSky: '/textures/night-sky.png', +} as const + +export const globe = { + background: color.base, + atmosphere: '#7ec8ff', + atmosphereAltitude: 0.18, + cameraDesktop: 1.78, + cameraMobile: 4.4, + autoRotateSpeed: 0.35, +} as const + +/** + * Supply corridors, drawn as three stacked arcs per edge (a soft wide halo, a + * mid glow, and a bright core) so each reads as one glowing line. The core is + * dash-animated so flow reads as moving from source to target. Altitude scales + * with arc length (`altitudeAutoScale`, like the reference) so long crossings + * lift clear of the globe instead of sinking through it. Teal to sit with the + * cyan atmosphere rather than the reference's shock-red. + */ +export const arc = { + /** Matches the globe's `arcAltitudeAutoScale`; edge apex is derived from it. */ + altitudeAutoScale: 0.45, + /** Disruption colour: corridors lerp teal → this as tick intensity rises. */ + hot: [255, 96, 80] as [number, number, number], + halo: { stroke: 2.8, alpha: 0.16, teal: [[57, 208, 200], [126, 224, 230]] }, + glow: { stroke: 1.5, alpha: 0.34, teal: [[57, 208, 200], [126, 224, 230]] }, + core: { stroke: 0.7, alpha: 0.92, teal: [[214, 255, 250], [57, 208, 200]] }, + coreDashLength: 0.4, + coreDashGap: 0.22, + coreDashAnimateMs: 1400, +} as const + +export const marker = { + altitude: 0.014, + radius: 0.34, + selectedRadius: 0.52, + haloRadius: 4.2, + haloSpeed: 0.55, + haloRepeatMs: 1800, +} as const + +/** CSS custom properties consumed by the frame and annotation stylesheets. */ +export const designVars = { + '--sim-color-base': color.base, + '--sim-color-surface': color.surface, + '--sim-color-surface-raised': color.surfaceRaised, + '--sim-color-border': color.border, + '--sim-color-accent': color.accent, + '--sim-color-accent-bright': color.accentBright, + '--sim-color-positive': color.positive, + '--sim-color-warning': color.warning, + '--sim-color-muted': color.muted, + '--sim-color-text': color.text, + '--sim-color-text-muted': color.textMuted, + '--sim-color-text-faint': color.textFaint, + '--sim-font-display': typography.display, + '--sim-font-body': typography.body, + '--sim-font-mono': typography.mono, + '--sim-radius-sm': `${radius.sm}px`, + '--sim-radius-md': `${radius.md}px`, + '--sim-radius-lg': `${radius.lg}px`, + '--sim-shadow-ambient': shadow.ambient, + '--sim-shadow-cyan': shadow.cyanGlow, +} as const diff --git a/web/src/globe/GlobeView.tsx b/web/src/globe/GlobeView.tsx new file mode 100644 index 0000000..97f4ae3 --- /dev/null +++ b/web/src/globe/GlobeView.tsx @@ -0,0 +1,307 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import Globe, { type GlobeMethods } from 'react-globe.gl' +import type { Marker, ResolvedEdge } from '../data/gazetteer' +import { arc as arcTok, color, globe as globeTok, marker as markerTok, texture } from '../design/tokens' +import { arcApex } from './geo' +import './labels.css' + +const SELECTED_MARKER_ID = 'bra_farmers' + +type LabelKind = 'node' | 'edge' +type ArcLayer = 'halo' | 'glow' | 'core' + +/** One native `htmlElementsData` entry — a node or edge annotation. */ +interface Anchor { + id: string + lat: number + lng: number + alt: number + text: string + kind: LabelKind + illustrative: boolean +} + +/** One rendered arc. Each edge expands into a halo/glow/core stack for the glow. */ +interface ArcDatum { + layer: ArcLayer + edgeId: string + startLat: number + startLng: number + endLat: number + endLng: number + intensity: number +} + +/** A marker with its current (quantised) playback intensity baked in. */ +interface PointDatum extends Marker { + intensity: number +} + +/** + * Disruption is a near-step function, so intensity is quantised and the arc/point + * data is memoised on a signature of those quantised values. The data reference + * then only changes when disruption actually changes (a handful of times across a + * whole run) — three-globe reuses arc materials in between, so the dash animation + * runs uninterrupted instead of restarting every step. + */ +const INTENSITY_STEP = 0.1 + +function quantise(value: number): number { + return Math.round(Math.min(1, Math.max(0, value)) / INTENSITY_STEP) * INTENSITY_STEP +} + +interface GlobeViewProps { + markers: Marker[] + edges: ResolvedEdge[] + /** Per-node 0..1 disruption intensity for the current playback period. */ + markerIntensity?: Record + /** Per-edge 0..1 disruption intensity for the current playback period. */ + edgeIntensity?: Record +} + +type Rgb = readonly [number, number, number] + +const NO_INTENSITY: Record = {} + +function mix(a: Rgb | readonly number[], b: Rgb, t: number): [number, number, number] { + return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t] +} + +function rgba([r, g, b]: [number, number, number], alpha: number): string { + return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${alpha})` +} + +function hexToRgb(hex: string): [number, number, number] { + const h = hex.replace('#', '') + return [ + parseInt(h.slice(0, 2), 16), + parseInt(h.slice(2, 4), 16), + parseInt(h.slice(4, 6), 16), + ] +} + +function baseMarkerColor(marker: Marker): string { + if (marker.id === SELECTED_MARKER_ID) return color.text + if (marker.role === 'producer') return color.positive + if (!marker.hasRecordedData) return color.muted + if (marker.illustrative) return color.warning + return color.text +} + +/** Marker colour tinted toward the disruption red by the current intensity. */ +function colorForPoint(marker: PointDatum): string { + const base = baseMarkerColor(marker) + if (marker.intensity <= 0.001) return base + return rgba(mix(hexToRgb(base), arcTok.hot, Math.min(1, marker.intensity) * 0.9), 1) +} + +const ARC_LAYERS: ArcLayer[] = ['halo', 'glow', 'core'] + +function arcSpec(layer: ArcLayer) { + return layer === 'halo' ? arcTok.halo : layer === 'glow' ? arcTok.glow : arcTok.core +} + +/** Arc layer colour, lerped teal → red by the edge intensity. */ +function colorForArc(datum: ArcDatum): string[] { + const spec = arcSpec(datum.layer) + const t = Math.min(1, datum.intensity) * 0.85 + return spec.teal.map((teal) => rgba(mix(teal, arcTok.hot, t), spec.alpha)) +} + +/** + * 3D substrate and renderer for an already-resolved scene. + * + * Node and edge annotations use globe.gl's NATIVE `htmlElementsData` layer, + * which projects and occludes them each frame (anchors behind the globe hide + * automatically) — no manual projection, occlusion, or collision code. The + * blue-marble texture is pre-lit and carries the look on its own, so there is + * no custom material, lighting, or post-processing. + */ +export default function GlobeView({ + markers, + edges, + markerIntensity = NO_INTENSITY, + edgeIntensity = NO_INTENSITY, +}: GlobeViewProps) { + const globeRef = useRef(undefined) + const [size, setSize] = useState({ + width: window.innerWidth || 1280, + height: window.innerHeight || 720, + }) + + useEffect(() => { + const onResize = () => + setSize({ width: window.innerWidth || 1280, height: window.innerHeight || 720 }) + window.addEventListener('resize', onResize) + return () => window.removeEventListener('resize', onResize) + }, []) + + const anchors = useMemo(() => { + const output: Anchor[] = [] + for (const marker of markers) { + output.push({ + id: `node:${marker.id}`, + lat: marker.lat, + lng: marker.lng, + alt: markerTok.altitude, + text: marker.label, + kind: 'node', + illustrative: marker.illustrative, + }) + } + for (const edge of edges) { + // Anchor the edge label to the arc's actual rendered apex (not the + // great-circle midpoint) so it sits on the curve for arcs of any length. + const apex = arcApex( + { lat: edge.startLat, lng: edge.startLng }, + { lat: edge.endLat, lng: edge.endLng }, + arcTok.altitudeAutoScale, + ) + output.push({ + id: `edge:${edge.id}`, + lat: apex.lat, + lng: apex.lng, + alt: apex.alt, + text: edge.label, + kind: 'edge', + illustrative: false, + }) + } + return output + }, [markers, edges]) + + // Signatures of the quantised intensities. useMemo compares deps by value, so a + // new-but-identical signature string keeps the previous data reference — the + // globe only rebuilds when disruption actually changes. + const markerSig = markers.map((m) => quantise(markerIntensity[m.nodeId] ?? 0)).join(',') + const edgeSig = edges.map((e) => quantise(edgeIntensity[e.id] ?? 0)).join(',') + + const pointData = useMemo( + () => markers.map((marker) => ({ ...marker, intensity: quantise(markerIntensity[marker.nodeId] ?? 0) })), + // eslint-disable-next-line react-hooks/exhaustive-deps + [markers, markerSig], + ) + + // Each edge becomes three stacked arcs (soft halo, mid glow, bright core). + const arcData = useMemo( + () => + edges.flatMap((edge) => + ARC_LAYERS.map((layer) => ({ + layer, + edgeId: edge.id, + startLat: edge.startLat, + startLng: edge.startLng, + endLat: edge.endLat, + endLng: edge.endLng, + intensity: quantise(edgeIntensity[edge.id] ?? 0), + })), + ), + // eslint-disable-next-line react-hooks/exhaustive-deps + [edges, edgeSig], + ) + + const selectedMarker = useMemo( + () => markers.find((marker) => marker.id === SELECTED_MARKER_ID) ?? markers[0], + [markers], + ) + + // The native html layer positions and centres the OUTER node on the projected + // point each frame; the inner label offsets itself (nodes float above their + // marker, edge labels sit on the arc apex). + const makeAnchorElement = useCallback((datum: object) => { + const anchor = datum as Anchor + const outer = document.createElement('div') + outer.className = `sim-anchor sim-anchor--${anchor.kind}` + const label = document.createElement('div') + label.className = `sim-label sim-label--${anchor.kind}${ + anchor.illustrative ? ' sim-label--illustrative' : '' + }` + label.textContent = anchor.text + outer.appendChild(label) + return outer + }, []) + + const handleGlobeReady = useCallback(() => { + const globe = globeRef.current + if (!globe) return + const mobile = window.innerWidth <= 600 + globe.pointOfView( + { lat: 7, lng: -54, altitude: mobile ? globeTok.cameraMobile : globeTok.cameraDesktop }, + 0, + ) + + const controls = globe.controls() + controls.autoRotate = true + controls.autoRotateSpeed = globeTok.autoRotateSpeed + controls.enableDamping = true + controls.dampingFactor = 0.08 + controls.minDistance = globe.getGlobeRadius() * 1.38 + controls.maxDistance = globe.getGlobeRadius() * 6.2 + }, []) + + const mobile = size.width <= 600 + const globeOffset: [number, number] = [0, mobile ? -10 : -8] + + return ( +
+ (datum as PointDatum).lat} + pointLng={(datum) => (datum as PointDatum).lng} + pointColor={(datum: object) => colorForPoint(datum as PointDatum)} + pointAltitude={markerTok.altitude} + pointRadius={(datum: object) => { + const point = datum as PointDatum + const base = point.id === SELECTED_MARKER_ID ? markerTok.selectedRadius : markerTok.radius + return base * (1 + Math.min(1, point.intensity) * 0.7) + }} + pointResolution={18} + pointsMerge={false} + pointsTransitionDuration={0} + ringsData={selectedMarker ? [selectedMarker] : []} + ringLat={(datum) => (datum as Marker).lat} + ringLng={(datum) => (datum as Marker).lng} + ringAltitude={markerTok.altitude * 0.5} + ringColor={[color.text, 'rgba(185, 233, 255, 0.42)', 'rgba(67, 183, 255, 0)']} + ringMaxRadius={markerTok.haloRadius} + ringPropagationSpeed={markerTok.haloSpeed} + ringRepeatPeriod={markerTok.haloRepeatMs} + ringResolution={96} + arcsData={arcData} + arcStartLat={(datum) => (datum as ArcDatum).startLat} + arcStartLng={(datum) => (datum as ArcDatum).startLng} + arcEndLat={(datum) => (datum as ArcDatum).endLat} + arcEndLng={(datum) => (datum as ArcDatum).endLng} + arcAltitudeAutoScale={arcTok.altitudeAutoScale} + arcColor={(datum: object) => colorForArc(datum as ArcDatum)} + arcStroke={(datum: object) => arcSpec((datum as ArcDatum).layer).stroke} + arcDashLength={(datum: object) => + (datum as ArcDatum).layer === 'core' ? arcTok.coreDashLength : 1 + } + arcDashGap={(datum: object) => ((datum as ArcDatum).layer === 'core' ? arcTok.coreDashGap : 0)} + arcDashAnimateTime={(datum: object) => + (datum as ArcDatum).layer === 'core' ? arcTok.coreDashAnimateMs : 0 + } + arcsTransitionDuration={0} + htmlElementsData={anchors} + htmlLat={(datum: object) => (datum as Anchor).lat} + htmlLng={(datum: object) => (datum as Anchor).lng} + htmlAltitude={(datum: object) => (datum as Anchor).alt} + htmlElement={makeAnchorElement} + /> +
+ ) +} diff --git a/web/src/globe/geo.ts b/web/src/globe/geo.ts new file mode 100644 index 0000000..50f181e --- /dev/null +++ b/web/src/globe/geo.ts @@ -0,0 +1,103 @@ +/** + * Geographic helpers for placing annotations on the rendered globe. + * + * Edge-label placement is the non-obvious piece. globe.gl (three-globe) does NOT + * draw an arc along the geographic great circle: it builds a cubic Bézier through + * the great-circle points at t=0.25 and t=0.75, each lifted to 1.5× the arc's + * apex altitude, from surface start to surface end. For a long arc at a small + * fixed altitude the Bézier apex sinks below the surface and the middle of the + * arc is occluded — so labels must anchor to the ACTUAL Bézier apex, not the + * great-circle midpoint, and the arc altitude must scale with length. + * + * `arcApex` replicates three-globe's `calcCurve` exactly (same control-point + * placement, altitude auto-scaling, and axis convention) and returns the apex as + * lat/lng/alt, so a label anchored there sits on the rendered curve. + */ + +export interface LatLng { + lat: number + lng: number +} + +export interface Apex { + lat: number + lng: number + alt: number +} + +const DEG = Math.PI / 180 + +/** Wrap a longitude in degrees into the (-180, 180] range. */ +function wrapLng(lng: number): number { + return ((((lng + 180) % 360) + 360) % 360) - 180 +} + +type Vec3 = [number, number, number] + +/** three-globe's polar→cartesian on a unit sphere (radius 1 + altitude). */ +function polarToCartesian(lat: number, lng: number, alt: number): Vec3 { + const phi = (90 - lat) * DEG + const theta = (90 - lng) * DEG + const r = 1 + alt + const sinPhi = Math.sin(phi) + return [r * sinPhi * Math.cos(theta), r * Math.cos(phi), r * sinPhi * Math.sin(theta)] +} + +/** Inverse of `polarToCartesian`. */ +function cartesianToPolar([x, y, z]: Vec3): Apex { + const r = Math.hypot(x, y, z) + const lat = 90 - (Math.acos(y / r) / DEG) + const lng = wrapLng(90 - (Math.atan2(z, x) / DEG)) + return { lat, lng, alt: r - 1 } +} + +function dot3(a: Vec3, b: Vec3): number { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] +} + +/** Great-circle (spherical) interpolation between two lat/lng points. */ +function slerp(a: LatLng, b: LatLng, t: number): LatLng { + const va = polarToCartesian(a.lat, a.lng, 0) + const vb = polarToCartesian(b.lat, b.lng, 0) + const omega = Math.acos(Math.max(-1, Math.min(1, dot3(va, vb)))) + if (omega === 0) return { lat: a.lat, lng: a.lng } + const s1 = Math.sin((1 - t) * omega) / Math.sin(omega) + const s2 = Math.sin(t * omega) / Math.sin(omega) + const p = cartesianToPolar([ + s1 * va[0] + s2 * vb[0], + s1 * va[1] + s2 * vb[1], + s1 * va[2] + s2 * vb[2], + ]) + return { lat: p.lat, lng: p.lng } +} + +/** + * The rendered apex of a globe.gl arc, replicating three-globe's `calcCurve`. + * + * `altitudeAutoScale` matches the `arcAltitudeAutoScale` set on the globe: with a + * null arc altitude, three-globe uses `geoDistance/2 * autoScale`. Control points + * sit at the great-circle 0.25/0.75 points lifted to 1.5× that altitude; the apex + * is the cubic Bézier evaluated at t=0.5. + */ +export function arcApex(a: LatLng, b: LatLng, altitudeAutoScale: number): Apex { + const va = polarToCartesian(a.lat, a.lng, 0) + const vb = polarToCartesian(b.lat, b.lng, 0) + const angular = Math.acos(Math.max(-1, Math.min(1, dot3(va, vb)))) + const altitude = (angular / 2) * altitudeAutoScale + const cpAlt = altitude + altitude * 0.5 // three-globe calcAltCp(0, altitude) + + const g025 = slerp(a, b, 0.25) + const g075 = slerp(a, b, 0.75) + const p0 = polarToCartesian(a.lat, a.lng, 0) + const c1 = polarToCartesian(g025.lat, g025.lng, cpAlt) + const c2 = polarToCartesian(g075.lat, g075.lng, cpAlt) + const p3 = polarToCartesian(b.lat, b.lng, 0) + + // Cubic Bézier at t=0.5: 0.125·P0 + 0.375·C1 + 0.375·C2 + 0.125·P3. + const mid: Vec3 = [ + 0.125 * p0[0] + 0.375 * c1[0] + 0.375 * c2[0] + 0.125 * p3[0], + 0.125 * p0[1] + 0.375 * c1[1] + 0.375 * c2[1] + 0.125 * p3[1], + 0.125 * p0[2] + 0.375 * c1[2] + 0.375 * c2[2] + 0.125 * p3[2], + ] + return cartesianToPolar(mid) +} diff --git a/web/src/globe/labels.css b/web/src/globe/labels.css new file mode 100644 index 0000000..b7356a1 --- /dev/null +++ b/web/src/globe/labels.css @@ -0,0 +1,92 @@ +.sim-globe-stage { + position: absolute; + inset: 0; + overflow: hidden; +} + +.sim-globe-stage > div:first-child { + position: relative; + z-index: 0; +} + +/* + * Native htmlElementsData anchor. globe.gl positions and centres this outer node + * on the projected point every frame and hides it when it falls behind the + * globe; the inner label offsets itself relative to this zero-size origin. + */ +.sim-anchor { + position: absolute; + width: 0; + height: 0; + pointer-events: none; +} + +.sim-label { + position: absolute; + max-width: 210px; + padding: 4px 8px 4px 9px; + overflow: hidden; + border: 1px solid var(--sim-color-border); + border-radius: var(--sim-radius-sm); + background: linear-gradient(115deg, rgba(4, 13, 25, 0.9), rgba(7, 20, 35, 0.72)); + box-shadow: 0 7px 24px rgba(0, 0, 0, 0.32), inset 2px 0 0 rgba(126, 213, 255, 0.36); + color: var(--sim-color-text); + font: 550 10px/1.2 var(--sim-font-body); + letter-spacing: 0.025em; + text-overflow: ellipsis; + white-space: nowrap; + user-select: none; + pointer-events: none; +} + +/* Node label floats above the marker with a short connecting stem. */ +.sim-label--node { + left: 50%; + bottom: 10px; + transform: translateX(-50%); +} + +.sim-label--node::after { + position: absolute; + left: 50%; + bottom: -7px; + width: 1px; + height: 7px; + background: linear-gradient(var(--sim-color-accent), transparent); + content: ''; +} + +/* Edge label floats just above the arc apex so the corridor stays a single + unbroken line underneath it (the anchor sits on the apex itself). */ +.sim-label--edge { + left: 50%; + bottom: 6px; + transform: translateX(-50%); + padding: 3px 7px; + border-color: rgba(93, 172, 226, 0.16); + background: rgba(3, 12, 24, 0.74); + box-shadow: none; + color: #a9cce4; + font-family: var(--sim-font-mono); + font-size: 8px; + font-weight: 450; + letter-spacing: 0.04em; +} + +.sim-label--illustrative { + border-style: dashed; + border-color: rgba(246, 197, 91, 0.56); + box-shadow: 0 7px 24px rgba(0, 0, 0, 0.32), inset 2px 0 0 rgba(246, 197, 91, 0.65); +} + +@media (max-width: 600px) { + .sim-label { + max-width: 42vw; + padding: 3px 6px; + font-size: 9px; + } + + .sim-label--edge { + font-size: 7px; + } +} diff --git a/web/src/main.tsx b/web/src/main.tsx new file mode 100644 index 0000000..df0d576 --- /dev/null +++ b/web/src/main.tsx @@ -0,0 +1,13 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.tsx' +import { staticJsonSource } from './data/staticJsonSource.ts' + +// Composition root: the ONLY place a concrete DataSource is chosen. This swap +// from `fixtureSource` to `staticJsonSource` (the exported run) touches no view +// file — the seam's proof. A Postgres source later swaps in here the same way. +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/web/src/playback/Timeline.tsx b/web/src/playback/Timeline.tsx new file mode 100644 index 0000000..4680ddd --- /dev/null +++ b/web/src/playback/Timeline.tsx @@ -0,0 +1,68 @@ +import type { EnvState } from '../data/types' +import './timeline.css' + +interface TimelineProps { + period: number + minPeriod: number + maxPeriod: number + playing: boolean + env: EnvState | null + onSeek: (period: number) => void + onTogglePlay: () => void +} + +const numberFmt = new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }) + +/** Bottom-centre transport bar: play/pause, a scrubber, and a live env readout. */ +export default function Timeline({ + period, + minPeriod, + maxPeriod, + playing, + env, + onSeek, + onTogglePlay, +}: TimelineProps) { + const shock = env ? Math.round(env.shockScale * 100) : 0 + return ( +
+ + +
+ onSeek(Number(event.target.value))} + aria-label="Simulation step" + /> +
+ + step {period} / {maxPeriod} + + {env && ( + <> +
+
+
+ ) +} diff --git a/web/src/playback/dynamics.ts b/web/src/playback/dynamics.ts new file mode 100644 index 0000000..18d292c --- /dev/null +++ b/web/src/playback/dynamics.ts @@ -0,0 +1,96 @@ +/** + * Playback dynamics — turns a bundle's recorded ticks into a per-period "frame" + * the globe can render. + * + * Each recorded node gets a stress scalar per period (a rising price, or a + * falling output/quantity, reads as more disruption), normalised over the run to + * a 0..1 intensity. A corridor carries its source node's intensity downstream. + * Ports and any flat series contribute no intensity. This mirrors the reference + * explorer's cascade ramp, driven here by the actual simulation output. + */ + +import type { Bundle, EnvState } from '../data/types' + +export interface Frame { + /** nodeId -> 0..1 intensity for this period. */ + markerIntensity: Record + /** edgeId -> 0..1 intensity for this period. */ + edgeIntensity: Record +} + +export interface Dynamics { + /** Sorted list of periods available for playback. */ + periods: number[] + frameAt(period: number): Frame + envAt(period: number): EnvState | null +} + +/** A single "badness" scalar per tick: higher means more disruption. */ +function stressOf(values: Record): number | null { + if (typeof values.unit_price === 'number') return values.unit_price + if (typeof values.livestock_output === 'number') return -values.livestock_output + if (typeof values.quantity_available === 'number') return -values.quantity_available + return null +} + +const EMPTY_FRAME: Frame = { markerIntensity: {}, edgeIntensity: {} } + +export function buildDynamics(bundle: Bundle): Dynamics { + const byNode = new Map>() + for (const tick of bundle.ticks) { + const stress = stressOf(tick.values) + if (stress === null) continue + let series = byNode.get(tick.nodeId) + if (!series) { + series = new Map() + byNode.set(tick.nodeId, series) + } + series.set(tick.period, stress) + } + + const range = new Map() + for (const [nodeId, series] of byNode) { + let min = Infinity + let max = -Infinity + for (const value of series.values()) { + if (value < min) min = value + if (value > max) max = value + } + range.set(nodeId, { min, max }) + } + + const nodeIntensity = (nodeId: string, period: number): number => { + const series = byNode.get(nodeId) + const bounds = range.get(nodeId) + if (!series || !bounds) return 0 + const value = series.get(period) + if (value === undefined || bounds.max === bounds.min) return 0 + return (value - bounds.min) / (bounds.max - bounds.min) + } + + const periods = bundle.env.map((snapshot) => snapshot.period).sort((a, b) => a - b) + const envByPeriod = new Map(bundle.env.map((snapshot) => [snapshot.period, snapshot])) + const frameCache = new Map() + + return { + periods, + frameAt(period: number): Frame { + const cached = frameCache.get(period) + if (cached) return cached + const markerIntensity: Record = {} + for (const nodeId of byNode.keys()) markerIntensity[nodeId] = nodeIntensity(nodeId, period) + const edgeIntensity: Record = {} + for (const edge of bundle.edges) { + edgeIntensity[edge.id] = markerIntensity[edge.source] ?? markerIntensity[edge.target] ?? 0 + } + const frame: Frame = { markerIntensity, edgeIntensity } + frameCache.set(period, frame) + return frame + }, + envAt(period: number): EnvState | null { + return envByPeriod.get(period) ?? null + }, + } +} + +export { EMPTY_FRAME } diff --git a/web/src/playback/timeline.css b/web/src/playback/timeline.css new file mode 100644 index 0000000..30f675a --- /dev/null +++ b/web/src/playback/timeline.css @@ -0,0 +1,88 @@ +.sim-timeline { + position: absolute; + left: 50%; + bottom: 26px; + z-index: 6; + display: flex; + align-items: center; + gap: 14px; + width: min(620px, calc(100vw - 48px)); + padding: 10px 16px; + transform: translateX(-50%); + border: 1px solid var(--sim-color-border); + border-radius: var(--sim-radius-md); + background: linear-gradient(180deg, rgba(11, 23, 39, 0.86), rgba(6, 14, 26, 0.82)); + box-shadow: var(--sim-shadow-ambient); + backdrop-filter: blur(14px); +} + +.sim-timeline-play { + flex: none; + width: 34px; + height: 34px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid rgba(126, 213, 255, 0.4); + border-radius: 50%; + background: rgba(67, 183, 255, 0.14); + color: var(--sim-color-accent-bright); + font-size: 12px; + cursor: pointer; + transition: background 120ms ease; +} + +.sim-timeline-play:hover { + background: rgba(67, 183, 255, 0.26); +} + +.sim-timeline-track { + flex: 1; + min-width: 0; +} + +.sim-timeline-track input[type='range'] { + width: 100%; + height: 4px; + accent-color: var(--sim-color-accent); + cursor: pointer; +} + +.sim-timeline-readout { + display: flex; + align-items: center; + gap: 10px; + margin-top: 5px; + overflow: hidden; + color: var(--sim-color-text-muted); + font: 500 11px/1.3 var(--sim-font-mono); + white-space: nowrap; +} + +.sim-timeline-readout b { + color: var(--sim-color-text); + font-variant-numeric: tabular-nums; +} + +.sim-timeline-sep { + width: 1px; + height: 11px; + background: var(--sim-color-border); +} + +.sim-timeline-shock--on b { + color: var(--sim-color-warning); +} + +@media (max-width: 600px) { + .sim-timeline { + bottom: 66px; + gap: 10px; + padding: 8px 12px; + } + + .sim-timeline-readout { + font-size: 10px; + gap: 7px; + } +} diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json new file mode 100644 index 0000000..f867de0 --- /dev/null +++ b/web/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json new file mode 100644 index 0000000..abcd7f0 --- /dev/null +++ b/web/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/web/vite.config.ts b/web/vite.config.ts new file mode 100644 index 0000000..42bc61d --- /dev/null +++ b/web/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + // three.js + three-globe legitimately exceed the 500 kB default; split them + // into their own long-cached vendor chunk rather than bloating the app chunk, + // and raise the warning threshold to cover that (unavoidable) 3D vendor size. + chunkSizeWarningLimit: 2000, + rollupOptions: { + output: { + manualChunks(id) { + if (!id.includes('node_modules')) return undefined + if (/[\\/](three|three-globe)[\\/]/.test(id)) return 'three-vendor' + if (/[\\/](globe\.gl|react-globe\.gl)[\\/]/.test(id)) return 'globe-vendor' + return undefined + }, + }, + }, + }, +})