guardrail-ship 1.0.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/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mock-implementation.d.ts +1 -0
- package/dist/mock-implementation.d.ts.map +1 -0
- package/dist/mock-implementation.js +2 -0
- package/dist/mock-implementation.js.map +1 -0
- package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts +5 -0
- package/dist/mockproof/__tests__/import-graph-scanner.test.d.ts.map +1 -0
- package/dist/mockproof/__tests__/import-graph-scanner.test.js +92 -0
- package/dist/mockproof/__tests__/import-graph-scanner.test.js.map +1 -0
- package/dist/mockproof/import-graph-scanner.d.ts +93 -0
- package/dist/mockproof/import-graph-scanner.d.ts.map +1 -0
- package/dist/mockproof/import-graph-scanner.js +411 -0
- package/dist/mockproof/import-graph-scanner.js.map +1 -0
- package/dist/mockproof/index.d.ts +10 -0
- package/dist/mockproof/index.d.ts.map +1 -0
- package/dist/mockproof/index.js +10 -0
- package/dist/mockproof/index.js.map +1 -0
- package/dist/reality-mode/auth-enforcer.d.ts +13 -0
- package/dist/reality-mode/auth-enforcer.d.ts.map +1 -0
- package/dist/reality-mode/auth-enforcer.js +90 -0
- package/dist/reality-mode/auth-enforcer.js.map +1 -0
- package/dist/reality-mode/explorer/critical-flows.d.ts +71 -0
- package/dist/reality-mode/explorer/critical-flows.d.ts.map +1 -0
- package/dist/reality-mode/explorer/critical-flows.js +463 -0
- package/dist/reality-mode/explorer/critical-flows.js.map +1 -0
- package/dist/reality-mode/explorer/flow-parser.d.ts +52 -0
- package/dist/reality-mode/explorer/flow-parser.d.ts.map +1 -0
- package/dist/reality-mode/explorer/flow-parser.js +250 -0
- package/dist/reality-mode/explorer/flow-parser.js.map +1 -0
- package/dist/reality-mode/explorer/index.d.ts +11 -0
- package/dist/reality-mode/explorer/index.d.ts.map +1 -0
- package/dist/reality-mode/explorer/index.js +11 -0
- package/dist/reality-mode/explorer/index.js.map +1 -0
- package/dist/reality-mode/explorer/runtime-explorer.d.ts +35 -0
- package/dist/reality-mode/explorer/runtime-explorer.d.ts.map +1 -0
- package/dist/reality-mode/explorer/runtime-explorer.js +688 -0
- package/dist/reality-mode/explorer/runtime-explorer.js.map +1 -0
- package/dist/reality-mode/explorer/surface-discovery.d.ts +60 -0
- package/dist/reality-mode/explorer/surface-discovery.d.ts.map +1 -0
- package/dist/reality-mode/explorer/surface-discovery.js +357 -0
- package/dist/reality-mode/explorer/surface-discovery.js.map +1 -0
- package/dist/reality-mode/explorer/types.d.ts +275 -0
- package/dist/reality-mode/explorer/types.d.ts.map +1 -0
- package/dist/reality-mode/explorer/types.js +8 -0
- package/dist/reality-mode/explorer/types.js.map +1 -0
- package/dist/reality-mode/fake-success-detector.d.ts +10 -0
- package/dist/reality-mode/fake-success-detector.d.ts.map +1 -0
- package/dist/reality-mode/fake-success-detector.js +76 -0
- package/dist/reality-mode/fake-success-detector.js.map +1 -0
- package/dist/reality-mode/index.d.ts +14 -0
- package/dist/reality-mode/index.d.ts.map +1 -0
- package/dist/reality-mode/index.js +14 -0
- package/dist/reality-mode/index.js.map +1 -0
- package/dist/reality-mode/reality-scanner.d.ts +48 -0
- package/dist/reality-mode/reality-scanner.d.ts.map +1 -0
- package/dist/reality-mode/reality-scanner.js +516 -0
- package/dist/reality-mode/reality-scanner.js.map +1 -0
- package/dist/reality-mode/report-generator.d.ts +11 -0
- package/dist/reality-mode/report-generator.d.ts.map +1 -0
- package/dist/reality-mode/report-generator.js +233 -0
- package/dist/reality-mode/report-generator.js.map +1 -0
- package/dist/reality-mode/traffic-classifier.d.ts +14 -0
- package/dist/reality-mode/traffic-classifier.d.ts.map +1 -0
- package/dist/reality-mode/traffic-classifier.js +131 -0
- package/dist/reality-mode/traffic-classifier.js.map +1 -0
- package/dist/reality-mode/types.d.ts +90 -0
- package/dist/reality-mode/types.d.ts.map +1 -0
- package/dist/reality-mode/types.js +2 -0
- package/dist/reality-mode/types.js.map +1 -0
- package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts +5 -0
- package/dist/ship-badge/__tests__/ship-badge-generator.test.d.ts.map +1 -0
- package/dist/ship-badge/__tests__/ship-badge-generator.test.js +146 -0
- package/dist/ship-badge/__tests__/ship-badge-generator.test.js.map +1 -0
- package/dist/ship-badge/index.d.ts +9 -0
- package/dist/ship-badge/index.d.ts.map +1 -0
- package/dist/ship-badge/index.js +9 -0
- package/dist/ship-badge/index.js.map +1 -0
- package/dist/ship-badge/ship-badge-generator.d.ts +136 -0
- package/dist/ship-badge/ship-badge-generator.d.ts.map +1 -0
- package/dist/ship-badge/ship-badge-generator.js +681 -0
- package/dist/ship-badge/ship-badge-generator.js.map +1 -0
- package/package.json +20 -0
- package/src/index.ts +7 -0
- package/src/mock-implementation.ts +0 -0
- package/src/mockproof/__tests__/import-graph-scanner.test.ts +115 -0
- package/src/mockproof/import-graph-scanner.d.ts +93 -0
- package/src/mockproof/import-graph-scanner.d.ts.map +1 -0
- package/src/mockproof/import-graph-scanner.js +482 -0
- package/src/mockproof/import-graph-scanner.ts +540 -0
- package/src/mockproof/index.ts +18 -0
- package/src/reality-mode/auth-enforcer.ts +97 -0
- package/src/reality-mode/explorer/critical-flows.ts +504 -0
- package/src/reality-mode/explorer/flow-parser.ts +293 -0
- package/src/reality-mode/explorer/index.ts +22 -0
- package/src/reality-mode/explorer/runtime-explorer.ts +715 -0
- package/src/reality-mode/explorer/surface-discovery.ts +498 -0
- package/src/reality-mode/explorer/templates/example-flows/auth-flow.yaml +41 -0
- package/src/reality-mode/explorer/templates/example-flows/checkout-flow.yaml +66 -0
- package/src/reality-mode/explorer/templates/example-flows/contact-form.yaml +43 -0
- package/src/reality-mode/explorer/templates/github-action.yml +132 -0
- package/src/reality-mode/explorer/types.ts +356 -0
- package/src/reality-mode/fake-success-detector.ts +89 -0
- package/src/reality-mode/index.ts +19 -0
- package/src/reality-mode/reality-scanner.d.ts +123 -0
- package/src/reality-mode/reality-scanner.d.ts.map +1 -0
- package/src/reality-mode/reality-scanner.js +526 -0
- package/src/reality-mode/reality-scanner.ts +576 -0
- package/src/reality-mode/report-generator.ts +253 -0
- package/src/reality-mode/traffic-classifier.ts +169 -0
- package/src/reality-mode/types.ts +95 -0
- package/src/ship-badge/__tests__/ship-badge-generator.test.ts +162 -0
- package/src/ship-badge/index.ts +16 -0
- package/src/ship-badge/ship-badge-generator.d.ts +136 -0
- package/src/ship-badge/ship-badge-generator.d.ts.map +1 -0
- package/src/ship-badge/ship-badge-generator.js +779 -0
- package/src/ship-badge/ship-badge-generator.ts +873 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Ship Badge Generator
|
|
3
|
+
*/
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { ShipBadgeGenerator } from "../ship-badge-generator";
|
|
6
|
+
describe("ShipBadgeGenerator", () => {
|
|
7
|
+
let generator;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
generator = new ShipBadgeGenerator();
|
|
10
|
+
});
|
|
11
|
+
describe("generateShipBadge", () => {
|
|
12
|
+
it("should generate badges for a project", async () => {
|
|
13
|
+
const result = await generator.generateShipBadge({
|
|
14
|
+
projectPath: path.join(__dirname, "..", "..", "..", ".."),
|
|
15
|
+
projectName: "test-project",
|
|
16
|
+
});
|
|
17
|
+
expect(result).toHaveProperty("verdict");
|
|
18
|
+
expect(result).toHaveProperty("score");
|
|
19
|
+
expect(result).toHaveProperty("checks");
|
|
20
|
+
expect(result).toHaveProperty("badges");
|
|
21
|
+
expect(result).toHaveProperty("permalink");
|
|
22
|
+
expect(result).toHaveProperty("embedCode");
|
|
23
|
+
expect(result.checks.length).toBeGreaterThan(0);
|
|
24
|
+
expect(["ship", "no-ship", "review"]).toContain(result.verdict);
|
|
25
|
+
});
|
|
26
|
+
it("should include all required checks", async () => {
|
|
27
|
+
const result = await generator.generateShipBadge({
|
|
28
|
+
projectPath: __dirname,
|
|
29
|
+
projectName: "test",
|
|
30
|
+
});
|
|
31
|
+
const checkIds = result.checks.map((c) => c.id);
|
|
32
|
+
expect(checkIds).toContain("no-mock-data");
|
|
33
|
+
expect(checkIds).toContain("no-localhost");
|
|
34
|
+
expect(checkIds).toContain("env-vars");
|
|
35
|
+
expect(checkIds).toContain("real-billing");
|
|
36
|
+
expect(checkIds).toContain("real-database");
|
|
37
|
+
expect(checkIds).toContain("oauth-callbacks");
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("generateReport", () => {
|
|
41
|
+
it("should generate readable report for passing project", () => {
|
|
42
|
+
const mockResult = {
|
|
43
|
+
projectId: "test123",
|
|
44
|
+
projectName: "My App",
|
|
45
|
+
verdict: "ship",
|
|
46
|
+
score: 100,
|
|
47
|
+
checks: [
|
|
48
|
+
{
|
|
49
|
+
id: "no-mock-data",
|
|
50
|
+
name: "No Mock Data",
|
|
51
|
+
shortName: "Mock",
|
|
52
|
+
status: "pass",
|
|
53
|
+
message: "Clean",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "no-localhost",
|
|
57
|
+
name: "No Localhost",
|
|
58
|
+
shortName: "URLs",
|
|
59
|
+
status: "pass",
|
|
60
|
+
message: "Clean",
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
badges: {
|
|
64
|
+
main: "<svg>...</svg>",
|
|
65
|
+
mockData: "<svg>...</svg>",
|
|
66
|
+
realApi: "<svg>...</svg>",
|
|
67
|
+
envVars: "<svg>...</svg>",
|
|
68
|
+
billing: "<svg>...</svg>",
|
|
69
|
+
database: "<svg>...</svg>",
|
|
70
|
+
oauth: "<svg>...</svg>",
|
|
71
|
+
combined: "<svg>...</svg>",
|
|
72
|
+
},
|
|
73
|
+
timestamp: new Date().toISOString(),
|
|
74
|
+
expiresAt: new Date().toISOString(),
|
|
75
|
+
permalink: "https://Guardrail.dev/badge/test123",
|
|
76
|
+
embedCode: "[](link)",
|
|
77
|
+
};
|
|
78
|
+
const report = generator.generateReport(mockResult);
|
|
79
|
+
expect(report).toContain("SHIP IT!");
|
|
80
|
+
expect(report).toContain("My App");
|
|
81
|
+
expect(report).toContain("100/100");
|
|
82
|
+
});
|
|
83
|
+
it("should generate readable report for failing project", () => {
|
|
84
|
+
const mockResult = {
|
|
85
|
+
projectId: "test123",
|
|
86
|
+
projectName: "Bad App",
|
|
87
|
+
verdict: "no-ship",
|
|
88
|
+
score: 33,
|
|
89
|
+
checks: [
|
|
90
|
+
{
|
|
91
|
+
id: "no-mock-data",
|
|
92
|
+
name: "No Mock Data",
|
|
93
|
+
shortName: "Mock",
|
|
94
|
+
status: "fail",
|
|
95
|
+
message: "Found 5 issues",
|
|
96
|
+
details: ["file1.ts", "file2.ts"],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "no-localhost",
|
|
100
|
+
name: "No Localhost",
|
|
101
|
+
shortName: "URLs",
|
|
102
|
+
status: "pass",
|
|
103
|
+
message: "Clean",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "env-vars",
|
|
107
|
+
name: "Env Vars",
|
|
108
|
+
shortName: "Env",
|
|
109
|
+
status: "fail",
|
|
110
|
+
message: "Missing vars",
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
badges: {
|
|
114
|
+
main: "<svg>...</svg>",
|
|
115
|
+
mockData: "<svg>...</svg>",
|
|
116
|
+
realApi: "<svg>...</svg>",
|
|
117
|
+
envVars: "<svg>...</svg>",
|
|
118
|
+
billing: "<svg>...</svg>",
|
|
119
|
+
database: "<svg>...</svg>",
|
|
120
|
+
oauth: "<svg>...</svg>",
|
|
121
|
+
combined: "<svg>...</svg>",
|
|
122
|
+
},
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
expiresAt: new Date().toISOString(),
|
|
125
|
+
permalink: "https://Guardrail.dev/badge/test123",
|
|
126
|
+
embedCode: "[](link)",
|
|
127
|
+
};
|
|
128
|
+
const report = generator.generateReport(mockResult);
|
|
129
|
+
expect(report).toContain("NO SHIP");
|
|
130
|
+
expect(report).toContain("Bad App");
|
|
131
|
+
expect(report).toContain("❌");
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe("badges", () => {
|
|
135
|
+
it("should generate valid SVG badges", async () => {
|
|
136
|
+
const result = await generator.generateShipBadge({
|
|
137
|
+
projectPath: __dirname,
|
|
138
|
+
projectName: "test",
|
|
139
|
+
});
|
|
140
|
+
expect(result.badges.main).toContain("<svg");
|
|
141
|
+
expect(result.badges.main).toContain("</svg>");
|
|
142
|
+
expect(result.badges.combined).toContain("<svg");
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=ship-badge-generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-badge-generator.test.js","sourceRoot":"","sources":["../../../src/ship-badge/__tests__/ship-badge-generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship Badge Generator
|
|
3
|
+
*
|
|
4
|
+
* "One-click shareable proof that your app is real."
|
|
5
|
+
*
|
|
6
|
+
* Social proof badges for README / landing page / Product Hunt.
|
|
7
|
+
*/
|
|
8
|
+
export { ShipBadgeGenerator, shipBadgeGenerator, type ShipCheck, type ShipBadgeResult, type ShipBadges, type ShipBadgeConfig, } from "./ship-badge-generator";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ship-badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship Badge Generator
|
|
3
|
+
*
|
|
4
|
+
* "One-click shareable proof that your app is real."
|
|
5
|
+
*
|
|
6
|
+
* Social proof badges for README / landing page / Product Hunt.
|
|
7
|
+
*/
|
|
8
|
+
export { ShipBadgeGenerator, shipBadgeGenerator, } from "./ship-badge-generator";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ship-badge/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAKnB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ship Badge Generator
|
|
3
|
+
*
|
|
4
|
+
* "One-click shareable proof that your app is real."
|
|
5
|
+
*
|
|
6
|
+
* Generates badges + hosted permalinks for:
|
|
7
|
+
* ✅ No Mock Data Detected
|
|
8
|
+
* ✅ No Localhost/Ngrok
|
|
9
|
+
* ✅ All required env vars present
|
|
10
|
+
* ✅ Billing not simulated
|
|
11
|
+
* ✅ DB is real
|
|
12
|
+
* ✅ OAuth callbacks not localhost
|
|
13
|
+
*
|
|
14
|
+
* Vibecoders slap this on README / landing page / Product Hunt for social proof.
|
|
15
|
+
*/
|
|
16
|
+
export interface ShipCheck {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
shortName: string;
|
|
20
|
+
status: "pass" | "fail" | "warning" | "skip";
|
|
21
|
+
message: string;
|
|
22
|
+
details?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface ShipBadgeResult {
|
|
25
|
+
projectId: string;
|
|
26
|
+
projectName: string;
|
|
27
|
+
verdict: "ship" | "no-ship" | "review";
|
|
28
|
+
score: number;
|
|
29
|
+
checks: ShipCheck[];
|
|
30
|
+
badges: ShipBadges;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
expiresAt: string;
|
|
33
|
+
permalink: string;
|
|
34
|
+
embedCode: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ShipBadges {
|
|
37
|
+
main: string;
|
|
38
|
+
mockData: string;
|
|
39
|
+
realApi: string;
|
|
40
|
+
envVars: string;
|
|
41
|
+
billing: string;
|
|
42
|
+
database: string;
|
|
43
|
+
oauth: string;
|
|
44
|
+
combined: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ShipBadgeConfig {
|
|
47
|
+
projectPath: string;
|
|
48
|
+
projectName?: string;
|
|
49
|
+
checks?: string[];
|
|
50
|
+
outputDir?: string;
|
|
51
|
+
baseUrl?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class ShipBadgeGenerator {
|
|
54
|
+
/**
|
|
55
|
+
* Run all ship checks and generate badges
|
|
56
|
+
*/
|
|
57
|
+
generateShipBadge(config: ShipBadgeConfig): Promise<ShipBadgeResult>;
|
|
58
|
+
/**
|
|
59
|
+
* Run all ship-worthiness checks
|
|
60
|
+
*/
|
|
61
|
+
private runAllChecks;
|
|
62
|
+
/**
|
|
63
|
+
* Check for mock data patterns
|
|
64
|
+
*/
|
|
65
|
+
private checkNoMockData;
|
|
66
|
+
/**
|
|
67
|
+
* Check for localhost/ngrok URLs
|
|
68
|
+
*/
|
|
69
|
+
private checkNoLocalhost;
|
|
70
|
+
/**
|
|
71
|
+
* Check for required environment variables
|
|
72
|
+
*/
|
|
73
|
+
private checkEnvVars;
|
|
74
|
+
/**
|
|
75
|
+
* Check for real billing (not demo/test)
|
|
76
|
+
*/
|
|
77
|
+
private checkRealBilling;
|
|
78
|
+
/**
|
|
79
|
+
* Check for real database connection
|
|
80
|
+
*/
|
|
81
|
+
private checkRealDatabase;
|
|
82
|
+
/**
|
|
83
|
+
* Check OAuth callback URLs
|
|
84
|
+
*/
|
|
85
|
+
private checkOAuthCallbacks;
|
|
86
|
+
/**
|
|
87
|
+
* Calculate overall verdict
|
|
88
|
+
*/
|
|
89
|
+
private calculateVerdict;
|
|
90
|
+
/**
|
|
91
|
+
* Generate all badge SVGs
|
|
92
|
+
*/
|
|
93
|
+
private generateAllBadges;
|
|
94
|
+
/**
|
|
95
|
+
* Create a single check badge
|
|
96
|
+
*/
|
|
97
|
+
private createCheckBadge;
|
|
98
|
+
/**
|
|
99
|
+
* Create a combined badge strip
|
|
100
|
+
*/
|
|
101
|
+
private createCombinedBadge;
|
|
102
|
+
/**
|
|
103
|
+
* Create SVG badge
|
|
104
|
+
*/
|
|
105
|
+
private createBadge;
|
|
106
|
+
/**
|
|
107
|
+
* Generate embed code for README
|
|
108
|
+
*/
|
|
109
|
+
private generateEmbedCode;
|
|
110
|
+
/**
|
|
111
|
+
* Save badges to directory
|
|
112
|
+
*/
|
|
113
|
+
private saveBadges;
|
|
114
|
+
/**
|
|
115
|
+
* Generate project ID from path
|
|
116
|
+
*/
|
|
117
|
+
private generateProjectId;
|
|
118
|
+
/**
|
|
119
|
+
* Find source files
|
|
120
|
+
*/
|
|
121
|
+
private findSourceFiles;
|
|
122
|
+
/**
|
|
123
|
+
* Check if file is a test file
|
|
124
|
+
*/
|
|
125
|
+
private isTestFile;
|
|
126
|
+
/**
|
|
127
|
+
* Escape HTML entities
|
|
128
|
+
*/
|
|
129
|
+
private escapeHtml;
|
|
130
|
+
/**
|
|
131
|
+
* Generate human-readable report
|
|
132
|
+
*/
|
|
133
|
+
generateReport(result: ShipBadgeResult): string;
|
|
134
|
+
}
|
|
135
|
+
export declare const shipBadgeGenerator: ShipBadgeGenerator;
|
|
136
|
+
//# sourceMappingURL=ship-badge-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-badge-generator.d.ts","sourceRoot":"","sources":["../../src/ship-badge/ship-badge-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA8C1E;;OAEG;YACW,YAAY;IAwB1B;;OAEG;YACW,eAAe;IAgD7B;;OAEG;YACW,gBAAgB;IAoD9B;;OAEG;YACW,YAAY;IAuD1B;;OAEG;YACW,gBAAgB;IA2D9B;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;YACW,UAAU;IA0BxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,UAAU;IASlB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM;CAoEhD;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|