@cogitator-ai/evals 0.11.0 → 0.13.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 (155) hide show
  1. package/README.md +159 -40
  2. package/dist/calibrate-judge.d.ts +53 -0
  3. package/dist/calibrate-judge.d.ts.map +1 -0
  4. package/dist/calibrate-judge.js +114 -0
  5. package/dist/calibrate-judge.js.map +1 -0
  6. package/dist/comparison-stats.d.ts +104 -0
  7. package/dist/comparison-stats.d.ts.map +1 -0
  8. package/dist/comparison-stats.js +179 -0
  9. package/dist/comparison-stats.js.map +1 -0
  10. package/dist/datasets/dataset.d.ts.map +1 -1
  11. package/dist/datasets/dataset.js +3 -27
  12. package/dist/datasets/dataset.js.map +1 -1
  13. package/dist/eval-comparison.d.ts +30 -10
  14. package/dist/eval-comparison.d.ts.map +1 -1
  15. package/dist/eval-comparison.js +73 -103
  16. package/dist/eval-comparison.js.map +1 -1
  17. package/dist/eval-suite.d.ts +33 -0
  18. package/dist/eval-suite.d.ts.map +1 -1
  19. package/dist/eval-suite.js +81 -2
  20. package/dist/eval-suite.js.map +1 -1
  21. package/dist/index.d.ts +21 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +10 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/metrics/g-eval.d.ts +29 -0
  26. package/dist/metrics/g-eval.d.ts.map +1 -0
  27. package/dist/metrics/g-eval.js +89 -0
  28. package/dist/metrics/g-eval.js.map +1 -0
  29. package/dist/metrics/index.d.ts +3 -1
  30. package/dist/metrics/index.d.ts.map +1 -1
  31. package/dist/metrics/index.js +1 -0
  32. package/dist/metrics/index.js.map +1 -1
  33. package/dist/metrics/judge-prompt.d.ts +31 -0
  34. package/dist/metrics/judge-prompt.d.ts.map +1 -0
  35. package/dist/metrics/judge-prompt.js +90 -0
  36. package/dist/metrics/judge-prompt.js.map +1 -0
  37. package/dist/metrics/llm-judge.d.ts +96 -9
  38. package/dist/metrics/llm-judge.d.ts.map +1 -1
  39. package/dist/metrics/llm-judge.js +265 -120
  40. package/dist/metrics/llm-judge.js.map +1 -1
  41. package/dist/metrics/types.d.ts +25 -0
  42. package/dist/metrics/types.d.ts.map +1 -1
  43. package/dist/metrics/types.js.map +1 -1
  44. package/dist/options.d.ts +4 -0
  45. package/dist/options.d.ts.map +1 -0
  46. package/dist/options.js +9 -0
  47. package/dist/options.js.map +1 -0
  48. package/dist/pairwise.d.ts +53 -0
  49. package/dist/pairwise.d.ts.map +1 -0
  50. package/dist/pairwise.js +118 -0
  51. package/dist/pairwise.js.map +1 -0
  52. package/dist/reporters/comparison.d.ts +24 -0
  53. package/dist/reporters/comparison.d.ts.map +1 -0
  54. package/dist/reporters/comparison.js +290 -0
  55. package/dist/reporters/comparison.js.map +1 -0
  56. package/dist/reporters/format.d.ts +21 -0
  57. package/dist/reporters/format.d.ts.map +1 -1
  58. package/dist/reporters/format.js +31 -0
  59. package/dist/reporters/format.js.map +1 -1
  60. package/dist/reporters/github.d.ts.map +1 -1
  61. package/dist/reporters/github.js +1 -16
  62. package/dist/reporters/github.js.map +1 -1
  63. package/dist/reporters/html-format.d.ts +11 -0
  64. package/dist/reporters/html-format.d.ts.map +1 -0
  65. package/dist/reporters/html-format.js +111 -0
  66. package/dist/reporters/html-format.js.map +1 -0
  67. package/dist/reporters/html.d.ts +12 -0
  68. package/dist/reporters/html.d.ts.map +1 -0
  69. package/dist/reporters/html.js +119 -0
  70. package/dist/reporters/html.js.map +1 -0
  71. package/dist/reporters/index.d.ts +20 -6
  72. package/dist/reporters/index.d.ts.map +1 -1
  73. package/dist/reporters/index.js +15 -4
  74. package/dist/reporters/index.js.map +1 -1
  75. package/dist/reporters/markdown.d.ts +15 -0
  76. package/dist/reporters/markdown.d.ts.map +1 -0
  77. package/dist/reporters/markdown.js +67 -0
  78. package/dist/reporters/markdown.js.map +1 -0
  79. package/dist/runs/compare.d.ts +103 -0
  80. package/dist/runs/compare.d.ts.map +1 -0
  81. package/dist/runs/compare.js +208 -0
  82. package/dist/runs/compare.js.map +1 -0
  83. package/dist/runs/index.d.ts +9 -0
  84. package/dist/runs/index.d.ts.map +1 -0
  85. package/dist/runs/index.js +5 -0
  86. package/dist/runs/index.js.map +1 -0
  87. package/dist/runs/json.d.ts +11 -0
  88. package/dist/runs/json.d.ts.map +1 -0
  89. package/dist/runs/json.js +58 -0
  90. package/dist/runs/json.js.map +1 -0
  91. package/dist/runs/run.d.ts +44 -0
  92. package/dist/runs/run.d.ts.map +1 -0
  93. package/dist/runs/run.js +136 -0
  94. package/dist/runs/run.js.map +1 -0
  95. package/dist/runs/schema.d.ts +504 -0
  96. package/dist/runs/schema.d.ts.map +1 -0
  97. package/dist/runs/schema.js +171 -0
  98. package/dist/runs/schema.js.map +1 -0
  99. package/dist/runs/store.d.ts +57 -0
  100. package/dist/runs/store.d.ts.map +1 -0
  101. package/dist/runs/store.js +146 -0
  102. package/dist/runs/store.js.map +1 -0
  103. package/dist/schema.d.ts +16 -0
  104. package/dist/schema.d.ts.map +1 -1
  105. package/dist/schema.js +17 -0
  106. package/dist/schema.js.map +1 -1
  107. package/dist/stats/bootstrap.d.ts +22 -0
  108. package/dist/stats/bootstrap.d.ts.map +1 -0
  109. package/dist/stats/bootstrap.js +34 -0
  110. package/dist/stats/bootstrap.js.map +1 -0
  111. package/dist/stats/correlation.d.ts +11 -0
  112. package/dist/stats/correlation.d.ts.map +1 -0
  113. package/dist/stats/correlation.js +42 -0
  114. package/dist/stats/correlation.js.map +1 -0
  115. package/dist/stats/effect-size.d.ts +7 -0
  116. package/dist/stats/effect-size.d.ts.map +1 -0
  117. package/dist/stats/effect-size.js +17 -0
  118. package/dist/stats/effect-size.js.map +1 -0
  119. package/dist/stats/holm.d.ts +7 -0
  120. package/dist/stats/holm.d.ts.map +1 -0
  121. package/dist/stats/holm.js +21 -0
  122. package/dist/stats/holm.js.map +1 -0
  123. package/dist/stats/index.d.ts +10 -2
  124. package/dist/stats/index.d.ts.map +1 -1
  125. package/dist/stats/index.js +7 -1
  126. package/dist/stats/index.js.map +1 -1
  127. package/dist/stats/mcnemar.d.ts +9 -0
  128. package/dist/stats/mcnemar.d.ts.map +1 -1
  129. package/dist/stats/mcnemar.js +27 -13
  130. package/dist/stats/mcnemar.js.map +1 -1
  131. package/dist/stats/normal.d.ts +5 -0
  132. package/dist/stats/normal.d.ts.map +1 -0
  133. package/dist/stats/normal.js +19 -0
  134. package/dist/stats/normal.js.map +1 -0
  135. package/dist/stats/precision.d.ts +12 -0
  136. package/dist/stats/precision.d.ts.map +1 -0
  137. package/dist/stats/precision.js +29 -0
  138. package/dist/stats/precision.js.map +1 -0
  139. package/dist/stats/random.d.ts +6 -0
  140. package/dist/stats/random.d.ts.map +1 -0
  141. package/dist/stats/random.js +25 -0
  142. package/dist/stats/random.js.map +1 -0
  143. package/dist/stats/ranks.d.ts +5 -0
  144. package/dist/stats/ranks.d.ts.map +1 -0
  145. package/dist/stats/ranks.js +24 -0
  146. package/dist/stats/ranks.js.map +1 -0
  147. package/dist/stats/t-test.d.ts +4 -0
  148. package/dist/stats/t-test.d.ts.map +1 -1
  149. package/dist/stats/t-test.js +9 -3
  150. package/dist/stats/t-test.js.map +1 -1
  151. package/dist/stats/wilcoxon.d.ts +19 -0
  152. package/dist/stats/wilcoxon.d.ts.map +1 -0
  153. package/dist/stats/wilcoxon.js +70 -0
  154. package/dist/stats/wilcoxon.js.map +1 -0
  155. package/package.json +1 -1
