Repository: feagi/feagi (language: python)

Issue:
Updates from Neuraville Inc
This PR syncs with latest Neuraville Inc. development code.
Deleting a region and raising internals does not delete the region from summary view
Issue: deleting a region via the /v1/region/region endpoint returns a 200, however running /v1/region/region_members still shows that region as existing

![image](https://github.com/feagi/feagi/assets/127231771/3c9f5847-b25d-4037-94b4-d9e12f546774)



![image](https://github.com/feagi/feagi/assets/127231771/f1f3991f-7624-49df-9750-d4296c7cc5d4)

FEAGI often returns 500 when doing multi-cortical area editing
second half of the issue referred to in https://github.com/feagi/brain-visualizer/issues/285


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/PRIVATE_deploy_feagi_dev_to_nrs.yml b/.github/workflows/PRIVATE_deploy_feagi_dev_to_nrs.yml
deleted file mode 100644
index 0cc449c2a..000000000
--- a/.github/workflows/PRIVATE_deploy_feagi_dev_to_nrs.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-name: Contribute to NRS FEAGI
-
-on:
-  workflow_dispatch:
-  push:
-    paths-ignore:
-      - '.github/workflows/**'
-    branches:
-      - pre-nrs
-
-jobs:
-  sync:
-    runs-on: ubuntu-latest
-
-    steps:
-    - name: Check out Neuraville code
-      uses: actions/checkout@v4
-      with:
-        sparse-checkout: .
-        fetch-depth: 0
-        path: neuraville-feagi
-
-    - name: Generate branch name
-      run: echo "BRANCH_NAME=neuraville-$(date +'%Y-%m-%d-%H-%M-%S')" >> $GITHUB_ENV
-
-    - name: Check out NRS code
-      uses: actions/checkout@v4
-      with:
-        sparse-checkout: .
-        fetch-depth: 0
-        repository: Neuraville/nrs-feagi
-        path: nrs-feagi
-        token: ${{ secrets.NRS_PAT }}
-
-    - name: Setup Git Identity for Merge
-      run: |
-        cd nrs-feagi
-        git config user.email "dev@neuraville.com"
-        git config user.name "NeuravilleDeveloper"
-
-
-    - name: Merge Neuraville code into NRS code
-      run: |
-        cd nrs-feagi
-        git remote add neuraville ../neuraville-feagi
-        git fetch neuraville
-        git merge neuraville/pre-nrs --allow-unrelated-histories
-
-    - name: Check for merge conflicts
-      run: |
-        if git diff --name-only --diff-filter=U | grep -q .; then
-          echo "Merge conflicts detected!"
-          exit 1
-        fi
-
-    - name: Setup Git with PAT and commit changes
-      run: |
-        cd nrs-feagi
-        git config user.email "dev@neuraville.com"
-        git config user.name "NeuravilleDeveloper"
-        git remote | grep public && git remote remove public
-        git remote add nrs https://NeuravilleDeveloper:${{ secrets.NRS_PAT }}@github.com/Neuraville/nrs-feagi.git
-        git checkout $BRANCH_NAME || git checkout -b $BRANCH_NAME
-        git diff --exit-code || git commit -m "Sync with pre-nrs excluding .env and .github directory changes"
-        git push nrs ${{ env.BRANCH_NAME }}
-
-    - name: Create PR using GitHub CLI
-      run: |
-        gh auth login --with-token <<< "${{ secrets.NRS_PAT }}"
-        gh pr create \
-          --repo Neuraville/nrs-feagi \
-          --base staging \
-          --head ${{ env.BRANCH_NAME }} \
-          --title "Updates from Neuraville Inc." \
-          --body "This PR syncs with latest Neuraville Inc. development code."
-      env:
-        GH_CLI_TOKEN: ${{ secrets.NRS_PAT }}
diff --git a/.github/workflows/deploy_feagi_dev_to_nrs___PRIVATE.yml b/.github/workflows/deploy_feagi_dev_to_nrs___PRIVATE.yml
deleted file mode 100644
index 0cc449c2a..000000000
--- a/.github/workflows/deploy_feagi_dev_to_nrs___PRIVATE.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-name: Contribute to NRS FEAGI
-
-on:
-  workflow_dispatch:
-  push:
-    paths-ignore:
-      - '.github/workflows/**'
-    branches:
-      - pre-nrs
-
-jobs:
-  sync:
-    runs-on: ubuntu-latest
-
-    steps:
-    - name: Check out Neuraville code
-      uses: actions/checkout@v4
-      with:
-        sparse-checkout: .
-        fetch-depth: 0
-        path: neuraville-feagi
-
-    - name: Generate branch name
-      run: echo "BRANCH_NAME=neuraville-$(date +'%Y-%m-%d-%H-%M-%S')" >> $GITHUB_ENV
-
-    - name: Check out NRS code
-      uses: actions/checkout@v4
-      with:
-        sparse-checkout: .
-        fetch-depth: 0
-        repository: Neuraville/nrs-feagi
-        path: nrs-feagi
-        token: ${{ secrets.NRS_PAT }}
-
-    - name: Setup Git Identity for Merge
-      run: |
-        cd nrs-feagi
-        git config user.email "dev@neuraville.com"
-        git config user.name "NeuravilleDeveloper"
-
-
-    - name: Merge Neuraville code into NRS code
-      run: |
-        cd nrs-feagi
-        git remote add neuraville ../neuraville-feagi
-        git fetch neuraville
-        git merge neuraville/pre-nrs --allow-unrelated-histories
-
-    - name: Check for merge conflicts
-      run: |
-        if git diff --name-only --diff-filter=U | grep -q .; then
-          echo "Merge conflicts detected!"
-          exit 1
-        fi
-
-    - name: Setup Git with PAT and commit changes
-      run: |
-        cd nrs-feagi
-        git config user.email "dev@neuraville.com"
-        git config user.name "NeuravilleDeveloper"
-        git remote | grep public && git remote remove public
-        git remote add nrs https://NeuravilleDeveloper:${{ secrets.NRS_PAT }}@github.com/Neuraville/nrs-feagi.git
-        git checkout $BRANCH_NAME || git checkout -b $BRANCH_NAME
-        git diff --exit-code || git commit -m "Sync with pre-nrs excluding .env and .github directory changes"
-        git push nrs ${{ env.BRANCH_NAME }}
-
-    - name: Create PR using GitHub CLI
-      run: |
-        gh auth login --with-token <<< "${{ secrets.NRS_PAT }}"
-        gh pr create \
-          --repo Neuraville/nrs-feagi \
-          --base staging \
-          --head ${{ env.BRANCH_NAME }} \
-          --title "Updates from Neuraville Inc." \
-          --body "This PR syncs with latest Neuraville Inc. development code."
-      env:
-        GH_CLI_TOKEN: ${{ secrets.NRS_PAT }}
diff --git a/.github/workflows/update_dev_feagi.yml b/.github/workflows/update_dev_feagi.yml
deleted file mode 100644
index 4c2128728..000000000
--- a/.github/workflows/update_dev_feagi.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-name: Update dev gcr FEAGI
-on:
-  push:
-    branches:
-      - staging
-    paths:
-      - 'src/**'
-      - 'generate_version.sh'
-  workflow_dispatch:
-
-jobs:
-  Build:
-    runs-on: ubuntu-latest
-
-    steps:
-    - name: testing
-      run: |
-        ls
diff --git a/DEVELOP.md b/DEVELOP.md
deleted file mode 100644
index e69de29bb..000000000
diff --git a/README.md b/README.md
index 5f9127e6c..20395083e 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 * For the most up to date information about our platform and approach, please reference our [Wiki](https://github.com/feagi/feagi/wiki).
 * To get started using our platform please follow our [**Deployment Guide**](https://github.com/feagi/feagi/wiki/Deployment-(for-the-public)) and start by following our [**tutorials**](https://github.com/feagi/feagi/wiki/Tutorials)
-* To learn more and get involved in the community, join our the FEAGI [LinkedIn group](https://www.linkedin.com/groups/12777894/).
+* To learn more and get involved in the community, join our the FEAGI [Linkedin group](https://www.linkedin.com/groups/12777894/).
 
 # About FEAGI
 The Framework for Evolutionary Artificial General Intelligence (FEAGI) is an open-source framework designed from the 
diff --git a/docker/.env b/docker/.env
index 73fff50be..df737390c 100644
--- a/docker/.env
+++ b/docker/.env
@@ -46,10 +46,10 @@ URL_BRAIN_PONG=None
 
 # Public images
 BRIDGE_IMAGE=neuraville/bridge:latest
-WEBCAM_CONTROLLER_IMAGE=neuraville/webcam_controller:latest
+MEDIA_CONTROLLER_IMAGE=neuraville/media_capture_controller:latest
 FEAGI_IMAGE=neuraville/feagi:latest
-BRAIN_PONG_IMAGE=neuraville/brain_pong_controller:latest
-MICROBIT_IMAGE=neuraville/microbit:latest
+GODOT_GAMES_IMAGE=neuraville/godot-games-controller:latest
+BLUETOOTH_IMAGE=neuraville/bluetooth_controller:latest
 PLAYGROUND_IMAGE=neuraville/playground:latest
 INFLUX_DB_IMAGE=influxdb:2.0.7
 GRAFANA_IMAGE=../third_party/visualizers/grafana
diff --git a/docker/Dockerfile.private b/docker/archive/Dockerfile.private
similarity index 100%
rename from docker/Dockerfile.private
rename to docker/archive/Dockerfile.private
diff --git a/docker/README.md b/docker/archive/README.md
similarity index 100%
rename from docker/README.md
rename to docker/archive/README.md
diff --git a/docker/_static/docker_setting.png b/docker/archive/_static/docker_setting.png
similarity index 100%
rename from docker/_static/docker_setting.png
rename to docker/archive/_static/docker_setting.png
diff --git a/docker/apple_silicon_feagi.yml b/docker/archive/apple_silicon_feagi.yml
similarity index 100%
rename from docker/apple_silicon_feagi.yml
rename to docker/archive/apple_silicon_feagi.yml
diff --git a/docker/check_playground_images.py b/docker/archive/check_playground_images.py
similarity index 100%
rename from docker/check_playground_images.py
rename to docker/archive/check_playground_images.py
diff --git a/docker/feagi.private.yml b/docker/archive/feagi.private.yml
similarity index 100%
rename from docker/feagi.private.yml
rename to docker/archive/feagi.private.yml
diff --git a/docker/feagi.yml b/docker/archive/feagi.yml
similarity index 100%
rename from docker/feagi.yml
rename to docker/archive/feagi.yml
diff --git a/docker/templates/full_template.yml b/docker/archive/templates/full_template.yml
similarity index 100%
rename from docker/templates/full_template.yml
rename to docker/archive/templates/full_template.yml
diff --git a/docker/playground.yml b/docker/playground.yml
index c30ab2d25..fec258740 100644
--- a/docker/playground.yml
+++ b/docker/playground.yml
@@ -52,8 +52,8 @@ services:
     networks:
       - net
 
-  webcam_javascript_controller:
-    image: ${WEBCAM_CONTROLLER_IMAGE}
+  media_capture_controller:
+    image: ${MEDIA_CONTROLLER_IMAGE}
     deploy:
       resources:
         limits:
@@ -70,8 +70,8 @@ services:
       - feagi
 
 
-  brain_pong_controller:
-    image: ${BRAIN_PONG_IMAGE}
+  godot-games-controller:
+    image: ${GODOT_GAMES_IMAGE}
     ports:
       - "9055:9055"
     env_file:
@@ -80,8 +80,8 @@ services:
     networks:
       - net
 
-  microbit_controller:
-    image: ${MICROBIT_IMAGE}
+  bluetooth_controller:
+    image: ${BLUETOOTH_IMAGE}
     ports:
       - "9052:9052"
     env_file:
diff --git a/generate_version.sh b/generate_version.sh
index fec5f0915..dff87776f 100755
--- a/generate_version.sh
+++ b/generate_version.sh
@@ -4,8 +4,12 @@
 file_path="version.py"
 line_number="1"
 
-# Get current UNIX timestamp
-timestamp=$(date +%s)
-full_line="__version__ = '0$timestamp'"
+# Get current git tag from release in the repo
+git fetch
+current_tag_version=$(git tag | sort -V | tail -n 1)
+if [ -z "$current_tag_version" ]; then
+    current_tag_version="---"
+fi
+full_line="__version__ = '$current_tag_version'"
 
 sed -i "${line_number}s/.*/$full_line/" "$file_path"
diff --git a/src/api/api.py b/src/api/api.py
index 566b79e92..47f0f4550 100644
--- a/src/api/api.py
+++ b/src/api/api.py
@@ -29,7 +29,7 @@
 from .commons import CustomError, api_queue
 from .models import *
 from .routers.v1 import burst_engine, connectome, evolution, feagi_agent, genome, insights, morphology, \
-    network, simulation, system, training, cortical_area, neuroplasticity, cortical_mapping
+    network, simulation, system, training, cortical_area, neuroplasticity, cortical_mapping, region
 from src.inf.feagi import start_feagi
 
 logger = logging.getLogger(__name__)
@@ -65,7 +65,8 @@
     allow_origins=ORIGINS,
     allow_credentials=True,
     allow_methods=["*"],
-    allow_headers=["*"]
+    allow_headers=["*"],
+    expose_headers=["Content-Disposition"],
 )
 
 
@@ -216,6 +217,14 @@ async def catch_exceptions_middleware(request: Request, call_next):
     responses=standard_response
 )
 
+app.include_router(
+    region.router,
+    prefix="/v1/region",
+    tags=["BRAIN REGIONS"],
+    dependencies=[Depends(check_active_genome)],
+    responses=standard_response
+)
+
 app.include_router(
     cortical_mapping.router,
     prefix="/v1/cortical_mapping",
@@ -259,7 +268,7 @@ async def catch_exceptions_middleware(request: Request, call_next):
     training.router,
     prefix="/v1/training",
     tags=["TRAINING"],
-    dependencies=[Depends(check_brain_running)],
+    dependencies=[Depends(check_active_genome)],
     responses=standard_response
 )
 
diff --git a/src/api/commons.py b/src/api/commons.py
index afbf6b792..e6b175141 100644
--- a/src/api/commons.py
+++ b/src/api/commons.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 from queue import Queue
 from datetime import datetime
 
diff --git a/src/api/config.py b/src/api/config.py
index 552a46537..5afdb62e7 100644
--- a/src/api/config.py
+++ b/src/api/config.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 import os
 from pydantic import BaseSettings
 
diff --git a/src/api/error_handling.py b/src/api/error_handling.py
index db222af74..621c03b0d 100644
--- a/src/api/error_handling.py
+++ b/src/api/error_handling.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 import logging
 
 from src.api.feagi_responses import response_list
diff --git a/src/api/message_processor.py b/src/api/message_processor.py
index 7f42d4f1a..ab09b82de 100644
--- a/src/api/message_processor.py
+++ b/src/api/message_processor.py
@@ -15,13 +15,17 @@
 
 import datetime
 # import json
+import json
+
 from src.inf import runtime_data, disk_ops
 # from src.evo.genome_processor import genome_ver_check
 # from src.evo.autopilot import update_generation_dict
 from src.evo.x_genesis import update_cortical_properties, update_morphology_properties, update_cortical_mappings
 from src.evo.x_genesis import add_core_cortical_area, add_custom_cortical_area, cortical_removal, append_circuit
+from src.evo.x_genesis import create_missing_pns_areas
 from src.inf.db_handler import InfluxManagement
 from src.inf.initialize import deploy_genome
+from src.evo.templates import cortical_types
 
 influx = InfluxManagement()
 
@@ -35,14 +39,15 @@ def api_message_processor(api_message):
     """
     Processes the incoming API calls to FEAGI
     """
-    # if 'burst_management' in api_message:
-    #     if 'burst_duration' in api_message['burst_management']:
-    #         if api_message['burst_management']['burst_duration'] is not None:
-    #             runtime_data.burst_timer = api_message['burst_management']['burst_duration']
-    #             runtime_data.genome['burst_delay'] = runtime_data.burst_timer
 
-    # if 'stimulation_script' in api_message:
-    #     runtime_data.stimulation_script = api_message['stimulation_script']['stimulation_script']
+    if 'burst_management' in api_message:
+        if 'burst_duration' in api_message['burst_management']:
+            if api_message['burst_management']['burst_duration'] is not None:
+                runtime_data.burst_timer = api_message['burst_management']['burst_duration']
+                runtime_data.genome['physiology']['burst_delay'] = runtime_data.burst_timer
+
+    if 'stimulation_script' in api_message:
+        runtime_data.stimulation_script = api_message['stimulation_script']['stimulation_script']
 
     if 'log_management' in api_message:
         if 'print_cortical_activity_counters' in api_message['log_management']:
@@ -181,6 +186,10 @@ def api_message_processor(api_message):
     if 'update_cortical_properties' in api_message:
         update_cortical_properties(cortical_properties=api_message['update_cortical_properties'])
 
+    if 'update_multiple_cortical_properties' in api_message:
+        for message in api_message['update_multiple_cortical_properties']:
+            update_cortical_properties(cortical_properties=message)
+
     if 'update_cortical_mappings' in api_message:
         update_cortical_mappings(cortical_mappings=api_message['update_cortical_mappings'])
 
@@ -191,19 +200,26 @@ def api_message_processor(api_message):
         cortical_removal(cortical_area=api_message['delete_cortical_area'],
                          genome_scrub=True)
 
-    # if 'add_core_cortical_area' in api_message:
-    #     add_core_cortical_area(cortical_properties=api_message['add_core_cortical_area'])
+    if 'add_core_cortical_area' in api_message:
+        add_core_cortical_area(cortical_properties=api_message['add_core_cortical_area'])
 
-    # if 'add_custom_cortical_area' in api_message:
-    #     add_custom_cortical_area(cortical_name=api_message['add_custom_cortical_area']['cortical_name'],
-    #                              coordinates_3d=api_message['add_custom_cortical_area']['cortical_coordinates'],
-    #                              coordinates_2d=api_message['add_custom_cortical_area']['cortical_coordinates'],
-    #                              cortical_dimensions=api_message['add_custom_cortical_area']['cortical_dimensions'])
+    if 'add_custom_cortical_area' in api_message:
+        add_custom_cortical_area(cortical_name=api_message['add_custom_cortical_area']['cortical_name'],
+                                 coordinates_3d=api_message['add_custom_cortical_area']['coordinates_3d'],
+                                 coordinates_2d=api_message['add_custom_cortical_area']['coordinates_2d'],
+                                 cortical_dimensions=api_message['add_custom_cortical_area']['cortical_dimensions'],
+                                 parent_region_id=api_message['add_custom_cortical_area']['parent_region_id'],
+                                 is_memory=api_message['add_custom_cortical_area']['is_memory'],
+                                 copy_of=api_message['add_custom_cortical_area']['copy_of'],
+                                 cortical_area_id=api_message['add_custom_cortical_area']['cortical_id'],
+                                 )
 
     if 'append_circuit' in api_message:
         if runtime_data.genome:
             append_circuit(source_genome=api_message['append_circuit']["genome_str"],
-                           circuit_origin=api_message['append_circuit']['circuit_origin'])
+                           circuit_origin=api_message['append_circuit']['circuit_origin'],
+                           parent_brain_region=api_message['append_circuit']['parent_brain_region'],
+                           rewire_mode=api_message['append_circuit']['rewire_mode'])
         else:
             deploy_genome(neuroembryogenesis_flag=True, reset_runtime_data_flag=True,
                           genome_data=api_message['append_circuit']["genome_str"])
@@ -222,7 +238,7 @@ def api_message_processor(api_message):
         if runtime_data.influxdb:
             print("----------- PUNISHMENT --------------")
             runtime_data.influxdb.insert_game_activity(genome_id=runtime_data.genome_id, event="punishment",
-                                        intensity=punishment_intensity)
+                                                       intensity=punishment_intensity)
         else:
             record_training_event(event_name="punishment", details={"intensity": punishment_intensity})
 
@@ -231,3 +247,30 @@ def api_message_processor(api_message):
             runtime_data.influxdb.insert_game_activity(genome_id=runtime_data.genome_id, event="game_over")
         else:
             record_training_event(event_name="game_over")
+
+    if 'update_pns_areas' in api_message:
+        agent_capabilities = api_message['update_pns_areas']
+        if agent_capabilities:
+            dev_list = {}
+            for device_type in agent_capabilities:
+                for device_name in agent_capabilities[device_type]:
+                    dev_count = 0
+                    for _ in agent_capabilities[device_type][device_name]:
+                        dev_count += 1
+
+                    cortical_type = "unknown"
+
+                    if device_type in ["input", "inputs"]:
+                        cortical_type = "IPU"
+
+                    if device_type == ["output", "outputs"]:
+                        cortical_type = "OPU"
+
+                    if cortical_type in ["IPU", "OPU"]:
+                        if device_name in cortical_types[cortical_type]["name_to_id_mapping"]:
+                            for cortical_id in cortical_types[cortical_type]["name_to_id_mapping"][device_name]:
+                                dev_list[cortical_id] = {"dev_count": dev_count}
+                    else:
+                        print(f"Device name {device_name} is not defined in FEAGI templates!")
+
+            create_missing_pns_areas(dev_list=dev_list)
diff --git a/src/api/models.py b/src/api/models.py
index 9fb3c590f..ed71d0b0a 100644
--- a/src/api/models.py
+++ b/src/api/models.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 from pydantic import BaseModel
 
 
diff --git a/src/api/routers/v1/cortical_area.py b/src/api/routers/v1/cortical_area.py
index a04447ae4..99ef28906 100644
--- a/src/api/routers/v1/cortical_area.py
+++ b/src/api/routers/v1/cortical_area.py
@@ -14,19 +14,22 @@
 # ==============================================================================
 
 
-from fastapi import APIRouter, HTTPException, status
+from fastapi import APIRouter, HTTPException, status, Depends
 from fastapi.responses import JSONResponse
 
-from ...schemas import *
-from ...commons import *
-
 from src.inf import runtime_data
 from src.api.error_handling import generate_response
-from src.inf.initialize import generate_cortical_dimensions_by_id
+from src.evo.voxels import generate_cortical_dimensions_by_id
 from src.evo.genome_properties import genome_properties
 from src.evo.x_genesis import add_core_cortical_area, add_custom_cortical_area
 from src.evo.neuroembryogenesis import cortical_name_list, cortical_name_to_id
 from src.evo.templates import cortical_types
+from src.evo.region import change_cortical_area_parent
+from src.evo.cortical_area import cortical_area_type, cortical_id_gen
+
+from ...schemas import *
+from ...commons import *
+from ...dependencies import check_brain_running
 
 
 router = APIRouter()
@@ -41,9 +44,14 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
     if len(cortical_area) == genome_properties["structure"]["cortical_id_length"]:
         if cortical_area in runtime_data.genome['blueprint']:
             cortical_data = runtime_data.genome['blueprint'][cortical_area]
+            brain_region_id = runtime_data.cortical_area_region_association[cortical_area]
+            brain_region_title = ""
+            if brain_region_id:
+                if brain_region_id in runtime_data.genome["brain_regions"]:
+                    brain_region_title = runtime_data.genome["brain_regions"][brain_region_id]["title"]
 
             if 'mp_charge_accumulation' not in cortical_data:
-                cortical_data['mp_charge_accumulation'] = True
+                cortical_data['mp_charge_accumulation'] = False
 
             if 'mp_driven_psp' not in cortical_data:
                 cortical_data['mp_driven_psp'] = False
@@ -53,27 +61,39 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
                 cortical_data['2d_coordinate'].append(None)
                 cortical_data['2d_coordinate'].append(None)
 
+            cortical_visibility = True
+            if cortical_area in runtime_data.cortical_viz_list:
+                cortical_visibility = False
+
+            cortical_type = cortical_area_type(cortical_area=cortical_area)
+
+            dim_x = cortical_data["block_boundaries"][0]
+            dim_y = cortical_data["block_boundaries"][1]
+            dim_z = cortical_data["block_boundaries"][2]
+
             cortical_properties = {
                 "cortical_id": cortical_area,
                 "cortical_name": cortical_data['cortical_name'],
+                "parent_region_id": brain_region_id,
+                "parent_region_title": brain_region_title,
                 "cortical_group": cortical_data['group_id'],
                 "cortical_sub_group": cortical_data['sub_group_id'],
                 "cortical_neuron_per_vox_count": cortical_data['per_voxel_neuron_cnt'],
-                "cortical_visibility": cortical_data['visualization'],
+                "cortical_visibility": cortical_visibility,
                 "cortical_synaptic_attractivity": cortical_data['synapse_attractivity'],
-                "cortical_coordinates": [
+                "coordinates_3d": [
                     cortical_data["relative_coordinate"][0],
                     cortical_data["relative_coordinate"][1],
                     cortical_data["relative_coordinate"][2]
                 ],
-                "cortical_coordinates_2d": [
+                "coordinates_2d": [
                     cortical_data["2d_coordinate"][0],
                     cortical_data["2d_coordinate"][1]
                 ],
                 "cortical_dimensions": [
-                    cortical_data["block_boundaries"][0],
-                    cortical_data["block_boundaries"][1],
-                    cortical_data["block_boundaries"][2]
+                    dim_x,
+                    dim_y,
+                    dim_z
                 ],
                 "cortical_destinations": cortical_data['cortical_mapping_dst'],
                 "neuron_post_synaptic_potential": cortical_data['postsynaptic_current'],
@@ -100,6 +120,21 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
                 "neuron_excitability": cortical_data['neuron_excitability'],
                 "transforming": False
             }
+
+            if cortical_type in ["IPU", "OPU"]:
+                dev_count = runtime_data.genome["blueprint"][cortical_area]["dev_count"]
+
+                dim_x, dim_y, dim_z = runtime_data.genome["blueprint"][cortical_area]["block_boundaries"]
+
+                unit_dim_x = int(dim_x / dev_count)
+
+                unit_dim_y = int(dim_y / dev_count)
+
+                unit_dim_z = int(dim_z / dev_count)
+
+                cortical_properties["dev_count"] = dev_count
+                cortical_properties["cortical_dimensions_per_device"] = [unit_dim_x, unit_dim_y, unit_dim_z]
+
             if cortical_area in runtime_data.transforming_areas:
                 cortical_properties["transforming"] = True
             else:
@@ -112,46 +147,87 @@ async def fetch_cortical_properties(cortical_id: CorticalId):
 
 
 @router.put("/cortical_area")
-async def update_cortical_properties(message: UpdateCorticalProperties):
+async def update_cortical_properties(message: UpdateCorticalProperties, _: str = Depends(check_brain_running)):
     """
     Enables changes against various Burst Engine parameters.
     """
+    if message.cortical_id not in runtime_data.genome["blueprint"]:
+        return JSONResponse(status_code=400, content={'message': f"{message.cortical_id} is not found in Genome!"})
+
+    current_cortical_size = runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][0] * \
+                            runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][1] * \
+                            runtime_data.genome["blueprint"][message.cortical_id]["block_boundaries"][2]
+    updated_cortical_size = current_cortical_size
+
+    if message.cortical_dimensions:
+        updated_cortical_size = message.cortical_dimensions[0] * \
+                            message.cortical_dimensions[1] * \
+                            message.cortical_dimensions[2]
+
+    current_neuron_density = runtime_data.genome["blueprint"][message.cortical_id]["per_voxel_neuron_cnt"]
+    updated_neuron_density = current_neuron_density
+
+    if message.cortical_neuron_per_vox_count:
+        updated_neuron_density = message.cortical_neuron_per_vox_count
+
+    if message.parent_region_id:
+        change_cortical_area_parent(cortical_area_id=message.cortical_id, new_parent_id=message.parent_region_id)
+
+    current_neuron_count = current_cortical_size * current_neuron_density
+    updated_neuron_count = updated_cortical_size * updated_neuron_density
+
+    max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+
+    if runtime_data.brain_stats["neuron_count"] - current_neuron_count + updated_neuron_count > \
+            max_allowable_neuron_count:
+        return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count will"
+                                                                 f" exceed {max_allowable_neuron_count} threshold"})
 
     if message.cortical_id in runtime_data.transforming_areas:
         return generate_response("CORTICAL_AREA_UNDERGOING_TRANSFORMATION")
     else:
-        runtime_data.transforming_areas.add(message.cortical_id)
-        message = message.dict()
+        message = message.dict(exclude_none=True)
         message = {'update_cortical_properties': message}
         print("*-----* " * 200 + "\n", message)
         api_queue.put(item=message)
 
 
 @router.post("/cortical_area")
-async def add_cortical_area(new_cortical_properties: NewCorticalProperties):
+async def add_cortical_area(new_cortical_properties: NewCorticalProperties,
+                            _: str = Depends(check_brain_running)):
     """
     Enables changes against various Burst Engine parameters.
     """
 
     print("Adding core cortical area:\n", new_cortical_properties)
-    # message = message.dict()
-    # message = {'add_core_cortical_area': message}
-    # print("*" * 50 + "\n", message)
-    # api_queue.put(item=message)
-    new_cortical_properties = dict(new_cortical_properties)
-    cortical_id = add_core_cortical_area(cortical_properties=new_cortical_properties)
-    # response.status_code = status.HTTP_200_OK
-    return JSONResponse(status_code=200, content={'cortical_id': cortical_id})
+    message = new_cortical_properties.dict()
+    message = {'add_core_cortical_area': message}
+    print("*" * 50 + "\n", message)
+    api_queue.put(item=message)
+
+    return JSONResponse(status_code=200, content={'cortical_id': new_cortical_properties.cortical_id})
 
 
 @router.post("/custom_cortical_area")
-async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCorticalProperties):
+async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCorticalProperties,
+                                   _: str = Depends(check_brain_running)):
     """
     Enables changes against various Burst Engine parameters.
     """
+
+    message = new_custom_cortical_properties.dict(exclude_none=True)
+
+    # Generate Cortical ID
+    # todo: instead of hard coding the length have the genome properties captured and reference instead
     cortical_name = new_custom_cortical_properties.cortical_name
-    coordinates_3d = new_custom_cortical_properties.coordinates_3d.copy()
-    coordinates_2d = new_custom_cortical_properties.coordinates_2d.copy()
+    temp_name = cortical_name
+    if len(cortical_name) < 3:
+        temp_name = cortical_name + "000"
+
+    parent_region_id = new_custom_cortical_properties.parent_region_id
+    if parent_region_id not in runtime_data.genome["brain_regions"]:
+        return JSONResponse(status_code=400, content={'message': f"{parent_region_id} does not exist!"})
+
     sub_group_id = new_custom_cortical_properties.sub_group_id
     copy_of = new_custom_cortical_properties.copy_of
     if "MEMORY" in sub_group_id:
@@ -160,19 +236,36 @@ async def add_cortical_area_custom(new_custom_cortical_properties: NewCustomCort
     else:
         is_memory = False
         cortical_dimensions = new_custom_cortical_properties.cortical_dimensions
-    cortical_id = add_custom_cortical_area(cortical_name=cortical_name,
-                                           coordinates_3d=coordinates_3d,
-                                           coordinates_2d=coordinates_2d,
-                                           cortical_dimensions=cortical_dimensions,
-                                           is_memory=is_memory,
-                                           copy_of=copy_of)
+
+    message["is_memory"] = is_memory
+    message["cortical_dimensions"] = cortical_dimensions
+
+    cortical_id = cortical_id_gen(temp_name[:3], is_memory=is_memory)
+
+    neuron_density = 1
+    if copy_of:
+        neuron_density = runtime_data.genome["blueprint"][copy_of]["per_voxel_neuron_cnt"]
+
+    message["copy_of"] = copy_of
+    message["cortical_id"] = cortical_id
+
+    neuron_count = neuron_density * cortical_dimensions[0] * cortical_dimensions[1] * cortical_dimensions[2]
+    max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+    if neuron_count + runtime_data.brain_stats["neuron_count"] > max_allowable_neuron_count:
+        return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count will"
+                                                                 f" exceed {max_allowable_neuron_count} threshold"})
+
+    message = {'add_custom_cortical_area': message}
+    print("*-----* " * 200 + "\n", message)
+    api_queue.put(item=message)
+
     return JSONResponse(status_code=200, content={'cortical_id': cortical_id})
 
 
 @router.delete("/cortical_area")
 async def delete_cortical_area(cortical_id: CorticalId):
     """
-    Enables changes against various Burst Engine parameters.
+    Deletes a single cortical area
     """
     cortical_id = cortical_id.cortical_id
     if cortical_id in runtime_data.genome["blueprint"]:
@@ -328,3 +421,191 @@ async def connectome_detailed_cortical_map():
                 cortical_map[cortical_area][dst].append(mapping)
 
     return cortical_map
+
+
+@router.get("/cortical_visibility")
+async def fetch_visualized_cortical_list():
+    return runtime_data.cortical_viz_list
+
+
+@router.put("/suppress_cortical_visibility")
+async def suppress_cortical_activity_visualization(cortical_id_list: list):
+    unprocessed_list = set()
+    runtime_data.cortical_viz_list = set()
+    for cortical_id in cortical_id_list:
+        if cortical_id in runtime_data.cortical_list:
+            runtime_data.cortical_viz_list.add(cortical_id)
+        else:
+            unprocessed_list.add(cortical_id)
+            runtime_data.genome["blueprint"][cortical_id]["visualization"] = False
+
+    if unprocessed_list:
+        return JSONResponse(status_code=400, content={'message': f"Following cortical ids were not found!\n "
+                                                                 f"{unprocessed_list}"})
+
+
+@router.post("/multi/cortical_area_properties")
+async def fetch_multiple_cortical_properties(cortical_id_list: CorticalIdList):
+    """
+    Returns the properties of multiple cortical areas
+    """
+    results = list()
+    for cortical_area in cortical_id_list.cortical_id_list:
+        if len(cortical_area) == genome_properties["structure"]["cortical_id_length"]:
+            if cortical_area in runtime_data.genome['blueprint']:
+                cortical_data = runtime_data.genome['blueprint'][cortical_area]
+                brain_region_id = runtime_data.cortical_area_region_association[cortical_area]
+                brain_region_title = runtime_data.genome["brain_regions"][brain_region_id]["title"]
+
+                if 'mp_charge_accumulation' not in cortical_data:
+                    cortical_data['mp_charge_accumulation'] = False
+
+                if 'mp_driven_psp' not in cortical_data:
+                    cortical_data['mp_driven_psp'] = False
+
+                if '2d_coordinate' not in cortical_data:
+                    cortical_data['2d_coordinate'] = list()
+                    cortical_data['2d_coordinate'].append(None)
+                    cortical_data['2d_coordinate'].append(None)
+
+                cortical_properties = {
+                    "cortical_id": cortical_area,
+                    "cortical_name": cortical_data['cortical_name'],
+                    "parent_region_id": brain_region_id,
+                    "parent_region_title": brain_region_title,
+                    "cortical_group": cortical_data['group_id'],
+                    "cortical_sub_group": cortical_data['sub_group_id'],
+                    "cortical_neuron_per_vox_count": cortical_data['per_voxel_neuron_cnt'],
+                    "visualization": not (cortical_area in runtime_data.cortical_viz_list),
+                    "cortical_synaptic_attractivity": cortical_data['synapse_attractivity'],
+                    "coordinates_3d": [
+                        cortical_data["relative_coordinate"][0],
+                        cortical_data["relative_coordinate"][1],
+                        cortical_data["relative_coordinate"][2]
+                    ],
+                    "coordinates_2d": [
+                        cortical_data["2d_coordinate"][0],
+                        cortical_data["2d_coordinate"][1]
+                    ],
+                    "cortical_dimensions": [
+                        cortical_data["block_boundaries"][0],
+                        cortical_data["block_boundaries"][1],
+                        cortical_data["block_boundaries"][2]
+                    ],
+                    "cortical_destinations": cortical_data['cortical_mapping_dst'],
+                    "neuron_post_synaptic_potential": cortical_data['postsynaptic_current'],
+                    "neuron_post_synaptic_potential_max": cortical_data['postsynaptic_current_max'],
+                    "neuron_fire_threshold": cortical_data['firing_threshold'],
+                    "neuron_fire_threshold_increment": [
+                        cortical_data['firing_threshold_increment_x'],
+                        cortical_data['firing_threshold_increment_y'],
+                        cortical_data['firing_threshold_increment_z']
+                    ],
+                    "neuron_firing_threshold_limit": cortical_data['firing_threshold_limit'],
+                    "neuron_refractory_period": cortical_data['refractory_period'],
+                    "neuron_leak_coefficient": cortical_data['leak_coefficient'],
+                    "neuron_leak_variability": cortical_data['leak_variability'],
+                    "neuron_consecutive_fire_count": cortical_data['consecutive_fire_cnt_max'],
+                    "neuron_snooze_period": cortical_data['snooze_length'],
+                    "neuron_degeneracy_coefficient": cortical_data['degeneration'],
+                    "neuron_psp_uniform_distribution": cortical_data['psp_uniform_distribution'],
+                    "neuron_mp_charge_accumulation": cortical_data['mp_charge_accumulation'],
+                    "neuron_mp_driven_psp": cortical_data['mp_driven_psp'],
+                    "neuron_longterm_mem_threshold": cortical_data['longterm_mem_threshold'],
+                    "neuron_lifespan_growth_rate": cortical_data['lifespan_growth_rate'],
+                    "neuron_init_lifespan": cortical_data['init_lifespan'],
+                    "neuron_excitability": cortical_data['neuron_excitability'],
+                    "transforming": False
+                }
+                if cortical_area in runtime_data.transforming_areas:
+                    cortical_properties["transforming"] = True
+                else:
+                    cortical_properties["transforming"] = False
+                results.append(cortical_properties)
+            else:
+                return generate_response("CORTICAL_AREA_NOT_FOUND")
+        else:
+            return generate_response("CORTICAL_AREA_INVALID_ID_LENGTH")
+    return results
+
+
+@router.put("/multi/cortical_area")
+async def update_multiple_cortical_properties(message: UpdateMultipleCorticalProperties):
+    """
+    Updates properties for multiple cortical areas at the same time
+    """
+
+    cortical_id_list = message.cortical_id_list
+
+    # Check to ensure all selected areas are of same type
+    message_dict = message.dict(exclude_none=True)
+    message_dict.pop("cortical_id_list")
+
+    type_list = set()
+    transforming = False
+    for cortical_id in message.cortical_id_list:
+        type_list.add(runtime_data.genome["blueprint"][cortical_id]["is_mem_type"])
+        if "transforming" in runtime_data.genome["blueprint"][cortical_id]:
+            if runtime_data.genome["blueprint"][cortical_id]["transforming"]:
+                transforming = True
+    if len(type_list) > 1:
+        return JSONResponse(status_code=400, content={'message': f"Memory and non-memory type cortical areas cannot"
+                                                                 f"be edited at the same time"})
+
+    if transforming:
+        return generate_response("CORTICAL_AREA_UNDERGOING_TRANSFORMATION")
+
+    multi_edit_payload = []
+
+    # Proceed with updates
+    for cortical_id in cortical_id_list:
+        current_cortical_size = runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][0] * \
+                                runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][1] * \
+                                runtime_data.genome["blueprint"][cortical_id]["block_boundaries"][2]
+        updated_cortical_size = current_cortical_size
+
+        if message_dict.get("cortical_dimensions"):
+            updated_cortical_size = message.cortical_dimensions[0] * \
+                                message.cortical_dimensions[1] * \
+                                message.cortical_dimensions[2]
+
+        current_neuron_density = runtime_data.genome["blueprint"][cortical_id]["per_voxel_neuron_cnt"]
+        updated_neuron_density = current_neuron_density
+
+        if message_dict.get("cortical_neuron_per_vox_count"):
+            updated_neuron_density = message.cortical_neuron_per_vox_count
+
+        if message_dict.get("parent_region_id"):
+            change_cortical_area_parent(cortical_area_id=cortical_id, new_parent_id=message.parent_region_id)
+
+        current_neuron_count = current_cortical_size * current_neuron_density
+        updated_neuron_count = updated_cortical_size * updated_neuron_density
+
+        max_allowable_neuron_count = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+
+        if runtime_data.brain_stats["neuron_count"] - current_neuron_count + updated_neuron_count > \
+                max_allowable_neuron_count:
+            return JSONResponse(status_code=400, content={'message': f"Cannot create new cortical area as neuron count"
+                                                                     f" will exceed {max_allowable_neuron_count} "
+                                                                     f"threshold"})
+
+        cortical_payload = message_dict.copy()
+        cortical_payload["cortical_id"] = cortical_id
+        multi_edit_payload.append(cortical_payload)
+
+    message_ = {'update_multiple_cortical_properties': multi_edit_payload}
+    api_queue.put(item=message_)
+
+
+@router.delete("/multi/cortical_area")
+async def delete_multiple_cortical_areas(cortical_id_list: CorticalIdList):
+    """
+    Deletes multiple cortical areas at the same time
+    """
+    for cortical_id in cortical_id_list.cortical_id_list:
+        if cortical_id in runtime_data.genome["blueprint"]:
+
+            message = {'delete_cortical_area': cortical_id}
+            api_queue.put(item=message)
+        else:
+            return generate_response("CORTICAL_AREA_NOT_FOUND")
diff --git a/src/api/routers/v1/cortical_mapping.py b/src/api/routers/v1/cortical_mapping.py
index b1d8bb2bc..42be15126 100644
--- a/src/api/routers/v1/cortical_mapping.py
+++ b/src/api/routers/v1/cortical_mapping.py
@@ -14,14 +14,15 @@
 # ==============================================================================
 
 
-from fastapi import APIRouter, HTTPException
+from fastapi import APIRouter, HTTPException, Depends
 
 from ...commons import *
 from ...schemas import *
+from ...dependencies import check_brain_running
 
 from src.inf import runtime_data
 from src.evo.genome_properties import genome_properties
-from src.evo.x_genesis import neighboring_cortical_areas
+from src.evo.synapse import neighboring_cortical_areas
 
 
 router = APIRouter()
@@ -104,7 +105,8 @@ async def fetch_cortical_mapping_properties(source_destination: CorticalAreaSrcD
 
 
 @router.put("/mapping_properties")
-async def update_cortical_mapping_properties(cortical_mapping_properties: UpdateCorticalMappingProperties):
+async def update_cortical_mapping_properties(cortical_mapping_properties: UpdateCorticalMappingProperties,
+                                             _: str = Depends(check_brain_running)):
     """
     Enables changes against various Burst Engine parameters.
     """
@@ -130,3 +132,24 @@ async def connectome_cortical_map():
                 cortical_map[cortical_area][dst] += 1
 
     return cortical_map
+
+
+@router.delete("/delete_suggested_mappings")
+async def delete_suggested_mapping(mapping_data: SuggestedMapping):
+    """
+    Deletes suggested mapping hint associated with a brain region
+    """
+    region_id = mapping_data.brain_region_id
+    mapping_type = mapping_data.mapping_type
+
+    if region_id in runtime_data.genome["brain_regions"]:
+        if mapping_type in ["inputs", "outputs"]:
+            for mapping_definition in mapping_data.mapping_definitions:
+                if mapping_definition in runtime_data.genome["brain_regions"][region_id][mapping_type]:
+                    runtime_data.genome["brain_regions"][region_id][mapping_type].remove(mapping_definition)
+                else:
+                    raise HTTPException(status_code=400, detail=f"Mapping definition not found!")
+        else:
+            raise HTTPException(status_code=400, detail=f"Mapping type can be defined as either 'inputs' or 'outputs' ")
+    else:
+        raise HTTPException(status_code=400, detail=f"Brain region id {region_id} is not valid.")
diff --git a/src/api/routers/v1/feagi_agent.py b/src/api/routers/v1/feagi_agent.py
index d3401010c..b71d65462 100644
--- a/src/api/routers/v1/feagi_agent.py
+++ b/src/api/routers/v1/feagi_agent.py
@@ -24,6 +24,7 @@
 from src.inf import runtime_data
 from src.inf.messenger import Sub
 
+
 router = APIRouter()
 
 
@@ -71,19 +72,22 @@ async def agent_properties(agent_id: str):
 
 
 @router.post("/register")
-async def agent_registration(request: Request, agent_type: str, agent_id: str, agent_data_port: int,
-                             agent_version: str, controller_version: str):
-
-    if agent_id in runtime_data.agent_registry:
-        agent_info = runtime_data.agent_registry[agent_id]
+async def agent_registration(request: Request, data: AgentRegistration):
+    agent_data_port = data.agent_data_port
+    capabilities = {}
+    if data.capabilities:
+        capabilities = data.capabilities
+
+    if data.agent_id in runtime_data.agent_registry:
+        agent_info = runtime_data.agent_registry[data.agent_id]
     else:
         agent_info = dict()
-        agent_info["agent_id"] = agent_id
-        agent_info["agent_type"] = agent_type
+        agent_info["agent_id"] = data.agent_id
+        agent_info["agent_type"] = data.agent_type
         # runtime_data.agent_registry[agent_id]["agent_ip"] = agent_ip
         agent_info["agent_ip"] = request.client.host
-        if agent_type == 'monitor':
-            agent_router_address = f"tcp://{request.client.host}:{agent_data_port}"
+        if data.agent_type == 'monitor':
+            agent_router_address = f"tcp://{request.client.host}:{data.agent_data_port}"
             agent_info["listener"] = Sub(address=agent_router_address, bind=False)
             print("Publication of brain activity turned on!")
             runtime_data.brain_activity_pub = True
@@ -94,14 +98,23 @@ async def agent_registration(request: Request, agent_type: str, agent_id: str, a
 
         agent_info["agent_data_port"] = agent_data_port
         agent_info["agent_router_address"] = agent_router_address
-        agent_info["agent_version"] = agent_version
-        agent_info["controller_version"] = controller_version
+        agent_info["agent_version"] = data.agent_version
+        agent_info["controller_version"] = data.controller_version
+        agent_info["capabilities"] = capabilities
 
     print(f"AGENT Details -- {agent_info}")
-    runtime_data.agent_registry[agent_id] = agent_info
-
-    print("New agent has been successfully registered:", runtime_data.agent_registry[agent_id])
-    agent_info = runtime_data.agent_registry[agent_id].copy()
+    runtime_data.agent_registry[data.agent_id] = agent_info
+    runtime_data.host_info[data.agent_id] = agent_info
+
+    if runtime_data.auto_pns_area_creation and runtime_data.genome:
+        print("@@@@  Auto generation of IPU/OPU areas has been initiated @@@")
+        print("#### Capabilities:", capabilities)
+        message = {'update_pns_areas': capabilities}
+        print("*-----* " * 200 + "\n", message)
+        api_queue.put(item=message)
+
+    print("New agent has been successfully registered:", runtime_data.agent_registry[data.agent_id])
+    agent_info = runtime_data.agent_registry[data.agent_id].copy()
     agent_info.pop('listener')
     return agent_info
 
diff --git a/src/api/routers/v1/genome.py b/src/api/routers/v1/genome.py
index 989f44f54..9fc42714f 100644
--- a/src/api/routers/v1/genome.py
+++ b/src/api/routers/v1/genome.py
@@ -17,15 +17,20 @@
 import os
 import json
 
-from fastapi import APIRouter, UploadFile, File, HTTPException
+from fastapi import APIRouter, UploadFile, File, HTTPException, Depends, Query
 from starlette.responses import FileResponse
 
 from ...schemas import *
 from ...commons import *
+from ...dependencies import check_active_genome
 
 from src.inf import runtime_data
-from src.evo.genome_processor import genome_2_1_convertor
+from src.evo.genome_editor import save_genome
+from src.evo.genome_processor import genome_2_1_convertor, genome_v1_v2_converter
 from src.evo.stats import circuit_size
+from src.evo.region import region_id_2_title, construct_genome_from_region
+from src.evo.templates import cortical_template
+from src.inf.initialize import generate_cortical_dimensions_by_id
 
 
 router = APIRouter()
@@ -67,6 +72,12 @@ async def genome_file_upload(file: UploadFile = File(...)):
 
     genome_str = json.loads(data)
 
+    if "genome_title" not in genome_str:
+        genome_str["genome_title"] = runtime_data.genome_file_name
+
+    if "genome_description" not in genome_str:
+        genome_str["genome_description"] = ""
+
     # genome_str = genome_str.replace('\'', '\"')
     # genome_str = data.decode("utf-8").split(" = ")[1]
     message = {'genome': genome_str}
@@ -87,18 +98,56 @@ async def genome_file_name():
 
 @router.post("/upload/string")
 async def genome_string_upload(genome: dict):
+
+    if "genome_title" not in genome:
+        genome["genome_title"] = "Unknown Genome"
+
+    if "genome_description" not in genome:
+        genome["genome_description"] = ""
+
     message = {'genome': genome}
     api_queue.put(item=message)
 
 
 @router.get("/download")
-async def genome_download():
+async def genome_download(_: str = Depends(check_active_genome)):
     print("Downloading Genome...")
-
-    file_name = "genome_" + datetime.now().strftime("%Y_%m_%d-%I:%M:%S_%p") + ".json"
+    save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                file_name=runtime_data.connectome_path + "genome.json")
+    file_name = "genome-" + runtime_data.genome["genome_title"].replace(" ", "_") + ".json"
     print(file_name)
+
     if runtime_data.genome:
-        return FileResponse(path=runtime_data.connectome_path + "genome.json", filename=file_name)
+        runtime_data.changes_saved_externally = True
+        file_path = runtime_data.connectome_path + "genome.json"
+        headers = {"Content-Disposition": f"attachment; filename={file_name}"}
+        response = FileResponse(path=file_path,
+                                media_type="application/json",
+                                filename=file_name,
+                                headers=headers
+                                )
+        # response.headers["Content-Disposition"] = f'attachment; filename=\"{file_name}\"'
+        # print("response headers", response.headers)
+        return response
+    else:
+        raise HTTPException(status_code=400, detail="No running genome found!")
+
+
+@router.get("/download_region")
+async def genome_download_from_region(region_id, _: str = Depends(check_active_genome)):
+    print(f"Downloading genome associated with {region_id} ...")
+
+    region_title = region_id_2_title(region_id=region_id)
+    genome_payload = construct_genome_from_region(region_id=region_id)
+
+    genome_path = runtime_data.connectome_path + f"genome_{region_title}.json"
+    save_genome(genome=genome_payload,
+                file_name=genome_path)
+    file_name = f"genome-{region_title}".replace(" ", "_") + ".json"
+
+    if runtime_data.genome:
+        runtime_data.changes_saved_externally = True
+        return FileResponse(path=genome_path, media_type="application/json", filename=file_name)
     else:
         raise HTTPException(status_code=400, detail="No running genome found!")
 
@@ -142,11 +191,13 @@ async def reset_genome():
 
 
 @router.post("/amalgamation_by_payload")
-async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
+async def amalgamation_attempt(amalgamation_param: AmalgamationRequest, _: str = Depends(check_active_genome)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
         now = datetime.now()
+        genome = genome_2_1_convertor(amalgamation_param.genome_payload["blueprint"])
+
         amalgamation_id = str(now.strftime("%Y%m%d%H%M%S%f")[2:]) + '_A'
         runtime_data.pending_amalgamation["genome_id"] = amalgamation_param.genome_id
         runtime_data.pending_amalgamation["genome_title"] = amalgamation_param.genome_title
@@ -154,14 +205,14 @@ async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
         runtime_data.pending_amalgamation["initiation_time"] = datetime.now()
         runtime_data.pending_amalgamation["amalgamation_id"] = amalgamation_id
         runtime_data.pending_amalgamation["circuit_size"] = \
-            circuit_size(blueprint=amalgamation_param.genome_payload["blueprint"])
+            circuit_size(blueprint=genome["blueprint"])
 
         runtime_data.amalgamation_history[amalgamation_id] = "pending"
         return amalgamation_id
 
 
 @router.post("/amalgamation_by_upload")
-async def amalgamation_attempt(file: UploadFile = File(...)):
+async def amalgamation_attempt(_: str = Depends(check_active_genome), file: UploadFile = File(...)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
@@ -186,7 +237,7 @@ async def amalgamation_attempt(file: UploadFile = File(...)):
 
 
 @router.post("/amalgamation_by_filename")
-async def amalgamation_attempt(amalgamation_param: AmalgamationRequest):
+async def amalgamation_attempt(amalgamation_param: AmalgamationRequest, _: str = Depends(check_active_genome)):
     if pending_amalgamation():
         raise HTTPException(status_code=409, detail="An existing amalgamation attempt is pending")
     else:
@@ -209,18 +260,31 @@ async def amalgamation_history():
     return runtime_data.amalgamation_history
 
 
+@router.get("/cortical_template")
+async def cortical_template_():
+    return cortical_template
+
+
 @router.post("/amalgamation_destination")
-async def amalgamation_conclusion(circuit_origin_x: int,
-                                  circuit_origin_y: int,
-                                  circuit_origin_z: int,
-                                  amalgamation_id):
+async def amalgamation_conclusion(circuit_origin_x,
+                                  circuit_origin_y,
+                                  circuit_origin_z,
+                                  amalgamation_id,
+                                  _: str = Depends(check_active_genome),
+                                  brain_region_id="root",
+                                  rewire_mode: RewiringMode = Query(default=RewiringMode.rewire_all)):
+
     if pending_amalgamation():
         payload = dict()
         payload["genome_str"] = runtime_data.pending_amalgamation["genome_payload"]
-        payload["circuit_origin"] = [circuit_origin_x, circuit_origin_y, circuit_origin_z]
+        payload["circuit_origin"] = [int(circuit_origin_x), int(circuit_origin_y), int(circuit_origin_z)]
+        payload["parent_brain_region"] = brain_region_id
+        payload["rewire_mode"] = rewire_mode.value
         data = {'append_circuit': payload}
+        print(data)
         api_queue.put(item=data)
         genome_title = runtime_data.pending_amalgamation["genome_title"]
+
         cancel_pending_amalgamation(amalgamation_id=amalgamation_id)
         runtime_data.amalgamation_history["amalgamation_id"] = "complete"
         return f"Amalgamation for \"{genome_title}\" is complete."
diff --git a/src/api/routers/v1/insights.py b/src/api/routers/v1/insights.py
index cf296c7c2..548d4dfce 100644
--- a/src/api/routers/v1/insights.py
+++ b/src/api/routers/v1/insights.py
@@ -28,57 +28,61 @@
 # ####################################################
 
 @router.post("/neurons/membrane_potential_status")
-async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalId):
+async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalIdList):
     print("Cortical membrane potential monitoring", runtime_data.neuron_mp_collection_scope)
-    cortical_area = cortical_area.cortical_id
-    if cortical_area in runtime_data.neuron_mp_collection_scope:
-        return True
-    else:
-        return False
+    response = list()
+    for cortical_area in cortical_area.cortical_id_list:
+        if cortical_area in runtime_data.neuron_mp_collection_scope:
+            response.append([cortical_area, True])
+        else:
+            response.append([cortical_area, False])
 
 
 @router.post("/neurons/membrane_potential_set")
-async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalId, state: bool):
+async def cortical_neuron_membrane_potential_monitoring(cortical_area: CorticalIdList, state: bool):
     print("Cortical membrane potential monitoring", runtime_data.neuron_mp_collection_scope)
-    cortical_area = cortical_area.cortical_id
+
     if runtime_data.influxdb:
         influx_readiness = runtime_data.influxdb.test_influxdb()
         if influx_readiness:
-            if cortical_area in runtime_data.genome['blueprint']:
-                if state and cortical_area not in runtime_data.neuron_mp_collection_scope:
-                    runtime_data.neuron_mp_collection_scope[cortical_area] = {}
-                elif not state and cortical_area in runtime_data.neuron_mp_collection_scope:
-                    runtime_data.neuron_mp_collection_scope.pop(cortical_area)
-                else:
-                    pass
+            for cortical_area in cortical_area.cortical_id_list:
+                if cortical_area in runtime_data.genome['blueprint']:
+                    if state and cortical_area not in runtime_data.neuron_mp_collection_scope:
+                        runtime_data.neuron_mp_collection_scope[cortical_area] = {}
+                    elif not state and cortical_area in runtime_data.neuron_mp_collection_scope:
+                        runtime_data.neuron_mp_collection_scope.pop(cortical_area)
+                    else:
+                        pass
             return True
     else:
         raise HTTPException(status_code=400, detail="InfluxDb service is not running!")
 
 
 @router.post("/neuron/synaptic_potential_status")
-async def cortical_synaptic_potential_monitoring(cortical_area: CorticalId):
+async def cortical_synaptic_potential_monitoring(cortical_area: CorticalIdList):
     print("Cortical synaptic potential monitoring flag", runtime_data.neuron_psp_collection_scope)
-    cortical_area = cortical_area.cortical_id
-    if cortical_area in runtime_data.neuron_psp_collection_scope:
-        return True
-    else:
-        return False
+    response = list()
+    for cortical_area in cortical_area.cortical_id_list:
+        if cortical_area in runtime_data.neuron_psp_collection_scope:
+            response.append([cortical_area, True])
+        else:
+            response.append([cortical_area, False])
 
 
 @router.post("/neuron/synaptic_potential_set")
-async def cortical_synaptic_potential_monitoring(cortical_area: CorticalId, state: bool):
+async def cortical_synaptic_potential_monitoring(cortical_area: CorticalIdList, state: bool):
     print("Cortical synaptic potential monitoring flag", runtime_data.neuron_psp_collection_scope)
-    cortical_area = cortical_area.cortical_id
+
     if runtime_data.influxdb:
         if runtime_data.influxdb.test_influxdb():
-            if cortical_area in runtime_data.genome['blueprint']:
-                if state and cortical_area not in runtime_data.neuron_psp_collection_scope:
-                    runtime_data.neuron_psp_collection_scope[cortical_area] = {}
-                elif not state and cortical_area in runtime_data.neuron_psp_collection_scope:
-                    runtime_data.neuron_psp_collection_scope.pop(cortical_area)
-                else:
-                    pass
+            for cortical_area in cortical_area.cortical_id_list:
+                if cortical_area in runtime_data.genome['blueprint']:
+                    if state and cortical_area not in runtime_data.neuron_psp_collection_scope:
+                        runtime_data.neuron_psp_collection_scope[cortical_area] = {}
+                    elif not state and cortical_area in runtime_data.neuron_psp_collection_scope:
+                        runtime_data.neuron_psp_collection_scope.pop(cortical_area)
+                    else:
+                        pass
             return True
     else:
         raise HTTPException(status_code=400, detail="InfluxDb service is not running!")
diff --git a/src/api/routers/v1/morphology.py b/src/api/routers/v1/morphology.py
index 50ea08fa1..3fc99bd38 100644
--- a/src/api/routers/v1/morphology.py
+++ b/src/api/routers/v1/morphology.py
@@ -127,7 +127,7 @@ async def genome_update_neuron_morphology(morphology_input: MorphologyInput):
 @router.post("/morphology")
 async def genome_add_neuron_morphology(morphology_input: MorphologyInput):
     """
-    Enables changes against various Burst Engine parameters.
+    Create new connectivity rule aka. neuron morphology.
     """
     morphology_name = morphology_input.morphology_name
     if morphology_input.morphology_name not in runtime_data.genome['neuron_morphologies']:
diff --git a/src/api/routers/v1/neuroplasticity.py b/src/api/routers/v1/neuroplasticity.py
index 41f4c176c..4c61e81c6 100644
--- a/src/api/routers/v1/neuroplasticity.py
+++ b/src/api/routers/v1/neuroplasticity.py
@@ -27,7 +27,7 @@ async def show_plasticity_queue_depth():
     """
     Returns the current plasticity queue depth value
     """
-    return runtime_data.genome["plasticity_queue_depth"]
+    return runtime_data.genome["physiology"]["plasticity_queue_depth"]
 
 
 @router.put("/plasticity_queue_depth")
@@ -35,4 +35,4 @@ async def update_plasticity_queue_depth(queue_depth: int):
     """
     Enables changes against various Burst Engine parameters.
     """
-    runtime_data.genome["plasticity_queue_depth"] = queue_depth
+    runtime_data.genome["physiology"]["plasticity_queue_depth"] = queue_depth
diff --git a/src/api/routers/v1/region.py b/src/api/routers/v1/region.py
new file mode 100644
index 000000000..bc2342eb3
--- /dev/null
+++ b/src/api/routers/v1/region.py
@@ -0,0 +1,181 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+from fastapi import APIRouter, HTTPException, status
+from fastapi.responses import JSONResponse
+
+from ...schemas import *
+from ...commons import *
+
+from src.inf import runtime_data
+from src.evo.region import *
+from src.api.error_handling import generate_response
+from src.evo.genome_properties import genome_properties
+from src.evo.x_genesis import add_core_cortical_area, add_custom_cortical_area
+from src.evo.neuroembryogenesis import cortical_name_list, cortical_name_to_id
+from src.evo.templates import cortical_types
+
+
+"""
+[POST] create a new brain region: /v1/region/region
+[PUT] Update brain region properties (title, coordinates) /v1/region/region
+[GET] Update brain region properties (title, coordinates) /v1/region/region
+[DELETE] Deletes a brain region /v1/region/region
+
+[GET] list all brain regions (summary): /v1/TBD
+[GET] list all brain regions and their members (comprehensive): /v1/TBD
+[GET] list members of a given brain region: /v1/TBD
+[PUT] associate a cortical area or brain region to another brain region: /v1/TBD
+
+
+"""
+
+router = APIRouter()
+
+
+@router.post("/region")
+async def create_brain_region(region_data: NewRegionProperties):
+    if region_data.parent_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{region_data.parent_region_id} is not a valid region id")
+    else:
+        region_id = create_region(region_data)
+        return {"region_id": region_id}
+
+
+@router.put("/region")
+async def update_region_properties(region_data: UpdateRegionProperties):
+    region_dict = region_data.__dict__
+    unacceptable_root_fields = ["parent_region_id", "coordinates_2d", "coordinates_3d"]
+    if region_data.region_id == "root":
+        for field in unacceptable_root_fields:
+            if field in region_dict:
+                raise HTTPException(status_code=400, detail=f"{field} cannot be modified for root region")
+    if "parent_region_id" in region_dict:
+        region_dict.pop("parent_region_id")
+
+    update_region(region_data=region_dict)
+
+
+@router.get("/region")
+async def view_region_properties(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        return runtime_data.genome["brain_regions"][region_id]
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id} is not a valid region id")
+
+
+@router.delete("/region")
+async def delete_region(region_id: Id):
+    if region_id.id == "root":
+        raise HTTPException(status_code=400, detail="Root region cannot be deleted")
+    elif region_id.id in runtime_data.genome["brain_regions"]:
+        region_parent = runtime_data.genome["brain_regions"][region_id.id]["parent_region_id"]
+        for area_id in runtime_data.genome["brain_regions"][region_id.id]["areas"]:
+            change_cortical_area_parent(cortical_area_id=area_id,
+                                        new_parent_id=region_parent)
+            runtime_data.cortical_area_region_association[area_id] = region_parent
+        for region_id_ in runtime_data.genome["brain_regions"][region_id.id]["regions"]:
+            change_brain_region_parent(region_id=region_id_,
+                                       new_parent_id=region_parent)
+        runtime_data.genome["brain_regions"].pop(region_id.id)
+        runtime_data.genome["brain_regions"][region_parent]["regions"].remove(region_id.id)
+
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id.id} is not a valid region id")
+
+
+@router.delete("/region_and_members")
+async def delete_region_and_members(region_id: Id):
+    if region_id.id == "root":
+        raise HTTPException(status_code=400, detail="Root region cannot be deleted")
+    elif region_id.id in runtime_data.genome["brain_regions"]:
+        delete_region_with_members(region_id=region_id)
+    else:
+        raise HTTPException(status_code=400, detail=f"{region_id.id} is not a valid region id")
+
+
+@router.get("/regions")
+async def list_all_regions():
+    region_summary = dict()
+    region_list = runtime_data.genome["brain_regions"].keys()
+    for region in region_list:
+        region_summary[region] = {}
+        region_summary[region]["coordinate_2d"] = runtime_data.genome["brain_regions"][region]["coordinate_2d"]
+        region_summary[region]["coordinate_3d"] = runtime_data.genome["brain_regions"][region]["coordinate_3d"]
+
+    return region_summary
+
+
+@router.get("/regions_members")
+async def list_all_regions_and_members():
+    return runtime_data.genome["brain_regions"]
+
+
+@router.get("/region_titles")
+async def list_all_region_titles():
+    title_list = []
+    for region_id in runtime_data.genome["brain_regions"]:
+        title_list.append((region_id, region_id_2_title(region_id=region_id)))
+    return title_list
+
+
+@router.put("/change_cortical_area_region")
+async def update_cortical_area_region_association(association_data: RegionAssociation):
+    if association_data.id not in runtime_data.genome["blueprint"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not a valid cortical area id")
+    elif runtime_data.genome["blueprint"][association_data.id]["group_id"] in ["IPU", "OPU", "CORE"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not custom area and "
+                                                    f"restricted to move")
+    elif association_data.new_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.new_region_id} is not a valid brain region  id")
+    else:
+        change_cortical_area_parent(cortical_area_id=association_data.id,
+                                    new_parent_id=association_data.new_region_id)
+
+
+@router.put("/change_region_parent")
+async def update_brain_region_parent(association_data: RegionAssociation):
+    if association_data.id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.id} is not a valid brain region id")
+    elif association_data.new_region_id not in runtime_data.genome["brain_regions"]:
+        raise HTTPException(status_code=400, detail=f"{association_data.new_region_id} is not a valid brain region  id")
+    else:
+        change_brain_region_parent(region_id=association_data.id,
+                                   new_parent_id=association_data.new_region_id)
+
+
+@router.put("/relocate_members")
+async def brain_region_member_relocation(relocation_data: dict):
+    """
+    Accepts a dictionary of 2D coordinates of one or more cortical areas and update them in genome.
+
+    Input format:
+
+    {
+        "region_id_1": {
+            "coordinate_2d": [10, 9],
+            "parent_region_id": "fhafsihwfiuhr23r_b",
+        },
+        "region_id_2": {
+            "coordinate_2d": [4, 93],
+            "parent_region_id": "dhdfsihwfiuhr23r_b",
+        },
+        "cortical_area_id": {
+            "coordinate_2d": [30, 29],
+            "parent_region_id": "gdfsihwfiuhr23r_b",
+        }
+    }
+    """
+    relocate_region_members(relocation_data=relocation_data)
diff --git a/src/api/routers/v1/simulation.py b/src/api/routers/v1/simulation.py
index 87a738dc1..5ebb70613 100644
--- a/src/api/routers/v1/simulation.py
+++ b/src/api/routers/v1/simulation.py
@@ -1,3 +1,17 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
 
 from fastapi import APIRouter
 
diff --git a/src/api/routers/v1/system.py b/src/api/routers/v1/system.py
index 21e790f98..e4da03a62 100644
--- a/src/api/routers/v1/system.py
+++ b/src/api/routers/v1/system.py
@@ -1,3 +1,18 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
 import os
 from fastapi import APIRouter, HTTPException
 
@@ -5,6 +20,7 @@
 from ...schemas import *
 
 from src.version import __version__
+from src.evo.templates import cortical_types
 
 
 router = APIRouter()
@@ -13,6 +29,21 @@
 # ######   System Endpoints #########
 # ###################################
 
+@router.get("/user_preferences")
+async def get_user_preferences():
+    return {
+        "bv_advanced_mode": runtime_data.bv_advanced_mode,
+        "ui_magnification": runtime_data.ui_magnification,
+        "auto_pns_area_creation": runtime_data.auto_pns_area_creation
+        }
+
+
+@router.put("/user_preferences")
+async def update_user_preferences(payload: UserPreferences):
+    runtime_data.bv_advanced_mode = payload.adv_mode
+    runtime_data.ui_magnification = payload.ui_magnification
+
+
 def human_readable_version(version):
     print(version)
     time_portion = str(version)[-10:]
@@ -49,18 +80,26 @@ def get_versions():
 async def feagi_health_check():
     health = dict()
     health["burst_engine"] = not runtime_data.exit_condition
+
+    health["connected_agents"] = runtime_data.connected_agents
+
     if runtime_data.influxdb:
         health["influxdb_availability"] = True
     else:
         health["influxdb_availability"] = False
-    health["neuron_count_max"] = runtime_data.parameters["Limits"]["max_neuron_count"]
-    health["synapse_count_max"] = runtime_data.parameters["Limits"]["max_synapse_count"]
+
+    health["neuron_count_max"] = int(runtime_data.parameters["Limits"]["max_neuron_count"])
+    health["synapse_count_max"] = int(runtime_data.parameters["Limits"]["max_synapse_count"])
+    health["latest_changes_saved_externally"] = runtime_data.changes_saved_externally
 
     if runtime_data.genome:
+        health["fitness"] = runtime_data.genome_fitness
         health["genome_availability"] = True
         connectome_neuron_count = runtime_data.brain_stats["neuron_count"]
         connectome_synapse_count = runtime_data.brain_stats["synapse_count"]
         connectome_size = 3E-08 * connectome_neuron_count ** 2 + 0.0011 * connectome_neuron_count + 2.9073
+
+        health["cortical_area_count"] = len(runtime_data.cortical_list)
         health["neuron_count"] = connectome_neuron_count
         health["synapse_count"] = connectome_synapse_count
         health["estimated_brain_size_in_MB"] = connectome_size
@@ -92,10 +131,14 @@ async def unique_log_entries():
 async def feagi_registration(message: Registration):
     message = message.dict()
     source = message['source']
-
     host = message['host']
     capabilities = message['capabilities']
+
+    # todo: This endpoint is currently not performing any task
+
+    print("Warning! This endpoint is not doing anything at this time!")
     print("########## ###### >>>>>> >>>> ", source, host, capabilities)
+    return "Warning! This endpoint is not doing anything at this time!"
 
 
 @router.post("/logs")
@@ -148,3 +191,42 @@ async def change_circuit_library_path(circuit_library_path: str):
         print(f"{circuit_library_path} is the new circuit library path.")
     else:
         raise HTTPException(status_code=400, detail=f"{circuit_library_path} is not a valid path.")
+
+
+@router.get("/cortical_area_types")
+async def fetch_cortical_area_types():
+    return cortical_types
+
+
+@router.put("/cortical_area_types")
+async def update_cortical_area_types(cortical_id: str):
+    # todo
+    return "Endpoint pending implementation"
+
+
+@router.get("/cortical_area_visualization_skip_rate")
+async def update_cortical_area_visualization_skip_rate():
+    return runtime_data.cortical_viz_skip_rate
+
+
+@router.get("/cortical_area_visualization_suppression_threshold")
+async def update_cortical_area_visualization_suppression_threshold():
+    return runtime_data.cortical_viz_sup_threshold
+
+
+@router.put("/cortical_area_visualization_skip_rate")
+async def update_cortical_area_visualization_skip_rate(cortical_viz_skip_rate: VizSkipRate):
+    """Set cortical area visualization skip rate. This value defines the number of skips between each instance of
+    neuron firing visualization"""
+    if cortical_viz_skip_rate.cortical_viz_skip_rate < 0:
+        raise HTTPException(status_code=400, detail=f"Visualization skip rate cannot be negative")
+    runtime_data.cortical_viz_skip_rate = cortical_viz_skip_rate.cortical_viz_skip_rate
+
+
+@router.put("/cortical_area_visualization_suppression_threshold")
+async def update_cortical_area_visualization_suppression_threshold(visualization_threshold: VizThreshold):
+    """Controls the level of voxel activity per cortical area where if exceeded will enforce visualization frequency
+    control to kick in."""
+    if visualization_threshold.visualization_threshold < 0:
+        raise HTTPException(status_code=400, detail=f"Suppression threshold cannot be negative.")
+    runtime_data.cortical_viz_sup_threshold = visualization_threshold.visualization_threshold
diff --git a/src/api/routers/v1/training.py b/src/api/routers/v1/training.py
index c33346e60..ef4e6fba8 100644
--- a/src/api/routers/v1/training.py
+++ b/src/api/routers/v1/training.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 from fastapi import APIRouter, HTTPException
 
 from ...schemas import *
@@ -12,13 +28,13 @@
 # ######  Training Endpoints #######
 # ##################################
 
-@router.delete("/reset_game_stats")
-async def delete_game_stats_from_db():
+@router.delete("/reset_fitness_stats")
+async def delete_fitness_stats_from_db():
     """
-    Erases the game statistics from the database.
+    Erases the fitness statistics from the database.
     """
 
-    runtime_data.influxdb.drop_game_activity()
+    runtime_data.influxdb.drop_fitness_activity()
 
 
 @router.get("/shock/options")
@@ -94,17 +110,17 @@ async def training_report():
     return runtime_data.training_stats
 
 
-@router.get("/game_stats")
-async def fetch_game_stats():
+@router.get("/fitness_stats")
+async def fetch_fitness_stats():
     """
-    updates game stats
+    updates fitness stats
     """
-    return runtime_data.game_stats
+    return runtime_data.fitness_stats
 
 
-@router.put("/game_stats")
-async def capture_game_stats(game_stats: GameStats):
+@router.put("/fitness_stats")
+async def capture_fitness_stats(fitness_stats: FitnessStats):
     """
-    updates game stats
+    updates fitness stats
     """
-    runtime_data.training_stats = game_stats
+    runtime_data.training_stats = fitness_stats
diff --git a/src/api/schemas.py b/src/api/schemas.py
index 539243e65..7d7f932be 100644
--- a/src/api/schemas.py
+++ b/src/api/schemas.py
@@ -1,6 +1,8 @@
+from enum import Enum
 from typing import Optional, Literal, List
-from pydantic import BaseModel, Field, conint
+from pydantic import BaseModel, Field, conint, conlist, validator
 from fastapi.staticfiles import StaticFiles
+from src.inf import runtime_data
 
 
 class Launch(BaseModel):
@@ -30,11 +32,36 @@ class NewCorticalProperties(BaseModel):
     cortical_id: str
     coordinates_2d: list
     coordinates_3d: list
-    channel_count: Optional[int]
+    dev_count: Optional[int] = 1
+
+
+class NewRegionProperties(BaseModel):
+    title: str
+    region_description: Optional[str]
+    parent_region_id: str = Field(default="root")
+    coordinates_2d: List[int] = Field(default=[0, 0])
+    coordinates_3d: List[int] = Field(default=[0, 0, 0])
+    areas: Optional[list] = Field(default=[])
+    regions: Optional[list] = Field(default=[])
+
+
+class UpdateRegionProperties(BaseModel):
+    region_id: str
+    title: Optional[str]
+    region_description: Optional[str]
+    parent_region_id: Optional[str]
+    coordinates_2d: Optional[list]
+    coordinates_3d: Optional[list]
+
+
+class RegionAssociation(BaseModel):
+    id: str = Field(default="")
+    new_region_id: str = Field(default="")
 
 
 class NewCustomCorticalProperties(BaseModel):
     cortical_name: str = Field(..., max_length=20, min_length=1)
+    parent_region_id: Optional[str] = Field(default="root")
     coordinates_2d: Optional[list] = [0, 0]
     coordinates_3d: List[int] = Field(default=[0, 0, 0])
     cortical_dimensions: List[int] = Field(default=[1, 1, 1])
@@ -75,31 +102,74 @@ class NewCustomCorticalProperties(BaseModel):
 
 class UpdateCorticalProperties(BaseModel):
     cortical_id: str = Field(None, max_length=6, min_length=6)
-    cortical_name: Optional[str]
-    cortical_neuron_per_vox_count: Optional[int]
-    cortical_visibility: Optional[bool]
-    cortical_coordinates: Optional[list]
-    cortical_coordinates_2d: Optional[list]
-    cortical_dimensions: Optional[list]
-    cortical_synaptic_attractivity: Optional[int]
-    neuron_post_synaptic_potential: Optional[float]
-    neuron_post_synaptic_potential_max: Optional[float]
-    neuron_fire_threshold: Optional[float]
-    neuron_fire_threshold_increment: Optional[list]
-    neuron_firing_threshold_limit: Optional[float]
-    neuron_refractory_period: Optional[int]
-    neuron_leak_coefficient: Optional[float]
-    neuron_leak_variability: Optional[float]
-    neuron_consecutive_fire_count: Optional[int]
-    neuron_snooze_period: Optional[int]
-    neuron_degeneracy_coefficient: Optional[float]
-    neuron_psp_uniform_distribution: Optional[bool]
-    neuron_mp_charge_accumulation: Optional[bool]
-    neuron_mp_driven_psp: Optional[bool]
-    neuron_longterm_mem_threshold: Optional[int]
-    neuron_lifespan_growth_rate: Optional[int]
-    neuron_init_lifespan: Optional[int]
-    neuron_excitability: Optional[int]
+    cortical_name: Optional[str] = None
+    parent_region_id: Optional[str] = None
+    cortical_neuron_per_vox_count: Optional[int] = None
+    cortical_visibility: Optional[bool] = None
+    coordinates_2d: Optional[conlist(int, min_items=2, max_items=2)] = None
+    coordinates_3d: Optional[conlist(int, min_items=3, max_items=3)] = None
+    cortical_dimensions: Optional[conlist(int, min_items=3, max_items=3)] = None
+    cortical_dimensions_per_dev: Optional[conlist(int, min_items=3, max_items=3)] = None
+    cortical_synaptic_attractivity: Optional[float] = None
+    neuron_post_synaptic_potential: Optional[float] = None
+    neuron_post_synaptic_potential_max: Optional[float] = None
+    neuron_fire_threshold: Optional[float] = None
+    neuron_fire_threshold_increment: Optional[list] = None
+    neuron_firing_threshold_limit: Optional[float] = None
+    neuron_refractory_period: Optional[int] = None
+    neuron_leak_coefficient: Optional[float] = None
+    neuron_leak_variability: Optional[float] = None
+    neuron_consecutive_fire_count: Optional[int] = None
+    neuron_snooze_period: Optional[int] = None
+    neuron_degeneracy_coefficient: Optional[float] = None
+    neuron_psp_uniform_distribution: Optional[bool] = None
+    neuron_mp_charge_accumulation: Optional[bool] = None
+    neuron_mp_driven_psp: Optional[bool] = None
+    neuron_longterm_mem_threshold: Optional[int] = None
+    neuron_lifespan_growth_rate: Optional[int] = None
+    neuron_init_lifespan: Optional[int] = None
+    neuron_excitability: Optional[float] = None
+    dev_count: Optional[int] = None
+    cortical_dimensions_per_device: Optional[conlist(int, min_items=3, max_items=3)] = None
+
+    @validator('cortical_dimensions', 'cortical_dimensions_per_dev', each_item=True)
+    def check_positive(cls, value):
+        if value is not None and value <= 0:
+            raise ValueError('All coordinates must be positive integers greater than 0')
+        return value
+
+
+class UpdateMultipleCorticalProperties(BaseModel):
+    cortical_id_list: list
+    parent_region_id: Optional[str] = None
+    cortical_neuron_per_vox_count: Optional[int] = None
+    cortical_visibility: Optional[bool] = None
+    cortical_dimensions: Optional[conlist(int, min_items=3, max_items=3)] = None
+    cortical_synaptic_attractivity: Optional[float] = None
+    neuron_post_synaptic_potential: Optional[float] = None
+    neuron_post_synaptic_potential_max: Optional[float] = None
+    neuron_fire_threshold: Optional[float] = None
+    neuron_fire_threshold_increment: Optional[list] = None
+    neuron_firing_threshold_limit: Optional[float] = None
+    neuron_refractory_period: Optional[int] = None
+    neuron_leak_coefficient: Optional[float] = None
+    neuron_leak_variability: Optional[float] = None
+    neuron_consecutive_fire_count: Optional[int] = None
+    neuron_snooze_period: Optional[int] = None
+    neuron_degeneracy_coefficient: Optional[float] = None
+    neuron_psp_uniform_distribution: Optional[bool] = None
+    neuron_mp_charge_accumulation: Optional[bool] = None
+    neuron_mp_driven_psp: Optional[bool] = None
+    neuron_longterm_mem_threshold: Optional[int] = None
+    neuron_lifespan_growth_rate: Optional[int] = None
+    neuron_init_lifespan: Optional[int] = None
+    neuron_excitability: Optional[float] = None
+
+    @validator('cortical_dimensions', each_item=True)
+    def check_positive(cls, value):
+        if value is not None and value <= 0:
+            raise ValueError('All coordinates must be positive integers greater than 0')
+        return value
 
 # class Network(BaseModel):
 #     godot_host: Optional[str] = runtime_data.parameters['Sockets']['godot_host_name']
@@ -114,6 +184,10 @@ class CorticalId(BaseModel):
     cortical_id: str
 
 
+class CorticalIdList(BaseModel):
+    cortical_id_list: list
+
+
 class CorticalName(BaseModel):
     cortical_name: str
 
@@ -122,6 +196,14 @@ class MorphologyName(BaseModel):
     morphology_name: str
 
 
+class VizSkipRate(BaseModel):
+    cortical_viz_skip_rate: int = runtime_data.cortical_viz_skip_rate
+
+
+class VizThreshold(BaseModel):
+    visualization_threshold: int = runtime_data.cortical_viz_sup_threshold
+
+
 class MorphologyInput(BaseModel):
     morphology_name: str
     morphology_type: str
@@ -134,6 +216,12 @@ class UpdateCorticalMappingProperties(BaseModel):
     mapping_string: list
 
 
+class SuggestedMapping(BaseModel):
+    brain_region_id: str
+    mapping_type: str
+    mapping_definitions: list = [{}]
+
+
 class CorticalAreaSrcDst(BaseModel):
     src_cortical_area: str
     dst_cortical_area: str
@@ -153,6 +241,15 @@ class Registration(BaseModel):
     capabilities: dict
 
 
+class AgentRegistration(BaseModel):
+    agent_type: str
+    agent_id: str
+    agent_data_port: int
+    agent_version: str
+    controller_version: str
+    capabilities: dict = None
+
+
 class Stats(BaseModel):
     neuron_stat_collection: Optional[bool] = False
     synapse_stat_collection: Optional[bool] = False
@@ -184,8 +281,12 @@ class Subscriber(BaseModel):
     subscriber_address: str
 
 
-class GameStats(BaseModel):
-    game_stats: dict
+class Id(BaseModel):
+    id: str
+
+
+class FitnessStats(BaseModel):
+    fitness_stats: dict
 
 
 class RobotController(BaseModel):
@@ -234,3 +335,14 @@ class AmalgamationRequest(BaseModel):
     genome_id: Optional[str] = None
     genome_title: Optional[str] = None
     genome_payload: Optional[dict] = None
+
+
+class RewiringMode(str, Enum):
+    rewire_all = "all"
+    rewire_system = "system"
+    rewire_none = "none"
+
+
+class UserPreferences(BaseModel):
+    adv_mode: bool
+    ui_magnification: float = 1.0
diff --git a/src/evo/autopilot/brains/static_genome_1.json b/src/evo/autopilot/brains/static_genome_1.json
index ce72ddd39..fe33e1ef6 100644
--- a/src/evo/autopilot/brains/static_genome_1.json
+++ b/src/evo/autopilot/brains/static_genome_1.json
@@ -86,7 +86,7 @@
         "_____10c-i__inf-nx-___bbx-i": 3,
         "_____10c-i__inf-nx-___bby-i": 1,
         "_____10c-i__inf-nx-___bbz-i": 1,
-        "_____10c-i__inf-cx-synatt-i": 100,
+        "_____10c-i__inf-cx-synatt-f": 100,
         "_____10c-i__inf-cx-pstcr_-f": 5,
         "_____10c-i__inf-cx-pstcrm-f": 35,
         "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -110,7 +110,7 @@
         "_____10c-ishock-nx-___bbx-i": 1,
         "_____10c-ishock-nx-___bby-i": 1,
         "_____10c-ishock-nx-___bbz-i": 10,
-        "_____10c-ishock-cx-synatt-i": 100,
+        "_____10c-ishock-cx-synatt-f": 100,
         "_____10c-ishock-cx-pstcr_-f": 5,
         "_____10c-ishock-cx-pstcrm-f": 35,
         "_____10c-ishock-cx-plst_c-f": 0.05,
@@ -134,7 +134,7 @@
         "_____10c-ii_inf-nx-___bbx-i": 3,
         "_____10c-ii_inf-nx-___bby-i": 1,
         "_____10c-ii_inf-nx-___bbz-i": 1,
-        "_____10c-ii_inf-cx-synatt-i": 100,
+        "_____10c-ii_inf-cx-synatt-f": 100,
         "_____10c-ii_inf-cx-pstcr_-f": 5,
         "_____10c-ii_inf-cx-pstcrm-f": 35,
         "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -159,7 +159,7 @@
         "_____10c-i__pro-nx-___bbx-i": 1,
         "_____10c-i__pro-nx-___bby-i": 1,
         "_____10c-i__pro-nx-___bbz-i": 10,
-        "_____10c-i__pro-cx-synatt-i": 100,
+        "_____10c-i__pro-cx-synatt-f": 100,
         "_____10c-i__pro-cx-pstcr_-f": 5,
         "_____10c-i__pro-cx-pstcrm-f": 35,
         "_____10c-i__pro-cx-plst_c-f": 0.05,
@@ -183,7 +183,7 @@
         "_____10c-t__pro-nx-___bbx-i": 1,
         "_____10c-t__pro-nx-___bby-i": 1,
         "_____10c-t__pro-nx-___bbz-i": 10,
-        "_____10c-t__pro-cx-synatt-i": 20,
+        "_____10c-t__pro-cx-synatt-f": 20,
         "_____10c-t__pro-cx-pstcr_-f": 5,
         "_____10c-t__pro-cx-pstcrm-f": 35,
         "_____10c-t__pro-cx-plst_c-f": 0.05,
@@ -208,7 +208,7 @@
         "_____10c-i__bat-nx-___bbx-i": 1,
         "_____10c-i__bat-nx-___bby-i": 1,
         "_____10c-i__bat-nx-___bbz-i": 10,
-        "_____10c-i__bat-cx-synatt-i": 100,
+        "_____10c-i__bat-cx-synatt-f": 100,
         "_____10c-i__bat-cx-pstcr_-f": 5,
         "_____10c-i__bat-cx-pstcrm-f": 35,
         "_____10c-i__bat-cx-plst_c-f": 0.05,
@@ -230,7 +230,7 @@
         "_____10c-o__bat-nx-___bbx-i": 1,
         "_____10c-o__bat-nx-___bby-i": 1,
         "_____10c-o__bat-nx-___bbz-i": 10,
-        "_____10c-o__bat-cx-synatt-i": 100,
+        "_____10c-o__bat-cx-synatt-f": 100,
         "_____10c-o__bat-cx-pstcr_-f": 5,
         "_____10c-o__bat-cx-pstcrm-f": 35,
         "_____10c-o__bat-cx-plst_c-f": 0.05,
@@ -252,7 +252,7 @@
         "_____10c-o_init-nx-___bbx-i": 1,
         "_____10c-o_init-nx-___bby-i": 1,
         "_____10c-o_init-nx-___bbz-i": 1,
-        "_____10c-o_init-cx-synatt-i": 100,
+        "_____10c-o_init-cx-synatt-f": 100,
         "_____10c-o_init-cx-pstcr_-f": 5,
         "_____10c-o_init-cx-pstcrm-f": 35,
         "_____10c-o_init-cx-plst_c-f": 0.05,
@@ -274,7 +274,7 @@
         "_____10c-o__mot-nx-___bbx-i": 8,
         "_____10c-o__mot-nx-___bby-i": 1,
         "_____10c-o__mot-nx-___bbz-i": 10,
-        "_____10c-o__mot-cx-synatt-i": 100,
+        "_____10c-o__mot-cx-synatt-f": 100,
         "_____10c-o__mot-cx-pstcr_-f": 6,
         "_____10c-o__mot-cx-pstcrm-f": 35,
         "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -296,7 +296,7 @@
         "_____10c-o__ser-nx-___bbx-i": 4,
         "_____10c-o__ser-nx-___bby-i": 1,
         "_____10c-o__ser-nx-___bbz-i": 10,
-        "_____10c-o__ser-cx-synatt-i": 100,
+        "_____10c-o__ser-cx-synatt-f": 100,
         "_____10c-o__ser-cx-pstcr_-f": 3,
         "_____10c-o__ser-cx-pstcrm-f": 35,
         "_____10c-o__ser-cx-plst_c-f": 0.05,
diff --git a/src/evo/autopilot/brains/static_genome_2.json b/src/evo/autopilot/brains/static_genome_2.json
index 613b05030..030ff9f17 100644
--- a/src/evo/autopilot/brains/static_genome_2.json
+++ b/src/evo/autopilot/brains/static_genome_2.json
@@ -86,7 +86,7 @@
         "_____10c-i__inf-nx-___bbx-i": 3,
         "_____10c-i__inf-nx-___bby-i": 1,
         "_____10c-i__inf-nx-___bbz-i": 1,
-        "_____10c-i__inf-cx-synatt-i": 100,
+        "_____10c-i__inf-cx-synatt-f": 100,
         "_____10c-i__inf-cx-pstcr_-f": 5,
         "_____10c-i__inf-cx-pstcrm-f": 35,
         "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -110,7 +110,7 @@
         "_____10c-ishock-nx-___bbx-i": 1,
         "_____10c-ishock-nx-___bby-i": 1,
         "_____10c-ishock-nx-___bbz-i": 10,
-        "_____10c-ishock-cx-synatt-i": 100,
+        "_____10c-ishock-cx-synatt-f": 100,
         "_____10c-ishock-cx-pstcr_-f": 5,
         "_____10c-ishock-cx-pstcrm-f": 35,
         "_____10c-ishock-cx-plst_c-f": 0.05,
@@ -134,7 +134,7 @@
         "_____10c-ii_inf-nx-___bbx-i": 3,
         "_____10c-ii_inf-nx-___bby-i": 1,
         "_____10c-ii_inf-nx-___bbz-i": 1,
-        "_____10c-ii_inf-cx-synatt-i": 100,
+        "_____10c-ii_inf-cx-synatt-f": 100,
         "_____10c-ii_inf-cx-pstcr_-f": 5,
         "_____10c-ii_inf-cx-pstcrm-f": 35,
         "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -159,7 +159,7 @@
         "_____10c-i__pro-nx-___bbx-i": 1,
         "_____10c-i__pro-nx-___bby-i": 1,
         "_____10c-i__pro-nx-___bbz-i": 10,
-        "_____10c-i__pro-cx-synatt-i": 100,
+        "_____10c-i__pro-cx-synatt-f": 100,
         "_____10c-i__pro-cx-pstcr_-f": 5,
         "_____10c-i__pro-cx-pstcrm-f": 35,
         "_____10c-i__pro-cx-plst_c-f": 0.05,
@@ -183,7 +183,7 @@
         "_____10c-t__pro-nx-___bbx-i": 1,
         "_____10c-t__pro-nx-___bby-i": 1,
         "_____10c-t__pro-nx-___bbz-i": 10,
-        "_____10c-t__pro-cx-synatt-i": 20,
+        "_____10c-t__pro-cx-synatt-f": 20,
         "_____10c-t__pro-cx-pstcr_-f": 5,
         "_____10c-t__pro-cx-pstcrm-f": 35,
         "_____10c-t__pro-cx-plst_c-f": 0.05,
@@ -208,7 +208,7 @@
         "_____10c-i__bat-nx-___bbx-i": 1,
         "_____10c-i__bat-nx-___bby-i": 1,
         "_____10c-i__bat-nx-___bbz-i": 10,
-        "_____10c-i__bat-cx-synatt-i": 100,
+        "_____10c-i__bat-cx-synatt-f": 100,
         "_____10c-i__bat-cx-pstcr_-f": 5,
         "_____10c-i__bat-cx-pstcrm-f": 35,
         "_____10c-i__bat-cx-plst_c-f": 0.05,
@@ -230,7 +230,7 @@
         "_____10c-o__bat-nx-___bbx-i": 1,
         "_____10c-o__bat-nx-___bby-i": 1,
         "_____10c-o__bat-nx-___bbz-i": 10,
-        "_____10c-o__bat-cx-synatt-i": 100,
+        "_____10c-o__bat-cx-synatt-f": 100,
         "_____10c-o__bat-cx-pstcr_-f": 5,
         "_____10c-o__bat-cx-pstcrm-f": 35,
         "_____10c-o__bat-cx-plst_c-f": 0.05,
@@ -252,7 +252,7 @@
         "_____10c-o_init-nx-___bbx-i": 1,
         "_____10c-o_init-nx-___bby-i": 1,
         "_____10c-o_init-nx-___bbz-i": 1,
-        "_____10c-o_init-cx-synatt-i": 100,
+        "_____10c-o_init-cx-synatt-f": 100,
         "_____10c-o_init-cx-pstcr_-f": 5,
         "_____10c-o_init-cx-pstcrm-f": 35,
         "_____10c-o_init-cx-plst_c-f": 0.05,
@@ -274,7 +274,7 @@
         "_____10c-o__mot-nx-___bbx-i": 8,
         "_____10c-o__mot-nx-___bby-i": 1,
         "_____10c-o__mot-nx-___bbz-i": 10,
-        "_____10c-o__mot-cx-synatt-i": 100,
+        "_____10c-o__mot-cx-synatt-f": 100,
         "_____10c-o__mot-cx-pstcr_-f": 6,
         "_____10c-o__mot-cx-pstcrm-f": 35,
         "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -296,7 +296,7 @@
         "_____10c-o__ser-nx-___bbx-i": 4,
         "_____10c-o__ser-nx-___bby-i": 1,
         "_____10c-o__ser-nx-___bbz-i": 10,
-        "_____10c-o__ser-cx-synatt-i": 100,
+        "_____10c-o__ser-cx-synatt-f": 100,
         "_____10c-o__ser-cx-pstcr_-f": 3,
         "_____10c-o__ser-cx-pstcrm-f": 35,
         "_____10c-o__ser-cx-plst_c-f": 0.05,
diff --git a/src/evo/circuits/brightness_change_detection.json b/src/evo/circuits/brightness_change_detection.json
index 22ed0a41a..5c7079c31 100644
--- a/src/evo/circuits/brightness_change_detection.json
+++ b/src/evo/circuits/brightness_change_detection.json
@@ -1293,7 +1293,7 @@
       "_____10c-i__inf-nx-___bbx-i": 3,
       "_____10c-i__inf-nx-___bby-i": 1,
       "_____10c-i__inf-nx-___bbz-i": 1,
-      "_____10c-i__inf-cx-synatt-i": 100,
+      "_____10c-i__inf-cx-synatt-f": 100,
       "_____10c-i__inf-cx-pstcr_-f": 80,
       "_____10c-i__inf-cx-pstcrm-f": 100,
       "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -1337,7 +1337,7 @@
       "_____10c-ii_inf-nx-___bbx-i": 3,
       "_____10c-ii_inf-nx-___bby-i": 1,
       "_____10c-ii_inf-nx-___bbz-i": 1,
-      "_____10c-ii_inf-cx-synatt-i": 100,
+      "_____10c-ii_inf-cx-synatt-f": 100,
       "_____10c-ii_inf-cx-pstcr_-f": 80,
       "_____10c-ii_inf-cx-pstcrm-f": 100,
       "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -1381,7 +1381,7 @@
       "_____10c-t__vis-nx-___bbx-i": 8,
       "_____10c-t__vis-nx-___bby-i": 1,
       "_____10c-t__vis-nx-___bbz-i": 1,
-      "_____10c-t__vis-cx-synatt-i": 100,
+      "_____10c-t__vis-cx-synatt-f": 100,
       "_____10c-t__vis-cx-pstcr_-f": 50,
       "_____10c-t__vis-cx-pstcrm-f": 100,
       "_____10c-t__vis-cx-plst_c-f": 0.05,
@@ -1498,7 +1498,7 @@
       "_____10c-is_inc-nx-___bbx-i": 4,
       "_____10c-is_inc-nx-___bby-i": 2,
       "_____10c-is_inc-nx-___bbz-i": 1,
-      "_____10c-is_inc-cx-synatt-i": 100,
+      "_____10c-is_inc-cx-synatt-f": 100,
       "_____10c-is_inc-cx-pstcr_-f": 50,
       "_____10c-is_inc-cx-pstcrm-f": 200,
       "_____10c-is_inc-cx-plst_c-f": 0.05,
@@ -1545,7 +1545,7 @@
       "_____10c-im_inc-nx-___bbx-i": 4,
       "_____10c-im_inc-nx-___bby-i": 2,
       "_____10c-im_inc-nx-___bbz-i": 1,
-      "_____10c-im_inc-cx-synatt-i": 100,
+      "_____10c-im_inc-cx-synatt-f": 100,
       "_____10c-im_inc-cx-pstcr_-f": 50,
       "_____10c-im_inc-cx-pstcrm-f": 200,
       "_____10c-im_inc-cx-plst_c-f": 0.05,
@@ -1592,7 +1592,7 @@
       "_____10c-il_inc-nx-___bbx-i": 4,
       "_____10c-il_inc-nx-___bby-i": 2,
       "_____10c-il_inc-nx-___bbz-i": 1,
-      "_____10c-il_inc-cx-synatt-i": 100,
+      "_____10c-il_inc-cx-synatt-f": 100,
       "_____10c-il_inc-cx-pstcr_-f": 50,
       "_____10c-il_inc-cx-pstcrm-f": 200,
       "_____10c-il_inc-cx-plst_c-f": 0.05,
@@ -1639,7 +1639,7 @@
       "_____10c-ds_inc-nx-___bbx-i": 3,
       "_____10c-ds_inc-nx-___bby-i": 1,
       "_____10c-ds_inc-nx-___bbz-i": 1,
-      "_____10c-ds_inc-cx-synatt-i": 100,
+      "_____10c-ds_inc-cx-synatt-f": 100,
       "_____10c-ds_inc-cx-pstcr_-f": 100,
       "_____10c-ds_inc-cx-pstcrm-f": 200,
       "_____10c-ds_inc-cx-plst_c-f": 0.05,
@@ -1660,7 +1660,7 @@
       "_____10c-dm_inc-nx-___bbx-i": 3,
       "_____10c-dm_inc-nx-___bby-i": 1,
       "_____10c-dm_inc-nx-___bbz-i": 1,
-      "_____10c-dm_inc-cx-synatt-i": 100,
+      "_____10c-dm_inc-cx-synatt-f": 100,
       "_____10c-dm_inc-cx-pstcr_-f": 100,
       "_____10c-dm_inc-cx-pstcrm-f": 200,
       "_____10c-dm_inc-cx-plst_c-f": 0.05,
@@ -1681,7 +1681,7 @@
       "_____10c-dl_inc-nx-___bbx-i": 1,
       "_____10c-dl_inc-nx-___bby-i": 1,
       "_____10c-dl_inc-nx-___bbz-i": 1,
-      "_____10c-dl_inc-cx-synatt-i": 100,
+      "_____10c-dl_inc-cx-synatt-f": 100,
       "_____10c-dl_inc-cx-pstcr_-f": 50,
       "_____10c-dl_inc-cx-pstcrm-f": 200,
       "_____10c-dl_inc-cx-plst_c-f": 0.05,
@@ -1716,7 +1716,7 @@
       "_____10c-is_dcr-nx-___bbx-i": 4,
       "_____10c-is_dcr-nx-___bby-i": 2,
       "_____10c-is_dcr-nx-___bbz-i": 1,
-      "_____10c-is_dcr-cx-synatt-i": 100,
+      "_____10c-is_dcr-cx-synatt-f": 100,
       "_____10c-is_dcr-cx-pstcr_-f": 50,
       "_____10c-is_dcr-cx-pstcrm-f": 200,
       "_____10c-is_dcr-cx-plst_c-f": 0.05,
@@ -1763,7 +1763,7 @@
       "_____10c-im_dcr-nx-___bbx-i": 4,
       "_____10c-im_dcr-nx-___bby-i": 2,
       "_____10c-im_dcr-nx-___bbz-i": 1,
-      "_____10c-im_dcr-cx-synatt-i": 100,
+      "_____10c-im_dcr-cx-synatt-f": 100,
       "_____10c-im_dcr-cx-pstcr_-f": 50,
       "_____10c-im_dcr-cx-pstcrm-f": 200,
       "_____10c-im_dcr-cx-plst_c-f": 0.05,
@@ -1810,7 +1810,7 @@
       "_____10c-il_dcr-nx-___bbx-i": 4,
       "_____10c-il_dcr-nx-___bby-i": 2,
       "_____10c-il_dcr-nx-___bbz-i": 1,
-      "_____10c-il_dcr-cx-synatt-i": 100,
+      "_____10c-il_dcr-cx-synatt-f": 100,
       "_____10c-il_dcr-cx-pstcr_-f": 50,
       "_____10c-il_dcr-cx-pstcrm-f": 200,
       "_____10c-il_dcr-cx-plst_c-f": 0.05,
@@ -1857,7 +1857,7 @@
       "_____10c-ds_dcr-nx-___bbx-i": 3,
       "_____10c-ds_dcr-nx-___bby-i": 1,
       "_____10c-ds_dcr-nx-___bbz-i": 1,
-      "_____10c-ds_dcr-cx-synatt-i": 100,
+      "_____10c-ds_dcr-cx-synatt-f": 100,
       "_____10c-ds_dcr-cx-pstcr_-f": 100,
       "_____10c-ds_dcr-cx-pstcrm-f": 200,
       "_____10c-ds_dcr-cx-plst_c-f": 0.05,
@@ -1878,7 +1878,7 @@
       "_____10c-dm_dcr-nx-___bbx-i": 3,
       "_____10c-dm_dcr-nx-___bby-i": 1,
       "_____10c-dm_dcr-nx-___bbz-i": 1,
-      "_____10c-dm_dcr-cx-synatt-i": 100,
+      "_____10c-dm_dcr-cx-synatt-f": 100,
       "_____10c-dm_dcr-cx-pstcr_-f": 100,
       "_____10c-dm_dcr-cx-pstcrm-f": 200,
       "_____10c-dm_dcr-cx-plst_c-f": 0.05,
@@ -1899,7 +1899,7 @@
       "_____10c-dl_dcr-nx-___bbx-i": 1,
       "_____10c-dl_dcr-nx-___bby-i": 1,
       "_____10c-dl_dcr-nx-___bbz-i": 1,
-      "_____10c-dl_dcr-cx-synatt-i": 100,
+      "_____10c-dl_dcr-cx-synatt-f": 100,
       "_____10c-dl_dcr-cx-pstcr_-f": 100,
       "_____10c-dl_dcr-cx-pstcrm-f": 200,
       "_____10c-dl_dcr-cx-plst_c-f": 0.05,
@@ -1921,7 +1921,7 @@
       "_____10c-_steer-nx-___bbx-i": 8,
       "_____10c-_steer-nx-___bby-i": 2,
       "_____10c-_steer-nx-___bbz-i": 1,
-      "_____10c-_steer-cx-synatt-i": 100,
+      "_____10c-_steer-cx-synatt-f": 100,
       "_____10c-_steer-cx-pstcr_-f": 90,
       "_____10c-_steer-cx-pstcrm-f": 100,
       "_____10c-_steer-cx-plst_c-f": 0.05,
@@ -1979,7 +1979,7 @@
       "_____10c-c___tb-nx-___bbx-i": 1,
       "_____10c-c___tb-nx-___bby-i": 1,
       "_____10c-c___tb-nx-___bbz-i": 1,
-      "_____10c-c___tb-cx-synatt-i": 100,
+      "_____10c-c___tb-cx-synatt-f": 100,
       "_____10c-c___tb-cx-pstcr_-f": 50,
       "_____10c-c___tb-cx-pstcrm-f": 100,
       "_____10c-c___tb-cx-plst_c-f": 0.05,
@@ -2014,7 +2014,7 @@
       "_____10c-c___ab-nx-___bbx-i": 1,
       "_____10c-c___ab-nx-___bby-i": 1,
       "_____10c-c___ab-nx-___bbz-i": 1,
-      "_____10c-c___ab-cx-synatt-i": 100,
+      "_____10c-c___ab-cx-synatt-f": 100,
       "_____10c-c___ab-cx-pstcr_-f": 50,
       "_____10c-c___ab-cx-pstcrm-f": 100,
       "_____10c-c___ab-cx-plst_c-f": 0.05,
@@ -2049,7 +2049,7 @@
       "_____10c-_right-nx-___bbx-i": 1,
       "_____10c-_right-nx-___bby-i": 1,
       "_____10c-_right-nx-___bbz-i": 1,
-      "_____10c-_right-cx-synatt-i": 100,
+      "_____10c-_right-cx-synatt-f": 100,
       "_____10c-_right-cx-pstcr_-f": 100,
       "_____10c-_right-cx-pstcrm-f": 200,
       "_____10c-_right-cx-plst_c-f": 0.05,
@@ -2083,7 +2083,7 @@
       "_____10c-__left-nx-___bbx-i": 1,
       "_____10c-__left-nx-___bby-i": 1,
       "_____10c-__left-nx-___bbz-i": 1,
-      "_____10c-__left-cx-synatt-i": 100,
+      "_____10c-__left-cx-synatt-f": 100,
       "_____10c-__left-cx-pstcr_-f": 100,
       "_____10c-__left-cx-pstcrm-f": 200,
       "_____10c-__left-cx-plst_c-f": 0.05,
@@ -2117,7 +2117,7 @@
       "_____10c-__forw-nx-___bbx-i": 1,
       "_____10c-__forw-nx-___bby-i": 1,
       "_____10c-__forw-nx-___bbz-i": 1,
-      "_____10c-__forw-cx-synatt-i": 100,
+      "_____10c-__forw-cx-synatt-f": 100,
       "_____10c-__forw-cx-pstcr_-f": 100,
       "_____10c-__forw-cx-pstcrm-f": 200,
       "_____10c-__forw-cx-plst_c-f": 0.05,
@@ -2151,7 +2151,7 @@
       "_____10c-__back-nx-___bbx-i": 3,
       "_____10c-__back-nx-___bby-i": 1,
       "_____10c-__back-nx-___bbz-i": 1,
-      "_____10c-__back-cx-synatt-i": 100,
+      "_____10c-__back-cx-synatt-f": 100,
       "_____10c-__back-cx-pstcr_-f": 100,
       "_____10c-__back-cx-pstcrm-f": 200,
       "_____10c-__back-cx-plst_c-f": 0.05,
@@ -2198,7 +2198,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 6,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
diff --git a/src/evo/circuits/motor_pathway_m1.json b/src/evo/circuits/motor_pathway_m1.json
index 84e9f8060..aad9c0caf 100644
--- a/src/evo/circuits/motor_pathway_m1.json
+++ b/src/evo/circuits/motor_pathway_m1.json
@@ -1497,7 +1497,7 @@
    "blueprint": {
       "_____10c-___pwr-cx-subgrp-t": "",
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.01,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35,
@@ -1521,7 +1521,7 @@
       "_____10c-___pwr-nx-ftincx-f": 0,
       "_____10c-___pwr-nx-ftincy-f": 0,
       "_____10c-___pwr-nx-ftincz-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
+      "_____10c-___pwr-nx-fthlim-f": 0,
       "_____10c-___pwr-nx-mp_acc-b": true,
       "_____10c-___pwr-nx-mp_psp-b": false,
       "_____10c-___pwr-cx-memory-b": false,
@@ -1532,7 +1532,7 @@
       "_____10c-___pwr-cx-_group-t": "CORE",
       "_____10c-o__mot-cx-subgrp-t": "",
       "_____10c-o__mot-cx-_n_cnt-i": 1,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-de_gen-f": 0,
       "_____10c-o__mot-cx-pspuni-b": false,
       "_____10c-o__mot-nx-pstcrm-f": 35,
@@ -1556,7 +1556,7 @@
       "_____10c-o__mot-nx-ftincx-f": 0,
       "_____10c-o__mot-nx-ftincy-f": 0,
       "_____10c-o__mot-nx-ftincz-f": 0,
-      "_____10c-o__mot-nx-fthlim-i": 0,
+      "_____10c-o__mot-nx-fthlim-f": 0,
       "_____10c-o__mot-nx-mp_acc-b": false,
       "_____10c-o__mot-nx-mp_psp-b": false,
       "_____10c-o__mot-cx-memory-b": false,
@@ -1567,7 +1567,7 @@
       "_____10c-o__mot-cx-_group-t": "OPU",
       "_____10c-m__lef-cx-subgrp-t": "",
       "_____10c-m__lef-cx-_n_cnt-i": 1,
-      "_____10c-m__lef-cx-synatt-i": 100,
+      "_____10c-m__lef-cx-synatt-f": 100,
       "_____10c-m__lef-cx-de_gen-f": 0,
       "_____10c-m__lef-cx-pspuni-b": true,
       "_____10c-m__lef-nx-pstcrm-f": 35,
@@ -1591,7 +1591,7 @@
       "_____10c-m__lef-nx-ftincx-f": 0,
       "_____10c-m__lef-nx-ftincy-f": 0,
       "_____10c-m__lef-nx-ftincz-f": 0,
-      "_____10c-m__lef-nx-fthlim-i": 0,
+      "_____10c-m__lef-nx-fthlim-f": 0,
       "_____10c-m__lef-nx-mp_acc-b": true,
       "_____10c-m__lef-nx-mp_psp-b": false,
       "_____10c-m__lef-cx-memory-b": false,
@@ -1602,7 +1602,7 @@
       "_____10c-m__lef-cx-_group-t": "CUSTOM",
       "_____10c-m__rig-cx-subgrp-t": "",
       "_____10c-m__rig-cx-_n_cnt-i": 1,
-      "_____10c-m__rig-cx-synatt-i": 100,
+      "_____10c-m__rig-cx-synatt-f": 100,
       "_____10c-m__rig-cx-de_gen-f": 0,
       "_____10c-m__rig-cx-pspuni-b": true,
       "_____10c-m__rig-nx-pstcrm-f": 35,
@@ -1626,7 +1626,7 @@
       "_____10c-m__rig-nx-ftincx-f": 0,
       "_____10c-m__rig-nx-ftincy-f": 0,
       "_____10c-m__rig-nx-ftincz-f": 0,
-      "_____10c-m__rig-nx-fthlim-i": 0,
+      "_____10c-m__rig-nx-fthlim-f": 0,
       "_____10c-m__rig-nx-mp_acc-b": true,
       "_____10c-m__rig-nx-mp_psp-b": false,
       "_____10c-m__rig-cx-memory-b": false,
@@ -1637,7 +1637,7 @@
       "_____10c-m__rig-cx-_group-t": "CUSTOM",
       "_____10c-m__for-cx-subgrp-t": "",
       "_____10c-m__for-cx-_n_cnt-i": 1,
-      "_____10c-m__for-cx-synatt-i": 100,
+      "_____10c-m__for-cx-synatt-f": 100,
       "_____10c-m__for-cx-de_gen-f": 0,
       "_____10c-m__for-cx-pspuni-b": true,
       "_____10c-m__for-nx-pstcrm-f": 35,
@@ -1722,7 +1722,7 @@
       "_____10c-m__for-nx-ftincx-f": 0,
       "_____10c-m__for-nx-ftincy-f": 0,
       "_____10c-m__for-nx-ftincz-f": 0,
-      "_____10c-m__for-nx-fthlim-i": 0,
+      "_____10c-m__for-nx-fthlim-f": 0,
       "_____10c-m__for-nx-mp_acc-b": true,
       "_____10c-m__for-nx-mp_psp-b": false,
       "_____10c-m__for-cx-memory-b": false,
@@ -1733,7 +1733,7 @@
       "_____10c-m__for-cx-_group-t": "CUSTOM",
       "_____10c-m__bac-cx-subgrp-t": "",
       "_____10c-m__bac-cx-_n_cnt-i": 1,
-      "_____10c-m__bac-cx-synatt-i": 100,
+      "_____10c-m__bac-cx-synatt-f": 100,
       "_____10c-m__bac-cx-de_gen-f": 0,
       "_____10c-m__bac-cx-pspuni-b": true,
       "_____10c-m__bac-nx-pstcrm-f": 35,
@@ -1818,7 +1818,7 @@
       "_____10c-m__bac-nx-ftincx-f": 0,
       "_____10c-m__bac-nx-ftincy-f": 0,
       "_____10c-m__bac-nx-ftincz-f": 0,
-      "_____10c-m__bac-nx-fthlim-i": 0,
+      "_____10c-m__bac-nx-fthlim-f": 0,
       "_____10c-m__bac-nx-mp_acc-b": true,
       "_____10c-m__bac-nx-mp_psp-b": false,
       "_____10c-m__bac-cx-memory-b": false,
@@ -1829,7 +1829,7 @@
       "_____10c-m__bac-cx-_group-t": "CUSTOM",
       "_____10c-CRSMot-cx-subgrp-t": "",
       "_____10c-CRSMot-cx-_n_cnt-i": 1,
-      "_____10c-CRSMot-cx-synatt-i": 100,
+      "_____10c-CRSMot-cx-synatt-f": 100,
       "_____10c-CRSMot-cx-de_gen-f": 0,
       "_____10c-CRSMot-cx-pspuni-b": false,
       "_____10c-CRSMot-nx-pstcrm-f": 99999,
@@ -1869,7 +1869,7 @@
       "_____10c-CRSMot-nx-ftincx-f": 0,
       "_____10c-CRSMot-nx-ftincy-f": 0,
       "_____10c-CRSMot-nx-ftincz-f": 0,
-      "_____10c-CRSMot-nx-fthlim-i": 0,
+      "_____10c-CRSMot-nx-fthlim-f": 0,
       "_____10c-CRSMot-nx-mp_acc-b": false,
       "_____10c-CRSMot-nx-mp_psp-b": false,
       "_____10c-CRSMot-cx-memory-b": false,
@@ -1880,7 +1880,7 @@
       "_____10c-CRSMot-cx-_group-t": "CUSTOM",
       "_____10c-CIHMot-cx-subgrp-t": "",
       "_____10c-CIHMot-cx-_n_cnt-i": 1,
-      "_____10c-CIHMot-cx-synatt-i": 100,
+      "_____10c-CIHMot-cx-synatt-f": 100,
       "_____10c-CIHMot-cx-de_gen-f": 0,
       "_____10c-CIHMot-cx-pspuni-b": false,
       "_____10c-CIHMot-nx-pstcrm-f": 99999,
@@ -1920,7 +1920,7 @@
       "_____10c-CIHMot-nx-ftincx-f": 0,
       "_____10c-CIHMot-nx-ftincy-f": 0,
       "_____10c-CIHMot-nx-ftincz-f": 0,
-      "_____10c-CIHMot-nx-fthlim-i": 0,
+      "_____10c-CIHMot-nx-fthlim-f": 0,
       "_____10c-CIHMot-nx-mp_acc-b": false,
       "_____10c-CIHMot-nx-mp_psp-b": false,
       "_____10c-CIHMot-cx-memory-b": false,
@@ -1931,7 +1931,7 @@
       "_____10c-CIHMot-cx-_group-t": "CUSTOM",
       "_____10c-CKQM2_-cx-subgrp-t": "",
       "_____10c-CKQM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKQM2_-cx-synatt-i": 100,
+      "_____10c-CKQM2_-cx-synatt-f": 100,
       "_____10c-CKQM2_-cx-de_gen-f": 0,
       "_____10c-CKQM2_-cx-pspuni-b": false,
       "_____10c-CKQM2_-nx-pstcrm-f": 99999,
@@ -1971,7 +1971,7 @@
       "_____10c-CKQM2_-nx-ftincx-f": 0,
       "_____10c-CKQM2_-nx-ftincy-f": 0,
       "_____10c-CKQM2_-nx-ftincz-f": 0,
-      "_____10c-CKQM2_-nx-fthlim-i": 0,
+      "_____10c-CKQM2_-nx-fthlim-f": 0,
       "_____10c-CKQM2_-nx-mp_acc-b": false,
       "_____10c-CKQM2_-nx-mp_psp-b": false,
       "_____10c-CKQM2_-cx-memory-b": false,
@@ -1982,7 +1982,7 @@
       "_____10c-CKQM2_-cx-_group-t": "CUSTOM",
       "_____10c-CKYM2_-cx-subgrp-t": "",
       "_____10c-CKYM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKYM2_-cx-synatt-i": 100,
+      "_____10c-CKYM2_-cx-synatt-f": 100,
       "_____10c-CKYM2_-cx-de_gen-f": 0,
       "_____10c-CKYM2_-cx-pspuni-b": false,
       "_____10c-CKYM2_-nx-pstcrm-f": 99999,
@@ -2022,7 +2022,7 @@
       "_____10c-CKYM2_-nx-ftincx-f": 0,
       "_____10c-CKYM2_-nx-ftincy-f": 0,
       "_____10c-CKYM2_-nx-ftincz-f": 0,
-      "_____10c-CKYM2_-nx-fthlim-i": 0,
+      "_____10c-CKYM2_-nx-fthlim-f": 0,
       "_____10c-CKYM2_-nx-mp_acc-b": false,
       "_____10c-CKYM2_-nx-mp_psp-b": false,
       "_____10c-CKYM2_-cx-memory-b": false,
@@ -2033,7 +2033,7 @@
       "_____10c-CKYM2_-cx-_group-t": "CUSTOM",
       "_____10c-CO4M3_-cx-subgrp-t": "",
       "_____10c-CO4M3_-cx-_n_cnt-i": 1,
-      "_____10c-CO4M3_-cx-synatt-i": 100,
+      "_____10c-CO4M3_-cx-synatt-f": 100,
       "_____10c-CO4M3_-cx-de_gen-f": 0,
       "_____10c-CO4M3_-cx-pspuni-b": false,
       "_____10c-CO4M3_-nx-pstcrm-f": 99999,
@@ -2073,7 +2073,7 @@
       "_____10c-CO4M3_-nx-ftincx-f": 0,
       "_____10c-CO4M3_-nx-ftincy-f": 0,
       "_____10c-CO4M3_-nx-ftincz-f": 0,
-      "_____10c-CO4M3_-nx-fthlim-i": 0,
+      "_____10c-CO4M3_-nx-fthlim-f": 0,
       "_____10c-CO4M3_-nx-mp_acc-b": false,
       "_____10c-CO4M3_-nx-mp_psp-b": false,
       "_____10c-CO4M3_-cx-memory-b": false,
@@ -2084,7 +2084,7 @@
       "_____10c-CO4M3_-cx-_group-t": "CUSTOM",
       "_____10c-CJWM3_-cx-subgrp-t": "",
       "_____10c-CJWM3_-cx-_n_cnt-i": 1,
-      "_____10c-CJWM3_-cx-synatt-i": 100,
+      "_____10c-CJWM3_-cx-synatt-f": 100,
       "_____10c-CJWM3_-cx-de_gen-f": 0,
       "_____10c-CJWM3_-cx-pspuni-b": false,
       "_____10c-CJWM3_-nx-pstcrm-f": 99999,
@@ -2124,7 +2124,7 @@
       "_____10c-CJWM3_-nx-ftincx-f": 0,
       "_____10c-CJWM3_-nx-ftincy-f": 0,
       "_____10c-CJWM3_-nx-ftincz-f": 0,
-      "_____10c-CJWM3_-nx-fthlim-i": 0,
+      "_____10c-CJWM3_-nx-fthlim-f": 0,
       "_____10c-CJWM3_-nx-mp_acc-b": false,
       "_____10c-CJWM3_-nx-mp_psp-b": false,
       "_____10c-CJWM3_-cx-memory-b": false,
@@ -2135,7 +2135,7 @@
       "_____10c-CJWM3_-cx-_group-t": "CUSTOM",
       "_____10c-CTGM4_-cx-subgrp-t": "",
       "_____10c-CTGM4_-cx-_n_cnt-i": 1,
-      "_____10c-CTGM4_-cx-synatt-i": 100,
+      "_____10c-CTGM4_-cx-synatt-f": 100,
       "_____10c-CTGM4_-cx-de_gen-f": 0,
       "_____10c-CTGM4_-cx-pspuni-b": false,
       "_____10c-CTGM4_-nx-pstcrm-f": 99999,
@@ -2175,7 +2175,7 @@
       "_____10c-CTGM4_-nx-ftincx-f": 0,
       "_____10c-CTGM4_-nx-ftincy-f": 0,
       "_____10c-CTGM4_-nx-ftincz-f": 0,
-      "_____10c-CTGM4_-nx-fthlim-i": 0,
+      "_____10c-CTGM4_-nx-fthlim-f": 0,
       "_____10c-CTGM4_-nx-mp_acc-b": false,
       "_____10c-CTGM4_-nx-mp_psp-b": false,
       "_____10c-CTGM4_-cx-memory-b": false,
@@ -2186,7 +2186,7 @@
       "_____10c-CTGM4_-cx-_group-t": "CUSTOM",
       "_____10c-CLWM4_-cx-subgrp-t": "",
       "_____10c-CLWM4_-cx-_n_cnt-i": 1,
-      "_____10c-CLWM4_-cx-synatt-i": 100,
+      "_____10c-CLWM4_-cx-synatt-f": 100,
       "_____10c-CLWM4_-cx-de_gen-f": 0,
       "_____10c-CLWM4_-cx-pspuni-b": false,
       "_____10c-CLWM4_-nx-pstcrm-f": 99999,
@@ -2226,7 +2226,7 @@
       "_____10c-CLWM4_-nx-ftincx-f": 0,
       "_____10c-CLWM4_-nx-ftincy-f": 0,
       "_____10c-CLWM4_-nx-ftincz-f": 0,
-      "_____10c-CLWM4_-nx-fthlim-i": 0,
+      "_____10c-CLWM4_-nx-fthlim-f": 0,
       "_____10c-CLWM4_-nx-mp_acc-b": false,
       "_____10c-CLWM4_-nx-mp_psp-b": false,
       "_____10c-CLWM4_-cx-memory-b": false,
diff --git a/src/evo/circuits/visual_pathway_v1.json b/src/evo/circuits/visual_pathway_v1.json
index ea1dbfe83..4ef98c901 100644
--- a/src/evo/circuits/visual_pathway_v1.json
+++ b/src/evo/circuits/visual_pathway_v1.json
@@ -1497,7 +1497,7 @@
    "blueprint": {
       "_____10c-___pwr-cx-subgrp-t": "",
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.01,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35,
@@ -1521,7 +1521,7 @@
       "_____10c-___pwr-nx-ftincx-f": 0,
       "_____10c-___pwr-nx-ftincy-f": 0,
       "_____10c-___pwr-nx-ftincz-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
+      "_____10c-___pwr-nx-fthlim-f": 0,
       "_____10c-___pwr-nx-mp_acc-b": true,
       "_____10c-___pwr-nx-mp_psp-b": false,
       "_____10c-___pwr-cx-memory-b": false,
@@ -1532,7 +1532,7 @@
       "_____10c-___pwr-cx-_group-t": "CORE",
       "_____10c-iv00_C-cx-subgrp-t": "",
       "_____10c-iv00_C-cx-_n_cnt-i": 1,
-      "_____10c-iv00_C-cx-synatt-i": 100,
+      "_____10c-iv00_C-cx-synatt-f": 100,
       "_____10c-iv00_C-cx-de_gen-f": 0.0,
       "_____10c-iv00_C-cx-pspuni-b": false,
       "_____10c-iv00_C-nx-pstcrm-f": 100.0,
@@ -1556,7 +1556,7 @@
       "_____10c-iv00_C-nx-ftincx-f": 0,
       "_____10c-iv00_C-nx-ftincy-f": 0,
       "_____10c-iv00_C-nx-ftincz-f": 0,
-      "_____10c-iv00_C-nx-fthlim-i": 0,
+      "_____10c-iv00_C-nx-fthlim-f": 0,
       "_____10c-iv00_C-nx-mp_acc-b": true,
       "_____10c-iv00_C-nx-mp_psp-b": false,
       "_____10c-iv00_C-cx-memory-b": false,
@@ -1567,7 +1567,7 @@
       "_____10c-iv00_C-cx-_group-t": "IPU",
       "_____10c-iv00BL-cx-subgrp-t": "",
       "_____10c-iv00BL-cx-_n_cnt-i": 1,
-      "_____10c-iv00BL-cx-synatt-i": 100,
+      "_____10c-iv00BL-cx-synatt-f": 100,
       "_____10c-iv00BL-cx-de_gen-f": 0,
       "_____10c-iv00BL-cx-pspuni-b": false,
       "_____10c-iv00BL-nx-pstcrm-f": 35,
@@ -1591,7 +1591,7 @@
       "_____10c-iv00BL-nx-ftincx-f": 0,
       "_____10c-iv00BL-nx-ftincy-f": 0,
       "_____10c-iv00BL-nx-ftincz-f": 0,
-      "_____10c-iv00BL-nx-fthlim-i": 0,
+      "_____10c-iv00BL-nx-fthlim-f": 0,
       "_____10c-iv00BL-nx-mp_acc-b": true,
       "_____10c-iv00BL-nx-mp_psp-b": false,
       "_____10c-iv00BL-cx-memory-b": false,
@@ -1602,7 +1602,7 @@
       "_____10c-iv00BL-cx-_group-t": "IPU",
       "_____10c-iv00BM-cx-subgrp-t": "",
       "_____10c-iv00BM-cx-_n_cnt-i": 1,
-      "_____10c-iv00BM-cx-synatt-i": 100,
+      "_____10c-iv00BM-cx-synatt-f": 100,
       "_____10c-iv00BM-cx-de_gen-f": 0,
       "_____10c-iv00BM-cx-pspuni-b": false,
       "_____10c-iv00BM-nx-pstcrm-f": 35,
@@ -1626,7 +1626,7 @@
       "_____10c-iv00BM-nx-ftincx-f": 0,
       "_____10c-iv00BM-nx-ftincy-f": 0,
       "_____10c-iv00BM-nx-ftincz-f": 0,
-      "_____10c-iv00BM-nx-fthlim-i": 0,
+      "_____10c-iv00BM-nx-fthlim-f": 0,
       "_____10c-iv00BM-nx-mp_acc-b": true,
       "_____10c-iv00BM-nx-mp_psp-b": false,
       "_____10c-iv00BM-cx-memory-b": false,
@@ -1637,7 +1637,7 @@
       "_____10c-iv00BM-cx-_group-t": "IPU",
       "_____10c-iv00BR-cx-subgrp-t": "",
       "_____10c-iv00BR-cx-_n_cnt-i": 1,
-      "_____10c-iv00BR-cx-synatt-i": 100,
+      "_____10c-iv00BR-cx-synatt-f": 100,
       "_____10c-iv00BR-cx-de_gen-f": 0,
       "_____10c-iv00BR-cx-pspuni-b": false,
       "_____10c-iv00BR-nx-pstcrm-f": 35,
@@ -1661,7 +1661,7 @@
       "_____10c-iv00BR-nx-ftincx-f": 0,
       "_____10c-iv00BR-nx-ftincy-f": 0,
       "_____10c-iv00BR-nx-ftincz-f": 0,
-      "_____10c-iv00BR-nx-fthlim-i": 0,
+      "_____10c-iv00BR-nx-fthlim-f": 0,
       "_____10c-iv00BR-nx-mp_acc-b": true,
       "_____10c-iv00BR-nx-mp_psp-b": false,
       "_____10c-iv00BR-cx-memory-b": false,
@@ -1672,7 +1672,7 @@
       "_____10c-iv00BR-cx-_group-t": "IPU",
       "_____10c-iv00ML-cx-subgrp-t": "",
       "_____10c-iv00ML-cx-_n_cnt-i": 1,
-      "_____10c-iv00ML-cx-synatt-i": 100,
+      "_____10c-iv00ML-cx-synatt-f": 100,
       "_____10c-iv00ML-cx-de_gen-f": 0,
       "_____10c-iv00ML-cx-pspuni-b": false,
       "_____10c-iv00ML-nx-pstcrm-f": 35,
@@ -1696,7 +1696,7 @@
       "_____10c-iv00ML-nx-ftincx-f": 0,
       "_____10c-iv00ML-nx-ftincy-f": 0,
       "_____10c-iv00ML-nx-ftincz-f": 0,
-      "_____10c-iv00ML-nx-fthlim-i": 0,
+      "_____10c-iv00ML-nx-fthlim-f": 0,
       "_____10c-iv00ML-nx-mp_acc-b": true,
       "_____10c-iv00ML-nx-mp_psp-b": false,
       "_____10c-iv00ML-cx-memory-b": false,
@@ -1707,7 +1707,7 @@
       "_____10c-iv00ML-cx-_group-t": "IPU",
       "_____10c-iv00MR-cx-subgrp-t": "",
       "_____10c-iv00MR-cx-_n_cnt-i": 1,
-      "_____10c-iv00MR-cx-synatt-i": 100,
+      "_____10c-iv00MR-cx-synatt-f": 100,
       "_____10c-iv00MR-cx-de_gen-f": 0,
       "_____10c-iv00MR-cx-pspuni-b": false,
       "_____10c-iv00MR-nx-pstcrm-f": 35,
@@ -1731,7 +1731,7 @@
       "_____10c-iv00MR-nx-ftincx-f": 0,
       "_____10c-iv00MR-nx-ftincy-f": 0,
       "_____10c-iv00MR-nx-ftincz-f": 0,
-      "_____10c-iv00MR-nx-fthlim-i": 0,
+      "_____10c-iv00MR-nx-fthlim-f": 0,
       "_____10c-iv00MR-nx-mp_acc-b": true,
       "_____10c-iv00MR-nx-mp_psp-b": false,
       "_____10c-iv00MR-cx-memory-b": false,
@@ -1742,7 +1742,7 @@
       "_____10c-iv00MR-cx-_group-t": "IPU",
       "_____10c-iv00TL-cx-subgrp-t": "",
       "_____10c-iv00TL-cx-_n_cnt-i": 1,
-      "_____10c-iv00TL-cx-synatt-i": 100,
+      "_____10c-iv00TL-cx-synatt-f": 100,
       "_____10c-iv00TL-cx-de_gen-f": 0,
       "_____10c-iv00TL-cx-pspuni-b": false,
       "_____10c-iv00TL-nx-pstcrm-f": 35,
@@ -1766,7 +1766,7 @@
       "_____10c-iv00TL-nx-ftincx-f": 0,
       "_____10c-iv00TL-nx-ftincy-f": 0,
       "_____10c-iv00TL-nx-ftincz-f": 0,
-      "_____10c-iv00TL-nx-fthlim-i": 0,
+      "_____10c-iv00TL-nx-fthlim-f": 0,
       "_____10c-iv00TL-nx-mp_acc-b": true,
       "_____10c-iv00TL-nx-mp_psp-b": false,
       "_____10c-iv00TL-cx-memory-b": false,
@@ -1777,7 +1777,7 @@
       "_____10c-iv00TL-cx-_group-t": "IPU",
       "_____10c-iv00TR-cx-subgrp-t": "",
       "_____10c-iv00TR-cx-_n_cnt-i": 1,
-      "_____10c-iv00TR-cx-synatt-i": 100,
+      "_____10c-iv00TR-cx-synatt-f": 100,
       "_____10c-iv00TR-cx-de_gen-f": 0,
       "_____10c-iv00TR-cx-pspuni-b": false,
       "_____10c-iv00TR-nx-pstcrm-f": 35,
@@ -1801,7 +1801,7 @@
       "_____10c-iv00TR-nx-ftincx-f": 0,
       "_____10c-iv00TR-nx-ftincy-f": 0,
       "_____10c-iv00TR-nx-ftincz-f": 0,
-      "_____10c-iv00TR-nx-fthlim-i": 0,
+      "_____10c-iv00TR-nx-fthlim-f": 0,
       "_____10c-iv00TR-nx-mp_acc-b": true,
       "_____10c-iv00TR-nx-mp_psp-b": false,
       "_____10c-iv00TR-cx-memory-b": false,
@@ -1812,7 +1812,7 @@
       "_____10c-iv00TR-cx-_group-t": "IPU",
       "_____10c-iv00TM-cx-subgrp-t": "",
       "_____10c-iv00TM-cx-_n_cnt-i": 1,
-      "_____10c-iv00TM-cx-synatt-i": 100,
+      "_____10c-iv00TM-cx-synatt-f": 100,
       "_____10c-iv00TM-cx-de_gen-f": 0,
       "_____10c-iv00TM-cx-pspuni-b": false,
       "_____10c-iv00TM-nx-pstcrm-f": 35,
@@ -1836,7 +1836,7 @@
       "_____10c-iv00TM-nx-ftincx-f": 0,
       "_____10c-iv00TM-nx-ftincy-f": 0,
       "_____10c-iv00TM-nx-ftincz-f": 0,
-      "_____10c-iv00TM-nx-fthlim-i": 0,
+      "_____10c-iv00TM-nx-fthlim-f": 0,
       "_____10c-iv00TM-nx-mp_acc-b": true,
       "_____10c-iv00TM-nx-mp_psp-b": false,
       "_____10c-iv00TM-cx-memory-b": false,
diff --git a/src/evo/cortical_area.py b/src/evo/cortical_area.py
new file mode 100644
index 000000000..ac57ecc3e
--- /dev/null
+++ b/src/evo/cortical_area.py
@@ -0,0 +1,55 @@
+
+# Copyright 2016-2023 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+import string
+import random
+
+from src.inf import runtime_data
+from src.evo.templates import cortical_types
+
+
+def area_is_system(cortical_area):
+    result = False
+    for area_type in cortical_types:
+        if "supported_devices" in cortical_types[area_type]:
+            for cortical_id in cortical_types[area_type]["supported_devices"]:
+                if cortical_area == cortical_id:
+                    result = True
+    return result
+
+
+def cortical_area_type(cortical_area):
+    cortical_type = "CUSTOM"
+    for area_type in cortical_types:
+        if "supported_devices" in cortical_types[area_type]:
+            for cortical_id in cortical_types[area_type]["supported_devices"]:
+                if cortical_area == cortical_id:
+                    cortical_type = area_type
+    return cortical_type
+
+
+def cortical_id_gen(seed='___', is_memory=False):
+    seed = seed.replace('-', '_')
+    while True:
+        chars = string.ascii_uppercase + string.digits
+        if not is_memory:
+            random_id = 'C' + str('').join(random.choice(chars) for _ in range(2)) + seed
+            if random_id not in runtime_data.cortical_list:
+                return random_id
+        else:
+            random_id = 'M' + str('').join(random.choice(chars) for _ in range(2)) + seed
+            if random_id not in runtime_data.cortical_list:
+                return random_id
diff --git a/src/evo/death.py b/src/evo/death.py
index 6b8abd2e5..a71218f7f 100644
--- a/src/evo/death.py
+++ b/src/evo/death.py
@@ -65,8 +65,8 @@ def death_eligibility():
     # Conditions triggering the brain death
 
     # --- Age related ---
-    if 'max_age' in runtime_data.genome:
-        if runtime_data.current_age > runtime_data.genome['max_age']:
+    if 'max_age' in runtime_data.genome["physiology"]:
+        if runtime_data.current_age > runtime_data.genome["physiology"]['max_age']:
             death_condition = True
             print('\n\n\nAge related death has been triggered!\n\n\n')
 
diff --git a/src/evo/defaults/genome/barebones_genome.json b/src/evo/defaults/genome/barebones_genome.json
index ab585068b..4b16ffefc 100644
--- a/src/evo/defaults/genome/barebones_genome.json
+++ b/src/evo/defaults/genome/barebones_genome.json
@@ -1,211 +1,1635 @@
 {
-   "genome_id": "2022-07-10_21:53:10_961677_111111_G",
-   "version": "2.0",
-   "max_burst_count": 3,
-   "burst_delay": 1,
-   "max_age": 10000000,
-   "evolution_burst_count": 50,
-   "ipu_idle_threshold": 1000,
-   "physiology": {
-      "plasticity_queue_depth": 3
-   },
-   "neuron_morphologies": {
-      "block_to_block": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "decrease_filter_diagonal": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "decrease_filter_diagonal2": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  2,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "increase_filter_diagonal": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  -1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_+x": {
-         "parameters": {
-            "vectors": [
-               [
-                  1,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-x": {
-         "parameters": {
-            "vectors": [
-               [
-                  -1,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_+y": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-y": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  -1,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_+z": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-z": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  -1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "expander_x": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "reducer_x": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "randomizer": {
-         "parameters": {},
-         "type": "functions"
-      }
-   },
-   "species": {
-      "parents": {},
-      "species_id": "",
-      "class": "toy",
-      "brand": "gazebo",
-      "model": "smart_car"
-   },
-   "blueprint": {
-      "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
-      "_____10c-___pwr-cx-de_gen-f": 0.0,
-      "_____10c-___pwr-cx-pspuni-b": false,
-      "_____10c-___pwr-nx-pstcrm-f": 35.0,
-      "_____10c-___pwr-cx-dstmap-d": {},
-      "_____10c-___pwr-cx-___bbx-i": 1,
-      "_____10c-___pwr-cx-___bby-i": 1,
-      "_____10c-___pwr-cx-___bbz-i": 1,
-      "_____10c-___pwr-cx-rcordx-i": 10,
-      "_____10c-___pwr-cx-rcordy-i": 0,
-      "_____10c-___pwr-cx-rcordz-i": -20,
-      "_____10c-___pwr-cx-2dcorx-i": null,
-      "_____10c-___pwr-cx-2dcory-i": null,
-      "_____10c-___pwr-cx-gd_vis-b": true,
-      "_____10c-___pwr-nx-pstcr_-f": 500.0,
-      "_____10c-___pwr-nx-plst_c-f": 0.0,
-      "_____10c-___pwr-nx-fire_t-f": 1.0,
-      "_____10c-___pwr-nx-refrac-i": 0,
-      "_____10c-___pwr-nx-leak_c-f": 10.0,
-      "_____10c-___pwr-nx-leak_v-f": 0,
-      "_____10c-___pwr-nx-c_fr_c-i": 3,
-      "_____10c-___pwr-nx-snooze-f": 0,
-      "_____10c-___pwr-nx-fthinc-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
-      "_____10c-___pwr-nx-mp_acc-b": true,
-      "_____10c-___pwr-cx-__name-t": "Brain_Power",
-      "_____10c-___pwr-cx-_group-t": "IPU",
-      "_____10c-_death-cx-_n_cnt-i": 1,
-      "_____10c-_death-cx-synatt-i": 100,
-      "_____10c-_death-cx-de_gen-f": 0.01,
-      "_____10c-_death-cx-pspuni-b": false,
-      "_____10c-_death-nx-pstcrm-f": 35,
-      "_____10c-_death-cx-dstmap-d": {},
-      "_____10c-_death-cx-___bbx-i": 1,
-      "_____10c-_death-cx-___bby-i": 1,
-      "_____10c-_death-cx-___bbz-i": 1,
-      "_____10c-_death-cx-rcordx-i": 10,
-      "_____10c-_death-cx-rcordy-i": 0,
-      "_____10c-_death-cx-rcordz-i": -30,
-      "_____10c-_death-cx-2dcorx-i": null,
-      "_____10c-_death-cx-2dcory-i": null,
-      "_____10c-_death-cx-gd_vis-b": true,
-      "_____10c-_death-nx-pstcr_-f": 5,
-      "_____10c-_death-nx-plst_c-f": 0.06,
-      "_____10c-_death-nx-fire_t-f": 1,
-      "_____10c-_death-nx-refrac-i": 0,
-      "_____10c-_death-nx-leak_c-f": 10,
-      "_____10c-_death-nx-leak_v-f": 0,
-      "_____10c-_death-nx-c_fr_c-i": 3,
-      "_____10c-_death-nx-snooze-f": 0,
-      "_____10c-_death-nx-fthinc-f": 0,
-      "_____10c-_death-nx-fthlim-i": 0,
-      "_____10c-_death-nx-mp_acc-b": false,
-      "_____10c-_death-cx-__name-t": "Brain_Death",
-      "_____10c-_death-cx-_group-t": "IPU"
-   }
+  "genome_id": "2022-07-10_21:53:10_961677_111111_G",
+  "genome_title": "The Barebones Genome",
+  "genome_description": "An empty genome",
+  "version": "2.0",
+  "neuron_morphologies": {
+    "decrease_filter_diagonal": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "decrease_filter_diagonal2": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            2,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "increase_filter_diagonal": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "increase_filter_diagonal2": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            2,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "to_block_[5, 7, 4]": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              5,
+              7,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_one": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_two": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_three": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_four": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_five": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_one": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              3
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_two": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_three": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              1
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_four": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_five": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "motor_forward": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "motor_backward": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "y_consolidator": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              "*",
+              "?",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "intensity": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              0,
+              0,
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "APT_low": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              7
+            ],
+            [
+              0,
+              0,
+              8
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "apt_high": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              2
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "diagonal_proprio": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            1,
+            1,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "right_detect": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              7,
+              "*",
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "left_detect": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              "*",
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "bbb3": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            -1,
+            1,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_135_deg": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            -1,
+            0
+          ],
+          [
+            2,
+            -2,
+            0
+          ],
+          [
+            3,
+            -3,
+            0
+          ],
+          [
+            4,
+            -4,
+            0
+          ],
+          [
+            5,
+            -5,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "ori_115": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            -2,
+            0
+          ],
+          [
+            2,
+            -4,
+            0
+          ],
+          [
+            3,
+            -6,
+            0
+          ],
+          [
+            4,
+            -9,
+            0
+          ],
+          [
+            5,
+            -11,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "ori_0_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            0,
+            0
+          ],
+          [
+            2,
+            0,
+            0
+          ],
+          [
+            3,
+            0,
+            0
+          ],
+          [
+            4,
+            0,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_90_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            0,
+            1,
+            0
+          ],
+          [
+            0,
+            2,
+            0
+          ],
+          [
+            0,
+            3,
+            0
+          ],
+          [
+            0,
+            4,
+            0
+          ],
+          [
+            0,
+            5,
+            0
+          ],
+          [
+            0,
+            6,
+            0
+          ],
+          [
+            0,
+            7,
+            0
+          ],
+          [
+            0,
+            8,
+            0
+          ],
+          [
+            0,
+            9,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_45_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            1,
+            0
+          ],
+          [
+            2,
+            2,
+            0
+          ],
+          [
+            3,
+            3,
+            0
+          ],
+          [
+            4,
+            4,
+            0
+          ],
+          [
+            5,
+            5,
+            0
+          ],
+          [
+            6,
+            6,
+            0
+          ],
+          [
+            7,
+            7,
+            0
+          ],
+          [
+            8,
+            8,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_60_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            1,
+            0
+          ],
+          [
+            1,
+            2,
+            0
+          ],
+          [
+            2,
+            3,
+            0
+          ],
+          [
+            2,
+            4,
+            0
+          ],
+          [
+            3,
+            5,
+            0
+          ],
+          [
+            3,
+            6,
+            0
+          ],
+          [
+            4,
+            7,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "block_to_block": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "projector": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "memory": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "0-0-0_to_all": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              "*",
+              "*",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "all_to_0-0-0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "all_to_all": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "?",
+              "?",
+              "?"
+            ],
+            [
+              "*",
+              "*",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "lateral_+x": {
+      "parameters": {
+        "vectors": [
+          [
+            1,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-x": {
+      "parameters": {
+        "vectors": [
+          [
+            -1,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_+y": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-y": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            -1,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_+z": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-z": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "randomizer": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "expander_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "reducer_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "lateral_pairs_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "tile": {
+      "parameters": {
+        "src_seed": [
+          16,
+          16,
+          1
+        ],
+        "src_pattern": [
+          [
+            1,
+            0
+          ],
+          [
+            1,
+            0
+          ],
+          [
+            1,
+            0
+          ]
+        ],
+        "mapper_morphology": "projector"
+      },
+      "type": "composite",
+      "class": "core"
+    },
+    "0_0_0-_0_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-_0_0_0",
+      "class": "custom"
+    },
+    "0_0_0-1_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-1_0_0",
+      "class": "custom"
+    },
+    "0_0_0-2_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-2_0_0",
+      "class": "custom"
+    },
+    "0_0_0-3_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-3_0_0",
+      "class": "custom"
+    },
+    "0_0_0-4_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-4_0_0",
+      "class": "custom"
+    },
+    "0_0_0-5_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-5_0_0",
+      "class": "custom"
+    },
+    "0_0_0-6_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-6_0_0",
+      "class": "custom"
+    },
+    "0_0_0-7_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-7_0_0",
+      "class": "custom"
+    }
+  },
+  "hosts": {},
+  "physiology": {
+    "burst_delay": 0.025,
+    "max_age": 10000000,
+    "evolution_burst_count": 50,
+    "ipu_idle_threshold": 1000,
+    "plasticity_queue_depth": 3,
+    "lifespan_mgmt_interval": 10
+  },
+  "stats": {
+    "innate_cortical_area_count": 2,
+    "innate_neuron_count": 2,
+    "innate_synapse_count": 0
+  },
+  "signatures": {
+    "genome": "d56d9bbc7a5e236d",
+    "blueprint": "f5dacb3e0fd9b7d2",
+    "physiology": "5f1e7f587e1af2c8"
+  },
+  "timestamp": 1712971071.904253,
+  "blueprint": {
+    "_____10c-___pwr-cx-subgrp-t": "",
+    "_____10c-___pwr-cx-_n_cnt-i": 1,
+    "_____10c-___pwr-cx-synatt-f": 100,
+    "_____10c-___pwr-cx-de_gen-f": 0,
+    "_____10c-___pwr-cx-pspuni-b": false,
+    "_____10c-___pwr-nx-pstcrm-f": 35,
+    "_____10c-___pwr-cx-dstmap-d": {},
+    "_____10c-___pwr-cx-___bbx-i": 1,
+    "_____10c-___pwr-cx-___bby-i": 1,
+    "_____10c-___pwr-cx-___bbz-i": 1,
+    "_____10c-___pwr-cx-rcordx-i": 10,
+    "_____10c-___pwr-cx-rcordy-i": 0,
+    "_____10c-___pwr-cx-rcordz-i": -20,
+    "_____10c-___pwr-cx-2dcorx-i": null,
+    "_____10c-___pwr-cx-2dcory-i": null,
+    "_____10c-___pwr-cx-gd_vis-b": true,
+    "_____10c-___pwr-nx-pstcr_-f": 500,
+    "_____10c-___pwr-nx-fire_t-f": 1,
+    "_____10c-___pwr-nx-refrac-i": 0,
+    "_____10c-___pwr-nx-leak_c-f": 10,
+    "_____10c-___pwr-nx-leak_v-f": 0,
+    "_____10c-___pwr-nx-c_fr_c-i": 3,
+    "_____10c-___pwr-nx-snooze-f": 0,
+    "_____10c-___pwr-nx-ftincx-f": 0,
+    "_____10c-___pwr-nx-ftincy-f": 0,
+    "_____10c-___pwr-nx-ftincz-f": 0,
+    "_____10c-___pwr-nx-fthlim-f": 0,
+    "_____10c-___pwr-nx-mp_acc-b": true,
+    "_____10c-___pwr-nx-mp_psp-b": false,
+    "_____10c-___pwr-cx-memory-b": false,
+    "_____10c-___pwr-cx-mem__t-i": 100,
+    "_____10c-___pwr-cx-mem_gr-i": 1,
+    "_____10c-___pwr-cx-mem_ls-i": 9,
+    "_____10c-___pwr-nx-excite-f": 100,
+    "_____10c-___pwr-cx-__name-t": "Brain_Power",
+    "_____10c-___pwr-cx-_group-t": "CORE",
+    "_____10c-_death-cx-subgrp-t": "",
+    "_____10c-_death-cx-_n_cnt-i": 1,
+    "_____10c-_death-cx-synatt-f": 100,
+    "_____10c-_death-cx-de_gen-f": 0,
+    "_____10c-_death-cx-pspuni-b": false,
+    "_____10c-_death-nx-pstcrm-f": 35,
+    "_____10c-_death-cx-dstmap-d": {},
+    "_____10c-_death-cx-___bbx-i": 1,
+    "_____10c-_death-cx-___bby-i": 1,
+    "_____10c-_death-cx-___bbz-i": 1,
+    "_____10c-_death-cx-rcordx-i": 10,
+    "_____10c-_death-cx-rcordy-i": 0,
+    "_____10c-_death-cx-rcordz-i": -30,
+    "_____10c-_death-cx-2dcorx-i": null,
+    "_____10c-_death-cx-2dcory-i": null,
+    "_____10c-_death-cx-gd_vis-b": true,
+    "_____10c-_death-nx-pstcr_-f": 5,
+    "_____10c-_death-nx-fire_t-f": 1,
+    "_____10c-_death-nx-refrac-i": 0,
+    "_____10c-_death-nx-leak_c-f": 10,
+    "_____10c-_death-nx-leak_v-f": 0,
+    "_____10c-_death-nx-c_fr_c-i": 3,
+    "_____10c-_death-nx-snooze-f": 0,
+    "_____10c-_death-nx-ftincx-f": 0,
+    "_____10c-_death-nx-ftincy-f": 0,
+    "_____10c-_death-nx-ftincz-f": 0,
+    "_____10c-_death-nx-fthlim-f": 0,
+    "_____10c-_death-nx-mp_acc-b": false,
+    "_____10c-_death-nx-mp_psp-b": false,
+    "_____10c-_death-cx-memory-b": false,
+    "_____10c-_death-cx-mem__t-i": 100,
+    "_____10c-_death-cx-mem_gr-i": 1,
+    "_____10c-_death-cx-mem_ls-i": 9,
+    "_____10c-_death-nx-excite-f": 100,
+    "_____10c-_death-cx-__name-t": "Brain_Death",
+    "_____10c-_death-cx-_group-t": "CORE"
+  }
 }
\ No newline at end of file
diff --git a/src/evo/defaults/genome/brightness_change_detection.json b/src/evo/defaults/genome/brightness_change_detection.json
index 3e2a9b98c..80c8cc2b2 100644
--- a/src/evo/defaults/genome/brightness_change_detection.json
+++ b/src/evo/defaults/genome/brightness_change_detection.json
@@ -1210,7 +1210,7 @@
       "_____10c-i__inf-nx-___bbx-i": 3,
       "_____10c-i__inf-nx-___bby-i": 1,
       "_____10c-i__inf-nx-___bbz-i": 1,
-      "_____10c-i__inf-cx-synatt-i": 100,
+      "_____10c-i__inf-cx-synatt-f": 100,
       "_____10c-i__inf-cx-pstcr_-f": 80,
       "_____10c-i__inf-cx-pstcrm-f": 100,
       "_____10c-i__inf-cx-plst_c-f": 0.05,
@@ -1254,7 +1254,7 @@
       "_____10c-ii_inf-nx-___bbx-i": 3,
       "_____10c-ii_inf-nx-___bby-i": 1,
       "_____10c-ii_inf-nx-___bbz-i": 1,
-      "_____10c-ii_inf-cx-synatt-i": 100,
+      "_____10c-ii_inf-cx-synatt-f": 100,
       "_____10c-ii_inf-cx-pstcr_-f": 80,
       "_____10c-ii_inf-cx-pstcrm-f": 100,
       "_____10c-ii_inf-cx-plst_c-f": 0.05,
@@ -1298,7 +1298,7 @@
       "_____10c-t__vis-nx-___bbx-i": 8,
       "_____10c-t__vis-nx-___bby-i": 1,
       "_____10c-t__vis-nx-___bbz-i": 1,
-      "_____10c-t__vis-cx-synatt-i": 100,
+      "_____10c-t__vis-cx-synatt-f": 100,
       "_____10c-t__vis-cx-pstcr_-f": 50,
       "_____10c-t__vis-cx-pstcrm-f": 100,
       "_____10c-t__vis-cx-plst_c-f": 0.05,
@@ -1415,7 +1415,7 @@
       "_____10c-is_inc-nx-___bbx-i": 4,
       "_____10c-is_inc-nx-___bby-i": 2,
       "_____10c-is_inc-nx-___bbz-i": 1,
-      "_____10c-is_inc-cx-synatt-i": 100,
+      "_____10c-is_inc-cx-synatt-f": 100,
       "_____10c-is_inc-cx-pstcr_-f": 50,
       "_____10c-is_inc-cx-pstcrm-f": 200,
       "_____10c-is_inc-cx-plst_c-f": 0.05,
@@ -1462,7 +1462,7 @@
       "_____10c-im_inc-nx-___bbx-i": 4,
       "_____10c-im_inc-nx-___bby-i": 2,
       "_____10c-im_inc-nx-___bbz-i": 1,
-      "_____10c-im_inc-cx-synatt-i": 100,
+      "_____10c-im_inc-cx-synatt-f": 100,
       "_____10c-im_inc-cx-pstcr_-f": 50,
       "_____10c-im_inc-cx-pstcrm-f": 200,
       "_____10c-im_inc-cx-plst_c-f": 0.05,
@@ -1509,7 +1509,7 @@
       "_____10c-il_inc-nx-___bbx-i": 4,
       "_____10c-il_inc-nx-___bby-i": 2,
       "_____10c-il_inc-nx-___bbz-i": 1,
-      "_____10c-il_inc-cx-synatt-i": 100,
+      "_____10c-il_inc-cx-synatt-f": 100,
       "_____10c-il_inc-cx-pstcr_-f": 50,
       "_____10c-il_inc-cx-pstcrm-f": 200,
       "_____10c-il_inc-cx-plst_c-f": 0.05,
@@ -1556,7 +1556,7 @@
       "_____10c-ds_inc-nx-___bbx-i": 3,
       "_____10c-ds_inc-nx-___bby-i": 1,
       "_____10c-ds_inc-nx-___bbz-i": 1,
-      "_____10c-ds_inc-cx-synatt-i": 100,
+      "_____10c-ds_inc-cx-synatt-f": 100,
       "_____10c-ds_inc-cx-pstcr_-f": 100,
       "_____10c-ds_inc-cx-pstcrm-f": 200,
       "_____10c-ds_inc-cx-plst_c-f": 0.05,
@@ -1577,7 +1577,7 @@
       "_____10c-dm_inc-nx-___bbx-i": 3,
       "_____10c-dm_inc-nx-___bby-i": 1,
       "_____10c-dm_inc-nx-___bbz-i": 1,
-      "_____10c-dm_inc-cx-synatt-i": 100,
+      "_____10c-dm_inc-cx-synatt-f": 100,
       "_____10c-dm_inc-cx-pstcr_-f": 100,
       "_____10c-dm_inc-cx-pstcrm-f": 200,
       "_____10c-dm_inc-cx-plst_c-f": 0.05,
@@ -1598,7 +1598,7 @@
       "_____10c-dl_inc-nx-___bbx-i": 1,
       "_____10c-dl_inc-nx-___bby-i": 1,
       "_____10c-dl_inc-nx-___bbz-i": 1,
-      "_____10c-dl_inc-cx-synatt-i": 100,
+      "_____10c-dl_inc-cx-synatt-f": 100,
       "_____10c-dl_inc-cx-pstcr_-f": 50,
       "_____10c-dl_inc-cx-pstcrm-f": 200,
       "_____10c-dl_inc-cx-plst_c-f": 0.05,
@@ -1633,7 +1633,7 @@
       "_____10c-is_dcr-nx-___bbx-i": 4,
       "_____10c-is_dcr-nx-___bby-i": 2,
       "_____10c-is_dcr-nx-___bbz-i": 1,
-      "_____10c-is_dcr-cx-synatt-i": 100,
+      "_____10c-is_dcr-cx-synatt-f": 100,
       "_____10c-is_dcr-cx-pstcr_-f": 50,
       "_____10c-is_dcr-cx-pstcrm-f": 200,
       "_____10c-is_dcr-cx-plst_c-f": 0.05,
@@ -1680,7 +1680,7 @@
       "_____10c-im_dcr-nx-___bbx-i": 4,
       "_____10c-im_dcr-nx-___bby-i": 2,
       "_____10c-im_dcr-nx-___bbz-i": 1,
-      "_____10c-im_dcr-cx-synatt-i": 100,
+      "_____10c-im_dcr-cx-synatt-f": 100,
       "_____10c-im_dcr-cx-pstcr_-f": 50,
       "_____10c-im_dcr-cx-pstcrm-f": 200,
       "_____10c-im_dcr-cx-plst_c-f": 0.05,
@@ -1727,7 +1727,7 @@
       "_____10c-il_dcr-nx-___bbx-i": 4,
       "_____10c-il_dcr-nx-___bby-i": 2,
       "_____10c-il_dcr-nx-___bbz-i": 1,
-      "_____10c-il_dcr-cx-synatt-i": 100,
+      "_____10c-il_dcr-cx-synatt-f": 100,
       "_____10c-il_dcr-cx-pstcr_-f": 50,
       "_____10c-il_dcr-cx-pstcrm-f": 200,
       "_____10c-il_dcr-cx-plst_c-f": 0.05,
@@ -1774,7 +1774,7 @@
       "_____10c-ds_dcr-nx-___bbx-i": 3,
       "_____10c-ds_dcr-nx-___bby-i": 1,
       "_____10c-ds_dcr-nx-___bbz-i": 1,
-      "_____10c-ds_dcr-cx-synatt-i": 100,
+      "_____10c-ds_dcr-cx-synatt-f": 100,
       "_____10c-ds_dcr-cx-pstcr_-f": 100,
       "_____10c-ds_dcr-cx-pstcrm-f": 200,
       "_____10c-ds_dcr-cx-plst_c-f": 0.05,
@@ -1795,7 +1795,7 @@
       "_____10c-dm_dcr-nx-___bbx-i": 3,
       "_____10c-dm_dcr-nx-___bby-i": 1,
       "_____10c-dm_dcr-nx-___bbz-i": 1,
-      "_____10c-dm_dcr-cx-synatt-i": 100,
+      "_____10c-dm_dcr-cx-synatt-f": 100,
       "_____10c-dm_dcr-cx-pstcr_-f": 100,
       "_____10c-dm_dcr-cx-pstcrm-f": 200,
       "_____10c-dm_dcr-cx-plst_c-f": 0.05,
@@ -1816,7 +1816,7 @@
       "_____10c-dl_dcr-nx-___bbx-i": 1,
       "_____10c-dl_dcr-nx-___bby-i": 1,
       "_____10c-dl_dcr-nx-___bbz-i": 1,
-      "_____10c-dl_dcr-cx-synatt-i": 100,
+      "_____10c-dl_dcr-cx-synatt-f": 100,
       "_____10c-dl_dcr-cx-pstcr_-f": 100,
       "_____10c-dl_dcr-cx-pstcrm-f": 200,
       "_____10c-dl_dcr-cx-plst_c-f": 0.05,
@@ -1838,7 +1838,7 @@
       "_____10c-_steer-nx-___bbx-i": 8,
       "_____10c-_steer-nx-___bby-i": 2,
       "_____10c-_steer-nx-___bbz-i": 1,
-      "_____10c-_steer-cx-synatt-i": 100,
+      "_____10c-_steer-cx-synatt-f": 100,
       "_____10c-_steer-cx-pstcr_-f": 90,
       "_____10c-_steer-cx-pstcrm-f": 100,
       "_____10c-_steer-cx-plst_c-f": 0.05,
@@ -1896,7 +1896,7 @@
       "_____10c-c___tb-nx-___bbx-i": 1,
       "_____10c-c___tb-nx-___bby-i": 1,
       "_____10c-c___tb-nx-___bbz-i": 1,
-      "_____10c-c___tb-cx-synatt-i": 100,
+      "_____10c-c___tb-cx-synatt-f": 100,
       "_____10c-c___tb-cx-pstcr_-f": 50,
       "_____10c-c___tb-cx-pstcrm-f": 100,
       "_____10c-c___tb-cx-plst_c-f": 0.05,
@@ -1931,7 +1931,7 @@
       "_____10c-c___ab-nx-___bbx-i": 1,
       "_____10c-c___ab-nx-___bby-i": 1,
       "_____10c-c___ab-nx-___bbz-i": 1,
-      "_____10c-c___ab-cx-synatt-i": 100,
+      "_____10c-c___ab-cx-synatt-f": 100,
       "_____10c-c___ab-cx-pstcr_-f": 50,
       "_____10c-c___ab-cx-pstcrm-f": 100,
       "_____10c-c___ab-cx-plst_c-f": 0.05,
@@ -1966,7 +1966,7 @@
       "_____10c-_right-nx-___bbx-i": 1,
       "_____10c-_right-nx-___bby-i": 1,
       "_____10c-_right-nx-___bbz-i": 1,
-      "_____10c-_right-cx-synatt-i": 100,
+      "_____10c-_right-cx-synatt-f": 100,
       "_____10c-_right-cx-pstcr_-f": 100,
       "_____10c-_right-cx-pstcrm-f": 200,
       "_____10c-_right-cx-plst_c-f": 0.05,
@@ -2000,7 +2000,7 @@
       "_____10c-__left-nx-___bbx-i": 1,
       "_____10c-__left-nx-___bby-i": 1,
       "_____10c-__left-nx-___bbz-i": 1,
-      "_____10c-__left-cx-synatt-i": 100,
+      "_____10c-__left-cx-synatt-f": 100,
       "_____10c-__left-cx-pstcr_-f": 100,
       "_____10c-__left-cx-pstcrm-f": 200,
       "_____10c-__left-cx-plst_c-f": 0.05,
@@ -2034,7 +2034,7 @@
       "_____10c-__forw-nx-___bbx-i": 1,
       "_____10c-__forw-nx-___bby-i": 1,
       "_____10c-__forw-nx-___bbz-i": 1,
-      "_____10c-__forw-cx-synatt-i": 100,
+      "_____10c-__forw-cx-synatt-f": 100,
       "_____10c-__forw-cx-pstcr_-f": 100,
       "_____10c-__forw-cx-pstcrm-f": 200,
       "_____10c-__forw-cx-plst_c-f": 0.05,
@@ -2068,7 +2068,7 @@
       "_____10c-__back-nx-___bbx-i": 3,
       "_____10c-__back-nx-___bby-i": 1,
       "_____10c-__back-nx-___bbz-i": 1,
-      "_____10c-__back-cx-synatt-i": 100,
+      "_____10c-__back-cx-synatt-f": 100,
       "_____10c-__back-cx-pstcr_-f": 100,
       "_____10c-__back-cx-pstcrm-f": 200,
       "_____10c-__back-cx-plst_c-f": 0.05,
@@ -2115,7 +2115,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 6,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
diff --git a/src/evo/defaults/genome/essential_genome.json b/src/evo/defaults/genome/essential_genome.json
index d12064078..0c7b2b13a 100644
--- a/src/evo/defaults/genome/essential_genome.json
+++ b/src/evo/defaults/genome/essential_genome.json
@@ -1,2586 +1,2673 @@
 {
-   "genome_id": "2022-07-10_21:53:10_961677_111111_G",
-   "version": "2.0",
-   "max_burst_count": 3,
-   "burst_delay": 0.025,
-   "max_age": 10000000,
-   "evolution_burst_count": 50,
-   "ipu_idle_threshold": 1000,
-   "plasticity_queue_depth": 3,
-   "lifespan_mgmt_interval": 10,
-   "neuron_morphologies": {
-      "decrease_filter_diagonal": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "decrease_filter_diagonal2": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  2,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "increase_filter_diagonal": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  -1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "increase_filter_diagonal2": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  2,
-                  -1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "to_block_[5, 7, 4]": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ],
-                  [
-                     5,
-                     7,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_left_level_one": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     3
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     3
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_left_level_two": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_left_level_three": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     1
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     1
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_left_level_four": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_left_level_five": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     1,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     5,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_right_level_one": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     3
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     3
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_right_level_two": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     1,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     2
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_right_level_three": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     1
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     2,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     1
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_right_level_four": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     2
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     3,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     2
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "turn_right_level_five": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     3,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     4,
-                     0,
-                     0
-                  ],
-                  [
-                     7,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "motor_forward": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "motor_backward": {
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     1,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     3,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     5,
-                     0,
-                     4
-                  ]
-               ],
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     7,
-                     0,
-                     4
-                  ]
-               ]
-            ]
-         },
-         "type": "patterns"
-      },
-      "y_consolidator": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ],
-                  [
-                     "*",
-                     "?",
-                     "*"
-                  ]
-               ]
-            ]
-         }
-      },
-      "intensity": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ],
-                  [
-                     0,
-                     0,
-                     "*"
-                  ]
-               ]
-            ]
-         }
-      },
-      "APT_low": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     7
-                  ],
-                  [
-                     0,
-                     0,
-                     8
-                  ]
-               ]
-            ]
-         }
-      },
-      "apt_high": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     2
-                  ],
-                  [
-                     0,
-                     0,
-                     2
-                  ]
-               ]
-            ]
-         }
-      },
-      "diagonal_proprio": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  1,
-                  1,
-                  0
-               ]
-            ]
-         }
-      },
-      "right_detect": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     7,
-                     "*",
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         }
-      },
-      "left_detect": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     "*",
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         }
-      },
-      "bbb3": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  -1,
-                  1,
-                  0
-               ]
-            ]
-         }
-      },
-      "ori_135_deg": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  1,
-                  -1,
-                  0
-               ],
-               [
-                  2,
-                  -2,
-                  0
-               ],
-               [
-                  3,
-                  -3,
-                  0
-               ],
-               [
-                  4,
-                  -4,
-                  0
-               ],
-               [
-                  5,
-                  -5,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "ori_115": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  1,
-                  -2,
-                  0
-               ],
-               [
-                  2,
-                  -4,
-                  0
-               ],
-               [
-                  3,
-                  -6,
-                  0
-               ],
-               [
-                  4,
-                  -9,
-                  0
-               ],
-               [
-                  5,
-                  -11,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "ori_0_deg": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  1,
-                  0,
-                  0
-               ],
-               [
-                  2,
-                  0,
-                  0
-               ],
-               [
-                  3,
-                  0,
-                  0
-               ],
-               [
-                  4,
-                  0,
-                  0
-               ]
-            ]
-         }
-      },
-      "ori_90_deg": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  0,
-                  1,
-                  0
-               ],
-               [
-                  0,
-                  2,
-                  0
-               ],
-               [
-                  0,
-                  3,
-                  0
-               ],
-               [
-                  0,
-                  4,
-                  0
-               ],
-               [
-                  0,
-                  5,
-                  0
-               ],
-               [
-                  0,
-                  6,
-                  0
-               ],
-               [
-                  0,
-                  7,
-                  0
-               ],
-               [
-                  0,
-                  8,
-                  0
-               ],
-               [
-                  0,
-                  9,
-                  0
-               ]
-            ]
-         }
-      },
-      "ori_45_deg": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  1,
-                  1,
-                  0
-               ],
-               [
-                  2,
-                  2,
-                  0
-               ],
-               [
-                  3,
-                  3,
-                  0
-               ],
-               [
-                  4,
-                  4,
-                  0
-               ],
-               [
-                  5,
-                  5,
-                  0
-               ],
-               [
-                  6,
-                  6,
-                  0
-               ],
-               [
-                  7,
-                  7,
-                  0
-               ],
-               [
-                  8,
-                  8,
-                  0
-               ]
-            ]
-         }
-      },
-      "ori_60_deg": {
-         "type": "vectors",
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ],
-               [
-                  1,
-                  1,
-                  0
-               ],
-               [
-                  1,
-                  2,
-                  0
-               ],
-               [
-                  2,
-                  3,
-                  0
-               ],
-               [
-                  2,
-                  4,
-                  0
-               ],
-               [
-                  3,
-                  5,
-                  0
-               ],
-               [
-                  3,
-                  6,
-                  0
-               ],
-               [
-                  4,
-                  7,
-                  0
-               ]
-            ]
-         }
-      },
-      "block_to_block": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "projector": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "memory": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "0-0-0_to_all": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ]
-               ]
-            ]
-         }
-      },
-      "all_to_0-0-0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ],
-                  [
-                     0,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         }
-      },
-      "all_to_all": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     "?",
-                     "?",
-                     "?"
-                  ],
-                  [
-                     "*",
-                     "*",
-                     "*"
-                  ]
-               ]
-            ]
-         }
-      },
-      "lateral_+x": {
-         "parameters": {
-            "vectors": [
-               [
-                  1,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-x": {
-         "parameters": {
-            "vectors": [
-               [
-                  -1,
-                  0,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_+y": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  1,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-y": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  -1,
-                  0
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_+z": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "lateral_-z": {
-         "parameters": {
-            "vectors": [
-               [
-                  0,
-                  0,
-                  -1
-               ]
-            ]
-         },
-         "type": "vectors"
-      },
-      "randomizer": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "expander_x": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "reducer_x": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "lateral_pairs_x": {
-         "parameters": {},
-         "type": "functions"
-      },
-      "tile": {
-         "parameters": {
-            "src_seed": [
-               16,
-               16,
-               1
-            ],
-            "src_pattern": [
-               [
-                  1,
-                  0
-               ],
-               [
-                  1,
-                  0
-               ],
-               [
-                  1,
-                  0
-               ]
-            ],
-            "mapper_morphology": "projector"
-         },
-         "type": "composite"
-      },
-      "0_0_0-_0_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     0,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-_0_0_0"
-      },
-      "0_0_0-1_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     1,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-1_0_0"
-      },
-      "0_0_0-2_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     2,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-2_0_0"
-      },
-      "0_0_0-3_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     3,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-3_0_0"
-      },
-      "0_0_0-4_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     4,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-4_0_0"
-      },
-      "0_0_0-5_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     5,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-5_0_0"
-      },
-      "0_0_0-6_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     6,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-6_0_0"
-      },
-      "0_0_0-7_0_0": {
-         "type": "patterns",
-         "parameters": {
-            "patterns": [
-               [
-                  [
-                     0,
-                     0,
-                     0
-                  ],
-                  [
-                     7,
-                     0,
-                     0
-                  ]
-               ]
-            ]
-         },
-         "morphology_name": "0_0_0-7_0_0"
-      }
-   },
-   "species": {
-      "parents": {},
-      "species_id": "",
-      "class": "toy",
-      "brand": "gazebo",
-      "model": "smart_car"
-   },
-   "blueprint": {
-      "_____10c-___pwr-cx-subgrp-t": "",
-      "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
-      "_____10c-___pwr-cx-de_gen-f": 0.01,
-      "_____10c-___pwr-cx-pspuni-b": false,
-      "_____10c-___pwr-nx-pstcrm-f": 35,
-      "_____10c-___pwr-cx-dstmap-d": {},
-      "_____10c-___pwr-cx-___bbx-i": 1,
-      "_____10c-___pwr-cx-___bby-i": 1,
-      "_____10c-___pwr-cx-___bbz-i": 1,
-      "_____10c-___pwr-cx-rcordx-i": 10,
-      "_____10c-___pwr-cx-rcordy-i": 0,
-      "_____10c-___pwr-cx-rcordz-i": -20,
-      "_____10c-___pwr-cx-2dcorx-i": -319,
-      "_____10c-___pwr-cx-2dcory-i": -682,
-      "_____10c-___pwr-cx-gd_vis-b": true,
-      "_____10c-___pwr-nx-pstcr_-f": 500,
-      "_____10c-___pwr-nx-fire_t-f": 1,
-      "_____10c-___pwr-nx-refrac-i": 0,
-      "_____10c-___pwr-nx-leak_c-f": 10,
-      "_____10c-___pwr-nx-leak_v-f": 0,
-      "_____10c-___pwr-nx-c_fr_c-i": 3,
-      "_____10c-___pwr-nx-snooze-f": 0,
-      "_____10c-___pwr-nx-ftincx-f": 0,
-      "_____10c-___pwr-nx-ftincy-f": 0,
-      "_____10c-___pwr-nx-ftincz-f": 0,
-      "_____10c-___pwr-nx-fthlim-i": 0,
-      "_____10c-___pwr-nx-mp_acc-b": true,
-      "_____10c-___pwr-nx-mp_psp-b": false,
-      "_____10c-___pwr-cx-memory-b": false,
-      "_____10c-___pwr-cx-mem__t-i": 100,
-      "_____10c-___pwr-cx-mem_gr-i": 1,
-      "_____10c-___pwr-cx-mem_ls-i": 9,
-      "_____10c-___pwr-cx-__name-t": "Brain_Power",
-      "_____10c-___pwr-cx-_group-t": "CORE",
-      "_____10c-o__mot-cx-subgrp-t": "",
-      "_____10c-o__mot-cx-_n_cnt-i": 1,
-      "_____10c-o__mot-cx-synatt-i": 100,
-      "_____10c-o__mot-cx-de_gen-f": 0,
-      "_____10c-o__mot-cx-pspuni-b": false,
-      "_____10c-o__mot-nx-pstcrm-f": 35,
-      "_____10c-o__mot-cx-dstmap-d": {},
-      "_____10c-o__mot-cx-___bbx-i": 8,
-      "_____10c-o__mot-cx-___bby-i": 1,
-      "_____10c-o__mot-cx-___bbz-i": 1,
-      "_____10c-o__mot-cx-rcordx-i": -31,
-      "_____10c-o__mot-cx-rcordy-i": 0,
-      "_____10c-o__mot-cx-rcordz-i": -22,
-      "_____10c-o__mot-cx-2dcorx-i": 2083,
-      "_____10c-o__mot-cx-2dcory-i": 187,
-      "_____10c-o__mot-cx-gd_vis-b": true,
-      "_____10c-o__mot-nx-pstcr_-f": 6,
-      "_____10c-o__mot-nx-fire_t-f": 1,
-      "_____10c-o__mot-nx-refrac-i": 0,
-      "_____10c-o__mot-nx-leak_c-f": 0,
-      "_____10c-o__mot-nx-leak_v-f": 0,
-      "_____10c-o__mot-nx-c_fr_c-i": 0,
-      "_____10c-o__mot-nx-snooze-f": 0,
-      "_____10c-o__mot-nx-ftincx-f": 0,
-      "_____10c-o__mot-nx-ftincy-f": 0,
-      "_____10c-o__mot-nx-ftincz-f": 0,
-      "_____10c-o__mot-nx-fthlim-i": 0,
-      "_____10c-o__mot-nx-mp_acc-b": false,
-      "_____10c-o__mot-nx-mp_psp-b": false,
-      "_____10c-o__mot-cx-memory-b": false,
-      "_____10c-o__mot-cx-mem__t-i": 100,
-      "_____10c-o__mot-cx-mem_gr-i": 1,
-      "_____10c-o__mot-cx-mem_ls-i": 9,
-      "_____10c-o__mot-cx-__name-t": "motor_opu",
-      "_____10c-o__mot-cx-_group-t": "OPU",
-      "_____10c-m__lef-cx-subgrp-t": "",
-      "_____10c-m__lef-cx-_n_cnt-i": 1,
-      "_____10c-m__lef-cx-synatt-i": 100,
-      "_____10c-m__lef-cx-de_gen-f": 0,
-      "_____10c-m__lef-cx-pspuni-b": true,
-      "_____10c-m__lef-nx-pstcrm-f": 35,
-      "_____10c-m__lef-cx-dstmap-d": {},
-      "_____10c-m__lef-cx-___bbx-i": 1,
-      "_____10c-m__lef-cx-___bby-i": 1,
-      "_____10c-m__lef-cx-___bbz-i": 1,
-      "_____10c-m__lef-cx-rcordx-i": -48,
-      "_____10c-m__lef-cx-rcordy-i": 0,
-      "_____10c-m__lef-cx-rcordz-i": 5,
-      "_____10c-m__lef-cx-2dcorx-i": 887,
-      "_____10c-m__lef-cx-2dcory-i": 533,
-      "_____10c-m__lef-cx-gd_vis-b": true,
-      "_____10c-m__lef-nx-pstcr_-f": 5,
-      "_____10c-m__lef-nx-fire_t-f": 1,
-      "_____10c-m__lef-nx-refrac-i": 0,
-      "_____10c-m__lef-nx-leak_c-f": 10,
-      "_____10c-m__lef-nx-leak_v-f": 0,
-      "_____10c-m__lef-nx-c_fr_c-i": 3,
-      "_____10c-m__lef-nx-snooze-f": 0,
-      "_____10c-m__lef-nx-ftincx-f": 0,
-      "_____10c-m__lef-nx-ftincy-f": 0,
-      "_____10c-m__lef-nx-ftincz-f": 0,
-      "_____10c-m__lef-nx-fthlim-i": 0,
-      "_____10c-m__lef-nx-mp_acc-b": true,
-      "_____10c-m__lef-nx-mp_psp-b": false,
-      "_____10c-m__lef-cx-memory-b": false,
-      "_____10c-m__lef-cx-mem__t-i": 100,
-      "_____10c-m__lef-cx-mem_gr-i": 1,
-      "_____10c-m__lef-cx-mem_ls-i": 9,
-      "_____10c-m__lef-cx-__name-t": "turn_left",
-      "_____10c-m__lef-cx-_group-t": "CUSTOM",
-      "_____10c-m__rig-cx-subgrp-t": "",
-      "_____10c-m__rig-cx-_n_cnt-i": 1,
-      "_____10c-m__rig-cx-synatt-i": 100,
-      "_____10c-m__rig-cx-de_gen-f": 0,
-      "_____10c-m__rig-cx-pspuni-b": true,
-      "_____10c-m__rig-nx-pstcrm-f": 35,
-      "_____10c-m__rig-cx-dstmap-d": {},
-      "_____10c-m__rig-cx-___bbx-i": 1,
-      "_____10c-m__rig-cx-___bby-i": 1,
-      "_____10c-m__rig-cx-___bbz-i": 1,
-      "_____10c-m__rig-cx-rcordx-i": -28,
-      "_____10c-m__rig-cx-rcordy-i": 0,
-      "_____10c-m__rig-cx-rcordz-i": 5,
-      "_____10c-m__rig-cx-2dcorx-i": 896,
-      "_____10c-m__rig-cx-2dcory-i": 239,
-      "_____10c-m__rig-cx-gd_vis-b": true,
-      "_____10c-m__rig-nx-pstcr_-f": 5,
-      "_____10c-m__rig-nx-fire_t-f": 1,
-      "_____10c-m__rig-nx-refrac-i": 0,
-      "_____10c-m__rig-nx-leak_c-f": 10,
-      "_____10c-m__rig-nx-leak_v-f": 0,
-      "_____10c-m__rig-nx-c_fr_c-i": 3,
-      "_____10c-m__rig-nx-snooze-f": 0,
-      "_____10c-m__rig-nx-ftincx-f": 0,
-      "_____10c-m__rig-nx-ftincy-f": 0,
-      "_____10c-m__rig-nx-ftincz-f": 0,
-      "_____10c-m__rig-nx-fthlim-i": 0,
-      "_____10c-m__rig-nx-mp_acc-b": true,
-      "_____10c-m__rig-nx-mp_psp-b": false,
-      "_____10c-m__rig-cx-memory-b": false,
-      "_____10c-m__rig-cx-mem__t-i": 100,
-      "_____10c-m__rig-cx-mem_gr-i": 1,
-      "_____10c-m__rig-cx-mem_ls-i": 9,
-      "_____10c-m__rig-cx-__name-t": "turn_right",
-      "_____10c-m__rig-cx-_group-t": "CUSTOM",
-      "_____10c-m__for-cx-subgrp-t": "",
-      "_____10c-m__for-cx-_n_cnt-i": 1,
-      "_____10c-m__for-cx-synatt-i": 100,
-      "_____10c-m__for-cx-de_gen-f": 0,
-      "_____10c-m__for-cx-pspuni-b": true,
-      "_____10c-m__for-nx-pstcrm-f": 35,
-      "_____10c-m__for-cx-dstmap-d": {
-         "CRSMot": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CKQM2_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CO4M3_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CTGM4_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-m__for-cx-___bbx-i": 1,
-      "_____10c-m__for-cx-___bby-i": 1,
-      "_____10c-m__for-cx-___bbz-i": 1,
-      "_____10c-m__for-cx-rcordx-i": -38,
-      "_____10c-m__for-cx-rcordy-i": 0,
-      "_____10c-m__for-cx-rcordz-i": 0,
-      "_____10c-m__for-cx-2dcorx-i": 894,
-      "_____10c-m__for-cx-2dcory-i": -204,
-      "_____10c-m__for-cx-gd_vis-b": true,
-      "_____10c-m__for-nx-pstcr_-f": 5,
-      "_____10c-m__for-nx-fire_t-f": 1,
-      "_____10c-m__for-nx-refrac-i": 0,
-      "_____10c-m__for-nx-leak_c-f": 10,
-      "_____10c-m__for-nx-leak_v-f": 0,
-      "_____10c-m__for-nx-c_fr_c-i": 3,
-      "_____10c-m__for-nx-snooze-f": 0,
-      "_____10c-m__for-nx-ftincx-f": 0,
-      "_____10c-m__for-nx-ftincy-f": 0,
-      "_____10c-m__for-nx-ftincz-f": 0,
-      "_____10c-m__for-nx-fthlim-i": 0,
-      "_____10c-m__for-nx-mp_acc-b": true,
-      "_____10c-m__for-nx-mp_psp-b": false,
-      "_____10c-m__for-cx-memory-b": false,
-      "_____10c-m__for-cx-mem__t-i": 100,
-      "_____10c-m__for-cx-mem_gr-i": 1,
-      "_____10c-m__for-cx-mem_ls-i": 9,
-      "_____10c-m__for-cx-__name-t": "forward",
-      "_____10c-m__for-cx-_group-t": "CUSTOM",
-      "_____10c-m__bac-cx-subgrp-t": "",
-      "_____10c-m__bac-cx-_n_cnt-i": 1,
-      "_____10c-m__bac-cx-synatt-i": 100,
-      "_____10c-m__bac-cx-de_gen-f": 0,
-      "_____10c-m__bac-cx-pspuni-b": true,
-      "_____10c-m__bac-nx-pstcrm-f": 35,
-      "_____10c-m__bac-cx-dstmap-d": {
-         "CLWM4_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CJWM3_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CKYM2_": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ],
-         "CIHMot": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-m__bac-cx-___bbx-i": 1,
-      "_____10c-m__bac-cx-___bby-i": 1,
-      "_____10c-m__bac-cx-___bbz-i": 1,
-      "_____10c-m__bac-cx-rcordx-i": -38,
-      "_____10c-m__bac-cx-rcordy-i": 0,
-      "_____10c-m__bac-cx-rcordz-i": 10,
-      "_____10c-m__bac-cx-2dcorx-i": 892,
-      "_____10c-m__bac-cx-2dcory-i": 859,
-      "_____10c-m__bac-cx-gd_vis-b": true,
-      "_____10c-m__bac-nx-pstcr_-f": 5,
-      "_____10c-m__bac-nx-fire_t-f": 1,
-      "_____10c-m__bac-nx-refrac-i": 0,
-      "_____10c-m__bac-nx-leak_c-f": 10,
-      "_____10c-m__bac-nx-leak_v-f": 0,
-      "_____10c-m__bac-nx-c_fr_c-i": 3,
-      "_____10c-m__bac-nx-snooze-f": 0,
-      "_____10c-m__bac-nx-ftincx-f": 0,
-      "_____10c-m__bac-nx-ftincy-f": 0,
-      "_____10c-m__bac-nx-ftincz-f": 0,
-      "_____10c-m__bac-nx-fthlim-i": 0,
-      "_____10c-m__bac-nx-mp_acc-b": true,
-      "_____10c-m__bac-nx-mp_psp-b": false,
-      "_____10c-m__bac-cx-memory-b": false,
-      "_____10c-m__bac-cx-mem__t-i": 100,
-      "_____10c-m__bac-cx-mem_gr-i": 1,
-      "_____10c-m__bac-cx-mem_ls-i": 9,
-      "_____10c-m__bac-cx-__name-t": "backward",
-      "_____10c-m__bac-cx-_group-t": "CUSTOM",
-      "_____10c-iv00_C-cx-subgrp-t": "",
-      "_____10c-iv00_C-cx-_n_cnt-i": 1,
-      "_____10c-iv00_C-cx-synatt-i": 100,
-      "_____10c-iv00_C-cx-de_gen-f": 0.0,
-      "_____10c-iv00_C-cx-pspuni-b": false,
-      "_____10c-iv00_C-nx-pstcrm-f": 100.0,
-      "_____10c-iv00_C-cx-dstmap-d": {},
-      "_____10c-iv00_C-cx-___bbx-i": 64,
-      "_____10c-iv00_C-cx-___bby-i": 64,
-      "_____10c-iv00_C-cx-___bbz-i": 3,
-      "_____10c-iv00_C-cx-rcordx-i": 30,
-      "_____10c-iv00_C-cx-rcordy-i": 40,
-      "_____10c-iv00_C-cx-rcordz-i": -20,
-      "_____10c-iv00_C-cx-2dcorx-i": -262,
-      "_____10c-iv00_C-cx-2dcory-i": 127,
-      "_____10c-iv00_C-cx-gd_vis-b": true,
-      "_____10c-iv00_C-nx-pstcr_-f": 25.0,
-      "_____10c-iv00_C-nx-fire_t-f": 1.0,
-      "_____10c-iv00_C-nx-refrac-i": 0,
-      "_____10c-iv00_C-nx-leak_c-f": 0,
-      "_____10c-iv00_C-nx-leak_v-f": 0,
-      "_____10c-iv00_C-nx-c_fr_c-i": 3,
-      "_____10c-iv00_C-nx-snooze-f": 0,
-      "_____10c-iv00_C-nx-ftincx-f": 0,
-      "_____10c-iv00_C-nx-ftincy-f": 0,
-      "_____10c-iv00_C-nx-ftincz-f": 0,
-      "_____10c-iv00_C-nx-fthlim-i": 0,
-      "_____10c-iv00_C-nx-mp_acc-b": true,
-      "_____10c-iv00_C-nx-mp_psp-b": false,
-      "_____10c-iv00_C-cx-memory-b": false,
-      "_____10c-iv00_C-cx-mem__t-i": 100,
-      "_____10c-iv00_C-cx-mem_gr-i": 1,
-      "_____10c-iv00_C-cx-mem_ls-i": 9,
-      "_____10c-iv00_C-cx-__name-t": "vision_C",
-      "_____10c-iv00_C-cx-_group-t": "IPU",
-      "_____10c-iv00BL-cx-subgrp-t": "",
-      "_____10c-iv00BL-cx-_n_cnt-i": 1,
-      "_____10c-iv00BL-cx-synatt-i": 100,
-      "_____10c-iv00BL-cx-de_gen-f": 0,
-      "_____10c-iv00BL-cx-pspuni-b": false,
-      "_____10c-iv00BL-nx-pstcrm-f": 35,
-      "_____10c-iv00BL-cx-dstmap-d": {},
-      "_____10c-iv00BL-cx-___bbx-i": 8,
-      "_____10c-iv00BL-cx-___bby-i": 8,
-      "_____10c-iv00BL-cx-___bbz-i": 3,
-      "_____10c-iv00BL-cx-rcordx-i": 20,
-      "_____10c-iv00BL-cx-rcordy-i": 30,
-      "_____10c-iv00BL-cx-rcordz-i": -20,
-      "_____10c-iv00BL-cx-2dcorx-i": -614,
-      "_____10c-iv00BL-cx-2dcory-i": 317,
-      "_____10c-iv00BL-cx-gd_vis-b": true,
-      "_____10c-iv00BL-nx-pstcr_-f": 5,
-      "_____10c-iv00BL-nx-fire_t-f": 1,
-      "_____10c-iv00BL-nx-refrac-i": 0,
-      "_____10c-iv00BL-nx-leak_c-f": 0,
-      "_____10c-iv00BL-nx-leak_v-f": 0,
-      "_____10c-iv00BL-nx-c_fr_c-i": 3,
-      "_____10c-iv00BL-nx-snooze-f": 0,
-      "_____10c-iv00BL-nx-ftincx-f": 0,
-      "_____10c-iv00BL-nx-ftincy-f": 0,
-      "_____10c-iv00BL-nx-ftincz-f": 0,
-      "_____10c-iv00BL-nx-fthlim-i": 0,
-      "_____10c-iv00BL-nx-mp_acc-b": true,
-      "_____10c-iv00BL-nx-mp_psp-b": false,
-      "_____10c-iv00BL-cx-memory-b": false,
-      "_____10c-iv00BL-cx-mem__t-i": 100,
-      "_____10c-iv00BL-cx-mem_gr-i": 1,
-      "_____10c-iv00BL-cx-mem_ls-i": 9,
-      "_____10c-iv00BL-cx-__name-t": "vision_LL",
-      "_____10c-iv00BL-cx-_group-t": "IPU",
-      "_____10c-iv00BM-cx-subgrp-t": "",
-      "_____10c-iv00BM-cx-_n_cnt-i": 1,
-      "_____10c-iv00BM-cx-synatt-i": 100,
-      "_____10c-iv00BM-cx-de_gen-f": 0,
-      "_____10c-iv00BM-cx-pspuni-b": false,
-      "_____10c-iv00BM-nx-pstcrm-f": 35,
-      "_____10c-iv00BM-cx-dstmap-d": {
-         "m__bac": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-iv00BM-cx-___bbx-i": 8,
-      "_____10c-iv00BM-cx-___bby-i": 8,
-      "_____10c-iv00BM-cx-___bbz-i": 3,
-      "_____10c-iv00BM-cx-rcordx-i": 55,
-      "_____10c-iv00BM-cx-rcordy-i": 30,
-      "_____10c-iv00BM-cx-rcordz-i": -20,
-      "_____10c-iv00BM-cx-2dcorx-i": -253,
-      "_____10c-iv00BM-cx-2dcory-i": 324,
-      "_____10c-iv00BM-cx-gd_vis-b": true,
-      "_____10c-iv00BM-nx-pstcr_-f": 5,
-      "_____10c-iv00BM-nx-fire_t-f": 1,
-      "_____10c-iv00BM-nx-refrac-i": 0,
-      "_____10c-iv00BM-nx-leak_c-f": 0,
-      "_____10c-iv00BM-nx-leak_v-f": 0,
-      "_____10c-iv00BM-nx-c_fr_c-i": 3,
-      "_____10c-iv00BM-nx-snooze-f": 0,
-      "_____10c-iv00BM-nx-ftincx-f": 0,
-      "_____10c-iv00BM-nx-ftincy-f": 0,
-      "_____10c-iv00BM-nx-ftincz-f": 0,
-      "_____10c-iv00BM-nx-fthlim-i": 0,
-      "_____10c-iv00BM-nx-mp_acc-b": true,
-      "_____10c-iv00BM-nx-mp_psp-b": false,
-      "_____10c-iv00BM-cx-memory-b": false,
-      "_____10c-iv00BM-cx-mem__t-i": 100,
-      "_____10c-iv00BM-cx-mem_gr-i": 1,
-      "_____10c-iv00BM-cx-mem_ls-i": 9,
-      "_____10c-iv00BM-cx-__name-t": "vision_LM",
-      "_____10c-iv00BM-cx-_group-t": "IPU",
-      "_____10c-iv00BR-cx-subgrp-t": "",
-      "_____10c-iv00BR-cx-_n_cnt-i": 1,
-      "_____10c-iv00BR-cx-synatt-i": 100,
-      "_____10c-iv00BR-cx-de_gen-f": 0,
-      "_____10c-iv00BR-cx-pspuni-b": false,
-      "_____10c-iv00BR-nx-pstcrm-f": 35,
-      "_____10c-iv00BR-cx-dstmap-d": {},
-      "_____10c-iv00BR-cx-___bbx-i": 8,
-      "_____10c-iv00BR-cx-___bby-i": 8,
-      "_____10c-iv00BR-cx-___bbz-i": 3,
-      "_____10c-iv00BR-cx-rcordx-i": 95,
-      "_____10c-iv00BR-cx-rcordy-i": 30,
-      "_____10c-iv00BR-cx-rcordz-i": -20,
-      "_____10c-iv00BR-cx-2dcorx-i": 86,
-      "_____10c-iv00BR-cx-2dcory-i": 319,
-      "_____10c-iv00BR-cx-gd_vis-b": true,
-      "_____10c-iv00BR-nx-pstcr_-f": 5,
-      "_____10c-iv00BR-nx-fire_t-f": 1,
-      "_____10c-iv00BR-nx-refrac-i": 0,
-      "_____10c-iv00BR-nx-leak_c-f": 0,
-      "_____10c-iv00BR-nx-leak_v-f": 0,
-      "_____10c-iv00BR-nx-c_fr_c-i": 3,
-      "_____10c-iv00BR-nx-snooze-f": 0,
-      "_____10c-iv00BR-nx-ftincx-f": 0,
-      "_____10c-iv00BR-nx-ftincy-f": 0,
-      "_____10c-iv00BR-nx-ftincz-f": 0,
-      "_____10c-iv00BR-nx-fthlim-i": 0,
-      "_____10c-iv00BR-nx-mp_acc-b": true,
-      "_____10c-iv00BR-nx-mp_psp-b": false,
-      "_____10c-iv00BR-cx-memory-b": false,
-      "_____10c-iv00BR-cx-mem__t-i": 100,
-      "_____10c-iv00BR-cx-mem_gr-i": 1,
-      "_____10c-iv00BR-cx-mem_ls-i": 9,
-      "_____10c-iv00BR-cx-__name-t": "vision_LR",
-      "_____10c-iv00BR-cx-_group-t": "IPU",
-      "_____10c-iv00ML-cx-subgrp-t": "",
-      "_____10c-iv00ML-cx-_n_cnt-i": 1,
-      "_____10c-iv00ML-cx-synatt-i": 100,
-      "_____10c-iv00ML-cx-de_gen-f": 0,
-      "_____10c-iv00ML-cx-pspuni-b": false,
-      "_____10c-iv00ML-nx-pstcrm-f": 35,
-      "_____10c-iv00ML-cx-dstmap-d": {},
-      "_____10c-iv00ML-cx-___bbx-i": 8,
-      "_____10c-iv00ML-cx-___bby-i": 8,
-      "_____10c-iv00ML-cx-___bbz-i": 3,
-      "_____10c-iv00ML-cx-rcordx-i": 20,
-      "_____10c-iv00ML-cx-rcordy-i": 70,
-      "_____10c-iv00ML-cx-rcordz-i": -20,
-      "_____10c-iv00ML-cx-2dcorx-i": -609,
-      "_____10c-iv00ML-cx-2dcory-i": 129,
-      "_____10c-iv00ML-cx-gd_vis-b": true,
-      "_____10c-iv00ML-nx-pstcr_-f": 5,
-      "_____10c-iv00ML-nx-fire_t-f": 1,
-      "_____10c-iv00ML-nx-refrac-i": 0,
-      "_____10c-iv00ML-nx-leak_c-f": 0,
-      "_____10c-iv00ML-nx-leak_v-f": 0,
-      "_____10c-iv00ML-nx-c_fr_c-i": 3,
-      "_____10c-iv00ML-nx-snooze-f": 0,
-      "_____10c-iv00ML-nx-ftincx-f": 0,
-      "_____10c-iv00ML-nx-ftincy-f": 0,
-      "_____10c-iv00ML-nx-ftincz-f": 0,
-      "_____10c-iv00ML-nx-fthlim-i": 0,
-      "_____10c-iv00ML-nx-mp_acc-b": true,
-      "_____10c-iv00ML-nx-mp_psp-b": false,
-      "_____10c-iv00ML-cx-memory-b": false,
-      "_____10c-iv00ML-cx-mem__t-i": 100,
-      "_____10c-iv00ML-cx-mem_gr-i": 1,
-      "_____10c-iv00ML-cx-mem_ls-i": 9,
-      "_____10c-iv00ML-cx-__name-t": "vision_ML",
-      "_____10c-iv00ML-cx-_group-t": "IPU",
-      "_____10c-iv00MR-cx-subgrp-t": "",
-      "_____10c-iv00MR-cx-_n_cnt-i": 1,
-      "_____10c-iv00MR-cx-synatt-i": 100,
-      "_____10c-iv00MR-cx-de_gen-f": 0,
-      "_____10c-iv00MR-cx-pspuni-b": false,
-      "_____10c-iv00MR-nx-pstcrm-f": 35,
-      "_____10c-iv00MR-cx-dstmap-d": {},
-      "_____10c-iv00MR-cx-___bbx-i": 8,
-      "_____10c-iv00MR-cx-___bby-i": 8,
-      "_____10c-iv00MR-cx-___bbz-i": 3,
-      "_____10c-iv00MR-cx-rcordx-i": 95,
-      "_____10c-iv00MR-cx-rcordy-i": 70,
-      "_____10c-iv00MR-cx-rcordz-i": -20,
-      "_____10c-iv00MR-cx-2dcorx-i": 81,
-      "_____10c-iv00MR-cx-2dcory-i": 131,
-      "_____10c-iv00MR-cx-gd_vis-b": true,
-      "_____10c-iv00MR-nx-pstcr_-f": 5,
-      "_____10c-iv00MR-nx-fire_t-f": 1,
-      "_____10c-iv00MR-nx-refrac-i": 0,
-      "_____10c-iv00MR-nx-leak_c-f": 0,
-      "_____10c-iv00MR-nx-leak_v-f": 0,
-      "_____10c-iv00MR-nx-c_fr_c-i": 3,
-      "_____10c-iv00MR-nx-snooze-f": 0,
-      "_____10c-iv00MR-nx-ftincx-f": 0,
-      "_____10c-iv00MR-nx-ftincy-f": 0,
-      "_____10c-iv00MR-nx-ftincz-f": 0,
-      "_____10c-iv00MR-nx-fthlim-i": 0,
-      "_____10c-iv00MR-nx-mp_acc-b": true,
-      "_____10c-iv00MR-nx-mp_psp-b": false,
-      "_____10c-iv00MR-cx-memory-b": false,
-      "_____10c-iv00MR-cx-mem__t-i": 100,
-      "_____10c-iv00MR-cx-mem_gr-i": 1,
-      "_____10c-iv00MR-cx-mem_ls-i": 9,
-      "_____10c-iv00MR-cx-__name-t": "vision_MR",
-      "_____10c-iv00MR-cx-_group-t": "IPU",
-      "_____10c-iv00TL-cx-subgrp-t": "",
-      "_____10c-iv00TL-cx-_n_cnt-i": 1,
-      "_____10c-iv00TL-cx-synatt-i": 100,
-      "_____10c-iv00TL-cx-de_gen-f": 0,
-      "_____10c-iv00TL-cx-pspuni-b": false,
-      "_____10c-iv00TL-nx-pstcrm-f": 35,
-      "_____10c-iv00TL-cx-dstmap-d": {},
-      "_____10c-iv00TL-cx-___bbx-i": 8,
-      "_____10c-iv00TL-cx-___bby-i": 8,
-      "_____10c-iv00TL-cx-___bbz-i": 3,
-      "_____10c-iv00TL-cx-rcordx-i": 20,
-      "_____10c-iv00TL-cx-rcordy-i": 105,
-      "_____10c-iv00TL-cx-rcordz-i": -20,
-      "_____10c-iv00TL-cx-2dcorx-i": -606,
-      "_____10c-iv00TL-cx-2dcory-i": -61,
-      "_____10c-iv00TL-cx-gd_vis-b": true,
-      "_____10c-iv00TL-nx-pstcr_-f": 5,
-      "_____10c-iv00TL-nx-fire_t-f": 1,
-      "_____10c-iv00TL-nx-refrac-i": 0,
-      "_____10c-iv00TL-nx-leak_c-f": 0,
-      "_____10c-iv00TL-nx-leak_v-f": 0,
-      "_____10c-iv00TL-nx-c_fr_c-i": 3,
-      "_____10c-iv00TL-nx-snooze-f": 0,
-      "_____10c-iv00TL-nx-ftincx-f": 0,
-      "_____10c-iv00TL-nx-ftincy-f": 0,
-      "_____10c-iv00TL-nx-ftincz-f": 0,
-      "_____10c-iv00TL-nx-fthlim-i": 0,
-      "_____10c-iv00TL-nx-mp_acc-b": true,
-      "_____10c-iv00TL-nx-mp_psp-b": false,
-      "_____10c-iv00TL-cx-memory-b": false,
-      "_____10c-iv00TL-cx-mem__t-i": 100,
-      "_____10c-iv00TL-cx-mem_gr-i": 1,
-      "_____10c-iv00TL-cx-mem_ls-i": 9,
-      "_____10c-iv00TL-cx-__name-t": "vision_TL",
-      "_____10c-iv00TL-cx-_group-t": "IPU",
-      "_____10c-iv00TR-cx-subgrp-t": "",
-      "_____10c-iv00TR-cx-_n_cnt-i": 1,
-      "_____10c-iv00TR-cx-synatt-i": 100,
-      "_____10c-iv00TR-cx-de_gen-f": 0,
-      "_____10c-iv00TR-cx-pspuni-b": false,
-      "_____10c-iv00TR-nx-pstcrm-f": 35,
-      "_____10c-iv00TR-cx-dstmap-d": {},
-      "_____10c-iv00TR-cx-___bbx-i": 8,
-      "_____10c-iv00TR-cx-___bby-i": 8,
-      "_____10c-iv00TR-cx-___bbz-i": 3,
-      "_____10c-iv00TR-cx-rcordx-i": 95,
-      "_____10c-iv00TR-cx-rcordy-i": 105,
-      "_____10c-iv00TR-cx-rcordz-i": -20,
-      "_____10c-iv00TR-cx-2dcorx-i": 72,
-      "_____10c-iv00TR-cx-2dcory-i": -62,
-      "_____10c-iv00TR-cx-gd_vis-b": true,
-      "_____10c-iv00TR-nx-pstcr_-f": 5,
-      "_____10c-iv00TR-nx-fire_t-f": 1,
-      "_____10c-iv00TR-nx-refrac-i": 0,
-      "_____10c-iv00TR-nx-leak_c-f": 0,
-      "_____10c-iv00TR-nx-leak_v-f": 0,
-      "_____10c-iv00TR-nx-c_fr_c-i": 3,
-      "_____10c-iv00TR-nx-snooze-f": 0,
-      "_____10c-iv00TR-nx-ftincx-f": 0,
-      "_____10c-iv00TR-nx-ftincy-f": 0,
-      "_____10c-iv00TR-nx-ftincz-f": 0,
-      "_____10c-iv00TR-nx-fthlim-i": 0,
-      "_____10c-iv00TR-nx-mp_acc-b": true,
-      "_____10c-iv00TR-nx-mp_psp-b": false,
-      "_____10c-iv00TR-cx-memory-b": false,
-      "_____10c-iv00TR-cx-mem__t-i": 100,
-      "_____10c-iv00TR-cx-mem_gr-i": 1,
-      "_____10c-iv00TR-cx-mem_ls-i": 9,
-      "_____10c-iv00TR-cx-__name-t": "vision_TR",
-      "_____10c-iv00TR-cx-_group-t": "IPU",
-      "_____10c-iv00TM-cx-subgrp-t": "",
-      "_____10c-iv00TM-cx-_n_cnt-i": 1,
-      "_____10c-iv00TM-cx-synatt-i": 100,
-      "_____10c-iv00TM-cx-de_gen-f": 0,
-      "_____10c-iv00TM-cx-pspuni-b": false,
-      "_____10c-iv00TM-nx-pstcrm-f": 35,
-      "_____10c-iv00TM-cx-dstmap-d": {
-         "m__for": [
-            [
-               "projector",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-iv00TM-cx-___bbx-i": 8,
-      "_____10c-iv00TM-cx-___bby-i": 8,
-      "_____10c-iv00TM-cx-___bbz-i": 3,
-      "_____10c-iv00TM-cx-rcordx-i": 55,
-      "_____10c-iv00TM-cx-rcordy-i": 105,
-      "_____10c-iv00TM-cx-rcordz-i": -20,
-      "_____10c-iv00TM-cx-2dcorx-i": -271,
-      "_____10c-iv00TM-cx-2dcory-i": -65,
-      "_____10c-iv00TM-cx-gd_vis-b": true,
-      "_____10c-iv00TM-nx-pstcr_-f": 5,
-      "_____10c-iv00TM-nx-fire_t-f": 1,
-      "_____10c-iv00TM-nx-refrac-i": 0,
-      "_____10c-iv00TM-nx-leak_c-f": 0,
-      "_____10c-iv00TM-nx-leak_v-f": 0,
-      "_____10c-iv00TM-nx-c_fr_c-i": 3,
-      "_____10c-iv00TM-nx-snooze-f": 0,
-      "_____10c-iv00TM-nx-ftincx-f": 0,
-      "_____10c-iv00TM-nx-ftincy-f": 0,
-      "_____10c-iv00TM-nx-ftincz-f": 0,
-      "_____10c-iv00TM-nx-fthlim-i": 0,
-      "_____10c-iv00TM-nx-mp_acc-b": true,
-      "_____10c-iv00TM-nx-mp_psp-b": false,
-      "_____10c-iv00TM-cx-memory-b": false,
-      "_____10c-iv00TM-cx-mem__t-i": 100,
-      "_____10c-iv00TM-cx-mem_gr-i": 1,
-      "_____10c-iv00TM-cx-mem_ls-i": 9,
-      "_____10c-iv00TM-cx-__name-t": "vision_TM",
-      "_____10c-iv00TM-cx-_group-t": "IPU",
-      "_____10c-CRSMot-cx-subgrp-t": "",
-      "_____10c-CRSMot-cx-_n_cnt-i": 1,
-      "_____10c-CRSMot-cx-synatt-i": 100,
-      "_____10c-CRSMot-cx-de_gen-f": 0,
-      "_____10c-CRSMot-cx-pspuni-b": false,
-      "_____10c-CRSMot-nx-pstcrm-f": 99999,
-      "_____10c-CRSMot-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-_0_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CRSMot-cx-gd_vis-b": true,
-      "_____10c-CRSMot-nx-pstcr_-f": 1,
-      "_____10c-CRSMot-nx-fire_t-f": 1,
-      "_____10c-CRSMot-nx-refrac-i": 0,
-      "_____10c-CRSMot-nx-leak_c-f": 0,
-      "_____10c-CRSMot-nx-leak_v-f": 0,
-      "_____10c-CRSMot-nx-c_fr_c-i": 0,
-      "_____10c-CRSMot-nx-snooze-f": 0,
-      "_____10c-CRSMot-nx-ftincx-f": 0,
-      "_____10c-CRSMot-nx-ftincy-f": 0,
-      "_____10c-CRSMot-nx-ftincz-f": 0,
-      "_____10c-CRSMot-nx-fthlim-i": 0,
-      "_____10c-CRSMot-nx-mp_acc-b": false,
-      "_____10c-CRSMot-nx-mp_psp-b": false,
-      "_____10c-CRSMot-cx-memory-b": false,
-      "_____10c-CRSMot-cx-mem__t-i": 100,
-      "_____10c-CRSMot-cx-mem_gr-i": 1,
-      "_____10c-CRSMot-cx-mem_ls-i": 9,
-      "_____10c-CRSMot-cx-__name-t": "M1_FW",
-      "_____10c-CRSMot-cx-___bbx-i": 1,
-      "_____10c-CRSMot-cx-___bby-i": 1,
-      "_____10c-CRSMot-cx-___bbz-i": 1,
-      "_____10c-CRSMot-cx-rcordx-i": -50,
-      "_____10c-CRSMot-cx-rcordy-i": 0,
-      "_____10c-CRSMot-cx-rcordz-i": -14,
-      "_____10c-CRSMot-cx-2dcorx-i": 1503,
-      "_____10c-CRSMot-cx-2dcory-i": -284,
-      "_____10c-CRSMot-cx-_group-t": "CUSTOM",
-      "_____10c-CIHMot-cx-subgrp-t": "",
-      "_____10c-CIHMot-cx-_n_cnt-i": 1,
-      "_____10c-CIHMot-cx-synatt-i": 100,
-      "_____10c-CIHMot-cx-de_gen-f": 0,
-      "_____10c-CIHMot-cx-pspuni-b": false,
-      "_____10c-CIHMot-nx-pstcrm-f": 99999,
-      "_____10c-CIHMot-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-1_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CIHMot-cx-gd_vis-b": true,
-      "_____10c-CIHMot-nx-pstcr_-f": 1,
-      "_____10c-CIHMot-nx-fire_t-f": 1,
-      "_____10c-CIHMot-nx-refrac-i": 0,
-      "_____10c-CIHMot-nx-leak_c-f": 0,
-      "_____10c-CIHMot-nx-leak_v-f": 0,
-      "_____10c-CIHMot-nx-c_fr_c-i": 0,
-      "_____10c-CIHMot-nx-snooze-f": 0,
-      "_____10c-CIHMot-nx-ftincx-f": 0,
-      "_____10c-CIHMot-nx-ftincy-f": 0,
-      "_____10c-CIHMot-nx-ftincz-f": 0,
-      "_____10c-CIHMot-nx-fthlim-i": 0,
-      "_____10c-CIHMot-nx-mp_acc-b": false,
-      "_____10c-CIHMot-nx-mp_psp-b": false,
-      "_____10c-CIHMot-cx-memory-b": false,
-      "_____10c-CIHMot-cx-mem__t-i": 100,
-      "_____10c-CIHMot-cx-mem_gr-i": 1,
-      "_____10c-CIHMot-cx-mem_ls-i": 9,
-      "_____10c-CIHMot-cx-__name-t": "M1_BW",
-      "_____10c-CIHMot-cx-___bbx-i": 1,
-      "_____10c-CIHMot-cx-___bby-i": 1,
-      "_____10c-CIHMot-cx-___bbz-i": 1,
-      "_____10c-CIHMot-cx-rcordx-i": -45,
-      "_____10c-CIHMot-cx-rcordy-i": 0,
-      "_____10c-CIHMot-cx-rcordz-i": -14,
-      "_____10c-CIHMot-cx-2dcorx-i": 1510,
-      "_____10c-CIHMot-cx-2dcory-i": -106,
-      "_____10c-CIHMot-cx-_group-t": "CUSTOM",
-      "_____10c-CKQM2_-cx-subgrp-t": "",
-      "_____10c-CKQM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKQM2_-cx-synatt-i": 100,
-      "_____10c-CKQM2_-cx-de_gen-f": 0,
-      "_____10c-CKQM2_-cx-pspuni-b": false,
-      "_____10c-CKQM2_-nx-pstcrm-f": 99999,
-      "_____10c-CKQM2_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-2_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CKQM2_-cx-gd_vis-b": true,
-      "_____10c-CKQM2_-nx-pstcr_-f": 1,
-      "_____10c-CKQM2_-nx-fire_t-f": 1,
-      "_____10c-CKQM2_-nx-refrac-i": 0,
-      "_____10c-CKQM2_-nx-leak_c-f": 0,
-      "_____10c-CKQM2_-nx-leak_v-f": 0,
-      "_____10c-CKQM2_-nx-c_fr_c-i": 0,
-      "_____10c-CKQM2_-nx-snooze-f": 0,
-      "_____10c-CKQM2_-nx-ftincx-f": 0,
-      "_____10c-CKQM2_-nx-ftincy-f": 0,
-      "_____10c-CKQM2_-nx-ftincz-f": 0,
-      "_____10c-CKQM2_-nx-fthlim-i": 0,
-      "_____10c-CKQM2_-nx-mp_acc-b": false,
-      "_____10c-CKQM2_-nx-mp_psp-b": false,
-      "_____10c-CKQM2_-cx-memory-b": false,
-      "_____10c-CKQM2_-cx-mem__t-i": 100,
-      "_____10c-CKQM2_-cx-mem_gr-i": 1,
-      "_____10c-CKQM2_-cx-mem_ls-i": 9,
-      "_____10c-CKQM2_-cx-__name-t": "M2_FW",
-      "_____10c-CKQM2_-cx-___bbx-i": 1,
-      "_____10c-CKQM2_-cx-___bby-i": 1,
-      "_____10c-CKQM2_-cx-___bbz-i": 1,
-      "_____10c-CKQM2_-cx-rcordx-i": -40,
-      "_____10c-CKQM2_-cx-rcordy-i": 0,
-      "_____10c-CKQM2_-cx-rcordz-i": -14,
-      "_____10c-CKQM2_-cx-2dcorx-i": 1509,
-      "_____10c-CKQM2_-cx-2dcory-i": 81,
-      "_____10c-CKQM2_-cx-_group-t": "CUSTOM",
-      "_____10c-CKYM2_-cx-subgrp-t": "",
-      "_____10c-CKYM2_-cx-_n_cnt-i": 1,
-      "_____10c-CKYM2_-cx-synatt-i": 100,
-      "_____10c-CKYM2_-cx-de_gen-f": 0,
-      "_____10c-CKYM2_-cx-pspuni-b": false,
-      "_____10c-CKYM2_-nx-pstcrm-f": 99999,
-      "_____10c-CKYM2_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-3_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CKYM2_-cx-gd_vis-b": true,
-      "_____10c-CKYM2_-nx-pstcr_-f": 1,
-      "_____10c-CKYM2_-nx-fire_t-f": 1,
-      "_____10c-CKYM2_-nx-refrac-i": 0,
-      "_____10c-CKYM2_-nx-leak_c-f": 0,
-      "_____10c-CKYM2_-nx-leak_v-f": 0,
-      "_____10c-CKYM2_-nx-c_fr_c-i": 0,
-      "_____10c-CKYM2_-nx-snooze-f": 0,
-      "_____10c-CKYM2_-nx-ftincx-f": 0,
-      "_____10c-CKYM2_-nx-ftincy-f": 0,
-      "_____10c-CKYM2_-nx-ftincz-f": 0,
-      "_____10c-CKYM2_-nx-fthlim-i": 0,
-      "_____10c-CKYM2_-nx-mp_acc-b": false,
-      "_____10c-CKYM2_-nx-mp_psp-b": false,
-      "_____10c-CKYM2_-cx-memory-b": false,
-      "_____10c-CKYM2_-cx-mem__t-i": 100,
-      "_____10c-CKYM2_-cx-mem_gr-i": 1,
-      "_____10c-CKYM2_-cx-mem_ls-i": 9,
-      "_____10c-CKYM2_-cx-__name-t": "M2_BW",
-      "_____10c-CKYM2_-cx-___bbx-i": 1,
-      "_____10c-CKYM2_-cx-___bby-i": 1,
-      "_____10c-CKYM2_-cx-___bbz-i": 1,
-      "_____10c-CKYM2_-cx-rcordx-i": -35,
-      "_____10c-CKYM2_-cx-rcordy-i": 0,
-      "_____10c-CKYM2_-cx-rcordz-i": -14,
-      "_____10c-CKYM2_-cx-2dcorx-i": 1518,
-      "_____10c-CKYM2_-cx-2dcory-i": 239,
-      "_____10c-CKYM2_-cx-_group-t": "CUSTOM",
-      "_____10c-CO4M3_-cx-subgrp-t": "",
-      "_____10c-CO4M3_-cx-_n_cnt-i": 1,
-      "_____10c-CO4M3_-cx-synatt-i": 100,
-      "_____10c-CO4M3_-cx-de_gen-f": 0,
-      "_____10c-CO4M3_-cx-pspuni-b": false,
-      "_____10c-CO4M3_-nx-pstcrm-f": 99999,
-      "_____10c-CO4M3_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-4_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CO4M3_-cx-gd_vis-b": true,
-      "_____10c-CO4M3_-nx-pstcr_-f": 1,
-      "_____10c-CO4M3_-nx-fire_t-f": 1,
-      "_____10c-CO4M3_-nx-refrac-i": 0,
-      "_____10c-CO4M3_-nx-leak_c-f": 0,
-      "_____10c-CO4M3_-nx-leak_v-f": 0,
-      "_____10c-CO4M3_-nx-c_fr_c-i": 0,
-      "_____10c-CO4M3_-nx-snooze-f": 0,
-      "_____10c-CO4M3_-nx-ftincx-f": 0,
-      "_____10c-CO4M3_-nx-ftincy-f": 0,
-      "_____10c-CO4M3_-nx-ftincz-f": 0,
-      "_____10c-CO4M3_-nx-fthlim-i": 0,
-      "_____10c-CO4M3_-nx-mp_acc-b": false,
-      "_____10c-CO4M3_-nx-mp_psp-b": false,
-      "_____10c-CO4M3_-cx-memory-b": false,
-      "_____10c-CO4M3_-cx-mem__t-i": 100,
-      "_____10c-CO4M3_-cx-mem_gr-i": 1,
-      "_____10c-CO4M3_-cx-mem_ls-i": 9,
-      "_____10c-CO4M3_-cx-__name-t": "M3_FW",
-      "_____10c-CO4M3_-cx-___bbx-i": 1,
-      "_____10c-CO4M3_-cx-___bby-i": 1,
-      "_____10c-CO4M3_-cx-___bbz-i": 1,
-      "_____10c-CO4M3_-cx-rcordx-i": -30,
-      "_____10c-CO4M3_-cx-rcordy-i": 0,
-      "_____10c-CO4M3_-cx-rcordz-i": -14,
-      "_____10c-CO4M3_-cx-2dcorx-i": 1517,
-      "_____10c-CO4M3_-cx-2dcory-i": 403,
-      "_____10c-CO4M3_-cx-_group-t": "CUSTOM",
-      "_____10c-CJWM3_-cx-subgrp-t": "",
-      "_____10c-CJWM3_-cx-_n_cnt-i": 1,
-      "_____10c-CJWM3_-cx-synatt-i": 100,
-      "_____10c-CJWM3_-cx-de_gen-f": 0,
-      "_____10c-CJWM3_-cx-pspuni-b": false,
-      "_____10c-CJWM3_-nx-pstcrm-f": 99999,
-      "_____10c-CJWM3_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-5_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CJWM3_-cx-gd_vis-b": true,
-      "_____10c-CJWM3_-nx-pstcr_-f": 1,
-      "_____10c-CJWM3_-nx-fire_t-f": 1,
-      "_____10c-CJWM3_-nx-refrac-i": 0,
-      "_____10c-CJWM3_-nx-leak_c-f": 0,
-      "_____10c-CJWM3_-nx-leak_v-f": 0,
-      "_____10c-CJWM3_-nx-c_fr_c-i": 0,
-      "_____10c-CJWM3_-nx-snooze-f": 0,
-      "_____10c-CJWM3_-nx-ftincx-f": 0,
-      "_____10c-CJWM3_-nx-ftincy-f": 0,
-      "_____10c-CJWM3_-nx-ftincz-f": 0,
-      "_____10c-CJWM3_-nx-fthlim-i": 0,
-      "_____10c-CJWM3_-nx-mp_acc-b": false,
-      "_____10c-CJWM3_-nx-mp_psp-b": false,
-      "_____10c-CJWM3_-cx-memory-b": false,
-      "_____10c-CJWM3_-cx-mem__t-i": 100,
-      "_____10c-CJWM3_-cx-mem_gr-i": 1,
-      "_____10c-CJWM3_-cx-mem_ls-i": 9,
-      "_____10c-CJWM3_-cx-__name-t": "M3_BW",
-      "_____10c-CJWM3_-cx-___bbx-i": 1,
-      "_____10c-CJWM3_-cx-___bby-i": 1,
-      "_____10c-CJWM3_-cx-___bbz-i": 1,
-      "_____10c-CJWM3_-cx-rcordx-i": -25,
-      "_____10c-CJWM3_-cx-rcordy-i": 0,
-      "_____10c-CJWM3_-cx-rcordz-i": -14,
-      "_____10c-CJWM3_-cx-2dcorx-i": 1514,
-      "_____10c-CJWM3_-cx-2dcory-i": 519,
-      "_____10c-CJWM3_-cx-_group-t": "CUSTOM",
-      "_____10c-CTGM4_-cx-subgrp-t": "",
-      "_____10c-CTGM4_-cx-_n_cnt-i": 1,
-      "_____10c-CTGM4_-cx-synatt-i": 100,
-      "_____10c-CTGM4_-cx-de_gen-f": 0,
-      "_____10c-CTGM4_-cx-pspuni-b": false,
-      "_____10c-CTGM4_-nx-pstcrm-f": 99999,
-      "_____10c-CTGM4_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-6_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CTGM4_-cx-gd_vis-b": true,
-      "_____10c-CTGM4_-nx-pstcr_-f": 1,
-      "_____10c-CTGM4_-nx-fire_t-f": 1,
-      "_____10c-CTGM4_-nx-refrac-i": 0,
-      "_____10c-CTGM4_-nx-leak_c-f": 0,
-      "_____10c-CTGM4_-nx-leak_v-f": 0,
-      "_____10c-CTGM4_-nx-c_fr_c-i": 0,
-      "_____10c-CTGM4_-nx-snooze-f": 0,
-      "_____10c-CTGM4_-nx-ftincx-f": 0,
-      "_____10c-CTGM4_-nx-ftincy-f": 0,
-      "_____10c-CTGM4_-nx-ftincz-f": 0,
-      "_____10c-CTGM4_-nx-fthlim-i": 0,
-      "_____10c-CTGM4_-nx-mp_acc-b": false,
-      "_____10c-CTGM4_-nx-mp_psp-b": false,
-      "_____10c-CTGM4_-cx-memory-b": false,
-      "_____10c-CTGM4_-cx-mem__t-i": 100,
-      "_____10c-CTGM4_-cx-mem_gr-i": 1,
-      "_____10c-CTGM4_-cx-mem_ls-i": 9,
-      "_____10c-CTGM4_-cx-__name-t": "M4_FW",
-      "_____10c-CTGM4_-cx-___bbx-i": 1,
-      "_____10c-CTGM4_-cx-___bby-i": 1,
-      "_____10c-CTGM4_-cx-___bbz-i": 1,
-      "_____10c-CTGM4_-cx-rcordx-i": -20,
-      "_____10c-CTGM4_-cx-rcordy-i": 0,
-      "_____10c-CTGM4_-cx-rcordz-i": -14,
-      "_____10c-CTGM4_-cx-2dcorx-i": 1516,
-      "_____10c-CTGM4_-cx-2dcory-i": 670,
-      "_____10c-CTGM4_-cx-_group-t": "CUSTOM",
-      "_____10c-CLWM4_-cx-subgrp-t": "",
-      "_____10c-CLWM4_-cx-_n_cnt-i": 1,
-      "_____10c-CLWM4_-cx-synatt-i": 100,
-      "_____10c-CLWM4_-cx-de_gen-f": 0,
-      "_____10c-CLWM4_-cx-pspuni-b": false,
-      "_____10c-CLWM4_-nx-pstcrm-f": 99999,
-      "_____10c-CLWM4_-cx-dstmap-d": {
-         "o__mot": [
-            [
-               "0_0_0-7_0_0",
-               [
-                  1,
-                  1,
-                  1
-               ],
-               1,
-               false,
-               1,
-               1,
-               1
-            ]
-         ]
-      },
-      "_____10c-CLWM4_-cx-gd_vis-b": true,
-      "_____10c-CLWM4_-nx-pstcr_-f": 1,
-      "_____10c-CLWM4_-nx-fire_t-f": 1,
-      "_____10c-CLWM4_-nx-refrac-i": 0,
-      "_____10c-CLWM4_-nx-leak_c-f": 0,
-      "_____10c-CLWM4_-nx-leak_v-f": 0,
-      "_____10c-CLWM4_-nx-c_fr_c-i": 0,
-      "_____10c-CLWM4_-nx-snooze-f": 0,
-      "_____10c-CLWM4_-nx-ftincx-f": 0,
-      "_____10c-CLWM4_-nx-ftincy-f": 0,
-      "_____10c-CLWM4_-nx-ftincz-f": 0,
-      "_____10c-CLWM4_-nx-fthlim-i": 0,
-      "_____10c-CLWM4_-nx-mp_acc-b": false,
-      "_____10c-CLWM4_-nx-mp_psp-b": false,
-      "_____10c-CLWM4_-cx-memory-b": false,
-      "_____10c-CLWM4_-cx-mem__t-i": 100,
-      "_____10c-CLWM4_-cx-mem_gr-i": 1,
-      "_____10c-CLWM4_-cx-mem_ls-i": 9,
-      "_____10c-CLWM4_-cx-__name-t": "M4_BW",
-      "_____10c-CLWM4_-cx-___bbx-i": 1,
-      "_____10c-CLWM4_-cx-___bby-i": 1,
-      "_____10c-CLWM4_-cx-___bbz-i": 1,
-      "_____10c-CLWM4_-cx-rcordx-i": -15,
-      "_____10c-CLWM4_-cx-rcordy-i": 0,
-      "_____10c-CLWM4_-cx-rcordz-i": -14,
-      "_____10c-CLWM4_-cx-2dcorx-i": 1520,
-      "_____10c-CLWM4_-cx-2dcory-i": 825,
-      "_____10c-CLWM4_-cx-_group-t": "CUSTOM"
-   }
+  "genome_id": "2022-07-10_21:53:10_961677_111111_G",
+  "genome_title": "The Essential Genome",
+  "genome_description": "A basis genome with vision and motor control",
+  "version": "2.0",
+  "neuron_morphologies": {
+    "decrease_filter_diagonal": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "decrease_filter_diagonal2": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            2,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "increase_filter_diagonal": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "increase_filter_diagonal2": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            2,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "to_block_[5, 7, 4]": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              5,
+              7,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_one": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_two": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_three": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_four": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_left_level_five": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_one": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              3
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              3
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_two": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              1,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_three": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              1
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              2,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              1
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_four": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              2
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              3,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "turn_right_level_five": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              4,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "motor_forward": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "motor_backward": {
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              4
+            ]
+          ],
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              4
+            ]
+          ]
+        ]
+      },
+      "type": "patterns",
+      "class": "custom"
+    },
+    "y_consolidator": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              "*",
+              "?",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "intensity": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              0,
+              0,
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "APT_low": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              7
+            ],
+            [
+              0,
+              0,
+              8
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "apt_high": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              2
+            ],
+            [
+              0,
+              0,
+              2
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "diagonal_proprio": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            1,
+            1,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "right_detect": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              7,
+              "*",
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "left_detect": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              "*",
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "bbb3": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            -1,
+            1,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_135_deg": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            -1,
+            0
+          ],
+          [
+            2,
+            -2,
+            0
+          ],
+          [
+            3,
+            -3,
+            0
+          ],
+          [
+            4,
+            -4,
+            0
+          ],
+          [
+            5,
+            -5,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "ori_115": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            -2,
+            0
+          ],
+          [
+            2,
+            -4,
+            0
+          ],
+          [
+            3,
+            -6,
+            0
+          ],
+          [
+            4,
+            -9,
+            0
+          ],
+          [
+            5,
+            -11,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "custom"
+    },
+    "ori_0_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            0,
+            0
+          ],
+          [
+            2,
+            0,
+            0
+          ],
+          [
+            3,
+            0,
+            0
+          ],
+          [
+            4,
+            0,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_90_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            0,
+            1,
+            0
+          ],
+          [
+            0,
+            2,
+            0
+          ],
+          [
+            0,
+            3,
+            0
+          ],
+          [
+            0,
+            4,
+            0
+          ],
+          [
+            0,
+            5,
+            0
+          ],
+          [
+            0,
+            6,
+            0
+          ],
+          [
+            0,
+            7,
+            0
+          ],
+          [
+            0,
+            8,
+            0
+          ],
+          [
+            0,
+            9,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_45_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            1,
+            0
+          ],
+          [
+            2,
+            2,
+            0
+          ],
+          [
+            3,
+            3,
+            0
+          ],
+          [
+            4,
+            4,
+            0
+          ],
+          [
+            5,
+            5,
+            0
+          ],
+          [
+            6,
+            6,
+            0
+          ],
+          [
+            7,
+            7,
+            0
+          ],
+          [
+            8,
+            8,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "ori_60_deg": {
+      "type": "vectors",
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ],
+          [
+            1,
+            1,
+            0
+          ],
+          [
+            1,
+            2,
+            0
+          ],
+          [
+            2,
+            3,
+            0
+          ],
+          [
+            2,
+            4,
+            0
+          ],
+          [
+            3,
+            5,
+            0
+          ],
+          [
+            3,
+            6,
+            0
+          ],
+          [
+            4,
+            7,
+            0
+          ]
+        ]
+      },
+      "class": "custom"
+    },
+    "block_to_block": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "projector": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "memory": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "0-0-0_to_all": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              "*",
+              "*",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "all_to_0-0-0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "*",
+              "*",
+              "*"
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "all_to_all": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              "?",
+              "?",
+              "?"
+            ],
+            [
+              "*",
+              "*",
+              "*"
+            ]
+          ]
+        ]
+      },
+      "class": "core"
+    },
+    "lateral_+x": {
+      "parameters": {
+        "vectors": [
+          [
+            1,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-x": {
+      "parameters": {
+        "vectors": [
+          [
+            -1,
+            0,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_+y": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            1,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-y": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            -1,
+            0
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_+z": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "lateral_-z": {
+      "parameters": {
+        "vectors": [
+          [
+            0,
+            0,
+            -1
+          ]
+        ]
+      },
+      "type": "vectors",
+      "class": "core"
+    },
+    "randomizer": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "expander_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "reducer_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "lateral_pairs_x": {
+      "parameters": {},
+      "type": "functions",
+      "class": "core"
+    },
+    "tile": {
+      "parameters": {
+        "src_seed": [
+          16,
+          16,
+          1
+        ],
+        "src_pattern": [
+          [
+            1,
+            0
+          ],
+          [
+            1,
+            0
+          ],
+          [
+            1,
+            0
+          ]
+        ],
+        "mapper_morphology": "projector"
+      },
+      "type": "composite",
+      "class": "core"
+    },
+    "0_0_0-_0_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              0,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-_0_0_0",
+      "class": "custom"
+    },
+    "0_0_0-1_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              1,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-1_0_0",
+      "class": "custom"
+    },
+    "0_0_0-2_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              2,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-2_0_0",
+      "class": "custom"
+    },
+    "0_0_0-3_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              3,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-3_0_0",
+      "class": "custom"
+    },
+    "0_0_0-4_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              4,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-4_0_0",
+      "class": "custom"
+    },
+    "0_0_0-5_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              5,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-5_0_0",
+      "class": "custom"
+    },
+    "0_0_0-6_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              6,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-6_0_0",
+      "class": "custom"
+    },
+    "0_0_0-7_0_0": {
+      "type": "patterns",
+      "parameters": {
+        "patterns": [
+          [
+            [
+              0,
+              0,
+              0
+            ],
+            [
+              7,
+              0,
+              0
+            ]
+          ]
+        ]
+      },
+      "morphology_name": "0_0_0-7_0_0",
+      "class": "custom"
+    }
+  },
+  "hosts": {},
+  "physiology": {
+    "burst_delay": 0.025,
+    "max_age": 10000000,
+    "evolution_burst_count": 50,
+    "ipu_idle_threshold": 1000,
+    "plasticity_queue_depth": 3,
+    "lifespan_mgmt_interval": 10
+  },
+  "stats": {
+    "innate_cortical_area_count": 23,
+    "innate_neuron_count": 13845,
+    "innate_synapse_count": 400
+  },
+  "signatures": {
+    "genome": "d6c692d9194f8c0a",
+    "blueprint": "b6c2d4f83d8e3088",
+    "physiology": "5f1e7f587e1af2c8"
+  },
+  "timestamp": 1713187080.019076,
+  "blueprint": {
+    "_____10c-___pwr-cx-subgrp-t": "",
+    "_____10c-___pwr-cx-_n_cnt-i": 1,
+    "_____10c-___pwr-cx-synatt-f": 100,
+    "_____10c-___pwr-cx-de_gen-f": 0,
+    "_____10c-___pwr-cx-pspuni-b": false,
+    "_____10c-___pwr-nx-pstcrm-f": 35,
+    "_____10c-___pwr-cx-dstmap-d": {},
+    "_____10c-___pwr-cx-___bbx-i": 1,
+    "_____10c-___pwr-cx-___bby-i": 1,
+    "_____10c-___pwr-cx-___bbz-i": 1,
+    "_____10c-___pwr-cx-rcordx-i": 10,
+    "_____10c-___pwr-cx-rcordy-i": 0,
+    "_____10c-___pwr-cx-rcordz-i": -20,
+    "_____10c-___pwr-cx-2dcorx-i": -319,
+    "_____10c-___pwr-cx-2dcory-i": -682,
+    "_____10c-___pwr-cx-gd_vis-b": true,
+    "_____10c-___pwr-nx-pstcr_-f": 500,
+    "_____10c-___pwr-nx-fire_t-f": 1,
+    "_____10c-___pwr-nx-refrac-i": 0,
+    "_____10c-___pwr-nx-leak_c-f": 10,
+    "_____10c-___pwr-nx-leak_v-f": 0,
+    "_____10c-___pwr-nx-c_fr_c-i": 3,
+    "_____10c-___pwr-nx-snooze-f": 0,
+    "_____10c-___pwr-nx-ftincx-f": 0,
+    "_____10c-___pwr-nx-ftincy-f": 0,
+    "_____10c-___pwr-nx-ftincz-f": 0,
+    "_____10c-___pwr-nx-fthlim-f": 0,
+    "_____10c-___pwr-nx-mp_acc-b": true,
+    "_____10c-___pwr-nx-mp_psp-b": false,
+    "_____10c-___pwr-cx-memory-b": false,
+    "_____10c-___pwr-cx-mem__t-i": 100,
+    "_____10c-___pwr-cx-mem_gr-i": 1,
+    "_____10c-___pwr-cx-mem_ls-i": 9,
+    "_____10c-___pwr-nx-excite-f": 100,
+    "_____10c-___pwr-cx-__name-t": "Brain_Power",
+    "_____10c-___pwr-cx-_group-t": "CORE",
+    "_____10c-o__mot-cx-subgrp-t": "",
+    "_____10c-o__mot-cx-_n_cnt-i": 1,
+    "_____10c-o__mot-cx-synatt-f": 100,
+    "_____10c-o__mot-cx-de_gen-f": 0,
+    "_____10c-o__mot-cx-pspuni-b": false,
+    "_____10c-o__mot-nx-pstcrm-f": 35,
+    "_____10c-o__mot-cx-dstmap-d": {},
+    "_____10c-o__mot-cx-___bbx-i": 8,
+    "_____10c-o__mot-cx-___bby-i": 1,
+    "_____10c-o__mot-cx-___bbz-i": 1,
+    "_____10c-o__mot-cx-rcordx-i": -31,
+    "_____10c-o__mot-cx-rcordy-i": 0,
+    "_____10c-o__mot-cx-rcordz-i": -22,
+    "_____10c-o__mot-cx-2dcorx-i": 2083,
+    "_____10c-o__mot-cx-2dcory-i": 187,
+    "_____10c-o__mot-cx-gd_vis-b": true,
+    "_____10c-o__mot-nx-pstcr_-f": 6,
+    "_____10c-o__mot-nx-fire_t-f": 1,
+    "_____10c-o__mot-nx-refrac-i": 0,
+    "_____10c-o__mot-nx-leak_c-f": 0,
+    "_____10c-o__mot-nx-leak_v-f": 0,
+    "_____10c-o__mot-nx-c_fr_c-i": 0,
+    "_____10c-o__mot-nx-snooze-f": 0,
+    "_____10c-o__mot-nx-ftincx-f": 0,
+    "_____10c-o__mot-nx-ftincy-f": 0,
+    "_____10c-o__mot-nx-ftincz-f": 0,
+    "_____10c-o__mot-nx-fthlim-f": 0,
+    "_____10c-o__mot-nx-mp_acc-b": false,
+    "_____10c-o__mot-nx-mp_psp-b": false,
+    "_____10c-o__mot-cx-memory-b": false,
+    "_____10c-o__mot-cx-mem__t-i": 100,
+    "_____10c-o__mot-cx-mem_gr-i": 1,
+    "_____10c-o__mot-cx-mem_ls-i": 9,
+    "_____10c-o__mot-nx-excite-f": 100,
+    "_____10c-o__mot-cx-__name-t": "motor_opu",
+    "_____10c-o__mot-cx-_group-t": "OPU",
+    "_____10c-m__lef-cx-subgrp-t": "",
+    "_____10c-m__lef-cx-_n_cnt-i": 1,
+    "_____10c-m__lef-cx-synatt-f": 100,
+    "_____10c-m__lef-cx-de_gen-f": 0,
+    "_____10c-m__lef-cx-pspuni-b": true,
+    "_____10c-m__lef-nx-pstcrm-f": 35,
+    "_____10c-m__lef-cx-dstmap-d": {},
+    "_____10c-m__lef-cx-___bbx-i": 1,
+    "_____10c-m__lef-cx-___bby-i": 1,
+    "_____10c-m__lef-cx-___bbz-i": 1,
+    "_____10c-m__lef-cx-rcordx-i": -48,
+    "_____10c-m__lef-cx-rcordy-i": 0,
+    "_____10c-m__lef-cx-rcordz-i": 5,
+    "_____10c-m__lef-cx-2dcorx-i": 887,
+    "_____10c-m__lef-cx-2dcory-i": 533,
+    "_____10c-m__lef-cx-gd_vis-b": true,
+    "_____10c-m__lef-nx-pstcr_-f": 5,
+    "_____10c-m__lef-nx-fire_t-f": 1,
+    "_____10c-m__lef-nx-refrac-i": 0,
+    "_____10c-m__lef-nx-leak_c-f": 10,
+    "_____10c-m__lef-nx-leak_v-f": 0,
+    "_____10c-m__lef-nx-c_fr_c-i": 3,
+    "_____10c-m__lef-nx-snooze-f": 0,
+    "_____10c-m__lef-nx-ftincx-f": 0,
+    "_____10c-m__lef-nx-ftincy-f": 0,
+    "_____10c-m__lef-nx-ftincz-f": 0,
+    "_____10c-m__lef-nx-fthlim-f": 0,
+    "_____10c-m__lef-nx-mp_acc-b": true,
+    "_____10c-m__lef-nx-mp_psp-b": false,
+    "_____10c-m__lef-cx-memory-b": false,
+    "_____10c-m__lef-cx-mem__t-i": 100,
+    "_____10c-m__lef-cx-mem_gr-i": 1,
+    "_____10c-m__lef-cx-mem_ls-i": 9,
+    "_____10c-m__lef-nx-excite-f": 100,
+    "_____10c-m__lef-cx-__name-t": "turn_left",
+    "_____10c-m__lef-cx-_group-t": "CUSTOM",
+    "_____10c-m__rig-cx-subgrp-t": "",
+    "_____10c-m__rig-cx-_n_cnt-i": 1,
+    "_____10c-m__rig-cx-synatt-f": 100,
+    "_____10c-m__rig-cx-de_gen-f": 0,
+    "_____10c-m__rig-cx-pspuni-b": true,
+    "_____10c-m__rig-nx-pstcrm-f": 35,
+    "_____10c-m__rig-cx-dstmap-d": {},
+    "_____10c-m__rig-cx-___bbx-i": 1,
+    "_____10c-m__rig-cx-___bby-i": 1,
+    "_____10c-m__rig-cx-___bbz-i": 1,
+    "_____10c-m__rig-cx-rcordx-i": -28,
+    "_____10c-m__rig-cx-rcordy-i": 0,
+    "_____10c-m__rig-cx-rcordz-i": 5,
+    "_____10c-m__rig-cx-2dcorx-i": 896,
+    "_____10c-m__rig-cx-2dcory-i": 239,
+    "_____10c-m__rig-cx-gd_vis-b": true,
+    "_____10c-m__rig-nx-pstcr_-f": 5,
+    "_____10c-m__rig-nx-fire_t-f": 1,
+    "_____10c-m__rig-nx-refrac-i": 0,
+    "_____10c-m__rig-nx-leak_c-f": 10,
+    "_____10c-m__rig-nx-leak_v-f": 0,
+    "_____10c-m__rig-nx-c_fr_c-i": 3,
+    "_____10c-m__rig-nx-snooze-f": 0,
+    "_____10c-m__rig-nx-ftincx-f": 0,
+    "_____10c-m__rig-nx-ftincy-f": 0,
+    "_____10c-m__rig-nx-ftincz-f": 0,
+    "_____10c-m__rig-nx-fthlim-f": 0,
+    "_____10c-m__rig-nx-mp_acc-b": true,
+    "_____10c-m__rig-nx-mp_psp-b": false,
+    "_____10c-m__rig-cx-memory-b": false,
+    "_____10c-m__rig-cx-mem__t-i": 100,
+    "_____10c-m__rig-cx-mem_gr-i": 1,
+    "_____10c-m__rig-cx-mem_ls-i": 9,
+    "_____10c-m__rig-nx-excite-f": 100,
+    "_____10c-m__rig-cx-__name-t": "turn_right",
+    "_____10c-m__rig-cx-_group-t": "CUSTOM",
+    "_____10c-m__for-cx-subgrp-t": "",
+    "_____10c-m__for-cx-_n_cnt-i": 1,
+    "_____10c-m__for-cx-synatt-f": 100,
+    "_____10c-m__for-cx-de_gen-f": 0,
+    "_____10c-m__for-cx-pspuni-b": true,
+    "_____10c-m__for-nx-pstcrm-f": 35,
+    "_____10c-m__for-cx-dstmap-d": {
+      "CRSMot": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CKQM2_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CO4M3_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CTGM4_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-m__for-cx-___bbx-i": 1,
+    "_____10c-m__for-cx-___bby-i": 1,
+    "_____10c-m__for-cx-___bbz-i": 1,
+    "_____10c-m__for-cx-rcordx-i": -38,
+    "_____10c-m__for-cx-rcordy-i": 0,
+    "_____10c-m__for-cx-rcordz-i": 0,
+    "_____10c-m__for-cx-2dcorx-i": 894,
+    "_____10c-m__for-cx-2dcory-i": -204,
+    "_____10c-m__for-cx-gd_vis-b": true,
+    "_____10c-m__for-nx-pstcr_-f": 5,
+    "_____10c-m__for-nx-fire_t-f": 1,
+    "_____10c-m__for-nx-refrac-i": 0,
+    "_____10c-m__for-nx-leak_c-f": 10,
+    "_____10c-m__for-nx-leak_v-f": 0,
+    "_____10c-m__for-nx-c_fr_c-i": 3,
+    "_____10c-m__for-nx-snooze-f": 0,
+    "_____10c-m__for-nx-ftincx-f": 0,
+    "_____10c-m__for-nx-ftincy-f": 0,
+    "_____10c-m__for-nx-ftincz-f": 0,
+    "_____10c-m__for-nx-fthlim-f": 0,
+    "_____10c-m__for-nx-mp_acc-b": true,
+    "_____10c-m__for-nx-mp_psp-b": false,
+    "_____10c-m__for-cx-memory-b": false,
+    "_____10c-m__for-cx-mem__t-i": 100,
+    "_____10c-m__for-cx-mem_gr-i": 1,
+    "_____10c-m__for-cx-mem_ls-i": 9,
+    "_____10c-m__for-nx-excite-f": 100,
+    "_____10c-m__for-cx-__name-t": "forward",
+    "_____10c-m__for-cx-_group-t": "CUSTOM",
+    "_____10c-m__bac-cx-subgrp-t": "",
+    "_____10c-m__bac-cx-_n_cnt-i": 1,
+    "_____10c-m__bac-cx-synatt-f": 100,
+    "_____10c-m__bac-cx-de_gen-f": 0,
+    "_____10c-m__bac-cx-pspuni-b": true,
+    "_____10c-m__bac-nx-pstcrm-f": 35,
+    "_____10c-m__bac-cx-dstmap-d": {
+      "CLWM4_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CJWM3_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CKYM2_": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ],
+      "CIHMot": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-m__bac-cx-___bbx-i": 1,
+    "_____10c-m__bac-cx-___bby-i": 1,
+    "_____10c-m__bac-cx-___bbz-i": 1,
+    "_____10c-m__bac-cx-rcordx-i": -38,
+    "_____10c-m__bac-cx-rcordy-i": 0,
+    "_____10c-m__bac-cx-rcordz-i": 10,
+    "_____10c-m__bac-cx-2dcorx-i": 892,
+    "_____10c-m__bac-cx-2dcory-i": 859,
+    "_____10c-m__bac-cx-gd_vis-b": true,
+    "_____10c-m__bac-nx-pstcr_-f": 5,
+    "_____10c-m__bac-nx-fire_t-f": 1,
+    "_____10c-m__bac-nx-refrac-i": 0,
+    "_____10c-m__bac-nx-leak_c-f": 10,
+    "_____10c-m__bac-nx-leak_v-f": 0,
+    "_____10c-m__bac-nx-c_fr_c-i": 3,
+    "_____10c-m__bac-nx-snooze-f": 0,
+    "_____10c-m__bac-nx-ftincx-f": 0,
+    "_____10c-m__bac-nx-ftincy-f": 0,
+    "_____10c-m__bac-nx-ftincz-f": 0,
+    "_____10c-m__bac-nx-fthlim-f": 0,
+    "_____10c-m__bac-nx-mp_acc-b": true,
+    "_____10c-m__bac-nx-mp_psp-b": false,
+    "_____10c-m__bac-cx-memory-b": false,
+    "_____10c-m__bac-cx-mem__t-i": 100,
+    "_____10c-m__bac-cx-mem_gr-i": 1,
+    "_____10c-m__bac-cx-mem_ls-i": 9,
+    "_____10c-m__bac-nx-excite-f": 100,
+    "_____10c-m__bac-cx-__name-t": "backward",
+    "_____10c-m__bac-cx-_group-t": "CUSTOM",
+    "_____10c-iv00_C-cx-subgrp-t": "",
+    "_____10c-iv00_C-cx-_n_cnt-i": 1,
+    "_____10c-iv00_C-cx-synatt-f": 100,
+    "_____10c-iv00_C-cx-de_gen-f": 0,
+    "_____10c-iv00_C-cx-pspuni-b": false,
+    "_____10c-iv00_C-nx-pstcrm-f": 100,
+    "_____10c-iv00_C-cx-dstmap-d": {},
+    "_____10c-iv00_C-cx-___bbx-i": 64,
+    "_____10c-iv00_C-cx-___bby-i": 64,
+    "_____10c-iv00_C-cx-___bbz-i": 3,
+    "_____10c-iv00_C-cx-rcordx-i": 30,
+    "_____10c-iv00_C-cx-rcordy-i": 40,
+    "_____10c-iv00_C-cx-rcordz-i": -20,
+    "_____10c-iv00_C-cx-2dcorx-i": -262,
+    "_____10c-iv00_C-cx-2dcory-i": 127,
+    "_____10c-iv00_C-cx-gd_vis-b": true,
+    "_____10c-iv00_C-nx-pstcr_-f": 25,
+    "_____10c-iv00_C-nx-fire_t-f": 1,
+    "_____10c-iv00_C-nx-refrac-i": 0,
+    "_____10c-iv00_C-nx-leak_c-f": 0,
+    "_____10c-iv00_C-nx-leak_v-f": 0,
+    "_____10c-iv00_C-nx-c_fr_c-i": 3,
+    "_____10c-iv00_C-nx-snooze-f": 0,
+    "_____10c-iv00_C-nx-ftincx-f": 0,
+    "_____10c-iv00_C-nx-ftincy-f": 0,
+    "_____10c-iv00_C-nx-ftincz-f": 0,
+    "_____10c-iv00_C-nx-fthlim-f": 0,
+    "_____10c-iv00_C-nx-mp_acc-b": true,
+    "_____10c-iv00_C-nx-mp_psp-b": false,
+    "_____10c-iv00_C-cx-memory-b": false,
+    "_____10c-iv00_C-cx-mem__t-i": 100,
+    "_____10c-iv00_C-cx-mem_gr-i": 1,
+    "_____10c-iv00_C-cx-mem_ls-i": 9,
+    "_____10c-iv00_C-nx-excite-f": 100,
+    "_____10c-iv00_C-cx-__name-t": "vision_C",
+    "_____10c-iv00_C-cx-_group-t": "IPU",
+    "_____10c-iv00BL-cx-subgrp-t": "",
+    "_____10c-iv00BL-cx-_n_cnt-i": 1,
+    "_____10c-iv00BL-cx-synatt-f": 100,
+    "_____10c-iv00BL-cx-de_gen-f": 0,
+    "_____10c-iv00BL-cx-pspuni-b": false,
+    "_____10c-iv00BL-nx-pstcrm-f": 35,
+    "_____10c-iv00BL-cx-dstmap-d": {},
+    "_____10c-iv00BL-cx-___bbx-i": 8,
+    "_____10c-iv00BL-cx-___bby-i": 8,
+    "_____10c-iv00BL-cx-___bbz-i": 3,
+    "_____10c-iv00BL-cx-rcordx-i": 20,
+    "_____10c-iv00BL-cx-rcordy-i": 30,
+    "_____10c-iv00BL-cx-rcordz-i": -20,
+    "_____10c-iv00BL-cx-2dcorx-i": -614,
+    "_____10c-iv00BL-cx-2dcory-i": 317,
+    "_____10c-iv00BL-cx-gd_vis-b": true,
+    "_____10c-iv00BL-nx-pstcr_-f": 5,
+    "_____10c-iv00BL-nx-fire_t-f": 1,
+    "_____10c-iv00BL-nx-refrac-i": 0,
+    "_____10c-iv00BL-nx-leak_c-f": 0,
+    "_____10c-iv00BL-nx-leak_v-f": 0,
+    "_____10c-iv00BL-nx-c_fr_c-i": 3,
+    "_____10c-iv00BL-nx-snooze-f": 0,
+    "_____10c-iv00BL-nx-ftincx-f": 0,
+    "_____10c-iv00BL-nx-ftincy-f": 0,
+    "_____10c-iv00BL-nx-ftincz-f": 0,
+    "_____10c-iv00BL-nx-fthlim-f": 0,
+    "_____10c-iv00BL-nx-mp_acc-b": true,
+    "_____10c-iv00BL-nx-mp_psp-b": false,
+    "_____10c-iv00BL-cx-memory-b": false,
+    "_____10c-iv00BL-cx-mem__t-i": 100,
+    "_____10c-iv00BL-cx-mem_gr-i": 1,
+    "_____10c-iv00BL-cx-mem_ls-i": 9,
+    "_____10c-iv00BL-nx-excite-f": 100,
+    "_____10c-iv00BL-cx-__name-t": "vision_LL",
+    "_____10c-iv00BL-cx-_group-t": "IPU",
+    "_____10c-iv00BM-cx-subgrp-t": "",
+    "_____10c-iv00BM-cx-_n_cnt-i": 1,
+    "_____10c-iv00BM-cx-synatt-f": 100,
+    "_____10c-iv00BM-cx-de_gen-f": 0,
+    "_____10c-iv00BM-cx-pspuni-b": false,
+    "_____10c-iv00BM-nx-pstcrm-f": 35,
+    "_____10c-iv00BM-cx-dstmap-d": {
+      "m__bac": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-iv00BM-cx-___bbx-i": 8,
+    "_____10c-iv00BM-cx-___bby-i": 8,
+    "_____10c-iv00BM-cx-___bbz-i": 3,
+    "_____10c-iv00BM-cx-rcordx-i": 55,
+    "_____10c-iv00BM-cx-rcordy-i": 30,
+    "_____10c-iv00BM-cx-rcordz-i": -20,
+    "_____10c-iv00BM-cx-2dcorx-i": -253,
+    "_____10c-iv00BM-cx-2dcory-i": 324,
+    "_____10c-iv00BM-cx-gd_vis-b": true,
+    "_____10c-iv00BM-nx-pstcr_-f": 5,
+    "_____10c-iv00BM-nx-fire_t-f": 1,
+    "_____10c-iv00BM-nx-refrac-i": 0,
+    "_____10c-iv00BM-nx-leak_c-f": 0,
+    "_____10c-iv00BM-nx-leak_v-f": 0,
+    "_____10c-iv00BM-nx-c_fr_c-i": 3,
+    "_____10c-iv00BM-nx-snooze-f": 0,
+    "_____10c-iv00BM-nx-ftincx-f": 0,
+    "_____10c-iv00BM-nx-ftincy-f": 0,
+    "_____10c-iv00BM-nx-ftincz-f": 0,
+    "_____10c-iv00BM-nx-fthlim-f": 0,
+    "_____10c-iv00BM-nx-mp_acc-b": true,
+    "_____10c-iv00BM-nx-mp_psp-b": false,
+    "_____10c-iv00BM-cx-memory-b": false,
+    "_____10c-iv00BM-cx-mem__t-i": 100,
+    "_____10c-iv00BM-cx-mem_gr-i": 1,
+    "_____10c-iv00BM-cx-mem_ls-i": 9,
+    "_____10c-iv00BM-nx-excite-f": 100,
+    "_____10c-iv00BM-cx-__name-t": "vision_LM",
+    "_____10c-iv00BM-cx-_group-t": "IPU",
+    "_____10c-iv00BR-cx-subgrp-t": "",
+    "_____10c-iv00BR-cx-_n_cnt-i": 1,
+    "_____10c-iv00BR-cx-synatt-f": 100,
+    "_____10c-iv00BR-cx-de_gen-f": 0,
+    "_____10c-iv00BR-cx-pspuni-b": false,
+    "_____10c-iv00BR-nx-pstcrm-f": 35,
+    "_____10c-iv00BR-cx-dstmap-d": {},
+    "_____10c-iv00BR-cx-___bbx-i": 8,
+    "_____10c-iv00BR-cx-___bby-i": 8,
+    "_____10c-iv00BR-cx-___bbz-i": 3,
+    "_____10c-iv00BR-cx-rcordx-i": 95,
+    "_____10c-iv00BR-cx-rcordy-i": 30,
+    "_____10c-iv00BR-cx-rcordz-i": -20,
+    "_____10c-iv00BR-cx-2dcorx-i": 86,
+    "_____10c-iv00BR-cx-2dcory-i": 319,
+    "_____10c-iv00BR-cx-gd_vis-b": true,
+    "_____10c-iv00BR-nx-pstcr_-f": 5,
+    "_____10c-iv00BR-nx-fire_t-f": 1,
+    "_____10c-iv00BR-nx-refrac-i": 0,
+    "_____10c-iv00BR-nx-leak_c-f": 0,
+    "_____10c-iv00BR-nx-leak_v-f": 0,
+    "_____10c-iv00BR-nx-c_fr_c-i": 3,
+    "_____10c-iv00BR-nx-snooze-f": 0,
+    "_____10c-iv00BR-nx-ftincx-f": 0,
+    "_____10c-iv00BR-nx-ftincy-f": 0,
+    "_____10c-iv00BR-nx-ftincz-f": 0,
+    "_____10c-iv00BR-nx-fthlim-f": 0,
+    "_____10c-iv00BR-nx-mp_acc-b": true,
+    "_____10c-iv00BR-nx-mp_psp-b": false,
+    "_____10c-iv00BR-cx-memory-b": false,
+    "_____10c-iv00BR-cx-mem__t-i": 100,
+    "_____10c-iv00BR-cx-mem_gr-i": 1,
+    "_____10c-iv00BR-cx-mem_ls-i": 9,
+    "_____10c-iv00BR-nx-excite-f": 100,
+    "_____10c-iv00BR-cx-__name-t": "vision_LR",
+    "_____10c-iv00BR-cx-_group-t": "IPU",
+    "_____10c-iv00ML-cx-subgrp-t": "",
+    "_____10c-iv00ML-cx-_n_cnt-i": 1,
+    "_____10c-iv00ML-cx-synatt-f": 100,
+    "_____10c-iv00ML-cx-de_gen-f": 0,
+    "_____10c-iv00ML-cx-pspuni-b": false,
+    "_____10c-iv00ML-nx-pstcrm-f": 35,
+    "_____10c-iv00ML-cx-dstmap-d": {},
+    "_____10c-iv00ML-cx-___bbx-i": 8,
+    "_____10c-iv00ML-cx-___bby-i": 8,
+    "_____10c-iv00ML-cx-___bbz-i": 3,
+    "_____10c-iv00ML-cx-rcordx-i": 20,
+    "_____10c-iv00ML-cx-rcordy-i": 70,
+    "_____10c-iv00ML-cx-rcordz-i": -20,
+    "_____10c-iv00ML-cx-2dcorx-i": -609,
+    "_____10c-iv00ML-cx-2dcory-i": 129,
+    "_____10c-iv00ML-cx-gd_vis-b": true,
+    "_____10c-iv00ML-nx-pstcr_-f": 5,
+    "_____10c-iv00ML-nx-fire_t-f": 1,
+    "_____10c-iv00ML-nx-refrac-i": 0,
+    "_____10c-iv00ML-nx-leak_c-f": 0,
+    "_____10c-iv00ML-nx-leak_v-f": 0,
+    "_____10c-iv00ML-nx-c_fr_c-i": 3,
+    "_____10c-iv00ML-nx-snooze-f": 0,
+    "_____10c-iv00ML-nx-ftincx-f": 0,
+    "_____10c-iv00ML-nx-ftincy-f": 0,
+    "_____10c-iv00ML-nx-ftincz-f": 0,
+    "_____10c-iv00ML-nx-fthlim-f": 0,
+    "_____10c-iv00ML-nx-mp_acc-b": true,
+    "_____10c-iv00ML-nx-mp_psp-b": false,
+    "_____10c-iv00ML-cx-memory-b": false,
+    "_____10c-iv00ML-cx-mem__t-i": 100,
+    "_____10c-iv00ML-cx-mem_gr-i": 1,
+    "_____10c-iv00ML-cx-mem_ls-i": 9,
+    "_____10c-iv00ML-nx-excite-f": 100,
+    "_____10c-iv00ML-cx-__name-t": "vision_ML",
+    "_____10c-iv00ML-cx-_group-t": "IPU",
+    "_____10c-iv00MR-cx-subgrp-t": "",
+    "_____10c-iv00MR-cx-_n_cnt-i": 1,
+    "_____10c-iv00MR-cx-synatt-f": 100,
+    "_____10c-iv00MR-cx-de_gen-f": 0,
+    "_____10c-iv00MR-cx-pspuni-b": false,
+    "_____10c-iv00MR-nx-pstcrm-f": 35,
+    "_____10c-iv00MR-cx-dstmap-d": {},
+    "_____10c-iv00MR-cx-___bbx-i": 8,
+    "_____10c-iv00MR-cx-___bby-i": 8,
+    "_____10c-iv00MR-cx-___bbz-i": 3,
+    "_____10c-iv00MR-cx-rcordx-i": 95,
+    "_____10c-iv00MR-cx-rcordy-i": 70,
+    "_____10c-iv00MR-cx-rcordz-i": -20,
+    "_____10c-iv00MR-cx-2dcorx-i": 81,
+    "_____10c-iv00MR-cx-2dcory-i": 131,
+    "_____10c-iv00MR-cx-gd_vis-b": true,
+    "_____10c-iv00MR-nx-pstcr_-f": 5,
+    "_____10c-iv00MR-nx-fire_t-f": 1,
+    "_____10c-iv00MR-nx-refrac-i": 0,
+    "_____10c-iv00MR-nx-leak_c-f": 0,
+    "_____10c-iv00MR-nx-leak_v-f": 0,
+    "_____10c-iv00MR-nx-c_fr_c-i": 3,
+    "_____10c-iv00MR-nx-snooze-f": 0,
+    "_____10c-iv00MR-nx-ftincx-f": 0,
+    "_____10c-iv00MR-nx-ftincy-f": 0,
+    "_____10c-iv00MR-nx-ftincz-f": 0,
+    "_____10c-iv00MR-nx-fthlim-f": 0,
+    "_____10c-iv00MR-nx-mp_acc-b": true,
+    "_____10c-iv00MR-nx-mp_psp-b": false,
+    "_____10c-iv00MR-cx-memory-b": false,
+    "_____10c-iv00MR-cx-mem__t-i": 100,
+    "_____10c-iv00MR-cx-mem_gr-i": 1,
+    "_____10c-iv00MR-cx-mem_ls-i": 9,
+    "_____10c-iv00MR-nx-excite-f": 100,
+    "_____10c-iv00MR-cx-__name-t": "vision_MR",
+    "_____10c-iv00MR-cx-_group-t": "IPU",
+    "_____10c-iv00TL-cx-subgrp-t": "",
+    "_____10c-iv00TL-cx-_n_cnt-i": 1,
+    "_____10c-iv00TL-cx-synatt-f": 100,
+    "_____10c-iv00TL-cx-de_gen-f": 0,
+    "_____10c-iv00TL-cx-pspuni-b": false,
+    "_____10c-iv00TL-nx-pstcrm-f": 35,
+    "_____10c-iv00TL-cx-dstmap-d": {},
+    "_____10c-iv00TL-cx-___bbx-i": 8,
+    "_____10c-iv00TL-cx-___bby-i": 8,
+    "_____10c-iv00TL-cx-___bbz-i": 3,
+    "_____10c-iv00TL-cx-rcordx-i": 20,
+    "_____10c-iv00TL-cx-rcordy-i": 105,
+    "_____10c-iv00TL-cx-rcordz-i": -20,
+    "_____10c-iv00TL-cx-2dcorx-i": -606,
+    "_____10c-iv00TL-cx-2dcory-i": -61,
+    "_____10c-iv00TL-cx-gd_vis-b": true,
+    "_____10c-iv00TL-nx-pstcr_-f": 5,
+    "_____10c-iv00TL-nx-fire_t-f": 1,
+    "_____10c-iv00TL-nx-refrac-i": 0,
+    "_____10c-iv00TL-nx-leak_c-f": 0,
+    "_____10c-iv00TL-nx-leak_v-f": 0,
+    "_____10c-iv00TL-nx-c_fr_c-i": 3,
+    "_____10c-iv00TL-nx-snooze-f": 0,
+    "_____10c-iv00TL-nx-ftincx-f": 0,
+    "_____10c-iv00TL-nx-ftincy-f": 0,
+    "_____10c-iv00TL-nx-ftincz-f": 0,
+    "_____10c-iv00TL-nx-fthlim-f": 0,
+    "_____10c-iv00TL-nx-mp_acc-b": true,
+    "_____10c-iv00TL-nx-mp_psp-b": false,
+    "_____10c-iv00TL-cx-memory-b": false,
+    "_____10c-iv00TL-cx-mem__t-i": 100,
+    "_____10c-iv00TL-cx-mem_gr-i": 1,
+    "_____10c-iv00TL-cx-mem_ls-i": 9,
+    "_____10c-iv00TL-nx-excite-f": 100,
+    "_____10c-iv00TL-cx-__name-t": "vision_TL",
+    "_____10c-iv00TL-cx-_group-t": "IPU",
+    "_____10c-iv00TR-cx-subgrp-t": "",
+    "_____10c-iv00TR-cx-_n_cnt-i": 1,
+    "_____10c-iv00TR-cx-synatt-f": 100,
+    "_____10c-iv00TR-cx-de_gen-f": 0,
+    "_____10c-iv00TR-cx-pspuni-b": false,
+    "_____10c-iv00TR-nx-pstcrm-f": 35,
+    "_____10c-iv00TR-cx-dstmap-d": {},
+    "_____10c-iv00TR-cx-___bbx-i": 8,
+    "_____10c-iv00TR-cx-___bby-i": 8,
+    "_____10c-iv00TR-cx-___bbz-i": 3,
+    "_____10c-iv00TR-cx-rcordx-i": 95,
+    "_____10c-iv00TR-cx-rcordy-i": 105,
+    "_____10c-iv00TR-cx-rcordz-i": -20,
+    "_____10c-iv00TR-cx-2dcorx-i": 72,
+    "_____10c-iv00TR-cx-2dcory-i": -62,
+    "_____10c-iv00TR-cx-gd_vis-b": true,
+    "_____10c-iv00TR-nx-pstcr_-f": 5,
+    "_____10c-iv00TR-nx-fire_t-f": 1,
+    "_____10c-iv00TR-nx-refrac-i": 0,
+    "_____10c-iv00TR-nx-leak_c-f": 0,
+    "_____10c-iv00TR-nx-leak_v-f": 0,
+    "_____10c-iv00TR-nx-c_fr_c-i": 3,
+    "_____10c-iv00TR-nx-snooze-f": 0,
+    "_____10c-iv00TR-nx-ftincx-f": 0,
+    "_____10c-iv00TR-nx-ftincy-f": 0,
+    "_____10c-iv00TR-nx-ftincz-f": 0,
+    "_____10c-iv00TR-nx-fthlim-f": 0,
+    "_____10c-iv00TR-nx-mp_acc-b": true,
+    "_____10c-iv00TR-nx-mp_psp-b": false,
+    "_____10c-iv00TR-cx-memory-b": false,
+    "_____10c-iv00TR-cx-mem__t-i": 100,
+    "_____10c-iv00TR-cx-mem_gr-i": 1,
+    "_____10c-iv00TR-cx-mem_ls-i": 9,
+    "_____10c-iv00TR-nx-excite-f": 100,
+    "_____10c-iv00TR-cx-__name-t": "vision_TR",
+    "_____10c-iv00TR-cx-_group-t": "IPU",
+    "_____10c-iv00TM-cx-subgrp-t": "",
+    "_____10c-iv00TM-cx-_n_cnt-i": 1,
+    "_____10c-iv00TM-cx-synatt-f": 100,
+    "_____10c-iv00TM-cx-de_gen-f": 0,
+    "_____10c-iv00TM-cx-pspuni-b": false,
+    "_____10c-iv00TM-nx-pstcrm-f": 35,
+    "_____10c-iv00TM-cx-dstmap-d": {
+      "m__for": [
+        [
+          "projector",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-iv00TM-cx-___bbx-i": 8,
+    "_____10c-iv00TM-cx-___bby-i": 8,
+    "_____10c-iv00TM-cx-___bbz-i": 3,
+    "_____10c-iv00TM-cx-rcordx-i": 55,
+    "_____10c-iv00TM-cx-rcordy-i": 105,
+    "_____10c-iv00TM-cx-rcordz-i": -20,
+    "_____10c-iv00TM-cx-2dcorx-i": -271,
+    "_____10c-iv00TM-cx-2dcory-i": -65,
+    "_____10c-iv00TM-cx-gd_vis-b": true,
+    "_____10c-iv00TM-nx-pstcr_-f": 5,
+    "_____10c-iv00TM-nx-fire_t-f": 1,
+    "_____10c-iv00TM-nx-refrac-i": 0,
+    "_____10c-iv00TM-nx-leak_c-f": 0,
+    "_____10c-iv00TM-nx-leak_v-f": 0,
+    "_____10c-iv00TM-nx-c_fr_c-i": 3,
+    "_____10c-iv00TM-nx-snooze-f": 0,
+    "_____10c-iv00TM-nx-ftincx-f": 0,
+    "_____10c-iv00TM-nx-ftincy-f": 0,
+    "_____10c-iv00TM-nx-ftincz-f": 0,
+    "_____10c-iv00TM-nx-fthlim-f": 0,
+    "_____10c-iv00TM-nx-mp_acc-b": true,
+    "_____10c-iv00TM-nx-mp_psp-b": false,
+    "_____10c-iv00TM-cx-memory-b": false,
+    "_____10c-iv00TM-cx-mem__t-i": 100,
+    "_____10c-iv00TM-cx-mem_gr-i": 1,
+    "_____10c-iv00TM-cx-mem_ls-i": 9,
+    "_____10c-iv00TM-nx-excite-f": 100,
+    "_____10c-iv00TM-cx-__name-t": "vision_TM",
+    "_____10c-iv00TM-cx-_group-t": "IPU",
+    "_____10c-CRSMot-cx-subgrp-t": "",
+    "_____10c-CRSMot-cx-_n_cnt-i": 1,
+    "_____10c-CRSMot-cx-synatt-f": 100,
+    "_____10c-CRSMot-cx-de_gen-f": 0,
+    "_____10c-CRSMot-cx-pspuni-b": false,
+    "_____10c-CRSMot-nx-pstcrm-f": 99999,
+    "_____10c-CRSMot-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-_0_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CRSMot-cx-___bbx-i": 1,
+    "_____10c-CRSMot-cx-___bby-i": 1,
+    "_____10c-CRSMot-cx-___bbz-i": 1,
+    "_____10c-CRSMot-cx-rcordx-i": -50,
+    "_____10c-CRSMot-cx-rcordy-i": 0,
+    "_____10c-CRSMot-cx-rcordz-i": -14,
+    "_____10c-CRSMot-cx-2dcorx-i": 1503,
+    "_____10c-CRSMot-cx-2dcory-i": -284,
+    "_____10c-CRSMot-cx-gd_vis-b": true,
+    "_____10c-CRSMot-nx-pstcr_-f": 1,
+    "_____10c-CRSMot-nx-fire_t-f": 1,
+    "_____10c-CRSMot-nx-refrac-i": 0,
+    "_____10c-CRSMot-nx-leak_c-f": 0,
+    "_____10c-CRSMot-nx-leak_v-f": 0,
+    "_____10c-CRSMot-nx-c_fr_c-i": 0,
+    "_____10c-CRSMot-nx-snooze-f": 0,
+    "_____10c-CRSMot-nx-ftincx-f": 0,
+    "_____10c-CRSMot-nx-ftincy-f": 0,
+    "_____10c-CRSMot-nx-ftincz-f": 0,
+    "_____10c-CRSMot-nx-fthlim-f": 0,
+    "_____10c-CRSMot-nx-mp_acc-b": false,
+    "_____10c-CRSMot-nx-mp_psp-b": false,
+    "_____10c-CRSMot-cx-memory-b": false,
+    "_____10c-CRSMot-cx-mem__t-i": 100,
+    "_____10c-CRSMot-cx-mem_gr-i": 1,
+    "_____10c-CRSMot-cx-mem_ls-i": 9,
+    "_____10c-CRSMot-nx-excite-f": 100,
+    "_____10c-CRSMot-cx-__name-t": "M1_FW",
+    "_____10c-CRSMot-cx-_group-t": "CUSTOM",
+    "_____10c-CIHMot-cx-subgrp-t": "",
+    "_____10c-CIHMot-cx-_n_cnt-i": 1,
+    "_____10c-CIHMot-cx-synatt-f": 100,
+    "_____10c-CIHMot-cx-de_gen-f": 0,
+    "_____10c-CIHMot-cx-pspuni-b": false,
+    "_____10c-CIHMot-nx-pstcrm-f": 99999,
+    "_____10c-CIHMot-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-1_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CIHMot-cx-___bbx-i": 1,
+    "_____10c-CIHMot-cx-___bby-i": 1,
+    "_____10c-CIHMot-cx-___bbz-i": 1,
+    "_____10c-CIHMot-cx-rcordx-i": -45,
+    "_____10c-CIHMot-cx-rcordy-i": 0,
+    "_____10c-CIHMot-cx-rcordz-i": -14,
+    "_____10c-CIHMot-cx-2dcorx-i": 1510,
+    "_____10c-CIHMot-cx-2dcory-i": -106,
+    "_____10c-CIHMot-cx-gd_vis-b": true,
+    "_____10c-CIHMot-nx-pstcr_-f": 1,
+    "_____10c-CIHMot-nx-fire_t-f": 1,
+    "_____10c-CIHMot-nx-refrac-i": 0,
+    "_____10c-CIHMot-nx-leak_c-f": 0,
+    "_____10c-CIHMot-nx-leak_v-f": 0,
+    "_____10c-CIHMot-nx-c_fr_c-i": 0,
+    "_____10c-CIHMot-nx-snooze-f": 0,
+    "_____10c-CIHMot-nx-ftincx-f": 0,
+    "_____10c-CIHMot-nx-ftincy-f": 0,
+    "_____10c-CIHMot-nx-ftincz-f": 0,
+    "_____10c-CIHMot-nx-fthlim-f": 0,
+    "_____10c-CIHMot-nx-mp_acc-b": false,
+    "_____10c-CIHMot-nx-mp_psp-b": false,
+    "_____10c-CIHMot-cx-memory-b": false,
+    "_____10c-CIHMot-cx-mem__t-i": 100,
+    "_____10c-CIHMot-cx-mem_gr-i": 1,
+    "_____10c-CIHMot-cx-mem_ls-i": 9,
+    "_____10c-CIHMot-nx-excite-f": 100,
+    "_____10c-CIHMot-cx-__name-t": "M1_BW",
+    "_____10c-CIHMot-cx-_group-t": "CUSTOM",
+    "_____10c-CKQM2_-cx-subgrp-t": "",
+    "_____10c-CKQM2_-cx-_n_cnt-i": 1,
+    "_____10c-CKQM2_-cx-synatt-f": 100,
+    "_____10c-CKQM2_-cx-de_gen-f": 0,
+    "_____10c-CKQM2_-cx-pspuni-b": false,
+    "_____10c-CKQM2_-nx-pstcrm-f": 99999,
+    "_____10c-CKQM2_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-2_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CKQM2_-cx-___bbx-i": 1,
+    "_____10c-CKQM2_-cx-___bby-i": 1,
+    "_____10c-CKQM2_-cx-___bbz-i": 1,
+    "_____10c-CKQM2_-cx-rcordx-i": -40,
+    "_____10c-CKQM2_-cx-rcordy-i": 0,
+    "_____10c-CKQM2_-cx-rcordz-i": -14,
+    "_____10c-CKQM2_-cx-2dcorx-i": 1509,
+    "_____10c-CKQM2_-cx-2dcory-i": 81,
+    "_____10c-CKQM2_-cx-gd_vis-b": true,
+    "_____10c-CKQM2_-nx-pstcr_-f": 1,
+    "_____10c-CKQM2_-nx-fire_t-f": 1,
+    "_____10c-CKQM2_-nx-refrac-i": 0,
+    "_____10c-CKQM2_-nx-leak_c-f": 0,
+    "_____10c-CKQM2_-nx-leak_v-f": 0,
+    "_____10c-CKQM2_-nx-c_fr_c-i": 0,
+    "_____10c-CKQM2_-nx-snooze-f": 0,
+    "_____10c-CKQM2_-nx-ftincx-f": 0,
+    "_____10c-CKQM2_-nx-ftincy-f": 0,
+    "_____10c-CKQM2_-nx-ftincz-f": 0,
+    "_____10c-CKQM2_-nx-fthlim-f": 0,
+    "_____10c-CKQM2_-nx-mp_acc-b": false,
+    "_____10c-CKQM2_-nx-mp_psp-b": false,
+    "_____10c-CKQM2_-cx-memory-b": false,
+    "_____10c-CKQM2_-cx-mem__t-i": 100,
+    "_____10c-CKQM2_-cx-mem_gr-i": 1,
+    "_____10c-CKQM2_-cx-mem_ls-i": 9,
+    "_____10c-CKQM2_-nx-excite-f": 100,
+    "_____10c-CKQM2_-cx-__name-t": "M2_FW",
+    "_____10c-CKQM2_-cx-_group-t": "CUSTOM",
+    "_____10c-CKYM2_-cx-subgrp-t": "",
+    "_____10c-CKYM2_-cx-_n_cnt-i": 1,
+    "_____10c-CKYM2_-cx-synatt-f": 100,
+    "_____10c-CKYM2_-cx-de_gen-f": 0,
+    "_____10c-CKYM2_-cx-pspuni-b": false,
+    "_____10c-CKYM2_-nx-pstcrm-f": 99999,
+    "_____10c-CKYM2_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-3_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CKYM2_-cx-___bbx-i": 1,
+    "_____10c-CKYM2_-cx-___bby-i": 1,
+    "_____10c-CKYM2_-cx-___bbz-i": 1,
+    "_____10c-CKYM2_-cx-rcordx-i": -35,
+    "_____10c-CKYM2_-cx-rcordy-i": 0,
+    "_____10c-CKYM2_-cx-rcordz-i": -14,
+    "_____10c-CKYM2_-cx-2dcorx-i": 1518,
+    "_____10c-CKYM2_-cx-2dcory-i": 239,
+    "_____10c-CKYM2_-cx-gd_vis-b": true,
+    "_____10c-CKYM2_-nx-pstcr_-f": 1,
+    "_____10c-CKYM2_-nx-fire_t-f": 1,
+    "_____10c-CKYM2_-nx-refrac-i": 0,
+    "_____10c-CKYM2_-nx-leak_c-f": 0,
+    "_____10c-CKYM2_-nx-leak_v-f": 0,
+    "_____10c-CKYM2_-nx-c_fr_c-i": 0,
+    "_____10c-CKYM2_-nx-snooze-f": 0,
+    "_____10c-CKYM2_-nx-ftincx-f": 0,
+    "_____10c-CKYM2_-nx-ftincy-f": 0,
+    "_____10c-CKYM2_-nx-ftincz-f": 0,
+    "_____10c-CKYM2_-nx-fthlim-f": 0,
+    "_____10c-CKYM2_-nx-mp_acc-b": false,
+    "_____10c-CKYM2_-nx-mp_psp-b": false,
+    "_____10c-CKYM2_-cx-memory-b": false,
+    "_____10c-CKYM2_-cx-mem__t-i": 100,
+    "_____10c-CKYM2_-cx-mem_gr-i": 1,
+    "_____10c-CKYM2_-cx-mem_ls-i": 9,
+    "_____10c-CKYM2_-nx-excite-f": 100,
+    "_____10c-CKYM2_-cx-__name-t": "M2_BW",
+    "_____10c-CKYM2_-cx-_group-t": "CUSTOM",
+    "_____10c-CO4M3_-cx-subgrp-t": "",
+    "_____10c-CO4M3_-cx-_n_cnt-i": 1,
+    "_____10c-CO4M3_-cx-synatt-f": 100,
+    "_____10c-CO4M3_-cx-de_gen-f": 0,
+    "_____10c-CO4M3_-cx-pspuni-b": false,
+    "_____10c-CO4M3_-nx-pstcrm-f": 99999,
+    "_____10c-CO4M3_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-4_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CO4M3_-cx-___bbx-i": 1,
+    "_____10c-CO4M3_-cx-___bby-i": 1,
+    "_____10c-CO4M3_-cx-___bbz-i": 1,
+    "_____10c-CO4M3_-cx-rcordx-i": -30,
+    "_____10c-CO4M3_-cx-rcordy-i": 0,
+    "_____10c-CO4M3_-cx-rcordz-i": -14,
+    "_____10c-CO4M3_-cx-2dcorx-i": 1517,
+    "_____10c-CO4M3_-cx-2dcory-i": 403,
+    "_____10c-CO4M3_-cx-gd_vis-b": true,
+    "_____10c-CO4M3_-nx-pstcr_-f": 1,
+    "_____10c-CO4M3_-nx-fire_t-f": 1,
+    "_____10c-CO4M3_-nx-refrac-i": 0,
+    "_____10c-CO4M3_-nx-leak_c-f": 0,
+    "_____10c-CO4M3_-nx-leak_v-f": 0,
+    "_____10c-CO4M3_-nx-c_fr_c-i": 0,
+    "_____10c-CO4M3_-nx-snooze-f": 0,
+    "_____10c-CO4M3_-nx-ftincx-f": 0,
+    "_____10c-CO4M3_-nx-ftincy-f": 0,
+    "_____10c-CO4M3_-nx-ftincz-f": 0,
+    "_____10c-CO4M3_-nx-fthlim-f": 0,
+    "_____10c-CO4M3_-nx-mp_acc-b": false,
+    "_____10c-CO4M3_-nx-mp_psp-b": false,
+    "_____10c-CO4M3_-cx-memory-b": false,
+    "_____10c-CO4M3_-cx-mem__t-i": 100,
+    "_____10c-CO4M3_-cx-mem_gr-i": 1,
+    "_____10c-CO4M3_-cx-mem_ls-i": 9,
+    "_____10c-CO4M3_-nx-excite-f": 100,
+    "_____10c-CO4M3_-cx-__name-t": "M3_FW",
+    "_____10c-CO4M3_-cx-_group-t": "CUSTOM",
+    "_____10c-CJWM3_-cx-subgrp-t": "",
+    "_____10c-CJWM3_-cx-_n_cnt-i": 1,
+    "_____10c-CJWM3_-cx-synatt-f": 100,
+    "_____10c-CJWM3_-cx-de_gen-f": 0,
+    "_____10c-CJWM3_-cx-pspuni-b": false,
+    "_____10c-CJWM3_-nx-pstcrm-f": 99999,
+    "_____10c-CJWM3_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-5_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CJWM3_-cx-___bbx-i": 1,
+    "_____10c-CJWM3_-cx-___bby-i": 1,
+    "_____10c-CJWM3_-cx-___bbz-i": 1,
+    "_____10c-CJWM3_-cx-rcordx-i": -25,
+    "_____10c-CJWM3_-cx-rcordy-i": 0,
+    "_____10c-CJWM3_-cx-rcordz-i": -14,
+    "_____10c-CJWM3_-cx-2dcorx-i": 1514,
+    "_____10c-CJWM3_-cx-2dcory-i": 519,
+    "_____10c-CJWM3_-cx-gd_vis-b": true,
+    "_____10c-CJWM3_-nx-pstcr_-f": 1,
+    "_____10c-CJWM3_-nx-fire_t-f": 1,
+    "_____10c-CJWM3_-nx-refrac-i": 0,
+    "_____10c-CJWM3_-nx-leak_c-f": 0,
+    "_____10c-CJWM3_-nx-leak_v-f": 0,
+    "_____10c-CJWM3_-nx-c_fr_c-i": 0,
+    "_____10c-CJWM3_-nx-snooze-f": 0,
+    "_____10c-CJWM3_-nx-ftincx-f": 0,
+    "_____10c-CJWM3_-nx-ftincy-f": 0,
+    "_____10c-CJWM3_-nx-ftincz-f": 0,
+    "_____10c-CJWM3_-nx-fthlim-f": 0,
+    "_____10c-CJWM3_-nx-mp_acc-b": false,
+    "_____10c-CJWM3_-nx-mp_psp-b": false,
+    "_____10c-CJWM3_-cx-memory-b": false,
+    "_____10c-CJWM3_-cx-mem__t-i": 100,
+    "_____10c-CJWM3_-cx-mem_gr-i": 1,
+    "_____10c-CJWM3_-cx-mem_ls-i": 9,
+    "_____10c-CJWM3_-nx-excite-f": 100,
+    "_____10c-CJWM3_-cx-__name-t": "M3_BW",
+    "_____10c-CJWM3_-cx-_group-t": "CUSTOM",
+    "_____10c-CTGM4_-cx-subgrp-t": "",
+    "_____10c-CTGM4_-cx-_n_cnt-i": 1,
+    "_____10c-CTGM4_-cx-synatt-f": 100,
+    "_____10c-CTGM4_-cx-de_gen-f": 0,
+    "_____10c-CTGM4_-cx-pspuni-b": false,
+    "_____10c-CTGM4_-nx-pstcrm-f": 99999,
+    "_____10c-CTGM4_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-6_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CTGM4_-cx-___bbx-i": 1,
+    "_____10c-CTGM4_-cx-___bby-i": 1,
+    "_____10c-CTGM4_-cx-___bbz-i": 1,
+    "_____10c-CTGM4_-cx-rcordx-i": -20,
+    "_____10c-CTGM4_-cx-rcordy-i": 0,
+    "_____10c-CTGM4_-cx-rcordz-i": -14,
+    "_____10c-CTGM4_-cx-2dcorx-i": 1516,
+    "_____10c-CTGM4_-cx-2dcory-i": 670,
+    "_____10c-CTGM4_-cx-gd_vis-b": true,
+    "_____10c-CTGM4_-nx-pstcr_-f": 1,
+    "_____10c-CTGM4_-nx-fire_t-f": 1,
+    "_____10c-CTGM4_-nx-refrac-i": 0,
+    "_____10c-CTGM4_-nx-leak_c-f": 0,
+    "_____10c-CTGM4_-nx-leak_v-f": 0,
+    "_____10c-CTGM4_-nx-c_fr_c-i": 0,
+    "_____10c-CTGM4_-nx-snooze-f": 0,
+    "_____10c-CTGM4_-nx-ftincx-f": 0,
+    "_____10c-CTGM4_-nx-ftincy-f": 0,
+    "_____10c-CTGM4_-nx-ftincz-f": 0,
+    "_____10c-CTGM4_-nx-fthlim-f": 0,
+    "_____10c-CTGM4_-nx-mp_acc-b": false,
+    "_____10c-CTGM4_-nx-mp_psp-b": false,
+    "_____10c-CTGM4_-cx-memory-b": false,
+    "_____10c-CTGM4_-cx-mem__t-i": 100,
+    "_____10c-CTGM4_-cx-mem_gr-i": 1,
+    "_____10c-CTGM4_-cx-mem_ls-i": 9,
+    "_____10c-CTGM4_-nx-excite-f": 100,
+    "_____10c-CTGM4_-cx-__name-t": "M4_FW",
+    "_____10c-CTGM4_-cx-_group-t": "CUSTOM",
+    "_____10c-CLWM4_-cx-subgrp-t": "",
+    "_____10c-CLWM4_-cx-_n_cnt-i": 1,
+    "_____10c-CLWM4_-cx-synatt-f": 100,
+    "_____10c-CLWM4_-cx-de_gen-f": 0,
+    "_____10c-CLWM4_-cx-pspuni-b": false,
+    "_____10c-CLWM4_-nx-pstcrm-f": 99999,
+    "_____10c-CLWM4_-cx-dstmap-d": {
+      "o__mot": [
+        [
+          "0_0_0-7_0_0",
+          [
+            1,
+            1,
+            1
+          ],
+          1,
+          false,
+          1,
+          1,
+          1
+        ]
+      ]
+    },
+    "_____10c-CLWM4_-cx-___bbx-i": 1,
+    "_____10c-CLWM4_-cx-___bby-i": 1,
+    "_____10c-CLWM4_-cx-___bbz-i": 1,
+    "_____10c-CLWM4_-cx-rcordx-i": -15,
+    "_____10c-CLWM4_-cx-rcordy-i": 0,
+    "_____10c-CLWM4_-cx-rcordz-i": -14,
+    "_____10c-CLWM4_-cx-2dcorx-i": 1520,
+    "_____10c-CLWM4_-cx-2dcory-i": 825,
+    "_____10c-CLWM4_-cx-gd_vis-b": true,
+    "_____10c-CLWM4_-nx-pstcr_-f": 1,
+    "_____10c-CLWM4_-nx-fire_t-f": 1,
+    "_____10c-CLWM4_-nx-refrac-i": 0,
+    "_____10c-CLWM4_-nx-leak_c-f": 0,
+    "_____10c-CLWM4_-nx-leak_v-f": 0,
+    "_____10c-CLWM4_-nx-c_fr_c-i": 0,
+    "_____10c-CLWM4_-nx-snooze-f": 0,
+    "_____10c-CLWM4_-nx-ftincx-f": 0,
+    "_____10c-CLWM4_-nx-ftincy-f": 0,
+    "_____10c-CLWM4_-nx-ftincz-f": 0,
+    "_____10c-CLWM4_-nx-fthlim-f": 0,
+    "_____10c-CLWM4_-nx-mp_acc-b": false,
+    "_____10c-CLWM4_-nx-mp_psp-b": false,
+    "_____10c-CLWM4_-cx-memory-b": false,
+    "_____10c-CLWM4_-cx-mem__t-i": 100,
+    "_____10c-CLWM4_-cx-mem_gr-i": 1,
+    "_____10c-CLWM4_-cx-mem_ls-i": 9,
+    "_____10c-CLWM4_-nx-excite-f": 100,
+    "_____10c-CLWM4_-cx-__name-t": "M4_BW",
+    "_____10c-CLWM4_-cx-_group-t": "CUSTOM"
+  }
 }
\ No newline at end of file
diff --git a/src/evo/defaults/genome/motor_babble_genome.json b/src/evo/defaults/genome/motor_babble_genome.json
index 0ce802465..9cbb0387a 100644
--- a/src/evo/defaults/genome/motor_babble_genome.json
+++ b/src/evo/defaults/genome/motor_babble_genome.json
@@ -312,7 +312,7 @@
       "_____10c-o_init-nx-___bbx-i": 1,
       "_____10c-o_init-nx-___bby-i": 1,
       "_____10c-o_init-nx-___bbz-i": 1,
-      "_____10c-o_init-cx-synatt-i": 100,
+      "_____10c-o_init-cx-synatt-f": 100,
       "_____10c-o_init-cx-pstcr_-f": 0,
       "_____10c-o_init-cx-pstcrm-f": 500,
       "_____10c-o_init-cx-plst_c-f": 5,
@@ -332,7 +332,7 @@
       "_____10c-i_mPre-nx-___bbx-i": 1,
       "_____10c-i_mPre-nx-___bby-i": 1,
       "_____10c-i_mPre-nx-___bbz-i": 1,
-      "_____10c-i_mPre-cx-synatt-i": 100,
+      "_____10c-i_mPre-cx-synatt-f": 100,
       "_____10c-i_mPre-cx-pstcr_-f": 0,
       "_____10c-i_mPre-cx-pstcrm-f": 500,
       "_____10c-i_mPre-cx-plst_c-f": 5,
@@ -366,7 +366,7 @@
       "_____10c-t_mFor-nx-___bbx-i": 4,
       "_____10c-t_mFor-nx-___bby-i": 1,
       "_____10c-t_mFor-nx-___bbz-i": 1,
-      "_____10c-t_mFor-cx-synatt-i": 100,
+      "_____10c-t_mFor-cx-synatt-f": 100,
       "_____10c-t_mFor-cx-pstcr_-f": 500,
       "_____10c-t_mFor-cx-pstcrm-f": 35,
       "_____10c-t_mFor-cx-plst_c-f": 5,
@@ -400,7 +400,7 @@
       "_____10c-t_mBck-nx-___bbx-i": 4,
       "_____10c-t_mBck-nx-___bby-i": 1,
       "_____10c-t_mBck-nx-___bbz-i": 1,
-      "_____10c-t_mBck-cx-synatt-i": 100,
+      "_____10c-t_mBck-cx-synatt-f": 100,
       "_____10c-t_mBck-cx-pstcr_-f": 2000,
       "_____10c-t_mBck-cx-pstcrm-f": 35,
       "_____10c-t_mBck-cx-plst_c-f": 5,
@@ -434,7 +434,7 @@
       "_____10c-i__mot-nx-___bbx-i": 8,
       "_____10c-i__mot-nx-___bby-i": 1,
       "_____10c-i__mot-nx-___bbz-i": 10,
-      "_____10c-i__mot-cx-synatt-i": 100,
+      "_____10c-i__mot-cx-synatt-f": 100,
       "_____10c-i__mot-cx-pstcr_-f": 500,
       "_____10c-i__mot-cx-pstcrm-f": 35,
       "_____10c-i__mot-cx-plst_c-f": 5,
@@ -480,7 +480,7 @@
       "_____10c-o__mot-nx-___bbx-i": 8,
       "_____10c-o__mot-nx-___bby-i": 1,
       "_____10c-o__mot-nx-___bbz-i": 10,
-      "_____10c-o__mot-cx-synatt-i": 100,
+      "_____10c-o__mot-cx-synatt-f": 100,
       "_____10c-o__mot-cx-pstcr_-f": 500,
       "_____10c-o__mot-cx-pstcrm-f": 35,
       "_____10c-o__mot-cx-plst_c-f": 0.05,
@@ -514,7 +514,7 @@
       "_____10c-t_pmot-nx-___bbx-i": 8,
       "_____10c-t_pmot-nx-___bby-i": 1,
       "_____10c-t_pmot-nx-___bbz-i": 1,
-      "_____10c-t_pmot-cx-synatt-i": 100,
+      "_____10c-t_pmot-cx-synatt-f": 100,
       "_____10c-t_pmot-cx-pstcr_-f": 500,
       "_____10c-t_pmot-cx-pstcrm-f": 35,
       "_____10c-t_pmot-cx-plst_c-f": 0.05,
@@ -548,7 +548,7 @@
       "_____10c-t_mTha-nx-___bbx-i": 8,
       "_____10c-t_mTha-nx-___bby-i": 1,
       "_____10c-t_mTha-nx-___bbz-i": 1,
-      "_____10c-t_mTha-cx-synatt-i": 100,
+      "_____10c-t_mTha-cx-synatt-f": 100,
       "_____10c-t_mTha-cx-pstcr_-f": 500,
       "_____10c-t_mTha-cx-pstcrm-f": 35,
       "_____10c-t_mTha-cx-plst_c-f": 0.05,
@@ -582,7 +582,7 @@
       "_____10c-t_bDec-nx-___bbx-i": 8,
       "_____10c-t_bDec-nx-___bby-i": 1,
       "_____10c-t_bDec-nx-___bbz-i": 1,
-      "_____10c-t_bDec-cx-synatt-i": 100,
+      "_____10c-t_bDec-cx-synatt-f": 100,
       "_____10c-t_bDec-cx-pstcr_-f": 50,
       "_____10c-t_bDec-cx-pstcrm-f": 35,
       "_____10c-t_bDec-cx-plst_c-f": 0.05,
@@ -616,7 +616,7 @@
       "_____10c-t_mbab-nx-___bbx-i": 256,
       "_____10c-t_mbab-nx-___bby-i": 1,
       "_____10c-t_mbab-nx-___bbz-i": 1,
-      "_____10c-t_mbab-cx-synatt-i": 100,
+      "_____10c-t_mbab-cx-synatt-f": 100,
       "_____10c-t_mbab-cx-pstcr_-f": 50,
       "_____10c-t_mbab-cx-pstcrm-f": 35,
       "_____10c-t_mbab-cx-plst_c-f": 0.05,
@@ -650,7 +650,7 @@
       "_____10c-t_mbbb-nx-___bbx-i": 2560,
       "_____10c-t_mbbb-nx-___bby-i": 1,
       "_____10c-t_mbbb-nx-___bbz-i": 1,
-      "_____10c-t_mbbb-cx-synatt-i": 100,
+      "_____10c-t_mbbb-cx-synatt-f": 100,
       "_____10c-t_mbbb-cx-pstcr_-f": 50,
       "_____10c-t_mbbb-cx-pstcrm-f": 35,
       "_____10c-t_mbbb-cx-plst_c-f": 0.05,
@@ -696,7 +696,7 @@
       "_____10c-i__bat-nx-___bbx-i": 1,
       "_____10c-i__bat-nx-___bby-i": 1,
       "_____10c-i__bat-nx-___bbz-i": 10,
-      "_____10c-i__bat-cx-synatt-i": 100,
+      "_____10c-i__bat-cx-synatt-f": 100,
       "_____10c-i__bat-cx-pstcr_-f": 50000,
       "_____10c-i__bat-cx-pstcrm-f": 35,
       "_____10c-i__bat-cx-plst_c-f": 0.05,
diff --git a/src/evo/genome_editor.py b/src/evo/genome_editor.py
index 5115798dd..65425b305 100644
--- a/src/evo/genome_editor.py
+++ b/src/evo/genome_editor.py
@@ -21,8 +21,12 @@
 """
 
 import logging
+import traceback
+
+import xxhash
 from src.inf import runtime_data
 from datetime import datetime
+from time import time
 from time import sleep
 import json
 
@@ -33,7 +37,9 @@
 def set_default(obj):
     if isinstance(obj, set):
         return list(obj)
-    raise TypeError
+    print("#___" * 20)
+    print(type(obj), obj)
+    return obj
 
 
 def add_gene():
@@ -54,22 +60,48 @@ def save_genome(genome, file_name=''):
     try:
         with open(genome_file, "w") as data_file:
             data = genome
+            if "signatures" not in data:
+                data["signatures"] = {}
+            data["timestamp"] = time()
+
+            # host_info = runtime_data.host_info.copy()
+            # data["hosts"] = clean_host_info(host_info)
+            # print("@----" * 20)
+            # print(data["hosts"])
+
+            if "signatures" not in data:
+                data["signatures"] = {}
+            data["timestamp"] = time()
+            data["signatures"]["genome"] = generate_hash(genome_signature_payload(data))
+            data["signatures"]["blueprint"] = generate_hash(data["blueprint"])
+            data["signatures"]["physiology"] = generate_hash(data["physiology"])
+
             data_file.seek(0)  # rewind
             data_file.write(json.dumps(data, indent=3, default=set_default))
             data_file.truncate()
             # todo: Identify the cause of errors when sleep is eliminated
             sleep(0.5)  # Elimination of sleep causes issues with Uvicorn
             print("genome is saved")
+            runtime_data.changes_saved_externally = False
+    except Exception as e:
+        print(f"Warning: Genome could not be saved! {e}", traceback.print_exc())
 
-    except KeyError:
-        print("Warning: Genome could not be saved!")
 
+def clean_host_info(host_info):
+    for host in host_info:
+        if "listener" in host_info[host]:
+            host_info[host].pop("listener")
+    return host_info
+
+
+def generate_hash(payload):
+    serialized_genome = json.dumps(payload, sort_keys=True)
+    signature = xxhash.xxh64(serialized_genome).hexdigest()
+    return signature
 
-# def validate_genome():
-#
-#
-#
 
-if __name__ == "__main__":
-    add_gene()
-    save_genome()
+def genome_signature_payload(genome):
+    payload = dict()
+    payload["blueprint"] = genome["blueprint"]
+    payload["physiology"] = genome["physiology"]
+    return payload
diff --git a/src/evo/genome_processor.py b/src/evo/genome_processor.py
index e63dda1a3..c75a4ae74 100644
--- a/src/evo/genome_processor.py
+++ b/src/evo/genome_processor.py
@@ -43,6 +43,8 @@ def genome_ver_check(genome):
                 print("Error during genome validation!!\n", traceback.print_exc(), e)
             genome = merge_core_morphologies(genome)
             genome = genome_morphology_updator(genome)
+            genome = genome_physiology_updator(genome=genome)
+            genome = genome_stat_updator(genome=genome)
             save_genome(genome=genome, file_name=runtime_data.connectome_path + "genome.json")
             genome1 = genome_2_1_convertor(flat_genome=genome['blueprint'])
             genome_2_hierarchifier(flat_genome=genome['blueprint'])
@@ -349,12 +351,12 @@ def genome_v1_v2_converter(genome_v1):
                             ltd_multiplier = 1
 
                         destination_map[destination].append([morphology_id,
-                                                            morphology_scalar,
-                                                            postSynapticCurrent_multiplier,
-                                                            plasticity_flag,
-                                                            plasticity_constant,
-                                                            ltp_multiplier,
-                                                            ltd_multiplier])
+                                                             morphology_scalar,
+                                                             postSynapticCurrent_multiplier,
+                                                             plasticity_flag,
+                                                             plasticity_constant,
+                                                             ltp_multiplier,
+                                                             ltd_multiplier])
 
                 genome_v2['blueprint'][gene] = destination_map
             else:
@@ -446,11 +448,49 @@ def is_memory_cortical_area(cortical_area):
         return False
 
 
+def genome_physiology_updator(genome: dict):
+    if "physiology" not in genome:
+        genome["physiology"] = {}
+    if "max_burst_count" in genome:
+        genome.pop("max_burst_count")
+    if "burst_delay" in genome:
+        genome["physiology"]["burst_delay"] = genome["burst_delay"]
+        genome.pop("burst_delay")
+    if "max_age" in genome:
+        genome["physiology"]["max_age"] = genome["max_age"]
+        genome.pop("max_age")
+    if "evolution_burst_count" in genome:
+        genome["physiology"]["evolution_burst_count"] = genome["evolution_burst_count"]
+        genome.pop("evolution_burst_count")
+    if "ipu_idle_threshold" in genome:
+        genome["physiology"]["ipu_idle_threshold"] = genome["ipu_idle_threshold"]
+        genome.pop("ipu_idle_threshold")
+    if "plasticity_queue_depth" in genome:
+        genome["physiology"]["plasticity_queue_depth"] = genome["plasticity_queue_depth"]
+        genome.pop("plasticity_queue_depth")
+    if "lifespan_mgmt_interval" in genome:
+        genome["physiology"]["lifespan_mgmt_interval"] = genome["lifespan_mgmt_interval"]
+        genome.pop("lifespan_mgmt_interval")
+
+    return genome
+
+
+def genome_stat_updator(genome: dict):
+    if "stats" not in genome:
+        genome["stats"] = {}
+    if "cortical_count" not in genome["stats"]:
+        genome["stats"]["innate_cortical_area_count"] = 0
+    if "neuron_count" not in genome["stats"]:
+        genome["stats"]["innate_neuron_count"] = 0
+    if "synapse_count" not in genome["stats"]:
+        genome["stats"]["innate_synapse_count"] = 0
+    return genome
+
+
 gene_decoder = {
-    "_______b-_____s-__-__name-t": "species_name",
     "_______c-______-cx-__name-t": "cortical_name",
     "_______c-______-cx-_n_cnt-i": "cortical_neuron_count",
-    "_______c-______-cx-gd_vis-b": "godot_visualization",
+    "_______c-______-cx-gd_vis-b": "visualization",
     "_______c-______-cx-rcordx-i": "relative_coordinate_x",
     "_______c-______-cx-rcordy-i": "relative_coordinate_y",
     "_______c-______-cx-rcordz-i": "relative_coordinate_z",
@@ -459,7 +499,7 @@ def is_memory_cortical_area(cortical_area):
     "_______c-______-cx-___bbx-i": "block_boundary_x",
     "_______c-______-cx-___bby-i": "block_boundary_y",
     "_______c-______-cx-___bbz-i": "block_boundary_z",
-    "_______c-______-cx-synatt-i": "synapse_attractivity",
+    "_______c-______-cx-synatt-f": "synapse_attractivity",
     "_______c-______-cx-__rand-b": "location_generation_type",
     "_______c-______-cx-dstmap-d": "cortical_mapping_dst",
     "_______c-______-cx-de_gen-f": "degeneration",
@@ -469,19 +509,20 @@ def is_memory_cortical_area(cortical_area):
     "_______c-______-nx-ftincx-f": "firing_threshold_increment_x",
     "_______c-______-nx-ftincy-f": "firing_threshold_increment_y",
     "_______c-______-nx-ftincz-f": "firing_threshold_increment_z",
-    "_______c-______-nx-fthlim-i": "firing_threshold_limit",
+    "_______c-______-nx-fthlim-f": "firing_threshold_limit",
     "_______c-______-nx-mp_acc-b": "mp_charge_accumulation",
     "_______c-______-nx-mp_psp-b": "mp_driven_psp",
     "_______c-______-nx-refrac-i": "refractory_period",
     "_______c-______-nx-leak_c-f": "leak_coefficient",
-    "_______c-______-nx-leak_v-i": "leak_variability",
+    "_______c-______-nx-leak_v-f": "leak_variability",
     "_______c-______-nx-c_fr_c-i": "consecutive_fire_cnt_max",
     "_______c-______-nx-snooze-f": "snooze_length",
     "_______c-______-cx-memory-b": "is_mem_type",
     "_______c-______-cx-mem__t-i": "longterm_mem_threshold",
     "_______c-______-cx-mem_gr-i": "lifespan_growth_rate",
     "_______c-______-cx-mem_ls-i": "init_lifespan",
-    "_______c-______-nx-excite-i": "neuron_excitability"
+    "_______c-______-nx-excite-f": "neuron_excitability",
+    "_______c-______-cx-devcnt-i": "dev_count",
 }
 
 genome_1_template = {
@@ -489,7 +530,7 @@ def is_memory_cortical_area(cortical_area):
     "per_voxel_neuron_cnt": 1,
     "synapse_attractivity": 100,
     "degeneration": 0,
-    "psp_uniform_distribution": False,
+    "psp_uniform_distribution": True,
     "postsynaptic_current_max": 99999,
     "cortical_mapping_dst": {},
     "block_boundaries": [
@@ -518,7 +559,7 @@ def is_memory_cortical_area(cortical_area):
     "firing_threshold_increment_y": 0,
     "firing_threshold_increment_z": 0,
     "firing_threshold_limit": 0,
-    "mp_charge_accumulation": True,
+    "mp_charge_accumulation": False,
     "mp_driven_psp": False,
     "is_mem_type": False,
     "longterm_mem_threshold": 100,
@@ -540,14 +581,14 @@ def is_memory_cortical_area(cortical_area):
     "___bby-i": "block_boundaries",
     "___bbz-i": "block_boundaries",
     "__rand-b": "location_generation_type",
-    "synatt-i": "synapse_attractivity",
+    "synatt-f": "synapse_attractivity",
     "pstcr_-f": "postsynaptic_current",
     "pstcrm-f": "postsynaptic_current_max",
     "fire_t-f": 'firing_threshold',
     "ftincx-f": "firing_threshold_increment_x",
     "ftincy-f": "firing_threshold_increment_y",
     "ftincz-f": "firing_threshold_increment_z",
-    "fthlim-i": "firing_threshold_limit",
+    "fthlim-f": "firing_threshold_limit",
     "refrac-i": "refractory_period",
     "leak_c-f": "leak_coefficient",
     "leak_v-f": "leak_variability",
@@ -564,7 +605,8 @@ def is_memory_cortical_area(cortical_area):
     "mem__t-i": "longterm_mem_threshold",
     "mem_gr-i": "lifespan_growth_rate",
     "mem_ls-i": "init_lifespan",
-    "excite-i": "neuron_excitability"
+    "excite-f": "neuron_excitability",
+    "devcnt-i": "dev_count"
 }
 
 genome_1_to_2 = {
@@ -574,15 +616,15 @@ def is_memory_cortical_area(cortical_area):
     "per_voxel_neuron_cnt": "cx-_n_cnt-i",
     "visualization": "cx-gd_vis-b",
     "location_generation_type": "cx-__rand-b",
-    "synapse_attractivity": "cx-synatt-i",
+    "synapse_attractivity": "cx-synatt-f",
     "postsynaptic_current": "nx-pstcr_-f",
     "postsynaptic_current_max": "nx-pstcrm-f",
     'firing_threshold': "nx-fire_t-f",
     "firing_threshold_increment_x": "nx-ftincx-f",
     "firing_threshold_increment_y": "nx-ftincy-f",
     "firing_threshold_increment_z": "nx-ftincz-f",
-    "neuron_excitability": "nx-excite-i",
-    "firing_threshold_limit": "nx-fthlim-i",
+    "neuron_excitability": "nx-excite-f",
+    "firing_threshold_limit": "nx-fthlim-f",
     "refractory_period": "nx-refrac-i",
     "leak_coefficient": "nx-leak_c-f",
     "leak_variability": "nx-leak_v-f",
@@ -596,5 +638,6 @@ def is_memory_cortical_area(cortical_area):
     "is_mem_type": "cx-memory-b",
     "longterm_mem_threshold": "cx-mem__t-i",
     "lifespan_growth_rate": "cx-mem_gr-i",
-    "init_lifespan": "cx-mem_ls-i"
+    "init_lifespan": "cx-mem_ls-i",
+    "dev_count": "cx-devcnt-i"
 }
diff --git a/src/evo/genome_validator.py b/src/evo/genome_validator.py
index 718fbc0aa..5a30d414b 100644
--- a/src/evo/genome_validator.py
+++ b/src/evo/genome_validator.py
@@ -23,8 +23,9 @@
 import logging
 import traceback
 
-from src.evo.genome_properties import *
 from src.inf import settings
+from src.evo.genome_properties import *
+from src.evo.templates import cortical_types
 
 
 logger = logging.getLogger(__name__)
@@ -103,9 +104,8 @@ def morphology_validator(genome):
                                     for pattern_segment in pattern:
                                         if len(pattern_segment) != 3:
                                             genome_validity = False
-                                            print(
-                                                "Warning! Morphology \"%s\" has an incorrect pattern parameter definition."
-                                                % morphology)
+                                            print("Warning! Morphology \"%s\" has an incorrect pattern parameter "
+                                                  "definition." % morphology)
                                             return genome_validity
 
             if "parameters" not in neuron_morphologies[morphology]:
@@ -168,6 +168,18 @@ def destination_rules(gene_):
                         return False
         return True
 
+    def special_areas(gene_):
+        segments = gene_.split(genome_properties["structure"]["segment_seperator"])
+        special_core_types = {"IPU", "OPU", "CORE"}
+        cortical_area = segments[1]
+        if segments[3] == "_group":
+            defined_cortical_type = blueprint[gene_]
+            if defined_cortical_type in special_core_types:
+                if cortical_area not in cortical_types[defined_cortical_type]["supported_devices"]:
+                    return False
+
+        return True
+
     for gene in blueprint:
         if not gene_segments(gene):
             valid_genome = False
@@ -175,15 +187,13 @@ def destination_rules(gene_):
         if not destination_rules(gene):
             print(gene)
             valid_genome = False
+        if not special_areas(gene):
+            print(gene)
+            valid_genome = False
 
     return valid_genome
 
 
-def core_validator(genome):
-    # TBD
-    return True
-
-
 def print_validity(validity_status):
     if validity_status:
         print("\n" + settings.Bcolors.OKGREEN + "* -- * " * 20 + settings.Bcolors.ENDC)
@@ -201,7 +211,6 @@ def print_validity(validity_status):
 
 def genome_validator(genome):
     genome_validity = morphology_validator(genome=genome) and \
-                      blueprint_validator(genome=genome) and \
-                      core_validator(genome=genome)
+                      blueprint_validator(genome=genome)
     print_validity(validity_status=genome_validity)
     return genome_validity
diff --git a/src/evo/neuroembryogenesis.py b/src/evo/neuroembryogenesis.py
index 8766ca2e1..916f64907 100644
--- a/src/evo/neuroembryogenesis.py
+++ b/src/evo/neuroembryogenesis.py
@@ -35,6 +35,8 @@
 import shutil
 import concurrent.futures
 from src.evo import neuron, synapse, stats, genetics, voxels
+from src.evo.genome_editor import save_genome
+from src.evo.genome_processor import genome_v1_v2_converter
 from functools import partial
 from multiprocessing import Pool, Process
 from src.inf import disk_ops
@@ -230,6 +232,7 @@ def neurogenesis(cortical_area):
     #                             parameters=runtime_data.parameters)
     # disk_ops.save_voxel_dict_to_disk(cortical_area=cortical_area,
     #                                  voxel_dict=runtime_data.voxel_dict)
+    return neuron_count
 
 
 def synaptogenesis(cortical_area, dst_cortical_area=None):
@@ -257,7 +260,7 @@ def build_synapses(genome, brain, parameters, voxel_dict, connectome_path, src_c
     runtime_data.connectome_path = connectome_path
     # Read Genome data
     cortical_genes = genome["blueprint"][src_cortical_area]
-
+    synapse_count_ = 0
     if dst_cortical_area and dst_cortical_area in cortical_genes["cortical_mapping_dst"]:
         timer = datetime.datetime.now()
         synapse_count_, runtime_data.brain = \
@@ -273,6 +276,7 @@ def build_synapses(genome, brain, parameters, voxel_dict, connectome_path, src_c
 
             intercortical_mapping.append((src_cortical_area, mapped_cortical_area, synapse_count_))
 
+    runtime_data.brain_stats["synapse_count"] += synapse_count_
     # disk_ops.save_brain_to_disk(cortical_area=src_cortical_area, brain=runtime_data.brain, parameters=parameters)
     return intercortical_mapping
 
@@ -320,6 +324,12 @@ def develop(target_areas=None):
     # runtime_data.brain = disk_ops.load_brain_in_memory()
 
     connectome_neuron_count, connectome_synapse_count = stats.brain_total_synapse_cnt()
+    runtime_data.genome["stats"]["innate_cortical_area_count"] = len(runtime_data.cortical_list)
+    runtime_data.genome["stats"]["innate_neuron_count"] = connectome_neuron_count
+    runtime_data.genome["stats"]["innate_synapse_count"] = connectome_synapse_count
+
+    save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                file_name=runtime_data.connectome_path + "genome.json")
 
     # The following formula was derived by curve fitting sample data
     connectome_size_on_disk = 3E-08 * connectome_neuron_count**2 + 0.0011 * connectome_neuron_count + 2.9073
diff --git a/src/evo/neuron.py b/src/evo/neuron.py
index 364d39b48..9c898f1d1 100644
--- a/src/evo/neuron.py
+++ b/src/evo/neuron.py
@@ -129,7 +129,7 @@ def init_neuron(cortical_area, soma_location, mem_neuron_id=None):
             leak = leak + leak * random.randrange(1, int(leak_variability), 1) / 100
 
     runtime_data.brain[cortical_area][neuron_id]["leak_coefficient"] = leak
-
+    runtime_data.brain_stats["neuron_count"] += 1
     return neuron_id
 
 
@@ -169,6 +169,8 @@ def neuron_apoptosis(cortical_area, neuron_id):
         if neuron_id in runtime_data.fire_queue[cortical_area]:
             runtime_data.fire_queue[cortical_area].remove(neuron_id)
 
+    runtime_data.brain_stats["neuron_count"] -= 1
+
 
 def increase_neuron_lifespan(cortical_area, neuron_id):
     if cortical_area in runtime_data.brain:
diff --git a/src/evo/region.py b/src/evo/region.py
new file mode 100644
index 000000000..0486f8ccd
--- /dev/null
+++ b/src/evo/region.py
@@ -0,0 +1,345 @@
+
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+"""
+This module covers needed functions for brain region management
+"""
+import json
+import string
+import random
+import datetime
+import traceback
+
+from time import time
+
+from src.inf import runtime_data
+from src.evo.voxels import generate_cortical_dimensions_by_id
+from src.evo.stats import cortical_area_anatomical_stats
+from src.evo.genetics import genome_id_gen
+from src.evo.genome_processor import genome_v1_v2_converter
+from src.evo.genome_editor import generate_hash
+from src.evo.synapse import neighboring_cortical_areas
+from src.api.commons import CustomError
+
+
+def region_id_gen(size=6, chars=string.ascii_uppercase + string.digits):
+
+    now = datetime.datetime.now()
+    # Rand gen source partially from:
+    # http://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python
+    return str(now.strftime("%Y%m%d%H%M%S%f")[2:]) + '_' + (''.join(random.choice(chars) for _ in range(size))) + '_R'
+
+
+def region_id_2_title(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        return runtime_data.genome["brain_regions"][region_id]["title"]
+
+
+def change_cortical_area_parent(cortical_area_id, new_parent_id):
+    try:
+        current_parent_id = runtime_data.cortical_area_region_association[cortical_area_id]
+        print("current_parent_id:", current_parent_id, new_parent_id)
+        runtime_data.cortical_area_region_association[cortical_area_id] = new_parent_id
+        print(">>", runtime_data.genome["brain_regions"][current_parent_id]["areas"])
+        if cortical_area_id in runtime_data.genome["brain_regions"][current_parent_id]["areas"]:
+            runtime_data.genome["brain_regions"][current_parent_id]["areas"].remove(cortical_area_id)
+        else:
+            print(f"{cortical_area_id} not found in current region {current_parent_id}")
+        print(">>", runtime_data.genome["brain_regions"][current_parent_id]["areas"])
+        runtime_data.genome["brain_regions"][new_parent_id]["areas"].append(cortical_area_id)
+    except Exception as e:
+        print(f"Exception during change of cortical area region assignment: {e}", traceback.print_exc())
+
+
+def change_brain_region_parent(region_id, new_parent_id):
+    current_parent_id = runtime_data.genome["brain_regions"][region_id]["parent_region_id"]
+    runtime_data.genome["brain_regions"][region_id]["parent_region_id"] = new_parent_id
+    runtime_data.genome["brain_regions"][current_parent_id]["regions"].remove(region_id)
+    runtime_data.genome["brain_regions"][new_parent_id]["regions"].append(region_id)
+
+
+def create_region(region_data):
+    region_id = region_id_gen()
+    runtime_data.genome["brain_regions"][region_id] = {}
+    runtime_data.genome["brain_regions"][region_id]["title"] = region_data.title
+    runtime_data.genome["brain_regions"][region_id]["description"] = region_data.region_description
+    runtime_data.genome["brain_regions"][region_id]["parent_region_id"] = region_data.parent_region_id
+    runtime_data.genome["brain_regions"][region_id]["coordinate_2d"] = region_data.coordinates_2d
+    runtime_data.genome["brain_regions"][region_id]["coordinate_3d"] = region_data.coordinates_3d
+    runtime_data.genome["brain_regions"][region_id]["areas"] = list()
+    runtime_data.genome["brain_regions"][region_id]["regions"] = list()
+    runtime_data.genome["brain_regions"][region_id]["inputs"] = list()
+    runtime_data.genome["brain_regions"][region_id]["outputs"] = list()
+    # runtime_data.genome["brain_regions"][region_id]["suggested_afferents"] = list()
+    # runtime_data.genome["brain_regions"][region_id]["suggested_efferents"] = list()
+    runtime_data.genome["brain_regions"][region_id]["regions"] = list()
+    runtime_data.genome["brain_regions"][region_id]["signature"] = ""
+    runtime_data.genome["brain_regions"][region_data.parent_region_id]["regions"].append(region_id)
+    if region_data.areas:
+        for associated_area in region_data.areas:
+            if associated_area in runtime_data.cortical_list:
+                change_cortical_area_parent(cortical_area_id=associated_area,
+                                            new_parent_id=region_id)
+
+    if region_data.regions:
+        for associated_region in region_data.regions:
+            if associated_region in runtime_data.genome["brain_regions"]:
+                runtime_data.genome["brain_regions"][region_id]["regions"].append(associated_region)
+    return region_id
+
+
+def update_region(region_data):
+    region_id = region_data["region_id"]
+    region_data.pop("region_id")
+    for update in region_data:
+        if update not in ["area", "region"]:
+            if update == "parent_region_id":
+                change_brain_region_parent(region_id=region_id, new_parent_id=update["parent_region_id"])
+            else:
+                runtime_data.genome["brain_regions"][region_id][update] = region_data[update]
+        else:
+            raise CustomError(status_code=400, message=f"{update} cannot be updated using this endpoint")
+
+
+def delete_region_with_members(region_id):
+    if region_id in runtime_data.genome["brain_regions"]:
+        parent_region = runtime_data.genome["brain_regions"][region_id]["parent_region_id"]
+        for area in runtime_data.genome["brain_regions"][region_id]:
+            change_cortical_area_parent(cortical_area_id=area, new_parent_id=parent_region)
+        for region in runtime_data.genome["brain_regions"][region_id]:
+            change_brain_region_parent(region_id=region, new_parent_id=parent_region)
+        runtime_data.genome["brain_regions"].pop(region_id)
+
+
+def relocate_region_members(relocation_data):
+    for object_id in relocation_data:
+        if object_id in runtime_data.genome["blueprint"]:
+            if "coordinate_2d" in relocation_data[object_id]:
+                runtime_data.genome["blueprint"][object_id]["2d_coordinate"][0] = \
+                    relocation_data[object_id]["coordinate_2d"][0]
+                runtime_data.genome["blueprint"][object_id]["2d_coordinate"][1] = \
+                    relocation_data[object_id]["coordinate_2d"][1]
+            if "parent_region_id" in relocation_data[object_id]:
+                change_cortical_area_parent(cortical_area_id=object_id,
+                                            new_parent_id=relocation_data[object_id]["parent_region_id"])
+
+        elif object_id in runtime_data.genome["brain_regions"]:
+            if "coordinate_2d" in relocation_data[object_id]:
+                runtime_data.genome["brain_regions"][object_id]["coordinate_2d"][0] = \
+                    relocation_data[object_id]["coordinate_2d"][0]
+                runtime_data.genome["brain_regions"][object_id]["coordinate_2d"][1] = \
+                    relocation_data[object_id]["coordinate_2d"][1]
+            if "parent_region_id" in relocation_data[object_id]:
+                if relocation_data[object_id]["parent_region_id"] in runtime_data.genome["brain_regions"]:
+                    change_brain_region_parent(region_id=object_id,
+                                               new_parent_id=relocation_data[object_id]["parent_region_id"])
+                else:
+                    parent_id = relocation_data[object_id]["parent_region_id"]
+                    raise CustomError(status_code=400, message=f"{parent_id} is not a valid region id")
+        else:
+            raise CustomError(status_code=400, message=f"{object_id} is not a valid region nor cortical id")
+
+    runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+
+
+def direct_region_cortical_areas(region_id):
+    area_list = runtime_data.genome["brain_regions"][region_id]["areas"]
+    return area_list
+
+
+def recursive_sub_regions(region_id):
+    region_list = set()
+    for region in runtime_data.genome["brain_regions"][region_id]["regions"]:
+        region_list.add(region)
+
+    return region_list
+
+
+def recursive_region_cortical_areas(region_id):
+    recursive_region_list = recursive_sub_regions(region_id)
+    area_list = set()
+    area_list.update(set(direct_region_cortical_areas(region_id=region_id)))
+    for sub_region_id in recursive_region_list:
+        area_list.update(set(direct_region_cortical_areas(region_id=sub_region_id)))
+    return area_list
+
+
+def construct_genome_from_region(region_id):
+    genome_from_region = {
+        "genome_title": runtime_data.genome["brain_regions"][region_id].get("title", "No Title"),
+        "genome_description": runtime_data.genome["brain_regions"][region_id].get("description", "No Description"),
+        "timestamp": time(),
+        "genome_id": genome_id_gen(size=6, chars=string.ascii_uppercase + string.digits),
+        "version": runtime_data.genome["version"],
+        "signatures": {},
+        "stats": {},
+        "hosts": {},
+        "physiology": runtime_data.genome["physiology"],
+        "neuron_morphologies": {},
+        "blueprint": {},
+        "brain_regions": {
+            "root": {
+                "title": runtime_data.genome["brain_regions"][region_id].get("title", "No Title"),
+                "parent_region_id": None,
+                "coordinate_2d": [0, 0],
+                "coordinate_3d": [0, 0, 0],
+                "areas": runtime_data.genome["brain_regions"][region_id]["areas"],
+                "regions": runtime_data.genome["brain_regions"][region_id]["regions"],
+                "inputs": [],
+                "outputs": []
+            }
+        }
+    }
+
+    region_cortical_list = direct_region_cortical_areas(region_id=region_id)
+    comprehensive_subregion_list = recursive_sub_regions(region_id=region_id)
+    comprehensive_area_list = recursive_region_cortical_areas(region_id=region_id)
+
+    # Generate blueprint
+    for cortical_area in comprehensive_area_list:
+        genome_from_region["blueprint"][cortical_area] = runtime_data.genome["blueprint"][cortical_area].copy()
+
+    # Create Region list
+    genome_from_region["brain_regions"]["root"] = runtime_data.genome["brain_regions"][region_id].copy()
+    genome_from_region["brain_regions"]["root"]["parent_region_id"] = None
+    genome_from_region["brain_regions"]["root"]["coordinate_2d"] = [0, 0]
+    genome_from_region["brain_regions"]["root"]["coordinate_3d"] = [0, 0, 0]
+
+    for region in comprehensive_subregion_list:
+        genome_from_region["brain_regions"][region] = runtime_data.genome["brain_regions"][region].copy()
+
+    region_afferents = set()
+    region_efferents = set()
+
+    # Create suggested input/output mappings for all regions
+    """
+    suggested_afferents = [
+        {
+            "src_cortical_area_id": "___pwr",
+            "src_cortical_area_name": "brain_power",
+            "src_cortical_area_custom_label": "power",
+            "dst_cortical_area_id": "C2WFW3",
+            "morphology_id": "projector",
+            "postSynapticCurrent_multiplier": "1",
+            "morphology_scalar": [1,1,1],
+            "plasticity_flag": True,
+            "plasticity_constant": 1,
+            "ltp_multiplier": 2,
+            "ltd_multiplier": 1
+        },
+        {}
+    ]
+    """
+    for subregion in runtime_data.genome["brain_regions"][region_id]["regions"] + [region_id]:
+        subregion_suggested_afferents = []
+        subregion_suggested_efferents = []
+        afferent_areas = set()
+        efferent_areas = set()
+        subregion_recursive_cortical_list = recursive_region_cortical_areas(region_id=subregion)
+
+        # Develop Afferent / Efferent lists
+        for area in runtime_data.genome["brain_regions"][subregion]["areas"]:
+            upstream_cortical_areas, downstream_cortical_areas = \
+                neighboring_cortical_areas(cortical_area=area, blueprint=runtime_data.genome["blueprint"])
+
+            # Afferents
+            for area_ in upstream_cortical_areas:
+                if area_ not in subregion_recursive_cortical_list:
+                    afferent_areas.add(area_)
+
+            # Efferents
+            for area_ in downstream_cortical_areas:
+                if area_ not in subregion_recursive_cortical_list:
+                    efferent_areas.add(area_)
+
+        # Build suggested afferent list for each region
+        for afferent_area in afferent_areas:
+            for dst in runtime_data.genome["blueprint"][afferent_area]["cortical_mapping_dst"]:
+                if dst in region_cortical_list:
+                    for mapping in runtime_data.genome["blueprint"][afferent_area]["cortical_mapping_dst"][dst]:
+                        mapping["src_cortical_area_id"] = afferent_area
+                        mapping["src_cortical_area_name"] = runtime_data.genome["blueprint"][afferent_area][
+                            "cortical_name"]
+                        mapping["src_cortical_area_custom_label"] = None
+                        mapping["dst_cortical_area_id"] = dst
+                        subregion_suggested_afferents.append(mapping)
+
+        # Build suggested efferent list
+        for cortical_area in comprehensive_area_list:
+            for dst in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
+                if dst in efferent_areas:
+                    for mapping in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"][dst]:
+                        mapping["src_cortical_area_id"] = cortical_area
+                        mapping["src_cortical_area_name"] = runtime_data.genome["blueprint"][cortical_area][
+                            "cortical_name"]
+                        mapping["src_cortical_area_custom_label"] = None
+                        mapping["dst_cortical_area_id"] = dst
+                        subregion_suggested_efferents.append(mapping)
+
+        if subregion == region_id:
+            genome_from_region["brain_regions"]["root"]["inputs"] = subregion_suggested_afferents
+            genome_from_region["brain_regions"]["root"]["outputs"] = subregion_suggested_efferents
+        # else:
+        #     genome_from_region["brain_regions"][subregion]["inputs"] = subregion_suggested_afferents
+        #     genome_from_region["brain_regions"][subregion]["outputs"] = subregion_suggested_efferents
+
+        region_efferents.update(efferent_areas)
+        region_afferents.update(afferent_areas)
+
+    # Scrub Efferents
+    for cortical_area in genome_from_region["blueprint"].copy():
+        for dst in genome_from_region["blueprint"][cortical_area]["cortical_mapping_dst"].copy():
+            if dst in region_efferents:
+                genome_from_region["blueprint"][cortical_area]["cortical_mapping_dst"].pop(dst)
+
+    # Set region stats
+    region_neuron_count = 0
+    region_synapse_count = 0
+
+    for cortical_area in comprehensive_area_list:
+        neuron_cnt, synapse_cnt = cortical_area_anatomical_stats(cortical_area=cortical_area)
+        region_neuron_count += neuron_cnt
+        region_synapse_count += synapse_cnt
+
+    genome_from_region["stats"]["innate_cortical_area_count"] = len(comprehensive_area_list)
+    genome_from_region["stats"]["innate_neuron_count"] = region_neuron_count
+    genome_from_region["stats"]["innate_synapse_count"] = region_synapse_count
+
+    # Set morphologies
+    morphology_list = set()
+    for cortical_area in comprehensive_area_list:
+        for mapping_destination in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
+            for mapping in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"][mapping_destination]:
+                morphology_list.add(mapping["morphology_id"])
+
+    for morphology_id in morphology_list:
+        genome_from_region["neuron_morphologies"][morphology_id] = \
+            runtime_data.genome["neuron_morphologies"][morphology_id].copy()
+
+    # Set signatures
+    genome_from_region["signatures"]["genome"] = generate_hash(genome_from_region)
+    genome_from_region["signatures"]["blueprint"] = generate_hash(genome_from_region["blueprint"])
+    genome_from_region["signatures"]["physiology"] = generate_hash(genome_from_region["physiology"])
+
+    # Convert Genome to 2.0
+    genome_from_region["blueprint"] = genome_v1_v2_converter(genome_from_region)["blueprint"]
+
+    return genome_from_region
+
+
+def cortical_area_region_sanity_check(cortical_area):
+    if cortical_area not in runtime_data.cortical_area_region_association:
+        runtime_data.cortical_area_region_association[cortical_area] = "root"
diff --git a/src/evo/stats.py b/src/evo/stats.py
index 3e38a9106..160bbff35 100644
--- a/src/evo/stats.py
+++ b/src/evo/stats.py
@@ -47,7 +47,7 @@ def connectome_neuron_count():
     return total_neuron_count
 
 
-def connectome_total_synapse_cnt(cortical_area):
+def cortical_area_anatomical_stats(cortical_area):
     """
     Returns the total number of Neurons and Synapses for a given cortical area
     """
@@ -65,7 +65,7 @@ def brain_total_synapse_cnt(verbose=True):
     brain_synapse_cnt = 0
     brain_neuron_cnt = 0
     for cortical_area in runtime_data.brain:
-        neuron_count, synapse_count = connectome_total_synapse_cnt(cortical_area)
+        neuron_count, synapse_count = cortical_area_anatomical_stats(cortical_area)
         brain_neuron_cnt = brain_neuron_cnt + neuron_count
         brain_synapse_cnt = brain_synapse_cnt + synapse_count
         if verbose:
@@ -94,7 +94,7 @@ def connectome_neighbor_histogram(cortical_area):
 def print_cortical_stats():
     for cortical_area in runtime_data.cortical_list:
         print("%s total Neuron count: %i" % (cortical_area, connectome_neuron_count(cortical_area)))
-        print("%s average synapse count per Neuron: %i" % (cortical_area, connectome_total_synapse_cnt(cortical_area)/connectome_neuron_count(cortical_area)))
+        print("%s average synapse count per Neuron: %i" % (cortical_area, cortical_area_anatomical_stats(cortical_area)/connectome_neuron_count(cortical_area)))
     return
 
 
diff --git a/src/evo/synapse.py b/src/evo/synapse.py
index ac7879de2..8f86d63f5 100644
--- a/src/evo/synapse.py
+++ b/src/evo/synapse.py
@@ -237,11 +237,14 @@ def cortical_mapping(blueprint=None):
 
 
 def synaptic_pruner(src_cortical_area, dst_cortical_area):
+    synapse_count = 0
     for neuron in runtime_data.brain[src_cortical_area].copy():
         for neighbor in runtime_data.brain[src_cortical_area][neuron]['neighbors'].copy():
             if runtime_data.brain[src_cortical_area][neuron]['neighbors'][neighbor]['cortical_area'] == \
                     dst_cortical_area:
                 runtime_data.brain[src_cortical_area][neuron]['neighbors'].pop(neighbor)
+                synapse_count += 1
+    runtime_data.brain_stats["synapse_count"] -= synapse_count
     return runtime_data.brain
 
 
@@ -285,3 +288,18 @@ def synapse_memory_neuron(neuron_id):
                                                                 src_neuron=neuron_id,
                                                                 dst_area=dst_cortical_area,
                                                                 candidate_list=neighbor_candidates)
+
+
+def neighboring_cortical_areas(cortical_area, blueprint=None):
+    try:
+        if not blueprint:
+            blueprint = runtime_data.genome["blueprint"]
+        cortical_mappings = cortical_mapping(blueprint=blueprint)
+        upstream_cortical_areas = set()
+        downstream_cortical_areas = set(cortical_mappings[cortical_area])
+        for area in cortical_mappings:
+            if cortical_area in cortical_mappings[area]:
+                upstream_cortical_areas.add(area)
+        return upstream_cortical_areas, downstream_cortical_areas
+    except KeyError:
+        print("Exception in neighboring_cortical_areas: Cortical area not found", traceback.print_exc())
diff --git a/src/evo/synaptogenesis_rules.py b/src/evo/synaptogenesis_rules.py
index 6efa75b93..5765e626f 100644
--- a/src/evo/synaptogenesis_rules.py
+++ b/src/evo/synaptogenesis_rules.py
@@ -209,31 +209,59 @@ def match_patterns(src_voxel, cortical_area_dst, pattern, morphology_scalar, src
             for dst_z in range(dst_block_boundaries[2]):
 
                 matching_condition_x = \
-                    ((dst_pattern_x == "*" and
-                      (src_pattern_x == "*" or src_pattern_x == "?" or src_pattern_x == src_x)) or
-                     (dst_pattern_x == "?" and (src_pattern_x == "*" or src_pattern_x == "?" or src_x == dst_x)) or
-                     (dst_pattern_x == dst_x and (src_pattern_x == "*" or
-                                                  (src_pattern_x == "?" and src_x == dst_x) or
-                                                  (src_pattern_x == src_x))))
+                    (
+                            dst_pattern_x == "*"
+                            or
+                            (dst_pattern_x == "?" and
+                             (src_x == dst_x))
+                            or
+                            (dst_pattern_x == "!" and
+                             (src_x != dst_x))
+                            or
+                            (dst_pattern_x == dst_x and
+                             (src_pattern_x == "*" or
+                              (src_pattern_x == "?" and src_x == dst_x) or
+                              (src_pattern_x == "!" and src_x != dst_x) or
+                              (src_pattern_x == src_x)))
+                    )
 
                 matching_condition_y = \
-                    ((dst_pattern_y == "*" and
-                      (src_pattern_y == "*" or src_pattern_y == "?" or src_pattern_y == src_y) or
-                      (dst_pattern_y == "?" and (src_pattern_y == "*" or src_pattern_y == "?" or src_y == dst_y)) or
-                      (dst_pattern_y == dst_y and (src_pattern_y == "*" or (src_pattern_y == "?" and src_y == dst_y) or
-                                                  (src_pattern_y == src_y)))))
+                    (
+                            dst_pattern_y == "*"
+                            or
+                            (dst_pattern_y == "?" and
+                             (src_y == dst_y))
+                            or
+                            (dst_pattern_y == "!" and
+                             (src_y != dst_y))
+                            or
+                            (dst_pattern_y == dst_y and
+                             (src_pattern_y == "*" or
+                              (src_pattern_y == "?" and src_y == dst_y) or
+                              (src_pattern_y == "!" and src_y != dst_y) or
+                              (src_pattern_y == src_y)))
+                    )
 
                 matching_condition_z = \
-                    ((dst_pattern_z == "*" and
-                      (src_pattern_z == "*" or src_pattern_z == "?" or src_pattern_z == src_z) or
-                      (dst_pattern_z == "?" and (src_pattern_z == "*" or src_pattern_z == "?" or src_z == dst_z)) or
-                      (dst_pattern_z == dst_z and (src_pattern_z == "*" or (src_pattern_z == "?" and src_z == dst_z) or
-                                                  (src_pattern_z == src_z)))))
+                    (
+                            dst_pattern_z == "*"
+                            or
+                            (dst_pattern_z == "?" and
+                             (src_z == dst_z))
+                            or
+                            (dst_pattern_z == "!" and
+                             (src_z != dst_z))
+                            or
+                            (dst_pattern_z == dst_z and
+                             (src_pattern_z == "*" or
+                              (src_pattern_z == "?" and src_z == dst_z) or
+                              (src_pattern_z == "!" and src_z != dst_z) or
+                              (src_pattern_z == src_z)))
+                    )
 
                 if matching_condition_x and matching_condition_y and matching_condition_z:
                     voxel_list.append([dst_x, dst_y, dst_z])
 
-    # print("Matched voxel list based on pattern:", src_voxel, cortical_area_dst, voxel_list)
 
     # todo: account for morphology scalar
 
@@ -385,13 +413,13 @@ def syn_projector(src_cortical_area, dst_cortical_area, src_neuron_id, src_subre
         for i in range(3):
             dst_vox_dict[i] = set()
             if src_shape[i] > dst_shape[i]:
-                ratio = src_shape[i]//dst_shape[i]
-                target_vox = (neuron_location[i] - src_subregion[0][i])//ratio
+                ratio = src_shape[i]/dst_shape[i]
+                target_vox = int((neuron_location[i] - src_subregion[0][i])/ratio)
                 dst_vox_dict[i].add(target_vox)
             elif src_shape[i] < dst_shape[i]:
-                ratio = dst_shape[i]//src_shape[i]
+                ratio = dst_shape[i]/src_shape[i]
                 for vox in range(dst_shape[i]):
-                    if vox//ratio == (neuron_location[i] - src_subregion[0][i]):
+                    if int(vox/ratio) == (neuron_location[i] - src_subregion[0][i]):
                         target_vox = vox
                         dst_vox_dict[i].add(target_vox)
             elif src_shape[i] == dst_shape[i]:
diff --git a/src/evo/templates.py b/src/evo/templates.py
index 4c3d54b6c..9f23295d3 100644
--- a/src/evo/templates.py
+++ b/src/evo/templates.py
@@ -26,116 +26,192 @@
                 "enabled": True,
                 "cortical_name": "Infrared sensor",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "i_iinf": {
                 "enabled": True,
                 "cortical_name": "Infrared sensor (Inverse)",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "idgpio": {
+                "enabled": True,
+                "cortical_name": "Digital GPIO input",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
-            "i_gpio": {
+            "iagpio": {
                 "enabled": True,
-                "cortical_name": "GPIO input",
+                "cortical_name": "Analog GPIO input",
                 "structure": "asymmetric",
-                "resolution": [13, 1, 1]
+                "resolution": [28, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "i__pro": {
                 "enabled": True,
                 "cortical_name": "Proximity sensor",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 10]
+                "resolution": [1, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "i__acc": {
                 "enabled": True,
                 "cortical_name": "Accelerometer sensor",
                 "structure": "symmetric",
-                "resolution": [3, 1, 21]
+                "resolution": [3, 1, 21],
+                "coordinate_3d": [20, 0, 0]
             },
             "i__gyr": {
                 "enabled": True,
                 "cortical_name": "Gyro sensor",
                 "structure": "symmetric",
-                "resolution": [3, 1, 21]
+                "resolution": [3, 1, 21],
+                "coordinate_3d": [20, 0, 0]
             },
             "ishock": {
                 "enabled": True,
                 "cortical_name": "Shock sensor",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "i__bat": {
                 "enabled": True,
                 "cortical_name": "Battery gauge",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 10]
+                "resolution": [1, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00_C": {
                 "enabled": True,
                 "cortical_name": "Central vision sensor",
                 "structure": "asymmetric",
-                "resolution": [64, 64, 1]
+                "resolution": [64, 64, 1],
+                "coordinate_3d": [20, 30, -20]
             },
             "iv00TR": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - top right",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [55, 105, -20]
             },
             "iv00TL": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - top left",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00TM": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - top middle",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00ML": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - middle left",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00MR": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - middle right",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00BL": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - bottom left",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00BR": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - bottom right",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "iv00BM": {
                 "enabled": True,
                 "cortical_name": "Peripheral vision sensor - bottom middle",
                 "structure": "asymmetric",
-                "resolution": [8, 8, 1]
+                "resolution": [8, 8, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "i___id": {
                 "enabled": True,
                 "cortical_name": "ID Trainer",
                 "structure": "asymmetric",
-                "resolution": [1, 10, 1]
+                "resolution": [1, 10, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "i_spos": {
                 "enabled": True,
                 "cortical_name": "Servo position sensor",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 21]
+                "resolution": [1, 1, 21],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "i_smot": {
+                "enabled": True,
+                "cortical_name": "Servo motion sensor",
+                "structure": "asymmetric",
+                "resolution": [1, 1, 21],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "i__bci": {
+                "enabled": True,
+                "cortical_name": "BCI",
+                "structure": "asymmetric",
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             }
+        },
+        "name_to_id_mapping": {
+            "infrared": [
+                "i__inf",
+                "ii_inf"
+            ],
+            "proximity": [
+                "i__pro"
+            ],
+            "gpio": [
+                "idgpio",
+                "iagpio"
+            ],
+            "accelerometer": [
+                "i__acc"
+            ],
+            "gyro": [
+                "i__gyr"
+            ],
+            "shock": [
+                "ishock"
+            ],
+            "battery": [
+                "i__bat"
+            ],
+            "camera": [
+                "iv00_C",
+                "iv00TL",
+                "iv00TM",
+                "iv00TR",
+                "iv00ML",
+                "iv00MR",
+                "iv00BL",
+                "iv00BR",
+                "iv00BM"
+            ]
         }
     },
     "OPU": {
@@ -145,111 +221,165 @@
                 "enabled": True,
                 "cortical_name": "Motor control",
                 "structure": "asymmetric",
-                "resolution": [2, 1, 10]
+                "resolution": [2, 1, 10],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "odgpio": {
+                "enabled": True,
+                "cortical_name": "Digital GPIO output",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "oagpio": {
+                "enabled": True,
+                "cortical_name": "Analog GPIO output",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 10],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "oogpio": {
+                "enabled": True,
+                "cortical_name": "GPIO output pin assignment",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "oigpio": {
+                "enabled": True,
+                "cortical_name": "GPIO input pin assignment",
+                "structure": "asymmetric",
+                "resolution": [28, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "o__ser": {
                 "enabled": True,
                 "cortical_name": "Servo control",
                 "structure": "asymmetric",
-                "resolution": [2, 1, 10]
+                "resolution": [2, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o__nav": {
                 "enabled": True,
                 "cortical_name": "Navigation vector",
                 "structure": "asymmetric",
-                "resolution": [3, 1, 21]
+                "resolution": [3, 1, 21],
+                "coordinate_3d": [20, 0, 0]
             },
             "o__spd": {
                 "enabled": True,
                 "cortical_name": "Navigation speed",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 10]
+                "resolution": [1, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o__bat": {
                 "enabled": True,
                 "cortical_name": "Battery charger",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 10]
+                "resolution": [1, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_init": {
                 "enabled": True,
                 "cortical_name": "Position initializer",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
-            "o__pup": {
+            "ov_mod": {
                 "enabled": True,
-                "cortical_name": "Pupil control",
+                "cortical_name": "Central Vision Modulation",
                 "structure": "asymmetric",
-                "resolution": [2, 1, 10]
+                "resolution": [2, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
-            "o__gaz": {
+            "ov_ecc": {
                 "enabled": True,
-                "cortical_name": "Gaze control",
+                "cortical_name": "Central Vision Eccentricity",
                 "structure": "asymmetric",
-                "resolution": [2, 1, 10]
+                "resolution": [2, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_spos": {
                 "enabled": True,
                 "cortical_name": "Servo Position OPU",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 10]
+                "resolution": [1, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_blnk": {
                 "enabled": True,
                 "cortical_name": "Blink",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "o___id": {
                 "enabled": True,
                 "cortical_name": "ID Recognition",
                 "structure": "asymmetric",
-                "resolution": [1, 10, 1]
+                "resolution": [1, 10, 1],
+                "coordinate_3d": [20, 0, 0]
+            },
+            "o__loc": {
+                "enabled": True,
+                "cortical_name": "Recognition Location",
+                "structure": "asymmetric",
+                "resolution": [32, 32, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "ov_enh": {
                 "enabled": True,
                 "cortical_name": "Lighting enhancement",
                 "structure": "asymmetric",
-                "resolution": [3, 1, 10]
+                "resolution": [3, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "ovtune": {
                 "enabled": True,
                 "cortical_name": "Lighting threshold",
                 "structure": "asymmetric",
-                "resolution": [2, 1, 10]
+                "resolution": [2, 1, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_misc": {
                 "enabled": True,
                 "cortical_name": "Miscellaneous",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_mctl": {
                 "enabled": True,
                 "cortical_name": "Motion control",
                 "structure": "asymmetric",
-                "resolution": [4, 3, 10]
+                "resolution": [4, 3, 10],
+                "coordinate_3d": [20, 0, 0]
             },
             "ovflph": {
                 "enabled": True,
                 "cortical_name": "Vision horizontal flip",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "ovflpv": {
                 "enabled": True,
                 "cortical_name": "Vision vertical flip",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             },
             "o_stop": {
                 "enabled": True,
                 "cortical_name": "Emergency stop",
                 "structure": "asymmetric",
-                "resolution": [1, 1, 1]
+                "resolution": [1, 1, 1],
+                "coordinate_3d": [20, 0, 0]
             }
-        }
+        },
+        "name_to_id_mapping": {}
     },
     "CORE": {
         "gui_name": "Core",
diff --git a/src/evo/voxels.py b/src/evo/voxels.py
index 73c946cc2..238a4bcad 100644
--- a/src/evo/voxels.py
+++ b/src/evo/voxels.py
@@ -14,10 +14,13 @@
 # limitations under the License.
 # ==============================================================================
 
+import json
 from math import floor
 from src.inf import runtime_data
 import logging
-import traceback
+
+from src.evo.cortical_area import cortical_area_type
+from src.evo.templates import cortical_types
 
 
 logger = logging.getLogger(__name__)
@@ -320,3 +323,98 @@ def subregion_neurons(src_cortical_area, region_definition):
         print("Exception while processing subregion neurons", e)
         pass
     return neurons
+
+
+def generate_cortical_dimensions_by_id():
+    """
+    Generates the information needed to display cortical areas on Godot
+    """
+    cortical_information = {}
+
+    for cortical_area in runtime_data.genome["blueprint"]:
+        cortical_information[cortical_area] = {}
+        genes = runtime_data.genome["blueprint"][cortical_area]
+
+        if "visualization" in genes:
+            cortical_visibility = genes["visualization"]
+            if not genes["visualization"]:
+                cortical_visibility = False
+        else:
+            cortical_visibility = True
+
+        cortical_information[cortical_area]["cortical_name"] = genes["cortical_name"]
+        cortical_information[cortical_area]["cortical_group"] = genes["group_id"]
+        cortical_information[cortical_area]["cortical_sub_group"] = genes["sub_group_id"]
+        cortical_information[cortical_area]["visible"] = cortical_visibility
+
+        cortical_information[cortical_area]["coordinates_2d"] = [
+            genes["2d_coordinate"][0],
+            genes["2d_coordinate"][1]
+        ]
+
+        cortical_information[cortical_area]["coordinates_3d"] = [
+            genes["relative_coordinate"][0],
+            genes["relative_coordinate"][1],
+            genes["relative_coordinate"][2]
+        ]
+
+        dim_x = genes["block_boundaries"][0]
+        dim_y = genes["block_boundaries"][1]
+        dim_z = genes["block_boundaries"][2]
+
+        cortical_information[cortical_area]["cortical_dimensions"] = [
+            dim_x,
+            dim_y,
+            dim_z
+        ]
+
+        cortical_type = cortical_area_type(cortical_area=cortical_area)
+        if cortical_type in ["IPU", "OPU"]:
+            if "dev_count" not in runtime_data.genome["blueprint"][cortical_area]:
+                runtime_data.genome["blueprint"][cortical_area]["dev_count"] = \
+                    int(runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] /
+                        cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][0])
+
+            dev_count = runtime_data.genome["blueprint"][cortical_area]["dev_count"]
+
+            cortical_information[cortical_area]["dev_count"] = dev_count
+
+            cortical_information[cortical_area]["cortical_dimensions_per_device"] = [
+                int(dim_x / dev_count),
+                dim_y,
+                dim_z
+            ]
+
+    with open(runtime_data.connectome_path+"cortical_data_by_id.json", "w") as data_file:
+        data_file.seek(0)
+        data_file.write(json.dumps(cortical_information, indent=3))
+        data_file.truncate()
+
+    return cortical_information
+
+
+def generate_cortical_dimensions():
+    """
+    Generates the information needed to display cortical areas on Godot
+    """
+    cortical_information = {}
+
+    for cortical_area in runtime_data.genome["blueprint"]:
+        cortical_name = runtime_data.genome["blueprint"][cortical_area]["cortical_name"]
+        cortical_information[cortical_name] = []
+        genes = runtime_data.genome["blueprint"][cortical_area]
+        cortical_information[cortical_name].append(genes["relative_coordinate"][0])
+        cortical_information[cortical_name].append(genes["relative_coordinate"][1])
+        cortical_information[cortical_name].append(genes["relative_coordinate"][2])
+        cortical_information[cortical_name].append(genes["visualization"])
+        cortical_information[cortical_name].append(genes["block_boundaries"][0])
+        cortical_information[cortical_name].append(genes["block_boundaries"][1])
+        cortical_information[cortical_name].append(genes["block_boundaries"][2])
+        cortical_information[cortical_name].append(cortical_area)
+
+    with open(runtime_data.connectome_path+"cortical_data.json", "w") as data_file:
+        data_file.seek(0)
+        data_file.write(json.dumps(cortical_information, indent=3))
+        data_file.truncate()
+
+    return cortical_information
diff --git a/src/evo/x_genesis.py b/src/evo/x_genesis.py
index 2da509fd5..d6807e1da 100644
--- a/src/evo/x_genesis.py
+++ b/src/evo/x_genesis.py
@@ -27,23 +27,31 @@
 import traceback
 
 # from src.evo import neuron, synapse, stats, genetics, voxels, neuroembryogenesis, templates
-from src.evo import synapse, voxels, neuroembryogenesis, templates
+from src.evo import voxels, neuroembryogenesis
+from src.evo.templates import cortical_template, cortical_types
+from src.evo.synapse import synaptic_pruner, morphology_usage_list, cortical_areas_sharing_same_morphology
 # from functools import partial
 # from multiprocessing import Pool, Process
 # from src.inf import disk_ops
 # from src.inf import settings
 from src.inf import runtime_data
-from src.evo.genome_processor import genome_1_cortical_list, genome_v1_v2_converter, genome_2_1_convertor, is_memory_cortical_area
+from src.evo.genome_processor import genome_1_cortical_list, genome_v1_v2_converter, genome_2_1_convertor, \
+    is_memory_cortical_area
 from src.evo.genome_editor import save_genome
+from src.evo.voxels import generate_cortical_dimensions_by_id, generate_cortical_dimensions
 from src.evo.connectome import reset_connectome_file
+from src.evo.region import create_region
+from src.evo.cortical_area import area_is_system, cortical_area_type
+from src.evo.synapse import neighboring_cortical_areas
 from src.evo.neuroembryogenesis import cortical_name_list, develop, generate_plasticity_dict
-from src.inf.initialize import generate_cortical_dimensions, generate_cortical_dimensions_by_id, init_fcl, \
-    init_memory_register, init_cortical_cumulative_stats
+from src.inf.initialize import init_fcl, init_memory_register, init_cortical_cumulative_stats
+from src.api.schemas import NewRegionProperties
+
 
 # from src.evo.synaptogenesis_rules import syn_memory
 
 logger = logging.getLogger(__name__)
-
+sentinel = object()
 
 class CustomError(Exception):
     def __init__(self, message, status_code):
@@ -119,221 +127,283 @@ def update_cortical_properties(cortical_properties):
     - Cortical name
 
     """
-    changed_areas = set()
-    regeneration_flag = False
-
-    if 'cortical_id' not in cortical_properties:
-        print("ERROR: Cortical change request did not include --cortical id--")
-        return
-
-    logger.info(f"+++++++++++++++++++++   Cortical Change Request Received for %s ++++++++++++++++++++++++"
-                f"  {cortical_properties['cortical_id']}")
-    cortical_area = cortical_properties['cortical_id']
-
-    if cortical_properties['cortical_name'] is not None:
-        runtime_data.genome['blueprint'][cortical_area]["cortical_name"] = \
-            cortical_properties['cortical_name']
-        changed_areas.add("name")
-
-    if cortical_properties['cortical_coordinates'] is not None:
-        x_cortical_reposition(cortical_area=cortical_area,
-                              new_coordinates=cortical_properties['cortical_coordinates'])
-        changed_areas.add("3d_loc")
-
-    if cortical_properties['cortical_coordinates_2d'] is not None:
-        x_cortical_reposition_2d(cortical_area=cortical_area,
-                                 new_coordinates=cortical_properties['cortical_coordinates_2d'])
-        changed_areas.add("2d_loc")
-
-    if cortical_properties['neuron_fire_threshold'] is not None:
-        runtime_data.genome['blueprint'][cortical_area]['firing_threshold'] = \
-            cortical_properties['neuron_fire_threshold']
-
-        for neuron_ in runtime_data.brain[cortical_area]:
-            runtime_data.brain[cortical_area][neuron_]['firing_threshold'] = \
+
+    if runtime_data.brain_readiness:
+        runtime_data.brain_readiness = False
+
+        changed_areas = set()
+        regeneration_flag = False
+
+        if 'cortical_id' not in cortical_properties:
+            print("ERROR: Cortical change request did not include --cortical id--")
+            return
+
+        print("*__" * 50)
+        print("Cortical properties:\n", cortical_properties)
+
+        logger.info(f"+++++++++++++++++++++   Cortical Change Request Received for %s ++++++++++++++++++++++++"
+                    f"  {cortical_properties['cortical_id']}")
+        cortical_area = cortical_properties['cortical_id']
+        cortical_type = cortical_area_type(cortical_area=cortical_area)
+        runtime_data.transforming_areas.add(cortical_area)
+
+        if cortical_properties.get('cortical_name'):
+            runtime_data.genome['blueprint'][cortical_area]["cortical_name"] = \
+                cortical_properties['cortical_name']
+            changed_areas.add("name")
+
+        if cortical_properties.get('coordinates_3d'):
+            x_cortical_reposition(cortical_area=cortical_area,
+                                  new_coordinates=cortical_properties['coordinates_3d'])
+            changed_areas.add("3d_loc")
+
+        if cortical_properties.get('coordinates_2d'):
+            x_cortical_reposition_2d(cortical_area=cortical_area,
+                                     new_coordinates=cortical_properties['coordinates_2d'])
+            changed_areas.add("2d_loc")
+
+        if 'neuron_fire_threshold' in cortical_properties:
+            runtime_data.genome['blueprint'][cortical_area]['firing_threshold'] = \
                 cortical_properties['neuron_fire_threshold']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_post_synaptic_potential'] is not None:
-        for neuron_id in runtime_data.brain[cortical_area]:
-            for dst_neuron in runtime_data.brain[cortical_area][neuron_id]["neighbors"]:
-                runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron]["postsynaptic_current"] = \
-                    cortical_properties['neuron_post_synaptic_potential']
-        runtime_data.genome['blueprint'][cortical_area]["postsynaptic_current"] = \
-            cortical_properties['neuron_post_synaptic_potential']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_refractory_period'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["refractory_period"] = \
-            cortical_properties['neuron_refractory_period']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_excitability'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
-            cortical_properties['neuron_excitability']
-        runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
-            cortical_properties['neuron_excitability']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_snooze_period'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["snooze_length"] = \
-            cortical_properties['neuron_snooze_period']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_degeneracy_coefficient'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["degeneration"] = \
-            cortical_properties['neuron_degeneracy_coefficient']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_post_synaptic_potential_max'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["postsynaptic_current_max"] = \
-            cortical_properties['neuron_post_synaptic_potential_max']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_consecutive_fire_count'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["consecutive_fire_cnt_max"] = \
-            cortical_properties['neuron_consecutive_fire_count']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_mp_charge_accumulation'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["mp_charge_accumulation"] = \
-            cortical_properties['neuron_mp_charge_accumulation']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['neuron_mp_driven_psp'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["mp_driven_psp"] = \
-            cortical_properties['neuron_mp_driven_psp']
-        changed_areas.add("blueprint")
-
-    if cortical_properties['cortical_visibility'] is not None:
-        runtime_data.genome["blueprint"][cortical_area]["visualization"] = \
-            cortical_properties['cortical_visibility']
-        changed_areas.add("3d_viz")
-
-    # ####################################################
-    # Conditions that require cortical regeneration
-    # ####################################################
-    if cortical_properties['cortical_dimensions'] is not None:
-        if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] != \
-                cortical_properties['cortical_dimensions'][0] and cortical_properties['cortical_dimensions'][0] > 0:
-            regeneration_flag = True
-            runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] = \
-                cortical_properties['cortical_dimensions'][0]
-            changed_areas.add("3d_dimm")
-        if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] != \
-                cortical_properties['cortical_dimensions'][1] and cortical_properties['cortical_dimensions'][1] > 0:
-            regeneration_flag = True
-            runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] = \
-                cortical_properties['cortical_dimensions'][1]
-            changed_areas.add("3d_dimm")
-        if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] != \
-                cortical_properties['cortical_dimensions'][2] and cortical_properties['cortical_dimensions'][2] > 0:
-            regeneration_flag = True
-            runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] = \
-                cortical_properties['cortical_dimensions'][2]
-            changed_areas.add("3d_dimm")
-
-    if cortical_properties['cortical_neuron_per_vox_count'] is not None:
-        if runtime_data.genome["blueprint"][cortical_area]["per_voxel_neuron_cnt"] != \
-                cortical_properties['cortical_neuron_per_vox_count']:
-            regeneration_flag = True
-            runtime_data.genome["blueprint"][cortical_area]["per_voxel_neuron_cnt"] = \
-                cortical_properties['cortical_neuron_per_vox_count']
+
+            for neuron_ in runtime_data.brain[cortical_area]:
+                runtime_data.brain[cortical_area][neuron_]['firing_threshold'] = \
+                    cortical_properties['neuron_fire_threshold']
             changed_areas.add("blueprint")
 
-    if cortical_properties['cortical_synaptic_attractivity'] is not None:
-        if runtime_data.genome["blueprint"][cortical_area]["synapse_attractivity"] != \
-                cortical_properties['cortical_synaptic_attractivity']:
-            regeneration_flag = True
-            runtime_data.genome["blueprint"][cortical_area]["synapse_attractivity"] = \
-                cortical_properties['cortical_synaptic_attractivity']
+        if 'neuron_post_synaptic_potential' in cortical_properties:
+            for neuron_id in runtime_data.brain[cortical_area]:
+                for dst_neuron in runtime_data.brain[cortical_area][neuron_id]["neighbors"]:
+                    runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron]["postsynaptic_current"] = \
+                        cortical_properties['neuron_post_synaptic_potential']
+            runtime_data.genome['blueprint'][cortical_area]["postsynaptic_current"] = \
+                cortical_properties['neuron_post_synaptic_potential']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_leak_variability'] is not None:
-        if runtime_data.genome["blueprint"][cortical_area]["leak_variability"] != \
-                cortical_properties['neuron_leak_variability']:
-            regeneration_flag = True
-            runtime_data.genome['blueprint'][cortical_area]["leak_variability"] = \
-                cortical_properties['neuron_leak_variability']
+        if 'neuron_refractory_period' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["refractory_period"] = \
+                cortical_properties['neuron_refractory_period']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_leak_coefficient'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] != \
-                cortical_properties['neuron_leak_coefficient']:
-            runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] = \
-                cortical_properties['neuron_leak_coefficient']
-            regeneration_flag = True
+        if 'neuron_excitability' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
+                cortical_properties['neuron_excitability']
+            runtime_data.genome["blueprint"][cortical_area]["neuron_excitability"] = \
+                cortical_properties['neuron_excitability']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_psp_uniform_distribution'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] != \
-                cortical_properties['neuron_psp_uniform_distribution']:
-            runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] = \
-                cortical_properties['neuron_psp_uniform_distribution']
-            regeneration_flag = True
+        if 'neuron_snooze_period' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["snooze_length"] = \
+                cortical_properties['neuron_snooze_period']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_longterm_mem_threshold'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] != \
-                cortical_properties['neuron_longterm_mem_threshold']:
-            runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] = \
-                cortical_properties['neuron_longterm_mem_threshold']
-            regeneration_flag = False
+        if 'neuron_degeneracy_coefficient' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["degeneration"] = \
+                cortical_properties['neuron_degeneracy_coefficient']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_lifespan_growth_rate'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] != \
-                cortical_properties['neuron_lifespan_growth_rate']:
-            runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] = \
-                cortical_properties['neuron_lifespan_growth_rate']
-            regeneration_flag = False
+        if 'neuron_post_synaptic_potential_max' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["postsynaptic_current_max"] = \
+                cortical_properties['neuron_post_synaptic_potential_max']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_init_lifespan'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] != \
-                cortical_properties['neuron_init_lifespan']:
-            runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] = \
-                cortical_properties['neuron_init_lifespan']
-            regeneration_flag = False
+        if 'neuron_consecutive_fire_count' in cortical_properties:
+            runtime_data.genome["blueprint"][cortical_area]["consecutive_fire_cnt_max"] = \
+                cortical_properties['neuron_consecutive_fire_count']
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_fire_threshold_increment'] is not None:
-        genome_fire_threshold_increment = [
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_x"],
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_y"],
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_z"]
-        ]
-        if genome_fire_threshold_increment != \
-                cortical_properties['neuron_fire_threshold_increment']:
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_x"] = \
-                cortical_properties['neuron_fire_threshold_increment'][0]
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_y"] = \
-                cortical_properties['neuron_fire_threshold_increment'][1]
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_z"] = \
-                cortical_properties['neuron_fire_threshold_increment'][2]
-            regeneration_flag = True
+        neuron_mp_charge_accumulation = cortical_properties.get('neuron_mp_charge_accumulation', sentinel)
+        if neuron_mp_charge_accumulation is not sentinel:
+            runtime_data.genome["blueprint"][cortical_area]["mp_charge_accumulation"] = neuron_mp_charge_accumulation
             changed_areas.add("blueprint")
 
-    if cortical_properties['neuron_firing_threshold_limit'] is not None:
-        if runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] != \
-                cortical_properties['neuron_firing_threshold_limit']:
-            runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] = \
-                cortical_properties['neuron_firing_threshold_limit']
-            regeneration_flag = True
+        neuron_mp_driven_psp = cortical_properties.get('neuron_mp_driven_psp', sentinel)
+        if neuron_mp_driven_psp is not sentinel:
+            runtime_data.genome["blueprint"][cortical_area]["mp_driven_psp"] = neuron_mp_driven_psp
             changed_areas.add("blueprint")
 
-    if regeneration_flag:
-        print("@-----@ " * 10)
-        logger.info(f"Cortical regeneration triggered for {cortical_area}")
-        cortical_regeneration(cortical_area=cortical_area)
+        if "cortical_visibility" in cortical_properties:
+            if cortical_properties["cortical_visibility"]:
+                runtime_data.genome["blueprint"][cortical_area]["visualization"] = True
+                if cortical_area in runtime_data.cortical_viz_list:
+                    runtime_data.cortical_viz_list.remove(cortical_area)
+            else:
+                runtime_data.genome["blueprint"][cortical_area]["visualization"] = False
+                runtime_data.cortical_viz_list.add(cortical_area)
+
+            changed_areas.add("3d_viz")
+
+        # ####################################################
+        # Conditions that require cortical regeneration
+        # ####################################################
+
+        if cortical_type in ["IPU", "OPU"]:
+            if "cortical_dimensions_per_device" in cortical_properties or "dev_count" in cortical_properties:
+                dev_count = runtime_data.genome["blueprint"][cortical_area]["dev_count"]
+                dev_count_updated = False
+
+                if cortical_properties.get('dev_count'):
+                    runtime_data.genome["blueprint"][cortical_area]["dev_count"] = cortical_properties['dev_count']
+                    dev_count = runtime_data.genome["blueprint"][cortical_area]["dev_count"]
+                    changed_areas.add("dev_count")
+                    print("Dev count updated !!! " * 5)
+                    dev_count_updated = True
+
+                dim_change_detected = False
+
+                # Initialize dimensions from existing cortical info
+                old_dim_x = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][0]
+                old_dim_y = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][1]
+                old_dim_z = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][2]
+
+                if cortical_properties.get('cortical_dimensions_per_device'):
+                    new_dim_x, new_dim_y, new_dim_z = cortical_properties['cortical_dimensions_per_device']
+                else:
+                    new_dim_x = old_dim_x
+                    new_dim_y = old_dim_y
+                    new_dim_z = old_dim_z
+
+                if (old_dim_x != new_dim_x and new_dim_x > 0) or \
+                        (old_dim_y != new_dim_y and new_dim_y > 0) or \
+                        (old_dim_z != new_dim_z and new_dim_z > 0):
+                    dim_change_detected = True
+
+                if dim_change_detected or dev_count_updated:
+
+                    cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][0] = new_dim_x
+                    cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][1] = new_dim_y
+                    cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][2] = new_dim_z
+
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] = new_dim_x * dev_count
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] = new_dim_y
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] = new_dim_z
 
-    runtime_data.cortical_dimensions = generate_cortical_dimensions()
-    runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
-    save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
-                file_name=runtime_data.connectome_path + "genome.json")
-    runtime_data.last_genome_modification_time = datetime.datetime.now()
-    runtime_data.transforming_areas.remove(cortical_area)
-    update_evo_change_register(change_area=changed_areas)
+                    regeneration_flag = True
+                    changed_areas.add("3d_dimm")
+
+        else:
+            if cortical_properties.get('cortical_dimensions'):
+
+                new_dim_x, new_dim_y, new_dim_z = cortical_properties['cortical_dimensions']
+
+                if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] != new_dim_x and new_dim_x > 0:
+                    regeneration_flag = True
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] = new_dim_x
+
+                if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] != new_dim_y and new_dim_y > 0:
+                    regeneration_flag = True
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] = new_dim_y
+
+                if runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] != new_dim_z and new_dim_z > 0:
+                    regeneration_flag = True
+                    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] = new_dim_z
+
+                changed_areas.add("3d_dimm")
+
+        if 'cortical_neuron_per_vox_count' in cortical_properties:
+            if runtime_data.genome["blueprint"][cortical_area]["per_voxel_neuron_cnt"] != \
+                    cortical_properties['cortical_neuron_per_vox_count']:
+                regeneration_flag = True
+                runtime_data.genome["blueprint"][cortical_area]["per_voxel_neuron_cnt"] = \
+                    cortical_properties['cortical_neuron_per_vox_count']
+                changed_areas.add("blueprint")
+
+        if 'cortical_synaptic_attractivity' in cortical_properties:
+            if runtime_data.genome["blueprint"][cortical_area]["synapse_attractivity"] != \
+                    cortical_properties['cortical_synaptic_attractivity']:
+                regeneration_flag = True
+                runtime_data.genome["blueprint"][cortical_area]["synapse_attractivity"] = \
+                    cortical_properties['cortical_synaptic_attractivity']
+                changed_areas.add("blueprint")
+
+        if 'neuron_leak_variability' in cortical_properties:
+            if runtime_data.genome["blueprint"][cortical_area]["leak_variability"] != \
+                    cortical_properties['neuron_leak_variability']:
+                regeneration_flag = True
+                runtime_data.genome['blueprint'][cortical_area]["leak_variability"] = \
+                    cortical_properties['neuron_leak_variability']
+                changed_areas.add("blueprint")
+
+        if 'neuron_leak_coefficient' in cortical_properties:
+            if runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] != \
+                    cortical_properties['neuron_leak_coefficient']:
+                runtime_data.genome['blueprint'][cortical_area]["leak_coefficient"] = \
+                    cortical_properties['neuron_leak_coefficient']
+                regeneration_flag = True
+                changed_areas.add("blueprint")
+
+        neuron_psp_uniform_distribution = cortical_properties.get('neuron_psp_uniform_distribution', sentinel)
+        if neuron_psp_uniform_distribution is not sentinel:
+            if runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] != \
+                    neuron_psp_uniform_distribution:
+                runtime_data.genome['blueprint'][cortical_area]["psp_uniform_distribution"] = \
+                    neuron_psp_uniform_distribution
+                regeneration_flag = True
+                changed_areas.add("blueprint")
+
+        if 'neuron_longterm_mem_threshold' in cortical_properties:
+            if runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] != \
+                    cortical_properties['neuron_longterm_mem_threshold']:
+                runtime_data.genome['blueprint'][cortical_area]["longterm_mem_threshold"] = \
+                    cortical_properties['neuron_longterm_mem_threshold']
+                regeneration_flag = False
+                changed_areas.add("blueprint")
+
+        if 'neuron_lifespan_growth_rate' in cortical_properties:
+            if runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] != \
+                    cortical_properties['neuron_lifespan_growth_rate']:
+                runtime_data.genome['blueprint'][cortical_area]["lifespan_growth_rate"] = \
+                    cortical_properties['neuron_lifespan_growth_rate']
+                regeneration_flag = False
+                changed_areas.add("blueprint")
+
+        if 'neuron_init_lifespan' in cortical_properties:
+            if runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] != \
+                    cortical_properties['neuron_init_lifespan']:
+                runtime_data.genome['blueprint'][cortical_area]["init_lifespan"] = \
+                    cortical_properties['neuron_init_lifespan']
+                regeneration_flag = False
+                changed_areas.add("blueprint")
+
+        if cortical_properties.get('neuron_fire_threshold_increment'):
+            genome_fire_threshold_increment = [
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_x"],
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_y"],
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_z"]
+            ]
+            if genome_fire_threshold_increment != \
+                    cortical_properties['neuron_fire_threshold_increment']:
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_x"] = \
+                    cortical_properties['neuron_fire_threshold_increment'][0]
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_y"] = \
+                    cortical_properties['neuron_fire_threshold_increment'][1]
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_increment_z"] = \
+                    cortical_properties['neuron_fire_threshold_increment'][2]
+                regeneration_flag = True
+                changed_areas.add("blueprint")
+
+        if 'neuron_firing_threshold_limit' in cortical_properties:
+            if runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] != \
+                    cortical_properties['neuron_firing_threshold_limit']:
+                runtime_data.genome['blueprint'][cortical_area]["firing_threshold_limit"] = \
+                    cortical_properties['neuron_firing_threshold_limit']
+                regeneration_flag = True
+                changed_areas.add("blueprint")
+
+        if regeneration_flag:
+            cortical_regeneration(cortical_area=cortical_area)
+
+        runtime_data.cortical_dimensions = generate_cortical_dimensions()
+        runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+        save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                    file_name=runtime_data.connectome_path + "genome.json")
+        runtime_data.last_genome_modification_time = datetime.datetime.now()
+
+        runtime_data.transforming_areas.remove(cortical_area)
+        print(f">> {cortical_area} is no longer transforming..")
+        update_evo_change_register(change_area=changed_areas)
+
+        runtime_data.brain_readiness = True
 
 
 def update_evo_change_register(change_area: set):
@@ -343,93 +413,99 @@ def update_evo_change_register(change_area: set):
 
 
 def update_cortical_mappings(cortical_mappings):
-    cortical_area = cortical_mappings["src_cortical_area"]
-    dst_cortical_area = cortical_mappings["dst_cortical_area"]
-    mappings = cortical_mappings["mapping_data"]
 
-    #  ------- Cleanup prior mappings ---------
-    runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
-                                                 dst_cortical_area=dst_cortical_area)
+    if runtime_data.brain_readiness:
+        runtime_data.brain_readiness = False
 
-    if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
-        runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
+        cortical_area = cortical_mappings["src_cortical_area"]
+        dst_cortical_area = cortical_mappings["dst_cortical_area"]
+        mappings = cortical_mappings["mapping_data"]
 
-        # todo externalize this as a function
-        # Clean Upstream neuron associations
-        for neuron_ in runtime_data.brain[dst_cortical_area]:
-            for upstream_neuron in runtime_data.brain[dst_cortical_area][neuron_]["upstream_neurons"].copy():
-                if upstream_neuron[:6] == cortical_area:
-                    runtime_data.brain[dst_cortical_area][neuron_]["upstream_neurons"].discard(upstream_neuron)
+        #  ------- Cleanup prior mappings ---------
+        runtime_data.brain = synaptic_pruner(src_cortical_area=cortical_area,
+                                             dst_cortical_area=dst_cortical_area)
 
-    # -------- Update supporting data structures -------
-    src_is_mem = is_memory_cortical_area(cortical_area=cortical_area)
-    dst_is_mem = is_memory_cortical_area(cortical_area=dst_cortical_area)
+        if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
+            runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
 
-    if src_is_mem or dst_is_mem:
-        # todo: only update impacted areas
-        init_memory_register()
+            # todo externalize this as a function
+            # Clean Upstream neuron associations
+            for neuron_ in runtime_data.brain[dst_cortical_area]:
+                for upstream_neuron in runtime_data.brain[dst_cortical_area][neuron_]["upstream_neurons"].copy():
+                    if upstream_neuron[:6] == cortical_area:
+                        runtime_data.brain[dst_cortical_area][neuron_]["upstream_neurons"].discard(upstream_neuron)
 
-    #  ------- Add new mappings ---------
-    runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = mappings
+        # -------- Update supporting data structures -------
+        src_is_mem = is_memory_cortical_area(cortical_area=cortical_area)
+        dst_is_mem = is_memory_cortical_area(cortical_area=dst_cortical_area)
 
-    if not mappings:
-        runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
-        if is_memory_cortical_area(cortical_area=dst_cortical_area):
-            if dst_cortical_area in runtime_data.memory_register:
-                if cortical_area in runtime_data.memory_register[dst_cortical_area]:
-                    runtime_data.memory_register[dst_cortical_area].remove(cortical_area)
-    else:
-        print("*****************              ************************        ********************")
-        # todo: very inefficient. Need to only initiate synaptogenesis on changed links instead of all connections
-        neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
-
-    # if src_is_mem and not dst_is_mem:
-    #     for memory_neuron in runtime_data.brain[cortical_area]:
-    #         synapse.memory_to_non_memory_synapse(memory_cortical_area=cortical_area, memory_neuron_id=memory_neuron)
-    #     if mappings:
-    #         syn_memory(src_cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
-    #
-    # else:
-
-    # todo: only update impacted areas
-    generate_plasticity_dict()
-
-    save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
-                file_name=runtime_data.connectome_path + "genome.json")
-    update_evo_change_register(change_area={"mappings"})
-
-    # added_mappings, removed_mappings, modified_mappings = \
-    #     mapping_change_report(cortical_area=cortical_area, new_mapping=cortical_properties['cortical_destinations'])
-    #
-    # print(added_mappings, removed_mappings, modified_mappings)
-    #
-    # # Handle new mappings
-    # for dst_cortical_area in added_mappings:
-    #     neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
-    #
-    #     runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = \
-    #         cortical_properties['cortical_destinations'][dst_cortical_area]
-    #
-    # # Handle removed mappings
-    # for dst_cortical_area in removed_mappings:
-    #     runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
-    #                                                  dst_cortical_area=dst_cortical_area)
-    #
-    #     if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
-    #         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
-    #
-    # # Handle modified mappings
-    # for dst_cortical_area in modified_mappings:
-    #     runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
-    #                                                  dst_cortical_area=dst_cortical_area)
-    #
-    #     if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
-    #         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
-    #     runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = \
-    #         cortical_properties['cortical_destinations'][dst_cortical_area]
-    #
-    #     neuroembryogenesis.synaptogenesis(cortical_area=cortical_area,
-    #                                       dst_cortical_area=dst_cortical_area)
+        if src_is_mem or dst_is_mem:
+            # todo: only update impacted areas
+            init_memory_register()
+
+        #  ------- Add new mappings ---------
+        runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = mappings
+
+        if not mappings:
+            runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
+            if is_memory_cortical_area(cortical_area=dst_cortical_area):
+                if dst_cortical_area in runtime_data.memory_register:
+                    if cortical_area in runtime_data.memory_register[dst_cortical_area]:
+                        runtime_data.memory_register[dst_cortical_area].remove(cortical_area)
+        else:
+            print("*****************              ************************        ********************")
+            # todo: very inefficient. Need to only initiate synaptogenesis on changed links instead of all connections
+            neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
+
+        # if src_is_mem and not dst_is_mem:
+        #     for memory_neuron in runtime_data.brain[cortical_area]:
+        #         synapse.memory_to_non_memory_synapse(memory_cortical_area=cortical_area, memory_neuron_id=memory_neuron)
+        #     if mappings:
+        #         syn_memory(src_cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
+        #
+        # else:
+
+        # todo: only update impacted areas
+        generate_plasticity_dict()
+
+        save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                    file_name=runtime_data.connectome_path + "genome.json")
+        update_evo_change_register(change_area={"mappings"})
+
+        runtime_data.brain_readiness = True
+
+        # added_mappings, removed_mappings, modified_mappings = \
+        #     mapping_change_report(cortical_area=cortical_area, new_mapping=cortical_properties['cortical_destinations'])
+        #
+        # print(added_mappings, removed_mappings, modified_mappings)
+        #
+        # # Handle new mappings
+        # for dst_cortical_area in added_mappings:
+        #     neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
+        #
+        #     runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = \
+        #         cortical_properties['cortical_destinations'][dst_cortical_area]
+        #
+        # # Handle removed mappings
+        # for dst_cortical_area in removed_mappings:
+        #     runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
+        #                                                  dst_cortical_area=dst_cortical_area)
+        #
+        #     if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
+        #         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
+        #
+        # # Handle modified mappings
+        # for dst_cortical_area in modified_mappings:
+        #     runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=cortical_area,
+        #                                                  dst_cortical_area=dst_cortical_area)
+        #
+        #     if dst_cortical_area in runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst']:
+        #         runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'].pop(dst_cortical_area)
+        #     runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'][dst_cortical_area] = \
+        #         cortical_properties['cortical_destinations'][dst_cortical_area]
+        #
+        #     neuroembryogenesis.synaptogenesis(cortical_area=cortical_area,
+        #                                       dst_cortical_area=dst_cortical_area)
 
 
 def update_morphology_properties(morphology_properties):
@@ -442,7 +518,7 @@ def update_morphology_properties(morphology_properties):
                 morphology_properties['type']
             runtime_data.genome['neuron_morphologies'][morphology_properties['name']]["parameters"] = \
                 morphology_properties['parameters']
-            impacted_cortical_areas = synapse.cortical_areas_sharing_same_morphology(morphology_properties['name'])
+            impacted_cortical_areas = cortical_areas_sharing_same_morphology(morphology_properties['name'])
             print("<><><><><>   <><><><> Impacted areas", impacted_cortical_areas)
             for impacted_area in impacted_cortical_areas:
                 print(impacted_area[0], impacted_area[1])
@@ -459,31 +535,20 @@ def update_morphology_properties(morphology_properties):
         print("Error during morphology update\n", e, traceback.print_exc())
 
 
-def neighboring_cortical_areas(cortical_area, blueprint=None):
-    try:
-        if not blueprint:
-            blueprint = runtime_data.genome["blueprint"]
-        cortical_mappings = synapse.cortical_mapping(blueprint=blueprint)
-        upstream_cortical_areas = set()
-        downstream_cortical_areas = set(cortical_mappings[cortical_area])
-        for area in cortical_mappings:
-            if cortical_area in cortical_mappings[area]:
-                upstream_cortical_areas.add(area)
-        return upstream_cortical_areas, downstream_cortical_areas
-    except KeyError:
-        print("Exception in neighboring_cortical_areas: Cortical area not found", traceback.print_exc())
-
-
 def cortical_removal(cortical_area, genome_scrub=False):
     if cortical_area not in runtime_data.cortical_list:
         print("Error: Cortical area requested for removal does not exist:", cortical_area)
 
-    elif cortical_area in templates.cortical_types["CORE"]["supported_devices"]:
+    elif cortical_area in cortical_types["CORE"]["supported_devices"]:
         print("Error: Cortical areas of CORE type cannot be removed", cortical_area)
     else:
         print("Processing cortical removal for", cortical_area)
         msg = "Processing cortical removal request for" + cortical_area
         logger.info(msg=msg)
+
+        # Update neuron count
+        runtime_data.brain_stats["neuron_count"] -= len(runtime_data.brain[cortical_area])
+
         # cortical_area = cortical_id(cortical_name=cortical_name)
         upstream_cortical_areas, downstream_cortical_areas = \
             neighboring_cortical_areas(cortical_area, blueprint=runtime_data.genome["blueprint"])
@@ -491,11 +556,15 @@ def cortical_removal(cortical_area, genome_scrub=False):
         # Clean Upstream neuron associations
         if len(downstream_cortical_areas) > 0:
             for downstream_cortical_area in downstream_cortical_areas:
-                if downstream_cortical_area:
+                if downstream_cortical_area in runtime_data.brain:
                     for neuron in runtime_data.brain[downstream_cortical_area]:
-                        for upstream_neuron in runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].copy():
+                        for upstream_neuron in \
+                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].copy():
                             if upstream_neuron[:6] == cortical_area:
-                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].discard(upstream_neuron)
+                                runtime_data.brain[downstream_cortical_area][neuron]["upstream_neurons"].discard(
+                                    upstream_neuron)
+                else:
+                    print(f"ERROR!! {downstream_cortical_area} is in genome but not in connectome!")
 
         # Prune affected synapses
         prune_cortical_synapses(cortical_area=cortical_area)
@@ -507,6 +576,7 @@ def cortical_removal(cortical_area, genome_scrub=False):
         for memory_area in runtime_data.memory_register:
             if cortical_area in runtime_data.memory_register[memory_area]:
                 runtime_data.memory_register[memory_area].remove(cortical_area)
+
         if cortical_area in runtime_data.memory_register:
             del runtime_data.memory_register[cortical_area]
 
@@ -552,42 +622,46 @@ def prune_cortical_synapses(cortical_area):
 
     for src_cortical_area in upstream_cortical_areas:
         print("++++++ 2")
-        runtime_data.brain = synapse.synaptic_pruner(src_cortical_area=src_cortical_area,
-                                                     dst_cortical_area=cortical_area)
+        runtime_data.brain = synaptic_pruner(src_cortical_area=src_cortical_area,
+                                             dst_cortical_area=cortical_area)
 
 
 def cortical_regeneration(cortical_area):
     # Clearing the burst engine from neuronal activities
-    print("##### 1 #####")
+
     # Reset effected areas
+    logger.info(f"Cortical regeneration triggered for {cortical_area}")
+    print(f"{cortical_area} started the regeneration")
     cortical_removal(cortical_area=cortical_area)
-    print("##### 2 #####")
+
     x_corticogenesis(cortical_area)
-    print("%%%%%%%     Brain:\n", runtime_data.brain[cortical_area])
-    print("##### 3 #####")
+
     upstream_cortical_areas, downstream_cortical_areas = \
         neighboring_cortical_areas(cortical_area, runtime_data.genome["blueprint"])
-    print("##### 4 #####")
+
     # Recreate voxels
     neuroembryogenesis.voxelogenesis(cortical_area=cortical_area)
-    print("##### 5 #####")
+
     # Recreate neurons
     neuroembryogenesis.neurogenesis(cortical_area=cortical_area)
-    print("##### 6 #####")
+    print(f"{cortical_area} completed neurogenesis.")
 
-    print(runtime_data.genome["blueprint"][cortical_area])
     # Recreate synapses
     for src_cortical_area in upstream_cortical_areas:
         neuroembryogenesis.synaptogenesis(cortical_area=src_cortical_area, dst_cortical_area=cortical_area)
-    print("##### 7 #####", downstream_cortical_areas)
+
+    print(f"{cortical_area} completed synaptogenesis of upstream cortical areas.")
+
     for dst_cortical_area in downstream_cortical_areas:
         if dst_cortical_area:
             neuroembryogenesis.synaptogenesis(cortical_area=cortical_area, dst_cortical_area=dst_cortical_area)
 
+    print(f"{cortical_area} completed synaptogenesis of downstream cortical areas.")
+    print(f"---------- {cortical_area} has completed cortical regeneration successfully --------")
+
 
 def cortical_rewiring(src_cortical_area, dst_cortical_area):
-    print("++++++ 3")
-    synapse.synaptic_pruner(src_cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
+    synaptic_pruner(src_cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
     neuroembryogenesis.synaptogenesis(cortical_area=src_cortical_area, dst_cortical_area=dst_cortical_area)
 
 
@@ -614,181 +688,212 @@ def mapping_change_report(cortical_area, new_mapping):
     return added, removed, modified
 
 
-def cortical_id_gen(seed='___', is_memory=False):
-    while True:
-        chars = string.ascii_uppercase + string.digits
-        if not is_memory:
-            random_id = 'C' + str('').join(random.choice(chars) for _ in range(2)) + seed
-            if random_id not in runtime_data.cortical_list:
-                return random_id
-        else:
-            random_id = 'M' + str('').join(random.choice(chars) for _ in range(2)) + seed
-            if random_id not in runtime_data.cortical_list:
-                return random_id
-
-
 def add_core_cortical_area(cortical_properties):
     try:
-        template = templates.cortical_template.copy()
-        cortical_type = cortical_properties['cortical_type']
-        cortical_id_ = cortical_properties['cortical_id']
-        cortical_name = \
-            templates.cortical_types[cortical_type]["supported_devices"][cortical_id_]['cortical_name']
-
-        if cortical_id_ in runtime_data.genome['blueprint']:
-            print("Warning! Cortical area already part of genome. Nothing got added.")
-        else:
-            reset_connectome_file(cortical_area=cortical_id_)
-            runtime_data.voxel_dict[cortical_id_] = dict()
-            runtime_data.genome['blueprint'][cortical_id_] = dict()
-            runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
-            runtime_data.genome["blueprint"][cortical_id_] = \
-                template.copy()
-            runtime_data.genome["blueprint"][cortical_id_]["cortical_name"] = cortical_name
-            runtime_data.genome['blueprint'][cortical_id_]["block_boundaries"] = \
-                [cortical_properties['channel_count'] *
-                 templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][0],
-                 templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][1],
-                 templates.cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][2],
-                 ]
-
-            runtime_data.genome['blueprint'][cortical_id_]["relative_coordinate"] = \
-                [cortical_properties['coordinates_3d'][0],
-                 cortical_properties['coordinates_3d'][1],
-                 cortical_properties['coordinates_3d'][2]]
-
-            runtime_data.genome['blueprint'][cortical_id_]["2d_coordinate"] = \
-                [cortical_properties['coordinates_2d'][0],
-                 cortical_properties['coordinates_2d'][1]]
-
-            runtime_data.genome['blueprint'][cortical_id_]['cortical_mapping_dst'] = dict()
-
-            for parameter in template:
-                runtime_data.genome["blueprint"][cortical_id_][parameter] = template[parameter]
-
-            # runtime_data.genome["blueprint"][cortical_id_]["per_voxel_neuron_cnt"] = \
-            #     template['per_voxel_neuron_cnt']
-            # runtime_data.genome["blueprint"][cortical_id_]["synapse_attractivity"] = \
-            #     template['synapse_attractivity']
-            # runtime_data.genome["blueprint"][cortical_id_]["postsynaptic_current"] = \
-            #     template['postsynaptic_current']
-            # runtime_data.genome["blueprint"][cortical_id_]["plasticity_constant"] = \
-            #     template['plasticity_constant']
-            # runtime_data.genome["blueprint"][cortical_id_]["degeneration"] = \
-            #     template['degeneration']
-            # runtime_data.genome["blueprint"][cortical_id_]["psp_uniform_distribution"] = \
-            #     template['psp_uniform_distribution']
-            # runtime_data.genome["blueprint"][cortical_id_]["postsynaptic_current_max"] = \
-            #     template['postsynaptic_current_max']
-            # runtime_data.genome["blueprint"][cortical_id_]["mp_charge_accumulation"] = \
-            #     template['mp_charge_accumulation']
-            # runtime_data.genome["blueprint"][cortical_id_]["mp_driven_psp"] = \
-            #     template['mp_driven_psp']
-            # runtime_data.genome["blueprint"][cortical_id_]["firing_threshold_increment"] = \
-            #     template['firing_threshold_increment']
-            # runtime_data.genome["blueprint"][cortical_id_]["firing_threshold_limit"] = \
-            #     template['firing_threshold_limit']
-
-            runtime_data.genome["blueprint"][cortical_id_]["group_id"] = cortical_properties['cortical_type']
-
-            neuroembryogenesis.voxelogenesis(cortical_area=cortical_id_)
-            neuroembryogenesis.neurogenesis(cortical_area=cortical_id_)
-            init_fcl(cortical_id_)
-            init_cortical_cumulative_stats(cortical_area=cortical_id_)
-            runtime_data.cortical_dimensions = generate_cortical_dimensions()
-            runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+        if runtime_data.brain_readiness:
+            runtime_data.brain_readiness = False
 
-            save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
-                        file_name=runtime_data.connectome_path + "genome.json")
-            runtime_data.last_genome_modification_time = datetime.datetime.now()
-            return cortical_id_
+            cortical_type = cortical_properties['cortical_type']
+            cortical_id_ = cortical_properties['cortical_id']
+            if cortical_id_ in cortical_types[cortical_type]["supported_devices"]:
+                cortical_name = \
+                    cortical_types[cortical_type]["supported_devices"][cortical_id_]['cortical_name']
+
+                if cortical_id_ in runtime_data.genome['blueprint']:
+                    print("Warning! Cortical area already part of genome. Nothing got added.")
+                else:
+                    reset_connectome_file(cortical_area=cortical_id_)
+                    runtime_data.voxel_dict[cortical_id_] = dict()
+                    runtime_data.genome['blueprint'][cortical_id_] = dict()
+                    runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
+                    runtime_data.genome["blueprint"][cortical_id_] = cortical_template.copy()
+                    runtime_data.genome["blueprint"][cortical_id_]["cortical_name"] = cortical_name
+                    runtime_data.genome['blueprint'][cortical_id_]["block_boundaries"] = \
+                        [cortical_properties['dev_count'] *
+                         cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][0],
+                         cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][1],
+                         cortical_types[cortical_type]['supported_devices'][cortical_id_]['resolution'][2],
+                         ]
+
+                    runtime_data.genome['blueprint'][cortical_id_]["relative_coordinate"] = \
+                        [cortical_properties['coordinates_3d'][0],
+                         cortical_properties['coordinates_3d'][1],
+                         cortical_properties['coordinates_3d'][2]]
+
+                    runtime_data.genome['blueprint'][cortical_id_]["2d_coordinate"] = \
+                        [cortical_properties['coordinates_2d'][0],
+                         cortical_properties['coordinates_2d'][1]]
+
+                    runtime_data.genome['blueprint'][cortical_id_]['cortical_mapping_dst'] = dict()
+                    runtime_data.genome['blueprint'][cortical_id_]['visualization'] = True
+
+                    if cortical_id_ not in runtime_data.genome["brain_regions"]["root"]["areas"]:
+                        runtime_data.genome["brain_regions"]["root"]["areas"].append(cortical_id_)
+                        runtime_data.cortical_area_region_association[cortical_id_] = "root"
+
+                    # template = cortical_template.copy()
+                    # for parameter in template:
+                    #     runtime_data.genome["blueprint"][cortical_id_][parameter] = template[parameter]
+
+                    # runtime_data.genome["blueprint"][cortical_id_].update(cortical_template.copy())
+
+                    # runtime_data.genome["blueprint"][cortical_id_]["per_voxel_neuron_cnt"] = \
+                    #     template['per_voxel_neuron_cnt']
+                    # runtime_data.genome["blueprint"][cortical_id_]["synapse_attractivity"] = \
+                    #     template['synapse_attractivity']
+                    # runtime_data.genome["blueprint"][cortical_id_]["postsynaptic_current"] = \
+                    #     template['postsynaptic_current']
+                    # runtime_data.genome["blueprint"][cortical_id_]["plasticity_constant"] = \
+                    #     template['plasticity_constant']
+                    # runtime_data.genome["blueprint"][cortical_id_]["degeneration"] = \
+                    #     template['degeneration']
+                    # runtime_data.genome["blueprint"][cortical_id_]["psp_uniform_distribution"] = \
+                    #     template['psp_uniform_distribution']
+                    # runtime_data.genome["blueprint"][cortical_id_]["postsynaptic_current_max"] = \
+                    #     template['postsynaptic_current_max']
+                    # runtime_data.genome["blueprint"][cortical_id_]["mp_charge_accumulation"] = \
+                    #     template['mp_charge_accumulation']
+                    # runtime_data.genome["blueprint"][cortical_id_]["mp_driven_psp"] = \
+                    #     template['mp_driven_psp']
+                    # runtime_data.genome["blueprint"][cortical_id_]["firing_threshold_increment"] = \
+                    #     template['firing_threshold_increment']
+                    # runtime_data.genome["blueprint"][cortical_id_]["firing_threshold_limit"] = \
+                    #     template['firing_threshold_limit']
+
+                    runtime_data.genome["blueprint"][cortical_id_]["group_id"] = cortical_properties['cortical_type']
+
+                    neuroembryogenesis.voxelogenesis(cortical_area=cortical_id_)
+
+                    neuroembryogenesis.neurogenesis(cortical_area=cortical_id_)
+
+                    init_fcl(cortical_id_)
+                    init_cortical_cumulative_stats(cortical_area=cortical_id_)
+
+                    runtime_data.cortical_dimensions = generate_cortical_dimensions()
+                    runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+
+                    save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                                file_name=runtime_data.connectome_path + "genome.json")
+                    runtime_data.last_genome_modification_time = datetime.datetime.now()
+
+                    runtime_data.brain_readiness = True
+
+                    return cortical_id_
+            else:
+                print(f"Warning! while adding core cortical area. {cortical_id_} is not defined as {cortical_type}"
+                      f", possibly a bad gene.")
 
     except KeyError:
         print("Error: New cortical area was not added.", traceback.print_exc())
 
 
-def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cortical_dimensions,
-                             cortical_id_overwrite=None, is_memory=False, copy_of=None):
-    # Generate Cortical ID
-    # todo: instead of hard coding the length have the genome properties captured and reference instead
-    temp_name = cortical_name
-    if len(cortical_name) < 3:
-        temp_name = cortical_name + "000"
-    if cortical_id_overwrite:
-        cortical_area = cortical_id_overwrite
-    else:
-        cortical_area = cortical_id_gen(temp_name[:3], is_memory=is_memory)
-
-    cortical_names = neuroembryogenesis.cortical_name_list()
-    if copy_of:
-        if copy_of in runtime_data.genome["blueprint"]:
-            template = runtime_data.genome["blueprint"][copy_of].copy()
-            template["cortical_mapping_dst"] = {}
-            template["cortical_name"] = cortical_name
+def add_custom_cortical_area(cortical_name, coordinates_3d, coordinates_2d, cortical_dimensions, cortical_area_id,
+                             parent_region_id="root", cortical_id_overwrite=None, is_memory=False, copy_of=None):
+
+    if runtime_data.brain_readiness:
+        runtime_data.brain_readiness = False
+
+        cortical_names = neuroembryogenesis.cortical_name_list()
+        if copy_of:
+            if copy_of in runtime_data.genome["blueprint"]:
+                template = runtime_data.genome["blueprint"][copy_of].copy()
+                template["cortical_mapping_dst"] = {}
+                template["cortical_name"] = cortical_name
+            else:
+                print("Source cortical area chosen for cloning is not part of Genome")
+                raise CustomError
         else:
-            print("Source cortical area chosen for cloning is not part of Genome")
-            raise CustomError
-    else:
-        template = templates.cortical_template.copy()
+            template = cortical_template.copy()
 
-    if cortical_name in cortical_names:
-        print("Warning! Cortical area with same name already exists in genome. Nothing got added.")
-    else:
-        reset_connectome_file(cortical_area=cortical_area)
-        runtime_data.voxel_dict[cortical_area] = {}
-        runtime_data.genome['blueprint'][cortical_area] = {}
-        runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
+        if cortical_name in cortical_names:
+            print("Warning! Cortical area with same name already exists in genome. Nothing got added.")
+        else:
+            reset_connectome_file(cortical_area=cortical_area_id)
+            runtime_data.voxel_dict[cortical_area_id] = {}
+            runtime_data.genome['blueprint'][cortical_area_id] = {}
+            runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
 
-        cortical_template = template.copy()
+            cortical_template_ = template.copy()
 
-        runtime_data.genome["blueprint"][cortical_area] = cortical_template
+            runtime_data.genome["blueprint"][cortical_area_id] = cortical_template_
 
-        for parameter in cortical_template:
-            runtime_data.genome["blueprint"][cortical_area][parameter] = cortical_template[parameter]
+            for parameter in cortical_template_:
+                runtime_data.genome["blueprint"][cortical_area_id][parameter] = cortical_template_[parameter]
 
-        runtime_data.genome['blueprint'][cortical_area]['cortical_name'] = cortical_name
+            runtime_data.genome['blueprint'][cortical_area_id]['cortical_name'] = cortical_name
 
-        new_cortical_dimensions = cortical_dimensions.copy()
-        runtime_data.genome['blueprint'][cortical_area]["block_boundaries"] = new_cortical_dimensions
+            new_cortical_dimensions = cortical_dimensions.copy()
+            runtime_data.genome['blueprint'][cortical_area_id]["block_boundaries"] = new_cortical_dimensions
 
-        new_3d_coordinates = coordinates_3d.copy()
-        runtime_data.genome['blueprint'][cortical_area]["relative_coordinate"] = new_3d_coordinates
+            new_3d_coordinates = coordinates_3d.copy()
+            runtime_data.genome['blueprint'][cortical_area_id]["relative_coordinate"] = new_3d_coordinates
 
-        new_coordinates_2d = coordinates_2d.copy()
-        runtime_data.genome['blueprint'][cortical_area]["2d_coordinate"] = new_coordinates_2d
+            new_coordinates_2d = coordinates_2d.copy()
+            runtime_data.genome['blueprint'][cortical_area_id]["2d_coordinate"] = new_coordinates_2d
 
-        runtime_data.genome['blueprint'][cortical_area]['cortical_mapping_dst'] = {}
-        
-        runtime_data.genome["blueprint"][cortical_area]["sub_group_id"] = ""
+            runtime_data.genome['blueprint'][cortical_area_id]['cortical_mapping_dst'] = {}
 
-        if is_memory:
-            runtime_data.genome["blueprint"][cortical_area]["longterm_mem_threshold"] = \
-                cortical_template['longterm_mem_threshold']
-            runtime_data.genome["blueprint"][cortical_area]["lifespan_growth_rate"] = \
-                cortical_template['lifespan_growth_rate']
-            runtime_data.genome["blueprint"][cortical_area]["init_lifespan"] = \
-                cortical_template['init_lifespan']
-            runtime_data.genome["blueprint"][cortical_area]["sub_group_id"] = "MEMORY"
-            runtime_data.memory_register[cortical_area] = set()
+            runtime_data.genome["blueprint"][cortical_area_id]["sub_group_id"] = ""
+            runtime_data.genome['blueprint'][cortical_area_id]['visualization'] = True
 
-        runtime_data.genome["blueprint"][cortical_area]["group_id"] = "CUSTOM"
+            runtime_data.cortical_area_region_association[cortical_area_id] = parent_region_id
+            runtime_data.genome["brain_regions"][parent_region_id]["areas"].append(cortical_area_id)
 
-        neuroembryogenesis.voxelogenesis(cortical_area=cortical_area)
-        neuroembryogenesis.neurogenesis(cortical_area=cortical_area)
-        init_fcl(cortical_area)
-        init_cortical_cumulative_stats(cortical_area=cortical_area)
-        runtime_data.cortical_dimensions = generate_cortical_dimensions()
-        runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+            if is_memory:
+                runtime_data.genome["blueprint"][cortical_area_id]["longterm_mem_threshold"] = \
+                    cortical_template_['longterm_mem_threshold']
+                runtime_data.genome["blueprint"][cortical_area_id]["lifespan_growth_rate"] = \
+                    cortical_template_['lifespan_growth_rate']
+                runtime_data.genome["blueprint"][cortical_area_id]["init_lifespan"] = \
+                    cortical_template_['init_lifespan']
+                runtime_data.genome["blueprint"][cortical_area_id]["sub_group_id"] = "MEMORY"
+                runtime_data.memory_register[cortical_area_id] = set()
 
-        save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
-                    file_name=runtime_data.connectome_path + "genome.json")
-        runtime_data.last_genome_modification_time = datetime.datetime.now()
-        return cortical_area
+            runtime_data.genome["blueprint"][cortical_area_id]["group_id"] = "CUSTOM"
+
+            neuroembryogenesis.voxelogenesis(cortical_area=cortical_area_id)
+            neuroembryogenesis.neurogenesis(cortical_area=cortical_area_id)
+            init_fcl(cortical_area_id)
+            init_cortical_cumulative_stats(cortical_area=cortical_area_id)
+            runtime_data.cortical_dimensions = generate_cortical_dimensions()
+            runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+
+            save_genome(genome=genome_v1_v2_converter(runtime_data.genome),
+                        file_name=runtime_data.connectome_path + "genome.json")
+            runtime_data.last_genome_modification_time = datetime.datetime.now()
+
+            runtime_data.brain_readiness = True
+
+            return cortical_area_id
 
 
-def append_circuit(source_genome, circuit_origin):
+def append_circuit(source_genome, circuit_origin, parent_brain_region, rewire_mode):
     print("\n\n----------------------------------  Merging a new circuit  ----------------------------------------\n\n")
+    print("rewire_mode:", rewire_mode)
+
     try:
+        if "genome_title" in source_genome:
+            brain_region_title = source_genome["genome_title"]
+        else:
+            brain_region_title = "imported_genome"
+
+        if "genome_description" in source_genome:
+            brain_region_description = source_genome["genome_description"]
+        else:
+            brain_region_description = "No Description"
+
+        region_data = NewRegionProperties
+        region_data.title = brain_region_title
+        region_data.region_description = brain_region_description
+        region_data.parent_region_id = parent_brain_region
+        region_data.coordinates_2d = [0, 0]
+        region_data.coordinates_3d = circuit_origin
+
+        region_data.areas = []
+        region_data.regions = []
+
+        new_region_id = create_region(region_data=region_data)
+
         converted_genome = genome_2_1_convertor(source_genome["blueprint"])
         source_genome["blueprint"] = converted_genome['blueprint']
 
@@ -800,7 +905,8 @@ def append_circuit(source_genome, circuit_origin):
 
         appended_cortical_areas = set()
 
-        # Append Blueprint
+        amalgamation_cortical_mapping = dict()
+        # Amalgamate Blueprint
         for cortical_area_id in src_blueprint:
             print(f"-----Attempting to import cortical area {cortical_area_id}")
             try:
@@ -843,13 +949,15 @@ def append_circuit(source_genome, circuit_origin):
                     #                          cortical_id_overwrite=new_cortical_area_id)
 
                     appended_cortical_areas.add(new_cortical_area_id)
+                    amalgamation_cortical_mapping[cortical_area_id] = new_cortical_area_id
 
                     dst_blueprint[new_cortical_area_id] = src_cortical_area.copy()
                     dst_blueprint[new_cortical_area_id]["cortical_name"] = new_cortical_name
                     dst_blueprint[new_cortical_area_id]["relative_coordinate"][0] = new_coordinates[0]
                     dst_blueprint[new_cortical_area_id]["relative_coordinate"][1] = new_coordinates[1]
                     dst_blueprint[new_cortical_area_id]["relative_coordinate"][2] = new_coordinates[2]
-                    print(f"---------------Successfully imported a new cortical area.  "
+                    runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
+                    print(f"---------------Successfully imported a new cortical area."
                           f"id:{new_cortical_area_id} name:{new_cortical_name}")
                 else:
                     if cortical_area_id not in dst_blueprint:
@@ -865,8 +973,76 @@ def append_circuit(source_genome, circuit_origin):
                         print(f"---------------Successfully imported a built-in cortical area. id:{cortical_area_id}")
             except Exception as e:
                 print("Exception during cortical import", e, traceback.print_exc())
+        # Amalgamate Brain Regions
+        if "brain_regions" in source_genome:
+            incoming_genome_region_data = source_genome["brain_regions"]
+
+            incoming_genome_region_data["root"]["title"] = \
+                source_genome.get("genome_title", "No title")
+
+            incoming_genome_region_data["root"]["description"] = \
+                source_genome.get("genome_description", "No description")
+
+            incoming_genome_region_data["root"]["parent_region_id"] = parent_brain_region
+
+            for sub_region in incoming_genome_region_data["root"]["regions"]:
+                incoming_genome_region_data[sub_region]["parent_region_id"] = new_region_id
 
-        # Append Morphologies
+            for sub_area in incoming_genome_region_data["root"]["areas"]:
+                runtime_data.cortical_area_region_association[sub_area] = new_region_id
+
+            incoming_genome_region_data[new_region_id] = incoming_genome_region_data.pop('root')
+        else:
+            incoming_genome_region_data = dict()
+
+        # print("amalgamation_cortical_mapping:", amalgamation_cortical_mapping)
+
+        # Swap cortical IDs
+        for region in incoming_genome_region_data:
+            # print("incoming_genome_region_data inputs", incoming_genome_region_data[region]["inputs"])
+            incoming_area_set = set(incoming_genome_region_data[region]["areas"])
+            for area in incoming_genome_region_data[region]["areas"]:
+                if area in amalgamation_cortical_mapping:
+                    incoming_area_set.remove(area)
+                    incoming_area_set.add(amalgamation_cortical_mapping[area])
+                    # print("swapped...", area, amalgamation_cortical_mapping[area])
+
+            updated_suggested_inputs = []
+            for suggested_input in incoming_genome_region_data[region]["inputs"].copy():
+                # print("###### suggested_input", suggested_input)
+                if suggested_input["dst_cortical_area_id"] in amalgamation_cortical_mapping:
+                    updated_suggested_input = suggested_input.copy()
+                    updated_suggested_input["dst_cortical_area_id"] = \
+                        amalgamation_cortical_mapping[suggested_input["dst_cortical_area_id"]]
+                    incoming_genome_region_data[region]["inputs"].remove(suggested_input)
+                    updated_suggested_inputs.append(updated_suggested_input)
+                    # print("did a swap on input...", suggested_input, updated_suggested_input)
+                    runtime_data.cortical_area_region_association[suggested_input["dst_cortical_area_id"]] = region
+                else:
+                    print("suggested dst cortical id not found in amalgamation cortical mapping", suggested_input[
+                        "dst_cortical_area_id"], amalgamation_cortical_mapping)
+            incoming_genome_region_data[region]["inputs"] += updated_suggested_inputs
+            # print("after update ++++ ", incoming_genome_region_data[region]["inputs"])
+
+            updated_suggested_outputs = []
+            incoming_genome_region_data_outputs_copy = incoming_genome_region_data[region]["outputs"].copy()
+            for suggested_output in incoming_genome_region_data_outputs_copy:
+                if suggested_output["src_cortical_area_id"] in amalgamation_cortical_mapping:
+                    updated_suggested_output = suggested_output.copy()
+                    updated_suggested_output["src_cortical_area_id"] = \
+                        amalgamation_cortical_mapping[suggested_output["src_cortical_area_id"]]
+                    incoming_genome_region_data[region]["outputs"].remove(suggested_output)
+                    updated_suggested_outputs.append(updated_suggested_output)
+                    # print("did a swap on output...", suggested_output, updated_suggested_output)
+                    runtime_data.cortical_area_region_association[suggested_output["src_cortical_area_id"]] = region
+
+            incoming_genome_region_data[region]["outputs"] += updated_suggested_outputs
+            # print("output_genome_region_data", incoming_genome_region_data[region]["outputs"])
+
+            incoming_genome_region_data[region]["areas"] = list(incoming_area_set)
+        runtime_data.genome["brain_regions"] = {**runtime_data.genome["brain_regions"], **incoming_genome_region_data}
+
+        # Amalgamate Morphologies
         # Create a hash table for source and destination morphologies
         dst_morphology_hash_table = dict()
 
@@ -880,10 +1056,10 @@ def append_circuit(source_genome, circuit_origin):
         morphology_mapping_table = dict()
 
         for src_morphology in src_morphologies:
-            print(f"-----Attempting to import morphology {src_morphology}")
+            # print(f"-----Attempting to import morphology {src_morphology}")
             try:
                 # Check if morphology is used or not
-                morphology_usage = synapse.morphology_usage_list(morphology_name=src_morphology, genome=source_genome)
+                morphology_usage = morphology_usage_list(morphology_name=src_morphology, genome=source_genome)
 
                 if morphology_usage:
                     morphology_str = json.dumps(src_morphologies[src_morphology])
@@ -897,7 +1073,7 @@ def append_circuit(source_genome, circuit_origin):
                         else:
                             runtime_data.genome["neuron_morphologies"][src_morphology] = \
                                 src_morphologies[src_morphology].copy()
-                        print(f"---------------Successfully imported a morphology. id:{src_morphology}")
+                        # print(f"---------------Successfully imported a morphology. id:{src_morphology}")
                     else:
                         # Build a mapping table to be used while appending the Blueprint
                         morphology_association = list(dst_morphology_hash_table[morphology_hash])[0]
@@ -905,14 +1081,140 @@ def append_circuit(source_genome, circuit_origin):
             except Exception as e:
                 print("Exception during morphology transfer", e, traceback.print_exc())
 
-        print("++ ++ ++ " * 10)
-        print("Merge phase 1 completed.. pending initialization")
-
         for cortical_area in appended_cortical_areas:
             x_corticogenesis(cortical_area)
+        # Wire to external cortical areas
+        if rewire_mode in ['all', 'system']:
+            for region in incoming_genome_region_data:
+                # Wiring Afferents
+                incoming_genome_region_data_inputs_copy = incoming_genome_region_data[region]["inputs"].copy()
+                for suggested_input_mapping in incoming_genome_region_data_inputs_copy:
+                    # print("processing suggested input mapping:", suggested_input_mapping)
+                    if rewire_mode == 'system' and not \
+                            area_is_system(suggested_input_mapping["src_cortical_area_id"]):
+                        # print("Wiring to a custom unknown external area was skipped.")
+                        pass
+                    else:
+                        if area_is_system(suggested_input_mapping["src_cortical_area_id"]) and \
+                                suggested_input_mapping["src_cortical_area_id"] not in runtime_data.genome["blueprint"]:
+                            add_core_cortical_area(cortical_properties={
+                                "cortical_type": cortical_area_type(suggested_input_mapping["src_cortical_area_id"]),
+                                "cortical_id": suggested_input_mapping["src_cortical_area_id"],
+                                "coordinates_2d": [0, 0],
+                                "coordinates_3d": [0, 0, 0],
+                                "channel_count": 1
+                            })
+                            # print("@@ New system cortical area added:",
+                            # suggested_input_mapping["src_cortical_area_id"])
+
+                        if suggested_input_mapping["src_cortical_area_id"] in runtime_data.genome["blueprint"]:
+                            # print("Suggested input source found in genome as ",
+                            #       suggested_input_mapping["src_cortical_area_id"])
+                            if suggested_input_mapping["dst_cortical_area_id"] not in \
+                                    runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                        "cortical_mapping_dst"]:
+                                runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]]["cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]] = list()
+                                cortical_template["cortical_mapping_dst"] = dict()
+                            new_mapping = {
+                                "morphology_id": suggested_input_mapping["morphology_id"],
+                                "morphology_scalar": suggested_input_mapping["morphology_scalar"],
+                                "postSynapticCurrent_multiplier":
+                                    suggested_input_mapping["postSynapticCurrent_multiplier"],
+                                "plasticity_flag": suggested_input_mapping["plasticity_flag"],
+                                "plasticity_constant": suggested_input_mapping["plasticity_constant"],
+                                "ltp_multiplier": suggested_input_mapping["ltp_multiplier"],
+                                "ltd_multiplier": suggested_input_mapping["ltd_multiplier"]
+                            }
+
+                            if new_mapping not in \
+                                    runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]]:
+                                runtime_data.genome["blueprint"][suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]].append(
+                                    new_mapping)
+                                print("New mapping added!", suggested_input_mapping["src_cortical_area_id"],
+                                      suggested_input_mapping["dst_cortical_area_id"], runtime_data.genome["blueprint"][
+                                          suggested_input_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_input_mapping["dst_cortical_area_id"]])
+
+                            else:
+
+                                print("input mapping already there!", suggested_input_mapping["src_cortical_area_id"],
+                                      new_mapping)
+
+                            # remove the suggested mapping post wiring
+
+                            incoming_genome_region_data[region]["inputs"].remove(suggested_input_mapping)
 
-        develop(appended_cortical_areas)
+                        else:
+                            print("Suggested source cortical area not found!!", suggested_input_mapping[
+                                "src_cortical_area_id"])
+
+                # Wiring Efferents
+                for suggested_output_mapping in incoming_genome_region_data[region]["outputs"].copy():
+                    print("processing suggested output mapping:", suggested_output_mapping)
+                    if rewire_mode == 'system' and not \
+                            area_is_system(suggested_output_mapping["dst_cortical_area_id"]):
+                        print("Wiring to a custom unknown external area was skipped.")
+                        pass
+                    else:
+                        if area_is_system(suggested_output_mapping["dst_cortical_area_id"]) and \
+                                suggested_output_mapping["dst_cortical_area_id"] not in \
+                                runtime_data.genome["blueprint"]:
+                            add_core_cortical_area(cortical_properties={
+                                "cortical_type": cortical_area_type(suggested_output_mapping["dst_cortical_area_id"]),
+                                "cortical_id": suggested_output_mapping["dst_cortical_area_id"],
+                                "coordinates_2d": [0, 0],
+                                "coordinates_3d": [0, 0, 0],
+                                "channel_count": 1
+                            })
+                            print("@@ New system cortical area added:",
+                                  suggested_output_mapping["dst_cortical_area_id"])
+                        if suggested_output_mapping["dst_cortical_area_id"] in runtime_data.genome["blueprint"]:
+                            print("Suggested output destination found in genome as ", suggested_output_mapping[
+                                "dst_cortical_area_id"])
+                            if suggested_output_mapping["dst_cortical_area_id"] not in \
+                                    runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                        "cortical_mapping_dst"]:
+                                runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]] = list()
+
+                            new_mapping = {
+                                "morphology_id": suggested_output_mapping["morphology_id"],
+                                "morphology_scalar": suggested_output_mapping["morphology_scalar"],
+                                "postSynapticCurrent_multiplier":
+                                    suggested_output_mapping["postSynapticCurrent_multiplier"],
+                                "plasticity_flag": suggested_output_mapping["plasticity_flag"],
+                                "plasticity_constant": suggested_output_mapping["plasticity_constant"],
+                                "ltp_multiplier": suggested_output_mapping["ltp_multiplier"],
+                                "ltd_multiplier": suggested_output_mapping["ltd_multiplier"]
+                            }
+
+                            if new_mapping not in \
+                                    runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]]:
+                                runtime_data.genome["blueprint"][suggested_output_mapping["src_cortical_area_id"]][
+                                    "cortical_mapping_dst"][suggested_output_mapping["dst_cortical_area_id"]].append(
+                                    new_mapping)
+                                print("New mapping added!", suggested_output_mapping["dst_cortical_area_id"],
+                                      suggested_output_mapping["src_cortical_area_id"],
+                                      runtime_data.genome["blueprint"][suggested_output_mapping[
+                                          "dst_cortical_area_id"]][
+                                          "cortical_mapping_dst"][suggested_output_mapping["src_cortical_area_id"]])
+
+                            else:
+                                print("output mapping already there!", suggested_output_mapping["dst_cortical_area_id"],
+                                      new_mapping)
+
+                            # remove the suggested mapping post wiring
+                            incoming_genome_region_data[region]["outputs"].remove(suggested_output_mapping)
 
+                        else:
+                            print("Suggested destination cortical area not found!!", suggested_output_mapping[
+                                "dst_cortical_area_id"])
+        else:
+            pass
+        develop(appended_cortical_areas)
         runtime_data.cortical_dimensions = generate_cortical_dimensions()
         runtime_data.cortical_dimensions_by_id = generate_cortical_dimensions_by_id()
 
@@ -920,8 +1222,94 @@ def append_circuit(source_genome, circuit_origin):
                     file_name=runtime_data.connectome_path + "genome.json")
         runtime_data.last_genome_modification_time = datetime.datetime.now()
 
-        print("++ ++ ++ " * 10)
         print("Merger of new genome completed successfully!")
 
     except Exception as e:
         print("Exception during morphology join", e, traceback.print_exc())
+
+
+def find_variable_names_by_id(target_id):
+    variable_names = []
+
+    # Check in globals
+    for name, value in globals().items():
+        if id(value) == target_id:
+            variable_names.append(name)
+
+    # Check in locals
+    for name, value in locals().items():
+        if id(value) == target_id:
+            variable_names.append(name)
+
+    return variable_names
+
+
+def create_missing_pns_areas(dev_list):
+    """
+    dev_list = {
+        "o__mot": {
+            "dev_count": 2
+        },
+        "i__inf": {
+            "dev_count": 1
+        }
+    }
+    """
+
+    pns_update_report = {
+        "updated": [],
+        "added": []
+    }
+    for cortical_area in dev_list:
+        if cortical_area not in runtime_data.genome["blueprint"]:
+            dev_count = 1
+            if "dev_count" in dev_list[cortical_area]:
+                dev_count = dev_list[cortical_area]["dev_count"]
+
+            cortical_type = cortical_area_type(cortical_area=cortical_area)
+
+            coordinate_2d = [0, 0]
+            if cortical_type == "IPU":
+                coordinate_2d = [random.randint(10, 100), random.randint(10, 200)]
+
+            if cortical_type == "OPU":
+                coordinate_2d = [random.randint(1000, 1100), random.randint(0, 300)]
+
+            coordinate_3d = [random.randint(10, 100), random.randint(10, 40), 0]
+
+            if "coordinate_3d" in cortical_types[cortical_type]["supported_devices"][cortical_area]:
+                coordinate_3d = cortical_types[cortical_type]["supported_devices"][cortical_area]["coordinate_3d"]
+
+            add_core_cortical_area(cortical_properties={
+                "cortical_type": cortical_type,
+                "cortical_id": cortical_area,
+                "coordinates_2d": coordinate_2d,
+                "coordinates_3d": coordinate_3d,
+                "dev_count": dev_count
+            })
+            pns_update_report["added"].append(cortical_area)
+        elif "dev_count" in dev_list[cortical_area]:
+            dev_count = dev_list[cortical_area]["dev_count"]
+            if dev_count != runtime_data.genome["blueprint"][cortical_area]["dev_count"]:
+                update_pns_dev_count(pns_area=cortical_area, new_dev_count=dev_count)
+                pns_update_report["updated"].append(cortical_area)
+
+    print(f"Cortical areas automatically added/reconfigured:\n {pns_update_report}")
+    return pns_update_report
+
+
+def update_pns_dev_count(pns_area, new_dev_count):
+    cortical_area = pns_area
+    cortical_type = cortical_area_type(cortical_area=cortical_area)
+
+    runtime_data.genome["blueprint"][cortical_area]["dev_count"] = new_dev_count
+
+    dim_x = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][0]
+    dim_y = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][1]
+    dim_z = cortical_types[cortical_type]["supported_devices"][cortical_area]["resolution"][2]
+
+    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][0] = dim_x * new_dev_count
+    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][1] = dim_y
+    runtime_data.genome["blueprint"][cortical_area]["block_boundaries"][2] = dim_z
+
+    cortical_regeneration(cortical_area=pns_area)
diff --git a/src/feagi_configuration.ini b/src/feagi_configuration.ini
index b39efadd2..61b30db0c 100644
--- a/src/feagi_configuration.ini
+++ b/src/feagi_configuration.ini
@@ -41,7 +41,7 @@ influxdb_organization = $INFLUXDB_ORG
 influxdb_user = $INFLUXDB_USERNAME
 influxdb_password = $INFLUXDB_PASSWORD
 influxdb_stats_bucket = $INFLUXDB_BUCKET
-influxdb_game_stats_bucket = $INFLUXDB_BUCKET
+influxdb_fitness_stats_bucket = $INFLUXDB_BUCKET
 influxdb_evolutionary_bucket = tbd
 influx_stat_logger = True
 influx_keep_stats =
diff --git a/src/inf/baseline.py b/src/inf/baseline.py
index 1dd116cf6..dae66fb09 100644
--- a/src/inf/baseline.py
+++ b/src/inf/baseline.py
@@ -89,7 +89,7 @@
     "plasticity_flag": False,
     "cortical_genes": {
         "per_voxel_neuron_cnt (int)": ["cx-_n_cnt-i", 1],
-        "synapse_attractivity (int)": ["cx-synatt-i", 100],
+        "synapse_attractivity (int)": ["cx-synatt-f", 100],
         "postsynaptic_current (float)": ["cx-pstcr_-f", 5.0],
         "postsynaptic_current_max (float)": ["cx-pstcrm-f", 35.0],
         "plasticity_constant (float)": ["cx-plst_c-f", 0.05],
diff --git a/src/inf/connectome.py b/src/inf/connectome.py
new file mode 100644
index 000000000..08b432a5e
--- /dev/null
+++ b/src/inf/connectome.py
@@ -0,0 +1,33 @@
+import gzip
+import shutil
+import argparse
+import os
+import json
+
+
+def unzip_and_pretty_print_gzip(input_file):
+    output_file = os.path.splitext(input_file)[0] + ".json"  # Remove .gz extension
+
+    # Unzip the gzip file
+    with gzip.open(input_file, 'rb') as f_in:
+        with open(output_file, 'wb') as f_out:
+            shutil.copyfileobj(f_in, f_out)
+
+    # Read the JSON content from the unzipped file
+    with open(output_file, 'r') as f:
+        data = json.load(f)
+
+    # Pretty print the JSON content back to the unzipped file
+    with open(output_file, 'w') as f:
+        json.dump(data, f, indent=4)
+
+    print(f"File '{input_file}' has been unzipped and pretty-printed to '{output_file}'")
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Unzip a gzip file and pretty-print its JSON content.")
+    parser.add_argument("input_file", help="The path to the gzip file to be unzipped.")
+
+    args = parser.parse_args()
+
+    unzip_and_pretty_print_gzip(args.input_file)
diff --git a/src/inf/db_handler.py b/src/inf/db_handler.py
index ea42f37de..84733e36c 100644
--- a/src/inf/db_handler.py
+++ b/src/inf/db_handler.py
@@ -186,7 +186,7 @@ def __init__(self):
         if runtime_data.parameters:
             self.evo_bucket = self.db_params["influxdb_evolutionary_bucket"]
             self.stats_bucket = self.db_params["influxdb_stats_bucket"]
-            self.game_stats_bucket = self.db_params["influxdb_game_stats_bucket"]
+            self.fitness_stats_bucket = self.db_params["influxdb_fitness_stats_bucket"]
             self.org = self.db_params["influxdb_organization"]
             self.token = self.db_params["influxdb_token"]
 
@@ -218,7 +218,7 @@ def __init__(self):
                 print("Successfully connected to InfluxDb! ")
 
             except Exception as e:
-                print("ERROR: Influx service is not running!!!", e, traceback.print_exc())
+                print("ERROR: Influx service is not running!!!", e)
         else:
             print("ERROR: Parameters are not set for InfluxDb configuration!")
 
@@ -382,7 +382,7 @@ def insert_game_activity(self, genome_id, event, intensity=None):
             }
         }]
 
-        self.write_client.write(bucket=self.game_stats_bucket, org=self.org, record=event_data)
+        self.write_client.write(bucket=self.fitness_stats_bucket, org=self.org, record=event_data)
 
     def insert_burst_checkpoints(self, connectome_path, burst_id):
         raw_data = [
@@ -472,8 +472,8 @@ def drop_neuron_activity(self):
     def drop_game_activity(self):
         # Get the list of buckets
         print("@@@ @   @ @ @ @  @ @\n" * 20)
-        self.delete_bucket_content(bucket_name=self.game_stats_bucket)
-        # self.create_new_bucket(bucket_name=self.game_stats_bucket)
+        self.delete_bucket_content(bucket_name=self.fitness_stats_bucket)
+        # self.create_new_bucket(bucket_name=self.fitness_stats_bucket)
 
         # # Create a new bucket with the same name
         # new_bucket = self.client.buckets_api().create_bucket(bucket_name=bucket.name, org_id=self.org)
diff --git a/src/inf/debug.py b/src/inf/debug.py
new file mode 100644
index 000000000..e8a868a97
--- /dev/null
+++ b/src/inf/debug.py
@@ -0,0 +1,9 @@
+
+
+
+
+
+#
+# serialized_data = pickle.dumps(broadcast_message)
+# runtime_data.burst_publisher.send(message=lz4.frame.compress(serialized_data))
+#
diff --git a/src/inf/helpers.py b/src/inf/helpers.py
index 888381982..41cadbe4b 100644
--- a/src/inf/helpers.py
+++ b/src/inf/helpers.py
@@ -1,3 +1,19 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
+
+
 import string
 import random
 from datetime import datetime
diff --git a/src/inf/initialize.py b/src/inf/initialize.py
index 9f35e9b9a..ad91f950e 100644
--- a/src/inf/initialize.py
+++ b/src/inf/initialize.py
@@ -33,12 +33,15 @@
 from collections import deque
 from shutil import copyfile
 from src.evo.connectome import reset_connectome
+from src.evo.voxels import generate_cortical_dimensions_by_id, generate_cortical_dimensions
+from src.evo.cortical_area import cortical_area_type
 from src.evo.stats import voxel_dict_summary
 from src.evo.genome_editor import save_genome
 from src.inf.messenger import Pub
 from src.evo.neuroembryogenesis import generate_plasticity_dict, develop_brain
 from src.evo.genome_processor import genome_1_cortical_list, genome_ver_check
 from src.evo.genome_validator import *
+from src.evo.region import region_id_gen
 from src.evo.templates import cortical_types
 
 
@@ -78,8 +81,11 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
     runtime_data.genome_ver = "2.0"
 
     # todo temp check to find a better solution
-    if "lifespan_mgmt_interval" not in runtime_data.genome:
-        runtime_data.genome["lifespan_mgmt_interval"] = 10
+    if "physiology" not in runtime_data.genome:
+        runtime_data.genome["physiology"] = {}
+
+    if "lifespan_mgmt_interval" not in runtime_data.genome["physiology"]:
+        runtime_data.genome["physiology"]["lifespan_mgmt_interval"] = 10
 
     for _ in runtime_data.genome["blueprint"]:
         if "mp_charge_accumulation" not in runtime_data.genome["blueprint"][_]:
@@ -94,15 +100,20 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
         if "firing_threshold_limit" not in runtime_data.genome["blueprint"][_]:
             runtime_data.genome["blueprint"][_]["firing_threshold_limit"] = 0
 
+        if "visualization" not in runtime_data.genome["blueprint"][_]:
+            runtime_data.genome["blueprint"][_]["visualization"] = True
+
         if "leak_variability" not in runtime_data.genome["blueprint"][_]:
             runtime_data.genome["blueprint"][_]["leak_variability"] = 0
 
-    if "plasticity_queue_depth" not in runtime_data.genome:
-        runtime_data.genome["plasticity_queue_depth"] = 3
+    if "plasticity_queue_depth" not in runtime_data.genome["physiology"]:
+        runtime_data.genome["physiology"]["plasticity_queue_depth"] = 3
 
-    runtime_data.plasticity_queue_depth = runtime_data.genome["plasticity_queue_depth"]
+    runtime_data.plasticity_queue_depth = runtime_data.genome["physiology"]["plasticity_queue_depth"]
     init_fcl()
     init_brain()
+    init_brain_regions()
+
     if 'genome_id' not in runtime_data.genome:
         runtime_data.genome['genome_id'] = id_gen(signature="_G")
     runtime_data.genome_id = runtime_data.genome['genome_id']
@@ -129,23 +140,58 @@ def deploy_genome(neuroembryogenesis_flag=False, reset_runtime_data_flag=False,
 #     import controller
 
 
-def detect_hardware():
-    """
-    Identifies the type of hardware the brain is running on so the right capabilities can be utilized
-    """
-    # todo
+# def detect_hardware():
+#     """
+#     Identifies the type of hardware the brain is running on so the right capabilities can be utilized
+#     """
+#     # todo
+#
+#     try:
+#         with open('/sys/firmware/devicetree/base/model', "r") as file:
+#             if "Raspberry" in file.read():
+#                 runtime_data.hardware = "raspberry_pi"
+#     except:
+#         print("Need to figure how other platforms can be detected")
+#
+#     runtime_data.hw_controller_path = '../third_party/' + \
+#                                       runtime_data.genome['species']['brand'] + '/' +\
+#                                       runtime_data.genome['species']['model'] + '/controller.py'
+#     print("Hardware controller path: ", runtime_data.hw_controller_path)
+#
 
-    try:
-        with open('/sys/firmware/devicetree/base/model', "r") as file:
-            if "Raspberry" in file.read():
-                runtime_data.hardware = "raspberry_pi"
-    except:
-        print("Need to figure how other platforms can be detected")
 
-    runtime_data.hw_controller_path = '../third_party/' + \
-                                      runtime_data.genome['species']['brand'] + '/' +\
-                                      runtime_data.genome['species']['model'] + '/controller.py'
-    print("Hardware controller path: ", runtime_data.hw_controller_path)
+def init_brain_regions():
+    if "brain_regions" not in runtime_data.genome:
+        runtime_data.genome["brain_regions"] = {}
+
+    if "root" not in runtime_data.genome["brain_regions"]:
+        runtime_data.genome["brain_regions"]["root"] = {}
+        runtime_data.genome["brain_regions"]["root"]["title"] = "Genome's root brain region"
+        runtime_data.genome["brain_regions"]["root"]["description"] = None
+        runtime_data.genome["brain_regions"]["root"]["parent_region_id"] = None
+        runtime_data.genome["brain_regions"]["root"]["coordinate_2d"] = [0, 0]
+        runtime_data.genome["brain_regions"]["root"]["coordinate_3d"] = [0, 0, 0]
+        runtime_data.genome["brain_regions"]["root"]["areas"] = []
+        runtime_data.genome["brain_regions"]["root"]["regions"] = []
+        runtime_data.genome["brain_regions"]["root"]["inputs"] = []
+        runtime_data.genome["brain_regions"]["root"]["outputs"] = []
+
+        for cortical_area in runtime_data.cortical_list:
+            runtime_data.genome["brain_regions"]["root"]["areas"].append(cortical_area)
+            runtime_data.cortical_area_region_association[cortical_area] = "root"
+
+    for cortical_area in runtime_data.cortical_list:
+        if cortical_area not in runtime_data.cortical_area_region_association:
+            for region in runtime_data.genome["brain_regions"]:
+                if cortical_area in runtime_data.genome["brain_regions"][region]["areas"]:
+                    runtime_data.cortical_area_region_association[cortical_area] = region
+            if cortical_area not in runtime_data.cortical_area_region_association:
+                runtime_data.cortical_area_region_association[cortical_area] = "root"
+
+        # if runtime_data.genome["blueprint"][cortical_area]["group_id"] == "IPU":
+        #     runtime_data.genome["brain_regions"]["root"]["inputs"][cortical_area] = []
+        # if runtime_data.genome["blueprint"][cortical_area]["group_id"] == "OPU":
+        #     runtime_data.genome["brain_regions"]["root"]["outputs"][cortical_area] = []
 
 
 def init_container_variables():
@@ -155,7 +201,7 @@ def init_container_variables():
 
     if os.environ.get('CONTAINERIZED', False):
         runtime_data.running_in_container = True
-    if os.environ.get('INFLUXDB', False):
+    if os.environ.get('INFLUXDB', None):
         init_timeseries_db()
         # runtime_data.influxdb = True
     if os.environ.get('mongodb', False):
@@ -173,11 +219,14 @@ def init_memory_register():
 
     for cortical_area in runtime_data.genome["blueprint"]:
         for dst_cortical_area in runtime_data.genome["blueprint"][cortical_area]["cortical_mapping_dst"]:
-            if "sub_group_id" in runtime_data.genome["blueprint"][dst_cortical_area]:
-                if runtime_data.genome["blueprint"][dst_cortical_area]["sub_group_id"] == "MEMORY":
-                    if dst_cortical_area not in runtime_data.memory_register:
-                        runtime_data.memory_register[dst_cortical_area] = set()
-                    runtime_data.memory_register[dst_cortical_area].add(cortical_area)
+            if dst_cortical_area in runtime_data.genome["blueprint"]:
+                if "sub_group_id" in runtime_data.genome["blueprint"][dst_cortical_area]:
+                    if runtime_data.genome["blueprint"][dst_cortical_area]["sub_group_id"] == "MEMORY":
+                        if dst_cortical_area not in runtime_data.memory_register:
+                            runtime_data.memory_register[dst_cortical_area] = set()
+                        runtime_data.memory_register[dst_cortical_area].add(cortical_area)
+            else:
+                print(f"Warning!! {dst_cortical_area} not found in blueprint while running init_memory_register func.")
 
 
 def running_in_container():
@@ -403,14 +452,16 @@ def reset_runtime_data():
     runtime_data.genome = {}
     runtime_data.stats = {}
     runtime_data.brain = {}
+    runtime_data.cortical_list = []
     runtime_data.plasticity_dict = {}
-    runtime_data.cortical_list = {}
     runtime_data.memory_register = {}
     runtime_data.cortical_dimensions = {}
+    runtime_data.cortical_dimensions_by_id = {}
     runtime_data.stimulation_script = {}
     runtime_data.plasticity_queue_candidates = set()
     runtime_data.shock_admin = False
     runtime_data.shock_scenarios = tuple
+    runtime_data.intercortical_mapping = []
 
     # Clear brain activities
     runtime_data.fire_candidate_list = {}
@@ -445,6 +496,7 @@ def init_brain():
     runtime_data.last_alertness_trigger = datetime.now()
     runtime_data.brain_run_id = id_gen(signature='_R')
     init_cortical_info()
+    init_io_areas()
     init_memory_register()
     runtime_data.cortical_list = genome_1_cortical_list(runtime_data.genome)
     runtime_data.cortical_dimensions = generate_cortical_dimensions()
@@ -455,8 +507,8 @@ def init_brain():
     init_genome_post_processes()
     generate_plasticity_dict()
     runtime_data.new_genome = True
-    if 'burst_delay' in runtime_data.genome:
-        runtime_data.burst_timer = float(runtime_data.genome['burst_delay'])
+    if 'burst_delay' in runtime_data.genome["physiology"]:
+        runtime_data.burst_timer = float(runtime_data.genome['physiology']['burst_delay'])
 
     print("\n\n=========================   Brain Initialization Complete ===================================\n\n")
     runtime_data.cumulative_stats = {}
@@ -489,7 +541,7 @@ def init_burst_engine():
     runtime_data.death_flag = False
 
     try:
-        runtime_data.burst_timer = float(runtime_data.genome['burst_delay'])
+        runtime_data.burst_timer = float(runtime_data.genome['physiology']['burst_delay'])
         print("Burst time has been set to:", runtime_data.burst_timer)
     except KeyError:
         print("\n\n==============================================")
@@ -500,6 +552,13 @@ def init_burst_engine():
         print("==============================================\n\n")
 
 
+def init_io_areas():
+    for area in runtime_data.genome["blueprint"]:
+        if cortical_area_type(area) in ["IPU", "OPU"]:
+            if "dev_count" not in runtime_data.genome["blueprint"][area]:
+                runtime_data.genome["blueprint"][area]["dev_count"] = 1
+
+
 # def init_io_channels():
 #     # Initialize ZMQ connections
 #     try:
@@ -531,69 +590,3 @@ def init_burst_engine():
     # except KeyError as e:
     #     print('ERROR: OPU socket is not properly defined as part of feagi_configuration.ini\n', e)
 
-
-def generate_cortical_dimensions():
-    """
-    Generates the information needed to display cortical areas on Godot
-    """
-    cortical_information = {}
-
-    for cortical_area in runtime_data.genome["blueprint"]:
-        cortical_name = runtime_data.genome["blueprint"][cortical_area]["cortical_name"]
-        cortical_information[cortical_name] = []
-        genes = runtime_data.genome["blueprint"][cortical_area]
-        cortical_information[cortical_name].append(genes["relative_coordinate"][0])
-        cortical_information[cortical_name].append(genes["relative_coordinate"][1])
-        cortical_information[cortical_name].append(genes["relative_coordinate"][2])
-        cortical_information[cortical_name].append(genes["visualization"])
-        cortical_information[cortical_name].append(genes["block_boundaries"][0])
-        cortical_information[cortical_name].append(genes["block_boundaries"][1])
-        cortical_information[cortical_name].append(genes["block_boundaries"][2])
-        cortical_information[cortical_name].append(cortical_area)
-
-    with open(runtime_data.connectome_path+"cortical_data.json", "w") as data_file:
-        data_file.seek(0)
-        data_file.write(json.dumps(cortical_information, indent=3))
-        data_file.truncate()
-
-    return cortical_information
-
-
-def generate_cortical_dimensions_by_id():
-    """
-    Generates the information needed to display cortical areas on Godot
-    """
-    cortical_information = {}
-
-    for cortical_area in runtime_data.genome["blueprint"]:
-        cortical_information[cortical_area] = {}
-        genes = runtime_data.genome["blueprint"][cortical_area]
-
-        cortical_information[cortical_area]["cortical_name"] = genes["cortical_name"]
-        cortical_information[cortical_area]["cortical_group"] = genes["group_id"]
-        cortical_information[cortical_area]["cortical_sub_group"] = genes["sub_group_id"]
-        cortical_information[cortical_area]["visible"] = genes["visualization"]
-
-        cortical_information[cortical_area]["coordinates_2d"] = [
-            genes["2d_coordinate"][0],
-            genes["2d_coordinate"][1]
-        ]
-
-        cortical_information[cortical_area]["coordinates_3d"] = [
-            genes["relative_coordinate"][0],
-            genes["relative_coordinate"][1],
-            genes["relative_coordinate"][2]
-        ]
-
-        cortical_information[cortical_area]["cortical_dimensions"] = [
-            genes["block_boundaries"][0],
-            genes["block_boundaries"][1],
-            genes["block_boundaries"][2]
-        ]
-
-    with open(runtime_data.connectome_path+"cortical_data_by_id.json", "w") as data_file:
-        data_file.seek(0)
-        data_file.write(json.dumps(cortical_information, indent=3))
-        data_file.truncate()
-
-    return cortical_information
diff --git a/src/inf/runtime_data.py b/src/inf/runtime_data.py
index 5c0b84479..68d88b829 100644
--- a/src/inf/runtime_data.py
+++ b/src/inf/runtime_data.py
@@ -43,7 +43,10 @@
 paths = {}
 pending_amalgamation = {}
 amalgamation_history = {}
-
+changes_saved_externally = False
+bv_advanced_mode = True
+ui_magnification = 1.0
+auto_pns_area_creation = True
 
 # Evolutionary
 genome = {}
@@ -74,6 +77,7 @@
     "3d_viz": 0
 }
 manual_delete_list = set()
+genome_fitness = 1
 
 # Staging Zone
 pending_genome = None
@@ -109,7 +113,7 @@
 neuron_mp_collection_scope = {}
 neuron_psp_collection_scope = {}
 training_stats = {}
-game_stats = {}
+fitness_stats = {}
 brain_stats = {
     "neuron_count": 0,
     "synapse_count": 0
@@ -159,6 +163,7 @@
 brain_is_running = False
 cumulative_stats = {}
 memory_register = {}
+cortical_area_region_association = dict()
 
 
 # Training
@@ -193,6 +198,13 @@
 }
 """
 agent_registry = {}
+host_info = {}
+connected_agents = {
+    "media_capture_ctrl": False,
+    "bluetooth_ctrl": False,
+    "godot_game_ctrl": False,
+    "zmq_to_ws_ctrl": False
+}
 
 
 # Unique Logs
@@ -200,3 +212,9 @@
     "PNS": set(),
     "CNS": set()
 }
+
+# Visualization
+cortical_viz_list = set()
+cortical_viz_skip_rate = 0
+cortical_viz_sup_threshold = 10000
+cortical_viz_sup_till_burst = dict()
diff --git a/src/main.py b/src/main.py
index a8e4f86c0..bff876fd2 100644
--- a/src/main.py
+++ b/src/main.py
@@ -9,6 +9,7 @@
 
 if __name__ == "__main__":
     import sys
+    import os
     from configuration import init_parameters
 
     sys.path.append('../')
@@ -22,7 +23,10 @@
     if platform.system() == 'Windows':
         with open("logging_config.json", "r") as config_file:
             logging_config_data = json.load(config_file)
-
+        # grab temp from local only regardleess account name.
+        temp_misc = os.getenv('TEMP')
+        logging_config_data['handlers']['misc_logs']['filename'] = temp_misc + r'\feagi-misc.log'
+        logging_config_data['handlers']['api_logs']['filename'] = temp_misc + r'\feagi-api.log'
         # setup loggers
         logging.config.dictConfig(logging_config_data)
 
diff --git a/src/mem/memory.py b/src/mem/memory.py
index 5b1daa866..189bcb4b7 100644
--- a/src/mem/memory.py
+++ b/src/mem/memory.py
@@ -163,31 +163,41 @@ def long_short_term_memory():
     runtime_data.lstm_fire_queue = set()
     if runtime_data.memory_register:
         for memory_cortical_area in runtime_data.memory_register:
-            neurogenesis_list = set()
-            for upstream_cortical_area in runtime_data.memory_register[memory_cortical_area]:
-                if upstream_cortical_area in runtime_data.fire_candidate_list:
-                    if runtime_data.fire_candidate_list[upstream_cortical_area]:
-                        # todo: performance: exclude non-immortal neurons from being processed
-                        neurogenesis_list.update(runtime_data.fire_candidate_list[upstream_cortical_area])
-            memory_hash = generate_mem_hash_cache(afferent_neuron_list=neurogenesis_list)
-
-            mem_neuron_id = convert_hash_to_neuron_id(cortical_area=memory_cortical_area, memory_hash=memory_hash)
-            if mem_neuron_id not in runtime_data.brain[memory_cortical_area] and memory_hash != "0x0":
-                neuron_id = init_neuron(cortical_area=memory_cortical_area, soma_location=[0, 0, 0], mem_neuron_id=memory_hash)
-                runtime_data.voxel_dict[memory_cortical_area]["0-0-0"].add(neuron_id)
-                synapse_count = synapse_memory_neuron(neuron_id=neuron_id)
-            else:
-                increase_neuron_lifespan(cortical_area=memory_cortical_area, neuron_id=mem_neuron_id)
+            if memory_cortical_area in runtime_data.brain:
+                neurogenesis_list = set()
+                for upstream_cortical_area in runtime_data.memory_register[memory_cortical_area]:
+                    if upstream_cortical_area in runtime_data.fire_candidate_list:
+                        if runtime_data.fire_candidate_list[upstream_cortical_area]:
+                            # todo: performance: exclude non-immortal neurons from being processed
+                            neurogenesis_list.update(runtime_data.fire_candidate_list[upstream_cortical_area])
+                memory_hash = generate_mem_hash_cache(afferent_neuron_list=neurogenesis_list)
+
+                mem_neuron_id = convert_hash_to_neuron_id(cortical_area=memory_cortical_area, memory_hash=memory_hash)
+                if mem_neuron_id not in runtime_data.brain[memory_cortical_area] and memory_hash != "0x0":
+                    neuron_id = init_neuron(cortical_area=memory_cortical_area,
+                                            soma_location=[0, 0, 0],
+                                            mem_neuron_id=memory_hash)
+                    runtime_data.voxel_dict[memory_cortical_area]["0-0-0"].add(neuron_id)
+                    synapse_count = synapse_memory_neuron(neuron_id=neuron_id)
+                else:
+                    increase_neuron_lifespan(cortical_area=memory_cortical_area, neuron_id=mem_neuron_id)
 
-            if memory_hash != "0x0":
-                if memory_cortical_area not in runtime_data.future_fcl:
-                    runtime_data.future_fcl[memory_cortical_area] = set()
+                if memory_hash != "0x0":
+                    if memory_cortical_area not in runtime_data.future_fcl:
+                        runtime_data.future_fcl[memory_cortical_area] = set()
 
-                runtime_data.lstm_fire_queue.add(mem_neuron_id)
-                if memory_cortical_area in runtime_data.plasticity_dict:
-                    runtime_data.plasticity_queue_candidates.add(mem_neuron_id)
+                    runtime_data.lstm_fire_queue.add(mem_neuron_id)
+                    if memory_cortical_area in runtime_data.plasticity_dict:
+                        runtime_data.plasticity_queue_candidates.add(mem_neuron_id)
+
+                inject_lstm_fire_queue_to_fcl()
+            else:
+                # Clean up memory register in case it doesn't exist in brain
+                for memory_area in runtime_data.memory_register:
+                    if memory_cortical_area in runtime_data.memory_register[memory_area]:
+                        runtime_data.memory_register[memory_area].remove(memory_cortical_area)
 
-            inject_lstm_fire_queue_to_fcl()
+                del runtime_data.memory_register[memory_cortical_area]
 
 
 def lstm_lifespan_mgmt():
@@ -196,7 +206,7 @@ def lstm_lifespan_mgmt():
     """
     if runtime_data.memory_register:
         if runtime_data.burst_count > runtime_data.upcoming_lifesnap_mgmt:
-            runtime_data.upcoming_lifesnap_mgmt += runtime_data.genome["lifespan_mgmt_interval"]
+            runtime_data.upcoming_lifesnap_mgmt += runtime_data.genome["physiology"]["lifespan_mgmt_interval"]
 
             # Wipe short-term memory neurons that has expired
             memory_cleanup()
diff --git a/src/npu/burst_engine.py b/src/npu/burst_engine.py
index e491bf53a..5c4d4ea1d 100644
--- a/src/npu/burst_engine.py
+++ b/src/npu/burst_engine.py
@@ -93,7 +93,7 @@ def burst_duration_calculator(controller_capabilities):
     #     alert_condition = elapsed_time.seconds > int(runtime_data.parameters['Timers']['alert_mode_duration'])
     #     if alert_condition:
     #         time_delta = datetime.now() - runtime_data.last_ipu_activity
-    #         if time_delta.seconds > int(runtime_data.genome['ipu_idle_threshold']):
+    #         if time_delta.seconds > int(runtime_data.genome["physiology"]['ipu_idle_threshold']):
     #             # Go to sleep by stopping IPU/OPU threads
     #             # todo: instead of turning off the IPU, reduce IPU responsiveness so via an trigger brain can awake
     #             print(">> >> Brain going to sleep..")
@@ -168,10 +168,10 @@ def burst_stats(burst_start_time):
                       % (runtime_data.burst_duration, runtime_data.burst_count) + settings.Bcolors.ENDC)
 
     def evolutionary_checkpoint():
-        if runtime_data.burst_count % runtime_data.genome['evolution_burst_count'] == 0:
+        if runtime_data.burst_count % runtime_data.genome["physiology"]['evolution_burst_count'] == 0:
             print('Evolution phase reached...')
             for area in runtime_data.cortical_list:
-                neuron_count, synapse_count = connectome_total_synapse_cnt(area)
+                neuron_count, synapse_count = cortical_area_anatomical_stats(area)
                 if (runtime_data.parameters["Database"]["influxdb_enabled"] and
                         runtime_data.influxdb and
                         runtime_data.parameters["Database"]["influx_stat_logger"]):
@@ -207,8 +207,8 @@ def consecutive_fire_threshold_check(cortical_area_, neuron_id):
         consecutive_fire_cnt_max = runtime_data.genome["blueprint"][cortical_area_]["consecutive_fire_cnt_max"]
         consecutive_fire_cnt = runtime_data.brain[cortical_area_][neuron_id]["consecutive_fire_cnt"]
         if 0 < consecutive_fire_cnt_max <= consecutive_fire_cnt:
-            snooze_till(cortical_area_, neuron_id, runtime_data.burst_count +
-                        runtime_data.genome["blueprint"][cortical_area_]["snooze_length"])
+
+            snooze(cortical_area_, neuron_id)
             runtime_data.brain[cortical_area_][neuron_id]["consecutive_fire_cnt"] = 0
             return False
         else:
@@ -218,7 +218,7 @@ def fire_fcl_contents():
         # time_firing_activities = datetime.now()
         if candidate_list_counter(runtime_data.fire_candidate_list) == 0:
             runtime_data.empty_fcl_counter += 1
-            print("FCL is empty!")
+            # print("FCL is empty!")
         else:
             # Capture cortical activity stats
             capture_cortical_activity_stats()
@@ -229,7 +229,7 @@ def fire_fcl_contents():
 
             # Fire FCL neurons and pre-process viability of the downstream neurons for firing
             # Todo: Move degeneration items to a higher level to save on compute cycles
-            for fcl_cortical_area in runtime_data.fire_candidate_list:
+            for fcl_cortical_area in runtime_data.fire_candidate_list.copy():
                 if "degeneration" not in runtime_data.genome['blueprint'][fcl_cortical_area] or \
                         runtime_data.genome['blueprint'][fcl_cortical_area]['degeneration'] is None:
                     degeneration_val = 0
@@ -238,19 +238,22 @@ def fire_fcl_contents():
                 while runtime_data.fire_candidate_list[fcl_cortical_area]:
                     neuron_to_fire = runtime_data.fire_candidate_list[fcl_cortical_area].pop()
                     # Update downstream neurons in an isolated queue
-                    neuron_pre_fire_processing(fcl_cortical_area, neuron_to_fire, degenerate=degeneration_val)
+                    if neuron_to_fire in runtime_data.brain[fcl_cortical_area]:
+                        neuron_pre_fire_processing(fcl_cortical_area, neuron_to_fire, degenerate=degeneration_val)
 
-                    runtime_data.brain[fcl_cortical_area][neuron_to_fire][
-                        "last_membrane_potential_update"] = runtime_data.burst_count
+                        runtime_data.brain[fcl_cortical_area][neuron_to_fire][
+                            "last_membrane_potential_update"] = runtime_data.burst_count
 
-                    # Log the pre-fire neuron membrane potential in database
-                    neuron_stimulation_mp_logger(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire)
+                        # Log the pre-fire neuron membrane potential in database
+                        neuron_stimulation_mp_logger(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire)
 
-                    runtime_data.brain[fcl_cortical_area][neuron_to_fire]['membrane_potential'] = 0
+                        runtime_data.brain[fcl_cortical_area][neuron_to_fire]['membrane_potential'] = 0
 
-                    # Log a zero membrane potential for post neuron firing
-                    membrane_potential_update(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire,
-                                              membrane_potential_change=0, overwrite=True, overwrite_value=0)
+                        # Log a zero membrane potential for post neuron firing
+                        membrane_potential_update(cortical_area=fcl_cortical_area, neuron_id=neuron_to_fire,
+                                                  membrane_potential_change=0, overwrite=True, overwrite_value=0)
+                    else:
+                        print("Warning!! FCL contained dead neuron!")
 
             # Add neurons to future FCL
             # This is where neuron leak is considered and membrane potentials are updated+++
@@ -434,7 +437,7 @@ def monitor_visualization():
     def manual_neuron_stimulation():
         if runtime_data.agent_registry is not {}:
             try:
-                for agent in runtime_data.agent_registry:
+                for agent in runtime_data.agent_registry.copy():
                     if runtime_data.agent_registry[agent]["agent_type"] == "monitor":
                         godot_data = runtime_data.agent_registry[agent]["listener"].receive()
                         if godot_data:
@@ -479,19 +482,44 @@ def brain_activity_voxelizer():
                 try:
                     for _ in runtime_data.fire_candidate_list:
                         fire_list = set(runtime_data.fire_candidate_list[_])
-                        if runtime_data.genome['blueprint'][_].get('visualization'):
-                            while fire_list:
-                                firing_neuron = fire_list.pop()
-                                firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
-                                relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
-                                broadcast_message.add(
-                                    (
-                                        runtime_data.burst_count,
-                                        firing_neuron_loc[0] + relative_coords[0],
-                                        firing_neuron_loc[1] + relative_coords[1],
-                                        firing_neuron_loc[2] + relative_coords[2]
+                        if _ not in runtime_data.cortical_viz_list:
+                            if len(fire_list) > runtime_data.cortical_viz_sup_threshold:
+                                # todo: move this to a function that does cortical area initialization
+                                if _ not in runtime_data.cortical_viz_sup_till_burst:
+                                    runtime_data.cortical_viz_sup_till_burst[_] = \
+                                        runtime_data.burst_count + runtime_data.cortical_viz_skip_rate
+
+                                if runtime_data.burst_count < runtime_data.cortical_viz_sup_till_burst[_]:
+                                    pass
+                                else:
+                                    runtime_data.cortical_viz_sup_till_burst[_] = \
+                                        runtime_data.burst_count + runtime_data.cortical_viz_skip_rate
+                                    # todo: duplicate code snippet 10 lines down -- refactor
+                                    while fire_list:
+                                        firing_neuron = fire_list.pop()
+                                        firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
+                                        relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
+                                        broadcast_message.add(
+                                            (
+                                                runtime_data.burst_count,
+                                                firing_neuron_loc[0] + relative_coords[0],
+                                                firing_neuron_loc[1] + relative_coords[1],
+                                                firing_neuron_loc[2] + relative_coords[2]
+                                            )
+                                        )
+                            else:
+                                while fire_list:
+                                    firing_neuron = fire_list.pop()
+                                    firing_neuron_loc = runtime_data.brain[_][firing_neuron]['soma_location']
+                                    relative_coords = runtime_data.genome['blueprint'][_].get('relative_coordinate')
+                                    broadcast_message.add(
+                                        (
+                                            runtime_data.burst_count,
+                                            firing_neuron_loc[0] + relative_coords[0],
+                                            firing_neuron_loc[1] + relative_coords[1],
+                                            firing_neuron_loc[2] + relative_coords[2]
+                                        )
                                     )
-                                )
                     return broadcast_message
                 except Exception as e:
                     print("Exception during voxelization.", e, traceback.print_exc())
@@ -598,6 +626,14 @@ def burst():
                 for neuron in runtime_data.brain["___pwr"]:
                     runtime_data.fire_candidate_list["___pwr"].add(neuron)
 
+            # Reset connected agent list
+            runtime_data.connected_agents = {
+                "media_capture_ctrl": False,
+                "bluetooth_ctrl": False,
+                "godot_game_ctrl": False,
+                "zmq_to_ws_ctrl": False
+            }
+
             # Manage ZMQ communication from and to FEAGI
             pns_manager()
 
@@ -632,8 +668,6 @@ def burst():
         # Fire all neurons within fire_candidate_list (FCL) or add a delay if FCL is empty
         if not runtime_data.new_genome and runtime_data.brain_readiness:
             fire_fcl_contents()
-        else:
-            print("Brain is not ready to fire FCL contents....")
 
         runtime_data.plasticity_queue.append(runtime_data.plasticity_queue_candidates)
 
@@ -668,8 +702,8 @@ def burst():
                 death_manager()
                 if runtime_data.feagi_state["state"] == "idle" and runtime_data.autopilot:
                     load_new_genome()
-            except:
-                print("consciousness_manager encountered an error!!")
+            except Exception as e:
+                print(f"consciousness_manager encountered an error!! {e}")
 
         if not runtime_data.controller_config and runtime_data.burst_publisher:
             controller_handshake()
diff --git a/src/npu/physiology.py b/src/npu/physiology.py
index 3b953161f..5ae65e20b 100644
--- a/src/npu/physiology.py
+++ b/src/npu/physiology.py
@@ -34,12 +34,16 @@ def activation_function(postsynaptic_current):
 
 
 def reset_cumulative_counters(cortical_area, neuron_id):
-    runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] = runtime_data.burst_count
-    runtime_data.brain[cortical_area][neuron_id]["last_membrane_potential_reset_burst"] = runtime_data.burst_count
-    runtime_data.brain[cortical_area][neuron_id]['cumulative_fire_count'] += 1
-    runtime_data.brain[cortical_area][neuron_id]["cumulative_fire_count_inst"] += 1
-    # Condition to increase the consecutive fire count
-    runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] += 1
+    if neuron_id in runtime_data.brain[cortical_area]:
+        if runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] == runtime_data.burst_count - 1:
+            runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] += 1
+        else:
+            runtime_data.brain[cortical_area][neuron_id]["consecutive_fire_cnt"] = 0
+
+        runtime_data.brain[cortical_area][neuron_id]["last_burst_num"] = runtime_data.burst_count
+        runtime_data.brain[cortical_area][neuron_id]["last_membrane_potential_reset_burst"] = runtime_data.burst_count
+        runtime_data.brain[cortical_area][neuron_id]['cumulative_fire_count'] += 1
+        runtime_data.brain[cortical_area][neuron_id]["cumulative_fire_count_inst"] += 1
 
 
 def neuron_stimulation_mp_logger(cortical_area, neuron_id):
@@ -99,9 +103,16 @@ def update_membrane_potential_fire_queue(cortical_area, neuron_id, mp_update_amo
         runtime_data.fire_queue[cortical_area][neuron_id][0] += mp_update_amount
     if fcl_insertion:
         if runtime_data.fire_queue[cortical_area][neuron_id][0] > runtime_data.fire_queue[cortical_area][neuron_id][1]:
-            add_neuron_to_fcl(cortical_area=cortical_area,
-                              neuron_id=neuron_id,
-                              pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
+            if runtime_data.genome['blueprint'][cortical_area]['firing_threshold_limit'] == 0:
+                add_neuron_to_fcl(cortical_area=cortical_area,
+                                  neuron_id=neuron_id,
+                                  pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
+            elif runtime_data.fire_queue[cortical_area][neuron_id][0] <= \
+                    (runtime_data.fire_queue[cortical_area][neuron_id][1] +
+                     runtime_data.genome['blueprint'][cortical_area]['firing_threshold_limit']):
+                add_neuron_to_fcl(cortical_area=cortical_area,
+                                  neuron_id=neuron_id,
+                                  pre_fire_mp=runtime_data.fire_queue[cortical_area][neuron_id][0])
 
 
 def add_neuron_to_fcl(cortical_area, neuron_id, pre_fire_mp):
@@ -159,8 +170,10 @@ def neuron_pre_fire_processing(cortical_area, neuron_id, degenerate=0):
 
             if degenerate > 0:
                 # reduce neuron postsynaptic current by degeneration value defined in genome (if applicable)
-                new_psc = runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron_id]["postsynaptic_current"]
+                new_psc = \
+                    runtime_data.brain[cortical_area][neuron_id]["neighbors"][dst_neuron_id]["postsynaptic_current"]
                 new_psc -= degenerate
+                # todo: consider degeneracy for inhibitory connections
                 if new_psc < 0:
                     new_psc = 0
                 post_synaptic_current_update(cortical_area_src=cortical_area, cortical_area_dst=dst_cortical_area,
@@ -168,7 +181,8 @@ def neuron_pre_fire_processing(cortical_area, neuron_id, degenerate=0):
                                              post_synaptic_current=new_psc)
 
             if runtime_data.genome['blueprint'][cortical_area]['mp_driven_psp']:
-                postsynaptic_current = runtime_data.brain[cortical_area][neuron_id]['pre_fire_mp']
+                if "pre_fire_mp" in runtime_data.brain[cortical_area][neuron_id]:
+                    postsynaptic_current = runtime_data.brain[cortical_area][neuron_id]['pre_fire_mp']
 
             neuron_output = activation_function(postsynaptic_current)
 
@@ -358,16 +372,15 @@ def neuron_neighbors(cortical_area, neuron_id):
     return data[neuron_id]["neighbors"]
 
 
-def snooze_till(cortical_area, neuron_id, burst_id):
+def snooze(cortical_area, neuron_id):
     """ Acting as an inhibitory neurotransmitter to suppress firing of neuron till a later burst_manager
 
     *** This function instead of inhibitory behavior is more inline with Neuron Refractory period
 
     """
     runtime_data.brain[cortical_area][neuron_id]["snooze_till_burst_num"] \
-        = burst_id + runtime_data.genome["blueprint"][cortical_area]["snooze_length"] - 1
+        = runtime_data.burst_count + runtime_data.genome["blueprint"][cortical_area]["snooze_length"] - 1
     # print("%s : %s has been snoozed!" % (cortical_area, neuron_id))
-    return
 
 
 def pruner(pruning_data):
diff --git a/src/npu/stimulator.py b/src/npu/stimulator.py
index de0d2cdd7..87089f06c 100644
--- a/src/npu/stimulator.py
+++ b/src/npu/stimulator.py
@@ -1,3 +1,17 @@
+# Copyright 2016-2024 The FEAGI Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ==============================================================================
 
 """
 This module contains a virtual set of hardware controllers used for simulation and testing only
diff --git a/src/pns/pns_router.py b/src/pns/pns_router.py
index 04d2a4b86..19629acc3 100644
--- a/src/pns/pns_router.py
+++ b/src/pns/pns_router.py
@@ -81,6 +81,12 @@ def stimuli_router(ipu_data):
                     print("ERROR while processing Stimulation IPU", ipu_data["data"]["direct_stimulation"], ">>", e,
                           traceback.format_exc())
 
+        if "connected_agents" in ipu_data["data"]:
+            if ipu_data["data"]["connected_agents"]:
+                for connected_agent in ipu_data["data"]["connected_agents"]:
+                    if not runtime_data.connected_agents[connected_agent]:
+                        runtime_data.connected_agents[connected_agent] = True
+
         if "sensory_data" in ipu_data["data"]:
             for sensor_type in ipu_data["data"]["sensory_data"]:
                 # Ultrasonic / Lidar Handler
@@ -166,7 +172,7 @@ def opu_router():
     {'o__bat': {}, 'o__mot': {'0-0-0': 47, '0-0-5': 48, '0-0-15': 50, '0-0-1': 45}}
 
     """
-    for cortical_area in runtime_data.fire_candidate_list:
+    for cortical_area in runtime_data.fire_candidate_list.copy():
         if str(cortical_area)[0] == 'o':
             if cortical_area not in runtime_data.opu_data:
                 runtime_data.opu_data[cortical_area] = {}
diff --git a/src/pns/stimuli_translator.py b/src/pns/stimuli_translator.py
index 422a91f37..c7be415a9 100644
--- a/src/pns/stimuli_translator.py
+++ b/src/pns/stimuli_translator.py
@@ -224,51 +224,51 @@ def training_translator(stimulation):
         inject_stimuli_to_fcl(cortical_area=cortical_area, stimulation=stimulation)
 
 
-def lidar_translator(proximity_data):
-    """
-    Translate the lidar messages based on its type.
-
-    todo: add details here about the message format and expectations
-
-
-    Type is not needed at this point given the lidar vs sonar data is automatically differentiated within the func.
-    """
-
-    cortical_area = 'i__pro'
-    if cortical_area_in_genome(cortical_area):
-        if proximity_data is not None:
-            # print("SLOT_TYPES", message.SLOT_TYPES)
-            # print("angle_increment:", message.angle_increment)
-            # print("angle_max:", message.angle_max)
-            # print("angle_min:", message.angle_min)
-            # print("get_fields_and_field_types:", message.get_fields_and_field_types)
-            # print("header:", message.header)
-            # print("intensities:", message.intensities)
-            # print("range_max:", message.range_max)
-            # print("range_min:", message.range_min)
-            # print("ranges:", message.ranges)
-            # print("scan_time:", message.scan_time)
-            # print("time_increment:", message.time_increment)
-            # print("-----")
-
-            for sensor in proximity_data:
-                # differentiate between LIDAR/SONAR data
-                if hasattr(proximity_data[sensor], '__iter__'):
-                    detections = stimuli_processor.lidar_to_coords(proximity_data[sensor])
-                else:
-                    detections = stimuli_processor.sonar_to_coords(proximity_data[sensor])
-
-                neurons = stimuli_processor.coords_to_neuron_ids(
-                    detections, cortical_area=cortical_area
-                )
-                # TODO: Add proximity feeder function in fcl_injector
-                if 'i__pro' not in runtime_data.fire_candidate_list:
-                    runtime_data.fire_candidate_list['i__pro'] = set()
-                for neuron in neurons:
-                    runtime_data.fire_candidate_list['i__pro'].add(neuron)
-                # runtime_data.fcl_queue.put({cortical_area: set(neurons)})
-    else:
-        runtime_data.logs["PNS"].add(f"Warning! Cortical stimulation received but genome missing {cortical_area}")
+# def lidar_translator(proximity_data):
+#     """
+#     Translate the lidar messages based on its type.
+#
+#     todo: add details here about the message format and expectations
+#
+#
+#     Type is not needed at this point given the lidar vs sonar data is automatically differentiated within the func.
+#     """
+#
+#     cortical_area = 'i__pro'
+#     if cortical_area_in_genome(cortical_area):
+#         if proximity_data is not None:
+#             # print("SLOT_TYPES", message.SLOT_TYPES)
+#             # print("angle_increment:", message.angle_increment)
+#             # print("angle_max:", message.angle_max)
+#             # print("angle_min:", message.angle_min)
+#             # print("get_fields_and_field_types:", message.get_fields_and_field_types)
+#             # print("header:", message.header)
+#             # print("intensities:", message.intensities)
+#             # print("range_max:", message.range_max)
+#             # print("range_min:", message.range_min)
+#             # print("ranges:", message.ranges)
+#             # print("scan_time:", message.scan_time)
+#             # print("time_increment:", message.time_increment)
+#             # print("-----")
+#
+#             for sensor in proximity_data:
+#                 # differentiate between LIDAR/SONAR data
+#                 if hasattr(proximity_data[sensor], '__iter__'):
+#                     detections = stimuli_processor.lidar_to_coords(proximity_data[sensor])
+#                 else:
+#                     detections = stimuli_processor.sonar_to_coords(proximity_data[sensor])
+#
+#                 neurons = stimuli_processor.coords_to_neuron_ids(
+#                     detections, cortical_area=cortical_area
+#                 )
+#                 # TODO: Add proximity feeder function in fcl_injector
+#                 if 'i__pro' not in runtime_data.fire_candidate_list:
+#                     runtime_data.fire_candidate_list['i__pro'] = set()
+#                 for neuron in neurons:
+#                     runtime_data.fire_candidate_list['i__pro'].add(neuron)
+#                 # runtime_data.fcl_queue.put({cortical_area: set(neurons)})
+#     else:
+#         runtime_data.logs["PNS"].add(f"Warning! Cortical stimulation received but genome missing {cortical_area}")
 
 
 def gyro_translator(gyroscope_data):
diff --git a/third_party/visualizers/grafana/Dockerfile b/third_party/visualizers/grafana/Dockerfile
deleted file mode 100644
index f92819ba5..000000000
--- a/third_party/visualizers/grafana/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-FROM grafana/grafana:8.2.5-ubuntu
-
-ENV GF_AUTH_DISABLE_LOGIN_FORM=true
-ENV GF_AUTH_ANONYMOUS_ENABLED=true
-ENV GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
-
-COPY ./provisioning /etc/grafana/provisioning
-COPY ./grafana.ini /etc/grafana/grafana.ini
-COPY ./dashboards /etc/grafana/dashboards
diff --git a/third_party/visualizers/grafana/README.md b/third_party/visualizers/grafana/README.md
deleted file mode 100644
index a02ede6b6..000000000
--- a/third_party/visualizers/grafana/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# The information in this file may be outdated. Please refer to the [grafana](https://github.com/feagi/feagi/wiki/Grafana) page in the wiki for the most up to date information.
-
-# **Visualizing FEAGI data with Grafana**
-Users have the option to perform real-time monitoring of artificial brain activities (ex: membrane potentials, active cortical areas, composite network activity, current burst index etc.) during FEAGI runtime, which can be useful for troubleshooting and gaining insights into artificial brain functioning. This is achieved using [Grafana](https://grafana.com) combined with [InfluxDB](https://www.influxdata.com) serving as a Grafana datasource for the various forms of time series data generated by FEAGI. These tools can be quickly deployed alongside FEAGI using a containerized approach with minimal user setup required.  
-
-## **Grafana**
-Grafana is an open source web application that provides customizable data visualization where users can create dashboards for visualizing data obtained from a datasource (ex: a database). Configuration files for both dashboards and datasources can be found in `/feagi/third_party/grafana/provisioning` in the `dashboards/` and `datasources/` directories, respectively. General configuration of Grafana itself is achieved through the `grafana.ini` configuration file found in `/feagi/third_party/grafana/`. For more extensive Grafana configuration information, view the Grafana configuration [documentation](https://grafana.com/docs/grafana/latest/administration/configuration/). 
-
-As mentioned previously, Grafana uses InfluxDB as a datasource, which stores time series data collected from FEAGI during execution. The aforementioned datasource configuration file for the InfluxDB datasource contains data for authenticating the InfluxDB instance, connecting to the database URL and specifying the target bucket for data storage. For this containerized deployment, it is recommended that users refrain from altering any of the accessible configuration files to avoid corrupting connections amongst services.
-
-**NOTE:** This deployment uses InfluxDB version 2 (`v2.0.7`), which relies on the functional data scripting language [Flux](https://docs.influxdata.com/flux/v0.x/get-started/) for querying and other data processing operations instead of the SQL-like [InfluxQL](https://docs.influxdata.com/influxdb/v1.8/query_language/) associated with earlier versions of InfluxDB (`< v2.0`). A sample Flux query is provided below to show the basic structure and highlight differences from InfluxQL syntax.
- 
-```
-from(bucket: "example-bucket")
-  |> range(start: -1d)
-  |> filter(fn: (r) => r._measurement == "example-measurement")
-  |> mean()
-  |> yield(name: "_results")
-```
-**Sample Flux query**
-
-## **Deploying networked FEAGI, InfluxDB and Grafana containers using `docker-compose`(Outdated)**
-To deploy a containerized setup consisting of FEAGI, InfluxDB and Grafana, navigate to `/feagi/docker/` and enter the following commands as shown below (assuming both [Docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/install/) are installed on the host machine):
-
-**Build the images**
-- `docker-compose -f docker-compose-feagi-influx-grafana.yml build --no-cache`
-
-**Start the containers**
-- `docker-compose -f docker-compose-feagi-influx-grafana.yml up`
-
-**Access Grafana**
-- Navigate to `http://localhost:3000` in a web browser to access the Grafana main menu, where users may select an existing data visualization dashboard (ex: `test_dashbboard` - a simple, one-panel dashboard for visualizing FEAGI neuron burst data to verify connectivity) or create a new, customized dashboard by clicking on the dashboard icon, then `Manage`, followed by `New Dashboard`.
-
-  &nbsp;  
-  ![dashboard_mgmt](./_static/grafana_mgmt.png)  
-  **Access Grafana dashboard management (if needed) via the menu dock**
-
-- To learn more about Grafana dashboards (creation, customization, management, etc.), visit the following resources:
-    - [Grafana Dashboard overview](https://grafana.com/docs/grafana/latest/dashboards/?pg=docs)
-
-    - [Best practices for creating dashboards](https://grafana.com/docs/grafana/latest/best-practices/best-practices-for-creating-dashboards/)
-
-    - [Change default dashboard](https://grafana.com/docs/grafana/latest/administration/preferences/change-home-dashboard/)
-        
-    - [Add panels to a dashboard](https://grafana.com/docs/grafana/latest/panels/add-a-panel/)
-
-**Confirm FEAGI data is flowing to Grafana**
-- After running `docker-compose -f docker-compose-feagi-influx-grafana.yml up`, data should begin flowing from FEAGI (to InfluxDB) to Grafana and, if configured accordingly, appear in the dashboard in the respective panel(s), similar to the figure shown below.
-
-  &nbsp;  
-  ![grafana_data](./_static/grafana_data.gif)  
-  **Example of FEAGI data being displayed in the panel of a Grafana dashboard**
- 
-- If no data appears in the dashboard despite appropriate configuration, it may be necessary to change the dashboard's Time Range (upper right corner of dashboard), which controls how far into the past the panel's time scale extends, to one of the values present in the dropdown menu (ex: Last _n_ minutes).
-
-  &nbsp;  
-  ![time_range](./_static/grafana_menu.png)  
-  **Location of Time Range dropdown menu on a Grafana dashboard**  
-
-- After confirming that data is flowing to the Grafana dashboard, make any desired adjustments to the dashboard's appearance and/or properties using the Grafana dashboard user interface.
diff --git a/third_party/visualizers/grafana/_static/grafana_data.gif b/third_party/visualizers/grafana/_static/grafana_data.gif
deleted file mode 100644
index d890e2d82..000000000
Binary files a/third_party/visualizers/grafana/_static/grafana_data.gif and /dev/null differ
diff --git a/third_party/visualizers/grafana/_static/grafana_menu.png b/third_party/visualizers/grafana/_static/grafana_menu.png
deleted file mode 100644
index cac222695..000000000
Binary files a/third_party/visualizers/grafana/_static/grafana_menu.png and /dev/null differ
diff --git a/third_party/visualizers/grafana/_static/grafana_mgmt.png b/third_party/visualizers/grafana/_static/grafana_mgmt.png
deleted file mode 100644
index d0baa4df3..000000000
Binary files a/third_party/visualizers/grafana/_static/grafana_mgmt.png and /dev/null differ
diff --git a/third_party/visualizers/grafana/dashboards/archive/default_dashboard_old.json b/third_party/visualizers/grafana/dashboards/archive/default_dashboard_old.json
deleted file mode 100644
index ffcdb6ec5..000000000
--- a/third_party/visualizers/grafana/dashboards/archive/default_dashboard_old.json
+++ /dev/null
@@ -1,151 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "id": 1,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 10,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 4,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "always",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "normal"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          },
-          "unit": "mvolt"
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 8,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 6,
-      "links": [],
-      "options": {
-        "legend": {
-          "calcs": [
-            "lastNotNull",
-            "delta",
-            "min",
-            "max"
-          ],
-          "displayMode": "table",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "alias": "Membrane Potentials",
-          "groupBy": [],
-          "measurement": "membranePotential",
-          "orderByTime": "ASC",
-          "policy": "autogen",
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"membranePotential\" and r[\"_field\"] == \"membrane_potential\" and r[\"_value\"] > 0)\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> drop(columns: [\"_field\", \"_start\", \"_stop\", \"connectome\", \"_measurement\"])\n  |> yield(name: \"mean\")",
-          "refId": "A",
-          "resultFormat": "time_series",
-          "select": [
-            [
-              {
-                "params": [
-                  "membrane_potential"
-                ],
-                "type": "field"
-              }
-            ]
-          ],
-          "tags": []
-        }
-      ],
-      "timeFrom": "5m",
-      "timeShift": null,
-      "title": "Membrane Potentials",
-      "type": "timeseries"
-    }
-  ],
-  "refresh": "30s",
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": []
-  },
-  "time": {
-    "from": "now-5m",
-    "to": "now"
-  },
-  "timepicker": {},
-  "timezone": "",
-  "title": "test_dashboard",
-  "uid": "C1ndOctnk",
-  "version": 24
-}
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/dashboards/default_dashboard.json b/third_party/visualizers/grafana/dashboards/default_dashboard.json
deleted file mode 100644
index 84679125a..000000000
--- a/third_party/visualizers/grafana/dashboards/default_dashboard.json
+++ /dev/null
@@ -1,741 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      },
-      {
-        "datasource": "InfluxDB_v2_Flux",
-        "enable": false,
-        "iconColor": "red",
-        "mappings": {
-          "id": {
-            "source": "field",
-            "value": "Neuron m__inf"
-          },
-          "tags": {
-            "source": "field",
-            "value": "Neuron m__inf"
-          },
-          "text": {
-            "source": "field",
-            "value": "Neuron m__inf"
-          },
-          "time": {
-            "source": "field",
-            "value": "Time"
-          },
-          "timeEnd": {
-            "source": "field",
-            "value": "Time"
-          },
-          "title": {
-            "source": "field",
-            "value": "Neuron m__inf"
-          }
-        },
-        "name": "Shocks",
-        "target": {
-          "limit": 10,
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> drop(columns:[\"connectome\"])\n  |> filter(fn: (r) => r[\"_measurement\"] == \"neuron\")\n  |> filter(fn: (r) => r[\"_field\"] == \"membrane_potential\" and r[\"dst_cortical_area\"] == \"i__shok\" )\n  |> drop(columns:[\"dst_voxel_x\", \"dst_voxel_y\", \"dst_voxel_z\", \"dst_neuron_id\", \"dst_voxel_id\"])\n  |> set(key: \"_field\", value: \"Neuron\")\n",
-          "refId": "Anno",
-          "type": "tags"
-        }
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 1,
-  "id": 3,
-  "iteration": 1654958850174,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 0,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 5,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "auto",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "none"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          }
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 12,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 9,
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "list",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> drop(columns:[\"connectome\"])\n  |> filter(fn: (r) => r[\"_measurement\"] == \"neuron\")\n  |> filter(fn: (r) => r[\"_field\"] == \"membrane_potential\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/ )\n  |> filter(fn: (r) => r[\"dst_voxel_x\"] =~ /^${dst_vox_x:regex}$/ and r[\"dst_voxel_y\"] =~ /^${dst_vox_y:regex}$/ and r[\"dst_voxel_z\"] =~ /^${dst_vox_z:regex}$/ )\n  |> drop(columns:[\"dst_voxel_x\", \"dst_voxel_y\", \"dst_voxel_z\"])\n  |> set(key: \"_field\", value: \"Neuron\")\n",
-          "refId": "A"
-        }
-      ],
-      "title": "Membrane Potentials",
-      "transformations": [
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "cortical_area",
-            "renamePattern": "area"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "(\\d+-\\d+-\\d+_\\d+:\\d+:\\d+_\\d+_)(\\w+)(_N)",
-            "renamePattern": "$2"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "voxel_id",
-            "renamePattern": "vox"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "Neuron ",
-            "renamePattern": ""
-          }
-        }
-      ],
-      "type": "timeseries"
-    },
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 10,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 4,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "always",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "normal"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          },
-          "unit": "none"
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 8,
-        "w": 24,
-        "x": 0,
-        "y": 12
-      },
-      "id": 6,
-      "links": [],
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "table",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "alias": "Membrane Potentials",
-          "groupBy": [],
-          "measurement": "membranePotential",
-          "orderByTime": "ASC",
-          "policy": "autogen",
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"synapse\")\n  |> filter(fn: (r) => r[\"_field\"] == \"postSynapticCurrent\" and (r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/))\n  |> filter(fn: (r) => r[\"src_neuron_id\"] =~ /^${src_neuron_id:regex}$/ and r[\"dst_neuron_id\"] =~ /^${dst_neuron_id:regex}$/)\n  |> filter(fn: (r) => r[\"dst_voxel_x\"] =~ /^${dst_vox_x:regex}$/ and r[\"dst_voxel_y\"] =~ /^${dst_vox_y:regex}$/ and r[\"dst_voxel_z\"] =~ /^${dst_vox_z:regex}$/ )\n  |> drop(columns:[\"connectome\", \"src_voxel_x\", \"src_voxel_y\", \"src_voxel_z\", \"dst_voxel_x\", \"dst_voxel_y\", \"dst_voxel_z\"])\n  |> yield(name: \"mean\")",
-          "refId": "A",
-          "resultFormat": "time_series",
-          "select": [
-            [
-              {
-                "params": [
-                  "membrane_potential"
-                ],
-                "type": "field"
-              }
-            ]
-          ],
-          "tags": []
-        }
-      ],
-      "timeShift": null,
-      "title": "Post Synaptic Currents",
-      "transformations": [
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "cortical_area",
-            "renamePattern": "area"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "(\\d+-\\d+-\\d+_\\d+:\\d+:\\d+_\\d+_)(\\w+)(_N)",
-            "renamePattern": "$2"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "voxel_id",
-            "renamePattern": "vox"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "postSynapticCurrent ",
-            "renamePattern": ""
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "(\\d+-\\d+-\\d+_\\d+:\\d+:\\d+_\\d+_)(\\w+)(_N)",
-            "renamePattern": "$2"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "voxel_id",
-            "renamePattern": "vox"
-          }
-        }
-      ],
-      "type": "timeseries"
-    },
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 0,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 5,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "auto",
-            "spanNulls": true,
-            "stacking": {
-              "group": "A",
-              "mode": "none"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          }
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 12,
-        "w": 24,
-        "x": 0,
-        "y": 20
-      },
-      "id": 8,
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "list",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "multi"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> drop(columns:[\"connectome\"])\n  |> filter(fn: (r) => r[\"_measurement\"] == \"neuron\")\n  |> filter(fn: (r) => r[\"dst_voxel_x\"] =~ /^${dst_vox_x:regex}$/ and r[\"dst_voxel_y\"] =~ /^${dst_vox_y:regex}$/ and r[\"dst_voxel_z\"] =~ /^${dst_vox_z:regex}$/ )\n  |> drop(columns:[\"dst_voxel_x\", \"dst_voxel_y\", \"dst_voxel_z\", \"dst_voxel_id\", \"dst_neuron_id\"])\n  |> set(key: \"_field\", value: \"Neuron\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> yield(name: \"average\")\n",
-          "refId": "A"
-        }
-      ],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Average Neuron Fire Count",
-      "transformations": [
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "cortical_area",
-            "renamePattern": "area"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "(\\d+-\\d+-\\d+_\\d+:\\d+:\\d+_\\d+_)(\\w+)(_N)",
-            "renamePattern": "$2"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "voxel_id",
-            "renamePattern": "vox"
-          }
-        },
-        {
-          "id": "renameByRegex",
-          "options": {
-            "regex": "Neuron ",
-            "renamePattern": ""
-          }
-        }
-      ],
-      "type": "timeseries"
-    }
-  ],
-  "refresh": "1s",
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": [
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\"  or r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Cortical Area",
-        "multi": true,
-        "name": "dst_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\"  or r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_x\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Dst Vox X",
-        "multi": true,
-        "name": "dst_vox_x",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_x\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_y\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Dst Vox Y",
-        "multi": true,
-        "name": "dst_vox_y",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_y\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_z\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Dst Vox Z",
-        "multi": true,
-        "name": "dst_vox_z",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_voxel_z\",\n    predicate: (r) =>  r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": false,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\" or r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Cortical Area",
-        "multi": true,
-        "name": "src_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\" or r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Src Vox X",
-        "multi": true,
-        "name": "src_vox_x",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Src Vox Y",
-        "multi": true,
-        "name": "src_vox_y",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Src Vox Z",
-        "multi": true,
-        "name": "src_vox_z",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Neuron ID",
-        "multi": true,
-        "name": "dst_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Neuron ID",
-        "multi": true,
-        "name": "src_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      }
-    ]
-  },
-  "time": {
-    "from": "now-2m",
-    "to": "now"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "1s",
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "1d"
-    ]
-  },
-  "timezone": "",
-  "title": "FEAGI Brain Activity Analyzer",
-  "uid": "Se3OI7f7k",
-  "version": 76
-}
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/dashboards/game_results.json b/third_party/visualizers/grafana/dashboards/game_results.json
deleted file mode 100644
index 4bdea7b01..000000000
--- a/third_party/visualizers/grafana/dashboards/game_results.json
+++ /dev/null
@@ -1,487 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "id": 6,
-  "iteration": 1696132533966,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            }
-          },
-          "mappings": []
-        },
-        "overrides": [
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count punishment"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "light-red",
-                  "mode": "fixed"
-                }
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count success"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "green",
-                  "mode": "fixed"
-                }
-              }
-            ]
-          }
-        ]
-      },
-      "gridPos": {
-        "h": 11,
-        "w": 9,
-        "x": 0,
-        "y": 0
-      },
-      "id": 4,
-      "options": {
-        "displayLabels": [
-          "value"
-        ],
-        "legend": {
-          "displayMode": "list",
-          "placement": "bottom"
-        },
-        "pieType": "pie",
-        "reduceOptions": {
-          "calcs": [
-            "count"
-          ],
-          "fields": "",
-          "values": false
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "repeat": "TimeInterval",
-      "repeatDirection": "h",
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"game_result\")\n  |> filter(fn: (r) => r[\"_field\"] == \"count\")\n  |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false)\n  |> yield(name: \"sum\")\n",
-          "refId": "A"
-        }
-      ],
-      "title": "Success vs Punishment",
-      "transparent": true,
-      "type": "piechart"
-    },
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "thresholds"
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          },
-          "unit": "percent"
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 11,
-        "w": 5,
-        "x": 9,
-        "y": 0
-      },
-      "id": 8,
-      "options": {
-        "colorMode": "value",
-        "graphMode": "area",
-        "justifyMode": "auto",
-        "orientation": "auto",
-        "reduceOptions": {
-          "calcs": [
-            "lastNotNull"
-          ],
-          "fields": "",
-          "values": false
-        },
-        "text": {
-          "titleSize": 1
-        },
-        "textMode": "auto"
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "query": "// Define the bucket and time range\nbucket = \"data\"\nstart_time = v.timeRangeStart\nstop_time = v.timeRangeStop\n\n// Count of success\nsuccessCount = from(bucket: bucket)\n  |> range(start: start_time, stop: stop_time)\n  |> filter(fn: (r) => \n      r[\"_measurement\"] == \"game_result\" and \n      r[\"_field\"] == \"count\" and \n      r[\"event\"] == \"success\"\n  )\n  |> count()\n\n// Count of punishment\npunishmentCount = from(bucket: bucket)\n  |> range(start: start_time, stop: stop_time)\n  |> filter(fn: (r) => \n      r[\"_measurement\"] == \"game_result\" and \n      r[\"_field\"] == \"count\" and \n      r[\"event\"] == \"punishment\"\n  )\n  |> count()\n\n// Calculate the success rate\nresult = join(\n  tables: {success: successCount, punishment: punishmentCount},\n  on: [\"_start\", \"_stop\"]\n)\n  |> map(fn: (r) => {\n    total = float(v: r._value_success) + float(v: r._value_punishment)\n    return {\n      _time: r._time,\n      _value: if total == 0.0 then 0.0 else float(v: r._value_success * 100) / total,\n      _field: \"successRate\"\n    }\n  })\n\n// Yield the result\nresult |> yield(name: \"successRate\")\n\n",
-          "refId": "A"
-        }
-      ],
-      "title": "Success Rate",
-      "type": "stat"
-    },
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "thresholds"
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              }
-            ]
-          }
-        },
-        "overrides": [
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count success"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "dark-green",
-                  "mode": "fixed"
-                }
-              },
-              {
-                "id": "displayName",
-                "value": "Success"
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count punishment"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "dark-red",
-                  "mode": "fixed"
-                }
-              },
-              {
-                "id": "displayName",
-                "value": "Punishment"
-              }
-            ]
-          }
-        ]
-      },
-      "gridPos": {
-        "h": 11,
-        "w": 10,
-        "x": 14,
-        "y": 0
-      },
-      "id": 2,
-      "options": {
-        "colorMode": "value",
-        "graphMode": "area",
-        "justifyMode": "auto",
-        "orientation": "auto",
-        "reduceOptions": {
-          "calcs": [
-            "sum"
-          ],
-          "fields": "",
-          "values": false
-        },
-        "text": {},
-        "textMode": "auto"
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"game_result\")\n  |> filter(fn: (r) => r[\"_field\"] == \"count\")\n  |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false)\n  |> yield(name: \"sum\")\n",
-          "refId": "A"
-        }
-      ],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Panel Title",
-      "type": "stat"
-    },
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "bars",
-            "fillOpacity": 100,
-            "gradientMode": "hue",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 5,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "auto",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "percent"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "min": 0,
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          }
-        },
-        "overrides": [
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count punishment"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "red",
-                  "mode": "fixed"
-                }
-              }
-            ]
-          },
-          {
-            "matcher": {
-              "id": "byName",
-              "options": "count success"
-            },
-            "properties": [
-              {
-                "id": "color",
-                "value": {
-                  "fixedColor": "green",
-                  "mode": "fixed"
-                }
-              }
-            ]
-          }
-        ]
-      },
-      "gridPos": {
-        "h": 12,
-        "w": 24,
-        "x": 0,
-        "y": 11
-      },
-      "id": 6,
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "list",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"game_result\")\n  |> filter(fn: (r) => r[\"_field\"] == \"count\")\n  |> filter(fn: (r) => r[\"event\"] == \"success\" or r[\"event\"] == \"punishment\")\n  |> aggregateWindow(every: ${TimeInterval}, fn: sum, createEmpty: false)\n  |> yield(name: \"sum\")",
-          "refId": "A"
-        }
-      ],
-      "timeFrom": null,
-      "timeShift": null,
-      "title": "Success / Punishment Timeline",
-      "type": "timeseries"
-    }
-  ],
-  "refresh": "5s",
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": [
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": "5m",
-          "value": "5m"
-        },
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": false,
-        "label": "Time Interval",
-        "multi": false,
-        "name": "TimeInterval",
-        "options": [
-          {
-            "selected": false,
-            "text": "1m",
-            "value": "1m"
-          },
-          {
-            "selected": false,
-            "text": "2m",
-            "value": "2m"
-          },
-          {
-            "selected": false,
-            "text": "3m",
-            "value": "3m"
-          },
-          {
-            "selected": true,
-            "text": "5m",
-            "value": "5m"
-          },
-          {
-            "selected": false,
-            "text": "10m",
-            "value": "10m"
-          },
-          {
-            "selected": false,
-            "text": "15m",
-            "value": "15m"
-          },
-          {
-            "selected": false,
-            "text": "30m",
-            "value": "30m"
-          },
-          {
-            "selected": false,
-            "text": "1h",
-            "value": "1h"
-          },
-          {
-            "selected": false,
-            "text": "2h",
-            "value": "2h"
-          },
-          {
-            "selected": false,
-            "text": "3h",
-            "value": "3h"
-          },
-          {
-            "selected": false,
-            "text": "6h",
-            "value": "6h"
-          },
-          {
-            "selected": false,
-            "text": "12h",
-            "value": "12h"
-          },
-          {
-            "selected": false,
-            "text": "24h",
-            "value": "24h"
-          }
-        ],
-        "query": "1m, 2m, 3m, 5m, 10m, 15m, 30m, 1h, 2h, 3h, 6h, 12h, 24h",
-        "queryValue": "",
-        "skipUrlSync": false,
-        "type": "custom"
-      }
-    ]
-  },
-  "time": {
-    "from": "now-5m",
-    "to": "now"
-  },
-  "timepicker": {},
-  "timezone": "",
-  "title": "Game Dashboard",
-  "uid": "6yux5u34z",
-  "version": 33
-}
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/dashboards/membrane_potential_dashboard.json b/third_party/visualizers/grafana/dashboards/membrane_potential_dashboard.json
deleted file mode 100644
index e927fa443..000000000
--- a/third_party/visualizers/grafana/dashboards/membrane_potential_dashboard.json
+++ /dev/null
@@ -1,336 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "id": 6,
-  "iteration": 1654107715007,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 0,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 5,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "auto",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "none"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          }
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 12,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 8,
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "list",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "targets": [
-        {
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> drop(columns:[\"connectome\"])\n  |> filter(fn: (r) => r[\"_measurement\"] == \"neuron\")\n  |> filter(fn: (r) => r[\"_field\"] == \"membrane_potential\" and r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ )\n  |> filter(fn: (r) => r[\"voxel_x\"] =~ /^${vox_x:regex}$/ and r[\"voxel_y\"] =~ /^${vox_y:regex}$/ and r[\"voxel_z\"] =~ /^${vox_z:regex}$/ )\n  |> drop(columns:[\"voxel_x\", \"voxel_y\", \"voxel_z\"])\n  |> set(key: \"_field\", value: \"Neuron\")",
-          "refId": "A"
-        }
-      ],
-      "title": "Membrane Potentials",
-      "transformations": [],
-      "type": "timeseries"
-    }
-  ],
-  "refresh": "1s",
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": [
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Cortical Area",
-        "multi": true,
-        "name": "src_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Cortical Area",
-        "multi": true,
-        "name": "dst_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "X Voxel",
-        "multi": true,
-        "name": "vox_x",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Y Voxel",
-        "multi": true,
-        "name": "vox_y",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Z Voxel",
-        "multi": true,
-        "name": "vox_z",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Neuron ID",
-        "multi": true,
-        "name": "dst_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Neuron ID",
-        "multi": true,
-        "name": "src_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      }
-    ]
-  },
-  "time": {
-    "from": "now-5m",
-    "to": "now"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "1s",
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "1d"
-    ]
-  },
-  "timezone": "",
-  "title": "FEAGI Membrane Potential Monitor",
-  "uid": "d3gBW0r7k",
-  "version": 3
-}
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/dashboards/postsynaptic_potential_dashboard.json b/third_party/visualizers/grafana/dashboards/postsynaptic_potential_dashboard.json
deleted file mode 100644
index 7ea1d1f5c..000000000
--- a/third_party/visualizers/grafana/dashboards/postsynaptic_potential_dashboard.json
+++ /dev/null
@@ -1,387 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "id": 5,
-  "iteration": 1654203022456,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 10,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 4,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "always",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "normal"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          },
-          "unit": "none"
-        },
-        "overrides": [
-          {
-            "__systemRef": "hideSeriesFrom",
-            "matcher": {
-              "id": "byNames",
-              "options": {
-                "mode": "exclude",
-                "names": [
-                  "postSynapticCurrent {dst_cortical_area=\"i__sho\", dst_neuron_id=\"2022-06-02_20:43:56_402555_CP8I2I_N\", src_cortical_area=\"a_pain\", src_neuron_id=\"2022-06-02_20:43:56_402799_S9F0FK_N\"}"
-                ],
-                "prefix": "All except:",
-                "readOnly": true
-              }
-            },
-            "properties": [
-              {
-                "id": "custom.hideFrom",
-                "value": {
-                  "legend": false,
-                  "tooltip": false,
-                  "viz": true
-                }
-              }
-            ]
-          }
-        ]
-      },
-      "gridPos": {
-        "h": 8,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 6,
-      "links": [],
-      "options": {
-        "legend": {
-          "calcs": [],
-          "displayMode": "table",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "alias": "Membrane Potentials",
-          "groupBy": [],
-          "measurement": "membranePotential",
-          "orderByTime": "ASC",
-          "policy": "autogen",
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"synapse\")\n  |> filter(fn: (r) => r[\"_field\"] == \"postSynapticCurrent\" and (r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/))\n  |> filter(fn: (r) => r[\"src_neuron_id\"] =~ /^${src_neuron_id:regex}$/ and r[\"dst_neuron_id\"] =~ /^${dst_neuron_id:regex}$/)\n  |> drop(columns:[\"connectome\"])\n  |> yield(name: \"mean\")",
-          "refId": "A",
-          "resultFormat": "time_series",
-          "select": [
-            [
-              {
-                "params": [
-                  "membrane_potential"
-                ],
-                "type": "field"
-              }
-            ]
-          ],
-          "tags": []
-        }
-      ],
-      "timeShift": null,
-      "title": "Post Synaptic Currents",
-      "transformations": [
-        {
-          "id": "groupBy",
-          "options": {}
-        }
-      ],
-      "type": "timeseries"
-    }
-  ],
-  "refresh": false,
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": [
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Cortical Area",
-        "multi": true,
-        "name": "src_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"neuron\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Cortical Area",
-        "multi": true,
-        "name": "dst_cortical_area",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_cortical_area\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\",\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "X Voxel",
-        "multi": true,
-        "name": "vox_x",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_x\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Y Voxel",
-        "multi": true,
-        "name": "vox_y",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_y\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Z Voxel",
-        "multi": true,
-        "name": "vox_z",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"voxel_z\",\n    predicate: (r) =>  r[\"src_cortical_area\"] =~ /^${src_cortical_area:regex}$/ or r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 2,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Destination Neuron ID",
-        "multi": true,
-        "name": "dst_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"dst_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      },
-      {
-        "allValue": null,
-        "current": {
-          "selected": true,
-          "text": [
-            "All"
-          ],
-          "value": [
-            "$__all"
-          ]
-        },
-        "datasource": null,
-        "definition": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "description": null,
-        "error": null,
-        "hide": 0,
-        "includeAll": true,
-        "label": "Source Neuron ID",
-        "multi": true,
-        "name": "src_neuron_id",
-        "options": [],
-        "query": "import \"influxdata/influxdb/v1\"\nv1.tagValues(\n    bucket: v.bucket,\n    tag: \"src_neuron_id\",\n    predicate: (r) => r[\"_measurement\"] == \"synapse\" and r[\"dst_cortical_area\"] =~ /^${dst_cortical_area:regex}$/,\n    start: -1d\n)",
-        "refresh": 1,
-        "regex": "",
-        "skipUrlSync": false,
-        "sort": 0,
-        "type": "query"
-      }
-    ]
-  },
-  "time": {
-    "from": "2022-06-02T20:50:53.195Z",
-    "to": "2022-06-02T20:50:53.201Z"
-  },
-  "timepicker": {
-    "refresh_intervals": [
-      "1s",
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "1d"
-    ]
-  },
-  "timezone": "",
-  "title": "FEAGI Postsynaptic Potential Monitor",
-  "uid": "ATgzXo9nz",
-  "version": 6
-}
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/grafana.ini b/third_party/visualizers/grafana/grafana.ini
deleted file mode 100644
index 9bbd58fc0..000000000
--- a/third_party/visualizers/grafana/grafana.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-[paths]
-provisioning = /etc/grafana/provisioning
-
-[auth]
-disable_login_form = true
-
-[auth.anonymous]
-enabled = true
-
-[server]
-enable_gzip = true
-
-[security]
-allow_embedding = true
-
-[users]
-default_theme = dark
-
-[dashboards]
-min_refresh_interval = 1s
\ No newline at end of file
diff --git a/third_party/visualizers/grafana/provisioning/dashboards/dashboard.yml b/third_party/visualizers/grafana/provisioning/dashboards/dashboard.yml
deleted file mode 100644
index 0922449e3..000000000
--- a/third_party/visualizers/grafana/provisioning/dashboards/dashboard.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: 1
-
-providers:
-- name: dashboards
-  org_id: 1
-  folder: ''
-  type: 'file'
-  disableDeletion: false
-  editable: true
-  updateIntervalSeconds: 1
-  allowUiUpdates: true
-  options:
-    path: /etc/grafana/dashboards
-    foldersFromFilesStructure: true
diff --git a/third_party/visualizers/grafana/provisioning/datasources/datasource.yml b/third_party/visualizers/grafana/provisioning/datasources/datasource.yml
deleted file mode 100644
index a5bf292b9..000000000
--- a/third_party/visualizers/grafana/provisioning/datasources/datasource.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: 1
-
-datasources:
-  - name: InfluxDB_v2_Flux
-    type: influxdb
-    access: proxy
-    orgId: 1
-    url: $INFLUXDB_URL
-    user: $INFLUXDB_USER
-    isDefault: true
-    editable: true
-    secureJsonData:
-      token: $INFLUXDB_TOKEN
-      password: $INFLUXDB_PASSWORD
-    jsonData:
-      version: Flux
-      organization: $INFLUXDB_ORG
-      defaultBucket: $INFLUXDB_BUCKET
-      tlsSkipVerify: true
\ No newline at end of file


Test patch:
diff --git a/src/evo/circuits/leak_test_1_23.json b/src/evo/circuits/leak_test_1_23.json
index 2edc98436..fd488ab77 100644
--- a/src/evo/circuits/leak_test_1_23.json
+++ b/src/evo/circuits/leak_test_1_23.json
@@ -929,7 +929,7 @@
    },
    "blueprint": {
       "_____10c-___pwr-cx-_n_cnt-i": 1,
-      "_____10c-___pwr-cx-synatt-i": 100,
+      "_____10c-___pwr-cx-synatt-f": 100,
       "_____10c-___pwr-cx-de_gen-f": 0.0,
       "_____10c-___pwr-cx-pspuni-b": false,
       "_____10c-___pwr-nx-pstcrm-f": 35.0,
@@ -977,7 +977,7 @@
       "_____10c-___pwr-cx-__name-t": "Brain_Power",
       "_____10c-___pwr-cx-_group-t": "IPU",
       "_____10c-_death-cx-_n_cnt-i": 1,
-      "_____10c-_death-cx-synatt-i": 100,
+      "_____10c-_death-cx-synatt-f": 100,
       "_____10c-_death-cx-de_gen-f": 0.01,
       "_____10c-_death-cx-pspuni-b": false,
       "_____10c-_death-nx-pstcrm-f": 35,
@@ -1000,7 +1000,7 @@
       "_____10c-_death-cx-__name-t": "Brain_Death",
       "_____10c-_death-cx-_group-t": "IPU",
       "_____10c-CR3ind-cx-_n_cnt-i": 1,
-      "_____10c-CR3ind-cx-synatt-i": 100,
+      "_____10c-CR3ind-cx-synatt-f": 100,
       "_____10c-CR3ind-cx-de_gen-f": 0.0,
       "_____10c-CR3ind-cx-pspuni-b": true,
       "_____10c-CR3ind-nx-pstcrm-f": 10.0,
@@ -1023,7 +1023,7 @@
       "_____10c-CR3ind-cx-__name-t": "leak_indicator",
       "_____10c-CR3ind-cx-_group-t": "CUSTOM",
       "_____10c-C9UIPS-cx-_n_cnt-i": 1,
-      "_____10c-C9UIPS-cx-synatt-i": 100,
+      "_____10c-C9UIPS-cx-synatt-f": 100,
       "_____10c-C9UIPS-cx-de_gen-f": 0.0,
       "_____10c-C9UIPS-cx-pspuni-b": true,
       "_____10c-C9UIPS-nx-pstcrm-f": 100.0,
@@ -1059,7 +1059,7 @@
       "_____10c-C9UIPS-cx-__name-t": "leak_inhibitory",
       "_____10c-C9UIPS-cx-_group-t": "CUSTOM",
       "_____10c-C7Fexc-cx-_n_cnt-i": 1,
-      "_____10c-C7Fexc-cx-synatt-i": 100,
+      "_____10c-C7Fexc-cx-synatt-f": 100,
       "_____10c-C7Fexc-cx-de_gen-f": 0.0,
       "_____10c-C7Fexc-cx-pspuni-b": true,
       "_____10c-C7Fexc-nx-pstcrm-f": 100.0,
@@ -1095,7 +1095,7 @@
       "_____10c-C7Fexc-cx-__name-t": "leak_excitatory",
       "_____10c-C7Fexc-cx-_group-t": "CUSTOM",
       "_____10c-CRGlea-cx-_n_cnt-i": 1,
-      "_____10c-CRGlea-cx-synatt-i": 100,
+      "_____10c-CRGlea-cx-synatt-f": 100,
       "_____10c-CRGlea-nx-pstcr_-f": 1.0,
       "_____10c-CRGlea-nx-plst_c-f": 1.0,
       "_____10c-CRGlea-cx-de_gen-f": 0.0,
@@ -1143,7 +1143,7 @@
       "_____10c-CRGlea-cx-rcordz-i": -20,
       "_____10c-CRGlea-cx-_group-t": "CUSTOM",
       "_____10c-CQHlea-cx-_n_cnt-i": 1,
-      "_____10c-CQHlea-cx-synatt-i": 100,
+      "_____10c-CQHlea-cx-synatt-f": 100,
       "_____10c-CQHlea-nx-pstcr_-f": 30.0,
       "_____10c-CQHlea-nx-plst_c-f": 1.0,
       "_____10c-CQHlea-cx-de_gen-f": 0.0,
diff --git a/test_deploy b/test_deploy
new file mode 100644
index 000000000..9daeafb98
--- /dev/null
+++ b/test_deploy
@@ -0,0 +1,1 @@
+test
diff --git a/third_party/visualizers/grafana/dashboards/archive/test_dashboard.json b/third_party/visualizers/grafana/dashboards/archive/test_dashboard.json
deleted file mode 100644
index 051179831..000000000
--- a/third_party/visualizers/grafana/dashboards/archive/test_dashboard.json
+++ /dev/null
@@ -1,151 +0,0 @@
-{
-  "annotations": {
-    "list": [
-      {
-        "builtIn": 1,
-        "datasource": "-- Grafana --",
-        "enable": true,
-        "hide": true,
-        "iconColor": "rgba(0, 211, 255, 1)",
-        "name": "Annotations & Alerts",
-        "target": {
-          "limit": 100,
-          "matchAny": false,
-          "tags": [],
-          "type": "dashboard"
-        },
-        "type": "dashboard"
-      }
-    ]
-  },
-  "editable": true,
-  "fiscalYearStartMonth": 0,
-  "gnetId": null,
-  "graphTooltip": 0,
-  "id": 1,
-  "links": [],
-  "liveNow": false,
-  "panels": [
-    {
-      "datasource": null,
-      "fieldConfig": {
-        "defaults": {
-          "color": {
-            "mode": "palette-classic"
-          },
-          "custom": {
-            "axisLabel": "",
-            "axisPlacement": "auto",
-            "barAlignment": 0,
-            "drawStyle": "line",
-            "fillOpacity": 10,
-            "gradientMode": "none",
-            "hideFrom": {
-              "legend": false,
-              "tooltip": false,
-              "viz": false
-            },
-            "lineInterpolation": "linear",
-            "lineWidth": 1,
-            "pointSize": 4,
-            "scaleDistribution": {
-              "type": "linear"
-            },
-            "showPoints": "always",
-            "spanNulls": false,
-            "stacking": {
-              "group": "A",
-              "mode": "normal"
-            },
-            "thresholdsStyle": {
-              "mode": "off"
-            }
-          },
-          "mappings": [],
-          "thresholds": {
-            "mode": "absolute",
-            "steps": [
-              {
-                "color": "green",
-                "value": null
-              },
-              {
-                "color": "red",
-                "value": 80
-              }
-            ]
-          },
-          "unit": "mvolt"
-        },
-        "overrides": []
-      },
-      "gridPos": {
-        "h": 8,
-        "w": 24,
-        "x": 0,
-        "y": 0
-      },
-      "id": 6,
-      "links": [],
-      "options": {
-        "legend": {
-          "calcs": [
-            "lastNotNull",
-            "delta",
-            "min",
-            "max"
-          ],
-          "displayMode": "table",
-          "placement": "bottom"
-        },
-        "tooltip": {
-          "mode": "single"
-        }
-      },
-      "pluginVersion": "8.2.5",
-      "targets": [
-        {
-          "alias": "Membrane Potentials",
-          "groupBy": [],
-          "measurement": "membranePotential",
-          "orderByTime": "ASC",
-          "policy": "autogen",
-          "query": "from(bucket: \"data\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"membranePotential\" and r[\"_field\"] == \"membrane_potential\" and r[\"_value\"] > 0)\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> drop(columns: [\"_field\", \"_start\", \"_stop\", \"connectome\", \"_measurement\"])\n  |> yield(name: \"mean\")",
-          "refId": "A",
-          "resultFormat": "time_series",
-          "select": [
-            [
-              {
-                "params": [
-                  "membrane_potential"
-                ],
-                "type": "field"
-              }
-            ]
-          ],
-          "tags": []
-        }
-      ],
-      "timeFrom": "5m",
-      "timeShift": null,
-      "title": "Membrane Potentials",
-      "type": "timeseries"
-    }
-  ],
-  "refresh": "5s",
-  "schemaVersion": 32,
-  "style": "dark",
-  "tags": [],
-  "templating": {
-    "list": []
-  },
-  "time": {
-    "from": "now-5m",
-    "to": "now"
-  },
-  "timepicker": {},
-  "timezone": "",
-  "title": "test_dashboard",
-  "uid": "C1ndOctnk",
-  "version": 24
-}
\ No newline at end of file