deepadb 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +16 -0
  3. package/README.md +95 -41
  4. package/build/bridge/adb-bridge.d.ts +14 -0
  5. package/build/bridge/adb-bridge.d.ts.map +1 -1
  6. package/build/bridge/adb-bridge.js +34 -5
  7. package/build/bridge/adb-bridge.js.map +1 -1
  8. package/build/bridge/device-manager.d.ts.map +1 -1
  9. package/build/bridge/device-manager.js +18 -9
  10. package/build/bridge/device-manager.js.map +1 -1
  11. package/build/bridge/local-bridge.d.ts +10 -2
  12. package/build/bridge/local-bridge.d.ts.map +1 -1
  13. package/build/bridge/local-bridge.js +51 -16
  14. package/build/bridge/local-bridge.js.map +1 -1
  15. package/build/config/config.d.ts +7 -0
  16. package/build/config/config.d.ts.map +1 -1
  17. package/build/config/config.js +26 -10
  18. package/build/config/config.js.map +1 -1
  19. package/build/graphql-api.d.ts.map +1 -1
  20. package/build/graphql-api.js +73 -3
  21. package/build/graphql-api.js.map +1 -1
  22. package/build/http-transport.d.ts.map +1 -1
  23. package/build/http-transport.js +44 -7
  24. package/build/http-transport.js.map +1 -1
  25. package/build/index.d.ts.map +1 -1
  26. package/build/index.js +41 -16
  27. package/build/index.js.map +1 -1
  28. package/build/middleware/auth.d.ts.map +1 -1
  29. package/build/middleware/auth.js +43 -6
  30. package/build/middleware/auth.js.map +1 -1
  31. package/build/middleware/chipset.d.ts.map +1 -1
  32. package/build/middleware/chipset.js +16 -1
  33. package/build/middleware/chipset.js.map +1 -1
  34. package/build/middleware/cleanup.d.ts +39 -7
  35. package/build/middleware/cleanup.d.ts.map +1 -1
  36. package/build/middleware/cleanup.js +148 -16
  37. package/build/middleware/cleanup.js.map +1 -1
  38. package/build/middleware/fetch-utils.d.ts +50 -7
  39. package/build/middleware/fetch-utils.d.ts.map +1 -1
  40. package/build/middleware/fetch-utils.js +127 -14
  41. package/build/middleware/fetch-utils.js.map +1 -1
  42. package/build/middleware/fs-utils.d.ts +126 -0
  43. package/build/middleware/fs-utils.d.ts.map +1 -0
  44. package/build/middleware/fs-utils.js +229 -0
  45. package/build/middleware/fs-utils.js.map +1 -0
  46. package/build/middleware/logger.d.ts +16 -0
  47. package/build/middleware/logger.d.ts.map +1 -1
  48. package/build/middleware/logger.js +18 -0
  49. package/build/middleware/logger.js.map +1 -1
  50. package/build/middleware/output-processor.d.ts.map +1 -1
  51. package/build/middleware/output-processor.js +43 -8
  52. package/build/middleware/output-processor.js.map +1 -1
  53. package/build/middleware/parse-utils.d.ts +19 -0
  54. package/build/middleware/parse-utils.d.ts.map +1 -0
  55. package/build/middleware/parse-utils.js +30 -0
  56. package/build/middleware/parse-utils.js.map +1 -0
  57. package/build/middleware/png-utils.d.ts.map +1 -1
  58. package/build/middleware/png-utils.js +33 -11
  59. package/build/middleware/png-utils.js.map +1 -1
  60. package/build/middleware/result-handle.d.ts +76 -0
  61. package/build/middleware/result-handle.d.ts.map +1 -0
  62. package/build/middleware/result-handle.js +378 -0
  63. package/build/middleware/result-handle.js.map +1 -0
  64. package/build/middleware/sanitize.d.ts +26 -0
  65. package/build/middleware/sanitize.d.ts.map +1 -1
  66. package/build/middleware/sanitize.js +43 -2
  67. package/build/middleware/sanitize.js.map +1 -1
  68. package/build/middleware/security.d.ts.map +1 -1
  69. package/build/middleware/security.js +30 -5
  70. package/build/middleware/security.js.map +1 -1
  71. package/build/middleware/ui-dump.d.ts.map +1 -1
  72. package/build/middleware/ui-dump.js +30 -10
  73. package/build/middleware/ui-dump.js.map +1 -1
  74. package/build/server.d.ts.map +1 -1
  75. package/build/server.js +36 -5
  76. package/build/server.js.map +1 -1
  77. package/build/tool-context.d.ts.map +1 -1
  78. package/build/tool-context.js +2 -0
  79. package/build/tool-context.js.map +1 -1
  80. package/build/tools/accessibility.d.ts.map +1 -1
  81. package/build/tools/accessibility.js +39 -40
  82. package/build/tools/accessibility.js.map +1 -1
  83. package/build/tools/at-commands.d.ts.map +1 -1
  84. package/build/tools/at-commands.js +61 -56
  85. package/build/tools/at-commands.js.map +1 -1
  86. package/build/tools/baseband.d.ts.map +1 -1
  87. package/build/tools/baseband.js +18 -7
  88. package/build/tools/baseband.js.map +1 -1
  89. package/build/tools/build.d.ts.map +1 -1
  90. package/build/tools/build.js +30 -8
  91. package/build/tools/build.js.map +1 -1
  92. package/build/tools/ci.d.ts.map +1 -1
  93. package/build/tools/ci.js +16 -5
  94. package/build/tools/ci.js.map +1 -1
  95. package/build/tools/control.d.ts.map +1 -1
  96. package/build/tools/control.js +19 -11
  97. package/build/tools/control.js.map +1 -1
  98. package/build/tools/device-farm.d.ts.map +1 -1
  99. package/build/tools/device-farm.js +27 -3
  100. package/build/tools/device-farm.js.map +1 -1
  101. package/build/tools/device-profiles.d.ts.map +1 -1
  102. package/build/tools/device-profiles.js +70 -8
  103. package/build/tools/device-profiles.js.map +1 -1
  104. package/build/tools/device.d.ts.map +1 -1
  105. package/build/tools/device.js +4 -2
  106. package/build/tools/device.js.map +1 -1
  107. package/build/tools/diagnostics.d.ts.map +1 -1
  108. package/build/tools/diagnostics.js +20 -10
  109. package/build/tools/diagnostics.js.map +1 -1
  110. package/build/tools/emulator.d.ts.map +1 -1
  111. package/build/tools/emulator.js +12 -13
  112. package/build/tools/emulator.js.map +1 -1
  113. package/build/tools/files.d.ts +27 -1
  114. package/build/tools/files.d.ts.map +1 -1
  115. package/build/tools/files.js +1109 -11
  116. package/build/tools/files.js.map +1 -1
  117. package/build/tools/firmware-analysis.d.ts.map +1 -1
  118. package/build/tools/firmware-analysis.js +35 -12
  119. package/build/tools/firmware-analysis.js.map +1 -1
  120. package/build/tools/forwarding.d.ts.map +1 -1
  121. package/build/tools/forwarding.js +284 -4
  122. package/build/tools/forwarding.js.map +1 -1
  123. package/build/tools/health.d.ts.map +1 -1
  124. package/build/tools/health.js +14 -3
  125. package/build/tools/health.js.map +1 -1
  126. package/build/tools/input-gestures.d.ts.map +1 -1
  127. package/build/tools/input-gestures.js +65 -13
  128. package/build/tools/input-gestures.js.map +1 -1
  129. package/build/tools/logcat-watch.d.ts.map +1 -1
  130. package/build/tools/logcat-watch.js +21 -14
  131. package/build/tools/logcat-watch.js.map +1 -1
  132. package/build/tools/logs.d.ts.map +1 -1
  133. package/build/tools/logs.js +8 -4
  134. package/build/tools/logs.js.map +1 -1
  135. package/build/tools/mirroring.d.ts.map +1 -1
  136. package/build/tools/mirroring.js +21 -19
  137. package/build/tools/mirroring.js.map +1 -1
  138. package/build/tools/multi-device.d.ts.map +1 -1
  139. package/build/tools/multi-device.js +10 -0
  140. package/build/tools/multi-device.js.map +1 -1
  141. package/build/tools/network-capture.d.ts.map +1 -1
  142. package/build/tools/network-capture.js +32 -8
  143. package/build/tools/network-capture.js.map +1 -1
  144. package/build/tools/network-discovery.d.ts.map +1 -1
  145. package/build/tools/network-discovery.js +11 -2
  146. package/build/tools/network-discovery.js.map +1 -1
  147. package/build/tools/ota-monitor.d.ts.map +1 -1
  148. package/build/tools/ota-monitor.js +26 -12
  149. package/build/tools/ota-monitor.js.map +1 -1
  150. package/build/tools/packages.d.ts.map +1 -1
  151. package/build/tools/packages.js +18 -11
  152. package/build/tools/packages.js.map +1 -1
  153. package/build/tools/plugins.d.ts +18 -0
  154. package/build/tools/plugins.d.ts.map +1 -1
  155. package/build/tools/plugins.js +47 -2
  156. package/build/tools/plugins.js.map +1 -1
  157. package/build/tools/prompts.d.ts.map +1 -1
  158. package/build/tools/prompts.js +2 -0
  159. package/build/tools/prompts.js.map +1 -1
  160. package/build/tools/qemu.d.ts +18 -0
  161. package/build/tools/qemu.d.ts.map +1 -1
  162. package/build/tools/qemu.js +42 -18
  163. package/build/tools/qemu.js.map +1 -1
  164. package/build/tools/registry.d.ts.map +1 -1
  165. package/build/tools/registry.js +76 -26
  166. package/build/tools/registry.js.map +1 -1
  167. package/build/tools/regression.d.ts +37 -0
  168. package/build/tools/regression.d.ts.map +1 -1
  169. package/build/tools/regression.js +63 -22
  170. package/build/tools/regression.js.map +1 -1
  171. package/build/tools/resources.d.ts.map +1 -1
  172. package/build/tools/resources.js +62 -15
  173. package/build/tools/resources.js.map +1 -1
  174. package/build/tools/result-handles.d.ts +37 -0
  175. package/build/tools/result-handles.d.ts.map +1 -0
  176. package/build/tools/result-handles.js +286 -0
  177. package/build/tools/result-handles.js.map +1 -0
  178. package/build/tools/ril-intercept.d.ts.map +1 -1
  179. package/build/tools/ril-intercept.js +15 -18
  180. package/build/tools/ril-intercept.js.map +1 -1
  181. package/build/tools/screen-record.d.ts.map +1 -1
  182. package/build/tools/screen-record.js +34 -5
  183. package/build/tools/screen-record.js.map +1 -1
  184. package/build/tools/screenshot-diff.d.ts.map +1 -1
  185. package/build/tools/screenshot-diff.js +29 -21
  186. package/build/tools/screenshot-diff.js.map +1 -1
  187. package/build/tools/selinux-audit.d.ts.map +1 -1
  188. package/build/tools/selinux-audit.js +7 -5
  189. package/build/tools/selinux-audit.js.map +1 -1
  190. package/build/tools/sensors.d.ts +18 -0
  191. package/build/tools/sensors.d.ts.map +1 -0
  192. package/build/tools/sensors.js +555 -0
  193. package/build/tools/sensors.js.map +1 -0
  194. package/build/tools/shell.d.ts.map +1 -1
  195. package/build/tools/shell.js +9 -0
  196. package/build/tools/shell.js.map +1 -1
  197. package/build/tools/snapshot.d.ts.map +1 -1
  198. package/build/tools/snapshot.js +38 -19
  199. package/build/tools/snapshot.js.map +1 -1
  200. package/build/tools/split-apk.d.ts.map +1 -1
  201. package/build/tools/split-apk.js +48 -24
  202. package/build/tools/split-apk.js.map +1 -1
  203. package/build/tools/test-gen.d.ts.map +1 -1
  204. package/build/tools/test-gen.js +29 -10
  205. package/build/tools/test-gen.js.map +1 -1
  206. package/build/tools/testing.d.ts.map +1 -1
  207. package/build/tools/testing.js +27 -9
  208. package/build/tools/testing.js.map +1 -1
  209. package/build/tools/thermal-power.d.ts +8 -1
  210. package/build/tools/thermal-power.d.ts.map +1 -1
  211. package/build/tools/thermal-power.js +35 -10
  212. package/build/tools/thermal-power.js.map +1 -1
  213. package/build/tools/ui.d.ts.map +1 -1
  214. package/build/tools/ui.js +20 -13
  215. package/build/tools/ui.js.map +1 -1
  216. package/build/tools/wireless-firmware.d.ts.map +1 -1
  217. package/build/tools/wireless-firmware.js +21 -7
  218. package/build/tools/wireless-firmware.js.map +1 -1
  219. package/build/tools/wireless.d.ts.map +1 -1
  220. package/build/tools/wireless.js +39 -3
  221. package/build/tools/wireless.js.map +1 -1
  222. package/build/tools/workflow-market.d.ts.map +1 -1
  223. package/build/tools/workflow-market.js +67 -13
  224. package/build/tools/workflow-market.js.map +1 -1
  225. package/build/tools/workflow.d.ts.map +1 -1
  226. package/build/tools/workflow.js +77 -8
  227. package/build/tools/workflow.js.map +1 -1
  228. package/build/ws-transport.d.ts.map +1 -1
  229. package/build/ws-transport.js +21 -3
  230. package/build/ws-transport.js.map +1 -1
  231. package/package.json +20 -8
