@dmptool/types 1.2.3 → 1.2.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/README.md +8 -0
- package/dist/answers/__tests__/answers.spec.js +122 -6
- package/dist/answers/answer.d.ts +3 -3
- package/dist/answers/graphQLAnswers.d.ts +120 -25
- package/dist/answers/graphQLAnswers.js +22 -5
- package/dist/answers/index.d.ts +399 -31
- package/dist/answers/index.js +8 -2
- package/dist/answers/numberAnswers.d.ts +40 -0
- package/dist/answers/numberAnswers.js +8 -1
- package/dist/answers/tableAnswers.d.ts +1688 -75
- package/dist/answers/tableAnswers.js +63 -2
- package/dist/questions/__tests__/graphQLQuestions.spec.js +177 -39
- package/dist/questions/__tests__/numberQuestions.spec.js +36 -0
- package/dist/questions/__tests__/tableQuestion.spec.js +145 -0
- package/dist/questions/__tests__/usage.spec.js +162 -1
- package/dist/questions/graphQLQuestions.d.ts +420 -60
- package/dist/questions/graphQLQuestions.js +257 -11
- package/dist/questions/index.d.ts +4849 -189
- package/dist/questions/index.js +9 -2
- package/dist/questions/numberQuestions.d.ts +105 -0
- package/dist/questions/numberQuestions.js +12 -1
- package/dist/questions/question.d.ts +4 -4
- package/dist/questions/question.js +25 -4
- package/dist/questions/tableQuestions.d.ts +5930 -679
- package/dist/questions/tableQuestions.js +188 -3
- package/dist/schemas/anyAnswer.schema.json +137 -17
- package/dist/schemas/anyQuestion.schema.json +847 -101
- package/dist/schemas/anyTableColumnAnswer.schema.json +116 -5
- package/dist/schemas/anyTableColumnQuestion.schema.json +326 -24
- package/dist/schemas/licenseSearchAnswer.schema.json +49 -0
- package/dist/schemas/licenseSearchQuestion.schema.json +164 -0
- package/dist/schemas/metadataStandardSearchAnswer.schema.json +49 -0
- package/dist/schemas/metadataStandardSearchQuestion.schema.json +174 -0
- package/dist/schemas/numberWithContextAnswer.schema.json +45 -0
- package/dist/schemas/numberWithContextQuestion.schema.json +84 -0
- package/dist/schemas/repositorySearchAnswer.schema.json +49 -0
- package/dist/schemas/repositorySearchQuestion.schema.json +180 -0
- package/dist/schemas/researchOutputTableAnswer.schema.json +519 -0
- package/dist/schemas/researchOutputTableQuestion.schema.json +1183 -0
- package/dist/schemas/tableAnswer.schema.json +116 -5
- package/dist/schemas/tableQuestion.schema.json +348 -24
- package/package.json +9 -5
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.LicenseSearchQuestionSchema = exports.licenseQuery = exports.MetadataStandardSearchQuestionSchema = exports.metadataStandardQuery = exports.RepositorySearchQuestionSchema = exports.repositoryQuery = exports.AffiliationSearchQuestionSchema = exports.affiliationQuery = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const question_1 = require("./question");
|
|
6
6
|
const BaseAttributes = question_1.QuestionSchema.shape.attributes;
|
|
7
|
+
const paginationOptions = zod_1.z.object({
|
|
8
|
+
type: zod_1.z.enum(['OFFSET', 'CURSOR']).default('OFFSET'), // Type of pagination to use
|
|
9
|
+
limit: zod_1.z.number().default(10), // Number of items per page
|
|
10
|
+
offset: zod_1.z.number().optional().default(0), // Offset for pagination (if using offset-based pagination)
|
|
11
|
+
cursor: zod_1.z.string().optional(), // Cursor for pagination (if using cursor-based pagination)
|
|
12
|
+
sortField: zod_1.z.string().default('name'), // Field to sort by
|
|
13
|
+
sortOrder: zod_1.z.enum(['ASC', 'DESC']).default('ASC'), // Sort order
|
|
14
|
+
});
|
|
7
15
|
// An input variable for a GraphQL query
|
|
8
16
|
const GraphQLVariable = zod_1.z.object({
|
|
9
17
|
minLength: zod_1.z.number().optional(), // A min length for the variable before executing the query
|
|
@@ -13,6 +21,19 @@ const GraphQLVariable = zod_1.z.object({
|
|
|
13
21
|
type: zod_1.z.string().default('string'), // The type of the variable (default is string)
|
|
14
22
|
defaultValue: zod_1.z.string().optional() // The default value for the variable (no default)
|
|
15
23
|
});
|
|
24
|
+
const GraphQLPaginationVariables = GraphQLVariable.extend({
|
|
25
|
+
name: zod_1.z.enum(['paginationOptions']).default('paginationOptions'),
|
|
26
|
+
type: zod_1.z.string().default('paginationOptions'),
|
|
27
|
+
label: zod_1.z.string().default('Pagination Options'),
|
|
28
|
+
options: paginationOptions.default({
|
|
29
|
+
type: 'OFFSET',
|
|
30
|
+
limit: 10,
|
|
31
|
+
offset: 0,
|
|
32
|
+
cursor: undefined,
|
|
33
|
+
sortField: 'name',
|
|
34
|
+
sortOrder: 'ASC',
|
|
35
|
+
})
|
|
36
|
+
});
|
|
16
37
|
// A property from a GraphQL query response that will be displayed to the user
|
|
17
38
|
const GraphQLDisplayField = zod_1.z.object({
|
|
18
39
|
propertyName: zod_1.z.string().default('id'), // MUST match a property name in the query response
|
|
@@ -27,16 +48,6 @@ const GraphQLQuery = zod_1.z.object({
|
|
|
27
48
|
responseField: zod_1.z.string().default('query.items'), // How to get at the location of displayFields in the response
|
|
28
49
|
variables: zod_1.z.array(GraphQLVariable).default([{}]) // The variables for the query
|
|
29
50
|
});
|
|
30
|
-
// Filtered search question and answer
|
|
31
|
-
// TODO: This one is for future use to help build out the components of the
|
|
32
|
-
// Research Outputs Question Type (e.g. License selector, Repository selector, etc.)
|
|
33
|
-
exports.FilteredSearchQuestionSchema = question_1.QuestionSchema.merge(zod_1.z.object({
|
|
34
|
-
type: zod_1.z.literal('filteredSearch'),
|
|
35
|
-
graphQL: GraphQLQuery.default({}), // The GraphQL query options for the search
|
|
36
|
-
attributes: BaseAttributes.merge(zod_1.z.object({
|
|
37
|
-
multiple: zod_1.z.boolean().default(true) // Whether to allow multiple selections
|
|
38
|
-
})).default({})
|
|
39
|
-
}));
|
|
40
51
|
// Typeahead search question and answer
|
|
41
52
|
const TypeaheadSearchQuestionSchema = question_1.QuestionSchema.merge(zod_1.z.object({
|
|
42
53
|
type: zod_1.z.literal('typeaheadSearch'), // The type of question
|
|
@@ -76,3 +87,238 @@ exports.AffiliationSearchQuestionSchema = TypeaheadSearchQuestionSchema.merge(zo
|
|
|
76
87
|
responseField: zod_1.z.literal("affiliations.items").default('affiliations.items'),
|
|
77
88
|
})).default({}),
|
|
78
89
|
}));
|
|
90
|
+
exports.repositoryQuery = '' +
|
|
91
|
+
'query Repositories($term: String, $keywords: [String!], $repositoryType: String, $paginationOptions: PaginationOptions){ ' +
|
|
92
|
+
'repositories(term: $term, keywords: $keywords, repositoryType: $repositoryType, paginationOptions: $paginationOptions) { ' +
|
|
93
|
+
'totalCount ' +
|
|
94
|
+
'currentOffset ' +
|
|
95
|
+
'limit ' +
|
|
96
|
+
'hasNextPage ' +
|
|
97
|
+
'hasPreviousPage ' +
|
|
98
|
+
'availableSortFields ' +
|
|
99
|
+
'items { ' +
|
|
100
|
+
'id ' +
|
|
101
|
+
'name ' +
|
|
102
|
+
'uri ' +
|
|
103
|
+
'description ' +
|
|
104
|
+
'website ' +
|
|
105
|
+
'keywords ' +
|
|
106
|
+
'repositoryTypes ' +
|
|
107
|
+
'} ' +
|
|
108
|
+
'} ' +
|
|
109
|
+
'}';
|
|
110
|
+
const RepositorySearchTermVariable = GraphQLVariable.extend({
|
|
111
|
+
name: zod_1.z.literal("term").default('term'),
|
|
112
|
+
type: zod_1.z.string().default("string"),
|
|
113
|
+
label: zod_1.z.string().default("Search for a repository"),
|
|
114
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
115
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.term").optional(),
|
|
116
|
+
});
|
|
117
|
+
const RepositorySearchRepositoryTypeVariable = GraphQLVariable.extend({
|
|
118
|
+
name: zod_1.z.literal("repositoryType").default('repositoryType'),
|
|
119
|
+
type: zod_1.z.string().default("string"),
|
|
120
|
+
label: zod_1.z.string().default("Repository type"),
|
|
121
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
122
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.repositoryType").optional(),
|
|
123
|
+
});
|
|
124
|
+
const RepositorySearchKeywordsVariable = GraphQLVariable.extend({
|
|
125
|
+
name: zod_1.z.literal("keywords").default('keywords'),
|
|
126
|
+
type: zod_1.z.string().default("string"),
|
|
127
|
+
label: zod_1.z.string().default("Subject Areas"),
|
|
128
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
129
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.keywords").optional(),
|
|
130
|
+
});
|
|
131
|
+
const RepositorySearchResultName = GraphQLDisplayField.extend({
|
|
132
|
+
propertyName: zod_1.z.literal("name").default('name'),
|
|
133
|
+
label: zod_1.z.string().default("Name"),
|
|
134
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.name").optional(),
|
|
135
|
+
});
|
|
136
|
+
const RepositorySearchResultDescription = GraphQLDisplayField.extend({
|
|
137
|
+
propertyName: zod_1.z.literal("description").default('description'),
|
|
138
|
+
label: zod_1.z.string().default("Description"),
|
|
139
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.description").optional(),
|
|
140
|
+
});
|
|
141
|
+
const RepositorySearchResultWebsite = GraphQLDisplayField.extend({
|
|
142
|
+
propertyName: zod_1.z.literal("website").default('website'),
|
|
143
|
+
label: zod_1.z.string().default("Website"),
|
|
144
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.website").optional(),
|
|
145
|
+
});
|
|
146
|
+
const RepositorySearchResultKeywords = GraphQLDisplayField.extend({
|
|
147
|
+
propertyName: zod_1.z.literal("keywords").default('keywords'),
|
|
148
|
+
label: zod_1.z.string().default("Subject Areas"),
|
|
149
|
+
labelTranslationKey: zod_1.z.string().default("RepositorySearch.keywords").optional(),
|
|
150
|
+
});
|
|
151
|
+
const defaultRepositorySearchTerm = RepositorySearchTermVariable.parse({});
|
|
152
|
+
const defaultRepositorySearchType = RepositorySearchRepositoryTypeVariable.parse({});
|
|
153
|
+
const defaultRepositorySearchSubjectAreas = RepositorySearchKeywordsVariable.parse({});
|
|
154
|
+
const defaultRepositorySearchName = RepositorySearchResultName.parse({});
|
|
155
|
+
const defaultRepositorySearchDescription = RepositorySearchResultDescription.parse({});
|
|
156
|
+
const defaultRepositorySearchWebsite = RepositorySearchResultWebsite.parse({});
|
|
157
|
+
const defaultRepositorySearchKeywords = RepositorySearchResultKeywords.parse({});
|
|
158
|
+
const defaultRepositoryPaginationOptions = GraphQLPaginationVariables.parse({});
|
|
159
|
+
// Repository search question and answer
|
|
160
|
+
exports.RepositorySearchQuestionSchema = TypeaheadSearchQuestionSchema.merge(zod_1.z.object({
|
|
161
|
+
type: zod_1.z.literal('repositorySearch'),
|
|
162
|
+
attributes: BaseAttributes.default({}),
|
|
163
|
+
graphQL: GraphQLQuery.merge(zod_1.z.object({
|
|
164
|
+
query: zod_1.z.literal(exports.repositoryQuery).default(exports.repositoryQuery),
|
|
165
|
+
queryId: zod_1.z.string().default('useRepositoriesQuery').optional(),
|
|
166
|
+
variables: zod_1.z.array(GraphQLVariable).default([
|
|
167
|
+
defaultRepositorySearchTerm,
|
|
168
|
+
defaultRepositorySearchSubjectAreas,
|
|
169
|
+
defaultRepositorySearchType,
|
|
170
|
+
defaultRepositoryPaginationOptions,
|
|
171
|
+
]),
|
|
172
|
+
answerField: zod_1.z.literal('uri').default('uri'),
|
|
173
|
+
displayFields: zod_1.z.array(GraphQLDisplayField).default([
|
|
174
|
+
defaultRepositorySearchName,
|
|
175
|
+
defaultRepositorySearchDescription,
|
|
176
|
+
defaultRepositorySearchWebsite,
|
|
177
|
+
defaultRepositorySearchKeywords,
|
|
178
|
+
]),
|
|
179
|
+
responseField: zod_1.z.literal("repositories.items").default('repositories.items'),
|
|
180
|
+
})).default({}),
|
|
181
|
+
}));
|
|
182
|
+
exports.metadataStandardQuery = '' +
|
|
183
|
+
'query MetadataStandards($term: String, $keywords: [String!], $paginationOptions: PaginationOptions){ ' +
|
|
184
|
+
'metadataStandards(term: $term, keywords: $keywords, paginationOptions: $paginationOptions) { ' +
|
|
185
|
+
'totalCount ' +
|
|
186
|
+
'currentOffset ' +
|
|
187
|
+
'limit ' +
|
|
188
|
+
'hasNextPage ' +
|
|
189
|
+
'hasPreviousPage ' +
|
|
190
|
+
'availableSortFields ' +
|
|
191
|
+
'items { ' +
|
|
192
|
+
'id ' +
|
|
193
|
+
'name ' +
|
|
194
|
+
'uri ' +
|
|
195
|
+
'description ' +
|
|
196
|
+
'keywords ' +
|
|
197
|
+
'} ' +
|
|
198
|
+
'} ' +
|
|
199
|
+
'}';
|
|
200
|
+
const MetadataStandardSearchTermVariable = GraphQLVariable.extend({
|
|
201
|
+
name: zod_1.z.literal("term").default('term'),
|
|
202
|
+
type: zod_1.z.string().default("string"),
|
|
203
|
+
label: zod_1.z.string().default("Search for a metadata standard"),
|
|
204
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
205
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.term").optional(),
|
|
206
|
+
});
|
|
207
|
+
const MetadataStandardSearchKeywordsVariable = GraphQLVariable.extend({
|
|
208
|
+
name: zod_1.z.literal("keywords").default('keywords'),
|
|
209
|
+
type: zod_1.z.string().default("string"),
|
|
210
|
+
label: zod_1.z.string().default("Subject Areas"),
|
|
211
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
212
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.keywords").optional(),
|
|
213
|
+
});
|
|
214
|
+
const MetadataStandardSearchResultName = GraphQLDisplayField.extend({
|
|
215
|
+
propertyName: zod_1.z.literal("name").default('name'),
|
|
216
|
+
label: zod_1.z.string().default("Name"),
|
|
217
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.name").optional(),
|
|
218
|
+
});
|
|
219
|
+
const MetadataStandardSearchResultDescription = GraphQLDisplayField.extend({
|
|
220
|
+
propertyName: zod_1.z.literal("description").default('description'),
|
|
221
|
+
label: zod_1.z.string().default("Description"),
|
|
222
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.description").optional(),
|
|
223
|
+
});
|
|
224
|
+
const MetadataStandardSearchResultWebsite = GraphQLDisplayField.extend({
|
|
225
|
+
propertyName: zod_1.z.literal("website").default('website'),
|
|
226
|
+
label: zod_1.z.string().default("Website"),
|
|
227
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.website").optional(),
|
|
228
|
+
});
|
|
229
|
+
const MetadataStandardSearchResultKeywords = GraphQLDisplayField.extend({
|
|
230
|
+
propertyName: zod_1.z.literal("keywords").default('keywords'),
|
|
231
|
+
label: zod_1.z.string().default("Subject Areas"),
|
|
232
|
+
labelTranslationKey: zod_1.z.string().default("MetadataStandardSearch.keywords").optional(),
|
|
233
|
+
});
|
|
234
|
+
const defaultMetadataStandardSearchTerm = MetadataStandardSearchTermVariable.parse({});
|
|
235
|
+
const defaultMetadataStandardSearchSubjectAreas = MetadataStandardSearchKeywordsVariable.parse({});
|
|
236
|
+
const defaultMetadataStandardPaginationOptions = GraphQLPaginationVariables.parse({});
|
|
237
|
+
const defaultMetadataStandardName = MetadataStandardSearchResultName.parse({});
|
|
238
|
+
const defaultMetadataStandardDescription = MetadataStandardSearchResultDescription.parse({});
|
|
239
|
+
const defaultMetadataStandardWebsite = MetadataStandardSearchResultWebsite.parse({});
|
|
240
|
+
const defaultMetadataStandardKeywords = MetadataStandardSearchResultKeywords.parse({});
|
|
241
|
+
exports.MetadataStandardSearchQuestionSchema = TypeaheadSearchQuestionSchema.merge(zod_1.z.object({
|
|
242
|
+
type: zod_1.z.literal('metadataStandardSearch'),
|
|
243
|
+
attributes: BaseAttributes.default({}),
|
|
244
|
+
graphQL: GraphQLQuery.merge(zod_1.z.object({
|
|
245
|
+
query: zod_1.z.literal(exports.metadataStandardQuery).default(exports.metadataStandardQuery),
|
|
246
|
+
queryId: zod_1.z.string().default('useMetadataStandardsQuery').optional(),
|
|
247
|
+
variables: zod_1.z.array(GraphQLVariable).default([
|
|
248
|
+
defaultMetadataStandardSearchTerm,
|
|
249
|
+
defaultMetadataStandardSearchSubjectAreas,
|
|
250
|
+
defaultMetadataStandardPaginationOptions,
|
|
251
|
+
]),
|
|
252
|
+
answerField: zod_1.z.literal('uri').default('uri'),
|
|
253
|
+
displayFields: zod_1.z.array(GraphQLDisplayField).default([
|
|
254
|
+
defaultMetadataStandardName,
|
|
255
|
+
defaultMetadataStandardDescription,
|
|
256
|
+
defaultMetadataStandardWebsite,
|
|
257
|
+
defaultMetadataStandardKeywords,
|
|
258
|
+
]),
|
|
259
|
+
responseField: zod_1.z.literal("metadataStandards.items").default('metadataStandards.items'),
|
|
260
|
+
})).default({}),
|
|
261
|
+
}));
|
|
262
|
+
exports.licenseQuery = '' +
|
|
263
|
+
'query Licenses($term: String, $paginationOptions: PaginationOptions){ ' +
|
|
264
|
+
'license(term: $term, paginationOptions: $paginationOptions) { ' +
|
|
265
|
+
'totalCount ' +
|
|
266
|
+
'currentOffset ' +
|
|
267
|
+
'limit ' +
|
|
268
|
+
'hasNextPage ' +
|
|
269
|
+
'hasPreviousPage ' +
|
|
270
|
+
'availableSortFields ' +
|
|
271
|
+
'items { ' +
|
|
272
|
+
'id ' +
|
|
273
|
+
'name ' +
|
|
274
|
+
'uri ' +
|
|
275
|
+
'description ' +
|
|
276
|
+
'} ' +
|
|
277
|
+
'} ' +
|
|
278
|
+
'}';
|
|
279
|
+
const LicenseSearchTermVariable = GraphQLVariable.extend({
|
|
280
|
+
name: zod_1.z.literal("term").default('term'),
|
|
281
|
+
type: zod_1.z.string().default("string"),
|
|
282
|
+
label: zod_1.z.string().default("Search for a license"),
|
|
283
|
+
minLength: zod_1.z.literal(3).default(3),
|
|
284
|
+
labelTranslationKey: zod_1.z.string().default("LicenseSearch.term").optional(),
|
|
285
|
+
});
|
|
286
|
+
const LicenseSearchResultName = GraphQLDisplayField.extend({
|
|
287
|
+
propertyName: zod_1.z.literal("name").default('name'),
|
|
288
|
+
label: zod_1.z.string().default("Name"),
|
|
289
|
+
labelTranslationKey: zod_1.z.string().default("License.name").optional(),
|
|
290
|
+
});
|
|
291
|
+
const LicenseSearchResultDescription = GraphQLDisplayField.extend({
|
|
292
|
+
propertyName: zod_1.z.literal("description").default('description'),
|
|
293
|
+
label: zod_1.z.string().default("Description"),
|
|
294
|
+
labelTranslationKey: zod_1.z.string().default("License.description").optional(),
|
|
295
|
+
});
|
|
296
|
+
const LicenseSearchResultRecommended = GraphQLDisplayField.extend({
|
|
297
|
+
propertyName: zod_1.z.literal("recommended").default('recommended'),
|
|
298
|
+
label: zod_1.z.string().default("Recommended"),
|
|
299
|
+
labelTranslationKey: zod_1.z.string().default("License.recommended").optional(),
|
|
300
|
+
});
|
|
301
|
+
const defaultLicenseSearchTerm = LicenseSearchTermVariable.parse({});
|
|
302
|
+
const defaultLicensePaginationOptions = GraphQLPaginationVariables.parse({});
|
|
303
|
+
const defaultLicenseName = LicenseSearchResultName.parse({});
|
|
304
|
+
const defaultLicenseDescription = LicenseSearchResultDescription.parse({});
|
|
305
|
+
const defaultLicenseRecommended = LicenseSearchResultRecommended.parse({});
|
|
306
|
+
exports.LicenseSearchQuestionSchema = TypeaheadSearchQuestionSchema.merge(zod_1.z.object({
|
|
307
|
+
type: zod_1.z.literal('licenseSearch'),
|
|
308
|
+
attributes: BaseAttributes.default({}),
|
|
309
|
+
graphQL: GraphQLQuery.merge(zod_1.z.object({
|
|
310
|
+
query: zod_1.z.literal(exports.licenseQuery).default(exports.licenseQuery),
|
|
311
|
+
queryId: zod_1.z.string().default('useLicensesQuery').optional(),
|
|
312
|
+
variables: zod_1.z.array(GraphQLVariable).default([
|
|
313
|
+
defaultLicenseSearchTerm,
|
|
314
|
+
defaultLicensePaginationOptions,
|
|
315
|
+
]),
|
|
316
|
+
answerField: zod_1.z.literal('uri').default('uri'),
|
|
317
|
+
displayFields: zod_1.z.array(GraphQLDisplayField).default([
|
|
318
|
+
defaultLicenseName,
|
|
319
|
+
defaultLicenseDescription,
|
|
320
|
+
defaultLicenseRecommended,
|
|
321
|
+
]),
|
|
322
|
+
responseField: zod_1.z.literal("licenses.items").default('licenses.items'),
|
|
323
|
+
})).default({}),
|
|
324
|
+
}));
|