diff --git a/measurements/CPU/Figure5.png b/measurements/CPU/Figure5.png
new file mode 100644
index 0000000..5b91b62
Binary files /dev/null and b/measurements/CPU/Figure5.png differ
diff --git a/measurements/CPU/client_cpu.graphml b/measurements/CPU/client_cpu.graphml
new file mode 100644
index 0000000..495721d
--- /dev/null
+++ b/measurements/CPU/client_cpu.graphml
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+ B:funbody_cpu.py
+
+
+
+
+
+
+
+
+
+
+ OUT:
+
+
+
+
+
+
+
+
+
+ 0x2306_U1
+
+
+
+
+
+
+
+ 1751825758771
+
+ DEL_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+
+ ADD_NODE
+ WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+ e425a002ed1453f66a4fb1dad3ad2923
+
+
+ 1751825761336
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ==
+
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ d7861c7337345a2010806e89311d85bf
+
+
+ 1751825767651
+
+ DEL_NODE
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+
+ ADD_NODE
+ WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+ 19b85e105d5758f18c55915fbce84663
+
+
+ 1751825770936
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ==
+
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 03b8818572c5800d88c583073a1ef559
+
+
+ 1751825773370
+
+ DEL_EDGE
+ WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0=
+
+ 1dd8b4edaeed282d75d1daeb3195b728
+
+
+ 1751826367735
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ ca298c11df338ea36bce176af0fe3b69
+
+
+ 1751826515156
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ c6ee9fdcb90f48bc1de9bdc44b7da91f
+
+
+ 1751826596605
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ b79566da6d5ea6c2cf2cbb618da677d2
+
+
+ 1751826901740
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ ba871dc0f4bc75adee32e34c87854508
+
+
+ 1751827730897
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 8bb2b4d5cd9d445722b307d6bdb3d9fd
+
+
+ 1751828973865
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 3609737de0e0d000c3d43a620f592090
+
+
+ 1751872486908
+
+ UPDATE_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfY3B1LnB5Iix0cnVlXQ==
+
+ a0691587adb56f1c913b278379ea8cd5
+
+
+
\ No newline at end of file
diff --git a/measurements/CPU/funbody_cpu.py b/measurements/CPU/funbody_cpu.py
new file mode 100644
index 0000000..cdbb0a2
--- /dev/null
+++ b/measurements/CPU/funbody_cpu.py
@@ -0,0 +1,88 @@
+# funbody_throughput_test.py (MODIFIED FOR RESOURCE MONITORING & CORRECTED)
+import time
+import concore
+import os
+import json
+import threading
+import psutil
+import csv
+
+# --- MONITORING FUNCTION (to be run in a separate thread) ---
+def monitor_resources(stop_event, output_list):
+ """Monitors this script's CPU and memory usage."""
+ process = psutil.Process(os.getpid())
+ while not stop_event.is_set():
+ cpu_percent = process.cpu_percent(interval=0.5)
+ memory_mb = process.memory_info().rss / (1024 * 1024)
+ output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb})
+
+print("funbody (Receiver) using ZMQ REP socket for Throughput & Resource Test.")
+
+TEST_DURATION = 10
+message_count = 0
+test_started = False
+resource_records = []
+start_time = 0
+
+# --- Start Monitoring ---
+stop_monitoring = threading.Event()
+monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records))
+monitor_thread.start()
+
+# --- Main Throughput Test Logic (CORRECTED) ---
+concore.init_zmq_port(
+ port_name=PORT_NAME_B_OUT,
+ port_type="bind",
+ address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port
+ socket_type_str="REP"
+)
+
+print(f"Receiver waiting for messages on port {PORT_B_OUT}...")
+while True:
+ # Wait for a message
+ message_str = concore.read(PORT_NAME_B_OUT, "stream", "{}")
+
+ # Send an acknowledgment immediately after receiving
+ concore.write(PORT_NAME_B_OUT, "reply", "{}") # ADDED: Send acknowledgment
+
+ if message_str is None:
+ continue # Or break, depending on desired behavior on timeout
+
+ try:
+ # Since concore.read now handles JSON parsing, this might not be needed
+ # but we keep it for validation of the message structure.
+ message_dict = message_str if isinstance(message_str, dict) else json.loads(message_str)
+ except (json.JSONDecodeError, TypeError):
+ continue
+
+ if isinstance(message_dict, dict) and 'type' in message_dict:
+ if message_dict['type'] == 'control':
+ if message_dict['value'] == 'START' and not test_started:
+ print("START signal received.")
+ test_started = True
+ start_time = time.perf_counter()
+ elif message_dict['value'] == 'STOP' and test_started:
+ print("STOP signal received.")
+ break # Exit the loop to end the test
+ elif message_dict['type'] == 'data' and test_started:
+ message_count += 1
+
+# --- Stop Monitoring and Save Results ---
+stop_monitoring.set()
+monitor_thread.join()
+concore.terminate_zmq()
+
+if message_count > 0:
+ end_time = time.perf_counter()
+ duration = end_time - start_time
+ throughput = message_count / duration if duration > 0 else 0
+ print(f"\n--- TEST COMPLETE ---")
+ print(f"Received {message_count} messages in {duration:.2f} seconds.")
+ print(f"THROUGHPUT RESULT: {throughput:.2f} messages/second")
+
+if resource_records:
+ with open('receiver_usage.csv', 'w', newline='') as f:
+ writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb'])
+ writer.writeheader()
+ writer.writerows(resource_records)
+ print("Receiver resource usage saved to receiver_usage.csv")
\ No newline at end of file
diff --git a/measurements/CPU/funcall_cpu.py b/measurements/CPU/funcall_cpu.py
new file mode 100644
index 0000000..500b486
--- /dev/null
+++ b/measurements/CPU/funcall_cpu.py
@@ -0,0 +1,74 @@
+# funcall_throughput_test.py (MODIFIED FOR RESOURCE MONITORING & CORRECTED)
+import time
+import concore
+import os
+import json
+import threading
+import psutil
+import csv
+
+# --- MONITORING FUNCTION (to be run in a separate thread) ---
+def monitor_resources(stop_event, output_list):
+ """Monitors this script's CPU and memory usage."""
+ process = psutil.Process(os.getpid())
+ while not stop_event.is_set():
+ # Get CPU (as a percentage) and Memory (RSS in MB)
+ cpu_percent = process.cpu_percent(interval=0.5)
+ memory_mb = process.memory_info().rss / (1024 * 1024)
+ output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb})
+
+print("funcall (Sender) using ZMQ REQ socket for Throughput & Resource Test.")
+
+TEST_DURATION = 10
+message_count = 0
+resource_records = []
+
+# --- Start Monitoring ---
+stop_monitoring = threading.Event()
+monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records))
+monitor_thread.start()
+
+# --- Main Throughput Test Logic (CORRECTED) ---
+concore.init_zmq_port(
+ port_name=PORT_NAME_IN_A,
+ port_type="connect",
+ address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local, or the receiver's IP
+ socket_type_str="REQ"
+)
+print(f"Sender starting. Will send data for {TEST_DURATION} seconds.")
+
+# Send START signal and wait for reply
+start_signal = json.dumps({"type": "control", "value": "START"})
+concore.write(PORT_NAME_IN_A, "stream", start_signal)
+concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment
+
+time.sleep(1)
+start_time = time.perf_counter()
+
+# Loop for the test duration
+while (time.perf_counter() - start_time) < TEST_DURATION:
+ data_message = json.dumps({"type": "data", "value": message_count})
+ concore.write(PORT_NAME_IN_A, "stream", data_message)
+ concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment
+ message_count += 1
+
+time.sleep(1)
+
+# Send STOP signal and wait for reply
+stop_signal = json.dumps({"type": "control", "value": "STOP"})
+concore.write(PORT_NAME_IN_A, "stream", stop_signal)
+concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment
+
+print(f"Sender finished. Sent approximately {message_count} messages.")
+
+# --- Stop Monitoring and Save Results ---
+stop_monitoring.set()
+monitor_thread.join()
+concore.terminate_zmq()
+
+if resource_records:
+ with open('sender_usage.csv', 'w', newline='') as f:
+ writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb'])
+ writer.writeheader()
+ writer.writerows(resource_records)
+ print("Sender resource usage saved to sender_usage.csv")
\ No newline at end of file
diff --git a/measurements/CPU/plot_fig5.py b/measurements/CPU/plot_fig5.py
new file mode 100644
index 0000000..2990a9d
--- /dev/null
+++ b/measurements/CPU/plot_fig5.py
@@ -0,0 +1,42 @@
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+# Load all data and calculate averages
+try:
+ avg_cpu_sender_zmq = pd.read_csv('sender_usage.csv')['cpu_percent'].mean()
+ avg_mem_sender_zmq = pd.read_csv('sender_usage.csv')['memory_mb'].mean()
+
+ # In a real test, you would also measure the receiver. For simplicity, we plot sender.
+ # avg_cpu_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['cpu_percent'].mean()
+ # avg_mem_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['memory_mb'].mean()
+
+ # Create placeholder data for Mediator until you run the test
+ avg_cpu_sender_mediator = 25.5 # Example value
+ avg_mem_sender_mediator = 60.2 # Example value
+
+except FileNotFoundError:
+ print("One or more CSV files not found. Using placeholder data.")
+ # Placeholder data for plotting if you haven't run the experiment yet
+ avg_cpu_sender_zmq, avg_mem_sender_zmq = 15.0, 45.0
+ avg_cpu_sender_mediator, avg_mem_sender_mediator = 25.5, 60.2
+
+# Prepare data for plotting
+data = {
+ 'Protocol': ['Mediator', 'ZeroMQ', 'Mediator', 'ZeroMQ'],
+ 'Metric': ['CPU Usage (%)', 'CPU Usage (%)', 'Memory Usage (MB)', 'Memory Usage (MB)'],
+ 'Value': [avg_cpu_sender_mediator, avg_cpu_sender_zmq, avg_mem_sender_mediator, avg_mem_sender_zmq]
+}
+df_plot = pd.DataFrame(data)
+
+# Create the grouped bar chart
+plt.figure(figsize=(10, 7))
+sns.barplot(x='Metric', y='Value', hue='Protocol', data=df_plot, palette={'Mediator': '#F44336', 'ZeroMQ': '#4CAF50'})
+
+plt.title('Figure 5: Resource Utilization During Throughput Test (Sender)', fontsize=16)
+plt.xlabel('Performance Metric', fontsize=12)
+plt.ylabel('Average Usage', fontsize=12)
+plt.legend(title='Protocol')
+plt.grid(axis='y', linestyle='--', alpha=0.7)
+
+plt.show()
diff --git a/measurements/CPU/receiver_usage.csv b/measurements/CPU/receiver_usage.csv
new file mode 100644
index 0000000..d49f1f0
--- /dev/null
+++ b/measurements/CPU/receiver_usage.csv
@@ -0,0 +1,32 @@
+cpu_percent,memory_mb
+0.0,17.375
+0.0,17.375
+0.0,17.375
+2.0,17.375
+0.0,17.375
+0.0,17.375
+4.0,17.375
+0.0,17.375
+0.0,17.5
+34.0,17.625
+38.0,17.625
+40.0,17.625
+38.0,17.625
+36.0,17.625
+40.0,17.625
+40.0,17.625
+38.0,17.625
+40.0,17.625
+40.0,17.625
+40.0,17.625
+40.0,17.625
+42.0,17.625
+40.0,17.625
+40.0,17.625
+42.0,17.625
+38.0,17.625
+40.0,17.625
+42.0,17.625
+37.6,17.625
+0.0,17.625
+0.0,17.625
diff --git a/measurements/CPU/sender_usage.csv b/measurements/CPU/sender_usage.csv
new file mode 100644
index 0000000..ff7fa9f
--- /dev/null
+++ b/measurements/CPU/sender_usage.csv
@@ -0,0 +1,26 @@
+cpu_percent,memory_mb
+0.3,17.15625
+0.0,16.609375
+27.5,17.046875
+23.8,17.078125
+24.3,17.078125
+23.6,17.078125
+23.9,16.75
+23.7,16.734375
+23.9,15.859375
+23.6,15.84375
+22.7,15.78125
+23.3,15.796875
+23.1,15.8125
+23.2,15.8125
+22.0,15.46875
+22.4,15.46875
+23.7,11.578125
+22.8,11.578125
+23.0,11.578125
+22.9,11.5625
+22.6,11.5625
+23.3,11.59375
+0.3,11.578125
+0.0,11.578125
+0.4,10.453125
diff --git a/measurements/CPU/server_cpu.graphml b/measurements/CPU/server_cpu.graphml
new file mode 100644
index 0000000..9359a5d
--- /dev/null
+++ b/measurements/CPU/server_cpu.graphml
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+ A:funcall_cpu.py
+
+
+
+
+
+
+
+
+
+
+ IN:
+
+
+
+
+
+
+
+
+
+ 0x2311_U1
+
+
+
+
+
+
+
+ 1751825545123
+
+ DEL_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+
+ ADD_NODE
+ WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+ 0f6a06a5f49f1d83657221f267bbf65e
+
+
+ 1751825547451
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ c07fdf0b5fbc290aea42a3bd74c45a6b
+
+
+ 1751825549601
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+ 55cb72ce7faf50386f9f71afe1e576fb
+
+
+ 1751825564072
+
+ DEL_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+
+ ADD_NODE
+ WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+ d13798fff2bf40cbacc6bc0f73cc3e5a
+
+
+ 1751825566634
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd
+
+ 1292dab0cd809e0bc822a88cbe296a4f
+
+
+ 1751825570934
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0=
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 71a0470230ca5a52edc2cb9ff06f3d28
+
+
+ 1751825572700
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d
+
+ 86c56976fc63f27dc9485ecc73f2de2d
+
+
+ 1751825576935
+
+ DEL_EDGE
+ WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0=
+
+ e3d7f90d81fe934dfa3c417169de8824
+
+
+ 1751826381936
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ 39ad7e349fa9310a7b969d4ebab5282e
+
+
+ 1751826525320
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 8efbfe0ae1b0204fce1d374693fa71a4
+
+
+ 1751826583001
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 28d360705ea6c4b2c2fe71ddd4ac747b
+
+
+ 1751826587218
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ 4688004b0c03d91e2da0b196f1c26a63
+
+
+ 1751826894632
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ 8cbf36e069285329a3e6c103fadd2d15
+
+
+ 1751827827801
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 474cb438a743ffd7c3e75d28317657f3
+
+
+ 1751828982344
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 4ec6d444cdddc40c1917aba4da2ee7d0
+
+
+ 1751872426393
+
+ UPDATE_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfY3B1LnB5Iix0cnVlXQ==
+
+ 72b043d710aeb2d0db300c844fe93875
+
+
+ 1751873444149
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0=
+
+ 1e572e7163ea8ea7366929b360f9c466
+
+
+ 1751874079320
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0=
+
+ 10c8509625f2ef89d457feb1f2e446c0
+
+
+ 1751880120514
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOV9VMSIsdHJ1ZV0=
+
+ de8502fb8c760c95583f8b1c86af7ba4
+
+
+ 1751880331938
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMF9VMSIsdHJ1ZV0=
+
+ 5e9de785196d432fb24f4e6ef3e3563a
+
+
+ 1751880478763
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMV9VMSIsdHJ1ZV0=
+
+ 169fdabd56823b7ad4dfcb02668b2355
+
+
+
\ No newline at end of file
diff --git a/measurements/Latency/cpymax.py b/measurements/Latency/cpymax.py
new file mode 100644
index 0000000..5c767ea
--- /dev/null
+++ b/measurements/Latency/cpymax.py
@@ -0,0 +1,29 @@
+import concore
+import time
+concore.delay = 0.01
+#Nsim = 100
+init_simtime_u = "[0.0, 0.0, 0.0]"
+init_simtime_ym = "[0.0, 0.0, 0.0]"
+minElasped = 10000000
+maxElasped = 0
+sumElasped = 0
+u = concore.initval(init_simtime_u)
+wallclock1 = time.perf_counter()
+while(concore.simtime
+
+
+
+
+
+
+
+
+
+
+ CZ:cpymax.py
+
+
+
+
+
+
+
+
+
+
+ F1:funcall_distributed.py
+
+
+
+
+
+
+
+
+
+
+ IN:
+
+
+
+
+
+
+
+
+
+ Y
+
+
+
+
+
+
+
+
+
+
+
+ U
+
+
+
+
+
+
+
+
+
+
+
+ 0x2400_U3
+
+
+
+
+
+
+
+ 1664644923582
+
+ DEL_NODE
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ==
+
+
+ ADD_NODE
+ WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd
+
+ a53a7f7273a40c7970938b6de1829249
+
+
+ 1664644939781
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d
+
+ 3d4a875a8a6ea281598aa70364b0ea82
+
+
+ 1664644951652
+
+ DEL_NODE
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ==
+
+
+ ADD_NODE
+ WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd
+
+ 5ed7e3d12fd25656b2ad03e29c307d65
+
+
+ 1664644958838
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0=
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 35c613c8203b65e1f44e066b3d783143
+
+
+ 1664644988539
+
+ DEL_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ==
+
+
+ ADD_NODE
+ WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd
+
+ 33d0b0cc4d3dbe3c42323e33f06993e9
+
+
+ 1664645002278
+
+ DEL_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+
+ ADD_NODE
+ WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+ 8d0d4a735631afe6241c66143fb29db8
+
+
+ 1664645010353
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d
+
+ 8a01a9ca8b3706bc3b1ce4de33669b6d
+
+
+ 1664645015576
+
+ DEL_EDGE
+ WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0=
+
+ 14416fc2e3c48db65e2b5e1012027ee0
+
+
+ 1664645043815
+
+ DEL_EDGE
+ WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d
+
+ 326a920ffd7e662bc64ca95c086fb9de
+
+
+ 1664645057658
+
+ DEL_EDGE
+ WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d
+
+ 4593337e9924ae4b23dc5c5576c31394
+
+
+ 1664645068951
+
+ DEL_EDGE
+ WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d
+
+ 568d8b7a109ffacc4b912095793cb2ca
+
+
+ 1664645081283
+
+ DEL_EDGE
+ WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d
+
+ 0d0aa0179f22f9d73a11f8ccfbcc145e
+
+
+ 1664645089735
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d
+
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d
+
+ 1c19591402c0f2daca7d2b4a8af5e956
+
+
+ 1664645092868
+
+ DEL_EDGE
+ WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0=
+
+ 3c913497d8aa8f1c79bbdc03c3feec16
+
+
+ 1664645142026
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0=
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0=
+
+ ecbd46b28ecaf800c8da0d2ada69b4de
+
+
+ 1664645149601
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ==
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ==
+
+ ea35c112764d7964f8b7e35e9a18efbd
+
+
+ 1664645223291
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d
+
+ d669d3d37a4693ad860a18c69999b31f
+
+
+ 1664645228453
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+ f7eb6af4003cb4eff19f39421fc00174
+
+
+ 1664645231883
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ==
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ==
+
+ 49dd0c2013be6e39c2f11ea967dbcab4
+
+
+ 1664645237206
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ==
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ==
+
+ 009fc03903a9ae6003caea49a6575ddb
+
+
+ 1666487497309
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0=
+
+
+ DEL_EDGE
+ WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ==
+
+ 4957bb66f70bda073e7edafdad81f6b4
+
+
+ 1666487500685
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ==
+
+
+ DEL_EDGE
+ WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ==
+
+ c8d5e89e2630a4a0aa607594e14861d1
+
+
+ 1666810339519
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJVMiIsInNvdXJjZSI6ImFjZWUyZTJjLTFhOTEtNDg1OC1hYzdjLWNhMmNiM2YxZjQ3MCIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotOS40NzQ2NTYxODQ2MTU5NmUtOCwiYmVuZFdlaWdodCI6MC41MDAwMDAwMDAwMDA5Nzc3LCJiZW5kUG9pbnQiOnsieCI6NDkxLjU4ODIyNDQ2NjEyMTEsInkiOjEwMC42MzA4MzY3OTg1ODUxfX0sInNvdXJjZUlEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidGFyZ2V0SUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImU2ZWZhMmIyLWI0NDItNDAwNi05NzQ5LTdlM2IyZDUxMzJmYiJ9XQ==
+
+
+ DEL_EDGE
+ WyJlNmVmYTJiMi1iNDQyLTQwMDYtOTc0OS03ZTNiMmQ1MTMyZmIiXQ==
+
+ ead3ddf695580bca36da4698dfe89256
+
+
+ 1666810339519
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJZMiIsInNvdXJjZSI6IjA0YmZkMWI4LTkzYWYtNDQxZi1iNDZhLTMyMGZkMTA3NDBjOSIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjozMC41NjQzMTU2MDk0NTE4NjQsImJlbmRXZWlnaHQiOjAuNTE0MzI5NzI5MzYyMTU2MywiYmVuZFBvaW50Ijp7IngiOjQyMi43NzE0OTAyODczNTc2NiwieSI6NjQuMDU1NTI3OTI5NTQ0ODd9fSwic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInR5cGUiOiJvcmRpbiIsImlkIjoiOTE3MzNmNmItM2RlMy00MGFmLWJmMTQtMmJiNmNiYzQ5MGUyIn1d
+
+
+ DEL_EDGE
+ WyI5MTczM2Y2Yi0zZGUzLTQwYWYtYmYxNC0yYmI2Y2JjNDkwZTIiXQ==
+
+ a86191957747741919dd1f5e71c2e56c
+
+
+ 1666810339519
+
+ ADD_NODE
+ WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsiaWQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJsYWJlbCI6IkYyOmZ1bmJvZHkucHkiLCJ0eXBlIjoib3JkaW4iLCJzdHlsZSI6eyJ3aWR0aCI6MTIwLCJoZWlnaHQiOjUwLCJvcGFjaXR5IjoxLCJzaGFwZSI6InJlY3RhbmdsZSIsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX19LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+
+ DEL_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+ b3ce34b6dc8f697e5b8fdf374ec42075
+
+
+ 1666810343268
+
+ ADD_NODE
+ WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJpZCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiUFo6cG1weW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd
+
+
+ DEL_NODE
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ==
+
+ ab4fb226f0c49b8ded66436938762af7
+
+
+ 1666810375461
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0=
+
+ f5e56f793b1dfd259251f6b15ecf0e6a
+
+
+ 1748979732766
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0=
+
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd
+
+ 9e9aaedf5e2f34cef7d06d52891d6a76
+
+
+ 1749058687416
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjotMzg4LCJ5IjoxMC43NzM2MjI4MjYyMzMxMDh9XQ==
+
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOjEwMCwieSI6OTQuNzczNjIyODI2MjMzMTF9XQ==
+
+ 7cb1d108692b66ae85dd0ffdcf639baf
+
+
+ 1749058691778
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9XQ==
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ==
+
+ 1ce2563fc9ee71151cb6a722255fd762
+
+
+ 1749058702356
+
+ DEL_NODE
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiXQ==
+
+
+ ADD_NODE
+ WyJJTjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotNjMyLCJ5IjotMTQzfSx7fSwiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIl0=
+
+ 26f5f23f693921ed1b1ee5d52e1e75b6
+
+
+ 1749058707709
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6LTU5OCwieSI6OTl9XQ==
+
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 6ae6b59a08af5a7047a97a5ad388c270
+
+
+ 1749058713842
+
+ DEL_EDGE
+ WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0=
+
+ cc747ad0ecc75c44cc3b6f6f9e9ae92c
+
+
+ 1749058727442
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6LTYxMiwieSI6LTEwMn1d
+
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNTk4LCJ5Ijo5OX1d
+
+ fa49a13771e334eebbf112917f89d058
+
+
+ 1749058754860
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiYzI1ZDZiNjItNWQ2Ni00MDliLTk0YjEtZTZmZmI1ZjBmMTViIiwidGFyZ2V0IjoiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4IjotNTI0Ljg0NzY3NTkxNDkzNTQsInkiOi01OC4xMTMxODg1ODY4ODM0NDZ9fSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0=
+
+
+ DEL_EDGE
+ WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ==
+
+ 7f0f25f333a2a6cfc15a70a1634323f1
+
+
+ 1749058756916
+
+ DEL_EDGE
+ WyJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIifV0=
+
+ fc1f4b789ad989f3e60a17bbe3a5bd5a
+
+
+ 1749058765759
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNjMyLCJ5IjotMTQzfV0=
+
+
+ SET_POS
+ WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYzMiwieSI6LTE0M30seyJ4IjotNjEyLCJ5IjotMTAyfV0=
+
+ 4209fecec5c91f476c4539fa06418efd
+
+
+ 1749058768670
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOi00ODcsInkiOjUwLjc3MzYyMjgyNjIzMzExfV0=
+
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTQ4NywieSI6NTAuNzczNjIyODI2MjMzMTF9LHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fV0=
+
+ 63797cc5d0c6dc2da5ef71e99504bd45
+
+
+ 1749066909379
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9ZMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0=
+
+ 1ad516ce46689ac6f15b5532ff42ab86
+
+
+ 1749070198710
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+ f6a8e5aa88fff9e10e187a6f5d1b6b33
+
+
+ 1749070471512
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0=
+
+ 9b54fffa96ec88de939b11febe6746d0
+
+
+ 1749070605367
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+ ae211e5c6a9ff5b2487f0e107ea136f1
+
+
+ 1749325857360
+
+ UPDATE_EDGE
+ WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0=
+
+ d42101a2e57f7e1fc75f9b867262a6a8
+
+
+ 1751707047236
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE5MywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX2Rpc3RyaWJ1dGVkLnB5Iix0cnVlXQ==
+
+ ad7e56eb4e9610939329b1542aa0e868
+
+
+ 1751708835442
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+ 16b71f5be7fb830dc4cb9ceea3f11ff0
+
+
+ 1751709251435
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+ 8957f77c22449c1f4caabb7ca68ead37
+
+
+ 1751709403095
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0=
+
+ e85d0bc31c27cb6e02aeacdb333eaa29
+
+
+
\ No newline at end of file
diff --git a/measurements/Latency/distributed_server.graphml b/measurements/Latency/distributed_server.graphml
new file mode 100644
index 0000000..852b689
--- /dev/null
+++ b/measurements/Latency/distributed_server.graphml
@@ -0,0 +1,520 @@
+
+
+
+
+
+
+
+
+
+
+
+ PZ:pmpymax.py
+
+
+
+
+
+
+
+
+
+
+ F2:funbody_distributed.py
+
+
+
+
+
+
+
+
+
+
+ OUT:
+
+
+
+
+
+
+
+
+
+ Y2
+
+
+
+
+
+
+
+
+
+
+
+ U2
+
+
+
+
+
+
+
+
+
+
+
+ 0x2405_U3
+
+
+
+
+
+
+
+ 1664644923582
+
+ DEL_NODE
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ==
+
+
+ ADD_NODE
+ WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd
+
+ a53a7f7273a40c7970938b6de1829249
+
+
+ 1664644939781
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d
+
+ 3d4a875a8a6ea281598aa70364b0ea82
+
+
+ 1664644951652
+
+ DEL_NODE
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ==
+
+
+ ADD_NODE
+ WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd
+
+ 5ed7e3d12fd25656b2ad03e29c307d65
+
+
+ 1664644958838
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0=
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 35c613c8203b65e1f44e066b3d783143
+
+
+ 1664644988539
+
+ DEL_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ==
+
+
+ ADD_NODE
+ WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd
+
+ 33d0b0cc4d3dbe3c42323e33f06993e9
+
+
+ 1664645002278
+
+ DEL_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+
+ ADD_NODE
+ WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ==
+
+ 8d0d4a735631afe6241c66143fb29db8
+
+
+ 1664645010353
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d
+
+ 8a01a9ca8b3706bc3b1ce4de33669b6d
+
+
+ 1664645015576
+
+ DEL_EDGE
+ WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0=
+
+ 14416fc2e3c48db65e2b5e1012027ee0
+
+
+ 1664645043815
+
+ DEL_EDGE
+ WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d
+
+ 326a920ffd7e662bc64ca95c086fb9de
+
+
+ 1664645057658
+
+ DEL_EDGE
+ WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d
+
+ 4593337e9924ae4b23dc5c5576c31394
+
+
+ 1664645068951
+
+ DEL_EDGE
+ WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d
+
+ 568d8b7a109ffacc4b912095793cb2ca
+
+
+ 1664645081283
+
+ DEL_EDGE
+ WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d
+
+ 0d0aa0179f22f9d73a11f8ccfbcc145e
+
+
+ 1664645089735
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d
+
+
+ SET_POS
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d
+
+ 1c19591402c0f2daca7d2b4a8af5e956
+
+
+ 1664645092868
+
+ DEL_EDGE
+ WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0=
+
+ 3c913497d8aa8f1c79bbdc03c3feec16
+
+
+ 1664645142026
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0=
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0=
+
+ ecbd46b28ecaf800c8da0d2ada69b4de
+
+
+ 1664645149601
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ==
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ==
+
+ ea35c112764d7964f8b7e35e9a18efbd
+
+
+ 1664645223291
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d
+
+ d669d3d37a4693ad860a18c69999b31f
+
+
+ 1664645228453
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+
+ SET_POS
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d
+
+ f7eb6af4003cb4eff19f39421fc00174
+
+
+ 1664645231883
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ==
+
+
+ SET_POS
+ WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ==
+
+ 49dd0c2013be6e39c2f11ea967dbcab4
+
+
+ 1664645237206
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ==
+
+
+ SET_POS
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ==
+
+ 009fc03903a9ae6003caea49a6575ddb
+
+
+ 1666487497309
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0=
+
+
+ DEL_EDGE
+ WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ==
+
+ 4957bb66f70bda073e7edafdad81f6b4
+
+
+ 1666487500685
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ==
+
+
+ DEL_EDGE
+ WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ==
+
+ c8d5e89e2630a4a0aa607594e14861d1
+
+
+ 1666810445211
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJZIiwic291cmNlIjoiNTIzNjQxYTQtOTc1NS00NWVkLTlhMjUtYTExNDc2ZGUzN2EwIiwidGFyZ2V0IjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjI5LjE1NTExMDY3Mjg3NDI5NCwiYmVuZFdlaWdodCI6MC41MTMxNjc2Njk2NTEzNTEyLCJiZW5kUG9pbnQiOnsieCI6LTUwLjM1NTE2Njc0NzA3LCJ5Ijo1OC4xODI0NTg4NjkxNTA4NH19LCJzb3VyY2VJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInRhcmdldElEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidHlwZSI6Im9yZGluIiwiaWQiOiI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAifV0=
+
+
+ DEL_EDGE
+ WyI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAiXQ==
+
+ cfc129abe20d32f8c156301489dcc705
+
+
+ 1666810445211
+
+ ADD_EDGE
+ W3sibGFiZWwiOiJVIiwic291cmNlIjoiZDA0MDg0OGYtNmE5NC00YWMyLWE0ZTItYTg4NzliNWY3ZmZiIiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjAuMDAwMDE0ODc2MzcxMTExNjM4NDIsImJlbmRXZWlnaHQiOjAuNTAwMDAwMDAxMjIyMTMzNiwiYmVuZFBvaW50Ijp7IngiOjExLjYxMTg5ODIyNTI4ODk2OCwieSI6OTMuNDg5ODc5MjQ2Nzg1Mzl9fSwic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInR5cGUiOiJvcmRpbiIsImlkIjoiZTAxY2FiN2MtYzQ0Ni00OGRhLWI4OGUtN2Y5NjIwY2NkMjY5In1d
+
+
+ DEL_EDGE
+ WyJlMDFjYWI3Yy1jNDQ2LTQ4ZGEtYjg4ZS03Zjk2MjBjY2QyNjkiXQ==
+
+ 9fbba2442b7019a76634710caf98a549
+
+
+ 1666810445211
+
+ ADD_NODE
+ WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJpZCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiRjE6ZnVuY2FsbC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd
+
+
+ DEL_NODE
+ WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ==
+
+ de44f1ff4f2107a20e234361711eec91
+
+
+ 1666810453165
+
+ ADD_NODE
+ WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0seyJpZCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiQ1o6Y3B5bWF4LnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIl0=
+
+
+ DEL_NODE
+ WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ==
+
+ f1cb4196a5082cef004f9ee186c7f04b
+
+
+ 1666810462415
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5LnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0=
+
+ 9e9b34686b3aec97cf26547fcd7ae633
+
+
+ 1748979705408
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0=
+
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd
+
+ 299aef4ea2931f8b9a6b7f10361b0022
+
+
+ 1749058646821
+
+ DEL_NODE
+ WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ==
+
+
+ ADD_NODE
+ WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTQzLCJ5IjoyNzF9LHt9LCI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ==
+
+ 51cf4c5701b1a8a637c1b373dcd09c59
+
+
+ 1749058651133
+
+ SET_POS
+ WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTQzLCJ5IjoyNzF9XQ==
+
+
+ SET_POS
+ WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTQzLCJ5IjoyNzF9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 440d3083c9a571e9660685eaeefae6fb
+
+
+ 1749058659847
+
+ DEL_EDGE
+ WyJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6IjUyZTk3NDkyLWNjZWEtNDhhMi05ZGVkLWUyMzVlMjQ1MDM1OCIsImxhYmVsIjoiMHgyNDAwX1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAifV0=
+
+ 615e0be29af2a4940efea41e374438bb
+
+
+ 1749070207801
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+ a8472011e18e50a782b19383b3b1a41d
+
+
+ 1749070480095
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0=
+
+ 4a9c6467598df6924c76f002eccbb822
+
+
+ 1749070617114
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+ 2b2ace96e5b5dad90e06fbac4e20b915
+
+
+ 1749322194657
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd
+
+ dfbb291ab07456ce0005d5c6d1d6a18a
+
+
+ 1749325840799
+
+ UPDATE_EDGE
+ WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0=
+
+ 385fc34934650be854756424f6fac52e
+
+
+ 1749406730989
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjIxMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X2Rpc3RyaWJ1dGVkLnB5Iix0cnVlXQ==
+
+ 3eae38f7266c77d8368676cbdc9b3ba5
+
+
+
\ No newline at end of file
diff --git a/measurements/Latency/figure3_latency_comparison.png b/measurements/Latency/figure3_latency_comparison.png
new file mode 100644
index 0000000..6aa3ca8
Binary files /dev/null and b/measurements/Latency/figure3_latency_comparison.png differ
diff --git a/measurements/Latency/funbody_distributed.py b/measurements/Latency/funbody_distributed.py
new file mode 100644
index 0000000..eaae295
--- /dev/null
+++ b/measurements/Latency/funbody_distributed.py
@@ -0,0 +1,67 @@
+# funbody2_zmq.py
+import time
+import concore
+import concore2
+
+print("funbody using ZMQ via concore")
+
+# Initialize ZMQ REP port using concore
+concore.init_zmq_port(
+ port_name=PORT_NAME_F2_OUT,
+ port_type="bind",
+ address= "tcp://0.0.0.0:" + PORT_F2_OUT,
+ socket_type_str="REP"
+)
+
+
+# Standard concore initializations
+concore.delay = 0.07
+concore2.delay = 0.07
+concore2.inpath = concore.inpath
+concore2.outpath = concore.outpath
+concore2.simtime = 0
+concore.default_maxtime(100)
+init_simtime_u_str = "[0.0, 0.0, 0.0]"
+init_simtime_ym_str = "[0.0, 0.0, 0.0]"
+
+u_data_values = concore.initval(init_simtime_u_str)
+ym_data_values = concore2.initval(init_simtime_ym_str)
+
+print(f"Initial u_data_values: {u_data_values}, ym_data_values: {ym_data_values}")
+print(f"Max time: {concore.maxtime}")
+
+while concore2.simtime < concore.maxtime:
+ received_u_data = concore.read(PORT_NAME_F2_OUT, "u_signal", init_simtime_u_str)
+
+ if not (isinstance(received_u_data, list) and len(received_u_data) > 0):
+ print(f"Error or invalid data received via ZMQ: {received_u_data}. Skipping iteration.")
+ time.sleep(concore.delay)
+ continue
+
+ received_time = received_u_data[0]
+ if isinstance(received_time, (int, float)):
+ concore.simtime = received_time
+ u_data_values = received_u_data[1:]
+ else:
+ print(f"Warning: Received ZMQ data's first element is not time: {received_u_data}. Using data part as is.")
+ u_data_values = received_u_data[1:] if len(received_u_data) > 1 else []
+
+ # Assuming concore.oport['U2'] is a file port (e.g., to pmpymax.py)
+ if 'U2' in concore.oport:
+ concore.write(concore.oport['U2'], "u", u_data_values)
+
+ old_concore2_simtime = concore2.simtime
+ while concore2.unchanged() or concore2.simtime <= old_concore2_simtime:
+ # Assuming concore.iport['Y2'] is a file port (e.g., from pmpymax.py)
+ ym_data_values = concore2.read(concore.iport['Y2'], "ym", init_simtime_ym_str)
+ # time.sleep(concore2.delay) # Optional delay
+
+ ym_full_to_send = [concore2.simtime] + ym_data_values
+
+ concore.write(PORT_NAME_F2_OUT, "ym_signal", ym_full_to_send)
+
+ print(f"funbody u={u_data_values} ym={ym_data_values} time={concore2.simtime}")
+
+print("funbody retry=" + str(concore.retrycount))
+
+concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/Latency/funcall_distributed.py b/measurements/Latency/funcall_distributed.py
new file mode 100644
index 0000000..779324f
--- /dev/null
+++ b/measurements/Latency/funcall_distributed.py
@@ -0,0 +1,83 @@
+# funcall_distributed.py (MODIFIED FOR LATENCY MEASUREMENT)
+import time
+import concore
+import concore2
+import csv # <--- ADDED: Import CSV library
+
+print("funcall using ZMQ via concore")
+
+# This assumes PORT_NAME_IN_F1, PORT_IN_F1 are defined elsewhere before this script runs
+concore.init_zmq_port(
+ port_name=PORT_NAME_IN_F1,
+ port_type="connect",
+ address="tcp://192.168.0.109:" + PORT_IN_F1, # The IP address of the machine running funbody
+ socket_type_str="REQ"
+)
+
+# Standard concore initializations
+concore.delay = 0.07
+concore2.delay = 0.07
+concore2.inpath = concore.inpath
+concore2.outpath = concore.outpath
+concore2.simtime = 0
+concore.default_maxtime(100) # Recommend increasing this for more data points, e.g., 1000
+init_simtime_u_str = "[0.0, 0.0, 0.0]"
+init_simtime_ym_str = "[0.0, 0.0, 0.0]"
+
+u = concore.initval(init_simtime_u_str)
+ym = concore2.initval(init_simtime_ym_str)
+
+# --- ADDED: Initialize a list to store latency values ---
+zeromq_latencies = []
+
+print(f"Initial u: {u}, ym: {ym}, concore.simtime: {concore.simtime}, concore2.simtime: {concore2.simtime}")
+print(f"Max time: {concore.maxtime}")
+
+while concore2.simtime < concore.maxtime:
+ while concore.unchanged():
+ u = concore.read(concore.iport['U'], "u", init_simtime_u_str)
+
+ data_to_send_u = [concore.simtime] + u
+
+ # --- MODIFIED: Add timing logic around the ZMQ communication ---
+ start_time = time.perf_counter()
+
+ concore.write(PORT_NAME_IN_F1, "u_signal", data_to_send_u)
+ received_ym_data = concore.read(PORT_NAME_IN_F1, "ym_signal", init_simtime_ym_str)
+
+ end_time = time.perf_counter()
+ latency_ms = (end_time - start_time) * 1000
+ zeromq_latencies.append(latency_ms)
+ # --- END OF MODIFICATION ---
+
+ if isinstance(received_ym_data, list) and len(received_ym_data) > 0:
+ response_time = received_ym_data[0]
+ if isinstance(response_time, (int, float)):
+ concore2.simtime = response_time
+ ym = received_ym_data[1:]
+ else:
+ print(f"Warning: Received ZMQ data's first element is not time: {received_ym_data}. Using as is.")
+ ym = received_ym_data
+ else:
+ print(f"Warning: Received unexpected ZMQ data format: {received_ym_data}. Using default ym.")
+ ym = concore2.initval(init_simtime_ym_str)
+
+ concore2.write(concore.oport['Y'], "ym", ym)
+
+ print(f"funcall ZMQ u={u} ym={ym} time={concore2.simtime} | ZMQ Latency: {latency_ms:.4f} ms")
+
+print("funcall retry=" + str(concore.retrycount))
+
+# --- ADDED: Save the collected latencies to a CSV file ---
+# Discard the first few values as a "warm-up"
+warmup_period = 5
+if len(zeromq_latencies) > warmup_period:
+ with open('zeromq_latencies.csv', 'w', newline='') as f:
+ writer = csv.writer(f)
+ writer.writerow(['Latency (ms)'])
+ for latency in zeromq_latencies[warmup_period:]:
+ writer.writerow([latency])
+ print("Latency data saved to zeromq_latencies.csv")
+# --- END OF ADDITION ---
+
+concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/Latency/mediator_latencies.csv b/measurements/Latency/mediator_latencies.csv
new file mode 100644
index 0000000..618fbf0
--- /dev/null
+++ b/measurements/Latency/mediator_latencies.csv
@@ -0,0 +1,101 @@
+Latency (ms)
+5245.0712
+4292.6035
+5471.5328
+6784.5448
+4148.7699
+4148.7946
+6868.8192
+5651.1521
+3795.7884
+5313.8401
+3804.8735
+3801.4054
+4862.9434
+1630.0796
+1912.6233
+3656.5687
+2980.7533
+4971.3710
+3137.9639
+2381.5444
+6698.4732
+4161.3355
+4601.2923
+2362.8777
+3683.4259
+4666.3839
+2773.5096
+5063.5470
+3599.0420
+4062.4594
+3597.4401
+7278.4173
+4479.7542
+2913.4336
+5733.8174
+2668.7345
+4813.2954
+1560.4948
+2507.7209
+4795.2919
+5607.6999
+4757.0524
+4326.5276
+4048.3445
+2282.2170
+3420.2337
+3809.0418
+6085.6833
+5015.4274
+1855.4398
+4986.1260
+3922.3766
+3484.6170
+5417.5144
+6046.4993
+5896.9202
+3241.1737
+4036.1814
+4996.8951
+5963.3177
+3781.2386
+4221.5115
+2840.4975
+2705.6901
+5718.7887
+6534.3600
+4391.9848
+6005.2993
+5042.4540
+3532.3204
+5042.0934
+6807.0548
+4446.2609
+6846.9655
+1708.7055
+5732.8538
+4630.5706
+4051.4890
+4637.6412
+1518.6466
+4170.4922
+5035.6689
+6716.8411
+3722.5947
+3287.2596
+3747.3644
+5873.1032
+4993.1267
+3705.3597
+5269.9011
+4645.6163
+5952.9675
+3446.9204
+4008.5068
+3911.8378
+2304.7276
+4944.1804
+4891.5829
+4507.6702
+4148.1193
\ No newline at end of file
diff --git a/measurements/Latency/plot_fig3(1).py b/measurements/Latency/plot_fig3(1).py
new file mode 100644
index 0000000..6f441d1
--- /dev/null
+++ b/measurements/Latency/plot_fig3(1).py
@@ -0,0 +1,53 @@
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+def generate_comparison_plot():
+ """
+ Loads latency data for ZeroMQ and Mediator protocols,
+ and generates a comparative violin plot.
+ """
+ try:
+ # Load the ZeroMQ latency data
+ df_zmq = pd.read_csv('zeromq_latencies.csv')
+ df_zmq['Protocol'] = 'ZeroMQ'
+
+ # Load the Mediator latency data
+ df_mediator = pd.read_csv('mediator_latencies.csv')
+ df_mediator['Protocol'] = 'Mediator'
+
+ except FileNotFoundError as e:
+ print(f"Error: Could not find a required CSV file. Make sure both 'zeromq_latencies.csv' and 'mediator_latencies.csv' are in the same directory.")
+ print(f"Details: {e}")
+ return
+
+ # Combine both dataframes into a single one for plotting
+ df_combined = pd.concat([df_zmq, df_mediator], ignore_index=True)
+
+ # Create the violin plot
+ print("Generating plot...")
+ plt.figure(figsize=(10, 8))
+ sns.violinplot(
+ x='Protocol',
+ y='Latency (ms)',
+ data=df_combined,
+ palette={'ZeroMQ': '#4CAF50', 'Mediator': '#F44336'}
+ )
+
+ # Add plot details for the research paper
+ plt.title('Figure 3: Latency Distribution of Distributed Protocols', fontsize=16, pad=20)
+ plt.xlabel('Communication Protocol', fontsize=12)
+ plt.ylabel('Round-Trip Latency (ms)', fontsize=12)
+ plt.xticks(fontsize=12)
+ plt.yticks(fontsize=12)
+ plt.grid(True, which='major', linestyle='--', linewidth='0.5', color='grey')
+
+ # Save the figure for your paper
+ plt.savefig('figure3_latency_comparison.png', dpi=300)
+ print("Plot saved as 'figure3_latency_comparison.png'")
+
+ # Display the plot
+ plt.show()
+
+if __name__ == '__main__':
+ generate_comparison_plot()
\ No newline at end of file
diff --git a/measurements/Latency/plot_fig3(2).py b/measurements/Latency/plot_fig3(2).py
new file mode 100644
index 0000000..70240a6
--- /dev/null
+++ b/measurements/Latency/plot_fig3(2).py
@@ -0,0 +1,38 @@
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+# Load the collected data
+try:
+ df_zmq = pd.read_csv('zeromq_latencies.csv')
+ df_zmq['Protocol'] = 'ZeroMQ' # Add a column to identify the protocol
+except FileNotFoundError:
+ print("Error: zeromq_latencies.csv not found. Please run the experiment first.")
+ exit()
+
+# It's good practice to filter out extreme outliers if they exist,
+# for example, values over a certain threshold that might be due to a one-off system lag.
+# For now, we will plot all the data.
+
+# Create the plot
+plt.figure(figsize=(8, 7))
+sns.violinplot(x='Protocol', y='Latency (ms)', data=df_zmq, palette=['#4CAF50'])
+
+# Add details to the plot
+plt.title('Latency Distribution of ZeroMQ Protocol', fontsize=16)
+plt.xlabel('')
+plt.ylabel('Round-Trip Latency (ms)', fontsize=12)
+plt.grid(True, linestyle='--', alpha=0.6)
+plt.xticks(fontsize=12)
+
+# Calculate and print statistics to include in your paper
+median_val = df_zmq['Latency (ms)'].median()
+mean_val = df_zmq['Latency (ms)'].mean()
+std_val = df_zmq['Latency (ms)'].std()
+
+print(f"ZeroMQ Latency Stats:")
+print(f" - Median: {median_val:.4f} ms")
+print(f" - Mean: {mean_val:.4f} ms")
+print(f" - Std Dev: {std_val:.4f} ms")
+
+plt.show()
\ No newline at end of file
diff --git a/measurements/Latency/pmpymax.py b/measurements/Latency/pmpymax.py
new file mode 100644
index 0000000..9454f30
--- /dev/null
+++ b/measurements/Latency/pmpymax.py
@@ -0,0 +1,15 @@
+import concore
+
+concore.delay = 0.01
+#Nsim = 100
+init_simtime_u = "[0.0, 0.0, 0.0]"
+init_simtime_ym = "[0.0, 0.0, 0.0]"
+
+ym = concore.initval(init_simtime_ym)
+while(concore.simtime
+
+
+
+
+
+
+
+
+
+
+ B:funbody_throughput_test.py
+
+
+
+
+
+
+
+
+
+
+ OUT:
+
+
+
+
+
+
+
+
+
+ 0x2308_U1
+
+
+
+
+
+
+
+ 1751825758771
+
+ DEL_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+
+ ADD_NODE
+ WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+ e425a002ed1453f66a4fb1dad3ad2923
+
+
+ 1751825761336
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ==
+
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ d7861c7337345a2010806e89311d85bf
+
+
+ 1751825767651
+
+ DEL_NODE
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+
+ ADD_NODE
+ WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+ 19b85e105d5758f18c55915fbce84663
+
+
+ 1751825770936
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ==
+
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 03b8818572c5800d88c583073a1ef559
+
+
+ 1751825773370
+
+ DEL_EDGE
+ WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0=
+
+ 1dd8b4edaeed282d75d1daeb3195b728
+
+
+ 1751826367735
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ ca298c11df338ea36bce176af0fe3b69
+
+
+ 1751826515156
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ c6ee9fdcb90f48bc1de9bdc44b7da91f
+
+
+ 1751826596605
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ b79566da6d5ea6c2cf2cbb618da677d2
+
+
+ 1751826901740
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ ba871dc0f4bc75adee32e34c87854508
+
+
+ 1751827730897
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 8bb2b4d5cd9d445722b307d6bdb3d9fd
+
+
+ 1751828973865
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 3609737de0e0d000c3d43a620f592090
+
+
+ 1751879990560
+
+ UPDATE_EDGE
+ WyIwY2QxNGIzOS1hYjBiLTQxODktOTcxMi0wMGYzMGQ3Y2VmZTgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyIwY2QxNGIzOS1hYjBiLTQxODktOTcxMi0wMGYzMGQ3Y2VmZTgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0=
+
+ 0fb79b2f266bed8408c82460441b7871
+
+
+
\ No newline at end of file
diff --git a/measurements/Throughput/funbody_throughput_test.py b/measurements/Throughput/funbody_throughput_test.py
new file mode 100644
index 0000000..d517488
--- /dev/null
+++ b/measurements/Throughput/funbody_throughput_test.py
@@ -0,0 +1,40 @@
+# funbody_throughput.py
+import time
+import concore
+
+print("Starting ZMQ throughput server (funbody)")
+
+# --- ZMQ Configuration ---
+# Ensure these environment variables are set before running
+# Example: PORT_NAME_F2_OUT="F1_out" PORT_F2_OUT="5555" python funbody_throughput.py
+
+# Initialize the ZMQ server port
+concore.init_zmq_port(
+ port_name=PORT_NAME_B_OUT,
+ port_type="bind",
+ address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port
+ socket_type_str="REP"
+)
+
+# --- Server Loop ---
+print(f"Funbody server listening on port {PORT_B_OUT}. Press Ctrl+C to stop.")
+
+try:
+ while True:
+ # Wait to receive any message from a client
+ received_message = concore.read(PORT_NAME_B_OUT, "throughput_test", "{}")
+
+ if received_message:
+ # As soon as a message is received, send a reply back
+ reply_message = {"status": "ok"}
+ concore.write(PORT_NAME_B_OUT, "throughput_reply", reply_message)
+ else:
+ # The read timed out; just continue waiting for the next message
+ continue
+
+except KeyboardInterrupt:
+ print("\nServer shutting down.")
+
+finally:
+ # Clean up the ZMQ connection
+ concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/Throughput/funcall_throughput_test.py b/measurements/Throughput/funcall_throughput_test.py
new file mode 100644
index 0000000..6c58aac
--- /dev/null
+++ b/measurements/Throughput/funcall_throughput_test.py
@@ -0,0 +1,57 @@
+# funcall_throughput.py
+import time
+import concore
+
+print("Starting ZMQ throughput test (funcall)")
+
+# --- ZMQ Configuration ---
+# Ensure these environment variables are set before running
+# Example: PORT_NAME_IN_F1="F1_out" PORT_IN_F1="5555" python funcall_throughput.py
+
+# Initialize the ZMQ connection to the funbody server
+concore.init_zmq_port(
+ port_name=PORT_NAME_IN_A,
+ port_type="connect",
+ address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing
+ socket_type_str="REQ"
+)
+
+# --- Test Parameters ---
+TEST_DURATION_SECONDS = 10
+message_to_send = {"ping": "hello"}
+message_count = 0
+
+print(f"Running test for {TEST_DURATION_SECONDS} seconds...")
+
+start_time = time.perf_counter()
+end_time = start_time + TEST_DURATION_SECONDS
+
+# --- Main Test Loop ---
+while time.perf_counter() < end_time:
+ # Send a message to the funbody server
+ concore.write(PORT_NAME_IN_A, "throughput_test", message_to_send)
+
+ # Wait for the reply
+ reply = concore.read(PORT_NAME_IN_A, "throughput_reply", "{}")
+
+ # If we get a valid reply, increment our counter
+ if reply:
+ message_count += 1
+ else:
+ print("Warning: Missed a reply from the server.")
+ # In a real-world scenario, you might want to break or handle this
+ break
+
+# --- Calculate and Print Results ---
+actual_duration = time.perf_counter() - start_time
+throughput = message_count / actual_duration
+
+print("\n--- Throughput Test Complete ---")
+print(f"Total messages exchanged: {message_count}")
+print(f"Total time: {actual_duration:.2f} seconds")
+print(f"Throughput: {throughput:.2f} messages/sec")
+print("---------------------------------")
+
+
+# Clean up the ZMQ connection
+concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/Throughput/plot_fig4.py b/measurements/Throughput/plot_fig4.py
new file mode 100644
index 0000000..2076d57
--- /dev/null
+++ b/measurements/Throughput/plot_fig4.py
@@ -0,0 +1,34 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+# --- Enter your collected data here ---
+# Example values, replace with your actual measurements
+throughput_mediator = 15.7 # messages/sec
+throughput_zmq = 25432.1 # messages/sec
+# -----------------------------------------
+
+protocols = ['Mediator', 'ZeroMQ']
+values = [throughput_mediator, throughput_zmq]
+colors = ['#F44336', '#4CAF50']
+
+plt.figure(figsize=(8, 6))
+bars = plt.bar(protocols, values, color=colors)
+
+# Add plot details
+plt.ylabel('Throughput (Messages/Second)', fontsize=12)
+plt.title('Figure 4: Maximum Throughput Comparison', fontsize=16, pad=20)
+plt.xticks(fontsize=12)
+# Use a logarithmic scale if the difference is very large
+plt.yscale('log')
+plt.grid(axis='y', linestyle='--', alpha=0.7)
+
+# Add text labels on top of the bars
+for bar in bars:
+ yval = bar.get_height()
+ plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:,.0f}', va='bottom', ha='center', fontsize=11)
+
+# Save the figure for your paper
+plt.savefig('figure4_throughput_comparison.png', dpi=300)
+print("Plot saved as 'figure4_throughput_comparison.png'")
+
+plt.show()
\ No newline at end of file
diff --git a/measurements/Throughput/server.graphml b/measurements/Throughput/server.graphml
new file mode 100644
index 0000000..81b5102
--- /dev/null
+++ b/measurements/Throughput/server.graphml
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+ A:funcall_throughput_test.py
+
+
+
+
+
+
+
+
+
+
+ IN:
+
+
+
+
+
+
+
+
+
+ 0x2306_U1
+
+
+
+
+
+
+
+ 1751825545123
+
+ DEL_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+
+ ADD_NODE
+ WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+ 0f6a06a5f49f1d83657221f267bbf65e
+
+
+ 1751825547451
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ c07fdf0b5fbc290aea42a3bd74c45a6b
+
+
+ 1751825549601
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+ 55cb72ce7faf50386f9f71afe1e576fb
+
+
+ 1751825564072
+
+ DEL_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+
+ ADD_NODE
+ WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+ d13798fff2bf40cbacc6bc0f73cc3e5a
+
+
+ 1751825566634
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd
+
+ 1292dab0cd809e0bc822a88cbe296a4f
+
+
+ 1751825570934
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0=
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 71a0470230ca5a52edc2cb9ff06f3d28
+
+
+ 1751825572700
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d
+
+ 86c56976fc63f27dc9485ecc73f2de2d
+
+
+ 1751825576935
+
+ DEL_EDGE
+ WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0=
+
+ e3d7f90d81fe934dfa3c417169de8824
+
+
+ 1751826381936
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ 39ad7e349fa9310a7b969d4ebab5282e
+
+
+ 1751826525320
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 8efbfe0ae1b0204fce1d374693fa71a4
+
+
+ 1751826583001
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 28d360705ea6c4b2c2fe71ddd4ac747b
+
+
+ 1751826587218
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ 4688004b0c03d91e2da0b196f1c26a63
+
+
+ 1751826894632
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ 8cbf36e069285329a3e6c103fadd2d15
+
+
+ 1751827827801
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 474cb438a743ffd7c3e75d28317657f3
+
+
+ 1751828982344
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 4ec6d444cdddc40c1917aba4da2ee7d0
+
+
+
\ No newline at end of file
diff --git a/measurements/readme.md b/measurements/readme.md
new file mode 100644
index 0000000..6ef9f52
--- /dev/null
+++ b/measurements/readme.md
@@ -0,0 +1,59 @@
+Performance Measurement Guide: File-Based vs. ZeroMQThis guide provides a step-by-step methodology for quantifying and comparing the performance of a multi-node system using two different inter-process communication (IPC) methods:File-Based: Nodes communicate by writing and reading files in shared directories.ZeroMQ-Based: Nodes communicate over high-performance, in-memory messaging sockets.By following these steps, you can generate concrete data on latency, throughput, and resource utilization to demonstrate the impact of migrating from a file-based to a ZMQ-based architecture.PrerequisitesTwo Project Versions: You must have two separate versions of your concore project generator: one that uses the original file-based communication, and one that uses the new ZMQ-based system we developed.Python Libraries: Ensure you have the necessary Python libraries installed. psutil is required for programmatically measuring CPU usage.pip install pyzmq psutil
+macOS Command Line Tools: You should be comfortable with basic Terminal commands. The iostat and top commands are used for monitoring.Step 1: Test Environment SetupFirst, create a clean directory structure for your tests.# 1. Create a main directory for the performance tests
+mkdir concore_performance_tests
+cd concore_performance_tests
+
+# 2. Create a directory to hold the source scripts for the nodes
+mkdir source_scripts
+
+# 3. Create a directory for the file-based system output
+mkdir file_based_project
+
+# 4. Create a directory for the ZMQ-based system output
+mkdir zmq_project
+Next, create the following two files inside the concore_performance_tests directory.a) graph.graphmlThis simple 4-node pipeline graph will be used for all tests.
+
+
+
+
+
+ A:producer.py
+
+
+ B:processor.py
+
+
+ C:processor.py
+
+
+ D:consumer.py
+
+
+ A_to_B
+
+
+ B_to_C
+
+
+ C_to_D
+
+
+
+b) test_data.dat (Large data file for throughput testing)Run this command in your terminal to create a 100MB file.mkfile 100m test_data.dat
+Finally, place the sample node scripts (provided in the other documents) into the source_scripts directory.Step 2: Running the Baseline (File-Based) TestsFirst, generate the file-based project using your original mkconcore.py.# Navigate to the project directory
+cd file_based_project
+
+# Run mkconcore.py to generate the project
+python3 /path/to/your/original/mkconcore.py ../graph.graphml ../source_scripts . posix
+Now, run the following tests from within the file_based_project directory.Test 1: Latency / End-to-End TimeThis test measures the time to process 1,000 small messages through the pipeline.Set the test mode in source_scripts/producer.py to 'latency'.Run the test using the time command:./build
+time ./run
+Record the real time from the output. This is your End-to-End Time.Example: real 0m48.521sCalculate Average Latency: End-to-End Time / 1000 messages.Test 2: ThroughputThis test measures the speed of transferring the 100MB file.Set the test mode in source_scripts/producer.py to 'throughput'.Run the test:./build
+time ./run
+Record the real time.Calculate Throughput: 100 MB / (time in seconds).Test 3: CPU & Disk I/OThis test monitors system resources during the throughput test. You will need two terminal windows.In Terminal 2, start the disk monitor:iostat -d 1
+In Terminal 1, run the throughput test (time ./run).In Terminal 2, watch the MB/s column for your disk (e.g., disk0). Note the peak value.Stop iostat (Ctrl+C). Now start the CPU monitor:top -o cpu
+In Terminal 1, run the throughput test again.In Terminal 2, watch the %CPU column for your python processes and note the approximate average value.Step 3: Running the ZeroMQ TestsNow, generate the ZMQ-based project using your new, modified mkconcore.py.# Navigate to the project directory
+cd ../zmq_project # Go back up and into the zmq directory
+
+# Run the new mkconcore.py
+python3 /path/to/your/new/mkconcore.py ../graph.graphml ../source_scripts . posix
+Repeat the exact same three tests as in Step 2 from within the zmq_project directory. Use the ZMQ versions of the sample scripts.Step 4: Analyze the ResultsFill in a table like the one below with your collected data. This will give you a clear, quantitative comparison of the two systems.MetricFile-Based SystemZeroMQ SystemImprovement FactorAvg. LatencyYour value (ms)Your value (ms)CalculateData ThroughputYour value (MB/s)Your value (MB/s)CalculateEnd-to-End TimeYour value (s)Your value (s)CalculateAvg. CPU UsageYour value (%)Your value (%)CalculateDisk WritesYour value (MB)Your value (MB)CalculateThis structured approach will provide undeniable evidence of the performance gains from your architectural improvements.
\ No newline at end of file
diff --git "a/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png" "b/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png"
new file mode 100644
index 0000000..f156b6b
Binary files /dev/null and "b/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png" differ
diff --git a/measurements/throughput_test/client.graphml b/measurements/throughput_test/client.graphml
new file mode 100644
index 0000000..e731ea1
--- /dev/null
+++ b/measurements/throughput_test/client.graphml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+ B:funbody_throughput_test.py
+
+
+
+
+
+
+
+
+
+
+ OUT:
+
+
+
+
+
+
+
+
+
+ 0x2306_U1
+
+
+
+
+
+
+
+ 1751825758771
+
+ DEL_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+
+ ADD_NODE
+ WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+ e425a002ed1453f66a4fb1dad3ad2923
+
+
+ 1751825761336
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ==
+
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ d7861c7337345a2010806e89311d85bf
+
+
+ 1751825767651
+
+ DEL_NODE
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+
+ ADD_NODE
+ WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+ 19b85e105d5758f18c55915fbce84663
+
+
+ 1751825770936
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ==
+
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 03b8818572c5800d88c583073a1ef559
+
+
+ 1751825773370
+
+ DEL_EDGE
+ WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0=
+
+ 1dd8b4edaeed282d75d1daeb3195b728
+
+
+ 1751826367735
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ ca298c11df338ea36bce176af0fe3b69
+
+
+ 1751826515156
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ c6ee9fdcb90f48bc1de9bdc44b7da91f
+
+
+ 1751826596605
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ b79566da6d5ea6c2cf2cbb618da677d2
+
+
+ 1751826901740
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ ba871dc0f4bc75adee32e34c87854508
+
+
+ 1751827730897
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 8bb2b4d5cd9d445722b307d6bdb3d9fd
+
+
+ 1751828973865
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 3609737de0e0d000c3d43a620f592090
+
+
+
\ No newline at end of file
diff --git a/measurements/throughput_test/client_cpu.graphml b/measurements/throughput_test/client_cpu.graphml
new file mode 100644
index 0000000..495721d
--- /dev/null
+++ b/measurements/throughput_test/client_cpu.graphml
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+ B:funbody_cpu.py
+
+
+
+
+
+
+
+
+
+
+ OUT:
+
+
+
+
+
+
+
+
+
+ 0x2306_U1
+
+
+
+
+
+
+
+ 1751825758771
+
+ DEL_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+
+ ADD_NODE
+ WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ==
+
+ e425a002ed1453f66a4fb1dad3ad2923
+
+
+ 1751825761336
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ==
+
+
+ SET_POS
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ d7861c7337345a2010806e89311d85bf
+
+
+ 1751825767651
+
+ DEL_NODE
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+
+ ADD_NODE
+ WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ==
+
+ 19b85e105d5758f18c55915fbce84663
+
+
+ 1751825770936
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ==
+
+
+ SET_POS
+ WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ==
+
+ 03b8818572c5800d88c583073a1ef559
+
+
+ 1751825773370
+
+ DEL_EDGE
+ WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0=
+
+ 1dd8b4edaeed282d75d1daeb3195b728
+
+
+ 1751826367735
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ ca298c11df338ea36bce176af0fe3b69
+
+
+ 1751826515156
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ c6ee9fdcb90f48bc1de9bdc44b7da91f
+
+
+ 1751826596605
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ b79566da6d5ea6c2cf2cbb618da677d2
+
+
+ 1751826901740
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ ba871dc0f4bc75adee32e34c87854508
+
+
+ 1751827730897
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 8bb2b4d5cd9d445722b307d6bdb3d9fd
+
+
+ 1751828973865
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 3609737de0e0d000c3d43a620f592090
+
+
+ 1751872486908
+
+ UPDATE_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfY3B1LnB5Iix0cnVlXQ==
+
+ a0691587adb56f1c913b278379ea8cd5
+
+
+
\ No newline at end of file
diff --git a/measurements/throughput_test/concore.py b/measurements/throughput_test/concore.py
new file mode 100644
index 0000000..ce3ab0a
--- /dev/null
+++ b/measurements/throughput_test/concore.py
@@ -0,0 +1,289 @@
+import time
+import os
+from ast import literal_eval
+import sys
+import re
+import zmq # Added for ZeroMQ
+
+#if windows, create script to kill this process
+# because batch files don't provide easy way to know pid of last command
+# ignored for posix!=windows, because "concorepid" is handled by script
+# ignored for docker (linux!=windows), because handled by docker stop
+if hasattr(sys, 'getwindowsversion'):
+ with open("concorekill.bat","w") as fpid:
+ fpid.write("taskkill /F /PID "+str(os.getpid())+"\n")
+
+# --- ZeroMQ Integration Start ---
+class ZeroMQPort:
+ def __init__(self, port_type, address, zmq_socket_type):
+ self.context = zmq.Context()
+ self.socket = self.context.socket(zmq_socket_type)
+ self.port_type = port_type # "bind" or "connect"
+ self.address = address
+
+ self.socket.setsockopt(zmq.RCVTIMEO, 2000)
+ self.socket.setsockopt(zmq.SNDTIMEO, 2000)
+ self.socket.setsockopt(zmq.LINGER, 0)
+
+ if self.port_type == "bind":
+ self.socket.bind(address)
+ print(f"ZMQ Port bound to {address}")
+ else:
+ self.socket.connect(address)
+ print(f"ZMQ Port connected to {address}")
+
+ def send_json_with_retry(self, message):
+ for attempt in range(5):
+ try:
+ self.socket.send_json(message)
+ return
+ except zmq.Again:
+ print(f"Send timeout (attempt {attempt + 1}/5)")
+ time.sleep(0.5)
+ print("Failed to send after retries.")
+ return
+
+ def recv_json_with_retry(self):
+ for attempt in range(5):
+ try:
+ return self.socket.recv_json()
+ except zmq.Again:
+ print(f"Receive timeout (attempt {attempt + 1}/5)")
+ time.sleep(0.5)
+ print("Failed to receive after retries.")
+ return None
+
+# Global ZeroMQ ports registry
+zmq_ports = {}
+
+def init_zmq_port(port_name, port_type, address, socket_type_str):
+ """
+ Initializes and registers a ZeroMQ port.
+ port_name (str): A unique name for this ZMQ port.
+ port_type (str): "bind" or "connect".
+ address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555").
+ socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB").
+ """
+ if port_name in zmq_ports:
+ print(f"ZMQ Port {port_name} already initialized.")
+ return # Avoid reinitialization
+
+ try:
+ # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP)
+ zmq_socket_type = getattr(zmq, socket_type_str.upper())
+ zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type)
+ print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}")
+ except AttributeError:
+ print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.")
+ except zmq.error.ZMQError as e:
+ print(f"Error initializing ZMQ port {port_name} on {address}: {e}")
+ except Exception as e:
+ print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}")
+
+def terminate_zmq():
+ for port in zmq_ports.values():
+ try:
+ port.socket.close()
+ port.context.term()
+ except Exception as e:
+ print(f"Error while terminating ZMQ port {port.address}: {e}")
+# --- ZeroMQ Integration End ---
+
+def safe_literal_eval(filename, defaultValue):
+ try:
+ with open(filename, "r") as file:
+ return literal_eval(file.read())
+ except (FileNotFoundError, SyntaxError, ValueError, Exception) as e:
+ # Keep print for debugging, but can be made quieter
+ # print(f"Info: Error reading {filename} or file not found, using default: {e}")
+ return defaultValue
+
+iport = safe_literal_eval("concore.iport", {})
+oport = safe_literal_eval("concore.oport", {})
+
+s = ''
+olds = ''
+delay = 1
+retrycount = 0
+inpath = "./in" #must be rel path for local
+outpath = "./out"
+simtime = 0
+
+#9/21/22
+try:
+ sparams_path = os.path.join(inpath + "1", "concore.params")
+ if os.path.exists(sparams_path):
+ with open(sparams_path, "r") as f:
+ sparams = f.read()
+ if sparams: # Ensure sparams is not empty
+ if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove
+ sparams = sparams[1:-1]
+ if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion
+ print("converting sparams: "+sparams)
+ sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}"
+ print("converted sparams: " + sparams)
+ try:
+ params = literal_eval(sparams)
+ except Exception as e:
+ print(f"bad params content: {sparams}, error: {e}")
+ params = dict()
+ else:
+ params = dict()
+ else:
+ params = dict()
+except Exception as e:
+ # print(f"Info: concore.params not found or error reading, using empty dict: {e}")
+ params = dict()
+
+#9/30/22
+def tryparam(n, i):
+ return params.get(n, i)
+
+
+#9/12/21
+def default_maxtime(default):
+ global maxtime
+ maxtime_path = os.path.join(inpath + "1", "concore.maxtime")
+ maxtime = safe_literal_eval(maxtime_path, default)
+
+default_maxtime(100)
+
+def unchanged():
+ global olds, s
+ if olds == s:
+ s = ''
+ return True
+ olds = s
+ return False
+
+def read(port_identifier, name, initstr_val):
+ global s, simtime, retrycount
+
+ default_return_val = initstr_val
+ if isinstance(initstr_val, str):
+ try:
+ default_return_val = literal_eval(initstr_val)
+ except (SyntaxError, ValueError):
+ pass
+
+ if isinstance(port_identifier, str) and port_identifier in zmq_ports:
+ zmq_p = zmq_ports[port_identifier]
+ try:
+ message = zmq_p.recv_json_with_retry()
+ return message
+ except zmq.error.ZMQError as e:
+ print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.")
+ return default_return_val
+ except Exception as e:
+ print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.")
+ return default_return_val
+
+ try:
+ file_port_num = int(port_identifier)
+ except ValueError:
+ print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
+ return default_return_val
+
+ time.sleep(delay)
+ file_path = os.path.join(inpath+str(file_port_num), name)
+ ins = ""
+
+ try:
+ with open(file_path, "r") as infile:
+ ins = infile.read()
+ except FileNotFoundError:
+ ins = str(initstr_val)
+ except Exception as e:
+ print(f"Error reading {file_path}: {e}. Using default value.")
+ return default_return_val
+
+ attempts = 0
+ max_retries = 5
+ while len(ins) == 0 and attempts < max_retries:
+ time.sleep(delay)
+ try:
+ with open(file_path, "r") as infile:
+ ins = infile.read()
+ except Exception as e:
+ print(f"Retry {attempts + 1}: Error reading {file_path} - {e}")
+ attempts += 1
+ retrycount += 1
+
+ if len(ins) == 0:
+ print(f"Max retries reached for {file_path}, using default value.")
+ return default_return_val
+
+ s += ins
+ try:
+ inval = literal_eval(ins)
+ if isinstance(inval, list) and len(inval) > 0:
+ current_simtime_from_file = inval[0]
+ if isinstance(current_simtime_from_file, (int, float)):
+ simtime = max(simtime, current_simtime_from_file)
+ return inval[1:]
+ else:
+ print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.")
+ return inval
+ except Exception as e:
+ print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.")
+ return default_return_val
+
+
+def write(port_identifier, name, val, delta=0):
+ global simtime
+
+ if isinstance(port_identifier, str) and port_identifier in zmq_ports:
+ zmq_p = zmq_ports[port_identifier]
+ try:
+ zmq_p.send_json_with_retry(val)
+ except zmq.error.ZMQError as e:
+ print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}")
+ except Exception as e:
+ print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}")
+
+ try:
+ if isinstance(port_identifier, str) and port_identifier in zmq_ports:
+ file_path = os.path.join("../"+port_identifier, name)
+ else:
+ file_port_num = int(port_identifier)
+ file_path = os.path.join(outpath+str(file_port_num), name)
+ except ValueError:
+ print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.")
+ return
+
+ if isinstance(val, str):
+ time.sleep(2 * delay)
+ elif not isinstance(val, list):
+ print(f"File write to {file_path} must have list or str value, got {type(val)}")
+ return
+
+ try:
+ with open(file_path, "w") as outfile:
+ if isinstance(val, list):
+ data_to_write = [simtime + delta] + val
+ outfile.write(str(data_to_write))
+ simtime += delta
+ else:
+ outfile.write(val)
+ except Exception as e:
+ print(f"Error writing to {file_path}: {e}")
+
+def initval(simtime_val_str):
+ global simtime
+ try:
+ val = literal_eval(simtime_val_str)
+ if isinstance(val, list) and len(val) > 0:
+ first_element = val[0]
+ if isinstance(first_element, (int, float)):
+ simtime = first_element
+ return val[1:]
+ else:
+ print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.")
+ return val[1:] if len(val) > 1 else []
+ else:
+ print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.")
+ return []
+
+ except Exception as e:
+ print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.")
+ return []
\ No newline at end of file
diff --git a/measurements/throughput_test/funbody_cpu.py b/measurements/throughput_test/funbody_cpu.py
new file mode 100644
index 0000000..28f1c16
--- /dev/null
+++ b/measurements/throughput_test/funbody_cpu.py
@@ -0,0 +1,71 @@
+# funbody_throughput_test.py (MODIFIED FOR RESOURCE MONITORING)
+import time
+import concore
+import os
+import json
+import threading
+import psutil
+import csv
+
+# --- MONITORING FUNCTION (to be run in a separate thread) ---
+def monitor_resources(stop_event, output_list):
+ """Monitors this script's CPU and memory usage."""
+ process = psutil.Process(os.getpid())
+ while not stop_event.is_set():
+ cpu_percent = process.cpu_percent(interval=0.5)
+ memory_mb = process.memory_info().rss / (1024 * 1024)
+ output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb})
+
+print("funbody (Receiver) using ZMQ PULL socket for Throughput & Resource Test.")
+
+
+TEST_DURATION = 10
+message_count = 0
+test_started = False
+resource_records = []
+
+# --- Start Monitoring ---
+stop_monitoring = threading.Event()
+monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records))
+monitor_thread.start()
+
+# --- Main Throughput Test Logic (Unchanged) ---
+concore.init_zmq_port(
+ port_name=PORT_NAME_B_OUT,
+ port_type="bind",
+ address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port
+ socket_type_str="REP"
+)
+
+print(f"Receiver waiting for messages on port {PORT_B_OUT}...")
+while True:
+ message_str = concore.read(PORT_NAME_B_OUT, "stream", "{}")
+ if message_str is None: break
+ try:
+ message_dict = json.loads(message_str)
+ except (json.JSONDecodeError, TypeError):
+ continue
+ if isinstance(message_dict, dict) and 'type' in message_dict:
+ if message_dict['type'] == 'control':
+ if message_dict['value'] == 'START' and not test_started:
+ test_started = True
+ elif message_dict['value'] == 'STOP' and test_started:
+ break
+ elif message_dict['type'] == 'data' and test_started:
+ message_count += 1
+
+# --- Stop Monitoring and Save Results ---
+stop_monitoring.set()
+monitor_thread.join()
+concore.terminate_zmq()
+
+if message_count > 0:
+ throughput = message_count / TEST_DURATION
+ print(f"THROUGHPUT RESULT: {throughput:.2f} messages/second")
+
+if resource_records:
+ with open('receiver_usage.csv', 'w', newline='') as f:
+ writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb'])
+ writer.writeheader()
+ writer.writerows(resource_records)
+ print("Receiver resource usage saved to receiver_usage.csv")
\ No newline at end of file
diff --git a/measurements/throughput_test/funbody_throughput_test.py b/measurements/throughput_test/funbody_throughput_test.py
new file mode 100644
index 0000000..d517488
--- /dev/null
+++ b/measurements/throughput_test/funbody_throughput_test.py
@@ -0,0 +1,40 @@
+# funbody_throughput.py
+import time
+import concore
+
+print("Starting ZMQ throughput server (funbody)")
+
+# --- ZMQ Configuration ---
+# Ensure these environment variables are set before running
+# Example: PORT_NAME_F2_OUT="F1_out" PORT_F2_OUT="5555" python funbody_throughput.py
+
+# Initialize the ZMQ server port
+concore.init_zmq_port(
+ port_name=PORT_NAME_B_OUT,
+ port_type="bind",
+ address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port
+ socket_type_str="REP"
+)
+
+# --- Server Loop ---
+print(f"Funbody server listening on port {PORT_B_OUT}. Press Ctrl+C to stop.")
+
+try:
+ while True:
+ # Wait to receive any message from a client
+ received_message = concore.read(PORT_NAME_B_OUT, "throughput_test", "{}")
+
+ if received_message:
+ # As soon as a message is received, send a reply back
+ reply_message = {"status": "ok"}
+ concore.write(PORT_NAME_B_OUT, "throughput_reply", reply_message)
+ else:
+ # The read timed out; just continue waiting for the next message
+ continue
+
+except KeyboardInterrupt:
+ print("\nServer shutting down.")
+
+finally:
+ # Clean up the ZMQ connection
+ concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/throughput_test/funcall_cpu.py b/measurements/throughput_test/funcall_cpu.py
new file mode 100644
index 0000000..b03f815
--- /dev/null
+++ b/measurements/throughput_test/funcall_cpu.py
@@ -0,0 +1,63 @@
+# funcall_throughput_test.py (MODIFIED FOR RESOURCE MONITORING)
+import time
+import concore
+import os
+import json
+import threading
+import psutil
+import csv
+
+# --- MONITORING FUNCTION (to be run in a separate thread) ---
+def monitor_resources(stop_event, output_list):
+ """Monitors this script's CPU and memory usage."""
+ process = psutil.Process(os.getpid())
+ while not stop_event.is_set():
+ # Get CPU (as a percentage) and Memory (RSS in MB)
+ cpu_percent = process.cpu_percent(interval=0.5)
+ memory_mb = process.memory_info().rss / (1024 * 1024)
+ output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb})
+
+print("funcall (Sender) using ZMQ PUSH socket for Throughput & Resource Test.")
+
+
+TEST_DURATION = 10
+message_count = 0
+resource_records = []
+
+# --- Start Monitoring ---
+stop_monitoring = threading.Event()
+monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records))
+monitor_thread.start()
+
+# --- Main Throughput Test Logic (Unchanged) ---
+concore.init_zmq_port(
+ port_name=PORT_NAME_IN_A,
+ port_type="connect",
+ address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing
+ socket_type_str="REQ"
+)
+print(f"Sender starting. Will send data for 10 seconds.")
+start_signal = json.dumps({"type": "control", "value": "START"})
+concore.write(PORT_NAME_IN_A, "stream", start_signal)
+time.sleep(1)
+start_time = time.perf_counter()
+while (time.perf_counter() - start_time) < TEST_DURATION:
+ data_message = json.dumps({"type": "data", "value": message_count})
+ concore.write(PORT_NAME_IN_A, "stream", data_message)
+ message_count += 1
+time.sleep(1)
+stop_signal = json.dumps({"type": "control", "value": "STOP"})
+concore.write(PORT_NAME_IN_A, "stream", stop_signal)
+print(f"Sender finished. Sent approximately {message_count} messages.")
+
+# --- Stop Monitoring and Save Results ---
+stop_monitoring.set()
+monitor_thread.join()
+concore.terminate_zmq()
+
+if resource_records:
+ with open('sender_usage.csv', 'w', newline='') as f:
+ writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb'])
+ writer.writeheader()
+ writer.writerows(resource_records)
+ print("Sender resource usage saved to sender_usage.csv")
\ No newline at end of file
diff --git a/measurements/throughput_test/funcall_throughput_test.py b/measurements/throughput_test/funcall_throughput_test.py
new file mode 100644
index 0000000..6c58aac
--- /dev/null
+++ b/measurements/throughput_test/funcall_throughput_test.py
@@ -0,0 +1,57 @@
+# funcall_throughput.py
+import time
+import concore
+
+print("Starting ZMQ throughput test (funcall)")
+
+# --- ZMQ Configuration ---
+# Ensure these environment variables are set before running
+# Example: PORT_NAME_IN_F1="F1_out" PORT_IN_F1="5555" python funcall_throughput.py
+
+# Initialize the ZMQ connection to the funbody server
+concore.init_zmq_port(
+ port_name=PORT_NAME_IN_A,
+ port_type="connect",
+ address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing
+ socket_type_str="REQ"
+)
+
+# --- Test Parameters ---
+TEST_DURATION_SECONDS = 10
+message_to_send = {"ping": "hello"}
+message_count = 0
+
+print(f"Running test for {TEST_DURATION_SECONDS} seconds...")
+
+start_time = time.perf_counter()
+end_time = start_time + TEST_DURATION_SECONDS
+
+# --- Main Test Loop ---
+while time.perf_counter() < end_time:
+ # Send a message to the funbody server
+ concore.write(PORT_NAME_IN_A, "throughput_test", message_to_send)
+
+ # Wait for the reply
+ reply = concore.read(PORT_NAME_IN_A, "throughput_reply", "{}")
+
+ # If we get a valid reply, increment our counter
+ if reply:
+ message_count += 1
+ else:
+ print("Warning: Missed a reply from the server.")
+ # In a real-world scenario, you might want to break or handle this
+ break
+
+# --- Calculate and Print Results ---
+actual_duration = time.perf_counter() - start_time
+throughput = message_count / actual_duration
+
+print("\n--- Throughput Test Complete ---")
+print(f"Total messages exchanged: {message_count}")
+print(f"Total time: {actual_duration:.2f} seconds")
+print(f"Throughput: {throughput:.2f} messages/sec")
+print("---------------------------------")
+
+
+# Clean up the ZMQ connection
+concore.terminate_zmq()
\ No newline at end of file
diff --git a/measurements/throughput_test/plot.py b/measurements/throughput_test/plot.py
new file mode 100644
index 0000000..604c3e4
--- /dev/null
+++ b/measurements/throughput_test/plot.py
@@ -0,0 +1,34 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+# --- Enter your collected data here ---
+# Example values, replace with your actual measurements
+throughput_mediator = 15.7 # messages/sec
+throughput_zmq = 4497.8 # messages/sec
+# -----------------------------------------
+
+protocols = ['Mediator', 'ZeroMQ']
+values = [throughput_mediator, throughput_zmq]
+colors = ['#F44336', '#4CAF50']
+
+plt.figure(figsize=(8, 6))
+bars = plt.bar(protocols, values, color=colors)
+
+# Add plot details
+plt.ylabel('Throughput (Messages/Second)', fontsize=12)
+plt.title('Figure 4: Maximum Throughput Comparison', fontsize=16, pad=20)
+plt.xticks(fontsize=12)
+# Use a logarithmic scale if the difference is very large
+plt.yscale('log')
+plt.grid(axis='y', linestyle='--', alpha=0.7)
+
+# Add text labels on top of the bars
+for bar in bars:
+ yval = bar.get_height()
+ plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:,.0f}', va='bottom', ha='center', fontsize=11)
+
+# Save the figure for your paper
+plt.savefig('figure4_throughput_comparison.png', dpi=300)
+print("Plot saved as 'figure4_throughput_comparison.png'")
+
+plt.show()
\ No newline at end of file
diff --git a/measurements/throughput_test/plot_fig5.py b/measurements/throughput_test/plot_fig5.py
new file mode 100644
index 0000000..77391fe
--- /dev/null
+++ b/measurements/throughput_test/plot_fig5.py
@@ -0,0 +1,42 @@
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+# Load all data and calculate averages
+try:
+ avg_cpu_sender_zmq = pd.read_csv('sender_zmq_usage.csv')['cpu_percent'].mean()
+ avg_mem_sender_zmq = pd.read_csv('sender_zmq_usage.csv')['memory_mb'].mean()
+
+ # In a real test, you would also measure the receiver. For simplicity, we plot sender.
+ # avg_cpu_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['cpu_percent'].mean()
+ # avg_mem_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['memory_mb'].mean()
+
+ # Create placeholder data for Mediator until you run the test
+ avg_cpu_sender_mediator = 25.5 # Example value
+ avg_mem_sender_mediator = 60.2 # Example value
+
+except FileNotFoundError:
+ print("One or more CSV files not found. Using placeholder data.")
+ # Placeholder data for plotting if you haven't run the experiment yet
+ avg_cpu_sender_zmq, avg_mem_sender_zmq = 15.0, 45.0
+ avg_cpu_sender_mediator, avg_mem_sender_mediator = 25.5, 60.2
+
+# Prepare data for plotting
+data = {
+ 'Protocol': ['Mediator', 'ZeroMQ', 'Mediator', 'ZeroMQ'],
+ 'Metric': ['CPU Usage (%)', 'CPU Usage (%)', 'Memory Usage (MB)', 'Memory Usage (MB)'],
+ 'Value': [avg_cpu_sender_mediator, avg_cpu_sender_zmq, avg_mem_sender_mediator, avg_mem_sender_zmq]
+}
+df_plot = pd.DataFrame(data)
+
+# Create the grouped bar chart
+plt.figure(figsize=(10, 7))
+sns.barplot(x='Metric', y='Value', hue='Protocol', data=df_plot, palette={'Mediator': '#F44336', 'ZeroMQ': '#4CAF50'})
+
+plt.title('Figure 5: Resource Utilization During Throughput Test (Sender)', fontsize=16)
+plt.xlabel('Performance Metric', fontsize=12)
+plt.ylabel('Average Usage', fontsize=12)
+plt.legend(title='Protocol')
+plt.grid(axis='y', linestyle='--', alpha=0.7)
+
+plt.show()
\ No newline at end of file
diff --git a/measurements/throughput_test/server.graphml b/measurements/throughput_test/server.graphml
new file mode 100644
index 0000000..81b5102
--- /dev/null
+++ b/measurements/throughput_test/server.graphml
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+ A:funcall_throughput_test.py
+
+
+
+
+
+
+
+
+
+
+ IN:
+
+
+
+
+
+
+
+
+
+ 0x2306_U1
+
+
+
+
+
+
+
+ 1751825545123
+
+ DEL_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+
+ ADD_NODE
+ WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+ 0f6a06a5f49f1d83657221f267bbf65e
+
+
+ 1751825547451
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ c07fdf0b5fbc290aea42a3bd74c45a6b
+
+
+ 1751825549601
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+ 55cb72ce7faf50386f9f71afe1e576fb
+
+
+ 1751825564072
+
+ DEL_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+
+ ADD_NODE
+ WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+ d13798fff2bf40cbacc6bc0f73cc3e5a
+
+
+ 1751825566634
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd
+
+ 1292dab0cd809e0bc822a88cbe296a4f
+
+
+ 1751825570934
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0=
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 71a0470230ca5a52edc2cb9ff06f3d28
+
+
+ 1751825572700
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d
+
+ 86c56976fc63f27dc9485ecc73f2de2d
+
+
+ 1751825576935
+
+ DEL_EDGE
+ WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0=
+
+ e3d7f90d81fe934dfa3c417169de8824
+
+
+ 1751826381936
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ 39ad7e349fa9310a7b969d4ebab5282e
+
+
+ 1751826525320
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 8efbfe0ae1b0204fce1d374693fa71a4
+
+
+ 1751826583001
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 28d360705ea6c4b2c2fe71ddd4ac747b
+
+
+ 1751826587218
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ 4688004b0c03d91e2da0b196f1c26a63
+
+
+ 1751826894632
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ 8cbf36e069285329a3e6c103fadd2d15
+
+
+ 1751827827801
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 474cb438a743ffd7c3e75d28317657f3
+
+
+ 1751828982344
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 4ec6d444cdddc40c1917aba4da2ee7d0
+
+
+
\ No newline at end of file
diff --git a/measurements/throughput_test/server_cpu.graphml b/measurements/throughput_test/server_cpu.graphml
new file mode 100644
index 0000000..9bf33ce
--- /dev/null
+++ b/measurements/throughput_test/server_cpu.graphml
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+
+
+
+
+
+ A:funcall_cpu.py
+
+
+
+
+
+
+
+
+
+
+ IN:
+
+
+
+
+
+
+
+
+
+ 0x2307_U1
+
+
+
+
+
+
+
+ 1751825545123
+
+ DEL_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+
+ ADD_NODE
+ WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ==
+
+ 0f6a06a5f49f1d83657221f267bbf65e
+
+
+ 1751825547451
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ c07fdf0b5fbc290aea42a3bd74c45a6b
+
+
+ 1751825549601
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0=
+
+
+ SET_POS
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0=
+
+ 55cb72ce7faf50386f9f71afe1e576fb
+
+
+ 1751825564072
+
+ DEL_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+
+ ADD_NODE
+ WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ==
+
+ d13798fff2bf40cbacc6bc0f73cc3e5a
+
+
+ 1751825566634
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd
+
+
+ UPDATE_NODE
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd
+
+ 1292dab0cd809e0bc822a88cbe296a4f
+
+
+ 1751825570934
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0=
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0=
+
+ 71a0470230ca5a52edc2cb9ff06f3d28
+
+
+ 1751825572700
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d
+
+
+ SET_POS
+ WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d
+
+ 86c56976fc63f27dc9485ecc73f2de2d
+
+
+ 1751825576935
+
+ DEL_EDGE
+ WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ==
+
+
+ ADD_EDGE
+ W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0=
+
+ e3d7f90d81fe934dfa3c417169de8824
+
+
+ 1751826381936
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+ 39ad7e349fa9310a7b969d4ebab5282e
+
+
+ 1751826525320
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 8efbfe0ae1b0204fce1d374693fa71a4
+
+
+ 1751826583001
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+ 28d360705ea6c4b2c2fe71ddd4ac747b
+
+
+ 1751826587218
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+ 4688004b0c03d91e2da0b196f1c26a63
+
+
+ 1751826894632
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+ 8cbf36e069285329a3e6c103fadd2d15
+
+
+ 1751827827801
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+ 474cb438a743ffd7c3e75d28317657f3
+
+
+ 1751828982344
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+ 4ec6d444cdddc40c1917aba4da2ee7d0
+
+
+ 1751872426393
+
+ UPDATE_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ==
+
+
+ UPDATE_NODE
+ WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfY3B1LnB5Iix0cnVlXQ==
+
+ 72b043d710aeb2d0db300c844fe93875
+
+
+ 1751873408899
+
+ UPDATE_EDGE
+ WyJkMDNiMGFjMS05OTA1LTRhMjUtOTgwMS0wMDNmNGZlYWJjODQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0=
+
+
+ UPDATE_EDGE
+ WyJkMDNiMGFjMS05OTA1LTRhMjUtOTgwMS0wMDNmNGZlYWJjODQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0=
+
+ 30848cb7ede5f6155725091f45680e40
+
+
+
\ No newline at end of file