@pgpm/measurements 0.15.3 → 0.15.5
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/Makefile +1 -1
- package/README.md +1 -1
- package/package.json +4 -4
- package/pgpm-measurements.control +1 -1
- package/__tests__/__snapshots__/measurements.test.ts.snap +0 -309
- package/__tests__/measurements.test.ts +0 -124
- package/jest.config.js +0 -15
- /package/sql/{pgpm-measurements--0.15.2.sql → pgpm-measurements--0.15.3.sql} +0 -0
package/Makefile
CHANGED
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<img height="20" src="https://github.com/constructive-io/pgpm-modules/actions/workflows/ci.yml/badge.svg" />
|
|
10
10
|
</a>
|
|
11
11
|
<a href="https://github.com/constructive-io/pgpm-modules/blob/main/LICENSE"><img height="20" src="https://img.shields.io/badge/license-MIT-blue.svg"/></a>
|
|
12
|
-
<a href="https://www.npmjs.com/package/@pgpm/measurements"><img height="20" src="https://img.shields.io/github/package-json/v/constructive-io/pgpm-modules?filename=packages%
|
|
12
|
+
<a href="https://www.npmjs.com/package/@pgpm/measurements"><img height="20" src="https://img.shields.io/github/package-json/v/constructive-io/pgpm-modules?filename=packages%2Fmeasurements%2Fpackage.json"/></a>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
15
|
Measurement utilities for performance tracking and analytics.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pgpm/measurements",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.5",
|
|
4
4
|
"description": "Measurement utilities for performance tracking and analytics",
|
|
5
5
|
"author": "Dan Lynch <pyramation@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"test:watch": "jest --watch"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@pgpm/verify": "0.15.
|
|
24
|
+
"@pgpm/verify": "0.15.5"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"pgpm": "^1.
|
|
27
|
+
"pgpm": "^1.3.0"
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
@@ -34,5 +34,5 @@
|
|
|
34
34
|
"bugs": {
|
|
35
35
|
"url": "https://github.com/constructive-io/pgpm-modules/issues"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "f6bbdfb20760e308b02968038b6f54191a9fd527"
|
|
38
38
|
}
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`measurements schema should find dimensionless quantities 1`] = `
|
|
4
|
-
{
|
|
5
|
-
"dimensionlessQuantities": [
|
|
6
|
-
{
|
|
7
|
-
"description": "a dimensionless quantity",
|
|
8
|
-
"label": "Dimensionless",
|
|
9
|
-
"name": "Dimensionless",
|
|
10
|
-
"unit": null,
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"description": "something generally accepted as a medium of exchange, a measure of value, or a means of payment",
|
|
14
|
-
"label": "Money",
|
|
15
|
-
"name": "Money",
|
|
16
|
-
"unit": null,
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
}
|
|
20
|
-
`;
|
|
21
|
-
|
|
22
|
-
exports[`measurements schema should find quantities by unit 1`] = `
|
|
23
|
-
{
|
|
24
|
-
"meterQuantities": [
|
|
25
|
-
{
|
|
26
|
-
"label": "Acceleration",
|
|
27
|
-
"name": "Acceleration",
|
|
28
|
-
"unit": "m/s²",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"label": "Amount Of Substance",
|
|
32
|
-
"name": "AmountOfSubstance",
|
|
33
|
-
"unit": "mol",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"label": "Area",
|
|
37
|
-
"name": "Area",
|
|
38
|
-
"unit": "m²",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"label": "Kinematic Viscosity",
|
|
42
|
-
"name": "KinematicViscosity",
|
|
43
|
-
"unit": "m²/s",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"label": "Length",
|
|
47
|
-
"name": "Length",
|
|
48
|
-
"unit": "m",
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"label": "Luminous Flux",
|
|
52
|
-
"name": "LuminousFlux",
|
|
53
|
-
"unit": "lm",
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"label": "Parts per Million",
|
|
57
|
-
"name": "PartsPerMillion",
|
|
58
|
-
"unit": "ppm",
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"label": "Radiation Dose Effective",
|
|
62
|
-
"name": "RadiationDoseEffective",
|
|
63
|
-
"unit": "equivalent) dose of radiation received by a human or some other living organism. The system unit for this quantity is Sv",
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"label": "Torque",
|
|
67
|
-
"name": "Torque",
|
|
68
|
-
"unit": "N·m",
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"label": "Velocity",
|
|
72
|
-
"name": "Velocity",
|
|
73
|
-
"unit": "m/s",
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"label": "Volume",
|
|
77
|
-
"name": "Volume",
|
|
78
|
-
"unit": "m³",
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"label": "Volumetric Density",
|
|
82
|
-
"name": "VolumetricDensity",
|
|
83
|
-
"unit": "kg/m³",
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
"label": "Volumetric Flow Rate",
|
|
87
|
-
"name": "VolumetricFlowRate",
|
|
88
|
-
"unit": "m³/s",
|
|
89
|
-
},
|
|
90
|
-
],
|
|
91
|
-
}
|
|
92
|
-
`;
|
|
93
|
-
|
|
94
|
-
exports[`measurements schema should handle percentage and parts-per quantities 1`] = `
|
|
95
|
-
{
|
|
96
|
-
"ratioQuantities": [
|
|
97
|
-
{
|
|
98
|
-
"label": "Parts per Billion",
|
|
99
|
-
"name": "PartsPerBillion",
|
|
100
|
-
"unit": "ppb",
|
|
101
|
-
"unit_desc": "parts per billion",
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"label": "Parts per Million",
|
|
105
|
-
"name": "PartsPerMillion",
|
|
106
|
-
"unit": "ppm",
|
|
107
|
-
"unit_desc": "parts per million",
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
"label": "Percent",
|
|
111
|
-
"name": "Percent",
|
|
112
|
-
"unit": "%",
|
|
113
|
-
"unit_desc": "percentage",
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
}
|
|
117
|
-
`;
|
|
118
|
-
|
|
119
|
-
exports[`measurements schema should have quantities table with correct structure 1`] = `
|
|
120
|
-
{
|
|
121
|
-
"columns": [
|
|
122
|
-
{
|
|
123
|
-
"column_name": "id",
|
|
124
|
-
"data_type": "integer",
|
|
125
|
-
"is_nullable": "NO",
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
"column_name": "name",
|
|
129
|
-
"data_type": "text",
|
|
130
|
-
"is_nullable": "YES",
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
"column_name": "label",
|
|
134
|
-
"data_type": "text",
|
|
135
|
-
"is_nullable": "YES",
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
"column_name": "unit",
|
|
139
|
-
"data_type": "text",
|
|
140
|
-
"is_nullable": "YES",
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"column_name": "unit_desc",
|
|
144
|
-
"data_type": "text",
|
|
145
|
-
"is_nullable": "YES",
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
"column_name": "description",
|
|
149
|
-
"data_type": "text",
|
|
150
|
-
"is_nullable": "YES",
|
|
151
|
-
},
|
|
152
|
-
],
|
|
153
|
-
}
|
|
154
|
-
`;
|
|
155
|
-
|
|
156
|
-
exports[`measurements schema should retrieve basic physical quantities 1`] = `
|
|
157
|
-
{
|
|
158
|
-
"basicQuantities": [
|
|
159
|
-
{
|
|
160
|
-
"description": "a period of existence or persistence",
|
|
161
|
-
"id": "[ID]",
|
|
162
|
-
"label": "Duration",
|
|
163
|
-
"name": "Duration",
|
|
164
|
-
"unit": "s",
|
|
165
|
-
"unit_desc": "second",
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"description": "the amount of electric charge flowing past a specified circuit point per unit time",
|
|
169
|
-
"id": "[ID]",
|
|
170
|
-
"label": "Electric Current",
|
|
171
|
-
"name": "ElectricCurrent",
|
|
172
|
-
"unit": "A",
|
|
173
|
-
"unit_desc": "Ampere",
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
"description": "the extent of something along its greatest dimension or the extent of space between two objects or places",
|
|
177
|
-
"id": "[ID]",
|
|
178
|
-
"label": "Length",
|
|
179
|
-
"name": "Length",
|
|
180
|
-
"unit": "m",
|
|
181
|
-
"unit_desc": "meter",
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
"description": "the measure of the quantity of matter that a body or an object contains",
|
|
185
|
-
"id": "[ID]",
|
|
186
|
-
"label": "Mass",
|
|
187
|
-
"name": "Mass",
|
|
188
|
-
"unit": "kg",
|
|
189
|
-
"unit_desc": "kilogram",
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
"description": "the degree of hotness or coldness of a body or an environment",
|
|
193
|
-
"id": "[ID]",
|
|
194
|
-
"label": "Temperature",
|
|
195
|
-
"name": "Temperature",
|
|
196
|
-
"unit": "K",
|
|
197
|
-
"unit_desc": "Kelvin",
|
|
198
|
-
},
|
|
199
|
-
],
|
|
200
|
-
}
|
|
201
|
-
`;
|
|
202
|
-
|
|
203
|
-
exports[`measurements schema should retrieve derived quantities 1`] = `
|
|
204
|
-
{
|
|
205
|
-
"derivedQuantities": [
|
|
206
|
-
{
|
|
207
|
-
"description": "the rate of change of velocity with respect to time",
|
|
208
|
-
"id": "[ID]",
|
|
209
|
-
"label": "Acceleration",
|
|
210
|
-
"name": "Acceleration",
|
|
211
|
-
"unit": "m/s²",
|
|
212
|
-
"unit_desc": "meter per square second",
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"description": "the capacity of a physical system to do work",
|
|
216
|
-
"id": "[ID]",
|
|
217
|
-
"label": "Energy",
|
|
218
|
-
"name": "Energy",
|
|
219
|
-
"unit": "J",
|
|
220
|
-
"unit_desc": "Joule",
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"description": "a quantity that tends to produce an acceleration of a body in the direction of its application",
|
|
224
|
-
"id": "[ID]",
|
|
225
|
-
"label": "Force",
|
|
226
|
-
"name": "Force",
|
|
227
|
-
"unit": "N",
|
|
228
|
-
"unit_desc": "Newton",
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
"description": "the rate at which work is done",
|
|
232
|
-
"id": "[ID]",
|
|
233
|
-
"label": "Power",
|
|
234
|
-
"name": "Power",
|
|
235
|
-
"unit": "W",
|
|
236
|
-
"unit_desc": "Watt",
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
"description": "a distance traveled divided by the time of travel",
|
|
240
|
-
"id": "[ID]",
|
|
241
|
-
"label": "Velocity",
|
|
242
|
-
"name": "Velocity",
|
|
243
|
-
"unit": "m/s",
|
|
244
|
-
"unit_desc": "meter per second",
|
|
245
|
-
},
|
|
246
|
-
],
|
|
247
|
-
}
|
|
248
|
-
`;
|
|
249
|
-
|
|
250
|
-
exports[`measurements schema should search quantities by description 1`] = `
|
|
251
|
-
{
|
|
252
|
-
"energyRelated": [
|
|
253
|
-
{
|
|
254
|
-
"description": "the amount of energy deposited per unit of mass",
|
|
255
|
-
"label": "Radiation Dose Absorbed",
|
|
256
|
-
"name": "RadiationDoseAbsorbed",
|
|
257
|
-
},
|
|
258
|
-
],
|
|
259
|
-
}
|
|
260
|
-
`;
|
|
261
|
-
|
|
262
|
-
exports[`measurements schema should verify SI base units are present 1`] = `
|
|
263
|
-
{
|
|
264
|
-
"siBaseUnits": [
|
|
265
|
-
{
|
|
266
|
-
"label": "Electric Current",
|
|
267
|
-
"name": "ElectricCurrent",
|
|
268
|
-
"unit": "A",
|
|
269
|
-
"unit_desc": "Ampere",
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
"label": "Temperature",
|
|
273
|
-
"name": "Temperature",
|
|
274
|
-
"unit": "K",
|
|
275
|
-
"unit_desc": "Kelvin",
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"label": "Luminous Intensity",
|
|
279
|
-
"name": "LuminousIntensity",
|
|
280
|
-
"unit": "cd",
|
|
281
|
-
"unit_desc": "candela",
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
"label": "Mass",
|
|
285
|
-
"name": "Mass",
|
|
286
|
-
"unit": "kg",
|
|
287
|
-
"unit_desc": "kilogram",
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
"label": "Length",
|
|
291
|
-
"name": "Length",
|
|
292
|
-
"unit": "m",
|
|
293
|
-
"unit_desc": "meter",
|
|
294
|
-
},
|
|
295
|
-
{
|
|
296
|
-
"label": "Amount Of Substance",
|
|
297
|
-
"name": "AmountOfSubstance",
|
|
298
|
-
"unit": "mol",
|
|
299
|
-
"unit_desc": "molecules, for example of a substance. The system unit for this quantity is "mol" mole",
|
|
300
|
-
},
|
|
301
|
-
{
|
|
302
|
-
"label": "Duration",
|
|
303
|
-
"name": "Duration",
|
|
304
|
-
"unit": "s",
|
|
305
|
-
"unit_desc": "second",
|
|
306
|
-
},
|
|
307
|
-
],
|
|
308
|
-
}
|
|
309
|
-
`;
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { getConnections, PgTestClient, snapshot } from 'pgsql-test';
|
|
2
|
-
|
|
3
|
-
let pg: PgTestClient;
|
|
4
|
-
let teardown: () => Promise<void>;
|
|
5
|
-
|
|
6
|
-
beforeAll(async () => {
|
|
7
|
-
({ pg, teardown } = await getConnections());
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
afterAll(async () => {
|
|
11
|
-
await teardown();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
beforeEach(async () => {
|
|
15
|
-
await pg.beforeEach();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
afterEach(async () => {
|
|
19
|
-
await pg.afterEach();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
describe('measurements schema', () => {
|
|
23
|
-
it('should have measurements schema created', async () => {
|
|
24
|
-
const schemas = await pg.any(
|
|
25
|
-
`SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'measurements'`
|
|
26
|
-
);
|
|
27
|
-
expect(schemas).toHaveLength(1);
|
|
28
|
-
expect(schemas[0].schema_name).toBe('measurements');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('should have quantities table with correct structure', async () => {
|
|
32
|
-
const columns = await pg.any(
|
|
33
|
-
`SELECT column_name, data_type, is_nullable
|
|
34
|
-
FROM information_schema.columns
|
|
35
|
-
WHERE table_schema = 'measurements' AND table_name = 'quantities'
|
|
36
|
-
ORDER BY ordinal_position`
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
expect(snapshot({ columns })).toMatchSnapshot();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('should have all expected quantities inserted', async () => {
|
|
43
|
-
const quantities = await pg.any(
|
|
44
|
-
`SELECT COUNT(*) as total FROM measurements.quantities`
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
// Based on the SQL file, there should be 44 initial quantities + 3 additional ones (Percent, PartsPerMillion, PartsPerBillion)
|
|
48
|
-
// Note: There's a duplicate ID 45 in the SQL, so actual count might be different
|
|
49
|
-
expect(parseInt(quantities[0].total)).toBeGreaterThan(40);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should retrieve basic physical quantities', async () => {
|
|
53
|
-
const basicQuantities = await pg.any(
|
|
54
|
-
`SELECT id, name, label, unit, unit_desc, description
|
|
55
|
-
FROM measurements.quantities
|
|
56
|
-
WHERE name IN ('Length', 'Mass', 'Duration', 'Temperature', 'ElectricCurrent')
|
|
57
|
-
ORDER BY name`
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
expect(snapshot({ basicQuantities })).toMatchSnapshot();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should retrieve derived quantities', async () => {
|
|
64
|
-
const derivedQuantities = await pg.any(
|
|
65
|
-
`SELECT id, name, label, unit, unit_desc, description
|
|
66
|
-
FROM measurements.quantities
|
|
67
|
-
WHERE name IN ('Velocity', 'Acceleration', 'Force', 'Energy', 'Power')
|
|
68
|
-
ORDER BY name`
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
expect(snapshot({ derivedQuantities })).toMatchSnapshot();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should find quantities by unit', async () => {
|
|
75
|
-
const meterQuantities = await pg.any(
|
|
76
|
-
`SELECT name, label, unit FROM measurements.quantities
|
|
77
|
-
WHERE unit LIKE '%m%'
|
|
78
|
-
ORDER BY name`
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
expect(snapshot({ meterQuantities })).toMatchSnapshot();
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('should find dimensionless quantities', async () => {
|
|
85
|
-
const dimensionlessQuantities = await pg.any(
|
|
86
|
-
`SELECT name, label, unit, description FROM measurements.quantities
|
|
87
|
-
WHERE unit IS NULL OR name = 'Dimensionless'
|
|
88
|
-
ORDER BY name`
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
expect(snapshot({ dimensionlessQuantities })).toMatchSnapshot();
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should search quantities by description', async () => {
|
|
95
|
-
const energyRelated = await pg.any(
|
|
96
|
-
`SELECT name, label, description FROM measurements.quantities
|
|
97
|
-
WHERE description ILIKE '%energy%'
|
|
98
|
-
ORDER BY name`
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
expect(snapshot({ energyRelated })).toMatchSnapshot();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should handle percentage and parts-per quantities', async () => {
|
|
105
|
-
const ratioQuantities = await pg.any(
|
|
106
|
-
`SELECT name, label, unit, unit_desc FROM measurements.quantities
|
|
107
|
-
WHERE name IN ('Percent', 'PartsPerMillion', 'PartsPerBillion')
|
|
108
|
-
ORDER BY name`
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
expect(snapshot({ ratioQuantities })).toMatchSnapshot();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('should verify SI base units are present', async () => {
|
|
115
|
-
// The seven SI base units
|
|
116
|
-
const siBaseUnits = await pg.any(
|
|
117
|
-
`SELECT name, label, unit, unit_desc FROM measurements.quantities
|
|
118
|
-
WHERE unit IN ('m', 'kg', 's', 'A', 'K', 'mol', 'cd')
|
|
119
|
-
ORDER BY unit`
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
expect(snapshot({ siBaseUnits })).toMatchSnapshot();
|
|
123
|
-
});
|
|
124
|
-
});
|
package/jest.config.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
|
2
|
-
module.exports = {
|
|
3
|
-
preset: 'ts-jest',
|
|
4
|
-
testEnvironment: 'node',
|
|
5
|
-
|
|
6
|
-
// Match both __tests__ and colocated test files
|
|
7
|
-
testMatch: ['**/?(*.)+(test|spec).{ts,tsx,js,jsx}'],
|
|
8
|
-
|
|
9
|
-
// Ignore build artifacts and type declarations
|
|
10
|
-
testPathIgnorePatterns: ['/dist/', '\\.d\\.ts$'],
|
|
11
|
-
modulePathIgnorePatterns: ['<rootDir>/dist/'],
|
|
12
|
-
watchPathIgnorePatterns: ['/dist/'],
|
|
13
|
-
|
|
14
|
-
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
|
15
|
-
};
|
|
File without changes
|