monitoring(overview): reflow UPS/climate rows and add jenkins weather

This commit is contained in:
Brad Stein 2026-04-12 18:14:54 -03:00
parent f67ca30f94
commit cb27592272
3 changed files with 410 additions and 116 deletions

View File

@ -1302,13 +1302,39 @@ def build_overview():
},
}
]
jenkins_weather_mapping = [
{
"type": "range",
"options": {
"from": 95,
"to": 101,
"result": {"text": "☀️ Sunny"},
},
},
{
"type": "range",
"options": {
"from": 80,
"to": 95,
"result": {"text": "⛅ Cloudy"},
},
},
{
"type": "range",
"options": {
"from": 0,
"to": 80,
"result": {"text": "⛈️ Storm"},
},
},
]
panels.append(
stat_panel(
40,
"UPS Current Load",
None,
{"h": 6, "w": 4, "x": 0, "y": 12},
{"h": 5, "w": 6, "x": 0, "y": 7},
unit="none",
decimals=1,
text_mode="name_and_value",
@ -1355,15 +1381,15 @@ def build_overview():
41,
"UPS History (Power Draw)",
None,
{"h": 6, "w": 4, "x": 4, "y": 12},
{"h": 5, "w": 6, "x": 6, "y": 7},
unit="watt",
targets=[
{"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB_SERIES, "legendFormat": ANANKE_UPS_DB_NAME},
{"refId": "B", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS_SERIES, "legendFormat": ANANKE_UPS_TETHYS_NAME},
{"refId": "C", "expr": ANANKE_UPS_DRAW_WATTS_TOTAL_SERIES, "legendFormat": "combined"},
],
legend_display="list",
legend_placement="bottom",
legend_display="table",
legend_placement="right",
links=link_to("atlas-power"),
)
)
@ -1372,10 +1398,10 @@ def build_overview():
42,
"Current Climate",
None,
{"h": 6, "w": 4, "x": 8, "y": 12},
{"h": 6, "w": 6, "x": 0, "y": 12},
unit="none",
decimals=2,
text_mode="value",
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": CLIMATE_TEMP_MAX, "legendFormat": "Tent Temp (°C)", "instant": True},
{"refId": "B", "expr": CLIMATE_TEMP_FAHRENHEIT_MAX, "legendFormat": "Tent Temp (°F)", "instant": True},
@ -1390,8 +1416,8 @@ def build_overview():
],
links=link_to("atlas-power"),
description="Current tent temperature in C/F, humidity, and pressure proxy (VPD in kPa).",
orientation="vertical",
wide_layout=False,
orientation="horizontal",
wide_layout=True,
)
)
panels.append(
@ -1399,7 +1425,7 @@ def build_overview():
43,
"Climate History",
None,
{"h": 6, "w": 4, "x": 12, "y": 12},
{"h": 6, "w": 6, "x": 6, "y": 12},
unit="celsius",
targets=[
{"refId": "A", "expr": CLIMATE_TEMP_SERIES, "legendFormat": "Temperature (°C)"},
@ -1430,8 +1456,8 @@ def build_overview():
],
}
],
legend_display="list",
legend_placement="bottom",
legend_display="table",
legend_placement="right",
links=link_to("atlas-power"),
description="Historical tent temperature (C/F), humidity, and pressure proxy (VPD kPa).",
)
@ -1441,7 +1467,7 @@ def build_overview():
140,
"Fan Activity",
None,
{"h": 6, "w": 4, "x": 16, "y": 12},
{"h": 6, "w": 6, "x": 12, "y": 12},
unit="none",
decimals=0,
text_mode="name_and_value",
@ -1460,6 +1486,8 @@ def build_overview():
],
},
links=link_to("atlas-power"),
orientation="horizontal",
wide_layout=True,
)
)
panels.append(
@ -1467,7 +1495,7 @@ def build_overview():
141,
"Fan History (0-10)",
None,
{"h": 6, "w": 4, "x": 20, "y": 12},
{"h": 6, "w": 6, "x": 18, "y": 12},
unit="none",
max_value=10,
targets=[
@ -1476,8 +1504,8 @@ def build_overview():
{"refId": "C", "expr": CLIMATE_FAN_OUTSIDE_INLET_SERIES, "legendFormat": "Outside Inlet"},
{"refId": "D", "expr": CLIMATE_FAN_INTERIOR_SERIES, "legendFormat": "Interior Fans"},
],
legend_display="list",
legend_placement="bottom",
legend_display="table",
legend_placement="right",
links=link_to("atlas-power"),
)
)
@ -1487,7 +1515,7 @@ def build_overview():
44,
"One-off Job Pods (age hours)",
ONEOFF_JOB_POD_AGE_HOURS,
{"h": 5, "w": 6, "x": 0, "y": 7},
{"h": 5, "w": 8, "x": 0, "y": 32},
unit="h",
instant=True,
legend="{{namespace}}/{{pod}}",
@ -1503,7 +1531,7 @@ def build_overview():
"type": "timeseries",
"title": "Ariadne Attempts / Failures",
"datasource": PROM_DS,
"gridPos": {"h": 5, "w": 6, "x": 6, "y": 7},
"gridPos": {"h": 5, "w": 6, "x": 12, "y": 7},
"targets": [
{"expr": ARIADNE_TASK_ATTEMPTS_SERIES, "refId": "A", "legendFormat": "Attempts"},
{"expr": ARIADNE_TASK_FAILURES_SERIES, "refId": "B", "legendFormat": "Failures"},
@ -1536,7 +1564,7 @@ def build_overview():
46,
"Platform Test Success Rate",
None,
{"h": 5, "w": 6, "x": 12, "y": 7},
{"h": 5, "w": 6, "x": 18, "y": 7},
unit="percent",
targets=PLATFORM_TEST_SUCCESS_RATE_SUITE_TARGETS,
legend_display="table",
@ -1565,7 +1593,7 @@ def build_overview():
47,
"PVC Backup Health / Age",
PVC_BACKUP_AGE_HOURS_BY_PVC,
{"h": 5, "w": 6, "x": 18, "y": 7},
{"h": 5, "w": 8, "x": 16, "y": 32},
unit="h",
instant=True,
legend="{{namespace}}/{{pvc}}",
@ -1585,6 +1613,52 @@ def build_overview():
panels[-1]["description"] = (
"Oldest successful backup age in hours by PVC. PVCs with missing or unhealthy backup state are forced to 999h so the red bars stay visible in the overview."
)
panels.append(
{
"id": 142,
"type": "stat",
"title": "Jenkins Build Weather (24h)",
"datasource": PROM_DS,
"gridPos": {"h": 5, "w": 8, "x": 8, "y": 32},
"targets": [
{
"expr": PLATFORM_TEST_SUCCESS_RATE_24H_BY_SUITE,
"refId": "A",
"legendFormat": "{{suite}}",
"instant": True,
}
],
"fieldConfig": {
"defaults": {
"color": {"mode": "thresholds"},
"mappings": jenkins_weather_mapping,
"thresholds": {
"mode": "absolute",
"steps": [
{"color": "red", "value": None},
{"color": "orange", "value": 80},
{"color": "green", "value": 95},
],
},
"unit": "percent",
"decimals": 1,
"custom": {"displayMode": "auto"},
},
"overrides": [],
},
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "center",
"reduceOptions": {"calcs": ["lastNotNull"], "fields": "", "values": False},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": True,
},
"links": link_to("atlas-jobs"),
"description": "24h build health by suite: sunny (>=95%), cloudy (80-95%), storm (<80%).",
}
)
panels.append(
stat_panel(
@ -1734,7 +1808,7 @@ def build_overview():
14,
"Worker Node CPU",
node_cpu_expr(worker_filter),
{"h": 12, "w": 12, "x": 0, "y": 39},
{"h": 12, "w": 12, "x": 0, "y": 44},
unit="percent",
legend="{{node}}",
legend_calcs=["last"],
@ -1748,7 +1822,7 @@ def build_overview():
15,
"Worker Node RAM",
node_mem_expr(worker_filter),
{"h": 12, "w": 12, "x": 12, "y": 39},
{"h": 12, "w": 12, "x": 12, "y": 44},
unit="percent",
legend="{{node}}",
legend_calcs=["last"],
@ -1763,7 +1837,7 @@ def build_overview():
16,
"Control plane CPU",
node_cpu_expr(CONTROL_ALL_REGEX),
{"h": 10, "w": 12, "x": 0, "y": 51},
{"h": 10, "w": 12, "x": 0, "y": 56},
unit="percent",
legend="{{node}}",
legend_display="table",
@ -1775,7 +1849,7 @@ def build_overview():
17,
"Control plane RAM",
node_mem_expr(CONTROL_ALL_REGEX),
{"h": 10, "w": 12, "x": 12, "y": 51},
{"h": 10, "w": 12, "x": 12, "y": 56},
unit="percent",
legend="{{node}}",
legend_display="table",
@ -1788,7 +1862,7 @@ def build_overview():
28,
"Node Pod Share",
'(sum(kube_pod_info{pod!="" , node!=""}) by (node) / clamp_min(sum(kube_pod_info{pod!="" , node!=""}), 1)) * 100',
{"h": 10, "w": 12, "x": 0, "y": 61},
{"h": 10, "w": 12, "x": 0, "y": 66},
)
)
panels.append(
@ -1796,7 +1870,7 @@ def build_overview():
29,
"Top Nodes by Pod Count",
'topk(12, sum(kube_pod_info{pod!="" , node!=""}) by (node))',
{"h": 10, "w": 12, "x": 12, "y": 61},
{"h": 10, "w": 12, "x": 12, "y": 66},
unit="none",
limit=12,
decimals=0,
@ -1818,7 +1892,7 @@ def build_overview():
18,
"Cluster Ingress Throughput",
NET_INGRESS_EXPR,
{"h": 7, "w": 8, "x": 0, "y": 32},
{"h": 7, "w": 8, "x": 0, "y": 37},
unit="Bps",
legend="Ingress (Traefik)",
legend_display="list",
@ -1831,7 +1905,7 @@ def build_overview():
19,
"Cluster Egress Throughput",
NET_EGRESS_EXPR,
{"h": 7, "w": 8, "x": 8, "y": 32},
{"h": 7, "w": 8, "x": 8, "y": 37},
unit="Bps",
legend="Egress (Traefik)",
legend_display="list",
@ -1844,7 +1918,7 @@ def build_overview():
20,
"Intra-Cluster Throughput",
NET_INTERNAL_EXPR,
{"h": 7, "w": 8, "x": 16, "y": 32},
{"h": 7, "w": 8, "x": 16, "y": 37},
unit="Bps",
legend="Internal traffic",
legend_display="list",
@ -1858,7 +1932,7 @@ def build_overview():
21,
"Root Filesystem Usage",
root_usage_expr(),
{"h": 16, "w": 12, "x": 0, "y": 71},
{"h": 16, "w": 12, "x": 0, "y": 76},
unit="percent",
legend="{{node}}",
legend_calcs=["last"],
@ -1873,7 +1947,7 @@ def build_overview():
22,
"Nodes Closest to Full Astraios Disks",
astraios_usage_expr(),
{"h": 16, "w": 12, "x": 12, "y": 71},
{"h": 16, "w": 12, "x": 12, "y": 76},
unit="percent",
legend="{{node}}",
legend_calcs=["last"],

View File

@ -1079,10 +1079,10 @@
"uid": "atlas-vm"
},
"gridPos": {
"h": 6,
"w": 4,
"h": 5,
"w": 6,
"x": 0,
"y": 12
"y": 7
},
"targets": [
{
@ -1301,10 +1301,10 @@
"uid": "atlas-vm"
},
"gridPos": {
"h": 6,
"w": 4,
"x": 4,
"y": 12
"h": 5,
"w": 6,
"x": 6,
"y": 7
},
"targets": [
{
@ -1331,8 +1331,8 @@
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1356,8 +1356,8 @@
},
"gridPos": {
"h": 6,
"w": 4,
"x": 8,
"w": 6,
"x": 0,
"y": 12
},
"targets": [
@ -1473,9 +1473,9 @@
"fields": "",
"values": false
},
"textMode": "value",
"orientation": "vertical",
"wideLayout": false
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
@ -1496,8 +1496,8 @@
},
"gridPos": {
"h": 6,
"w": 4,
"x": 12,
"w": 6,
"x": 6,
"y": 12
},
"targets": [
@ -1579,8 +1579,8 @@
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1605,8 +1605,8 @@
},
"gridPos": {
"h": 6,
"w": 4,
"x": 16,
"w": 6,
"x": 12,
"y": 12
},
"targets": [
@ -1677,7 +1677,9 @@
"fields": "",
"values": false
},
"textMode": "name_and_value"
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
@ -1697,8 +1699,8 @@
},
"gridPos": {
"h": 6,
"w": 4,
"x": 20,
"w": 6,
"x": 18,
"y": 12
},
"targets": [
@ -1732,8 +1734,8 @@
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1757,9 +1759,9 @@
},
"gridPos": {
"h": 5,
"w": 6,
"w": 8,
"x": 0,
"y": 7
"y": 32
},
"targets": [
{
@ -1846,7 +1848,7 @@
"gridPos": {
"h": 5,
"w": 6,
"x": 6,
"x": 12,
"y": 7
},
"targets": [
@ -1926,7 +1928,7 @@
"gridPos": {
"h": 5,
"w": 6,
"x": 12,
"x": 18,
"y": 7
},
"targets": [
@ -2035,9 +2037,9 @@
},
"gridPos": {
"h": 5,
"w": 6,
"x": 18,
"y": 7
"w": 8,
"x": 16,
"y": 32
},
"targets": [
{
@ -2107,6 +2109,114 @@
],
"description": "Oldest successful backup age in hours by PVC. PVCs with missing or unhealthy backup state are forced to 999h so the red bars stay visible in the overview."
},
{
"id": 142,
"type": "stat",
"title": "Jenkins Build Weather (24h)",
"datasource": {
"type": "prometheus",
"uid": "atlas-vm"
},
"gridPos": {
"h": 5,
"w": 8,
"x": 8,
"y": 32
},
"targets": [
{
"expr": "sort_desc((100 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\",status=~\"ok|passed|success\"}[24h]))) / clamp_min((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\"}[24h]))), 1)) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\"}[24h]))) > 0))",
"refId": "A",
"legendFormat": "{{suite}}",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [
{
"type": "range",
"options": {
"from": 95,
"to": 101,
"result": {
"text": "\u2600\ufe0f Sunny"
}
}
},
{
"type": "range",
"options": {
"from": 80,
"to": 95,
"result": {
"text": "\u26c5 Cloudy"
}
}
},
{
"type": "range",
"options": {
"from": 0,
"to": 80,
"result": {
"text": "\u26c8\ufe0f Storm"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "orange",
"value": 80
},
{
"color": "green",
"value": 95
}
]
},
"unit": "percent",
"decimals": 1,
"custom": {
"displayMode": "auto"
}
},
"overrides": []
},
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "center",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
"title": "Open atlas-jobs dashboard",
"url": "/d/atlas-jobs",
"targetBlank": true
}
],
"description": "24h build health by suite: sunny (>=95%), cloudy (80-95%), storm (<80%)."
},
{
"id": 30,
"type": "stat",
@ -2776,7 +2886,7 @@
"h": 12,
"w": 12,
"x": 0,
"y": 39
"y": 44
},
"targets": [
{
@ -2823,7 +2933,7 @@
"h": 12,
"w": 12,
"x": 12,
"y": 39
"y": 44
},
"targets": [
{
@ -2870,7 +2980,7 @@
"h": 10,
"w": 12,
"x": 0,
"y": 51
"y": 56
},
"targets": [
{
@ -2907,7 +3017,7 @@
"h": 10,
"w": 12,
"x": 12,
"y": 51
"y": 56
},
"targets": [
{
@ -2944,7 +3054,7 @@
"h": 10,
"w": 12,
"x": 0,
"y": 61
"y": 66
},
"targets": [
{
@ -2995,7 +3105,7 @@
"h": 10,
"w": 12,
"x": 12,
"y": 61
"y": 66
},
"targets": [
{
@ -3076,7 +3186,7 @@
"h": 7,
"w": 8,
"x": 0,
"y": 32
"y": 37
},
"targets": [
{
@ -3120,7 +3230,7 @@
"h": 7,
"w": 8,
"x": 8,
"y": 32
"y": 37
},
"targets": [
{
@ -3164,7 +3274,7 @@
"h": 7,
"w": 8,
"x": 16,
"y": 32
"y": 37
},
"targets": [
{
@ -3208,7 +3318,7 @@
"h": 16,
"w": 12,
"x": 0,
"y": 71
"y": 76
},
"targets": [
{
@ -3256,7 +3366,7 @@
"h": 16,
"w": 12,
"x": 12,
"y": 71
"y": 76
},
"targets": [
{

View File

@ -1088,10 +1088,10 @@ data:
"uid": "atlas-vm"
},
"gridPos": {
"h": 6,
"w": 4,
"h": 5,
"w": 6,
"x": 0,
"y": 12
"y": 7
},
"targets": [
{
@ -1310,10 +1310,10 @@ data:
"uid": "atlas-vm"
},
"gridPos": {
"h": 6,
"w": 4,
"x": 4,
"y": 12
"h": 5,
"w": 6,
"x": 6,
"y": 7
},
"targets": [
{
@ -1340,8 +1340,8 @@ data:
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1365,8 +1365,8 @@ data:
},
"gridPos": {
"h": 6,
"w": 4,
"x": 8,
"w": 6,
"x": 0,
"y": 12
},
"targets": [
@ -1482,9 +1482,9 @@ data:
"fields": "",
"values": false
},
"textMode": "value",
"orientation": "vertical",
"wideLayout": false
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
@ -1505,8 +1505,8 @@ data:
},
"gridPos": {
"h": 6,
"w": 4,
"x": 12,
"w": 6,
"x": 6,
"y": 12
},
"targets": [
@ -1588,8 +1588,8 @@ data:
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1614,8 +1614,8 @@ data:
},
"gridPos": {
"h": 6,
"w": 4,
"x": 16,
"w": 6,
"x": 12,
"y": 12
},
"targets": [
@ -1686,7 +1686,9 @@ data:
"fields": "",
"values": false
},
"textMode": "name_and_value"
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
@ -1706,8 +1708,8 @@ data:
},
"gridPos": {
"h": 6,
"w": 4,
"x": 20,
"w": 6,
"x": 18,
"y": 12
},
"targets": [
@ -1741,8 +1743,8 @@ data:
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
"displayMode": "table",
"placement": "right"
},
"tooltip": {
"mode": "multi"
@ -1766,9 +1768,9 @@ data:
},
"gridPos": {
"h": 5,
"w": 6,
"w": 8,
"x": 0,
"y": 7
"y": 32
},
"targets": [
{
@ -1855,7 +1857,7 @@ data:
"gridPos": {
"h": 5,
"w": 6,
"x": 6,
"x": 12,
"y": 7
},
"targets": [
@ -1935,7 +1937,7 @@ data:
"gridPos": {
"h": 5,
"w": 6,
"x": 12,
"x": 18,
"y": 7
},
"targets": [
@ -2044,9 +2046,9 @@ data:
},
"gridPos": {
"h": 5,
"w": 6,
"x": 18,
"y": 7
"w": 8,
"x": 16,
"y": 32
},
"targets": [
{
@ -2116,6 +2118,114 @@ data:
],
"description": "Oldest successful backup age in hours by PVC. PVCs with missing or unhealthy backup state are forced to 999h so the red bars stay visible in the overview."
},
{
"id": 142,
"type": "stat",
"title": "Jenkins Build Weather (24h)",
"datasource": {
"type": "prometheus",
"uid": "atlas-vm"
},
"gridPos": {
"h": 5,
"w": 8,
"x": 8,
"y": 32
},
"targets": [
{
"expr": "sort_desc((100 * (sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\",status=~\"ok|passed|success\"}[24h]))) / clamp_min((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\"}[24h]))), 1)) and on(suite) ((sum by (suite) (increase(platform_quality_gate_runs_total{suite=~\"ariadne|metis|ananke|atlasbot|lesavka|pegasus|soteria|titan-iac|bstein-home|arcanagon|data-prepper\"}[24h]))) > 0))",
"refId": "A",
"legendFormat": "{{suite}}",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [
{
"type": "range",
"options": {
"from": 95,
"to": 101,
"result": {
"text": "\u2600\ufe0f Sunny"
}
}
},
{
"type": "range",
"options": {
"from": 80,
"to": 95,
"result": {
"text": "\u26c5 Cloudy"
}
}
},
{
"type": "range",
"options": {
"from": 0,
"to": 80,
"result": {
"text": "\u26c8\ufe0f Storm"
}
}
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "orange",
"value": 80
},
{
"color": "green",
"value": 95
}
]
},
"unit": "percent",
"decimals": 1,
"custom": {
"displayMode": "auto"
}
},
"overrides": []
},
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "center",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": true
},
"links": [
{
"title": "Open atlas-jobs dashboard",
"url": "/d/atlas-jobs",
"targetBlank": true
}
],
"description": "24h build health by suite: sunny (>=95%), cloudy (80-95%), storm (<80%)."
},
{
"id": 30,
"type": "stat",
@ -2785,7 +2895,7 @@ data:
"h": 12,
"w": 12,
"x": 0,
"y": 39
"y": 44
},
"targets": [
{
@ -2832,7 +2942,7 @@ data:
"h": 12,
"w": 12,
"x": 12,
"y": 39
"y": 44
},
"targets": [
{
@ -2879,7 +2989,7 @@ data:
"h": 10,
"w": 12,
"x": 0,
"y": 51
"y": 56
},
"targets": [
{
@ -2916,7 +3026,7 @@ data:
"h": 10,
"w": 12,
"x": 12,
"y": 51
"y": 56
},
"targets": [
{
@ -2953,7 +3063,7 @@ data:
"h": 10,
"w": 12,
"x": 0,
"y": 61
"y": 66
},
"targets": [
{
@ -3004,7 +3114,7 @@ data:
"h": 10,
"w": 12,
"x": 12,
"y": 61
"y": 66
},
"targets": [
{
@ -3085,7 +3195,7 @@ data:
"h": 7,
"w": 8,
"x": 0,
"y": 32
"y": 37
},
"targets": [
{
@ -3129,7 +3239,7 @@ data:
"h": 7,
"w": 8,
"x": 8,
"y": 32
"y": 37
},
"targets": [
{
@ -3173,7 +3283,7 @@ data:
"h": 7,
"w": 8,
"x": 16,
"y": 32
"y": 37
},
"targets": [
{
@ -3217,7 +3327,7 @@ data:
"h": 16,
"w": 12,
"x": 0,
"y": 71
"y": 76
},
"targets": [
{
@ -3265,7 +3375,7 @@ data:
"h": 16,
"w": 12,
"x": 12,
"y": 71
"y": 76
},
"targets": [
{