@@ -0,0 +1,555 @@
1
+ // Copyright 2026 Jason <fullread@github>
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Hardware Sensor Access — Read values from device hardware sensors.
5
+ *
6
+ * Two tools:
7
+ * - adb_sensor_read: Android HAL level via `dumpsys sensorservice` (no root)
8
+ * - adb_iio_read: Linux IIO subsystem via `/sys/bus/iio/` (root required)
9
+ *
10
+ * Data sources:
11
+ * - `dumpsys sensorservice` — sensor inventory and last-known event values
12
+ * - `/sys/bus/iio/devices/` — raw IIO channels and ODPM power monitors
13
+ *
14
+ * The sensor inventory is device-dependent — the tools report what's available
15
+ * rather than assuming a fixed set. A Pixel 6a exposes 44 sensors (36 hardware
16
+ * + 8 AOSP virtual) via HAL and 2 PMIC power monitors (16 rails) via IIO.
17
+ */
18
+ import { z } from "zod";
19
+ import { OutputProcessor } from "../middleware/output-processor.js";
20
+ // ── HAL Sensor Types & Constants ──────────────────────────────────────────────
21
+ /** Map Android sensor type IDs to human-readable categories and units. */
22
+ const SENSOR_TYPE_MAP = {
23
+ "android.sensor.accelerometer": { category: "accelerometer", unit: "m/s²" },
24
+ "android.sensor.magnetic_field": { category: "magnetometer", unit: "μT" },
25
+ "android.sensor.orientation": { category: "orientation", unit: "°" },
26
+ "android.sensor.gyroscope": { category: "gyroscope", unit: "rad/s" },
27
+ "android.sensor.light": { category: "light", unit: "lux" },
28
+ "android.sensor.pressure": { category: "barometer", unit: "hPa" },
29
+ "android.sensor.proximity": { category: "proximity", unit: "cm" },
30
+ "android.sensor.gravity": { category: "gravity", unit: "m/s²" },
31
+ "android.sensor.linear_acceleration": { category: "linear_accel", unit: "m/s²" },
32
+ "android.sensor.rotation_vector": { category: "rotation", unit: "" },
33
+ "android.sensor.magnetic_field_uncalibrated": { category: "magnetometer", unit: "μT" },
34
+ "android.sensor.game_rotation_vector": { category: "rotation", unit: "" },
35
+ "android.sensor.gyroscope_uncalibrated": { category: "gyroscope", unit: "rad/s" },
36
+ "android.sensor.significant_motion": { category: "motion", unit: "" },
37
+ "android.sensor.step_detector": { category: "step", unit: "" },
38
+ "android.sensor.step_counter": { category: "step", unit: "steps" },
39
+ "android.sensor.geomagnetic_rotation_vector": { category: "rotation", unit: "" },
40
+ "android.sensor.tilt_detector": { category: "motion", unit: "" },
41
+ "android.sensor.pick_up_gesture": { category: "motion", unit: "" },
42
+ "android.sensor.device_orientation": { category: "orientation", unit: "" },
43
+ "android.sensor.accelerometer_uncalibrated": { category: "accelerometer", unit: "m/s²" },
44
+ };
45
+ /** Known category names for the filter parameter. */
46
+ const CATEGORIES = [
47
+ "all", "accelerometer", "gyroscope", "magnetometer", "light",
48
+ "barometer", "proximity", "gravity", "linear_accel", "rotation",
49
+ "orientation", "motion", "step", "temperature",
50
+ ];
51
+ // ── HAL Parsers ──────────────────────────────────────────────────────────────
52
+ /** Parse the "Sensor List:" section from dumpsys sensorservice. */
53
+ function parseSensorList(dump) {
54
+ const sensors = [];
55
+ const listStart = dump.indexOf("Sensor List:");
56
+ if (listStart === -1)
57
+ return sensors;
58
+ const listEnd = dump.indexOf("Fusion States:");
59
+ const block = dump.substring(listStart, listEnd > listStart ? listEnd : listStart + 10000);
60
+ const lines = block.split("\n");
61
+ // Pre-build line start offsets for O(1) line lookup (avoids O(n²) substring+split)
62
+ const lineStarts = [0];
63
+ for (let i = 0; i < block.length; i++) {
64
+ if (block[i] === "\n")
65
+ lineStarts.push(i + 1);
66
+ }
67
+ // Each sensor entry looks like:
68
+ // 0x01010001) LSM6DSR Accelerometer | STMicro | ver: 1 | type: android.sensor.accelerometer(1) | ...
69
+ // followed by a line with mode info: continuous | minRate=... | maxRate=... | ...
70
+ const entryRegex = /^(0x[\da-f]+)\)\s+(.+?)\s*\|\s*(.+?)\s*\|\s*ver:\s*(\d+)\s*\|\s*type:\s*(\S+?)(?:\(\d+\))?\s*\|/gm;
71
+ let match;
72
+ while ((match = entryRegex.exec(block)) !== null) {
73
+ const handle = match[1];
74
+ const name = match[2].trim();
75
+ const vendor = match[3].trim();
76
+ const version = parseInt(match[4], 10);
77
+ const type = match[5];
78
+ const typeInfo = SENSOR_TYPE_MAP[type];
79
+ // O(log n) line lookup via binary search on pre-built offsets
80
+ let lo = 0, hi = lineStarts.length - 1;
81
+ while (lo < hi) {
82
+ const mid = (lo + hi + 1) >> 1;
83
+ if (lineStarts[mid] <= match.index)
84
+ lo = mid;
85
+ else
86
+ hi = mid - 1;
87
+ }
88
+ const matchLine = lo;
89
+ const nextLine = lines[matchLine + 1] || "";
90
+ const modeMatch = nextLine.match(/^\s+(continuous|on-change|one-shot|special-trigger)/);
91
+ const minRateMatch = nextLine.match(/minRate=([\d.]+)Hz/);
92
+ const maxRateMatch = nextLine.match(/maxRate=([\d.]+)Hz/);
93
+ const wakeUp = /\bwakeUp\b/.test(nextLine) && !nextLine.includes("non-wakeUp");
94
+ // Detect temperature sensors by vendor type string
95
+ let category = typeInfo?.category || "other";
96
+ let unit = typeInfo?.unit || "";
97
+ if (type.includes("temperature") || type.includes("temp")) {
98
+ category = "temperature";
99
+ unit = "°C";
100
+ }
101
+ sensors.push({
102
+ handle, name, vendor, version, type, category, unit,
103
+ mode: modeMatch?.[1] || "unknown",
104
+ minRate: minRateMatch?.[1] ? `${minRateMatch[1]} Hz` : "—",
105
+ maxRate: maxRateMatch?.[1] ? `${maxRateMatch[1]} Hz` : "—",
106
+ wakeUp,
107
+ });
108
+ }
109
+ return sensors;
110
+ }
111
+ /** Parse the "Recent Sensor events:" section for last-known values. */
112
+ function parseRecentEvents(dump) {
113
+ const events = new Map();
114
+ const eventsStart = dump.indexOf("Recent Sensor events:");
115
+ if (eventsStart === -1)
116
+ return events;
117
+ const eventsEnd = dump.indexOf("Active sensors:");
118
+ const block = dump.substring(eventsStart, eventsEnd > eventsStart ? eventsEnd : eventsStart + 20000);
119
+ // Each sensor's events block starts with: "SensorName: last N events"
120
+ // Event lines: " N (ts=..., wall=HH:MM:SS.mmm) val1, val2, val3, ..."
121
+ const sensorBlockRegex = /^(\S.+?):\s+last\s+\d+\s+events$/gm;
122
+ let sMatch;
123
+ const positions = [];
124
+ while ((sMatch = sensorBlockRegex.exec(block)) !== null) {
125
+ positions.push({ name: sMatch[1].trim(), headerStart: sMatch.index, start: sMatch.index + sMatch[0].length });
126
+ }
127
+ for (let i = 0; i < positions.length; i++) {
128
+ const pos = positions[i];
129
+ const end = i + 1 < positions.length ? positions[i + 1].headerStart : block.length;
130
+ const eventBlock = block.substring(pos.start, end);
131
+ // Get the LAST event line (most recent reading)
132
+ const eventLines = eventBlock.split("\n").filter(l => l.match(/^\s+\d+\s+\(ts=/));
133
+ const lastLine = eventLines[eventLines.length - 1];
134
+ if (!lastLine)
135
+ continue;
136
+ const wallMatch = lastLine.match(/wall=([^)]+)/);
137
+ const valsMatch = lastLine.match(/\)\s+(.+)/);
138
+ if (!valsMatch)
139
+ continue;
140
+ const values = valsMatch[1].split(",")
141
+ .map(v => v.trim())
142
+ .filter(v => v.length > 0)
143
+ .map(v => parseFloat(v))
144
+ .filter(v => !isNaN(v));
145
+ events.set(pos.name, {
146
+ sensorName: pos.name,
147
+ timestamp: wallMatch?.[1] || "unknown",
148
+ values,
149
+ });
150
+ }
151
+ return events;
152
+ }
153
+ // ── HAL Display Helpers ──────────────────────────────────────────────────────
154
+ /** Format sensor values with axis labels and units based on sensor type. */
155
+ function formatValues(sensor, values) {
156
+ const u = sensor.unit;
157
+ switch (sensor.category) {
158
+ case "accelerometer":
159
+ case "gravity":
160
+ case "linear_accel":
161
+ return values.length >= 3
162
+ ? `x=${values[0].toFixed(3)} y=${values[1].toFixed(3)} z=${values[2].toFixed(3)} ${u}`
163
+ : values.map(v => v.toFixed(3)).join(", ") + (u ? ` ${u}` : "");
164
+ case "gyroscope":
165
+ return values.length >= 3
166
+ ? `x=${values[0].toFixed(4)} y=${values[1].toFixed(4)} z=${values[2].toFixed(4)} ${u}`
167
+ : values.map(v => v.toFixed(4)).join(", ") + (u ? ` ${u}` : "");
168
+ case "magnetometer":
169
+ return values.length >= 3
170
+ ? `x=${values[0].toFixed(2)} y=${values[1].toFixed(2)} z=${values[2].toFixed(2)} ${u}`
171
+ : values.map(v => v.toFixed(2)).join(", ") + (u ? ` ${u}` : "");
172
+ case "light": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
173
+ case "barometer": return `${values[0]?.toFixed(2) ?? "?"} ${u}`;
174
+ case "proximity": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
175
+ case "temperature": return `${values[0]?.toFixed(1) ?? "?"} ${u}`;
176
+ case "step": return `${values[0]?.toFixed(0) ?? "?"} ${u}`.trim();
177
+ default:
178
+ return values.map(v => v.toFixed(3)).join(", ") + (u ? ` ${u}` : "");
179
+ }
180
+ }
181
+ /** Format sensor rate range for display, avoiding ugly double-dash output. */
182
+ function formatRateRange(minRate, maxRate) {
183
+ const hasMin = minRate !== "—";
184
+ const hasMax = maxRate !== "—";
185
+ if (hasMin && hasMax)
186
+ return `, ${minRate}–${maxRate}`;
187
+ if (hasMin)
188
+ return `, ${minRate}`;
189
+ if (hasMax)
190
+ return `, up to ${maxRate}`;
191
+ return "";
192
+ }
193
+ // ── IIO Helpers ──────────────────────────────────────────────────────────────
194
+ /** Classify an IIO device by its kernel driver name. */
195
+ function classifyIioDevice(name) {
196
+ const lower = name.toLowerCase();
197
+ if (lower.includes("odpm"))
198
+ return "odpm";
199
+ if (lower.includes("accel"))
200
+ return "accel";
201
+ if (lower.includes("gyro") || lower.includes("anglvel"))
202
+ return "gyro";
203
+ if (lower.includes("magn"))
204
+ return "magn";
205
+ if (lower.includes("pressure") || lower.includes("baro"))
206
+ return "pressure";
207
+ if (lower.includes("light") || lower.includes("als") || lower.includes("illuminance"))
208
+ return "light";
209
+ if (lower.includes("temp"))
210
+ return "temp";
211
+ if (lower.includes("adc"))
212
+ return "adc";
213
+ return "unknown";
214
+ }
215
+ /** Parse the ODPM channel-to-rail mapping from enabled_rails output. */
216
+ function parseEnabledRails(text) {
217
+ const rails = new Map();
218
+ // Format: CH0[S10M_VDD_TPU]:TPU
219
+ const regex = /^CH(\d+)\[([^\]]+)\]:(.+)$/gm;
220
+ let match;
221
+ while ((match = regex.exec(text)) !== null) {
222
+ rails.set(parseInt(match[1], 10), { rail: match[2], subsystem: match[3].trim() });
223
+ }
224
+ return rails;
225
+ }
226
+ /** Parse LPF power output into channel values. */
227
+ function parseLpfValues(text) {
228
+ const values = new Map();
229
+ // Format: CH0[rail_name], 12345
230
+ const regex = /^CH(\d+)\[[^\]]+\],\s*(\d+)/gm;
231
+ let match;
232
+ while ((match = regex.exec(text)) !== null) {
233
+ values.set(parseInt(match[1], 10), parseInt(match[2], 10));
234
+ }
235
+ return values;
236
+ }
237
+ /** Parse self-describing key=value output from IIO for-loop reads.
238
+ * Input format: "in_accel_x_raw=123\nin_accel_y_raw=456\n..."
239
+ * Returns a map of attribute name → numeric value. */
240
+ function parseKeyValueOutput(text) {
241
+ const result = new Map();
242
+ for (const line of text.trim().split("\n")) {
243
+ const eq = line.indexOf("=");
244
+ if (eq === -1)
245
+ continue;
246
+ const key = line.substring(0, eq).trim();
247
+ const val = parseFloat(line.substring(eq + 1).trim());
248
+ if (key.length > 0)
249
+ result.set(key, val); // NaN preserved for missing values
250
+ }
251
+ return result;
252
+ }
253
+ /** Read a list of IIO sysfs attributes in a single shell round-trip using
254
+ * self-describing key=value output. Immune to `cat` alignment issues when
255
+ * multiple files are read together. Returns attr name → numeric value. */
256
+ async function readIioAttrs(bridge, serial, base, attrs, timeoutMs) {
257
+ if (attrs.length === 0)
258
+ return new Map();
259
+ const list = attrs.join(" ");
260
+ const result = await bridge.shell(`su -c 'for f in ${list}; do v=$(cat ${base}/$f 2>/dev/null) && echo "$f=$v" || echo "$f=NaN"; done'`, { device: serial, timeout: timeoutMs, ignoreExitCode: true });
261
+ return parseKeyValueOutput(result.stdout);
262
+ }
263
+ /** Map IIO channel type prefixes to SI units.
264
+ * Note: IIO standard specifies temperature in millidegrees Celsius after scale,
265
+ * but some drivers apply the 1000x conversion in the scale factor itself.
266
+ * The unit label "°C" is correct for most production drivers. */
267
+ function getIioUnit(channelKey) {
268
+ if (channelKey.includes("accel"))
269
+ return "m/s²";
270
+ if (channelKey.includes("anglvel"))
271
+ return "rad/s";
272
+ if (channelKey.includes("magn"))
273
+ return "Gauss";
274
+ if (channelKey.includes("pressure"))
275
+ return "kPa";
276
+ if (channelKey.includes("temp"))
277
+ return "°C";
278
+ if (channelKey.includes("illuminance"))
279
+ return "lux";
280
+ if (channelKey.includes("voltage"))
281
+ return "mV";
282
+ if (channelKey.includes("current"))
283
+ return "mA";
284
+ if (channelKey.includes("power"))
285
+ return "mW";
286
+ if (channelKey.includes("energy"))
287
+ return "mJ";
288
+ return "";
289
+ }
290
+ /** Format a power value for display with auto-scaling units. */
291
+ function formatPower(mw) {
292
+ if (mw >= 1000)
293
+ return `${(mw / 1000).toFixed(2)} W`;
294
+ if (mw >= 1)
295
+ return `${mw.toFixed(1)} mW`;
296
+ return `${(mw * 1000).toFixed(0)} μW`;
297
+ }
298
+ // ── Tool Registration ────────────────────────────────────────────────────────
299
+ export function registerSensorTools(ctx) {
300
+ // ── adb_sensor_read ─────────────────────────────────────────────────────
301
+ ctx.server.tool("adb_sensor_read", "Read current hardware sensor values from the device. Enumerates all available sensors from sensorservice and returns their last-known readings with timestamps. Sensor availability is device-dependent — the tool reports what's present. No root required.", {
302
+ category: z.enum(CATEGORIES).optional().default("all")
303
+ .describe("Filter by sensor category: all, accelerometer, gyroscope, magnetometer, light, barometer, proximity, gravity, linear_accel, rotation, orientation, motion, step, temperature"),
304
+ listOnly: z.boolean().optional().default(false)
305
+ .describe("If true, list available sensors without reading values (faster, useful for discovery)"),
306
+ device: z.string().optional().describe("Device serial"),
307
+ }, async ({ category, listOnly, device }) => {
308
+ try {
309
+ const resolved = await ctx.deviceManager.resolveDevice(device);
310
+ const serial = resolved.serial;
311
+ const bridge = ctx.bridge;
312
+ const result = await bridge.shell("dumpsys sensorservice", {
313
+ device: serial, timeout: 10000, ignoreExitCode: true,
314
+ });
315
+ const dump = result.stdout;
316
+ const sensors = parseSensorList(dump);
317
+ if (sensors.length === 0) {
318
+ return { content: [{ type: "text", text: "No sensors found in sensorservice dump." }], isError: true };
319
+ }
320
+ // Filter by category
321
+ const filtered = category === "all"
322
+ ? sensors
323
+ : sensors.filter(s => s.category === category);
324
+ if (filtered.length === 0) {
325
+ const available = [...new Set(sensors.map(s => s.category))].sort().join(", ");
326
+ return { content: [{ type: "text", text: `No sensors found for category "${category}". Available categories: ${available}` }] };
327
+ }
328
+ // List-only mode: just show sensor inventory
329
+ if (listOnly) {
330
+ const lines = [`${filtered.length} sensors (${category === "all" ? "all categories" : category}):\n`];
331
+ for (const s of filtered) {
332
+ const rateStr = formatRateRange(s.minRate, s.maxRate);
333
+ lines.push(` [${s.category}] ${s.name} (${s.vendor}) — ${s.mode}${rateStr}${s.wakeUp ? " [wake]" : ""}`);
334
+ }
335
+ const categories = [...new Set(sensors.map(s => s.category))].sort();
336
+ lines.push(`\nCategories: ${categories.join(", ")}`);
337
+ lines.push(`Total: ${sensors.length} sensors on device`);
338
+ return { content: [{ type: "text", text: lines.join("\n") }] };
339
+ }
340
+ // Full mode: sensor values
341
+ const events = parseRecentEvents(dump);
342
+ const lines = [];
343
+ lines.push(`${filtered.length} sensors (${category === "all" ? "all categories" : category}):\n`);
344
+ let withValues = 0;
345
+ for (const s of filtered) {
346
+ const event = events.get(s.name);
347
+ if (event) {
348
+ withValues++;
349
+ const valStr = formatValues(s, event.values);
350
+ lines.push(` ${s.name} (${s.vendor})`);
351
+ lines.push(` ${valStr} [${event.timestamp}]`);
352
+ }
353
+ else {
354
+ lines.push(` ${s.name} (${s.vendor})`);
355
+ lines.push(` (no recent reading — sensor may be inactive)`);
356
+ }
357
+ }
358
+ lines.push(`\n${withValues}/${filtered.length} sensors have recent readings`);
359
+ lines.push(`Total: ${sensors.length} sensors on device`);
360
+ return { content: [{ type: "text", text: lines.join("\n") }] };
361
+ }
362
+ catch (error) {
363
+ return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
364
+ }
365
+ });
366
+ // ── adb_iio_read ───────────────────────────────────────────────────────────
367
+ const IIO_BASE = "/sys/bus/iio/devices";
368
+ /**
369
+ * BA8 fix: extract `iioPath(dir)` helper for the `${IIO_BASE}/${dir}`
370
+ * pattern that appears at 4 sites (enumerate, readname, readOdpm, readGeneric).
371
+ * Single source of truth; if IIO_BASE ever needs adjustment (kernel layout
372
+ * change), only one location to update. The helper is intentionally trivial —
373
+ * it exists to give the join site a name, not to add behavior.
374
+ */
375
+ const iioPath = (dir) => `${IIO_BASE}/${dir}`;
376
+ ctx.server.tool("adb_iio_read", "Read raw hardware data from the Linux IIO (Industrial I/O) subsystem. Discovers all IIO devices and reads their current values. On Tensor/Exynos devices, this exposes per-rail power monitors (ODPM) showing real-time power consumption per SoC subsystem (CPU clusters, GPU, display, memory, TPU, GPS, etc.) — data not available through the Android sensor HAL. On other devices, may expose raw accelerometer, gyroscope, magnetometer, or ADC channels. Root required.", {
377
+ listOnly: z.boolean().optional().default(false)
378
+ .describe("If true, list available IIO devices without reading values"),
379
+ device: z.string().optional().describe("Device serial"),
380
+ }, async ({ listOnly, device }) => {
381
+ try {
382
+ const resolved = await ctx.deviceManager.resolveDevice(device);
383
+ const serial = resolved.serial;
384
+ const bridge = ctx.bridge;
385
+ // Check root availability
386
+ const rootCheck = await bridge.shell("su -c id", {
387
+ device: serial, timeout: 5000, ignoreExitCode: true,
388
+ });
389
+ if (!rootCheck.stdout.includes("uid=0")) {
390
+ return { content: [{ type: "text", text: "Root required. The IIO subsystem (/sys/bus/iio/) is not accessible without root on stock Android (SELinux blocks untrusted_app access to sysfs). Use adb_sensor_read for non-root sensor access via the Android HAL." }], isError: true };
391
+ }
392
+ // Enumerate IIO devices
393
+ // BA7 note: 'su -c "..."' uses OUTER DOUBLE QUOTES throughout this
394
+ // module (this site and the 5 below). Safe today because every
395
+ // interpolated value is either:
396
+ // - IIO_BASE: module-scope const "/sys/bus/iio/devices"
397
+ // - dev.path: regex-validated by /^iio:device\d+$/ at enum time
398
+ // - base: derived from the two above via iioPath()
399
+ // None contain dollar-sign, backtick, or double-quote, so the
400
+ // double-quote outer is safe even though shell would expand
401
+ // those metacharacters. The single-quote outer in 'readIioAttrs'
402
+ // is more defense-in-depth. Future contributor changing IIO_BASE
403
+ // to something containing a metacharacter would break this —
404
+ // switch to single-quote outer then.
405
+ const lsResult = await bridge.shell(`su -c "ls ${IIO_BASE}/ 2>/dev/null"`, {
406
+ device: serial, timeout: 5000, ignoreExitCode: true,
407
+ });
408
+ const deviceDirs = lsResult.stdout.trim().split("\n")
409
+ .map(l => l.trim())
410
+ .filter(l => l.startsWith("iio:device"))
411
+ .filter(l => /^iio:device\d+$/.test(l)); // defense-in-depth: strict naming
412
+ if (deviceDirs.length === 0) {
413
+ return { content: [{ type: "text", text: "No IIO devices found in /sys/bus/iio/devices/. This device may not expose hardware sensors or power monitors through the IIO subsystem." }] };
414
+ }
415
+ // Read device names and classify
416
+ const devices = [];
417
+ for (const dir of deviceDirs) {
418
+ const nameResult = await bridge.shell(`su -c "cat ${iioPath(dir)}/name 2>/dev/null"`, {
419
+ device: serial, timeout: 3000, ignoreExitCode: true,
420
+ });
421
+ const name = nameResult.stdout.trim() || "unknown";
422
+ devices.push({ path: dir, name, type: classifyIioDevice(name) });
423
+ }
424
+ // List-only mode
425
+ if (listOnly) {
426
+ const lines = [`${devices.length} IIO device(s):\n`];
427
+ for (const d of devices) {
428
+ lines.push(` ${d.path}: ${d.name} [${d.type}]`);
429
+ }
430
+ return { content: [{ type: "text", text: lines.join("\n") }] };
431
+ }
432
+ // Full read — handle each device type
433
+ const output = [];
434
+ for (const dev of devices) {
435
+ if (dev.type === "odpm") {
436
+ output.push(await readOdpmDevice(bridge, serial, dev));
437
+ }
438
+ else {
439
+ output.push(await readGenericIioDevice(bridge, serial, dev));
440
+ }
441
+ }
442
+ return { content: [{ type: "text", text: output.join("\n\n") }] };
443
+ }
444
+ catch (error) {
445
+ return { content: [{ type: "text", text: OutputProcessor.formatError(error) }], isError: true };
446
+ }
447
+ });
448
+ /** Read an ODPM power monitor device and return formatted output. */
449
+ async function readOdpmDevice(bridge, serial, dev) {
450
+ const base = iioPath(dev.path);
451
+ const lines = [`=== ${dev.name} (${dev.path}) — Power Monitor ===\n`];
452
+ // Parallel reads: enabled_rails, lpf_power, sampling_rate
453
+ const [railsR, powerR, rateR] = await Promise.allSettled([
454
+ bridge.shell(`su -c "cat ${base}/enabled_rails"`, { device: serial, timeout: 5000, ignoreExitCode: true }),
455
+ bridge.shell(`su -c "cat ${base}/lpf_power"`, { device: serial, timeout: 5000, ignoreExitCode: true }),
456
+ bridge.shell(`su -c "cat ${base}/sampling_rate"`, { device: serial, timeout: 3000, ignoreExitCode: true }),
457
+ ]);
458
+ const railsText = railsR.status === "fulfilled" ? railsR.value.stdout : "";
459
+ const powerText = powerR.status === "fulfilled" ? powerR.value.stdout : "";
460
+ const rateText = rateR.status === "fulfilled" ? rateR.value.stdout.trim() : "?";
461
+ const rails = parseEnabledRails(railsText);
462
+ const powerValues = parseLpfValues(powerText);
463
+ const channelCount = rails.size;
464
+ if (channelCount === 0) {
465
+ lines.push(" (no enabled channels)");
466
+ return lines.join("\n");
467
+ }
468
+ // Build channel data — lpf_power values are in μW from the ODPM driver
469
+ const channels = [];
470
+ for (const [idx, info] of rails) {
471
+ const pRaw = powerValues.get(idx) ?? 0;
472
+ channels.push({
473
+ index: idx, rail: info.rail, subsystem: info.subsystem,
474
+ powerMw: pRaw / 1000, // μW → mW
475
+ });
476
+ }
477
+ // Sort by power consumption descending
478
+ channels.sort((a, b) => b.powerMw - a.powerMw);
479
+ // Format output
480
+ lines.push(` Sampling rate: ${rateText} Hz`);
481
+ lines.push(` Channels: ${channelCount}\n`);
482
+ const totalPower = channels.reduce((sum, ch) => sum + ch.powerMw, 0);
483
+ for (const ch of channels) {
484
+ const pct = totalPower > 0 ? ((ch.powerMw / totalPower) * 100).toFixed(1) : "0.0";
485
+ lines.push(` CH${ch.index} ${ch.subsystem} (${ch.rail})`);
486
+ lines.push(` ${formatPower(ch.powerMw)} (${pct}%)`);
487
+ }
488
+ lines.push(`\n Total: ${formatPower(totalPower)}`);
489
+ return lines.join("\n");
490
+ }
491
+ /** Read a generic (non-ODPM) IIO device and return formatted output. */
492
+ async function readGenericIioDevice(bridge, serial, dev) {
493
+ const base = iioPath(dev.path);
494
+ const lines = [`=== ${dev.name} (${dev.path}) — ${dev.type === "unknown" ? "IIO Device" : dev.type} ===\n`];
495
+ // List all attributes to discover what's available
496
+ const lsResult = await bridge.shell(`su -c "ls ${base}/ 2>/dev/null"`, {
497
+ device: serial, timeout: 3000, ignoreExitCode: true,
498
+ });
499
+ const attrs = lsResult.stdout.trim().split("\n").map(a => a.trim()).filter(a => a.length > 0);
500
+ // Find raw value attributes (defense-in-depth: only allow alphanumeric + underscore)
501
+ const iioAttrSafe = /^[a-zA-Z0-9_]+$/;
502
+ const rawAttrs = attrs.filter(a => a.match(/^in_.*_raw$/) && iioAttrSafe.test(a));
503
+ const scaleAttrs = attrs.filter(a => a.match(/^in_.*_scale$/) && iioAttrSafe.test(a));
504
+ const offsetAttrs = attrs.filter(a => a.match(/^in_.*_offset$/) && iioAttrSafe.test(a));
505
+ if (rawAttrs.length === 0) {
506
+ // No raw attributes — report what's available
507
+ const interesting = attrs.filter(a => !["name", "power", "subsystem", "uevent", "dev"].includes(a));
508
+ lines.push(` No raw sensor channels found.`);
509
+ if (interesting.length > 0) {
510
+ lines.push(` Available attributes: ${interesting.join(", ")}`);
511
+ }
512
+ return lines.join("\n");
513
+ }
514
+ // Read raw values using self-describing key=value output (immune to alignment issues)
515
+ // Single-quoted su -c argument prevents outer shell expansion; $f expanded by inner su shell
516
+ const rawMap = await readIioAttrs(bridge, serial, base, rawAttrs, 10000);
517
+ // Read scales (same self-describing approach)
518
+ const scaleMap = new Map();
519
+ const scaleRaw = await readIioAttrs(bridge, serial, base, scaleAttrs, 5000);
520
+ for (const [key, val] of scaleRaw) {
521
+ scaleMap.set(key.replace("_scale", ""), val);
522
+ }
523
+ // Read offsets (same self-describing approach)
524
+ const offsetMap = new Map();
525
+ const offsetRaw = await readIioAttrs(bridge, serial, base, offsetAttrs, 5000);
526
+ for (const [key, val] of offsetRaw) {
527
+ offsetMap.set(key.replace("_offset", ""), val);
528
+ }
529
+ // Format each raw channel — lookup by attribute name, not array index
530
+ for (const attr of rawAttrs) {
531
+ const channelKey = attr.replace("_raw", "");
532
+ const raw = rawMap.get(attr) ?? NaN;
533
+ // Look up scale: try exact match, then shared scale (strip axis/index suffix)
534
+ const scale = scaleMap.get(channelKey)
535
+ ?? scaleMap.get(channelKey.replace(/_[xyz]$/, ""))
536
+ ?? scaleMap.get(channelKey.replace(/_\d+$/, ""))
537
+ ?? 1;
538
+ const offset = offsetMap.get(channelKey)
539
+ ?? offsetMap.get(channelKey.replace(/_[xyz]$/, ""))
540
+ ?? offsetMap.get(channelKey.replace(/_\d+$/, ""))
541
+ ?? 0;
542
+ const calibrated = (raw + offset) * scale;
543
+ const unit = getIioUnit(channelKey);
544
+ const label = channelKey.replace("in_", "").replace(/_/g, " ");
545
+ if (isNaN(raw)) {
546
+ lines.push(` ${label}: (no reading)`);
547
+ }
548
+ else {
549
+ lines.push(` ${label}: ${calibrated.toFixed(4)}${unit ? " " + unit : ""} (raw: ${raw})`);
550
+ }
551
+ }
552
+ return lines.join("\n");
553
+ }
554
+ }
555
+ //# sourceMappingURL=sensors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensors.js","sourceRoot":"","sources":["../../src/tools/sensors.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,sCAAsC;AACtC;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGpE,iFAAiF;AAEjF,0EAA0E;AAC1E,MAAM,eAAe,GAAuD;IAC1E,8BAA8B,EAAe,EAAE,QAAQ,EAAE,eAAe,EAAG,IAAI,EAAE,MAAM,EAAE;IACzF,+BAA+B,EAAc,EAAE,QAAQ,EAAE,cAAc,EAAI,IAAI,EAAE,IAAI,EAAE;IACvF,4BAA4B,EAAiB,EAAE,QAAQ,EAAE,aAAa,EAAK,IAAI,EAAE,GAAG,EAAE;IACtF,0BAA0B,EAAmB,EAAE,QAAQ,EAAE,WAAW,EAAO,IAAI,EAAE,OAAO,EAAE;IAC1F,sBAAsB,EAAuB,EAAE,QAAQ,EAAE,OAAO,EAAW,IAAI,EAAE,KAAK,EAAE;IACxF,yBAAyB,EAAoB,EAAE,QAAQ,EAAE,WAAW,EAAO,IAAI,EAAE,KAAK,EAAE;IACxF,0BAA0B,EAAmB,EAAE,QAAQ,EAAE,WAAW,EAAO,IAAI,EAAE,IAAI,EAAE;IACvF,wBAAwB,EAAqB,EAAE,QAAQ,EAAE,SAAS,EAAS,IAAI,EAAE,MAAM,EAAE;IACzF,oCAAoC,EAAS,EAAE,QAAQ,EAAE,cAAc,EAAI,IAAI,EAAE,MAAM,EAAE;IACzF,gCAAgC,EAAa,EAAE,QAAQ,EAAE,UAAU,EAAQ,IAAI,EAAE,EAAE,EAAE;IACrF,4CAA4C,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAG,IAAI,EAAE,IAAI,EAAE;IACvF,qCAAqC,EAAQ,EAAE,QAAQ,EAAE,UAAU,EAAQ,IAAI,EAAE,EAAE,EAAE;IACrF,uCAAuC,EAAM,EAAE,QAAQ,EAAE,WAAW,EAAO,IAAI,EAAE,OAAO,EAAE;IAC1F,mCAAmC,EAAU,EAAE,QAAQ,EAAE,QAAQ,EAAU,IAAI,EAAE,EAAE,EAAE;IACrF,8BAA8B,EAAe,EAAE,QAAQ,EAAE,MAAM,EAAY,IAAI,EAAE,EAAE,EAAE;IACrF,6BAA6B,EAAgB,EAAE,QAAQ,EAAE,MAAM,EAAY,IAAI,EAAE,OAAO,EAAE;IAC1F,4CAA4C,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAM,IAAI,EAAE,EAAE,EAAE;IACpF,8BAA8B,EAAe,EAAE,QAAQ,EAAE,QAAQ,EAAU,IAAI,EAAE,EAAE,EAAE;IACrF,gCAAgC,EAAa,EAAE,QAAQ,EAAE,QAAQ,EAAU,IAAI,EAAE,EAAE,EAAE;IACrF,mCAAmC,EAAU,EAAE,QAAQ,EAAE,aAAa,EAAK,IAAI,EAAE,EAAE,EAAE;IACrF,2CAA2C,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAG,IAAI,EAAE,MAAM,EAAE;CAC1F,CAAC;AAEF,qDAAqD;AACrD,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO;IAC5D,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU;IAC/D,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa;CACtC,CAAC;AAsBX,gFAAgF;AAEhF,mEAAmE;AACnE,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;IAE3F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhC,mFAAmF;IACnF,MAAM,UAAU,GAAa,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,gCAAgC;IAChC,iHAAiH;IACjH,kFAAkF;IAClF,MAAM,UAAU,GAAG,mGAAmG,CAAC;IACvH,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEvC,8DAA8D;QAC9D,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,UAAU,CAAC,GAAG,CAAE,IAAI,KAAK,CAAC,KAAK;gBAAE,EAAE,GAAG,GAAG,CAAC;;gBAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,SAAS,GAAG,EAAE,CAAC;QAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACxF,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAE/E,mDAAmD;QACnD,IAAI,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,OAAO,CAAC;QAC7C,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,QAAQ,GAAG,aAAa,CAAC;YACzB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI;YACnD,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;YACjC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;YAC1D,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;YAC1D,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1D,IAAI,WAAW,KAAK,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC;IAErG,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;IAC9D,IAAI,MAA8B,CAAC;IACnC,MAAM,SAAS,GAA2D,EAAE,CAAC;IAE7E,OAAO,CAAC,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACpF,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEnD,gDAAgD;QAChD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACnB,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;YACtC,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,4EAA4E;AAC5E,SAAS,YAAY,CAAC,MAAkB,EAAE,MAAgB;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACtB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,eAAe,CAAC;QACrB,KAAK,SAAS,CAAC;QACf,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC;gBACvB,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBACzF,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEpE,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC;gBACvB,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBACzF,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC;gBACvB,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBACzF,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,KAAK,OAAO,CAAC,CAAO,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAClE,KAAK,WAAW,CAAC,CAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAClE,KAAK,WAAW,CAAC,CAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAClE,KAAK,aAAa,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM,CAAC,CAAQ,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACzE;YACE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,eAAe,CAAC,OAAe,EAAE,OAAe;IACvD,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,KAAK,GAAG,CAAC;IAC/B,IAAI,MAAM,IAAI,MAAM;QAAE,OAAO,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC;IACvD,IAAI,MAAM;QAAE,OAAO,KAAK,OAAO,EAAE,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,WAAW,OAAO,EAAE,CAAC;IACxC,OAAO,EAAE,CAAC;AACZ,CAAC;AAaD,gFAAgF;AAEhF,wDAAwD;AACxD,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACvE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,OAAO,CAAC;IACtG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wEAAwE;AACxE,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C,CAAC;IACrE,gCAAgC;IAChC,MAAM,KAAK,GAAG,8BAA8B,CAAC;IAC7C,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kDAAkD;AAClD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,gCAAgC;IAChC,MAAM,KAAK,GAAG,+BAA+B,CAAC;IAC9C,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;uDAEuD;AACvD,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAE,mCAAmC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;2EAE2E;AAC3E,KAAK,UAAU,YAAY,CACzB,MAAqF,EACrF,MAAc,EACd,IAAY,EACZ,KAAe,EACf,SAAiB;IAEjB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,mBAAmB,IAAI,gBAAgB,IAAI,0DAA0D,EACrG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,CAC7D,CAAC;IACF,OAAO,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;iEAGiE;AACjE,SAAS,UAAU,CAAC,UAAkB;IACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,CAAC;IACnD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gEAAgE;AAChE,SAAS,WAAW,CAAC,EAAU;IAC7B,IAAI,EAAE,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACxC,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAElD,2EAA2E;IAE3E,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,iBAAiB,EACjB,8PAA8P,EAC9P;QACE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;aACnD,QAAQ,CAAC,8KAA8K,CAAC;QAC3L,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;aAC5C,QAAQ,CAAC,uFAAuF,CAAC;QACpG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACzD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI;aACrD,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACzG,CAAC;YAED,qBAAqB;YACrB,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAK;gBACjC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,QAAQ,4BAA4B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;YAClI,CAAC;YAED,6CAA6C;YAC7C,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,aAAa,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC;gBACtG,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;oBACtD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5G,CAAC;gBACD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrD,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;gBACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;YAED,2BAA2B;YAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,aAAa,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC;YAElG,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,KAAK,EAAE,CAAC;oBACV,UAAU,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,MAAM,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,+BAA+B,CAAC,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,8EAA8E;IAE9E,MAAM,QAAQ,GAAG,sBAAsB,CAAC;IAExC;;;;;;OAMG;IACH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC;IAE9D,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,cAAc,EACd,gdAAgd,EAChd;QACE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;aAC5C,QAAQ,CAAC,4DAA4D,CAAC;QACzE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAE1B,0BAA0B;YAC1B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE;gBAC/C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;aACpD,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sNAAsN,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACtR,CAAC;YAED,wBAAwB;YACxB,mEAAmE;YACnE,+DAA+D;YAC/D,gCAAgC;YAChC,0DAA0D;YAC1D,kEAAkE;YAClE,qDAAqD;YACrD,8DAA8D;YAC9D,4DAA4D;YAC5D,iEAAiE;YACjE,iEAAiE;YACjE,6DAA6D;YAC7D,qCAAqC;YACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,gBAAgB,EAAE;gBACzE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;aACpD,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAClD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;iBACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,kCAAkC;YAE9E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yIAAyI,EAAE,CAAC,EAAE,CAAC;YAC1L,CAAC;YAED,iCAAiC;YACjC,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE;oBACpF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;iBACpD,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,iBAAiB;YACjB,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;gBACrD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;gBACnD,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;YAED,sCAAsC;YACtC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,KAAK,UAAU,cAAc,CAAC,MAAyB,EAAE,MAAc,EAAE,GAAc;QACrF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAa,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAEhF,0DAA0D;QAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YAC1G,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACtG,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;SAC3G,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAEhF,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC;QAEhC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,uEAAuE;QACvE,MAAM,QAAQ,GAA0E,EAAE,CAAC;QAC3F,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACtD,OAAO,EAAE,IAAI,GAAG,IAAI,EAAG,UAAU;aAClC,CAAC,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAE/C,gBAAgB;QAChB,KAAK,CAAC,IAAI,CAAC,oBAAoB,QAAQ,KAAK,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,eAAe,YAAY,IAAI,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACxE,KAAK,UAAU,oBAAoB,CAAC,MAAyB,EAAE,MAAc,EAAE,GAAc;QAC3F,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAa,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC;QAEtH,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,gBAAgB,EAAE;YACrE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;SACpD,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE9F,qFAAqF;QACrF,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAExF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,8CAA8C;YAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACpG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC9C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,sFAAsF;QACtF,6FAA6F;QAC7F,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEzE,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,+CAA+C;QAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9E,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;YACnC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,sEAAsE;QACtE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;YAEpC,8EAA8E;YAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;mBACjC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;mBAC/C,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;mBAC7C,CAAC,CAAC;YACP,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;mBACnC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;mBAChD,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;mBAC9C,CAAC,CAAC;YACP,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;YAE1C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE/D,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAkEzD"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAEA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAyEzD"}
@@ -1,3 +1,5 @@
1
+ // Copyright 2026 Jason <fullread@github>
2
+ // SPDX-License-Identifier: Apache-2.0
1
3
  /**
2
4
  * Shell Tools — Execute arbitrary shell commands on the device.
3
5
  */
@@ -53,6 +55,13 @@ export function registerShellTools(ctx) {
53
55
  if (result.stderr) {
54
56
  output += `\n--- STDERR ---\n${result.stderr}`;
55
57
  }
58
+ // BB6 fix: surface non-zero exit code for parity with adb_shell.
59
+ // Before this fix, a failing root command silently returned stdout
60
+ // (possibly empty) while adb_shell surfaced the exit code suffix.
61
+ // Asymmetric — corrected.
62
+ if (result.exitCode !== 0) {
63
+ output += `\n--- Exit code: ${result.exitCode} ---`;
64
+ }
56
65
  return { content: [{ type: "text", text: OutputProcessor.process(output) }] };
57
66
  }
58
67
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}