@industry-theme/principal-view-panels 0.11.1 → 0.11.3

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.
@@ -4,4 +4,65 @@
4
4
  * Re-exports core types from @principal-ade/panel-framework-core
5
5
  */
6
6
  export type { DataSlice, WorkspaceMetadata, RepositoryMetadata, FileTreeSource, ActiveFileSlice, PanelEventType, PanelEvent, PanelEventEmitter, PanelActions, PanelContextValue, PanelComponentProps, PanelMetadata, PanelLifecycleHooks, PanelDefinition, PanelModule, PanelRegistryEntry, PanelLoader, PanelRegistryConfig, } from '@principal-ade/panel-framework-core';
7
+ import type { PanelActions, PanelComponentProps, DataSlice } from '@principal-ade/panel-framework-core';
8
+ import type { FileTree } from '@principal-ai/repository-abstraction';
9
+ import type { VersionSnapshot } from '@principal-ai/principal-view-core';
10
+ import type { RegisteredTrace } from './otel';
11
+ /**
12
+ * Typed actions for panels that edit canvas files
13
+ */
14
+ export interface CanvasEditorPanelActions extends PanelActions {
15
+ readFile: (path: string) => Promise<string>;
16
+ }
17
+ /**
18
+ * Typed context for CanvasEditorPanel
19
+ */
20
+ export interface CanvasEditorPanelContext {
21
+ fileTree: DataSlice<FileTree>;
22
+ }
23
+ /**
24
+ * Typed panel props for CanvasEditorPanel
25
+ */
26
+ export type CanvasEditorPanelPropsTyped = PanelComponentProps<CanvasEditorPanelActions, CanvasEditorPanelContext>;
27
+ /**
28
+ * Typed context for WorkflowScenariosPanel
29
+ */
30
+ export interface WorkflowScenariosPanelContext {
31
+ telemetry: DataSlice<RegisteredTrace[]>;
32
+ }
33
+ /**
34
+ * Typed panel props for WorkflowScenariosPanel
35
+ */
36
+ export type WorkflowScenariosPanelPropsTyped = PanelComponentProps<PanelActions, WorkflowScenariosPanelContext>;
37
+ /**
38
+ * Typed context for StoryboardListPanel
39
+ */
40
+ export interface StoryboardListPanelContext {
41
+ fileTree: DataSlice<FileTree>;
42
+ git?: DataSlice<any>;
43
+ }
44
+ /**
45
+ * Typed panel props for StoryboardListPanel
46
+ */
47
+ export type StoryboardListPanelPropsTyped = PanelComponentProps<PanelActions, StoryboardListPanelContext>;
48
+ /**
49
+ * Typed actions for TraceListPanel
50
+ */
51
+ export interface TraceListPanelActions extends PanelActions {
52
+ clearTelemetry?: () => Promise<void>;
53
+ readFile: (path: string) => Promise<string>;
54
+ }
55
+ /**
56
+ * Typed context for TraceListPanel
57
+ */
58
+ export interface TraceListPanelContext {
59
+ telemetry: DataSlice<RegisteredTrace[]>;
60
+ schematics?: DataSlice<VersionSnapshot[]>;
61
+ fileTree?: DataSlice<FileTree>;
62
+ git?: DataSlice<any>;
63
+ }
64
+ /**
65
+ * Typed panel props for TraceListPanel
66
+ */
67
+ export type TraceListPanelPropsTyped = PanelComponentProps<TraceListPanelActions, TraceListPanelContext>;
7
68
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAEV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EAGf,cAAc,EACd,UAAU,EACV,iBAAiB,EAGjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAGnB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,WAAW,EAGX,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAEV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EAGf,cAAc,EACd,UAAU,EACV,iBAAiB,EAGjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAGnB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,WAAW,EAGX,kBAAkB,EAClB,WAAW,EACX,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACV,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAM9C;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,CAC3D,wBAAwB,EACxB,wBAAwB,CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,mBAAmB,CAChE,YAAY,EACZ,6BAA6B,CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,CAC7D,YAAY,EACZ,0BAA0B,CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,mBAAmB,CACxD,qBAAqB,EACrB,qBAAqB,CACtB,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Helper utilities for working with RegisteredTrace (new API)
3
+ *
4
+ * These helpers abstract away the complexity of the new multi-resource,
5
+ * multi-scope, three-category matching structure.
6
+ */
7
+ import type { RegisteredTrace } from '@principal-ai/principal-view-core';
8
+ /**
9
+ * Get primary service name from trace
10
+ * Uses first resource's serviceName
11
+ */
12
+ export declare function getServiceName(trace: RegisteredTrace): string;
13
+ /**
14
+ * Get all service names from trace (for multi-service traces)
15
+ */
16
+ export declare function getAllServiceNames(trace: RegisteredTrace): string[];
17
+ /**
18
+ * Get primary scope from trace
19
+ * Uses first resource's first scope
20
+ */
21
+ export declare function getPrimaryScope(trace: RegisteredTrace): {
22
+ name: string;
23
+ version: string;
24
+ } | null;
25
+ /**
26
+ * Get all scopes from trace (across all resources)
27
+ */
28
+ export declare function getAllScopes(trace: RegisteredTrace): Array<{
29
+ name: string;
30
+ version: string;
31
+ }>;
32
+ /**
33
+ * Check if trace has any matches (scenario or storyboard)
34
+ * Replaces: registryStatus === 'matched'
35
+ */
36
+ export declare function isTraceMatched(trace: RegisteredTrace): boolean;
37
+ /**
38
+ * Check if trace has full scenario matches
39
+ * More strict than isTraceMatched - requires actual scenario matches
40
+ */
41
+ export declare function hasScenarioMatches(trace: RegisteredTrace): boolean;
42
+ /**
43
+ * Get all scenario IDs that matched this trace
44
+ */
45
+ export declare function getMatchedScenarioIds(trace: RegisteredTrace): string[];
46
+ /**
47
+ * Get all storyboard IDs that matched this trace (from scenario matches)
48
+ */
49
+ export declare function getMatchedStoryboardIds(trace: RegisteredTrace): string[];
50
+ /**
51
+ * Get primary storyboard ID
52
+ * Returns first matched storyboard from scenario matches, then storyboard matches
53
+ */
54
+ export declare function getPrimaryStoryboardId(trace: RegisteredTrace): string | null;
55
+ /**
56
+ * Get primary scenario ID
57
+ * Returns first matched scenario ID
58
+ */
59
+ export declare function getPrimaryScenarioId(trace: RegisteredTrace): string | null;
60
+ /**
61
+ * Calculate matched nodes summary
62
+ * Replaces: trace.matchedNodesSummary
63
+ */
64
+ export declare function getMatchedNodesSummary(trace: RegisteredTrace): {
65
+ totalNodes: number;
66
+ matchedNodes: number;
67
+ coveragePercent: number;
68
+ };
69
+ /**
70
+ * Filter traces by scenario ID
71
+ * Replaces: traces.filter(t => t.matchInfo?.scenarioId === scenarioId)
72
+ */
73
+ export declare function filterTracesByScenario(traces: RegisteredTrace[], scenarioId: string): RegisteredTrace[];
74
+ /**
75
+ * Filter traces by storyboard ID
76
+ */
77
+ export declare function filterTracesByStoryboard(traces: RegisteredTrace[], storyboardId: string): RegisteredTrace[];
78
+ /**
79
+ * Get match quality indicator
80
+ * Replaces: trace.registryStatus
81
+ */
82
+ export declare function getMatchQuality(trace: RegisteredTrace): 'matched' | 'partial' | 'unmatched';
83
+ /**
84
+ * Get scope version (schema version)
85
+ * Replaces: trace.scope.version or trace.matchInfo?.schemaVersion
86
+ */
87
+ export declare function getSchemaVersion(trace: RegisteredTrace): string | null;
88
+ /**
89
+ * Check if trace has validation issues
90
+ */
91
+ export declare function hasValidationIssues(trace: RegisteredTrace): boolean;
92
+ /**
93
+ * Get validation issues by severity
94
+ */
95
+ export declare function getValidationIssuesBySeverity(trace: RegisteredTrace, severity: 'error' | 'warning' | 'info'): Array<{
96
+ category: string;
97
+ message: string;
98
+ suggestion?: string;
99
+ }>;
100
+ /**
101
+ * Create a grouping key for traces by service and scope
102
+ * Used for grouping traces in lists
103
+ */
104
+ export declare function getTraceGroupKey(trace: RegisteredTrace): string;
105
+ /**
106
+ * Get match info structure for backward compatibility
107
+ * Creates a structure similar to the old matchInfo for easier migration
108
+ */
109
+ export declare function getMatchInfo(trace: RegisteredTrace): {
110
+ storyboardId: string | null;
111
+ scenarioId: string | null;
112
+ schemaVersion: string | null;
113
+ hasMatch: boolean;
114
+ };
115
+ //# sourceMappingURL=traceHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceHelpers.d.ts","sourceRoot":"","sources":["../../src/utils/traceHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAEnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOhG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa7F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,EAAE,CAOxE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAK1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CA8BA;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EAAE,EACzB,UAAU,EAAE,MAAM,GACjB,eAAe,EAAE,CAInB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EAAE,EACzB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAKnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAQ3F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GACrC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAQnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAI/D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG;IACpD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACnB,CASA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@industry-theme/principal-view-panels",
3
- "version": "0.11.1",
3
+ "version": "0.11.3",
4
4
  "description": "Principal View Graph Panels for visualizing graph configurations from .principal-views/ folder as interactive diagrams",