@@ -39,11 +39,26 @@ export interface Passage {
39
39
  score?: number;
40
40
  source?: string;
41
41
  }
42
+ /** The versioned instructions an agent run used, as its `RunResult.prompt` reports them */
43
+ export interface EvalPrompt {
44
+ /** The agent's `id` when it was set explicitly, else its `name` */
45
+ key: string;
46
+ versionId?: string;
47
+ version?: number;
48
+ abTest?: {
49
+ id: string;
50
+ variant: 'control' | 'treatment';
51
+ };
52
+ }
42
53
  /** One user turn of a multi-turn case and the answer to it */
43
54
  export interface EvalTurnResult {
44
55
  input: string;
45
56
  output: string;
46
57
  toolCalls?: readonly EvalToolCall[];
58
+ /** The trace of the agent run that answered the turn */
59
+ traceId?: string;
60
+ /** The versioned instructions the agent run of the turn used */
61
+ prompt?: EvalPrompt;
47
62
  /** Set on the turn that failed, the last one the case ran */
48
63
  error?: string;
49
64
  }
@@ -74,6 +89,16 @@ export interface EvalCaseResult {
74
89
  retrieved?: readonly Passage[];
75
90
  /** Each turn of a case with `turns`: `input` first, then the further turns */
76
91
  turns?: readonly EvalTurnResult[];
92
+ /**
93
+ * The trace of the agent run, from its `RunResult.trace.traceId`, to find the run in a trace
94
+ * viewer. With `turns`, the last turn's. A `fn` target has none
95
+ */
96
+ traceId?: string;
97
+ /**
98
+ * The versioned instructions the agent run used, from its `RunResult.prompt`. With `turns`, the
99
+ * last turn's. Set when the Cogitator versions instructions (`cogitator.prompts`)
100
+ */
101
+ prompt?: EvalPrompt;
77
102
  /**
78
103
  * Every run of the case when the suite runs several `trials`, each with its own scores. The
79
104
  * case result itself is the first of them
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"AA4HA,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"AAmJA,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC;AACzD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { z } from 'zod';
2
+ /** Parses options with a schema, throwing one readable error that names what is wrong */
3
+ export declare function parseOptions<Schema extends z.ZodType>(schema: Schema, value: unknown, label: string): z.output<Schema>;
4
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,EACnD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAOlB"}
@@ -0,0 +1,9 @@
1
+ /** Parses options with a schema, throwing one readable error that names what is wrong */
2
+ export function parseOptions(schema, value, label) {
3
+ const parsed = schema.safeParse(value);
4
+ if (parsed.success)
5
+ return parsed.data;
6
+ const issues = parsed.error.issues.map((issue) => issue.path.length > 0 ? `${issue.path.join('.')}: ${issue.message}` : issue.message);
7
+ throw new Error(`${label}: ${issues.join(', ')}`);
8
+ }
9
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,KAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CACpF,CAAC;IACF,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { EvalSuiteResult } from './eval-suite.js';
2
+ import type { JudgeContext } from './metrics/llm-judge.js';
3
+ export interface PairwiseOptions {
4
+ /** What makes one answer better than the other. Default: correct, relevant, complete, clear */
5
+ criteria?: string;
6
+ /** The name the result reports. Default `pairwise` */
7
+ name?: string;
8
+ }
9
+ export type PairwiseSide = 'baseline' | 'challenger';
10
+ export type PairwiseOutcome = PairwiseSide | 'tie';
11
+ /** One of the two verdicts on a case */
12
+ export interface PairwiseVerdict {
13
+ /** The side shown to the judge first, as answer A */
14
+ first: PairwiseSide;
15
+ /** The side the judge preferred, or `tie` */
16
+ preferred: PairwiseOutcome;
17
+ reasoning?: string;
18
+ }
19
+ export interface PairwiseCase {
20
+ /** Position of the case in the dataset */
21
+ index: number;
22
+ input: string;
23
+ winner: PairwiseOutcome;
24
+ /** The verdict with the baseline first, then the one with the challenger first */
25
+ verdicts: PairwiseVerdict[];
26
+ /** The side that errored and so lost the case without a judge call */
27
+ errored?: PairwiseSide;
28
+ /** Why the judge gave no verdict in one of the orders, which makes the case a tie */
29
+ error?: string;
30
+ }
31
+ export interface PairwiseResult {
32
+ name: string;
33
+ wins: {
34
+ baseline: number;
35
+ challenger: number;
36
+ };
37
+ ties: number;
38
+ /** Cases compared: those at least one side answered */
39
+ cases: number;
40
+ /** Challenger wins over the decided cases (wins of either side), NaN when none was decided */
41
+ winRate: number;
42
+ /** Cases the judge failed on in at least one order, counted as ties */
43
+ judgeErrors: number;
44
+ /** USD the judge calls cost, as far as the judge reported usage */
45
+ cost: number;
46
+ perCase: PairwiseCase[];
47
+ }
48
+ /**
49
+ * Asks the judge which side answered each case better, see `EvalComparisonOptions.pairwise`.
50
+ * Cases both sides errored on are left out
51
+ */
52
+ export declare function judgePairwise(baseline: EvalSuiteResult, challenger: EvalSuiteResult, judge: JudgeContext, options: PairwiseOptions, concurrency: number, signal?: AbortSignal): Promise<PairwiseResult>;
53
+ //# sourceMappingURL=pairwise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairwise.d.ts","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUxD,MAAM,WAAW,eAAe;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,KAAK,CAAC;AAEnD,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,KAAK,EAAE,YAAY,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AA4GD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAmCzB"}
@@ -0,0 +1,118 @@
1
+ import { judgePrompt, parseJudgeOutput, sumUsage, untilAborted, usageOf, } from './metrics/llm-judge.js';
2
+ import { conversationBlock, evidenceBlock, tagged, wrapped } from './metrics/judge-prompt.js';
3
+ /** The instructions of a pairwise verdict */
4
+ function pairwiseInstructions(criteria) {
5
+ const basis = criteria
6
+ ? `on these criteria:\n${criteria}`
7
+ : 'overall: which is more correct, relevant, complete and clear';
8
+ return `You are comparing two answers to the same request to decide which one is better ${basis}\n\nThe order of the answers says nothing about their quality, and a longer answer is better only for what its length adds.\n\nScore 0 when <answer_a> is better, 1 when <answer_b> is better, 0.5 when neither is better.\n\nRespond with JSON: {"score": <0, 0.5 or 1>, "reasoning": "<explanation>"}`;
9
+ }
10
+ /** The case and the two answers, A then B. A multi-turn case shows each side's whole conversation */
11
+ function pairwiseMessage(a, b) {
12
+ const evidence = evidenceBlock(a, false);
13
+ const multiTurn = (a.case.turns?.length ?? 0) > 0;
14
+ const shared = [
15
+ ...(multiTurn
16
+ ? ['Each answer is a whole conversation, the user messages being the same in both.']
17
+ : [tagged('input', a.case.input)]),
18
+ ...(evidence === undefined ? [] : [evidence]),
19
+ ...(a.case.expected ? [tagged('expected', a.case.expected)] : []),
20
+ ];
21
+ const answer = (tag, result) => multiTurn ? wrapped(tag, conversationBlock(result)) : tagged(tag, result.output);
22
+ return [...shared, answer('answer_a', a), answer('answer_b', b)].join('\n');
23
+ }
24
+ const other = (side) => side === 'baseline' ? 'challenger' : 'baseline';
25
+ async function ask(judge, instructions, first, a, b, signal) {
26
+ try {
27
+ const answered = await untilAborted(judge.cogitator.run({
28
+ input: judgePrompt(instructions, pairwiseMessage(a, b)),
29
+ ...(signal && { signal }),
30
+ }), signal);
31
+ const usage = usageOf(answered.usage);
32
+ const verdict = parseJudgeOutput(answered.output);
33
+ if (!verdict)
34
+ return { error: 'could not parse judge response', ...(usage && { usage }) };
35
+ const score = verdict.outOf === undefined ? verdict.score : verdict.score / verdict.outOf;
36
+ const preferred = score < 0.5 ? first : score > 0.5 ? other(first) : 'tie';
37
+ return {
38
+ verdict: {
39
+ first,
40
+ preferred,
41
+ ...(verdict.reasoning !== undefined && { reasoning: verdict.reasoning }),
42
+ },
43
+ ...(usage && { usage }),
44
+ };
45
+ }
46
+ catch (error) {
47
+ return { error: error instanceof Error ? error.message : String(error) };
48
+ }
49
+ }
50
+ /**
51
+ * A case judged both ways round: the baseline first, then the challenger first. Agreeing
52
+ * verdicts give the case to that side, disagreeing ones or a tie make it a tie
53
+ */
54
+ async function judgeCase(judge, instructions, index, baseline, challenger, signal) {
55
+ const input = baseline.case.input;
56
+ if (baseline.error !== undefined || challenger.error !== undefined) {
57
+ const errored = baseline.error !== undefined ? 'baseline' : 'challenger';
58
+ return { result: { index, input, winner: other(errored), verdicts: [], errored } };
59
+ }
60
+ const asked = await Promise.all([
61
+ ask(judge, instructions, 'baseline', baseline, challenger, signal),
62
+ ask(judge, instructions, 'challenger', challenger, baseline, signal),
63
+ ]);
64
+ const usage = sumUsage(asked.map((one) => one.usage));
65
+ const verdicts = asked.flatMap((one) => (one.verdict ? [one.verdict] : []));
66
+ const errors = asked.flatMap((one) => (one.error === undefined ? [] : [one.error]));
67
+ const [first, second] = verdicts;
68
+ const winner = errors.length === 0 && first.preferred === second.preferred ? first.preferred : 'tie';
69
+ return {
70
+ result: {
71
+ index,
72
+ input,
73
+ winner,
74
+ verdicts,
75
+ ...(errors.length > 0 && { error: errors.join(', ') }),
76
+ },
77
+ ...(usage && { usage }),
78
+ };
79
+ }
80
+ /**
81
+ * Asks the judge which side answered each case better, see `EvalComparisonOptions.pairwise`.
82
+ * Cases both sides errored on are left out
83
+ */
84
+ export async function judgePairwise(baseline, challenger, judge, options, concurrency, signal) {
85
+ const instructions = pairwiseInstructions(options.criteria);
86
+ const pairs = baseline.results.flatMap((b, index) => {
87
+ const c = challenger.results[index];
88
+ return c && (b.error === undefined || c.error === undefined) ? [{ index, b, c }] : [];
89
+ });
90
+ const judged = new Array(pairs.length);
91
+ let next = 0;
92
+ const worker = async () => {
93
+ while (next < pairs.length && !signal?.aborted) {
94
+ const at = next++;
95
+ const { index, b, c } = pairs[at];
96
+ judged[at] = await judgeCase(judge, instructions, index, b, c, signal);
97
+ }
98
+ };
99
+ await Promise.all(Array.from({ length: Math.min(concurrency, pairs.length) }, worker));
100
+ signal?.throwIfAborted();
101
+ const perCase = judged.map((one) => one.result);
102
+ const wins = {
103
+ baseline: perCase.filter((one) => one.winner === 'baseline').length,
104
+ challenger: perCase.filter((one) => one.winner === 'challenger').length,
105
+ };
106
+ const decided = wins.baseline + wins.challenger;
107
+ return {
108
+ name: options.name ?? 'pairwise',
109
+ wins,
110
+ ties: perCase.length - decided,
111
+ cases: perCase.length,
112
+ winRate: decided === 0 ? Number.NaN : wins.challenger / decided,
113
+ judgeErrors: perCase.filter((one) => one.error !== undefined).length,
114
+ cost: judged.reduce((sum, one) => sum + (one.usage?.cost ?? 0), 0),
115
+ perCase,
116
+ };
117
+ }
118
+ //# sourceMappingURL=pairwise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ComparisonResult } from '../eval-comparison.js';
2
+ import type { RunComparison } from '../runs/compare.js';
3
+ import type { ReporterOptions } from './index.js';
4
+ /** What `reportComparison()` renders: an `EvalComparison` result or a `compareRuns()` result */
5
+ export type ReportableComparison = ComparisonResult | RunComparison;
6
+ export type ComparisonReporterType = 'markdown' | 'html' | 'console';
7
+ /**
8
+ * A compact Markdown summary of a comparison for a pull request comment: the winner, a table of
9
+ * the metrics with means, difference, interval, p-values and significance, the cases that
10
+ * regressed and improved, and the warnings. Every value is escaped
11
+ */
12
+ export declare function comparisonMarkdown(comparison: ReportableComparison): string;
13
+ /**
14
+ * A self-contained HTML page of a comparison: inline CSS for light and dark color schemes, no
15
+ * scripts, no external assets, and every value escaped
16
+ */
17
+ export declare function comparisonHtml(comparison: ReportableComparison): string;
18
+ /**
19
+ * Renders an `EvalComparison` result or a `compareRuns()` result: `console` prints it, `markdown`
20
+ * writes a compact summary for a pull request comment to `<path>.md`, and `html` a
21
+ * self-contained page to `<path>.html`. The default path is `eval-comparison`
22
+ */
23
+ export declare function reportComparison(comparison: ReportableComparison, type: ComparisonReporterType | ComparisonReporterType[], options?: ReporterOptions): void;
24
+ //# sourceMappingURL=comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.d.ts","sourceRoot":"","sources":["../../src/reporters/comparison.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAU,MAAM,iBAAiB,CAAC;AAK7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,gGAAgG;AAChG,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAsJrE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAqC3E;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,oBAAoB,GAAG,MAAM,CAgFvE;AAoED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,oBAAoB,EAChC,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,EAAE,EACvD,OAAO,CAAC,EAAE,eAAe,GACxB,IAAI,CAuBN"}
@@ -0,0 +1,290 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { caseChanges } from '../comparison-stats.js';
3
+ import { cell, num, truncateInput } from './format.js';
4
+ import { prepare, reportPath } from './index.js';
5
+ import { escapeHtml, htmlDocument, htmlTable, htmlTiles } from './html-format.js';
6
+ /** Most case changes the Markdown summary lists per metric and direction */
7
+ const MARKDOWN_MAX_CHANGES = 10;
8
+ function isRunComparison(comparison) {
9
+ return !('summary' in comparison);
10
+ }
11
+ function runLabel(ref) {
12
+ return ref.name === undefined ? ref.runId : `${ref.name} (${ref.runId})`;
13
+ }
14
+ function viewOf(comparison) {
15
+ if (isRunComparison(comparison)) {
16
+ return {
17
+ title: 'Run comparison',
18
+ before: 'base',
19
+ after: 'head',
20
+ subtitle: `base ${runLabel(comparison.base)}, head ${runLabel(comparison.head)}`,
21
+ winner: comparison.winner,
22
+ metrics: Object.entries(comparison.metrics).map(([name, m]) => ({
23
+ name,
24
+ before: m.base,
25
+ after: m.head,
26
+ n: m.n,
27
+ difference: m.difference,
28
+ ci: m.ci,
29
+ test: m.test,
30
+ pValue: m.pValue,
31
+ adjustedPValue: m.adjustedPValue,
32
+ significant: m.significant,
33
+ winner: m.winner,
34
+ improved: m.improved.map((c) => ({ ...c, before: c.base, after: c.head })),
35
+ regressed: m.regressed.map((c) => ({ ...c, before: c.base, after: c.head })),
36
+ })),
37
+ cases: {
38
+ matched: comparison.matched,
39
+ added: comparison.added.map((c) => c.input),
40
+ removed: comparison.removed.map((c) => c.input),
41
+ },
42
+ warnings: comparison.warnings,
43
+ };
44
+ }
45
+ const { baseline, challenger, summary } = comparison;
46
+ const pairs = baseline.results.map((r, at) => [r, challenger.results[at]]);
47
+ const inputOf = (index) => baseline.results[index].case.input;
48
+ return {
49
+ title: 'A/B comparison',
50
+ before: 'baseline',
51
+ after: 'challenger',
52
+ winner: summary.winner,
53
+ metrics: Object.entries(summary.metrics).map(([name, m]) => ({
54
+ name,
55
+ before: m.baseline,
56
+ after: m.challenger,
57
+ n: m.n,
58
+ difference: m.difference,
59
+ ci: m.ci,
60
+ test: m.test,
61
+ pValue: m.pValue,
62
+ adjustedPValue: m.adjustedPValue,
63
+ significant: m.significant,
64
+ winner: m.winner,
65
+ ...caseChanges(pairs, name, inputOf),
66
+ })),
67
+ warnings: [],
68
+ };
69
+ }
70
+ function signed(n) {
71
+ return n > 0 ? `+${num(n)}` : num(n);
72
+ }
73
+ function ciText(ci) {
74
+ return `[${num(ci.low)}, ${num(ci.high)}]`;
75
+ }
76
+ function pText(p) {
77
+ return p < 0.0001 ? '<0.0001' : num(p);
78
+ }
79
+ function changeLines(view, kind, heading) {
80
+ const rows = view.metrics.flatMap((m) => {
81
+ const changes = m[kind];
82
+ const shown = changes
83
+ .slice(0, MARKDOWN_MAX_CHANGES)
84
+ .map((c) => `| ${cell(m.name)} | ${cell(c.input)} | ${num(c.before)} | ${num(c.after)} | ${signed(c.delta)} |`);
85
+ const more = changes.length > MARKDOWN_MAX_CHANGES
86
+ ? [`| ${cell(m.name)} | and ${changes.length - MARKDOWN_MAX_CHANGES} more | | | |`]
87
+ : [];
88
+ return [...shown, ...more];
89
+ });
90
+ if (rows.length === 0)
91
+ return [];
92
+ return [
93
+ `**${heading}**`,
94
+ '',
95
+ `| Metric | Case | ${view.before} | ${view.after} | Change |`,
96
+ '| --- | --- | ---: | ---: | ---: |',
97
+ ...rows,
98
+ '',
99
+ ];
100
+ }
101
+ /**
102
+ * A compact Markdown summary of a comparison for a pull request comment: the winner, a table of
103
+ * the metrics with means, difference, interval, p-values and significance, the cases that
104
+ * regressed and improved, and the warnings. Every value is escaped
105
+ */
106
+ export function comparisonMarkdown(comparison) {
107
+ const view = viewOf(comparison);
108
+ const lines = [`### ${view.title}`, ''];
109
+ if (view.subtitle)
110
+ lines.push(cell(view.subtitle), '');
111
+ const totals = [`winner: **${view.winner}**`];
112
+ if (view.cases) {
113
+ totals.push(`**${view.cases.matched}** cases matched`, `**${view.cases.added.length}** added`, `**${view.cases.removed.length}** removed`);
114
+ }
115
+ lines.push(totals.join(' | '), '');
116
+ if (view.warnings.length > 0) {
117
+ lines.push('**Warnings**', '', ...view.warnings.map((w) => `- ${cell(w)}`), '');
118
+ }
119
+ if (view.metrics.length > 0) {
120
+ lines.push(`| Metric | ${view.before} | ${view.after} | Difference | CI | p | Adjusted p | Significant | Winner |`, '| --- | ---: | ---: | ---: | --- | ---: | ---: | --- | --- |');
121
+ for (const m of view.metrics) {
122
+ lines.push(`| ${cell(m.name)} | ${num(m.before)} | ${num(m.after)} | ${signed(m.difference)} | ${ciText(m.ci)} | ${pText(m.pValue)} | ${pText(m.adjustedPValue)} | ${m.significant ? '**yes**' : 'no'} | ${m.winner} |`);
123
+ }
124
+ lines.push('');
125
+ }
126
+ else {
127
+ lines.push('No metric to compare.', '');
128
+ }
129
+ lines.push(...changeLines(view, 'regressed', 'Regressions'));
130
+ lines.push(...changeLines(view, 'improved', 'Improvements'));
131
+ return lines.join('\n');
132
+ }
133
+ function changesTable(view, kind) {
134
+ const rows = view.metrics.flatMap((m) => m[kind].map((c) => [
135
+ `<code>${escapeHtml(m.name)}</code>`,
136
+ escapeHtml(c.input),
137
+ escapeHtml(num(c.before)),
138
+ escapeHtml(num(c.after)),
139
+ `<span class="${c.delta < 0 ? 'fail' : 'pass'}">${escapeHtml(signed(c.delta))}</span>`,
140
+ ]));
141
+ if (rows.length === 0)
142
+ return undefined;
143
+ return htmlTable(['Metric', 'Case', view.before, view.after, 'Change'], rows, new Set([2, 3, 4]));
144
+ }
145
+ /**
146
+ * A self-contained HTML page of a comparison: inline CSS for light and dark color schemes, no
147
+ * scripts, no external assets, and every value escaped
148
+ */
149
+ export function comparisonHtml(comparison) {
150
+ const view = viewOf(comparison);
151
+ const sections = [`<h1>${escapeHtml(view.title)}</h1>`];
152
+ if (view.subtitle)
153
+ sections.push(`<p class="sub">${escapeHtml(view.subtitle)}</p>`);
154
+ sections.push(htmlTiles([
155
+ [
156
+ 'winner',
157
+ `<span class="${view.winner === 'tie' ? 'muted' : 'pass'}">${escapeHtml(view.winner)}</span>`,
158
+ ],
159
+ ...(view.cases
160
+ ? [
161
+ ['cases matched', escapeHtml(String(view.cases.matched))],
162
+ ['added', escapeHtml(String(view.cases.added.length))],
163
+ ['removed', escapeHtml(String(view.cases.removed.length))],
164
+ ]
165
+ : []),
166
+ ]));
167
+ if (view.warnings.length > 0) {
168
+ sections.push('<h2>Warnings</h2>', `<ul>${view.warnings.map((w) => `<li class="warn">${escapeHtml(w)}</li>`).join('')}</ul>`);
169
+ }
170
+ sections.push('<h2>Metrics</h2>', view.metrics.length === 0
171
+ ? '<p class="muted">No metric to compare.</p>'
172
+ : htmlTable([
173
+ 'Metric',
174
+ view.before,
175
+ view.after,
176
+ 'Cases',
177
+ 'Difference',
178
+ 'CI',
179
+ 'Test',
180
+ 'p',
181
+ 'Adjusted p',
182
+ 'Significant',
183
+ 'Winner',
184
+ ], view.metrics.map((m) => [
185
+ `<code>${escapeHtml(m.name)}</code>`,
186
+ escapeHtml(num(m.before)),
187
+ escapeHtml(num(m.after)),
188
+ escapeHtml(String(m.n)),
189
+ escapeHtml(signed(m.difference)),
190
+ escapeHtml(ciText(m.ci)),
191
+ escapeHtml(m.test),
192
+ escapeHtml(pText(m.pValue)),
193
+ escapeHtml(pText(m.adjustedPValue)),
194
+ m.significant ? '<span class="pass">yes</span>' : '<span class="muted">no</span>',
195
+ escapeHtml(m.winner),
196
+ ]), new Set([1, 2, 3, 4, 7, 8])));
197
+ const regressed = changesTable(view, 'regressed');
198
+ if (regressed)
199
+ sections.push('<h2>Regressions</h2>', regressed);
200
+ const improved = changesTable(view, 'improved');
201
+ if (improved)
202
+ sections.push('<h2>Improvements</h2>', improved);
203
+ if (view.cases && (view.cases.added.length > 0 || view.cases.removed.length > 0)) {
204
+ const list = (inputs) => `<ul>${inputs.map((input) => `<li>${escapeHtml(input)}</li>`).join('')}</ul>`;
205
+ if (view.cases.added.length > 0) {
206
+ sections.push(`<h2>Cases only in the ${view.after} run</h2>`, list(view.cases.added));
207
+ }
208
+ if (view.cases.removed.length > 0) {
209
+ sections.push(`<h2>Cases only in the ${view.before} run</h2>`, list(view.cases.removed));
210
+ }
211
+ }
212
+ return htmlDocument(view.title, sections.join('\n'));
213
+ }
214
+ const GREEN = '\x1b[32m';
215
+ const RED = '\x1b[31m';
216
+ const YELLOW = '\x1b[33m';
217
+ const BOLD = '\x1b[1m';
218
+ const DIM = '\x1b[2m';
219
+ const RESET = '\x1b[0m';
220
+ function pad(text, width) {
221
+ return text.length >= width ? `${text} ` : text + ' '.repeat(width - text.length);
222
+ }
223
+ function printConsole(comparison) {
224
+ const view = viewOf(comparison);
225
+ console.log(`\n${BOLD}${view.title}${RESET}${view.subtitle ? ` ${DIM}${view.subtitle}${RESET}` : ''}`);
226
+ const cases = view.cases
227
+ ? ` | ${view.cases.matched} cases matched, ${view.cases.added.length} added, ${view.cases.removed.length} removed`
228
+ : '';
229
+ console.log(`Winner: ${BOLD}${view.winner}${RESET}${cases}`);
230
+ for (const warning of view.warnings)
231
+ console.log(`${YELLOW}warning${RESET} ${warning}`);
232
+ if (view.metrics.length > 0) {
233
+ const width = Math.max(14, ...view.metrics.map((m) => m.name.length + 2));
234
+ const header = pad('Metric', width) +
235
+ pad(view.before, 12) +
236
+ pad(view.after, 12) +
237
+ pad('Diff', 10) +
238
+ pad('CI', 22) +
239
+ pad('p', 10) +
240
+ pad('Adj. p', 10) +
241
+ 'Winner';
242
+ console.log(`\n${BOLD}${header}${RESET}`);
243
+ console.log(DIM + '─'.repeat(header.length) + RESET);
244
+ for (const m of view.metrics) {
245
+ const color = !m.significant ? '' : m.winner === view.after ? GREEN : RED;
246
+ console.log(pad(m.name, width) +
247
+ pad(num(m.before), 12) +
248
+ pad(num(m.after), 12) +
249
+ pad(signed(m.difference), 10) +
250
+ pad(ciText(m.ci), 22) +
251
+ pad(pText(m.pValue), 10) +
252
+ pad(pText(m.adjustedPValue), 10) +
253
+ `${color}${m.winner}${m.significant ? ' *' : ''}${color ? RESET : ''}`);
254
+ }
255
+ }
256
+ for (const [kind, heading, color] of [
257
+ ['regressed', 'Regressions', RED],
258
+ ['improved', 'Improvements', GREEN],
259
+ ]) {
260
+ const changes = view.metrics.flatMap((m) => m[kind].map((c) => ({ metric: m.name, ...c })));
261
+ if (changes.length === 0)
262
+ continue;
263
+ console.log(`\n${BOLD}${heading}${RESET}`);
264
+ for (const c of changes) {
265
+ console.log(` ${color}${signed(c.delta)}${RESET} ${c.metric} ${DIM}${num(c.before)} -> ${num(c.after)}${RESET} ${truncateInput(c.input)}`);
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * Renders an `EvalComparison` result or a `compareRuns()` result: `console` prints it, `markdown`
271
+ * writes a compact summary for a pull request comment to `<path>.md`, and `html` a
272
+ * self-contained page to `<path>.html`. The default path is `eval-comparison`
273
+ */
274
+ export function reportComparison(comparison, type, options) {
275
+ const types = Array.isArray(type) ? type : [type];
276
+ for (const t of types) {
277
+ switch (t) {
278
+ case 'console':
279
+ printConsole(comparison);
280
+ break;
281
+ case 'markdown':
282
+ writeFileSync(prepare(reportPath(options?.path, 'md', 'eval-comparison')), comparisonMarkdown(comparison), 'utf-8');
283
+ break;
284
+ case 'html':
285
+ writeFileSync(prepare(reportPath(options?.path, 'html', 'eval-comparison')), comparisonHtml(comparison), 'utf-8');
286
+ break;
287
+ }
288
+ }
289
+ }
290
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../src/reporters/comparison.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA4C/E,4EAA4E;AAC5E,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,SAAS,eAAe,CAAC,UAAgC;IACvD,OAAO,CAAC,CAAC,SAAS,IAAI,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAC,UAAgC;IAC9C,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,QAAQ,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAChF,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9D,IAAI;gBACJ,MAAM,EAAE,CAAC,CAAC,IAAI;gBACd,KAAK,EAAE,CAAC,CAAC,IAAI;gBACb,CAAC,EAAE,CAAC,CAAC,CAAC;gBACN,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1E,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC7E,CAAC,CAAC;YACH,KAAK,EAAE;gBACL,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;aAChD;YACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACtE,OAAO;QACL,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI;YACJ,MAAM,EAAE,CAAC,CAAC,QAAQ;YAClB,KAAK,EAAE,CAAC,CAAC,UAAU;YACnB,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;SACrC,CAAC,CAAC;QACH,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,MAAM,CAAC,EAAiC;IAC/C,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,WAAW,CAClB,IAAoB,EACpB,IAA8B,EAC9B,OAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,OAAO;aAClB,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC;aAC9B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CACrG,CAAC;QACJ,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,GAAG,oBAAoB;YACnC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,GAAG,oBAAoB,eAAe,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO;QACL,KAAK,OAAO,IAAI;QAChB,EAAE;QACF,qBAAqB,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,aAAa;QAC7D,oCAAoC;QACpC,GAAG,IAAI;QACP,EAAE;KACH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAgC;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CACT,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,EACzC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,UAAU,EACtC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,YAAY,CAC3C,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,cAAc,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,8DAA8D,EACvG,8DAA8D,CAC/D,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,CAC7M,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,IAAoB,EAAE,IAA8B;IACxE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjB,SAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;QACpC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;QACnB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxB,gBAAgB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS;KACvF,CAAC,CACH,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAgC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpF,QAAQ,CAAC,IAAI,CACX,SAAS,CAAC;QACR;YACE,QAAQ;YACR,gBAAgB,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;SAC9F;QACD,GAAG,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAE;gBACC,CAAC,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACzD,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtD,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACjD;YACb,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CACH,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CACX,mBAAmB,EACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1F,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,IAAI,CACX,kBAAkB,EAClB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QACvB,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,SAAS,CACP;YACE,QAAQ;YACR,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,KAAK;YACV,OAAO;YACP,YAAY;YACZ,IAAI;YACJ,MAAM;YACN,GAAG;YACH,YAAY;YACZ,aAAa;YACb,QAAQ;SACT,EACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtB,SAAS,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;YACpC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAChC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3B,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YACnC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,+BAA+B;YACjF,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;SACrB,CAAC,EACF,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAC5B,CACN,CAAC;IAEF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;IAE/D,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,CAAC,MAAgB,EAAE,EAAE,CAChC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;QAChF,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,KAAK,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,MAAM,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,KAAK,GAAG,SAAS,CAAC;AAExB,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa;IACtC,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,YAAY,CAAC,UAAgC;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1F,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACtB,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,mBAAmB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,UAAU;QAClH,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IAExF,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GACV,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjB,QAAQ,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1E,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;gBAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACtB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;gBAChC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI;QACnC,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC;QACjC,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,CAAC;KAC3B,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAC/H,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAgC,EAChC,IAAuD,EACvD,OAAyB;IAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,CAAC;YACV,KAAK,SAAS;gBACZ,YAAY,CAAC,UAAU,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,UAAU;gBACb,aAAa,CACX,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAC3D,kBAAkB,CAAC,UAAU,CAAC,EAC9B,OAAO,CACR,CAAC;gBACF,MAAM;YACR,KAAK,MAAM;gBACT,aAAa,CACX,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,EAC7D,cAAc,CAAC,UAAU,CAAC,EAC1B,OAAO,CACR,CAAC;gBACF,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC"}