@atlaskit/ads-mcp 0.18.1 → 0.19.1
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/CHANGELOG.md +15 -0
- package/README.md +2 -2
- package/dist/cjs/helpers/fuse-multi-term.js +130 -0
- package/dist/cjs/helpers/index.js +15 -1
- package/dist/cjs/index.js +28 -14
- package/dist/cjs/instructions.js +1 -1
- package/dist/cjs/tools/analyze-a11y/index.js +12 -12
- package/dist/cjs/tools/get-a11y-guidelines/index.js +3 -3
- package/dist/cjs/tools/{get-components → get-all-components}/index.js +6 -6
- package/dist/cjs/tools/get-all-icons/index.js +1 -1
- package/dist/cjs/tools/get-all-tokens/index.js +1 -1
- package/dist/cjs/tools/get-guidelines/index.js +4 -4
- package/dist/cjs/tools/get-lint-rules/index.js +5 -5
- package/dist/cjs/tools/i18n-conversion/index.js +3 -3
- package/dist/cjs/tools/migration-guides/index.js +3 -3
- package/dist/cjs/tools/plan/index.js +13 -17
- package/dist/cjs/tools/search-components/index.js +44 -65
- package/dist/cjs/tools/search-icons/index.js +42 -68
- package/dist/cjs/tools/search-tokens/index.js +56 -43
- package/dist/cjs/tools/suggest-a11y-fixes/index.js +7 -7
- package/dist/es2019/helpers/fuse-multi-term.js +98 -0
- package/dist/es2019/helpers/index.js +1 -0
- package/dist/es2019/index.js +81 -83
- package/dist/es2019/instructions.js +2 -1
- package/dist/es2019/tools/analyze-a11y/index.js +28 -12
- package/dist/es2019/tools/get-a11y-guidelines/index.js +10 -3
- package/dist/es2019/tools/{get-components → get-all-components}/index.js +9 -4
- package/dist/es2019/tools/get-all-icons/index.js +6 -1
- package/dist/es2019/tools/get-all-tokens/index.js +6 -1
- package/dist/es2019/tools/get-guidelines/index.js +20 -7
- package/dist/es2019/tools/get-lint-rules/index.js +12 -8
- package/dist/es2019/tools/i18n-conversion/index.js +10 -13
- package/dist/es2019/tools/migration-guides/index.js +10 -4
- package/dist/es2019/tools/plan/index.js +25 -25
- package/dist/es2019/tools/search-components/index.js +42 -56
- package/dist/es2019/tools/search-icons/index.js +37 -62
- package/dist/es2019/tools/search-tokens/index.js +54 -45
- package/dist/es2019/tools/suggest-a11y-fixes/index.js +16 -7
- package/dist/esm/helpers/fuse-multi-term.js +122 -0
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/index.js +28 -14
- package/dist/esm/instructions.js +1 -1
- package/dist/esm/tools/analyze-a11y/index.js +12 -12
- package/dist/esm/tools/get-a11y-guidelines/index.js +3 -3
- package/dist/esm/tools/{get-components → get-all-components}/index.js +5 -5
- package/dist/esm/tools/get-all-icons/index.js +1 -1
- package/dist/esm/tools/get-all-tokens/index.js +1 -1
- package/dist/esm/tools/get-guidelines/index.js +4 -4
- package/dist/esm/tools/get-lint-rules/index.js +5 -5
- package/dist/esm/tools/i18n-conversion/index.js +3 -3
- package/dist/esm/tools/migration-guides/index.js +3 -3
- package/dist/esm/tools/plan/index.js +13 -17
- package/dist/esm/tools/search-components/index.js +45 -66
- package/dist/esm/tools/search-icons/index.js +43 -69
- package/dist/esm/tools/search-tokens/index.js +57 -44
- package/dist/esm/tools/suggest-a11y-fixes/index.js +7 -7
- package/dist/types/helpers/fuse-multi-term.d.ts +45 -0
- package/dist/types/helpers/index.d.ts +1 -0
- package/dist/types/instructions.d.ts +1 -1
- package/dist/types/tools/{get-components → get-all-components}/index.d.ts +2 -2
- package/dist/types/tools/plan/index.d.ts +1 -4
- package/dist/types/tools/search-components/index.d.ts +1 -4
- package/dist/types/tools/search-icons/index.d.ts +1 -4
- package/dist/types/tools/search-tokens/index.d.ts +1 -4
- package/dist/types-ts4.5/helpers/fuse-multi-term.d.ts +45 -0
- package/dist/types-ts4.5/helpers/index.d.ts +1 -0
- package/dist/types-ts4.5/instructions.d.ts +1 -1
- package/dist/types-ts4.5/tools/{get-components → get-all-components}/index.d.ts +2 -2
- package/dist/types-ts4.5/tools/plan/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-components/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-icons/index.d.ts +1 -4
- package/dist/types-ts4.5/tools/search-tokens/index.d.ts +1 -4
- package/package.json +6 -6
- /package/dist/cjs/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/cjs/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/es2019/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/components.codegen.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/components.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/load-all-components.js +0 -0
- /package/dist/esm/tools/{get-components → get-all-components}/types.js +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/components.codegen.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/components.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/load-all-components.d.ts +0 -0
- /package/dist/types/tools/{get-components → get-all-components}/types.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/components.codegen.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/components.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/load-all-components.d.ts +0 -0
- /package/dist/types-ts4.5/tools/{get-components → get-all-components}/types.d.ts +0 -0
|
@@ -5,22 +5,19 @@ export declare const planInputSchema: z.ZodObject<{
|
|
|
5
5
|
icons: z.ZodArray<z.ZodString, 'many'>;
|
|
6
6
|
components: z.ZodArray<z.ZodString, 'many'>;
|
|
7
7
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
8
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
9
8
|
}, 'strip', z.ZodTypeAny, {
|
|
10
9
|
tokens: string[];
|
|
11
10
|
icons: string[];
|
|
12
11
|
components: string[];
|
|
13
12
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
13
|
}, {
|
|
16
14
|
tokens: string[];
|
|
17
15
|
icons: string[];
|
|
18
16
|
components: string[];
|
|
19
17
|
limit?: number | undefined;
|
|
20
|
-
exactName?: boolean | undefined;
|
|
21
18
|
}>;
|
|
22
19
|
export declare const listPlanTool: Tool;
|
|
23
|
-
export declare const planTool: (
|
|
20
|
+
export declare const planTool: ({ tokens: tokens_search, icons: icons_search, components: components_search, limit, }: z.infer<typeof planInputSchema>) => Promise<{
|
|
24
21
|
isError: boolean;
|
|
25
22
|
content: {
|
|
26
23
|
type: string;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchComponentsInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchComponentsTool: Tool;
|
|
17
|
-
export declare const searchComponentsTool: (
|
|
14
|
+
export declare const searchComponentsTool: ({ terms, limit, }: z.infer<typeof searchComponentsInputSchema>) => Promise<CallToolResult>;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchIconsInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchIconsTool: Tool;
|
|
17
|
-
export declare const searchIconsTool: (
|
|
14
|
+
export declare const searchIconsTool: ({ terms, limit, }: z.infer<typeof searchIconsInputSchema>) => Promise<CallToolResult>;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchTokensInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchTokensTool: Tool;
|
|
17
|
-
export declare const searchTokensTool: (
|
|
14
|
+
export declare const searchTokensTool: ({ terms, limit, }: z.infer<typeof searchTokensInputSchema>) => Promise<CallToolResult>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allocation for multi-query Fuse search: each term alone, plus one spaced combined query.
|
|
3
|
+
*
|
|
4
|
+
* `poolMax = limit * termCount`. From each term we take up to `perTermTake` hits; the rest of the
|
|
5
|
+
* pool is filled from the spaced combined query.
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeMultiTermFuseAllocation(limit: number, termCount: number): {
|
|
8
|
+
/**
|
|
9
|
+
* The amount token by each term, minimum of 1.
|
|
10
|
+
*/
|
|
11
|
+
perTermTake: number;
|
|
12
|
+
/**
|
|
13
|
+
* Hits to take from the spaced combined query.
|
|
14
|
+
*/
|
|
15
|
+
combinedTake: number;
|
|
16
|
+
/**
|
|
17
|
+
* The total amount of hits to take, minimum of 1.
|
|
18
|
+
*/
|
|
19
|
+
totalTake: number;
|
|
20
|
+
};
|
|
21
|
+
export type FuseHit<T> = {
|
|
22
|
+
item: T;
|
|
23
|
+
/**
|
|
24
|
+
* Fuse score when `includeScore` is enabled; lower is a better match.
|
|
25
|
+
*/
|
|
26
|
+
score?: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Runs `search` for each term (top `perTermTake`) and for `terms.join(' ')` (top `combinedTake`),
|
|
30
|
+
* merges pools, sorts globally by Fuse score, then returns the first `limit` **distinct** keys
|
|
31
|
+
* (later duplicate keys are skipped).
|
|
32
|
+
*
|
|
33
|
+
* Default `tokenKey` uses `item.name` when present; pass an explicit `tokenKey` for types without
|
|
34
|
+
* `name` (e.g. icons keyed by `componentName`).
|
|
35
|
+
*/
|
|
36
|
+
export declare function mergeMultiTermFuseResults<T>({ searchTerms, limit, search, tokenKey, searchTermsJoin, }: {
|
|
37
|
+
searchTerms: string[];
|
|
38
|
+
limit: number;
|
|
39
|
+
search: (query: string) => FuseHit<T>[];
|
|
40
|
+
tokenKey?: (item: T) => string;
|
|
41
|
+
/**
|
|
42
|
+
* Join the search terms when querying with this separator, eg. `color.text` vs. `color text`
|
|
43
|
+
*/
|
|
44
|
+
searchTermsJoin?: ' ' | '.';
|
|
45
|
+
}): T[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import { zodToJsonSchema as zodToJsonSchemaHelper } from 'zod-to-json-schema';
|
|
3
|
+
export { computeMultiTermFuseAllocation, type FuseHit, mergeMultiTermFuseResults, } from './fuse-multi-term';
|
|
3
4
|
export declare const cleanQuery: (query: string) => string;
|
|
4
5
|
export declare const zodToJsonSchema: <T = Tool["inputSchema"]>(schema: Parameters<typeof zodToJsonSchemaHelper>[0], options?: Parameters<typeof zodToJsonSchemaHelper>[1]) => T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const instructions = "\nYou are an expert in the Atlassian Design System (ADS).\nYou can search for tokens, icons, and components and return guidance on how to build user interfaces.\nYou have special accessibility knowledge and can ensure interfaces built with ADS components are accessible to all users.\nYou can analyze code for accessibility violations, provide specific fix suggestions, and offer guidance on accessibility best practices.\nThese tools will support you, but for deep research
|
|
1
|
+
export declare const instructions = "\nYou are an expert in the Atlassian Design System (ADS).\nYou can search for tokens, icons, and components and return guidance on how to build user interfaces.\nYou have special accessibility knowledge and can ensure interfaces built with ADS components are accessible to all users.\nYou can analyze code for accessibility violations, provide specific fix suggestions, and offer guidance on accessibility best practices.\nFor org-wide standards alongside ADS tools: pair Context Engine `get_accessibility_docs` with `ads_get_a11y_guidelines`, `get_content_standards_docs` with `ads_get_guidelines`, and `get_i18n_docs` with `ads_i18n_conversion_guide` (Traduki/i18n policy plus the bundled formatMessage refactor guide).\nThese tools will support you, but for deep research you may also fetch https://atlassian.design/llms.txt, https://atlassian.design/llms-a11y.txt, or https://atlassian.design/ directly.\n";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
2
|
+
export declare const listGetAllComponentsTool: Tool;
|
|
3
|
+
export declare const getAllComponentsTool: () => Promise<{
|
|
4
4
|
content: {
|
|
5
5
|
type: string;
|
|
6
6
|
text: string;
|
|
@@ -5,22 +5,19 @@ export declare const planInputSchema: z.ZodObject<{
|
|
|
5
5
|
icons: z.ZodArray<z.ZodString, 'many'>;
|
|
6
6
|
components: z.ZodArray<z.ZodString, 'many'>;
|
|
7
7
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
8
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
9
8
|
}, 'strip', z.ZodTypeAny, {
|
|
10
9
|
tokens: string[];
|
|
11
10
|
icons: string[];
|
|
12
11
|
components: string[];
|
|
13
12
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
13
|
}, {
|
|
16
14
|
tokens: string[];
|
|
17
15
|
icons: string[];
|
|
18
16
|
components: string[];
|
|
19
17
|
limit?: number | undefined;
|
|
20
|
-
exactName?: boolean | undefined;
|
|
21
18
|
}>;
|
|
22
19
|
export declare const listPlanTool: Tool;
|
|
23
|
-
export declare const planTool: (
|
|
20
|
+
export declare const planTool: ({ tokens: tokens_search, icons: icons_search, components: components_search, limit, }: z.infer<typeof planInputSchema>) => Promise<{
|
|
24
21
|
isError: boolean;
|
|
25
22
|
content: {
|
|
26
23
|
type: string;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchComponentsInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchComponentsTool: Tool;
|
|
17
|
-
export declare const searchComponentsTool: (
|
|
14
|
+
export declare const searchComponentsTool: ({ terms, limit, }: z.infer<typeof searchComponentsInputSchema>) => Promise<CallToolResult>;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchIconsInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchIconsTool: Tool;
|
|
17
|
-
export declare const searchIconsTool: (
|
|
14
|
+
export declare const searchIconsTool: ({ terms, limit, }: z.infer<typeof searchIconsInputSchema>) => Promise<CallToolResult>;
|
|
@@ -3,15 +3,12 @@ import { z } from 'zod';
|
|
|
3
3
|
export declare const searchTokensInputSchema: z.ZodObject<{
|
|
4
4
|
terms: z.ZodArray<z.ZodString, 'many'>;
|
|
5
5
|
limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
6
|
-
exactName: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
7
6
|
}, 'strip', z.ZodTypeAny, {
|
|
8
7
|
terms: string[];
|
|
9
8
|
limit?: number | undefined;
|
|
10
|
-
exactName?: boolean | undefined;
|
|
11
9
|
}, {
|
|
12
10
|
terms: string[];
|
|
13
11
|
limit?: number | undefined;
|
|
14
|
-
exactName?: boolean | undefined;
|
|
15
12
|
}>;
|
|
16
13
|
export declare const listSearchTokensTool: Tool;
|
|
17
|
-
export declare const searchTokensTool: (
|
|
14
|
+
export declare const searchTokensTool: ({ terms, limit, }: z.infer<typeof searchTokensInputSchema>) => Promise<CallToolResult>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/ads-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "The official Atlassian Design System MCP server to develop apps and user interfaces matching the Atlassian style.",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@atlaskit/icon": "^
|
|
37
|
+
"@atlaskit/icon": "^34.0.0",
|
|
38
38
|
"@atlaskit/icon-lab": "^6.2.0",
|
|
39
39
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
40
|
-
"@atlaskit/tokens": "^11.
|
|
41
|
-
"@axe-core/playwright": "^4.
|
|
42
|
-
"@axe-core/puppeteer": "^4.
|
|
40
|
+
"@atlaskit/tokens": "^11.4.0",
|
|
41
|
+
"@axe-core/playwright": "^4.11.1",
|
|
42
|
+
"@axe-core/puppeteer": "^4.11.1",
|
|
43
43
|
"@babel/runtime": "^7.0.0",
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.8.0",
|
|
45
|
-
"axe-core": "^4.
|
|
45
|
+
"axe-core": "^4.11.1",
|
|
46
46
|
"esbuild-register": "^3.4.1",
|
|
47
47
|
"fuse.js": "^6.6.2",
|
|
48
48
|
"jsdom": "^25.0.0",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/types-ts4.5/tools/{get-components → get-all-components}/components.codegen.d.ts
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/types-ts4.5/tools/{get-components → get-all-components}/load-all-components.d.ts
RENAMED
|
File without changes
|
|
File without changes
|