perttool 0.1.0-alpha.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 (176) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +21 -0
  3. package/README.md +134 -0
  4. package/dist/analysis/graph.d.ts +41 -0
  5. package/dist/analysis/graph.d.ts.map +1 -0
  6. package/dist/analysis/graph.js +199 -0
  7. package/dist/analysis/graph.js.map +1 -0
  8. package/dist/analysis/precedence.d.ts +52 -0
  9. package/dist/analysis/precedence.d.ts.map +1 -0
  10. package/dist/analysis/precedence.js +187 -0
  11. package/dist/analysis/precedence.js.map +1 -0
  12. package/dist/analysis/resource.d.ts +96 -0
  13. package/dist/analysis/resource.d.ts.map +1 -0
  14. package/dist/analysis/resource.js +522 -0
  15. package/dist/analysis/resource.js.map +1 -0
  16. package/dist/application/analyze.d.ts +32 -0
  17. package/dist/application/analyze.d.ts.map +1 -0
  18. package/dist/application/analyze.js +144 -0
  19. package/dist/application/analyze.js.map +1 -0
  20. package/dist/application/check.d.ts +24 -0
  21. package/dist/application/check.d.ts.map +1 -0
  22. package/dist/application/check.js +43 -0
  23. package/dist/application/check.js.map +1 -0
  24. package/dist/application/format.d.ts +21 -0
  25. package/dist/application/format.d.ts.map +1 -0
  26. package/dist/application/format.js +52 -0
  27. package/dist/application/format.js.map +1 -0
  28. package/dist/application/mutate.d.ts +4 -0
  29. package/dist/application/mutate.d.ts.map +1 -0
  30. package/dist/application/mutate.js +175 -0
  31. package/dist/application/mutate.js.map +1 -0
  32. package/dist/application/next.d.ts +86 -0
  33. package/dist/application/next.d.ts.map +1 -0
  34. package/dist/application/next.js +310 -0
  35. package/dist/application/next.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +2103 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/conversion/mermaid-import.d.ts +26 -0
  41. package/dist/conversion/mermaid-import.d.ts.map +1 -0
  42. package/dist/conversion/mermaid-import.js +655 -0
  43. package/dist/conversion/mermaid-import.js.map +1 -0
  44. package/dist/conversion/mermaid.d.ts +38 -0
  45. package/dist/conversion/mermaid.d.ts.map +1 -0
  46. package/dist/conversion/mermaid.js +362 -0
  47. package/dist/conversion/mermaid.js.map +1 -0
  48. package/dist/editing/unified-diff.d.ts +7 -0
  49. package/dist/editing/unified-diff.d.ts.map +1 -0
  50. package/dist/editing/unified-diff.js +81 -0
  51. package/dist/editing/unified-diff.js.map +1 -0
  52. package/dist/formatter/source-formatter.d.ts +17 -0
  53. package/dist/formatter/source-formatter.d.ts.map +1 -0
  54. package/dist/formatter/source-formatter.js +210 -0
  55. package/dist/formatter/source-formatter.js.map +1 -0
  56. package/dist/help/registry.d.ts +37 -0
  57. package/dist/help/registry.d.ts.map +1 -0
  58. package/dist/help/registry.js +657 -0
  59. package/dist/help/registry.js.map +1 -0
  60. package/dist/index.d.ts +44 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +23 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/io/document-file.d.ts +9 -0
  65. package/dist/io/document-file.d.ts.map +1 -0
  66. package/dist/io/document-file.js +19 -0
  67. package/dist/io/document-file.js.map +1 -0
  68. package/dist/io/safe-write.d.ts +33 -0
  69. package/dist/io/safe-write.d.ts.map +1 -0
  70. package/dist/io/safe-write.js +280 -0
  71. package/dist/io/safe-write.js.map +1 -0
  72. package/dist/model/diagnostics.d.ts +43 -0
  73. package/dist/model/diagnostics.d.ts.map +1 -0
  74. package/dist/model/diagnostics.js +47 -0
  75. package/dist/model/diagnostics.js.map +1 -0
  76. package/dist/model/rational.d.ts +21 -0
  77. package/dist/model/rational.d.ts.map +1 -0
  78. package/dist/model/rational.js +84 -0
  79. package/dist/model/rational.js.map +1 -0
  80. package/dist/model/syntax.d.ts +67 -0
  81. package/dist/model/syntax.d.ts.map +1 -0
  82. package/dist/model/syntax.js +15 -0
  83. package/dist/model/syntax.js.map +1 -0
  84. package/dist/model/units.d.ts +18 -0
  85. package/dist/model/units.d.ts.map +1 -0
  86. package/dist/model/units.js +29 -0
  87. package/dist/model/units.js.map +1 -0
  88. package/dist/mutation/advance.d.ts +26 -0
  89. package/dist/mutation/advance.d.ts.map +1 -0
  90. package/dist/mutation/advance.js +261 -0
  91. package/dist/mutation/advance.js.map +1 -0
  92. package/dist/mutation/diagnostics.d.ts +10 -0
  93. package/dist/mutation/diagnostics.d.ts.map +1 -0
  94. package/dist/mutation/diagnostics.js +10 -0
  95. package/dist/mutation/diagnostics.js.map +1 -0
  96. package/dist/mutation/entity-editor.d.ts +16 -0
  97. package/dist/mutation/entity-editor.d.ts.map +1 -0
  98. package/dist/mutation/entity-editor.js +103 -0
  99. package/dist/mutation/entity-editor.js.map +1 -0
  100. package/dist/mutation/milestone.d.ts +5 -0
  101. package/dist/mutation/milestone.d.ts.map +1 -0
  102. package/dist/mutation/milestone.js +194 -0
  103. package/dist/mutation/milestone.js.map +1 -0
  104. package/dist/mutation/resource.d.ts +5 -0
  105. package/dist/mutation/resource.d.ts.map +1 -0
  106. package/dist/mutation/resource.js +145 -0
  107. package/dist/mutation/resource.js.map +1 -0
  108. package/dist/mutation/source.d.ts +22 -0
  109. package/dist/mutation/source.d.ts.map +1 -0
  110. package/dist/mutation/source.js +155 -0
  111. package/dist/mutation/source.js.map +1 -0
  112. package/dist/mutation/task.d.ts +10 -0
  113. package/dist/mutation/task.d.ts.map +1 -0
  114. package/dist/mutation/task.js +644 -0
  115. package/dist/mutation/task.js.map +1 -0
  116. package/dist/mutation/text-edits.d.ts +8 -0
  117. package/dist/mutation/text-edits.d.ts.map +1 -0
  118. package/dist/mutation/text-edits.js +33 -0
  119. package/dist/mutation/text-edits.js.map +1 -0
  120. package/dist/mutation/types.d.ts +153 -0
  121. package/dist/mutation/types.d.ts.map +1 -0
  122. package/dist/mutation/types.js +2 -0
  123. package/dist/mutation/types.js.map +1 -0
  124. package/dist/parser/document-parser.d.ts +6 -0
  125. package/dist/parser/document-parser.d.ts.map +1 -0
  126. package/dist/parser/document-parser.js +735 -0
  127. package/dist/parser/document-parser.js.map +1 -0
  128. package/dist/recommendation/explanation-types.d.ts +226 -0
  129. package/dist/recommendation/explanation-types.d.ts.map +1 -0
  130. package/dist/recommendation/explanation-types.js +2 -0
  131. package/dist/recommendation/explanation-types.js.map +1 -0
  132. package/dist/recommendation/explanation-validation.d.ts +4 -0
  133. package/dist/recommendation/explanation-validation.d.ts.map +1 -0
  134. package/dist/recommendation/explanation-validation.js +745 -0
  135. package/dist/recommendation/explanation-validation.js.map +1 -0
  136. package/dist/recommendation/explanation-values.d.ts +7 -0
  137. package/dist/recommendation/explanation-values.d.ts.map +1 -0
  138. package/dist/recommendation/explanation-values.js +283 -0
  139. package/dist/recommendation/explanation-values.js.map +1 -0
  140. package/dist/recommendation/explanation.d.ts +8 -0
  141. package/dist/recommendation/explanation.d.ts.map +1 -0
  142. package/dist/recommendation/explanation.js +1022 -0
  143. package/dist/recommendation/explanation.js.map +1 -0
  144. package/dist/recommendation/failure.d.ts +3 -0
  145. package/dist/recommendation/failure.d.ts.map +1 -0
  146. package/dist/recommendation/failure.js +4 -0
  147. package/dist/recommendation/failure.js.map +1 -0
  148. package/dist/recommendation/json.d.ts +3 -0
  149. package/dist/recommendation/json.d.ts.map +1 -0
  150. package/dist/recommendation/json.js +252 -0
  151. package/dist/recommendation/json.js.map +1 -0
  152. package/dist/recommendation/override-types.d.ts +117 -0
  153. package/dist/recommendation/override-types.d.ts.map +1 -0
  154. package/dist/recommendation/override-types.js +2 -0
  155. package/dist/recommendation/override-types.js.map +1 -0
  156. package/dist/recommendation/override.d.ts +7 -0
  157. package/dist/recommendation/override.d.ts.map +1 -0
  158. package/dist/recommendation/override.js +717 -0
  159. package/dist/recommendation/override.js.map +1 -0
  160. package/dist/recommendation/ranking.d.ts +7 -0
  161. package/dist/recommendation/ranking.d.ts.map +1 -0
  162. package/dist/recommendation/ranking.js +391 -0
  163. package/dist/recommendation/ranking.js.map +1 -0
  164. package/dist/recommendation/types.d.ts +83 -0
  165. package/dist/recommendation/types.d.ts.map +1 -0
  166. package/dist/recommendation/types.js +2 -0
  167. package/dist/recommendation/types.js.map +1 -0
  168. package/dist/semantic/validator.d.ts +4 -0
  169. package/dist/semantic/validator.d.ts.map +1 -0
  170. package/dist/semantic/validator.js +490 -0
  171. package/dist/semantic/validator.js.map +1 -0
  172. package/dist/version.d.ts +2 -0
  173. package/dist/version.d.ts.map +1 -0
  174. package/dist/version.js +2 -0
  175. package/dist/version.js.map +1 -0
  176. package/package.json +61 -0
