callman-core 1.36.0 → 1.37.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.
Files changed (145) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/loadtest/compare.d.ts +32 -0
  6. package/dist/loadtest/compare.d.ts.map +1 -0
  7. package/dist/loadtest/compare.js +55 -0
  8. package/dist/loadtest/compare.js.map +1 -0
  9. package/dist/loadtest/flow-eval.d.ts +21 -0
  10. package/dist/loadtest/flow-eval.d.ts.map +1 -0
  11. package/dist/loadtest/flow-eval.js +199 -0
  12. package/dist/loadtest/flow-eval.js.map +1 -0
  13. package/dist/loadtest/from-collection.d.ts +51 -0
  14. package/dist/loadtest/from-collection.d.ts.map +1 -0
  15. package/dist/loadtest/from-collection.js +131 -0
  16. package/dist/loadtest/from-collection.js.map +1 -0
  17. package/dist/loadtest/histogram.d.ts +41 -0
  18. package/dist/loadtest/histogram.d.ts.map +1 -0
  19. package/dist/loadtest/histogram.js +166 -0
  20. package/dist/loadtest/histogram.js.map +1 -0
  21. package/dist/loadtest/index.d.ts +18 -0
  22. package/dist/loadtest/index.d.ts.map +1 -0
  23. package/dist/loadtest/index.js +14 -0
  24. package/dist/loadtest/index.js.map +1 -0
  25. package/dist/loadtest/node/index.d.ts +4 -0
  26. package/dist/loadtest/node/index.d.ts.map +1 -0
  27. package/dist/loadtest/node/index.js +4 -0
  28. package/dist/loadtest/node/index.js.map +1 -0
  29. package/dist/loadtest/node/metrics.d.ts +84 -0
  30. package/dist/loadtest/node/metrics.d.ts.map +1 -0
  31. package/dist/loadtest/node/metrics.js +396 -0
  32. package/dist/loadtest/node/metrics.js.map +1 -0
  33. package/dist/loadtest/node/orchestrator.d.ts +24 -0
  34. package/dist/loadtest/node/orchestrator.d.ts.map +1 -0
  35. package/dist/loadtest/node/orchestrator.js +363 -0
  36. package/dist/loadtest/node/orchestrator.js.map +1 -0
  37. package/dist/loadtest/node/protocol.d.ts +102 -0
  38. package/dist/loadtest/node/protocol.d.ts.map +1 -0
  39. package/dist/loadtest/node/protocol.js +17 -0
  40. package/dist/loadtest/node/protocol.js.map +1 -0
  41. package/dist/loadtest/node/setup.d.ts +6 -0
  42. package/dist/loadtest/node/setup.d.ts.map +1 -0
  43. package/dist/loadtest/node/setup.js +100 -0
  44. package/dist/loadtest/node/setup.js.map +1 -0
  45. package/dist/loadtest/node/step-compiler.d.ts +29 -0
  46. package/dist/loadtest/node/step-compiler.d.ts.map +1 -0
  47. package/dist/loadtest/node/step-compiler.js +229 -0
  48. package/dist/loadtest/node/step-compiler.js.map +1 -0
  49. package/dist/loadtest/node/transport.d.ts +66 -0
  50. package/dist/loadtest/node/transport.d.ts.map +1 -0
  51. package/dist/loadtest/node/transport.js +414 -0
  52. package/dist/loadtest/node/transport.js.map +1 -0
  53. package/dist/loadtest/node/worker-core.d.ts +77 -0
  54. package/dist/loadtest/node/worker-core.d.ts.map +1 -0
  55. package/dist/loadtest/node/worker-core.js +744 -0
  56. package/dist/loadtest/node/worker-core.js.map +1 -0
  57. package/dist/loadtest/node/worker.d.ts +2 -0
  58. package/dist/loadtest/node/worker.d.ts.map +1 -0
  59. package/dist/loadtest/node/worker.js +28 -0
  60. package/dist/loadtest/node/worker.js.map +1 -0
  61. package/dist/loadtest/plan-file.d.ts +91 -0
  62. package/dist/loadtest/plan-file.d.ts.map +1 -0
  63. package/dist/loadtest/plan-file.js +134 -0
  64. package/dist/loadtest/plan-file.js.map +1 -0
  65. package/dist/loadtest/plan.d.ts +47 -0
  66. package/dist/loadtest/plan.d.ts.map +1 -0
  67. package/dist/loadtest/plan.js +259 -0
  68. package/dist/loadtest/plan.js.map +1 -0
  69. package/dist/loadtest/report.d.ts +8 -0
  70. package/dist/loadtest/report.d.ts.map +1 -0
  71. package/dist/loadtest/report.js +211 -0
  72. package/dist/loadtest/report.js.map +1 -0
  73. package/dist/loadtest/thresholds.d.ts +55 -0
  74. package/dist/loadtest/thresholds.d.ts.map +1 -0
  75. package/dist/loadtest/thresholds.js +203 -0
  76. package/dist/loadtest/thresholds.js.map +1 -0
  77. package/dist/loadtest/types.d.ts +500 -0
  78. package/dist/loadtest/types.d.ts.map +1 -0
  79. package/dist/loadtest/types.js +8 -0
  80. package/dist/loadtest/types.js.map +1 -0
  81. package/dist/loadtest/validate.d.ts +30 -0
  82. package/dist/loadtest/validate.d.ts.map +1 -0
  83. package/dist/loadtest/validate.js +162 -0
  84. package/dist/loadtest/validate.js.map +1 -0
  85. package/dist/templating/compile.d.ts +8 -0
  86. package/dist/templating/compile.d.ts.map +1 -0
  87. package/dist/templating/compile.js +110 -0
  88. package/dist/templating/compile.js.map +1 -0
  89. package/dist/templating/index.d.ts +2 -0
  90. package/dist/templating/index.d.ts.map +1 -1
  91. package/dist/templating/index.js +1 -0
  92. package/dist/templating/index.js.map +1 -1
  93. package/dist/templating/template-engine.d.ts +6 -0
  94. package/dist/templating/template-engine.d.ts.map +1 -1
  95. package/dist/templating/template-engine.js +6 -6
  96. package/dist/templating/template-engine.js.map +1 -1
  97. package/dist-cjs/index.js +1 -0
  98. package/dist-cjs/index.js.map +1 -1
  99. package/dist-cjs/loadtest/compare.js +59 -0
  100. package/dist-cjs/loadtest/compare.js.map +1 -0
  101. package/dist-cjs/loadtest/flow-eval.js +205 -0
  102. package/dist-cjs/loadtest/flow-eval.js.map +1 -0
  103. package/dist-cjs/loadtest/from-collection.js +139 -0
  104. package/dist-cjs/loadtest/from-collection.js.map +1 -0
  105. package/dist-cjs/loadtest/histogram.js +171 -0
  106. package/dist-cjs/loadtest/histogram.js.map +1 -0
  107. package/dist-cjs/loadtest/index.js +78 -0
  108. package/dist-cjs/loadtest/index.js.map +1 -0
  109. package/dist-cjs/loadtest/node/index.js +12 -0
  110. package/dist-cjs/loadtest/node/index.js.map +1 -0
  111. package/dist-cjs/loadtest/node/metrics.js +402 -0
  112. package/dist-cjs/loadtest/node/metrics.js.map +1 -0
  113. package/dist-cjs/loadtest/node/orchestrator.js +372 -0
  114. package/dist-cjs/loadtest/node/orchestrator.js.map +1 -0
  115. package/dist-cjs/loadtest/node/protocol.js +20 -0
  116. package/dist-cjs/loadtest/node/protocol.js.map +1 -0
  117. package/dist-cjs/loadtest/node/setup.js +105 -0
  118. package/dist-cjs/loadtest/node/setup.js.map +1 -0
  119. package/dist-cjs/loadtest/node/step-compiler.js +234 -0
  120. package/dist-cjs/loadtest/node/step-compiler.js.map +1 -0
  121. package/dist-cjs/loadtest/node/transport.js +422 -0
  122. package/dist-cjs/loadtest/node/transport.js.map +1 -0
  123. package/dist-cjs/loadtest/node/worker-core.js +749 -0
  124. package/dist-cjs/loadtest/node/worker-core.js.map +1 -0
  125. package/dist-cjs/loadtest/node/worker.js +30 -0
  126. package/dist-cjs/loadtest/node/worker.js.map +1 -0
  127. package/dist-cjs/loadtest/plan-file.js +143 -0
  128. package/dist-cjs/loadtest/plan-file.js.map +1 -0
  129. package/dist-cjs/loadtest/plan.js +271 -0
  130. package/dist-cjs/loadtest/plan.js.map +1 -0
  131. package/dist-cjs/loadtest/report.js +220 -0
  132. package/dist-cjs/loadtest/report.js.map +1 -0
  133. package/dist-cjs/loadtest/thresholds.js +213 -0
  134. package/dist-cjs/loadtest/thresholds.js.map +1 -0
  135. package/dist-cjs/loadtest/types.js +9 -0
  136. package/dist-cjs/loadtest/types.js.map +1 -0
  137. package/dist-cjs/loadtest/validate.js +169 -0
  138. package/dist-cjs/loadtest/validate.js.map +1 -0
  139. package/dist-cjs/templating/compile.js +114 -0
  140. package/dist-cjs/templating/compile.js.map +1 -0
  141. package/dist-cjs/templating/index.js +3 -1
  142. package/dist-cjs/templating/index.js.map +1 -1
  143. package/dist-cjs/templating/template-engine.js +14 -12
  144. package/dist-cjs/templating/template-engine.js.map +1 -1
  145. package/package.json +10 -1
