@glossarist/concept-browser 0.7.114 → 0.7.115
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/README.md +45 -2
- package/cli/index.mjs +15 -15
- package/cli/index.ts +9 -11
- package/data/concept-model/shapes/glossarist.concept.yaml.schema.json +255 -0
- package/package.json +14 -12
- package/scripts/__tests__/{bibliography.test.mjs → bibliography.test.ts} +1 -1
- package/scripts/__tests__/{cli-script-contract.test.mjs → cli-script-contract.test.ts} +3 -3
- package/scripts/__tests__/{concept-groups.test.mjs → concept-groups.test.ts} +1 -1
- package/scripts/__tests__/{doctor.test.mjs → doctor.test.ts} +1 -1
- package/scripts/__tests__/{fetch-datasets.test.mjs → fetch-datasets.test.ts} +1 -1
- package/scripts/__tests__/{first-non-empty.test.mjs → first-non-empty.test.ts} +1 -1
- package/scripts/__tests__/{process-about-pages.test.mjs → process-about-pages.test.ts} +1 -1
- package/scripts/{bridge-to-astro.mjs → bridge-to-astro.ts} +2 -4
- package/scripts/{build-edges.js → build-edges.ts} +11 -13
- package/scripts/{check-syntax.mjs → check-syntax.ts} +20 -13
- package/scripts/{fetch-datasets.mjs → fetch-datasets.ts} +2 -2
- package/scripts/{generate-data.mjs → generate-data.ts} +73 -460
- package/scripts/{generate-ontology-schema.mjs → generate-ontology-schema.ts} +2 -2
- package/scripts/lib/{build-cache.mjs → build-cache.ts} +3 -2
- package/scripts/lib/concept-formats.ts +206 -0
- package/scripts/lib/concept-uri.ts +14 -0
- package/scripts/lib/{dataset-turtle.mjs → dataset-turtle.ts} +4 -3
- package/scripts/lib/harmonize-concept.ts +86 -0
- package/scripts/lib/jsonld-emitter.ts +169 -0
- package/scripts/lib/{local-path-safety.mjs → local-path-safety.ts} +6 -2
- package/scripts/lib/yaml-types.ts +262 -0
- package/scripts/{process-about-pages.mjs → process-about-pages.ts} +1 -1
- package/scripts/{smoke.mjs → smoke.ts} +4 -3
- package/scripts/{validate-shacl.mjs → validate-shacl.ts} +5 -5
- package/scripts/validate-yaml.ts +144 -0
- package/src/__tests__/extract-source-refs.test.ts +2 -3
- package/src/__tests__/perf/serialization-perf.test.ts +5 -5
- package/src/__tests__/scripts/agents-turtle.test.ts +1 -1
- package/src/__tests__/scripts/bibliography-turtle.test.ts +1 -1
- package/src/__tests__/scripts/build-activity-turtle.test.ts +1 -1
- package/src/__tests__/scripts/build-cache.test.ts +1 -1
- package/src/__tests__/scripts/build-integration.test.ts +19 -19
- package/src/__tests__/scripts/dataset-turtle.test.ts +1 -1
- package/src/__tests__/scripts/migrate-v1-to-v3.test.ts +1 -1
- package/src/__tests__/scripts/normalize-yaml.test.ts +1 -1
- package/src/__tests__/scripts/turtle-escape.test.ts +1 -1
- package/src/__tests__/scripts/validate-yaml.test.ts +76 -0
- package/src/__tests__/scripts/version-turtle.test.ts +1 -1
- package/src/__tests__/scripts/vocab-turtle.test.ts +1 -1
- package/src/__tests__/scripts-syntax.test.ts +2 -2
- package/src/__tests__/use-rdf-document.test.ts +2 -3
- package/src/__tests__/utils/content-renderer-xss.test.ts +57 -0
- package/src/__tests__/validate-shacl.test.ts +3 -3
- package/src/adapters/wire/index.ts +69 -0
- package/src/utils/content-renderer.ts +7 -3
- package/src/utils/url-safety.ts +1 -5
- package/tsconfig.json +2 -2
- package/vite.config.ts +1 -1
- package/src/__tests__/composables/use-concept-edges-v2.test.ts +0 -167
- package/src/__tests__/composables/use-concept-edges-v2.test.ts.bak +0 -166
- package/src/types/agents-version-turtle.d.ts +0 -27
- package/src/types/bibliography-turtle.d.ts +0 -12
- package/src/types/build-activity-turtle.d.ts +0 -16
- package/src/types/build-cache.d.ts +0 -20
- package/src/types/dataset-turtle.d.ts +0 -32
- package/src/types/normalize-yaml.d.ts +0 -16
- package/src/types/turtle-escape.d.ts +0 -6
- package/src/types/vocab-turtle.d.ts +0 -13
- /package/scripts/{doctor.mjs → doctor.ts} +0 -0
- /package/scripts/{extract-source-refs.js → extract-source-refs.ts} +0 -0
- /package/scripts/{generate-404.js → generate-404.ts} +0 -0
- /package/scripts/{generate-ontology-data.mjs → generate-ontology-data.ts} +0 -0
- /package/scripts/lib/{agents-turtle.mjs → agents-turtle.ts} +0 -0
- /package/scripts/lib/{bibliography-turtle.mjs → bibliography-turtle.ts} +0 -0
- /package/scripts/lib/{bibliography.mjs → bibliography.ts} +0 -0
- /package/scripts/lib/build/{image-assets.mjs → image-assets.ts} +0 -0
- /package/scripts/lib/build/{non-verbal-consumer.mjs → non-verbal-consumer.ts} +0 -0
- /package/scripts/lib/{build-activity-turtle.mjs → build-activity-turtle.ts} +0 -0
- /package/scripts/lib/{concept-groups.mjs → concept-groups.ts} +0 -0
- /package/scripts/lib/{first-non-empty.mjs → first-non-empty.ts} +0 -0
- /package/scripts/lib/{turtle-escape.mjs → turtle-escape.ts} +0 -0
- /package/scripts/lib/{version-turtle.mjs → version-turtle.ts} +0 -0
- /package/scripts/lib/{vocab-turtle.mjs → vocab-turtle.ts} +0 -0
- /package/scripts/{load-site-config.mjs → load-site-config.ts} +0 -0
- /package/scripts/{migrate-v1-to-v3.mjs → migrate-v1-to-v3.ts} +0 -0
- /package/scripts/{normalize-yaml.mjs → normalize-yaml.ts} +0 -0
- /package/scripts/{sync-concept-model.mjs → sync-concept-model.ts} +0 -0
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
// glossarist 0.4.33 renamed PartitiveRelation → PartitiveHyperedge.
|
|
3
|
-
// Import from glossarist/models (extended by our local augmentation).
|
|
4
|
-
import type {
|
|
5
|
-
PartitiveHyperedge,
|
|
6
|
-
PartitiveMember,
|
|
7
|
-
ConceptRef,
|
|
8
|
-
} from 'glossarist/models';
|
|
9
|
-
import {
|
|
10
|
-
PartitiveHyperedge as PartitiveHyperedgeModel,
|
|
11
|
-
PartitiveMember as PartitiveMemberModel,
|
|
12
|
-
ConceptRef as ConceptRefModel,
|
|
13
|
-
} from 'glossarist/models';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Verifies glossarist-js 0.4.26's MECE-native PartitiveRelation model
|
|
17
|
-
* (ISO 704:2022 presence × count + is_delimiting).
|
|
18
|
-
*
|
|
19
|
-
* The concept-browser consumes these fields directly (no migration
|
|
20
|
-
* bridge). These specs pin the runtime contract so a regression in
|
|
21
|
-
* upstream is caught here.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
function makeRef(source: string, id: string): ConceptRef {
|
|
25
|
-
return ConceptRefModel.fromJSON({ source, id }) as ConceptRef;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function makePartitive(
|
|
29
|
-
source: string,
|
|
30
|
-
id: string,
|
|
31
|
-
fields: { presence?: 'required' | 'optional'; count?: 'exactly_one' | 'at_least_one' | 'multiple'; isDelimiting?: boolean } = {},
|
|
32
|
-
): PartitiveMember {
|
|
33
|
-
const data: {
|
|
34
|
-
ref: ConceptRef;
|
|
35
|
-
presence?: 'required' | 'optional';
|
|
36
|
-
count?: 'exactly_one' | 'at_least_one' | 'multiple';
|
|
37
|
-
is_delimiting?: boolean;
|
|
38
|
-
} = { ref: makeRef(source, id) };
|
|
39
|
-
if (fields.presence) data.presence = fields.presence;
|
|
40
|
-
if (fields.count) data.count = fields.count;
|
|
41
|
-
if (fields.isDelimiting) data.is_delimiting = fields.isDelimiting;
|
|
42
|
-
return PartitiveMemberModel.fromJSON(data as unknown as Record<string, unknown>) as PartitiveMember;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function makeRelation(opts: {
|
|
46
|
-
comprehensive: ConceptRef;
|
|
47
|
-
partitives: PartitiveMember[];
|
|
48
|
-
completeness?: 'complete' | 'partial';
|
|
49
|
-
criterion?: Record<string, string>;
|
|
50
|
-
}): PartitiveHyperedge {
|
|
51
|
-
return PartitiveHyperedgeModel.fromJSON(opts as unknown as Record<string, unknown>) as PartitiveHyperedge;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
describe('useConceptEdges — MECE PartitiveRelation (glossarist 0.4.26)', () => {
|
|
55
|
-
describe('PartitiveMember (ISO 704:2022 presence × count + delimiting)', () => {
|
|
56
|
-
it('presence defaults to required, count defaults to exactly_one', () => {
|
|
57
|
-
const m = makePartitive('test', '1.1');
|
|
58
|
-
expect(m.presence).toBe('required');
|
|
59
|
-
expect(m.presence === "required").toBe(true);
|
|
60
|
-
expect(m.presence === "optional").toBe(false);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('count defaults to exactly_one', () => {
|
|
64
|
-
const m = makePartitive('test', '1.1');
|
|
65
|
-
expect(m.count).toBe('exactly_one');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('presence=optional is preserved', () => {
|
|
69
|
-
const m = makePartitive('test', '1.1', { presence: 'optional' });
|
|
70
|
-
expect(m.presence).toBe('optional');
|
|
71
|
-
expect(m.presence === "optional").toBe(true);
|
|
72
|
-
expect(m.presence === "required").toBe(false);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('count=multiple is preserved', () => {
|
|
76
|
-
const m = makePartitive('test', '1.1', { count: 'multiple' });
|
|
77
|
-
expect(m.count).toBe('multiple');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('count=at_least_one is preserved', () => {
|
|
81
|
-
const m = makePartitive('test', '1.1', { count: 'at_least_one' });
|
|
82
|
-
expect(m.count).toBe('at_least_one');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('is_delimiting defaults to false', () => {
|
|
86
|
-
const m = makePartitive('test', '1.1');
|
|
87
|
-
expect((m as any).is_delimiting).toBe(false);
|
|
88
|
-
expect((m as any).is_delimiting).toBe(false);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('is_delimiting is preserved when set to true', () => {
|
|
92
|
-
const m = makePartitive('test', '1.1', { isDelimiting: true });
|
|
93
|
-
expect((m as any).is_delimiting).toBe(true);
|
|
94
|
-
expect((m as any).is_delimiting).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('rejects the vacuous (presence=optional, count=at_least_one)', () => {
|
|
98
|
-
expect(() =>
|
|
99
|
-
makePartitive('test', '1.1', { presence: 'optional', count: 'at_least_one' }),
|
|
100
|
-
).toThrow(/collapses to optional \+ multiple/);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
describe('PartitiveRelation', () => {
|
|
105
|
-
it('accepts 2 members with default axes', () => {
|
|
106
|
-
const r = makeRelation({
|
|
107
|
-
comprehensive: makeRef('test', '1.3'),
|
|
108
|
-
partitives: [makePartitive('test', '1.4'), makePartitive('test', '1.5')],
|
|
109
|
-
});
|
|
110
|
-
expect((r as any).members).toHaveLength(2);
|
|
111
|
-
expect((r as any).completeness).toBe('complete');
|
|
112
|
-
expect((r as any).isComplete).toBe(true);
|
|
113
|
-
expect((r as any).isPartial).toBe(false);
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('completeness=partial is preserved', () => {
|
|
117
|
-
const r = makeRelation({
|
|
118
|
-
comprehensive: makeRef('test', '1.3'),
|
|
119
|
-
partitives: [makePartitive('test', '1.4'), makePartitive('test', '1.5')],
|
|
120
|
-
completeness: 'partial',
|
|
121
|
-
});
|
|
122
|
-
expect((r as any).completeness).toBe('partial');
|
|
123
|
-
expect((r as any).isPartial).toBe(true);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('isCoordinate true when ≥2 partitives', () => {
|
|
127
|
-
const r = makeRelation({
|
|
128
|
-
comprehensive: makeRef('test', '1.3'),
|
|
129
|
-
partitives: [makePartitive('test', '1.4'), makePartitive('test', '1.5')],
|
|
130
|
-
});
|
|
131
|
-
expect((r as any).isCoordinate).toBe(true);
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it('rejects < 2 partitives (ISO 704 requirement)', () => {
|
|
135
|
-
expect(() => makeRelation({
|
|
136
|
-
comprehensive: makeRef('test', '1.3'),
|
|
137
|
-
partitives: [makePartitive('test', '1.4')],
|
|
138
|
-
})).toThrow(/≥2 partitives/);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('round-trips through toJSON with MECE fields', () => {
|
|
142
|
-
const r = makeRelation({
|
|
143
|
-
comprehensive: makeRef('test', '1.3'),
|
|
144
|
-
partitives: [
|
|
145
|
-
makePartitive('test', '1.4', { presence: 'required', count: 'multiple' }),
|
|
146
|
-
makePartitive('test', '1.5', { presence: 'optional', isDelimiting: true }),
|
|
147
|
-
],
|
|
148
|
-
completeness: 'partial',
|
|
149
|
-
criterion: { eng: 'physical structure' },
|
|
150
|
-
});
|
|
151
|
-
const json = r.toJSON() as {
|
|
152
|
-
comprehensive: unknown;
|
|
153
|
-
partitives: Array<{ presence?: string; count?: string; is_delimiting?: boolean; ref: unknown }>;
|
|
154
|
-
completeness: string;
|
|
155
|
-
criterion?: Record<string, string>;
|
|
156
|
-
};
|
|
157
|
-
expect(json.comprehensive).toBeDefined();
|
|
158
|
-
expect(json.partitives).toHaveLength(2);
|
|
159
|
-
expect(json.partitives[0].count).toBe('multiple');
|
|
160
|
-
expect(json.partitives[1].presence).toBe('optional');
|
|
161
|
-
expect(json.partitives[1].is_delimiting).toBe(true);
|
|
162
|
-
expect(json.completeness).toBe('partial');
|
|
163
|
-
expect(json.criterion).toEqual({ eng: 'physical structure' });
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
});
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/agents-turtle.mjs' {
|
|
2
|
-
export function buildAgentsTurtle(
|
|
3
|
-
contributors: readonly { name: string; role?: string; organization?: string; url?: string; email?: string }[],
|
|
4
|
-
agentBase?: string,
|
|
5
|
-
): string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
declare module '*/scripts/lib/version-turtle.mjs' {
|
|
9
|
-
export interface VersionInput {
|
|
10
|
-
readonly registerId: string;
|
|
11
|
-
readonly version: string;
|
|
12
|
-
readonly versionIri: string;
|
|
13
|
-
readonly datasetIri: string;
|
|
14
|
-
readonly generatedAt: string;
|
|
15
|
-
readonly previousVersionIri?: string;
|
|
16
|
-
readonly changeSummary?: string;
|
|
17
|
-
readonly associatedAgentIri?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface VersionHistoryInput {
|
|
20
|
-
readonly registerId: string;
|
|
21
|
-
readonly datasetIri: string;
|
|
22
|
-
readonly versions: readonly { version: string; generatedAt: string; changeSummary?: string }[];
|
|
23
|
-
readonly associatedAgentIri?: string;
|
|
24
|
-
}
|
|
25
|
-
export function buildVersionTurtle(input: VersionInput): string;
|
|
26
|
-
export function buildVersionHistoryTurtle(input: VersionHistoryInput): string;
|
|
27
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/bibliography-turtle.mjs' {
|
|
2
|
-
export interface BibliographyEntryJson {
|
|
3
|
-
readonly reference?: string;
|
|
4
|
-
readonly title?: string;
|
|
5
|
-
readonly link?: string;
|
|
6
|
-
}
|
|
7
|
-
export function buildBibliographyTurtle(
|
|
8
|
-
register: string,
|
|
9
|
-
bibliographyJson: Record<string, BibliographyEntryJson>,
|
|
10
|
-
baseUri?: string,
|
|
11
|
-
): string;
|
|
12
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/build-activity-turtle.mjs' {
|
|
2
|
-
export interface BuildActivityTurtleInput {
|
|
3
|
-
readonly runId: string;
|
|
4
|
-
readonly startedAt: string;
|
|
5
|
-
readonly endedAt: string;
|
|
6
|
-
readonly gitSha?: string | null;
|
|
7
|
-
readonly gitBranch?: string | null;
|
|
8
|
-
readonly toolId: string;
|
|
9
|
-
readonly toolVersion: string;
|
|
10
|
-
readonly datasetRegisters: readonly string[];
|
|
11
|
-
readonly conceptCount: number;
|
|
12
|
-
readonly associatedAgentIri?: string | null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function buildActivityTurtle(input: BuildActivityTurtleInput): string;
|
|
16
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/build-cache.mjs' {
|
|
2
|
-
export interface BuildCacheEntry<T = unknown> {
|
|
3
|
-
hash: string;
|
|
4
|
-
value: T;
|
|
5
|
-
storedAt: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export class BuildCache {
|
|
9
|
-
constructor(cacheDir: string);
|
|
10
|
-
get<T = unknown>(key: string): Promise<BuildCacheEntry<T> | null>;
|
|
11
|
-
set<T = unknown>(key: string, value: T, hash: string): Promise<void>;
|
|
12
|
-
readThrough<T>(
|
|
13
|
-
key: string,
|
|
14
|
-
hash: string,
|
|
15
|
-
producer: () => Promise<T>,
|
|
16
|
-
): Promise<{ value: T; hit: boolean }>;
|
|
17
|
-
pathFor(key: string): string;
|
|
18
|
-
static hash(input: string): string;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/dataset-turtle.mjs' {
|
|
2
|
-
export interface DatasetDistribution {
|
|
3
|
-
readonly id: string;
|
|
4
|
-
readonly title: string;
|
|
5
|
-
readonly mediaType: string;
|
|
6
|
-
readonly downloadUrl: string;
|
|
7
|
-
readonly byteSize?: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface DatasetSection {
|
|
11
|
-
readonly collectionIri: string;
|
|
12
|
-
readonly title: string;
|
|
13
|
-
readonly memberUris: readonly string[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface DatasetTurtleInput {
|
|
17
|
-
readonly datasetIri: string;
|
|
18
|
-
readonly registerId: string;
|
|
19
|
-
readonly title: string;
|
|
20
|
-
readonly description?: string;
|
|
21
|
-
readonly modified: string;
|
|
22
|
-
readonly languages: readonly string[];
|
|
23
|
-
readonly distributions: readonly DatasetDistribution[];
|
|
24
|
-
readonly topConceptUris: readonly string[];
|
|
25
|
-
readonly sections: readonly DatasetSection[];
|
|
26
|
-
readonly sourceRepoUrl?: string;
|
|
27
|
-
readonly publisherIri?: string;
|
|
28
|
-
readonly contactIri?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function buildDatasetTurtle(input: DatasetTurtleInput): string;
|
|
32
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/normalize-yaml.mjs' {
|
|
2
|
-
export interface NormalizeResult {
|
|
3
|
-
checked: number;
|
|
4
|
-
nonNfc: number;
|
|
5
|
-
fixed: string[];
|
|
6
|
-
check: boolean;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface NormalizeOptions {
|
|
10
|
-
root?: string;
|
|
11
|
-
check?: boolean;
|
|
12
|
-
paths?: string[];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function normalizeYaml(options?: NormalizeOptions): NormalizeResult;
|
|
16
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/turtle-escape.mjs' {
|
|
2
|
-
export function ttlLit(s: unknown): string;
|
|
3
|
-
export function ttlPrefixed(qname: string): string;
|
|
4
|
-
export function ttlIri(iri: string): string;
|
|
5
|
-
export function assertValidIri(iri: unknown, context?: string): string;
|
|
6
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
declare module '*/scripts/lib/vocab-turtle.mjs' {
|
|
2
|
-
export interface VocabTerm {
|
|
3
|
-
readonly iri: string;
|
|
4
|
-
readonly label: string;
|
|
5
|
-
}
|
|
6
|
-
export interface VocabScheme {
|
|
7
|
-
readonly schemeIri: string;
|
|
8
|
-
readonly label: string;
|
|
9
|
-
readonly terms: readonly VocabTerm[];
|
|
10
|
-
}
|
|
11
|
-
export function buildVocabularyTurtle(): string;
|
|
12
|
-
export function listVocabSchemes(): readonly VocabScheme[];
|
|
13
|
-
}
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|