@@ -0,0 +1,84 @@
1
+ function gcd(left, right) {
2
+ let a = left < 0n ? -left : left;
3
+ let b = right < 0n ? -right : right;
4
+ while (b !== 0n) {
5
+ const remainder = a % b;
6
+ a = b;
7
+ b = remainder;
8
+ }
9
+ return a;
10
+ }
11
+ export function rational(numerator, denominator = 1n) {
12
+ if (denominator === 0n)
13
+ throw new Error("Rational denominator must not be zero");
14
+ if (numerator === 0n)
15
+ return { numerator: 0n, denominator: 1n };
16
+ const sign = denominator < 0n ? -1n : 1n;
17
+ const divisor = gcd(numerator, denominator);
18
+ return {
19
+ numerator: (numerator / divisor) * sign,
20
+ denominator: (denominator / divisor) * sign,
21
+ };
22
+ }
23
+ export const ZERO = rational(0n);
24
+ export const ONE = rational(1n);
25
+ export function rationalFromDuration(value) {
26
+ return rational(value.digits, 10n ** BigInt(value.scale));
27
+ }
28
+ export function add(left, right) {
29
+ return rational(left.numerator * right.denominator + right.numerator * left.denominator, left.denominator * right.denominator);
30
+ }
31
+ export function subtract(left, right) {
32
+ return rational(left.numerator * right.denominator - right.numerator * left.denominator, left.denominator * right.denominator);
33
+ }
34
+ export function multiply(left, right) {
35
+ return rational(left.numerator * right.numerator, left.denominator * right.denominator);
36
+ }
37
+ export function divide(left, right) {
38
+ if (right.numerator === 0n)
39
+ throw new Error("Rational division by zero");
40
+ return rational(left.numerator * right.denominator, left.denominator * right.numerator);
41
+ }
42
+ export function square(value) {
43
+ return multiply(value, value);
44
+ }
45
+ export function absolute(value) {
46
+ return value.numerator < 0n
47
+ ? { numerator: -value.numerator, denominator: value.denominator }
48
+ : value;
49
+ }
50
+ export function compare(left, right) {
51
+ const difference = left.numerator * right.denominator - right.numerator * left.denominator;
52
+ return difference < 0n ? -1 : difference > 0n ? 1 : 0;
53
+ }
54
+ export function minimum(left, right) {
55
+ return compare(left, right) <= 0 ? left : right;
56
+ }
57
+ export function maximum(left, right) {
58
+ return compare(left, right) >= 0 ? left : right;
59
+ }
60
+ export function isZero(value) {
61
+ return value.numerator === 0n;
62
+ }
63
+ export function formatDecimal(value, precision) {
64
+ if (!Number.isInteger(precision) || precision < 0) {
65
+ throw new Error("precision must be a nonnegative integer");
66
+ }
67
+ const negative = value.numerator < 0n;
68
+ const magnitude = negative ? -value.numerator : value.numerator;
69
+ const scale = 10n ** BigInt(precision);
70
+ const scaled = magnitude * scale;
71
+ let rounded = scaled / value.denominator;
72
+ const remainder = scaled % value.denominator;
73
+ if (remainder * 2n >= value.denominator)
74
+ rounded += 1n;
75
+ if (rounded === 0n)
76
+ return "0";
77
+ if (precision === 0)
78
+ return `${negative ? "-" : ""}${rounded.toString()}`;
79
+ const raw = rounded.toString().padStart(precision + 1, "0");
80
+ const whole = raw.slice(0, -precision);
81
+ const fraction = raw.slice(-precision).replace(/0+$/, "");
82
+ return `${negative ? "-" : ""}${whole}${fraction === "" ? "" : `.${fraction}`}`;
83
+ }
84
+ //# sourceMappingURL=rational.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rational.js","sourceRoot":"","sources":["../../src/model/rational.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { Diagnostic, DiagnosticCounts, SourceSpan } from "./diagnostics.js";
2
+ export type DeclarationKind = "project" | "resource" | "milestone" | "task" | "gate";
3
+ export interface DurationValue {
4
+ readonly text: string;
5
+ readonly digits: bigint;
6
+ readonly scale: number;
7
+ readonly suffix: "d" | "h" | "p";
8
+ }
9
+ export interface VelocityValue {
10
+ readonly text: string;
11
+ readonly points: DurationValue & {
12
+ readonly suffix: "p";
13
+ };
14
+ readonly period: DurationValue & {
15
+ readonly suffix: "d" | "h";
16
+ };
17
+ }
18
+ export interface RequirementValue {
19
+ readonly resourceId: string;
20
+ readonly units: number;
21
+ readonly span: SourceSpan;
22
+ readonly resourceSpan: SourceSpan;
23
+ readonly unitsSpan: SourceSpan;
24
+ }
25
+ export interface FieldNode {
26
+ readonly name: string;
27
+ readonly rawValue: string;
28
+ readonly value: unknown;
29
+ readonly span: SourceSpan;
30
+ readonly valueSpan: SourceSpan;
31
+ readonly contentSpan?: SourceSpan;
32
+ readonly children?: readonly FieldNode[];
33
+ }
34
+ export interface DeclarationNode {
35
+ readonly kind: DeclarationKind;
36
+ readonly id: string;
37
+ readonly span: SourceSpan;
38
+ readonly idSpan: SourceSpan;
39
+ readonly headerSpan: SourceSpan;
40
+ readonly fields: readonly FieldNode[];
41
+ readonly from?: string;
42
+ readonly fromSpan?: SourceSpan;
43
+ readonly to?: string;
44
+ readonly toSpan?: SourceSpan;
45
+ readonly arrowSpan?: SourceSpan;
46
+ }
47
+ export interface TriviaNode {
48
+ readonly kind: "blank" | "comment";
49
+ readonly text: string;
50
+ readonly span: SourceSpan;
51
+ }
52
+ export interface DocumentNode {
53
+ readonly text: string;
54
+ readonly declarations: readonly DeclarationNode[];
55
+ readonly trivia: readonly TriviaNode[];
56
+ }
57
+ export interface ParseResult {
58
+ readonly document: DocumentNode;
59
+ readonly diagnostics: readonly Diagnostic[];
60
+ readonly diagnosticCounts: DiagnosticCounts;
61
+ readonly diagnosticsTruncated: boolean;
62
+ }
63
+ export declare function fieldsNamed(declaration: DeclarationNode, name: string): readonly FieldNode[];
64
+ export declare function fieldNamed(declaration: DeclarationNode, name: string): FieldNode | undefined;
65
+ export declare function compareDurations(left: DurationValue, right: DurationValue): number;
66
+ export declare function isZeroDuration(value: DurationValue): boolean;
67
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/model/syntax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export function fieldsNamed(declaration, name) {
2
+ return declaration.fields.filter((field) => field.name === name);
3
+ }
4
+ export function fieldNamed(declaration, name) {
5
+ return fieldsNamed(declaration, name)[0];
6
+ }
7
+ export function compareDurations(left, right) {
8
+ const leftScaled = left.digits * 10n ** BigInt(right.scale);
9
+ const rightScaled = right.digits * 10n ** BigInt(left.scale);
10
+ return leftScaled < rightScaled ? -1 : leftScaled > rightScaled ? 1 : 0;
11
+ }
12
+ export function isZeroDuration(value) {
13
+ return value.digits === 0n;
14
+ }
15
+ //# sourceMappingURL=syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/model/syntax.ts"],"names":[],"mappings":"AAyEA,MAAM,UAAU,WAAW,CACzB,WAA4B,EAC5B,IAAY;IAEZ,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,WAA4B,EAC5B,IAAY;IAEZ,OAAO,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAmB,EACnB,KAAoB;IAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Rational } from "./rational.js";
2
+ export type CalendarUnit = "day" | "hour";
3
+ export type DurationUnit = CalendarUnit | "point";
4
+ export interface Velocity {
5
+ readonly points: Rational;
6
+ readonly period: Rational;
7
+ readonly periodUnit: CalendarUnit;
8
+ }
9
+ export interface VelocityConversion {
10
+ readonly qualifier: "velocity_forecast";
11
+ readonly sourceUnit: DurationUnit;
12
+ readonly targetUnit: DurationUnit;
13
+ readonly targetPerSource: Rational;
14
+ }
15
+ export declare function durationSuffix(unit: DurationUnit): "d" | "h" | "p";
16
+ export declare function createVelocityConversion(sourceUnit: DurationUnit, velocity: Velocity | null): VelocityConversion | null;
17
+ export declare function convertWithVelocity(value: Rational, conversion: VelocityConversion): Rational;
18
+ //# sourceMappingURL=units.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.d.ts","sourceRoot":"","sources":["../../src/model/units.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;CACpC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAElE;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,YAAY,EACxB,QAAQ,EAAE,QAAQ,GAAG,IAAI,GACxB,kBAAkB,GAAG,IAAI,CAmB3B;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,UAAU,EAAE,kBAAkB,GAC7B,QAAQ,CAEV"}
@@ -0,0 +1,29 @@
1
+ import { divide, multiply } from "./rational.js";
2
+ export function durationSuffix(unit) {
3
+ return unit === "day" ? "d" : unit === "hour" ? "h" : "p";
4
+ }
5
+ export function createVelocityConversion(sourceUnit, velocity) {
6
+ if (velocity === null)
7
+ return null;
8
+ if (sourceUnit === "point") {
9
+ return {
10
+ qualifier: "velocity_forecast",
11
+ sourceUnit,
12
+ targetUnit: velocity.periodUnit,
13
+ targetPerSource: divide(velocity.period, velocity.points),
14
+ };
15
+ }
16
+ if (sourceUnit !== velocity.periodUnit) {
17
+ throw new Error("validated velocity period unit differs from project duration unit");
18
+ }
19
+ return {
20
+ qualifier: "velocity_forecast",
21
+ sourceUnit,
22
+ targetUnit: "point",
23
+ targetPerSource: divide(velocity.points, velocity.period),
24
+ };
25
+ }
26
+ export function convertWithVelocity(value, conversion) {
27
+ return multiply(value, conversion.targetPerSource);
28
+ }
29
+ //# sourceMappingURL=units.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/model/units.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAkBjD,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,UAAwB,EACxB,QAAyB;IAEzB,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,SAAS,EAAE,mBAAmB;YAC9B,UAAU;YACV,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;SAC1D,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO;QACL,SAAS,EAAE,mBAAmB;QAC9B,UAAU;QACV,UAAU,EAAE,OAAO;QACnB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAe,EACf,UAA8B;IAE9B,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { MutationOptions, MutationResult } from "./types.js";
2
+ export type AdvanceRetentionReason = "partial_satisfaction";
3
+ export interface AdvanceRetainedEdge {
4
+ readonly id: string;
5
+ readonly kind: "task" | "gate";
6
+ readonly reason: AdvanceRetentionReason;
7
+ }
8
+ export interface AdvanceDetails {
9
+ readonly keptTaskIds: readonly string[];
10
+ readonly keptGateIds: readonly string[];
11
+ readonly keptMilestoneIds: readonly string[];
12
+ readonly removedTaskIds: readonly string[];
13
+ readonly removedGateIds: readonly string[];
14
+ readonly removedMilestoneIds: readonly string[];
15
+ readonly stateChangedMilestoneIds: readonly string[];
16
+ readonly retainedSatisfiedEdges: readonly AdvanceRetainedEdge[];
17
+ readonly frontierBefore: readonly string[];
18
+ readonly frontierAfter: readonly string[];
19
+ readonly readyBefore: readonly string[];
20
+ readonly readyAfter: readonly string[];
21
+ }
22
+ export interface AdvanceResult extends MutationResult {
23
+ readonly advance: AdvanceDetails | null;
24
+ }
25
+ export declare function planAdvance(text: string, options?: MutationOptions): AdvanceResult;
26
+ //# sourceMappingURL=advance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.d.ts","sourceRoot":"","sources":["../../src/mutation/advance.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrD,QAAQ,CAAC,sBAAsB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAChE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CACzC;AAoRD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,aAAa,CA+Df"}
@@ -0,0 +1,261 @@
1
+ import { createHash } from "node:crypto";
2
+ import { buildResidualGraph, computeEffectiveReached } from "../analysis/graph.js";
3
+ import { createUnifiedDiff } from "../editing/unified-diff.js";
4
+ import { compareStableStrings, limitDiagnostics, normalizeMaxDiagnostics, sortDiagnostics, } from "../model/diagnostics.js";
5
+ import { fieldNamed } from "../model/syntax.js";
6
+ import { checkDocument } from "../application/check.js";
7
+ import { EntityEditor } from "./entity-editor.js";
8
+ import { deleteDeclarationEdit, splitPhysicalLines } from "./source.js";
9
+ import { applyTextEdits, normalizeTextEdits } from "./text-edits.js";
10
+ const milestoneFieldOrder = ["title", "description", "state", "tags"];
11
+ function digest(text) {
12
+ return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
13
+ }
14
+ function failure(originalDigest, documentId, diagnostics, maximum, alreadyTruncated) {
15
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), maximum);
16
+ return {
17
+ ok: false,
18
+ documentId,
19
+ changed: false,
20
+ originalDigest,
21
+ updatedDigest: null,
22
+ updatedText: null,
23
+ diff: null,
24
+ edits: [],
25
+ diagnostics: limited.diagnostics,
26
+ diagnosticsTruncated: alreadyTruncated || limited.truncated,
27
+ advance: null,
28
+ };
29
+ }
30
+ function sortedIds(declarations) {
31
+ return declarations.map(({ id }) => id).sort(compareStableStrings);
32
+ }
33
+ function taskStatus(declaration) {
34
+ return (fieldNamed(declaration, "status")?.value ?? "planned");
35
+ }
36
+ function readyTaskIds(document, reached) {
37
+ return document.declarations
38
+ .filter((declaration) => declaration.kind === "task" &&
39
+ taskStatus(declaration) === "planned" &&
40
+ reached.has(declaration.from))
41
+ .map(({ id }) => id)
42
+ .sort(compareStableStrings);
43
+ }
44
+ function classifiedTaskIds(document, reached) {
45
+ const groups = {
46
+ active: [],
47
+ ready: [],
48
+ blockedNow: [],
49
+ upcoming: [],
50
+ };
51
+ for (const declaration of document.declarations) {
52
+ if (declaration.kind !== "task")
53
+ continue;
54
+ const status = taskStatus(declaration);
55
+ if (status === "done")
56
+ continue;
57
+ if (status === "active")
58
+ groups.active.push(declaration.id);
59
+ else if (status === "planned" && reached.has(declaration.from)) {
60
+ groups.ready.push(declaration.id);
61
+ }
62
+ else if (status === "blocked" && reached.has(declaration.from)) {
63
+ groups.blockedNow.push(declaration.id);
64
+ }
65
+ else {
66
+ groups.upcoming.push(declaration.id);
67
+ }
68
+ }
69
+ for (const ids of Object.values(groups))
70
+ ids.sort(compareStableStrings);
71
+ return groups;
72
+ }
73
+ function buildAdvancePlan(text, document) {
74
+ const project = document.declarations.find(({ kind }) => kind === "project");
75
+ if (project === undefined)
76
+ throw new Error("validated advance document has no project");
77
+ const finish = fieldNamed(project, "finish")?.value;
78
+ if (typeof finish !== "string")
79
+ throw new Error("validated advance project has no finish");
80
+ const reached = computeEffectiveReached(document);
81
+ const edges = document.declarations.filter((declaration) => declaration.kind === "task" || declaration.kind === "gate");
82
+ const keptEdges = edges.filter((edge) => !reached.has(edge.to));
83
+ const keptMilestones = new Set([finish]);
84
+ for (const edge of keptEdges) {
85
+ keptMilestones.add(edge.from);
86
+ keptMilestones.add(edge.to);
87
+ }
88
+ const keptTasks = keptEdges.filter(({ kind }) => kind === "task");
89
+ const keptGates = keptEdges.filter(({ kind }) => kind === "gate");
90
+ const removedTasks = edges.filter((edge) => edge.kind === "task" && !keptEdges.includes(edge));
91
+ const removedGates = edges.filter((edge) => edge.kind === "gate" && !keptEdges.includes(edge));
92
+ const milestones = document.declarations.filter(({ kind }) => kind === "milestone");
93
+ const removedMilestones = milestones.filter(({ id }) => !keptMilestones.has(id));
94
+ const stateChangedMilestones = milestones.filter((milestone) => keptMilestones.has(milestone.id) &&
95
+ reached.has(milestone.id) &&
96
+ fieldNamed(milestone, "state")?.value !== "reached");
97
+ const lines = splitPhysicalLines(text);
98
+ const edits = [
99
+ ...removedTasks.map((declaration) => deleteDeclarationEdit(declaration, lines)),
100
+ ...removedGates.map((declaration) => deleteDeclarationEdit(declaration, lines)),
101
+ ...removedMilestones.map((declaration) => deleteDeclarationEdit(declaration, lines)),
102
+ ];
103
+ for (const milestone of stateChangedMilestones) {
104
+ const editor = new EntityEditor(text, milestone, milestoneFieldOrder);
105
+ editor.setScalar("state", "reached");
106
+ edits.push(...editor.finish());
107
+ }
108
+ const retainedSatisfiedEdges = keptEdges
109
+ .filter((edge) => reached.has(edge.from) &&
110
+ (edge.kind === "gate" || taskStatus(edge) === "done"))
111
+ .map((edge) => ({
112
+ id: edge.id,
113
+ kind: edge.kind,
114
+ reason: "partial_satisfaction",
115
+ }))
116
+ .sort((left, right) => compareStableStrings(left.id, right.id));
117
+ return {
118
+ edits,
119
+ keptTaskIds: sortedIds(keptTasks),
120
+ keptGateIds: sortedIds(keptGates),
121
+ keptMilestoneIds: [...keptMilestones].sort(compareStableStrings),
122
+ removedTaskIds: sortedIds(removedTasks),
123
+ removedGateIds: sortedIds(removedGates),
124
+ removedMilestoneIds: sortedIds(removedMilestones),
125
+ stateChangedMilestoneIds: sortedIds(stateChangedMilestones),
126
+ retainedSatisfiedEdges,
127
+ };
128
+ }
129
+ function exactRational(value) {
130
+ return `${value.numerator}/${value.denominator}`;
131
+ }
132
+ function residualProjection(document) {
133
+ const graph = buildResidualGraph(document);
134
+ return {
135
+ finish: graph.finish,
136
+ durationUnit: graph.durationUnit,
137
+ velocity: graph.velocity === null
138
+ ? null
139
+ : {
140
+ points: exactRational(graph.velocity.points),
141
+ period: exactRational(graph.velocity.period),
142
+ periodUnit: graph.velocity.periodUnit,
143
+ },
144
+ criticalEpsilon: exactRational(graph.criticalEpsilon),
145
+ vertices: [...graph.vertices.keys()],
146
+ resources: [...graph.resources.values()].map(({ id, capacity }) => ({ id, capacity })),
147
+ edges: graph.edges.map((edge) => ({
148
+ id: edge.id,
149
+ kind: edge.kind,
150
+ source: edge.source,
151
+ target: edge.target,
152
+ status: edge.status,
153
+ expected: exactRational(edge.expected),
154
+ variance: exactRational(edge.variance),
155
+ priority: edge.priority,
156
+ requirements: edge.requirements.map((requirement) => ({
157
+ resourceId: requirement.resourceId,
158
+ units: requirement.units,
159
+ })),
160
+ })),
161
+ reached: [...graph.effectiveReached]
162
+ .filter((id) => graph.vertices.has(id))
163
+ .sort(compareStableStrings),
164
+ frontier: graph.frontier,
165
+ blockedTaskIds: graph.blockedTaskIds,
166
+ };
167
+ }
168
+ function assertSame(label, before, after) {
169
+ if (JSON.stringify(before) !== JSON.stringify(after)) {
170
+ throw new Error(`advance postcondition failed: ${label} changed`);
171
+ }
172
+ }
173
+ function explicitReachedRootIds(document) {
174
+ const milestones = document.declarations.filter(({ kind }) => kind === "milestone");
175
+ const incomingTargets = new Set(document.declarations
176
+ .filter(({ kind }) => kind === "task" || kind === "gate")
177
+ .map(({ to }) => to));
178
+ return milestones
179
+ .filter((milestone) => !incomingTargets.has(milestone.id))
180
+ .filter((milestone) => fieldNamed(milestone, "state")?.value === "reached")
181
+ .map(({ id }) => id)
182
+ .sort(compareStableStrings);
183
+ }
184
+ function allRootIds(document) {
185
+ const incomingTargets = new Set(document.declarations
186
+ .filter(({ kind }) => kind === "task" || kind === "gate")
187
+ .map(({ to }) => to));
188
+ return document.declarations
189
+ .filter(({ kind }) => kind === "milestone")
190
+ .filter(({ id }) => !incomingTargets.has(id))
191
+ .map(({ id }) => id)
192
+ .sort(compareStableStrings);
193
+ }
194
+ function verifyPostconditions(original, candidateText, candidate, plan) {
195
+ const beforeReached = computeEffectiveReached(original);
196
+ const afterReached = computeEffectiveReached(candidate);
197
+ assertSame("effective reached set", plan.keptMilestoneIds.filter((id) => beforeReached.has(id)), plan.keptMilestoneIds.filter((id) => afterReached.has(id)));
198
+ assertSame("explicit residual roots", allRootIds(candidate), explicitReachedRootIds(candidate));
199
+ assertSame("task classification", classifiedTaskIds(original, beforeReached), classifiedTaskIds(candidate, afterReached));
200
+ assertSame("residual analysis input", residualProjection(original), residualProjection(candidate));
201
+ const originalProject = original.declarations.find(({ kind }) => kind === "project");
202
+ const candidateProject = candidate.declarations.find(({ kind }) => kind === "project");
203
+ const originalFinish = fieldNamed(originalProject, "finish").value;
204
+ const candidateFinish = fieldNamed(candidateProject, "finish").value;
205
+ assertSame("project completion", beforeReached.has(originalFinish), afterReached.has(candidateFinish));
206
+ const repeated = buildAdvancePlan(candidateText, candidate);
207
+ const repeatedEdits = normalizeTextEdits(candidateText, repeated.edits, "advance idempotence");
208
+ if (repeatedEdits.length !== 0) {
209
+ throw new Error("advance postcondition failed: repeated advance is not empty");
210
+ }
211
+ }
212
+ export function planAdvance(text, options = {}) {
213
+ const maximum = normalizeMaxDiagnostics(options.maxDiagnostics);
214
+ const originalDigest = digest(text);
215
+ const original = checkDocument(text, { maxDiagnostics: maximum });
216
+ if (!original.ok) {
217
+ return failure(originalDigest, original.documentId, original.diagnostics, maximum, original.diagnosticsTruncated);
218
+ }
219
+ const plan = buildAdvancePlan(text, original.document);
220
+ const edits = normalizeTextEdits(text, plan.edits, "advance");
221
+ const updatedText = applyTextEdits(text, edits);
222
+ const candidate = checkDocument(updatedText, { maxDiagnostics: maximum });
223
+ if (!candidate.ok) {
224
+ return failure(originalDigest, original.documentId, candidate.diagnostics, maximum, candidate.diagnosticsTruncated);
225
+ }
226
+ verifyPostconditions(original.document, updatedText, candidate.document, plan);
227
+ const beforeGraph = buildResidualGraph(original.document);
228
+ const afterGraph = buildResidualGraph(candidate.document);
229
+ const readyBefore = readyTaskIds(original.document, beforeGraph.effectiveReached);
230
+ const readyAfter = readyTaskIds(candidate.document, afterGraph.effectiveReached);
231
+ return {
232
+ ok: true,
233
+ documentId: original.documentId,
234
+ changed: updatedText !== text,
235
+ originalDigest,
236
+ updatedDigest: digest(updatedText),
237
+ updatedText,
238
+ diff: createUnifiedDiff(text, updatedText, {
239
+ ...(options.originalLabel === undefined ? {} : { originalLabel: options.originalLabel }),
240
+ ...(options.updatedLabel === undefined ? {} : { updatedLabel: options.updatedLabel }),
241
+ }),
242
+ edits,
243
+ diagnostics: candidate.diagnostics,
244
+ diagnosticsTruncated: candidate.diagnosticsTruncated,
245
+ advance: {
246
+ keptTaskIds: plan.keptTaskIds,
247
+ keptGateIds: plan.keptGateIds,
248
+ keptMilestoneIds: plan.keptMilestoneIds,
249
+ removedTaskIds: plan.removedTaskIds,
250
+ removedGateIds: plan.removedGateIds,
251
+ removedMilestoneIds: plan.removedMilestoneIds,
252
+ stateChangedMilestoneIds: plan.stateChangedMilestoneIds,
253
+ retainedSatisfiedEdges: plan.retainedSatisfiedEdges,
254
+ frontierBefore: beforeGraph.frontier,
255
+ frontierAfter: afterGraph.frontier,
256
+ readyBefore,
257
+ readyAfter,
258
+ },
259
+ };
260
+ }
261
+ //# sourceMappingURL=advance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advance.js","sourceRoot":"","sources":["../../src/mutation/advance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Diagnostic } from "../model/diagnostics.js";
2
+ import type { DeclarationNode } from "../model/syntax.js";
3
+ import type { TextEdit } from "./text-edits.js";
4
+ export interface MutationEditPlan {
5
+ readonly edits: readonly TextEdit[];
6
+ readonly diagnostic?: Diagnostic;
7
+ }
8
+ export type MutationDiagnosticCode = "PTMUT-301" | "PTMUT-302" | "PTMUT-303" | "PTMUT-304";
9
+ export declare function mutationDiagnostic(code: MutationDiagnosticCode, message: string, entity?: DeclarationNode): Diagnostic;
10
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/mutation/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CAClC;AAED,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAEhB,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,sBAAsB,EAC5B,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,eAAe,GACvB,UAAU,CAQZ"}
@@ -0,0 +1,10 @@
1
+ export function mutationDiagnostic(code, message, entity) {
2
+ return {
3
+ code,
4
+ severity: "error",
5
+ message,
6
+ helpTopic: "editing",
7
+ ...(entity === undefined ? {} : { entityId: entity.id, span: entity.idSpan }),
8
+ };
9
+ }
10
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/mutation/diagnostics.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,kBAAkB,CAChC,IAA4B,EAC5B,OAAe,EACf,MAAwB;IAExB,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO;QACjB,OAAO;QACP,SAAS,EAAE,SAAS;QACpB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { DeclarationNode } from "../model/syntax.js";
2
+ import type { TextEdit } from "./text-edits.js";
3
+ export declare class EntityEditor {
4
+ #private;
5
+ readonly lineEnding: "\n" | "\r\n";
6
+ constructor(text: string, declaration: DeclarationNode, fieldOrder: readonly string[], deleted?: readonly string[]);
7
+ fieldValue(name: string): unknown;
8
+ clear(name: string): void;
9
+ queue(name: string, serialized: string): void;
10
+ setScalar(name: string, valueText: string): void;
11
+ setText(name: string, value: string): void;
12
+ setTags(tags: readonly string[]): void;
13
+ finish(): readonly TextEdit[];
14
+ }
15
+ export declare function stringList(value: unknown): readonly string[];
16
+ //# sourceMappingURL=entity-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-editor.d.ts","sourceRoot":"","sources":["../../src/mutation/entity-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAY1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,qBAAa,YAAY;;IACvB,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC;IASnC,YACE,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,OAAO,GAAE,SAAS,MAAM,EAAO,EAQhC;IAED,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhC;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAW5C;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW/C;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAiBzC;IAED,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAarC;IAED,MAAM,IAAI,SAAS,QAAQ,EAAE,CAsB5B;CACF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAI5D"}