5
5
  "type": "module",
6
6
  "main": "dist/panels.bundle.js",
@@ -52,18 +52,18 @@
52
52
  "build-storybook": "storybook build"
53
53
  },
54
54
  "peerDependencies": {
55
- "@principal-ade/dynamic-file-tree": "^0.1.68",
55
+ "@principal-ade/dynamic-file-tree": "^0.1.69",
56
56
  "@principal-ade/industry-theme": "^0.1.7",
57
- "@principal-ade/panel-framework-core": "^0.3.0",
57
+ "@principal-ade/panel-framework-core": "^0.4.2",
58
58
  "@principal-ade/utcp-panel-event": "^0.1.0",
59
59
  "@principal-ai/codebase-composition": "^0.2.43",
60
- "@principal-ai/principal-view-core": "^0.24.0",
60
+ "@principal-ai/principal-view-core": "^0.24.11",
61
61
  "@principal-ai/repository-abstraction": "^0.5.7",
62
62
  "react": ">=19.0.0",
63
63
  "react-dom": ">=19.0.0"
64
64
  },
65
65
  "dependencies": {
66
- "@principal-ai/principal-view-react": "0.13.4",
66
+ "@principal-ai/principal-view-react": "0.13.5",
67
67
  "@xyflow/react": "^12.0.0",
68
68
  "clsx": "^2.1.1",
69
69
  "framer-motion": "^11.0.0",
@@ -74,13 +74,13 @@
74
74
  "@chromatic-com/storybook": "^4.1.3",
75
75
  "@eslint/js": "^9.32.0",
76
76
  "@opentelemetry/api": "^1.9.0",
77
- "@principal-ade/dynamic-file-tree": "^0.1.68",
77
+ "@principal-ade/dynamic-file-tree": "^0.1.69",
78
78
  "@principal-ade/industry-theme": "^0.1.7",
79
- "@principal-ade/panel-framework-core": "^0.3.0",
79
+ "@principal-ade/panel-framework-core": "^0.4.2",
80
80
  "@principal-ade/panel-layouts": "^0.3.20",
81
81
  "@principal-ade/utcp-panel-event": "^0.1.0",
82
82
  "@principal-ai/codebase-composition": "^0.2.43",
83
- "@principal-ai/principal-view-core": "^0.24.0",
83
+ "@principal-ai/principal-view-core": "^0.24.11",
84
84
  "@principal-ai/repository-abstraction": "^0.5.7",
85
85
  "@storybook/addon-docs": "10.1.2",
86
86
  "@storybook/addon-links": "10.1.2",
@@ -1,54 +0,0 @@
1
- /**
2
- * Workflow matching utilities for multi-workflow trace analysis
3
- *
4
- * @deprecated These utilities are deprecated in favor of registry-based matching in RegisteredTrace
5
- */
6
- import type { WorkflowTemplate, WorkflowMatch } from '@principal-ai/principal-view-core';
7
- import type { RegisteredTrace } from '../types/otel';
8
- export interface WorkflowMatchingResult {
9
- matches: WorkflowMatch[];
10
- unmatchedEventNames: string[];
11
- totalEventCount: number;
12
- matchedEventCount: number;
13
- }
14
- export interface WorkflowMetadata {
15
- id: string;
16
- storyboardId: string;
17
- storyboardName: string;
18
- template: WorkflowTemplate;
19
- }
20
- /**
21
- * Match a trace against multiple workflows to determine which workflows it touches
22
- *
23
- * This function:
24
- * 1. Converts trace spans to OtelEvents
25
- * 2. Runs renderWorkflow() against each workflow template
26
- * 3. Tracks which events matched vs unmatched
27
- * 4. Returns comprehensive matching results
28
- *
29
- * @deprecated Use registry-based matching in RegisteredTrace instead
30
- * @param trace - The trace to analyze
31
- * @param workflows - Array of workflows with metadata (from DiscoveredWorkflow)
32
- * @returns Matching results with matched workflows, unmatched events, and coverage metrics
33
- */
34
- export declare function matchTraceToWorkflows(trace: RegisteredTrace, workflows: WorkflowMetadata[]): WorkflowMatchingResult;
35
- /**
36
- * Enrich a trace with multi-workflow matching information
37
- *
38
- * This updates the trace object with matchedWorkflows, unmatchedEventNames, and totalEventCount
39
- *
40
- * @deprecated Use registry-based matching in RegisteredTrace instead
41
- * @param trace - The trace to enrich
42
- * @param workflows - Array of workflows with metadata to match against
43
- * @returns The enriched trace
44
- */
45
- export declare function enrichTraceWithWorkflowMatches(trace: RegisteredTrace, _workflows: WorkflowMetadata[]): RegisteredTrace;
46
- /**
47
- * Calculate coverage percentage for a trace
48
- *
49
- * @deprecated Use RegisteredTrace.matchedNodesSummary.coveragePercent instead
50
- * @param trace - Trace with workflow matching information
51
- * @returns Coverage percentage (0-100)
52
- */
53
- export declare function calculateCoveragePercentage(trace: RegisteredTrace): number;
54
- //# sourceMappingURL=workflowMatching.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflowMatching.d.ts","sourceRoot":"","sources":["../../src/utils/workflowMatching.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAyD,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAChJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAkCD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,gBAAgB,EAAE,GAC5B,sBAAsB,CAmExB;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,gBAAgB,EAAE,GAC7B,eAAe,CAIjB;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE1E"}