@glassmkr/crucible 0.11.0 → 0.12.0
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.
- package/dist/collect/__tests__/c11-c18.test.d.ts +1 -0
- package/dist/collect/__tests__/c11-c18.test.js +375 -0
- package/dist/collect/__tests__/c11-c18.test.js.map +1 -0
- package/dist/collect/__tests__/systemd.test.js +10 -1
- package/dist/collect/__tests__/systemd.test.js.map +1 -1
- package/dist/collect/cve.d.ts +51 -0
- package/dist/collect/cve.js +327 -0
- package/dist/collect/cve.js.map +1 -0
- package/dist/collect/dmesg-events.d.ts +32 -0
- package/dist/collect/dmesg-events.js +196 -0
- package/dist/collect/dmesg-events.js.map +1 -0
- package/dist/collect/ethtool.d.ts +29 -0
- package/dist/collect/ethtool.js +99 -0
- package/dist/collect/ethtool.js.map +1 -0
- package/dist/collect/ipmi.d.ts +19 -1
- package/dist/collect/ipmi.js +39 -2
- package/dist/collect/ipmi.js.map +1 -1
- package/dist/collect/lvm.d.ts +39 -0
- package/dist/collect/lvm.js +102 -0
- package/dist/collect/lvm.js.map +1 -0
- package/dist/collect/smart.d.ts +25 -0
- package/dist/collect/smart.js +36 -0
- package/dist/collect/smart.js.map +1 -1
- package/dist/collect/softnet.d.ts +17 -0
- package/dist/collect/softnet.js +82 -0
- package/dist/collect/softnet.js.map +1 -0
- package/dist/collect/systemd.d.ts +27 -2
- package/dist/collect/systemd.js +98 -5
- package/dist/collect/systemd.js.map +1 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/types.d.ts +103 -1
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// ethtool advertised link-mode collection.
|
|
2
|
+
//
|
|
3
|
+
// network.ts collects current speed via /sys/class/net/<iface>/speed.
|
|
4
|
+
// C15 (2026-05-19) adds the advertised modes from `ethtool <iface>` so
|
|
5
|
+
// Dashboard's link_speed_mismatch rule can compare current vs highest
|
|
6
|
+
// advertised. A 1 Gb/s link on a 10 Gb/s NIC isn't always wrong (the
|
|
7
|
+
// switch port might also be 1 Gb/s) but is worth surfacing.
|
|
8
|
+
//
|
|
9
|
+
// Per CC_SPEC_CRUCIBLE_C11_C18_FULL_BUNDLE_2026-05-19.md §1.3.
|
|
10
|
+
//
|
|
11
|
+
// Capability gating: `ethtool` missing (some containers lack it) ->
|
|
12
|
+
// available: false. Per-interface read failures are tolerated; the
|
|
13
|
+
// snapshot ships data for whatever interfaces returned cleanly.
|
|
14
|
+
import { readdirSync } from "fs";
|
|
15
|
+
import { run } from "../lib/exec.js";
|
|
16
|
+
const VIRTUAL_PREFIXES = ["lo", "veth", "docker", "br-", "virbr"];
|
|
17
|
+
function listPhysicalInterfaces() {
|
|
18
|
+
try {
|
|
19
|
+
const all = readdirSync("/sys/class/net");
|
|
20
|
+
return all.filter((iface) => iface !== "lo" &&
|
|
21
|
+
!VIRTUAL_PREFIXES.some((p) => iface.startsWith(p)));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function collectEthtool() {
|
|
28
|
+
const probe = await run("ethtool", ["--version"]);
|
|
29
|
+
if (!probe) {
|
|
30
|
+
return {
|
|
31
|
+
available: false,
|
|
32
|
+
reason: "ethtool not installed",
|
|
33
|
+
interfaces: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const interfaces = listPhysicalInterfaces();
|
|
37
|
+
if (interfaces.length === 0) {
|
|
38
|
+
return { available: true, interfaces: [] };
|
|
39
|
+
}
|
|
40
|
+
const results = [];
|
|
41
|
+
for (const iface of interfaces) {
|
|
42
|
+
const out = await run("ethtool", [iface]);
|
|
43
|
+
if (!out)
|
|
44
|
+
continue; // per-interface read failure tolerated
|
|
45
|
+
results.push(parseEthtoolOutput(iface, out));
|
|
46
|
+
}
|
|
47
|
+
return { available: true, interfaces: results };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse the relevant subset of `ethtool <iface>` output.
|
|
51
|
+
*
|
|
52
|
+
* The two fields of interest:
|
|
53
|
+
*
|
|
54
|
+
* Advertised auto-negotiation: Yes|No
|
|
55
|
+
* Advertised link modes: 10baseT/Half 10baseT/Full
|
|
56
|
+
* 100baseT/Half 100baseT/Full
|
|
57
|
+
* 1000baseT/Full
|
|
58
|
+
*
|
|
59
|
+
* Advertised link modes can span multiple lines (continuation lines
|
|
60
|
+
* are indented). We collect everything from the colon to the next
|
|
61
|
+
* non-continuation line.
|
|
62
|
+
*/
|
|
63
|
+
export function parseEthtoolOutput(iface, raw) {
|
|
64
|
+
const lines = raw.split("\n");
|
|
65
|
+
let auto = null;
|
|
66
|
+
const modes = [];
|
|
67
|
+
for (let i = 0; i < lines.length; i++) {
|
|
68
|
+
const line = lines[i];
|
|
69
|
+
if (/^\s*Advertised auto-negotiation:/i.test(line)) {
|
|
70
|
+
const val = line.split(":").slice(1).join(":").trim();
|
|
71
|
+
auto = val.toLowerCase() === "yes";
|
|
72
|
+
}
|
|
73
|
+
else if (/^\s*Advertised link modes:/i.test(line)) {
|
|
74
|
+
// Continuation lines are indented and have no colon at the
|
|
75
|
+
// expected key position. Walk forward until we hit a line that
|
|
76
|
+
// looks like a new key (Word: at start).
|
|
77
|
+
let buf = line.split(":").slice(1).join(":").trim();
|
|
78
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
79
|
+
const cont = lines[j];
|
|
80
|
+
if (/^\s*[A-Za-z][^:]*:/.test(cont) && !/^\s/.test(cont))
|
|
81
|
+
break;
|
|
82
|
+
if (!/^\s+\S/.test(cont))
|
|
83
|
+
break;
|
|
84
|
+
buf += " " + cont.trim();
|
|
85
|
+
}
|
|
86
|
+
for (const token of buf.split(/\s+/)) {
|
|
87
|
+
if (token.length > 0)
|
|
88
|
+
modes.push(token);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
iface,
|
|
94
|
+
advertised_auto_negotiation: auto,
|
|
95
|
+
advertised_link_modes: modes,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export const __test_only = { parseEthtoolOutput };
|
|
99
|
+
//# sourceMappingURL=ethtool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ethtool.js","sourceRoot":"","sources":["../../src/collect/ethtool.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,sEAAsE;AACtE,qEAAqE;AACrE,4DAA4D;AAC5D,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,oEAAoE;AACpE,mEAAmE;AACnE,gEAAgE;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAcrC,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAElE,SAAS,sBAAsB;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,IAAI;YACd,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,uBAAuB;YAC/B,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,SAAS,CAAC,uCAAuC;QAC3D,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,GAAmB,IAAI,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACtD,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QACrC,CAAC;aAAM,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,2DAA2D;YAC3D,+DAA+D;YAC/D,yCAAyC;YACzC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM;gBAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM;gBAChC,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,2BAA2B,EAAE,IAAI;QACjC,qBAAqB,EAAE,KAAK;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/collect/ipmi.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import type { IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.js";
|
|
1
|
+
import type { BmcVendor, IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* C11 (2026-05-19): map DMI vendor to BMC vendor + parser quality tier.
|
|
4
|
+
*
|
|
5
|
+
* Fleet-tested: dell, hpe, supermicro (years of fleet validation; SEL
|
|
6
|
+
* classifier confirmed against real-host event streams).
|
|
7
|
+
* Stub: lenovo, cisco, openbmc (parser ships but unvalidated against
|
|
8
|
+
* real fleet data; first real customer per vendor surfaces gaps).
|
|
9
|
+
* Unknown: everything else (asrockrack, inspur, generic, virtual, ...);
|
|
10
|
+
* classifier still runs (it's keyword-driven, vendor-agnostic) but
|
|
11
|
+
* we tag the events honestly.
|
|
12
|
+
*/
|
|
13
|
+
declare function mapVendorToBmcVendor(vendor: Vendor): BmcVendor;
|
|
14
|
+
declare function parserQualityFor(bmcVendor: BmcVendor): "fleet-tested" | "stub" | "unknown";
|
|
2
15
|
/**
|
|
3
16
|
* Collect IPMI snapshot.
|
|
4
17
|
*
|
|
@@ -10,6 +23,10 @@ import type { IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.j
|
|
|
10
23
|
* and back-compat).
|
|
11
24
|
*/
|
|
12
25
|
export declare function collectIpmi(vendor?: Vendor, capability?: IpmiCapability): Promise<IpmiInfo>;
|
|
26
|
+
export declare const __test_only_c11: {
|
|
27
|
+
mapVendorToBmcVendor: typeof mapVendorToBmcVendor;
|
|
28
|
+
parserQualityFor: typeof parserQualityFor;
|
|
29
|
+
};
|
|
13
30
|
/**
|
|
14
31
|
* Re-parse the full SEL elist counting ECC events on the Memory entity.
|
|
15
32
|
* Used for vendors (notably Dell) that don't expose ECC counters as
|
|
@@ -29,3 +46,4 @@ export declare function parseSelTimestamp(date: string, time: string): string;
|
|
|
29
46
|
export declare function classifySensor(sensor: string): string;
|
|
30
47
|
export declare function deriveSelSeverity(event: string, sensorType: string): string;
|
|
31
48
|
export declare function parseFanStatus(output: string): FanStatus[];
|
|
49
|
+
export {};
|
package/dist/collect/ipmi.js
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
import { run } from "../lib/exec.js";
|
|
2
|
+
/**
|
|
3
|
+
* C11 (2026-05-19): map DMI vendor to BMC vendor + parser quality tier.
|
|
4
|
+
*
|
|
5
|
+
* Fleet-tested: dell, hpe, supermicro (years of fleet validation; SEL
|
|
6
|
+
* classifier confirmed against real-host event streams).
|
|
7
|
+
* Stub: lenovo, cisco, openbmc (parser ships but unvalidated against
|
|
8
|
+
* real fleet data; first real customer per vendor surfaces gaps).
|
|
9
|
+
* Unknown: everything else (asrockrack, inspur, generic, virtual, ...);
|
|
10
|
+
* classifier still runs (it's keyword-driven, vendor-agnostic) but
|
|
11
|
+
* we tag the events honestly.
|
|
12
|
+
*/
|
|
13
|
+
function mapVendorToBmcVendor(vendor) {
|
|
14
|
+
if (vendor === "dell" || vendor === "hpe" || vendor === "supermicro")
|
|
15
|
+
return vendor;
|
|
16
|
+
if (vendor === "lenovo" || vendor === "cisco")
|
|
17
|
+
return vendor;
|
|
18
|
+
// OpenBMC isn't a DMI vendor; it would surface as "generic" with a
|
|
19
|
+
// BMC manufacturer of "OpenBMC Project" in ipmitool mc info. We'd
|
|
20
|
+
// need to probe that to identify; deferred to a follow-up.
|
|
21
|
+
return "unknown";
|
|
22
|
+
}
|
|
23
|
+
function parserQualityFor(bmcVendor) {
|
|
24
|
+
if (bmcVendor === "dell" || bmcVendor === "hpe" || bmcVendor === "supermicro") {
|
|
25
|
+
return "fleet-tested";
|
|
26
|
+
}
|
|
27
|
+
if (bmcVendor === "lenovo" || bmcVendor === "cisco" || bmcVendor === "openbmc") {
|
|
28
|
+
return "stub";
|
|
29
|
+
}
|
|
30
|
+
return "unknown";
|
|
31
|
+
}
|
|
2
32
|
import { isPsuRedundancySensor, classifyPsuRedundancyState } from "../lib/vendor-sensors.js";
|
|
3
33
|
import { filterRedundantCpuDtsSensors } from "../lib/ipmi-sensor-filter.js";
|
|
4
34
|
/**
|
|
@@ -83,8 +113,13 @@ export async function collectIpmi(vendor = "generic", capability) {
|
|
|
83
113
|
if (match)
|
|
84
114
|
selCount = parseInt(match[1], 10);
|
|
85
115
|
}
|
|
86
|
-
// SEL recent events
|
|
87
|
-
|
|
116
|
+
// SEL recent events. C11 (2026-05-19): tag each event with the BMC
|
|
117
|
+
// vendor's parser_quality so Dashboard can render an honesty surface
|
|
118
|
+
// for stub-parser BMCs (Lenovo, Cisco, OpenBMC).
|
|
119
|
+
const bmcVendor = mapVendorToBmcVendor(vendor);
|
|
120
|
+
const selParserQuality = parserQualityFor(bmcVendor);
|
|
121
|
+
const selEventsRaw = await collectSelEvents();
|
|
122
|
+
const selEvents = selEventsRaw.map((e) => ({ ...e, parser_quality: selParserQuality }));
|
|
88
123
|
// ECC errors from SEL events (Dell iDRAC reports memory ECC only via SEL).
|
|
89
124
|
// Counts ALL events since last SEL clear, not just the recent window —
|
|
90
125
|
// re-parse the full SEL elist for accurate cumulative counts.
|
|
@@ -104,6 +139,7 @@ export async function collectIpmi(vendor = "generic", capability) {
|
|
|
104
139
|
const fans = await collectFanStatus();
|
|
105
140
|
return {
|
|
106
141
|
available: true,
|
|
142
|
+
bmc_vendor: bmcVendor,
|
|
107
143
|
sensors,
|
|
108
144
|
ecc_errors: { correctable, uncorrectable },
|
|
109
145
|
ecc_errors_from_sel: selEccCounts,
|
|
@@ -114,6 +150,7 @@ export async function collectIpmi(vendor = "generic", capability) {
|
|
|
114
150
|
detection: capability,
|
|
115
151
|
};
|
|
116
152
|
}
|
|
153
|
+
export const __test_only_c11 = { mapVendorToBmcVendor, parserQualityFor };
|
|
117
154
|
/**
|
|
118
155
|
* Re-parse the full SEL elist counting ECC events on the Memory entity.
|
|
119
156
|
* Used for vendors (notably Dell) that don't expose ECC counters as
|
package/dist/collect/ipmi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipmi.js","sourceRoot":"","sources":["../../src/collect/ipmi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,SAAS,EAAE,UAA2B;IACvF,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,mEAAmE;QACnE,sEAAsE;QACtE,uDAAuD;QACvD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,UAAU;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,UAAU;SACtB,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,GAAwB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAoB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAErE,IAAI,aAAiC,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,aAAa,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,sEAAsE;IACtE,iEAAiE;IACjE,uEAAuE;IACvE,oEAAoE;IACpE,qCAAqC;IACrC,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEhD,sCAAsC;IACtC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrE,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvE,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACpD,IAAI,KAAK;YAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,oBAAoB;IACpB,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE3C,2EAA2E;IAC3E,uEAAuE;IACvE,8DAA8D;IAC9D,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEjD,oEAAoE;IACpE,IAAI,kBAAkD,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI;gBACvD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAE,sDAAsD;gBACzE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACrB,kBAAkB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAEtC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO;QACP,UAAU,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1C,mBAAmB,EAAE,YAAY;QACjC,oBAAoB,EAAE,kBAAkB;QACxC,iBAAiB,EAAE,QAAQ;QAC3B,iBAAiB,EAAE,SAAS;QAC5B,IAAI;QACJ,SAAS,EAAE,UAAU;KACtB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACvF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,uEAAuE;QACvE,mEAAmE;QACnE,4CAA4C;QAC5C,MAAM,eAAe,GACnB,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC9B,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5B,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,eAAe;YAAE,SAAS;QAC/B,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1E,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7E,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM;YAAE,MAAM,GAAG,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;QAE5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnC,iEAAiE;QACjE,0EAA0E;QAC1E,wCAAwC;QACxC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,SAAS;YACT,MAAM;YACN,WAAW,EAAE,UAAU;YACvB,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,UAAU;YAClC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,wDAAwD;IACxD,6CAA6C;IAC7C,0DAA0D;IAC1D,yBAAyB;IACzB,eAAe;IACf,kEAAkE;IAClE,oEAAoE;IACpE,wEAAwE;IACxE,+DAA+D;IAC/D,6CAA6C;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,kDAAkD;QAClD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7E,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC;IAClF,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,UAAkB;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,kBAAkB;IAClB,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IACvD,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,UAAU,CAAC;IACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,UAAU,CAAC;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IAEvD,iBAAiB;IACjB,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAEjD,cAAc;IACd,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,MAAM,CAAC;IACvD,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,MAAM,GAAG,IAAI,CAAC;QAElB,yDAAyD;QACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC;QACtE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAElD,IAAI,WAAW;YAAE,MAAM,GAAG,UAAU,CAAC;aAChC,IAAI,UAAU;YAAE,MAAM,GAAG,SAAS,CAAC;aACnC,IAAI,SAAS;YAAE,MAAM,GAAG,QAAQ,CAAC;aACjC,IAAI,KAAK;YAAE,MAAM,GAAG,IAAI,CAAC;aACzB,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,GAAG,UAAU,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"ipmi.js","sourceRoot":"","sources":["../../src/collect/ipmi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAGrC;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC;IACpF,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IAC7D,mEAAmE;IACnE,kEAAkE;IAClE,2DAA2D;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAoB;IAC5C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC9E,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC/E,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,SAAS,EAAE,UAA2B;IACvF,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,mEAAmE;QACnE,sEAAsE;QACtE,uDAAuD;QACvD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,UAAU;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,EAAE;YACrB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,UAAU;SACtB,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,GAAwB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAoB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAErE,IAAI,aAAiC,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,aAAa,GAAG,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,sEAAsE;IACtE,iEAAiE;IACjE,uEAAuE;IACvE,oEAAoE;IACpE,qCAAqC;IACrC,OAAO,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAEhD,sCAAsC;IACtC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrE,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvE,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACpD,IAAI,KAAK;YAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,mEAAmE;IACnE,qEAAqE;IACrE,iDAAiD;IACjD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAExF,2EAA2E;IAC3E,uEAAuE;IACvE,8DAA8D;IAC9D,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEjD,oEAAoE;IACpE,IAAI,kBAAkD,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI;gBACvD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAE,sDAAsD;gBACzE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACrB,kBAAkB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAEtC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,SAAS;QACrB,OAAO;QACP,UAAU,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1C,mBAAmB,EAAE,YAAY;QACjC,oBAAoB,EAAE,kBAAkB;QACxC,iBAAiB,EAAE,QAAQ;QAC3B,iBAAiB,EAAE,SAAS;QAC5B,IAAI;QACJ,SAAS,EAAE,UAAU;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AAE1E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACvF,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,uEAAuE;QACvE,mEAAmE;QACnE,4CAA4C;QAC5C,MAAM,eAAe,GACnB,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC9B,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC5B,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,eAAe;YAAE,SAAS;QAC/B,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1E,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7E,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM;YAAE,MAAM,GAAG,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;QAE5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnC,iEAAiE;QACjE,0EAA0E;QAC1E,wCAAwC;QACxC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,SAAS;YACT,MAAM;YACN,WAAW,EAAE,UAAU;YACvB,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,UAAU;YAClC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY;IAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,wDAAwD;IACxD,6CAA6C;IAC7C,0DAA0D;IAC1D,yBAAyB;IACzB,eAAe;IACf,kEAAkE;IAClE,oEAAoE;IACpE,wEAAwE;IACxE,+DAA+D;IAC/D,6CAA6C;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,kDAAkD;QAClD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,OAAO,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC7E,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC;IAClF,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,UAAkB;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,kBAAkB;IAClB,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IACvD,IAAI,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,UAAU,CAAC;IACpD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,UAAU,CAAC;IACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IAEvD,iBAAiB;IACjB,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,KAAK,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAEjD,cAAc;IACd,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,MAAM,CAAC;IACvD,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,MAAM,GAAG,IAAI,CAAC;QAElB,yDAAyD;QACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC;QACtE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAElD,IAAI,WAAW;YAAE,MAAM,GAAG,UAAU,CAAC;aAChC,IAAI,UAAU;YAAE,MAAM,GAAG,SAAS,CAAC;aACnC,IAAI,SAAS;YAAE,MAAM,GAAG,QAAQ,CAAC;aACjC,IAAI,KAAK;YAAE,MAAM,GAAG,IAAI,CAAC;aACzB,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,GAAG,UAAU,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface LvmThinPool {
|
|
2
|
+
lv_name: string;
|
|
3
|
+
vg_name: string;
|
|
4
|
+
data_percent: number;
|
|
5
|
+
metadata_percent: number;
|
|
6
|
+
}
|
|
7
|
+
export interface LvmSnapshot {
|
|
8
|
+
available: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
thin_pools: LvmThinPool[];
|
|
11
|
+
}
|
|
12
|
+
export declare function collectLvm(): Promise<LvmSnapshot>;
|
|
13
|
+
/**
|
|
14
|
+
* `lvs --reportformat=json` returns a structure like:
|
|
15
|
+
* {
|
|
16
|
+
* "report": [
|
|
17
|
+
* { "lv": [
|
|
18
|
+
* { "lv_name": "thinpool", "vg_name": "vg0",
|
|
19
|
+
* "lv_attr": "twi-aotz--", "data_percent": "45.20",
|
|
20
|
+
* "metadata_percent": "12.30" },
|
|
21
|
+
* ...
|
|
22
|
+
* ] }
|
|
23
|
+
* ]
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* lv_attr position 0 is the volume type: `t` = thin pool, `V` = thin
|
|
27
|
+
* volume, `o` = origin, etc. We only care about thin pools here.
|
|
28
|
+
*
|
|
29
|
+
* Empty pool sets (host has LVM but no thin pools) return an empty
|
|
30
|
+
* array with available: true; that's a useful signal to the
|
|
31
|
+
* dashboard ("LVM here, just nothing to alert on").
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseLvsJson(raw: string): LvmThinPool[] | null;
|
|
34
|
+
declare function parsePercent(v: unknown): number;
|
|
35
|
+
export declare const __test_only: {
|
|
36
|
+
parseLvsJson: typeof parseLvsJson;
|
|
37
|
+
parsePercent: typeof parsePercent;
|
|
38
|
+
};
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// LVM thin pool metadata collection.
|
|
2
|
+
//
|
|
3
|
+
// LVM thin pools use a separate metadata volume from data. Metadata
|
|
4
|
+
// exhaustion is silent and catastrophic; writes fail in unpredictable
|
|
5
|
+
// ways once the metadata volume fills. Dashboard's
|
|
6
|
+
// lvm_thinpool_metadata_high rule pages on this.
|
|
7
|
+
//
|
|
8
|
+
// Capability gating: `lvs` binary absent (no LVM on the host) yields
|
|
9
|
+
// available: false; we never error on a host that simply doesn't run
|
|
10
|
+
// LVM.
|
|
11
|
+
//
|
|
12
|
+
// Per CC_SPEC_CRUCIBLE_C11_C18_FULL_BUNDLE_2026-05-19.md §1.2.
|
|
13
|
+
import { run } from "../lib/exec.js";
|
|
14
|
+
export async function collectLvm() {
|
|
15
|
+
const out = await run("lvs", [
|
|
16
|
+
"--reportformat=json",
|
|
17
|
+
"--options=lv_name,vg_name,lv_attr,data_percent,metadata_percent",
|
|
18
|
+
"--units=b",
|
|
19
|
+
"--noheadings",
|
|
20
|
+
]);
|
|
21
|
+
if (!out) {
|
|
22
|
+
return {
|
|
23
|
+
available: false,
|
|
24
|
+
reason: "lvs not available (LVM not installed?)",
|
|
25
|
+
thin_pools: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const parsed = parseLvsJson(out);
|
|
29
|
+
if (parsed === null) {
|
|
30
|
+
return {
|
|
31
|
+
available: false,
|
|
32
|
+
reason: "lvs output did not parse",
|
|
33
|
+
thin_pools: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return { available: true, thin_pools: parsed };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `lvs --reportformat=json` returns a structure like:
|
|
40
|
+
* {
|
|
41
|
+
* "report": [
|
|
42
|
+
* { "lv": [
|
|
43
|
+
* { "lv_name": "thinpool", "vg_name": "vg0",
|
|
44
|
+
* "lv_attr": "twi-aotz--", "data_percent": "45.20",
|
|
45
|
+
* "metadata_percent": "12.30" },
|
|
46
|
+
* ...
|
|
47
|
+
* ] }
|
|
48
|
+
* ]
|
|
49
|
+
* }
|
|
50
|
+
*
|
|
51
|
+
* lv_attr position 0 is the volume type: `t` = thin pool, `V` = thin
|
|
52
|
+
* volume, `o` = origin, etc. We only care about thin pools here.
|
|
53
|
+
*
|
|
54
|
+
* Empty pool sets (host has LVM but no thin pools) return an empty
|
|
55
|
+
* array with available: true; that's a useful signal to the
|
|
56
|
+
* dashboard ("LVM here, just nothing to alert on").
|
|
57
|
+
*/
|
|
58
|
+
export function parseLvsJson(raw) {
|
|
59
|
+
let parsed;
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const report = parsed?.report;
|
|
67
|
+
if (!Array.isArray(report) || report.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
const lvs = report[0]?.lv;
|
|
70
|
+
if (!Array.isArray(lvs))
|
|
71
|
+
return [];
|
|
72
|
+
const pools = [];
|
|
73
|
+
for (const entry of lvs) {
|
|
74
|
+
const attr = typeof entry.lv_attr === "string" ? entry.lv_attr : "";
|
|
75
|
+
if (attr.charAt(0) !== "t")
|
|
76
|
+
continue; // not a thin pool
|
|
77
|
+
const lvName = typeof entry.lv_name === "string" ? entry.lv_name : "";
|
|
78
|
+
const vgName = typeof entry.vg_name === "string" ? entry.vg_name : "";
|
|
79
|
+
const dataPct = parsePercent(entry.data_percent);
|
|
80
|
+
const metaPct = parsePercent(entry.metadata_percent);
|
|
81
|
+
if (!lvName || !vgName)
|
|
82
|
+
continue;
|
|
83
|
+
pools.push({
|
|
84
|
+
lv_name: lvName,
|
|
85
|
+
vg_name: vgName,
|
|
86
|
+
data_percent: dataPct,
|
|
87
|
+
metadata_percent: metaPct,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return pools;
|
|
91
|
+
}
|
|
92
|
+
function parsePercent(v) {
|
|
93
|
+
if (typeof v === "number")
|
|
94
|
+
return v;
|
|
95
|
+
if (typeof v === "string") {
|
|
96
|
+
const n = Number.parseFloat(v);
|
|
97
|
+
return Number.isFinite(n) ? n : 0;
|
|
98
|
+
}
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
export const __test_only = { parseLvsJson, parsePercent };
|
|
102
|
+
//# sourceMappingURL=lvm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lvm.js","sourceRoot":"","sources":["../../src/collect/lvm.ts"],"names":[],"mappings":"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"}
|
package/dist/collect/smart.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ export declare function parseSmartctlJson(data: Record<string, unknown> & {
|
|
|
15
15
|
nvme_smart_health_information_log?: {
|
|
16
16
|
percentage_used?: number;
|
|
17
17
|
temperature?: number;
|
|
18
|
+
/** NVMe Critical Warning byte (NVM Express spec §5.21). */
|
|
19
|
+
critical_warning?: number;
|
|
20
|
+
available_spare?: number;
|
|
21
|
+
available_spare_threshold?: number;
|
|
18
22
|
};
|
|
19
23
|
ata_smart_attributes?: {
|
|
20
24
|
table?: Array<{
|
|
@@ -26,3 +30,24 @@ export declare function parseSmartctlJson(data: Record<string, unknown> & {
|
|
|
26
30
|
}>;
|
|
27
31
|
};
|
|
28
32
|
}, device: string): SmartInfo;
|
|
33
|
+
/**
|
|
34
|
+
* Decode the NVMe Critical Warning byte (NVM Express spec §5.21):
|
|
35
|
+
* bit 0: available spare below threshold
|
|
36
|
+
* bit 1: temperature outside operating range
|
|
37
|
+
* bit 2: NVM subsystem reliability degraded
|
|
38
|
+
* bit 3: media in read-only mode
|
|
39
|
+
* bit 4: volatile memory backup device has failed
|
|
40
|
+
* bit 5: persistent memory region became read-only (NVMe 1.4+)
|
|
41
|
+
*
|
|
42
|
+
* Bit ordering differs across docs; this implementation follows the
|
|
43
|
+
* spec verbatim. Any non-zero bit is a vendor-recommended immediate-
|
|
44
|
+
* action signal.
|
|
45
|
+
*/
|
|
46
|
+
export declare function decodeNvmeCriticalWarning(byte: number): {
|
|
47
|
+
available_spare_low: boolean;
|
|
48
|
+
temperature_threshold: boolean;
|
|
49
|
+
reliability_degraded: boolean;
|
|
50
|
+
read_only: boolean;
|
|
51
|
+
volatile_memory_backup_failed: boolean;
|
|
52
|
+
persistent_memory_readonly: boolean;
|
|
53
|
+
};
|
package/dist/collect/smart.js
CHANGED
|
@@ -42,6 +42,19 @@ export function parseSmartctlJson(data, device) {
|
|
|
42
42
|
const nvme = data.nvme_smart_health_information_log;
|
|
43
43
|
info.percentage_used = nvme.percentage_used;
|
|
44
44
|
info.temperature_c = nvme.temperature;
|
|
45
|
+
// C17 (2026-05-19): expose the raw Critical Warning byte + per-bit
|
|
46
|
+
// decoded flags so Dashboard's nvme_critical_warning rule can fire
|
|
47
|
+
// on the specific failure modes. Per NVM Express spec §5.21.
|
|
48
|
+
if (typeof nvme.critical_warning === "number") {
|
|
49
|
+
info.critical_warning_raw = nvme.critical_warning;
|
|
50
|
+
info.critical_warning_decoded = decodeNvmeCriticalWarning(nvme.critical_warning);
|
|
51
|
+
}
|
|
52
|
+
if (typeof nvme.available_spare === "number") {
|
|
53
|
+
info.nvme_available_spare = nvme.available_spare;
|
|
54
|
+
}
|
|
55
|
+
if (typeof nvme.available_spare_threshold === "number") {
|
|
56
|
+
info.nvme_available_spare_threshold = nvme.available_spare_threshold;
|
|
57
|
+
}
|
|
45
58
|
}
|
|
46
59
|
// SATA specific
|
|
47
60
|
if (data.ata_smart_attributes?.table) {
|
|
@@ -56,4 +69,27 @@ export function parseSmartctlJson(data, device) {
|
|
|
56
69
|
}
|
|
57
70
|
return info;
|
|
58
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Decode the NVMe Critical Warning byte (NVM Express spec §5.21):
|
|
74
|
+
* bit 0: available spare below threshold
|
|
75
|
+
* bit 1: temperature outside operating range
|
|
76
|
+
* bit 2: NVM subsystem reliability degraded
|
|
77
|
+
* bit 3: media in read-only mode
|
|
78
|
+
* bit 4: volatile memory backup device has failed
|
|
79
|
+
* bit 5: persistent memory region became read-only (NVMe 1.4+)
|
|
80
|
+
*
|
|
81
|
+
* Bit ordering differs across docs; this implementation follows the
|
|
82
|
+
* spec verbatim. Any non-zero bit is a vendor-recommended immediate-
|
|
83
|
+
* action signal.
|
|
84
|
+
*/
|
|
85
|
+
export function decodeNvmeCriticalWarning(byte) {
|
|
86
|
+
return {
|
|
87
|
+
available_spare_low: (byte & 0x01) !== 0,
|
|
88
|
+
temperature_threshold: (byte & 0x02) !== 0,
|
|
89
|
+
reliability_degraded: (byte & 0x04) !== 0,
|
|
90
|
+
read_only: (byte & 0x08) !== 0,
|
|
91
|
+
volatile_memory_backup_failed: (byte & 0x10) !== 0,
|
|
92
|
+
persistent_memory_readonly: (byte & 0x20) !== 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
59
95
|
//# sourceMappingURL=smart.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/collect/smart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGjC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,qBAAqB;IACrB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjF,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"smart.js","sourceRoot":"","sources":["../../src/collect/smart.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface SoftnetSnapshot {
|
|
2
|
+
available: boolean;
|
|
3
|
+
reason?: string;
|
|
4
|
+
/** Sum of column-2 drops across CPUs, cumulative since boot. */
|
|
5
|
+
total_dropped_cumulative: number;
|
|
6
|
+
/** Per-CPU drops; index is CPU ordinal. Empty when unavailable. */
|
|
7
|
+
per_cpu_dropped: number[];
|
|
8
|
+
/** Per-second drop rate over the most recent interval; null on
|
|
9
|
+
* first snapshot or after a counter reset. */
|
|
10
|
+
total_dropped_rate_per_sec: number | null;
|
|
11
|
+
}
|
|
12
|
+
export declare function collectSoftnet(): SoftnetSnapshot;
|
|
13
|
+
export declare const __test_only: {
|
|
14
|
+
TIME_SQUEEZE_COL: number;
|
|
15
|
+
DROPPED_COL: number;
|
|
16
|
+
resetForTests: () => void;
|
|
17
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// /proc/net/softnet_stat per-CPU NET_RX softirq counters.
|
|
2
|
+
//
|
|
3
|
+
// Per-CPU rows (hex values). Columns observed in modern Linux:
|
|
4
|
+
// col 0: packets processed
|
|
5
|
+
// col 1: packets dropped due to NET_RX softirq budget exhaustion
|
|
6
|
+
// (time_squeeze; rarely the signal we want)
|
|
7
|
+
// col 2: packets dropped because the per-CPU input backlog filled
|
|
8
|
+
// (input_queue_dropped; the real "softnet drops" signal)
|
|
9
|
+
// col 3+: varies by kernel version (squeezed_count, received_rps,
|
|
10
|
+
// flow_limit_count, ...)
|
|
11
|
+
//
|
|
12
|
+
// Column 2 is what we surface as `dropped` per Dashboard's
|
|
13
|
+
// softnet_drops rule. Different sources/blogs disagree on column
|
|
14
|
+
// indexing; we anchor on the kernel source (net/core/dev.c
|
|
15
|
+
// softnet_seq_show) where the order is: total processed, time_squeeze,
|
|
16
|
+
// dropped (cpu_collision), then per-version extensions.
|
|
17
|
+
//
|
|
18
|
+
// Per CC_SPEC_CRUCIBLE_C11_C18_FULL_BUNDLE_2026-05-19.md §1.4.
|
|
19
|
+
import { readProcFile } from "../lib/parse.js";
|
|
20
|
+
let previous = null;
|
|
21
|
+
const TIME_SQUEEZE_COL = 1;
|
|
22
|
+
const DROPPED_COL = 2;
|
|
23
|
+
export function collectSoftnet() {
|
|
24
|
+
const raw = readProcFile("/proc/net/softnet_stat");
|
|
25
|
+
if (!raw) {
|
|
26
|
+
return {
|
|
27
|
+
available: false,
|
|
28
|
+
reason: "/proc/net/softnet_stat not readable",
|
|
29
|
+
total_dropped_cumulative: 0,
|
|
30
|
+
per_cpu_dropped: [],
|
|
31
|
+
total_dropped_rate_per_sec: null,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const perCpu = [];
|
|
35
|
+
let total = 0;
|
|
36
|
+
for (const line of raw.split("\n")) {
|
|
37
|
+
const fields = line.trim().split(/\s+/).filter((f) => f.length > 0);
|
|
38
|
+
if (fields.length <= DROPPED_COL)
|
|
39
|
+
continue;
|
|
40
|
+
const dropped = Number.parseInt(fields[DROPPED_COL], 16);
|
|
41
|
+
if (!Number.isFinite(dropped))
|
|
42
|
+
continue;
|
|
43
|
+
perCpu.push(dropped);
|
|
44
|
+
total += dropped;
|
|
45
|
+
}
|
|
46
|
+
if (perCpu.length === 0) {
|
|
47
|
+
return {
|
|
48
|
+
available: false,
|
|
49
|
+
reason: "/proc/net/softnet_stat parsed but no rows",
|
|
50
|
+
total_dropped_cumulative: 0,
|
|
51
|
+
per_cpu_dropped: [],
|
|
52
|
+
total_dropped_rate_per_sec: null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const nowMs = Date.now();
|
|
56
|
+
let ratePerSec = null;
|
|
57
|
+
if (previous) {
|
|
58
|
+
const elapsedSec = (nowMs - previous.capturedAtMs) / 1000;
|
|
59
|
+
if (elapsedSec > 0) {
|
|
60
|
+
const delta = total - previous.totalDropped;
|
|
61
|
+
// Negative delta = counter reset (host reboot, etc.); leave rate
|
|
62
|
+
// null this tick and reset baseline.
|
|
63
|
+
if (delta >= 0)
|
|
64
|
+
ratePerSec = delta / elapsedSec;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
previous = { totalDropped: total, capturedAtMs: nowMs };
|
|
68
|
+
return {
|
|
69
|
+
available: true,
|
|
70
|
+
total_dropped_cumulative: total,
|
|
71
|
+
per_cpu_dropped: perCpu,
|
|
72
|
+
total_dropped_rate_per_sec: ratePerSec,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export const __test_only = {
|
|
76
|
+
TIME_SQUEEZE_COL,
|
|
77
|
+
DROPPED_COL,
|
|
78
|
+
resetForTests: () => {
|
|
79
|
+
previous = null;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=softnet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"softnet.js","sourceRoot":"","sources":["../../src/collect/softnet.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,+DAA+D;AAC/D,6BAA6B;AAC7B,mEAAmE;AACnE,qDAAqD;AACrD,oEAAoE;AACpE,kEAAkE;AAClE,oEAAoE;AACpE,kCAAkC;AAClC,EAAE;AACF,2DAA2D;AAC3D,iEAAiE;AACjE,2DAA2D;AAC3D,uEAAuE;AACvE,wDAAwD;AACxD,EAAE;AACF,+DAA+D;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmB/C,IAAI,QAAQ,GAA2B,IAAI,CAAC;AAE5C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,qCAAqC;YAC7C,wBAAwB,EAAE,CAAC;YAC3B,eAAe,EAAE,EAAE;YACnB,0BAA0B,EAAE,IAAI;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,MAAM,IAAI,WAAW;YAAE,SAAS;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,KAAK,IAAI,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,2CAA2C;YACnD,wBAAwB,EAAE,CAAC;YAC3B,eAAe,EAAE,EAAE;YACnB,0BAA0B,EAAE,IAAI;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;QAC1D,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;YAC5C,iEAAiE;YACjE,qCAAqC;YACrC,IAAI,KAAK,IAAI,CAAC;gBAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;QAClD,CAAC;IACH,CAAC;IACD,QAAQ,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAExD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,wBAAwB,EAAE,KAAK;QAC/B,eAAe,EAAE,MAAM;QACvB,0BAA0B,EAAE,UAAU;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,gBAAgB;IAChB,WAAW;IACX,aAAa,EAAE,GAAG,EAAE;QAClB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;CACF,CAAC"}
|