@jakkrichm/create-nexus-devflow 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/create-nexus-devflow.d.ts +2 -2
- package/dist/bin/create-nexus-devflow.js +130 -0
- package/dist/bin/create-nexus-devflow.js.map +1 -1
- package/dist/lib/doctor.js +40 -0
- package/dist/lib/doctor.js.map +1 -1
- package/dist/lib/skill-manager.d.ts +50 -0
- package/dist/lib/skill-manager.js +372 -0
- package/dist/lib/skill-manager.js.map +1 -0
- package/package.json +2 -2
- package/template/.agents/skills/devflow/SKILL.md +6 -1
- package/template/.agents/skills/discovery/SKILL.md +6 -1
- package/template/.claude/skills/devflow/SKILL.md +6 -1
- package/template/.claude/skills/discovery/SKILL.md +6 -1
- package/template/LICENSE +21 -21
- package/template/devflow/context/ai-interaction.md +25 -0
- package/dist/lib/antigravity-artifacts.d.ts +0 -52
- package/dist/lib/antigravity-artifacts.js +0 -170
- package/dist/lib/antigravity-artifacts.js.map +0 -1
- package/dist/lib/antigravity-hooks.d.ts +0 -31
- package/dist/lib/antigravity-hooks.js +0 -85
- package/dist/lib/antigravity-hooks.js.map +0 -1
- package/dist/lib/antigravity-plugin.d.ts +0 -51
- package/dist/lib/antigravity-plugin.js +0 -179
- package/dist/lib/antigravity-plugin.js.map +0 -1
- package/dist/lib/antigravity-scheduler.d.ts +0 -39
- package/dist/lib/antigravity-scheduler.js +0 -95
- package/dist/lib/antigravity-scheduler.js.map +0 -1
- package/dist/lib/openai-tools.d.ts +0 -34
- package/dist/lib/openai-tools.js +0 -57
- package/dist/lib/openai-tools.js.map +0 -1
- package/dist/lib/visual-subagent.d.ts +0 -32
- package/dist/lib/visual-subagent.js +0 -98
- package/dist/lib/visual-subagent.js.map +0 -1
- package/template/.agents/skills/convert-any-to-md/scripts/__pycache__/convert_any_to_md.cpython-314.pyc +0 -0
- package/template/.claude/skills/convert-any-to-md/scripts/__pycache__/convert_any_to_md.cpython-314.pyc +0 -0
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { createStyle } from "./ui.js";
|
|
2
|
-
export function generateSchedulerPayload(options) {
|
|
3
|
-
const toolSummary = options.toolSummary || "Reactive Task Schedule";
|
|
4
|
-
const toolAction = options.toolAction || "Scheduling background notification";
|
|
5
|
-
const isCron = Boolean(options.cronExpression || options.mode === "cron");
|
|
6
|
-
if (isCron) {
|
|
7
|
-
const cron = options.cronExpression || "*/5 * * * *";
|
|
8
|
-
const payload = {
|
|
9
|
-
Prompt: options.prompt,
|
|
10
|
-
CronExpression: cron,
|
|
11
|
-
toolSummary,
|
|
12
|
-
toolAction
|
|
13
|
-
};
|
|
14
|
-
if (options.maxIterations !== undefined && options.maxIterations > 0) {
|
|
15
|
-
payload.MaxIterations = String(options.maxIterations);
|
|
16
|
-
}
|
|
17
|
-
if (options.isDaemon !== undefined) {
|
|
18
|
-
payload.IsDaemon = options.isDaemon;
|
|
19
|
-
}
|
|
20
|
-
return payload;
|
|
21
|
-
}
|
|
22
|
-
// Timer (One-shot) mode
|
|
23
|
-
const duration = options.durationSeconds !== undefined ? options.durationSeconds : 300;
|
|
24
|
-
const condition = options.timerCondition || "never";
|
|
25
|
-
return {
|
|
26
|
-
Prompt: options.prompt,
|
|
27
|
-
DurationSeconds: String(duration),
|
|
28
|
-
TimerCondition: condition,
|
|
29
|
-
toolSummary,
|
|
30
|
-
toolAction
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
export function generateCiWatchSchedule(options = {}) {
|
|
34
|
-
const branch = options.targetBranch || "main";
|
|
35
|
-
const isCron = Boolean(options.cronExpression);
|
|
36
|
-
if (isCron) {
|
|
37
|
-
return generateSchedulerPayload({
|
|
38
|
-
mode: "cron",
|
|
39
|
-
cronExpression: options.cronExpression || "*/3 * * * *",
|
|
40
|
-
isDaemon: options.isDaemon ?? false,
|
|
41
|
-
prompt: `Inspect GitHub Actions CI checks for branch "${branch}". Verify build, test, and lint status. If all passed or any failed, report immediate progress to user.`,
|
|
42
|
-
toolSummary: "CI Status Monitor",
|
|
43
|
-
toolAction: "Checking CI status"
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
const duration = options.intervalSeconds || 180;
|
|
47
|
-
const condition = options.taskId || "never";
|
|
48
|
-
return generateSchedulerPayload({
|
|
49
|
-
mode: "timer",
|
|
50
|
-
durationSeconds: duration,
|
|
51
|
-
timerCondition: condition,
|
|
52
|
-
prompt: `Wakeup reminder: Check GitHub Actions CI pipeline status for branch "${branch}". Run 'gh run list' or query CI checks and report pass/fail verdict.`,
|
|
53
|
-
toolSummary: "CI Check Reminder",
|
|
54
|
-
toolAction: "Waiting for CI checks"
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
export function generateGitWatchSchedule(options = {}) {
|
|
58
|
-
const branch = options.remoteBranch || "main";
|
|
59
|
-
const duration = options.intervalSeconds || 300;
|
|
60
|
-
return generateSchedulerPayload({
|
|
61
|
-
mode: "timer",
|
|
62
|
-
durationSeconds: duration,
|
|
63
|
-
timerCondition: "never",
|
|
64
|
-
prompt: `Check Git remote for upstream updates on branch "${branch}". Run 'git fetch --dry-run' and notify if new upstream commits are detected.`,
|
|
65
|
-
toolSummary: "Git Remote Monitor",
|
|
66
|
-
toolAction: "Checking remote repository updates"
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
export function formatSchedulerHuman(payload, options = {}) {
|
|
70
|
-
const style = createStyle(options.color);
|
|
71
|
-
const lines = [];
|
|
72
|
-
lines.push(style.bold(style.cyan("[Google Antigravity Reactive Scheduler Tool Payload]")));
|
|
73
|
-
lines.push(` ${style.dim("Tool Action :")} ${style.bold(payload.toolAction)}`);
|
|
74
|
-
lines.push(` ${style.dim("Tool Summary:")} ${style.bold(payload.toolSummary)}`);
|
|
75
|
-
if (payload.CronExpression) {
|
|
76
|
-
lines.push(` ${style.dim("Mode :")} ${style.green("Recurring Cron")}`);
|
|
77
|
-
lines.push(` ${style.dim("Expression :")} ${style.bold(payload.CronExpression)}`);
|
|
78
|
-
if (payload.MaxIterations) {
|
|
79
|
-
lines.push(` ${style.dim("Max Triggers:")} ${style.yellow(payload.MaxIterations)}`);
|
|
80
|
-
}
|
|
81
|
-
if (payload.IsDaemon !== undefined) {
|
|
82
|
-
lines.push(` ${style.dim("Daemon Mode :")} ${payload.IsDaemon ? style.yellow("true (Standing Background Job)") : style.dim("false")}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else if (payload.DurationSeconds) {
|
|
86
|
-
lines.push(` ${style.dim("Mode :")} ${style.green("One-shot Timer")}`);
|
|
87
|
-
lines.push(` ${style.dim("Duration :")} ${style.bold(`${payload.DurationSeconds} seconds`)}`);
|
|
88
|
-
lines.push(` ${style.dim("Condition :")} ${style.yellow(payload.TimerCondition || "never")}`);
|
|
89
|
-
}
|
|
90
|
-
lines.push("");
|
|
91
|
-
lines.push(style.bold("Prompt to Send on Wakeup Notification:"));
|
|
92
|
-
lines.push(style.green(payload.Prompt));
|
|
93
|
-
return lines.join("\n");
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=antigravity-scheduler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"antigravity-scheduler.js","sourceRoot":"","sources":["../../lib/antigravity-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { type McpToolDefinition } from "./mcp.js";
|
|
2
|
-
export interface OpenAiFunctionDefinition {
|
|
3
|
-
name: string;
|
|
4
|
-
description: string;
|
|
5
|
-
parameters: {
|
|
6
|
-
type: "object";
|
|
7
|
-
properties: Record<string, unknown>;
|
|
8
|
-
required?: string[];
|
|
9
|
-
additionalProperties?: boolean;
|
|
10
|
-
};
|
|
11
|
-
strict?: boolean;
|
|
12
|
-
}
|
|
13
|
-
export interface OpenAiToolDefinition {
|
|
14
|
-
type: "function";
|
|
15
|
-
function: OpenAiFunctionDefinition;
|
|
16
|
-
}
|
|
17
|
-
export interface OpenAiToolsExportOptions {
|
|
18
|
-
strict?: boolean;
|
|
19
|
-
pretty?: boolean;
|
|
20
|
-
}
|
|
21
|
-
export interface WriteOpenAiToolsOptions {
|
|
22
|
-
outPath?: string;
|
|
23
|
-
strict?: boolean;
|
|
24
|
-
}
|
|
25
|
-
export declare function convertMcpToOpenAiTool(tool: McpToolDefinition, options?: OpenAiToolsExportOptions): OpenAiToolDefinition;
|
|
26
|
-
export declare function exportOpenAiTools(mcpTools?: McpToolDefinition[], options?: OpenAiToolsExportOptions): OpenAiToolDefinition[];
|
|
27
|
-
export declare function exportOpenAiToolsJson(mcpTools?: McpToolDefinition[], options?: OpenAiToolsExportOptions): string;
|
|
28
|
-
export declare function writeOpenAiToolsFile(projectRoot: string, options?: WriteOpenAiToolsOptions): Promise<{
|
|
29
|
-
filePath: string;
|
|
30
|
-
totalTools: number;
|
|
31
|
-
}>;
|
|
32
|
-
export declare function formatOpenAiToolsHuman(tools?: OpenAiToolDefinition[], options?: {
|
|
33
|
-
color?: boolean;
|
|
34
|
-
}): string;
|
package/dist/lib/openai-tools.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { DEVFLOW_MCP_TOOLS } from "./mcp.js";
|
|
4
|
-
import { createStyle } from "./ui.js";
|
|
5
|
-
export function convertMcpToOpenAiTool(tool, options = {}) {
|
|
6
|
-
return {
|
|
7
|
-
type: "function",
|
|
8
|
-
function: {
|
|
9
|
-
name: tool.name,
|
|
10
|
-
description: tool.description,
|
|
11
|
-
parameters: {
|
|
12
|
-
type: "object",
|
|
13
|
-
properties: tool.inputSchema.properties || {},
|
|
14
|
-
...(tool.inputSchema.required && tool.inputSchema.required.length > 0
|
|
15
|
-
? { required: tool.inputSchema.required }
|
|
16
|
-
: {}),
|
|
17
|
-
additionalProperties: false
|
|
18
|
-
},
|
|
19
|
-
...(options.strict ? { strict: true } : {})
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export function exportOpenAiTools(mcpTools = DEVFLOW_MCP_TOOLS, options = {}) {
|
|
24
|
-
return mcpTools.map((tool) => convertMcpToOpenAiTool(tool, options));
|
|
25
|
-
}
|
|
26
|
-
export function exportOpenAiToolsJson(mcpTools = DEVFLOW_MCP_TOOLS, options = {}) {
|
|
27
|
-
const tools = exportOpenAiTools(mcpTools, options);
|
|
28
|
-
return JSON.stringify(tools, null, options.pretty !== false ? 2 : 0);
|
|
29
|
-
}
|
|
30
|
-
export async function writeOpenAiToolsFile(projectRoot, options = {}) {
|
|
31
|
-
const targetRel = options.outPath || path.join(".nexus", "codex-tools.json");
|
|
32
|
-
const targetAbs = path.isAbsolute(targetRel) ? targetRel : path.join(projectRoot, targetRel);
|
|
33
|
-
await fs.mkdir(path.dirname(targetAbs), { recursive: true });
|
|
34
|
-
const content = exportOpenAiToolsJson(DEVFLOW_MCP_TOOLS, { strict: options.strict, pretty: true });
|
|
35
|
-
await fs.writeFile(targetAbs, content + "\n", "utf8");
|
|
36
|
-
return {
|
|
37
|
-
filePath: targetAbs,
|
|
38
|
-
totalTools: DEVFLOW_MCP_TOOLS.length
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
export function formatOpenAiToolsHuman(tools = exportOpenAiTools(), options = {}) {
|
|
42
|
-
const style = createStyle(options.color);
|
|
43
|
-
const lines = [];
|
|
44
|
-
lines.push(`[${style.bold(style.cyan("Nexus-DevFlow OpenAI Codex Tools Export"))}: ${tools.length} Tools]`);
|
|
45
|
-
lines.push(`Format: ${style.green("OpenAI Function Calling JSON Schema")} (Ready for Codex CLI / Assistant API)\n`);
|
|
46
|
-
for (const tool of tools) {
|
|
47
|
-
const fn = tool.function;
|
|
48
|
-
const propCount = Object.keys(fn.parameters.properties || {}).length;
|
|
49
|
-
const reqList = fn.parameters.required?.length
|
|
50
|
-
? ` (required: ${fn.parameters.required.join(", ")})`
|
|
51
|
-
: "";
|
|
52
|
-
lines.push(` ⚙️ ${style.bold(style.cyan(fn.name))} ${style.dim(`(${propCount} params${reqList})`)}`);
|
|
53
|
-
lines.push(` ${style.dim(fn.description)}`);
|
|
54
|
-
}
|
|
55
|
-
return lines.join("\n");
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=openai-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-tools.js","sourceRoot":"","sources":["../../lib/openai-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export interface VisualQaOptions {
|
|
2
|
-
targetUrl: string;
|
|
3
|
-
runId?: string;
|
|
4
|
-
criteria?: string[];
|
|
5
|
-
taskName?: string;
|
|
6
|
-
recordingName?: string;
|
|
7
|
-
}
|
|
8
|
-
export interface BrowserSubagentTaskPayload {
|
|
9
|
-
taskName: string;
|
|
10
|
-
recordingName: string;
|
|
11
|
-
taskSummary: string;
|
|
12
|
-
prompt: string;
|
|
13
|
-
}
|
|
14
|
-
export interface VisualEvidenceItem {
|
|
15
|
-
type: "screenshot" | "video" | "console";
|
|
16
|
-
pathOrText: string;
|
|
17
|
-
caption: string;
|
|
18
|
-
criterionIndex?: number;
|
|
19
|
-
}
|
|
20
|
-
export interface VisualEvidenceSummary {
|
|
21
|
-
runId: string;
|
|
22
|
-
targetUrl: string;
|
|
23
|
-
timestamp: string;
|
|
24
|
-
items: VisualEvidenceItem[];
|
|
25
|
-
notes?: string;
|
|
26
|
-
}
|
|
27
|
-
export declare function generateBrowserSubagentTask(options: VisualQaOptions): BrowserSubagentTaskPayload;
|
|
28
|
-
export declare function formatVisualEvidenceMarkdown(summary: VisualEvidenceSummary): string;
|
|
29
|
-
export declare function recordVisualEvidenceToSpec(projectRoot: string, summary: VisualEvidenceSummary): Promise<{
|
|
30
|
-
updated: boolean;
|
|
31
|
-
filePath: string;
|
|
32
|
-
}>;
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { resolveActiveContextPaths } from "./branch-context.js";
|
|
4
|
-
export function generateBrowserSubagentTask(options) {
|
|
5
|
-
const runId = options.runId || "active-run";
|
|
6
|
-
const taskName = options.taskName || `Visual QA Verification for ${runId}`;
|
|
7
|
-
const cleanRecordingName = (options.recordingName || `${runId.slice(0, 3)}_visual_qa`)
|
|
8
|
-
.toLowerCase()
|
|
9
|
-
.replace(/[^a-z0-9_]/g, "_")
|
|
10
|
-
.slice(0, 20);
|
|
11
|
-
const criteriaText = options.criteria && options.criteria.length > 0
|
|
12
|
-
? options.criteria.map((c, i) => ` ${i + 1}. ${c}`).join("\n")
|
|
13
|
-
: " 1. Verify application loads with zero console/network errors\n 2. Assert key UI elements and interactive flows respond as specified";
|
|
14
|
-
const taskSummary = `Perform autonomous browser visual QA testing on ${options.targetUrl} and record session proof.`;
|
|
15
|
-
const prompt = `You are a Visual QA Verifier Agent for Nexus-DevFlow run "${runId}".
|
|
16
|
-
Your mission is to autonomously navigate to "${options.targetUrl}", verify acceptance criteria, and capture visual proof.
|
|
17
|
-
|
|
18
|
-
Acceptance Criteria to verify:
|
|
19
|
-
${criteriaText}
|
|
20
|
-
|
|
21
|
-
Instructions:
|
|
22
|
-
1. Open the URL: "${options.targetUrl}" using browser navigation tools.
|
|
23
|
-
2. Verify visual aesthetics, layout integrity, and responsive design.
|
|
24
|
-
3. Check browser console logs and network activity for unexpected errors.
|
|
25
|
-
4. Interact with primary buttons/forms/inputs to prove dynamic functionality.
|
|
26
|
-
5. Capture a screenshot of the final verified state.
|
|
27
|
-
6. Return a comprehensive report containing:
|
|
28
|
-
- Status: PASSED or FAILED for each criterion
|
|
29
|
-
- List of captured screenshot paths
|
|
30
|
-
- Any console warnings or errors observed.`;
|
|
31
|
-
return {
|
|
32
|
-
taskName,
|
|
33
|
-
recordingName: cleanRecordingName,
|
|
34
|
-
taskSummary,
|
|
35
|
-
prompt
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
export function formatVisualEvidenceMarkdown(summary) {
|
|
39
|
-
const lines = [];
|
|
40
|
-
lines.push(`### 📸 Visual Browser QA Evidence (${summary.runId})`);
|
|
41
|
-
lines.push(`- **Target URL**: \`${summary.targetUrl}\``);
|
|
42
|
-
lines.push(`- **Timestamp**: ${summary.timestamp}`);
|
|
43
|
-
if (summary.notes) {
|
|
44
|
-
lines.push(`- **Notes**: ${summary.notes}`);
|
|
45
|
-
}
|
|
46
|
-
lines.push("");
|
|
47
|
-
const screenshots = summary.items.filter((i) => i.type === "screenshot");
|
|
48
|
-
const videos = summary.items.filter((i) => i.type === "video");
|
|
49
|
-
const consoleLogs = summary.items.filter((i) => i.type === "console");
|
|
50
|
-
if (screenshots.length > 1) {
|
|
51
|
-
lines.push("````carousel");
|
|
52
|
-
screenshots.forEach((s, idx) => {
|
|
53
|
-
if (idx > 0)
|
|
54
|
-
lines.push("<!-- slide -->");
|
|
55
|
-
lines.push(``);
|
|
56
|
-
lines.push(`*${s.caption}*`);
|
|
57
|
-
});
|
|
58
|
-
lines.push("````\n");
|
|
59
|
-
}
|
|
60
|
-
else if (screenshots.length === 1) {
|
|
61
|
-
const s = screenshots[0];
|
|
62
|
-
lines.push(`\n`);
|
|
63
|
-
}
|
|
64
|
-
if (videos.length > 0) {
|
|
65
|
-
for (const v of videos) {
|
|
66
|
-
lines.push(`> [!NOTE]\n> **Session Recording**: [${v.caption}](${v.pathOrText})\n`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (consoleLogs.length > 0) {
|
|
70
|
-
lines.push("```text");
|
|
71
|
-
for (const c of consoleLogs) {
|
|
72
|
-
lines.push(`[Console Evidence] ${c.caption}: ${c.pathOrText}`);
|
|
73
|
-
}
|
|
74
|
-
lines.push("```\n");
|
|
75
|
-
}
|
|
76
|
-
return lines.join("\n");
|
|
77
|
-
}
|
|
78
|
-
export async function recordVisualEvidenceToSpec(projectRoot, summary) {
|
|
79
|
-
const contextPaths = await resolveActiveContextPaths(projectRoot);
|
|
80
|
-
const specPath = contextPaths.featureSpecPath || path.join(projectRoot, "devflow", "context", "current-feature.md");
|
|
81
|
-
try {
|
|
82
|
-
const current = await fs.readFile(specPath, "utf8");
|
|
83
|
-
const evidenceMarkdown = formatVisualEvidenceMarkdown(summary);
|
|
84
|
-
let updatedContent = current;
|
|
85
|
-
if (current.includes("## 4. Verification Evidence & Quality Gates")) {
|
|
86
|
-
updatedContent = current.replace("## 4. Verification Evidence & Quality Gates", `## 4. Verification Evidence & Quality Gates\n\n${evidenceMarkdown}`);
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
updatedContent = current + `\n\n${evidenceMarkdown}\n`;
|
|
90
|
-
}
|
|
91
|
-
await fs.writeFile(specPath, updatedContent, "utf8");
|
|
92
|
-
return { updated: true, filePath: specPath };
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
return { updated: false, filePath: specPath };
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=visual-subagent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"visual-subagent.js","sourceRoot":"","sources":["../../lib/visual-subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAgChE,MAAM,UAAU,2BAA2B,CAAC,OAAwB;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,8BAA8B,KAAK,EAAE,CAAC;IAC3E,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC;SACnF,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,MAAM,YAAY,GAChB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,CAAC,CAAC,wIAAwI,CAAC;IAE/I,MAAM,WAAW,GAAG,mDAAmD,OAAO,CAAC,SAAS,4BAA4B,CAAC;IAErH,MAAM,MAAM,GAAG,6DAA6D,KAAK;+CACpC,OAAO,CAAC,SAAS;;;EAG9D,YAAY;;;oBAGM,OAAO,CAAC,SAAS;;;;;;;;8CAQS,CAAC;IAE7C,OAAO;QACL,QAAQ;QACR,aAAa,EAAE,kBAAkB;QACjC,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAA8B;IACzE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEtE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,GAAG,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,OAA8B;IAE9B,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,YAAY,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAGpH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,cAAc,GAAG,OAAO,CAAC;QAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,6CAA6C,CAAC,EAAE,CAAC;YACpE,cAAc,GAAG,OAAO,CAAC,OAAO,CAC9B,6CAA6C,EAC7C,kDAAkD,gBAAgB,EAAE,CACrE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,OAAO,GAAG,OAAO,gBAAgB,IAAI,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC;AACH,CAAC"}
|
|
Binary file
|