@@ -0,0 +1,203 @@
1
+ // Threshold expressions: parse once, evaluate against a metric source.
2
+ //
3
+ // http_req_duration:p(95)<500 95th percentile under 500 ms
4
+ // http_req_duration{step:login}:avg<=200 per-step average
5
+ // http_req_failed:rate<0.01 under 1% failed (also `<1%`)
6
+ // checks:rate>0.99
7
+ // http_reqs:rate>100 throughput floor, per second
8
+ //
9
+ // CLI shorthands (`p95<500`, `avg<200ms`, `max<2s`, `fail<1%`, `rps>100`,
10
+ // `checks>99%`) normalise to the long form first.
11
+ export const METRIC_KINDS = {
12
+ http_req_duration: "trend",
13
+ http_req_waiting: "trend",
14
+ http_req_receiving: "trend",
15
+ http_req_sending: "trend",
16
+ http_req_blocked: "trend",
17
+ http_req_connecting: "trend",
18
+ http_req_tls_handshaking: "trend",
19
+ http_req_duration_corrected: "trend",
20
+ iteration_duration: "trend",
21
+ http_req_failed: "rate",
22
+ checks: "rate",
23
+ http_reqs: "counter",
24
+ iterations: "counter",
25
+ dropped_iterations: "counter",
26
+ data_sent: "counter",
27
+ data_received: "counter",
28
+ vus: "gauge",
29
+ };
30
+ export class ThresholdParseError extends Error {
31
+ constructor(message) {
32
+ super(message);
33
+ this.name = "ThresholdParseError";
34
+ }
35
+ }
36
+ const SHORTHANDS = [
37
+ { pattern: /^p\(?(\d+(?:\.\d+)?)\)?\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_duration:p(${m[1]})${m[2]}${m[3]}` },
38
+ { pattern: /^(avg|min|max|med)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_duration:${m[1].toLowerCase()}${m[2]}${m[3]}` },
39
+ { pattern: /^(?:fail|failed|errors?|error_rate)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_req_failed:rate${m[1]}${m[2]}` },
40
+ { pattern: /^checks?\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `checks:rate${m[1]}${m[2]}` },
41
+ { pattern: /^(?:rps|throughput)\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `http_reqs:rate${m[1]}${m[2]}` },
42
+ { pattern: /^dropped\s*(<=|>=|<|>|==|!=)\s*(.+)$/i, build: (m) => `dropped_iterations:count${m[1]}${m[2]}` },
43
+ ];
44
+ export const normalizeThresholdExpression = (input) => {
45
+ const trimmed = input.trim();
46
+ if (trimmed.includes(":"))
47
+ return trimmed;
48
+ for (const { pattern, build } of SHORTHANDS) {
49
+ const match = trimmed.match(pattern);
50
+ if (match)
51
+ return build(match);
52
+ }
53
+ return trimmed;
54
+ };
55
+ const FULL_PATTERN = /^([a-z_][a-z0-9_]*)(?:\{\s*([a-z_][a-z0-9_]*)\s*:\s*([^}]+?)\s*\})?\s*:\s*(avg|min|max|med|count|rate|value|p\(\s*\d+(?:\.\d+)?\s*\))\s*(<=|>=|==|!=|<|>)\s*(-?\d+(?:\.\d+)?)\s*(ms|s|%)?$/i;
56
+ export const parseThreshold = (expression) => {
57
+ const normalized = normalizeThresholdExpression(expression);
58
+ const match = normalized.match(FULL_PATTERN);
59
+ if (!match) {
60
+ throw new ThresholdParseError(`Invalid threshold "${expression}". Use e.g. http_req_duration:p(95)<500, http_req_failed:rate<0.01 or p95<500.`);
61
+ }
62
+ const metric = match[1].toLowerCase();
63
+ const metricKind = METRIC_KINDS[metric];
64
+ if (!metricKind) {
65
+ throw new ThresholdParseError(`Unknown metric "${metric}". Known: ${Object.keys(METRIC_KINDS).join(", ")}.`);
66
+ }
67
+ const rawAggregate = match[4].toLowerCase();
68
+ const percentileMatch = rawAggregate.match(/^p\(\s*(\d+(?:\.\d+)?)\s*\)$/);
69
+ const aggregate = percentileMatch
70
+ ? { kind: "p", percentile: Number(percentileMatch[1]) }
71
+ : { kind: rawAggregate };
72
+ const allowed = {
73
+ trend: ["avg", "min", "max", "med", "p", "count"],
74
+ rate: ["rate"],
75
+ counter: ["count", "rate"],
76
+ gauge: ["value"],
77
+ };
78
+ if (!allowed[metricKind].includes(aggregate.kind)) {
79
+ throw new ThresholdParseError(`"${aggregate.kind}" does not apply to ${metric} (${metricKind}). Use: ${allowed[metricKind].join(", ")}.`);
80
+ }
81
+ if (aggregate.kind === "p" && (aggregate.percentile <= 0 || aggregate.percentile > 100)) {
82
+ throw new ThresholdParseError("Percentile must be between 0 and 100.");
83
+ }
84
+ let limit = Number(match[6]);
85
+ const unit = match[7]?.toLowerCase();
86
+ if (unit === "%")
87
+ limit /= 100;
88
+ else if (unit === "s")
89
+ limit *= 1000;
90
+ // Duration limits are written in ms; a rate limit written `1` for "1%" is ambiguous
91
+ // so only an explicit `%` rescales.
92
+ return {
93
+ metric,
94
+ metricKind,
95
+ tag: match[2] ? { key: match[2].toLowerCase(), value: match[3] } : null,
96
+ aggregate,
97
+ operator: match[5],
98
+ limit,
99
+ };
100
+ };
101
+ export const readAggregate = (parsed, source) => {
102
+ const reading = source.read(parsed.metric, parsed.tag);
103
+ if (!reading)
104
+ return null;
105
+ const agg = parsed.aggregate;
106
+ if (reading.kind === "trend") {
107
+ if (reading.histogram.count === 0)
108
+ return null;
109
+ switch (agg.kind) {
110
+ case "avg":
111
+ return reading.histogram.avgMs;
112
+ case "min":
113
+ return reading.histogram.minMs;
114
+ case "max":
115
+ return reading.histogram.maxMs;
116
+ case "med":
117
+ return reading.histogram.percentile(50);
118
+ case "p":
119
+ return reading.histogram.percentile(agg.percentile);
120
+ case "count":
121
+ return reading.histogram.count;
122
+ default:
123
+ return null;
124
+ }
125
+ }
126
+ if (reading.kind === "rate") {
127
+ return reading.total === 0 ? null : reading.passes / reading.total;
128
+ }
129
+ if (reading.kind === "counter") {
130
+ if (agg.kind === "count")
131
+ return reading.value;
132
+ const seconds = source.elapsedMs() / 1000;
133
+ return seconds <= 0 ? null : reading.value / seconds;
134
+ }
135
+ return reading.value;
136
+ };
137
+ const compare = (actual, operator, limit) => {
138
+ switch (operator) {
139
+ case "<":
140
+ return actual < limit;
141
+ case "<=":
142
+ return actual <= limit;
143
+ case ">":
144
+ return actual > limit;
145
+ case ">=":
146
+ return actual >= limit;
147
+ case "==":
148
+ return actual === limit;
149
+ case "!=":
150
+ return actual !== limit;
151
+ }
152
+ };
153
+ export const evaluateThreshold = (threshold, source) => {
154
+ let parsed;
155
+ try {
156
+ parsed = parseThreshold(threshold.expression);
157
+ }
158
+ catch (error) {
159
+ return {
160
+ threshold,
161
+ metric: "",
162
+ aggregate: "",
163
+ operator: "",
164
+ limit: 0,
165
+ actual: null,
166
+ passed: false,
167
+ note: error instanceof Error ? error.message : String(error),
168
+ };
169
+ }
170
+ const actual = readAggregate(parsed, source);
171
+ const base = {
172
+ threshold,
173
+ metric: parsed.tag ? `${parsed.metric}{${parsed.tag.key}:${parsed.tag.value}}` : parsed.metric,
174
+ aggregate: parsed.aggregate.kind === "p" ? `p(${parsed.aggregate.percentile})` : parsed.aggregate.kind,
175
+ operator: parsed.operator,
176
+ limit: parsed.limit,
177
+ actual,
178
+ };
179
+ if (actual === null) {
180
+ // No data is not a failure for a threshold on something that never happened
181
+ // (e.g. a failure rate with zero requests), but it is worth saying.
182
+ return { ...base, passed: true, note: "No data recorded for this metric." };
183
+ }
184
+ return { ...base, passed: compare(actual, parsed.operator, parsed.limit) };
185
+ };
186
+ export const evaluateThresholds = (thresholds, source) => thresholds.map((threshold) => evaluateThreshold(threshold, source));
187
+ export const legacyThresholdExpression = (metric, operator, value, unit) => {
188
+ const suffix = unit === "%" ? "%" : unit;
189
+ switch (metric) {
190
+ case "http_req_duration_p95":
191
+ return `http_req_duration:p(95)${operator}${value}${suffix}`;
192
+ case "http_req_duration_p99":
193
+ return `http_req_duration:p(99)${operator}${value}${suffix}`;
194
+ case "http_req_duration_avg":
195
+ return `http_req_duration:avg${operator}${value}${suffix}`;
196
+ case "iter_duration_avg":
197
+ return `iteration_duration:avg${operator}${value}${suffix}`;
198
+ case "http_req_failed_rate":
199
+ case "error_rate":
200
+ return `http_req_failed:rate${operator}${value}${suffix}`;
201
+ }
202
+ };
203
+ //# sourceMappingURL=thresholds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thresholds.js","sourceRoot":"","sources":["../../src/loadtest/thresholds.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,wEAAwE;AACxE,4DAA4D;AAC5D,wEAAwE;AACxE,qBAAqB;AACrB,wEAAwE;AACxE,EAAE;AACF,0EAA0E;AAC1E,kDAAkD;AAOlD,MAAM,CAAC,MAAM,YAAY,GAAyC;IAChE,iBAAiB,EAAE,OAAO;IAC1B,gBAAgB,EAAE,OAAO;IACzB,kBAAkB,EAAE,OAAO;IAC3B,gBAAgB,EAAE,OAAO;IACzB,gBAAgB,EAAE,OAAO;IACzB,mBAAmB,EAAE,OAAO;IAC5B,wBAAwB,EAAE,OAAO;IACjC,2BAA2B,EAAE,OAAO;IACpC,kBAAkB,EAAE,OAAO;IAC3B,eAAe,EAAE,MAAM;IACvB,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,kBAAkB,EAAE,SAAS;IAC7B,SAAS,EAAE,SAAS;IACpB,aAAa,EAAE,SAAS;IACxB,GAAG,EAAE,OAAO;CACb,CAAC;AAiBF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,UAAU,GAAuE;IACrF,EAAE,OAAO,EAAE,sDAAsD,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;IAC/H,EAAE,OAAO,EAAE,iDAAiD,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;IACrI,EAAE,OAAO,EAAE,kEAAkE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;IACnI,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;IAC/F,EAAE,OAAO,EAAE,kDAAkD,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;IAC7G,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;CAC7G,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAa,EAAU,EAAE;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,YAAY,GAChB,6LAA6L,CAAC;AAEhM,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAmB,EAAE;IACpE,MAAM,UAAU,GAAG,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,mBAAmB,CAC3B,sBAAsB,UAAU,gFAAgF,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAC3B,mBAAmB,MAAM,aAAa,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAuB,eAAe;QACnD,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,CAAC,CAAC,EAAE,IAAI,EAAE,YAAwD,EAAE,CAAC;IAEvE,MAAM,OAAO,GAAiC;QAC5C,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC;QACjD,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,CAAC,OAAO,CAAC;KACjB,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,mBAAmB,CAC3B,IAAI,SAAS,CAAC,IAAI,uBAAuB,MAAM,KAAK,UAAU,WAAW,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC3G,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,IAAI,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACrC,IAAI,IAAI,KAAK,GAAG;QAAE,KAAK,IAAI,GAAG,CAAC;SAC1B,IAAI,IAAI,KAAK,GAAG;QAAE,KAAK,IAAI,IAAI,CAAC;IACrC,oFAAoF;IACpF,oCAAoC;IAEpC,OAAO;QACL,MAAM;QACN,UAAU;QACV,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QACvE,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAsB;QACvC,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAcF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAuB,EAAE,MAAoB,EAAiB,EAAE;IAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;YACjC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;YACjC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;YACjC,KAAK,KAAK;gBACR,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1C,KAAK,GAAG;gBACN,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;YACjC;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC;QAC1C,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,QAA2B,EAAE,KAAa,EAAW,EAAE;IACtF,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,GAAG;YACN,OAAO,MAAM,GAAG,KAAK,CAAC;QACxB,KAAK,IAAI;YACP,OAAO,MAAM,IAAI,KAAK,CAAC;QACzB,KAAK,GAAG;YACN,OAAO,MAAM,GAAG,KAAK,CAAC;QACxB,KAAK,IAAI;YACP,OAAO,MAAM,IAAI,KAAK,CAAC;QACzB,KAAK,IAAI;YACP,OAAO,MAAM,KAAK,KAAK,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,MAAM,KAAK,KAAK,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAwB,EACxB,MAAoB,EACF,EAAE;IACpB,IAAI,MAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,SAAS;YACT,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG;QACX,SAAS;QACT,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;QAC9F,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;QACtG,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM;KACP,CAAC;IACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,4EAA4E;QAC5E,oEAAoE;QACpE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,mCAAmC,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,UAAoC,EACpC,MAAoB,EACA,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAY7F,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,MAA6B,EAC7B,QAA2B,EAC3B,KAAa,EACb,IAAsB,EACd,EAAE;IACV,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,uBAAuB;YAC1B,OAAO,0BAA0B,QAAQ,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;QAC/D,KAAK,uBAAuB;YAC1B,OAAO,0BAA0B,QAAQ,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;QAC/D,KAAK,uBAAuB;YAC1B,OAAO,wBAAwB,QAAQ,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;QAC7D,KAAK,mBAAmB;YACtB,OAAO,yBAAyB,QAAQ,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;QAC9D,KAAK,sBAAsB,CAAC;QAC5B,KAAK,YAAY;YACf,OAAO,uBAAuB,QAAQ,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC"}