@crowi/plugin-api 0.1.0-alpha.1 → 1.0.0-alpha.10
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 +151 -0
- package/dist/index.d.mts +1024 -122
- package/dist/index.d.ts +1024 -122
- package/dist/index.js +360 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +343 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -4
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,137 @@
|
|
|
1
|
+
// src/config-verification.ts
|
|
2
|
+
var CONFIG_VERIFICATION_KEY_PREFIX = "__crowi_config_verification__/";
|
|
3
|
+
|
|
4
|
+
// src/html.ts
|
|
5
|
+
function escapeHtml(s) {
|
|
6
|
+
return s.replace(/[&<>"']/g, (c) => {
|
|
7
|
+
switch (c) {
|
|
8
|
+
case "&":
|
|
9
|
+
return "&";
|
|
10
|
+
case "<":
|
|
11
|
+
return "<";
|
|
12
|
+
case ">":
|
|
13
|
+
return ">";
|
|
14
|
+
case '"':
|
|
15
|
+
return """;
|
|
16
|
+
case "'":
|
|
17
|
+
return "'";
|
|
18
|
+
default:
|
|
19
|
+
return c;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// src/registries/auth.ts
|
|
25
|
+
import { createHash } from "crypto";
|
|
26
|
+
function assertNonEmptyString(value, label, factory) {
|
|
27
|
+
if (value.trim() === "") {
|
|
28
|
+
throw new TypeError(`${factory}: '${label}' must be a non-empty string.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function assertValidUrl(value, label, factory) {
|
|
32
|
+
try {
|
|
33
|
+
new URL(value);
|
|
34
|
+
} catch {
|
|
35
|
+
throw new TypeError(`${factory}: '${label}' must be a valid URL, got '${value}'.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function assertNonEmptyScopes(scopes, factory) {
|
|
39
|
+
for (const scope of scopes) {
|
|
40
|
+
assertNonEmptyString(scope, "scopes[]", factory);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function createOAuth2Driver(options) {
|
|
44
|
+
const FACTORY = "createOAuth2Driver";
|
|
45
|
+
assertNonEmptyString(options.buttonLabel, "buttonLabel", FACTORY);
|
|
46
|
+
assertValidUrl(options.authorizeUrl, "authorizeUrl", FACTORY);
|
|
47
|
+
assertValidUrl(options.tokenUrl, "tokenUrl", FACTORY);
|
|
48
|
+
const scopes = options.scopes ?? [];
|
|
49
|
+
assertNonEmptyScopes(scopes, FACTORY);
|
|
50
|
+
return {
|
|
51
|
+
kind: "oauth2",
|
|
52
|
+
buttonLabel: options.buttonLabel,
|
|
53
|
+
iconUrl: options.iconUrl,
|
|
54
|
+
authorizeUrl: options.authorizeUrl,
|
|
55
|
+
tokenUrl: options.tokenUrl,
|
|
56
|
+
scopes,
|
|
57
|
+
pkce: options.pkce,
|
|
58
|
+
getClientConfig: options.getClientConfig,
|
|
59
|
+
fetchProfile: options.fetchProfile
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
var DEFAULT_OIDC_SCOPES = ["openid", "email", "profile"];
|
|
63
|
+
function createOidcDriver(options) {
|
|
64
|
+
const FACTORY = "createOidcDriver";
|
|
65
|
+
assertNonEmptyString(options.buttonLabel, "buttonLabel", FACTORY);
|
|
66
|
+
assertValidUrl(options.discoveryUrl, "discoveryUrl", FACTORY);
|
|
67
|
+
const scopes = options.scopes ?? [...DEFAULT_OIDC_SCOPES];
|
|
68
|
+
assertNonEmptyScopes(scopes, FACTORY);
|
|
69
|
+
return {
|
|
70
|
+
kind: "oidc",
|
|
71
|
+
buttonLabel: options.buttonLabel,
|
|
72
|
+
iconUrl: options.iconUrl,
|
|
73
|
+
discoveryUrl: options.discoveryUrl,
|
|
74
|
+
scopes,
|
|
75
|
+
pkce: true,
|
|
76
|
+
getClientConfig: options.getClientConfig,
|
|
77
|
+
getConfiguration: () => resolveOidcConfiguration(options.discoveryUrl, options.getClientConfig),
|
|
78
|
+
authorize: options.authorize,
|
|
79
|
+
mapClaims: options.mapClaims
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var DISCOVERY_CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
83
|
+
var DISCOVERY_CACHE_MAX_ENTRIES = 64;
|
|
84
|
+
var discoveryCache = /* @__PURE__ */ new Map();
|
|
85
|
+
var inFlightDiscoveries = /* @__PURE__ */ new Map();
|
|
86
|
+
function discoveryCacheKey(discoveryUrl, clientId, clientSecret) {
|
|
87
|
+
const secretFingerprint = createHash("sha256").update(clientSecret).digest("hex");
|
|
88
|
+
return createHash("sha256").update(`${discoveryUrl}\0${clientId}\0${secretFingerprint}`).digest("hex");
|
|
89
|
+
}
|
|
90
|
+
function evictOldestDiscoveryCacheEntry() {
|
|
91
|
+
let oldestKey;
|
|
92
|
+
let oldestExpiresAt = Number.POSITIVE_INFINITY;
|
|
93
|
+
for (const [key, entry] of discoveryCache) {
|
|
94
|
+
if (entry.expiresAt < oldestExpiresAt) {
|
|
95
|
+
oldestExpiresAt = entry.expiresAt;
|
|
96
|
+
oldestKey = key;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (oldestKey !== void 0) {
|
|
100
|
+
discoveryCache.delete(oldestKey);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function cacheDiscoveryResult(key, configuration) {
|
|
104
|
+
if (!discoveryCache.has(key) && discoveryCache.size >= DISCOVERY_CACHE_MAX_ENTRIES) {
|
|
105
|
+
evictOldestDiscoveryCacheEntry();
|
|
106
|
+
}
|
|
107
|
+
discoveryCache.set(key, { configuration, expiresAt: Date.now() + DISCOVERY_CACHE_TTL_MS });
|
|
108
|
+
}
|
|
109
|
+
async function resolveOidcConfiguration(discoveryUrl, getClientConfig) {
|
|
110
|
+
const clientConfig = getClientConfig();
|
|
111
|
+
if (clientConfig == null) return null;
|
|
112
|
+
const { clientId, clientSecret } = clientConfig;
|
|
113
|
+
const key = discoveryCacheKey(discoveryUrl, clientId, clientSecret);
|
|
114
|
+
const cached = discoveryCache.get(key);
|
|
115
|
+
if (cached !== void 0) {
|
|
116
|
+
if (cached.expiresAt > Date.now()) return cached.configuration;
|
|
117
|
+
discoveryCache.delete(key);
|
|
118
|
+
}
|
|
119
|
+
const inFlight = inFlightDiscoveries.get(key);
|
|
120
|
+
if (inFlight !== void 0) return inFlight;
|
|
121
|
+
const discoveryPromise = (async () => {
|
|
122
|
+
const { discovery } = await import("openid-client");
|
|
123
|
+
const configuration = await discovery(new URL(discoveryUrl), clientId, clientSecret);
|
|
124
|
+
cacheDiscoveryResult(key, configuration);
|
|
125
|
+
return configuration;
|
|
126
|
+
})();
|
|
127
|
+
inFlightDiscoveries.set(key, discoveryPromise);
|
|
128
|
+
try {
|
|
129
|
+
return await discoveryPromise;
|
|
130
|
+
} finally {
|
|
131
|
+
inFlightDiscoveries.delete(key);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
1
135
|
// src/schema-markers.ts
|
|
2
136
|
var SENSITIVE_FIELD_MARKER = "@sensitive";
|
|
3
137
|
var ACTION_FIELD_MARKER = "@action";
|
|
@@ -11,15 +145,222 @@ function getActionAnnotation(field) {
|
|
|
11
145
|
const trimmed = description.trimStart();
|
|
12
146
|
if (!trimmed.startsWith(ACTION_FIELD_MARKER)) return null;
|
|
13
147
|
const rest = trimmed.slice(ACTION_FIELD_MARKER.length).trimStart();
|
|
14
|
-
const match = rest.match(/^"([^"]+)"\s+(GET|POST
|
|
148
|
+
const match = rest.match(/^"([^"]+)"\s+(GET|POST)\s+(\/\S*)/);
|
|
15
149
|
if (!match) return null;
|
|
16
150
|
const [, label, method, path] = match;
|
|
17
151
|
return { label, method, path };
|
|
18
152
|
}
|
|
153
|
+
|
|
154
|
+
// ../svg-sanitize/dist/index.mjs
|
|
155
|
+
import { DOMParser, XMLSerializer } from "@xmldom/xmldom";
|
|
156
|
+
var MAX_DIMENSION_PX = 1e6;
|
|
157
|
+
function extractSvgDimensions(svg) {
|
|
158
|
+
const match = /\bviewBox\s*=\s*["']\s*([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)\s*["']/.exec(svg);
|
|
159
|
+
if (!match) return null;
|
|
160
|
+
const width = Math.round(Number(match[3]));
|
|
161
|
+
const height = Math.round(Number(match[4]));
|
|
162
|
+
if (!Number.isFinite(width) || !Number.isFinite(height)) return null;
|
|
163
|
+
if (width <= 0 || height <= 0 || width > MAX_DIMENSION_PX || height > MAX_DIMENSION_PX) return null;
|
|
164
|
+
return { width, height };
|
|
165
|
+
}
|
|
166
|
+
function sanitizeSvg(input, policy) {
|
|
167
|
+
const doc = parseXml(input);
|
|
168
|
+
if (!doc) return { ok: false, reason: "malformed_xml" };
|
|
169
|
+
if (doc.doctype) {
|
|
170
|
+
return { ok: false, reason: "doctype_not_allowed" };
|
|
171
|
+
}
|
|
172
|
+
const root = doc.documentElement;
|
|
173
|
+
if (!isUnprefixedSvgElement(root)) {
|
|
174
|
+
return { ok: false, reason: "root_is_not_svg" };
|
|
175
|
+
}
|
|
176
|
+
sanitizeElementTree(root, policy, true);
|
|
177
|
+
const serializer = new XMLSerializer();
|
|
178
|
+
const serialized = serializer.serializeToString(root);
|
|
179
|
+
const verifyDoc = parseXml(serialized);
|
|
180
|
+
if (!verifyDoc || !isUnprefixedSvgElement(verifyDoc.documentElement)) {
|
|
181
|
+
return { ok: false, reason: "sanitized_output_not_single_root_svg" };
|
|
182
|
+
}
|
|
183
|
+
return { ok: true, svg: serialized };
|
|
184
|
+
}
|
|
185
|
+
var SVG_NAMESPACE_URI = "http://www.w3.org/2000/svg";
|
|
186
|
+
var XML_NAMESPACE_URI = "http://www.w3.org/XML/1998/namespace";
|
|
187
|
+
var XLINK_NAMESPACE_URI = "http://www.w3.org/1999/xlink";
|
|
188
|
+
function isSvgNamespaceElement(el) {
|
|
189
|
+
return el.namespaceURI === SVG_NAMESPACE_URI && el.prefix == null;
|
|
190
|
+
}
|
|
191
|
+
function isUnprefixedSvgElement(el) {
|
|
192
|
+
return el != null && el.localName === "svg" && isSvgNamespaceElement(el);
|
|
193
|
+
}
|
|
194
|
+
function parseXml(source) {
|
|
195
|
+
try {
|
|
196
|
+
return new DOMParser({ onError: () => void 0 }).parseFromString(source, "image/svg+xml");
|
|
197
|
+
} catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
var ALLOWED_ELEMENTS = /* @__PURE__ */ new Set([
|
|
202
|
+
"svg",
|
|
203
|
+
"g",
|
|
204
|
+
"defs",
|
|
205
|
+
"symbol",
|
|
206
|
+
"use",
|
|
207
|
+
"title",
|
|
208
|
+
"desc",
|
|
209
|
+
"metadata",
|
|
210
|
+
"path",
|
|
211
|
+
"rect",
|
|
212
|
+
"circle",
|
|
213
|
+
"ellipse",
|
|
214
|
+
"line",
|
|
215
|
+
"polyline",
|
|
216
|
+
"polygon",
|
|
217
|
+
"text",
|
|
218
|
+
"tspan",
|
|
219
|
+
"textPath",
|
|
220
|
+
"tref",
|
|
221
|
+
"marker",
|
|
222
|
+
"clipPath",
|
|
223
|
+
"mask",
|
|
224
|
+
"pattern",
|
|
225
|
+
"linearGradient",
|
|
226
|
+
"radialGradient",
|
|
227
|
+
"stop",
|
|
228
|
+
"image",
|
|
229
|
+
"style",
|
|
230
|
+
"a",
|
|
231
|
+
"switch",
|
|
232
|
+
"filter",
|
|
233
|
+
"feGaussianBlur",
|
|
234
|
+
"feOffset",
|
|
235
|
+
"feMerge",
|
|
236
|
+
"feMergeNode",
|
|
237
|
+
"feColorMatrix",
|
|
238
|
+
"feComposite",
|
|
239
|
+
"feFlood",
|
|
240
|
+
"feBlend",
|
|
241
|
+
"feDropShadow",
|
|
242
|
+
"feMorphology",
|
|
243
|
+
"feTurbulence",
|
|
244
|
+
"feDisplacementMap"
|
|
245
|
+
]);
|
|
246
|
+
var PROCESSING_INSTRUCTION_NODE = 7;
|
|
247
|
+
var ELEMENT_NODE = 1;
|
|
248
|
+
function sanitizeElementTree(el, policy, isRoot) {
|
|
249
|
+
sanitizeAttributes(el, policy, isRoot);
|
|
250
|
+
if (el.localName === "style") {
|
|
251
|
+
el.textContent = sanitizeStyleText(el.textContent ?? "");
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
for (const child of Array.from(el.childNodes)) {
|
|
255
|
+
if (child.nodeType === PROCESSING_INSTRUCTION_NODE) {
|
|
256
|
+
el.removeChild(child);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (child.nodeType !== ELEMENT_NODE) continue;
|
|
260
|
+
const childEl = child;
|
|
261
|
+
if (!isSvgNamespaceElement(childEl) || !ALLOWED_ELEMENTS.has(childEl.localName ?? childEl.nodeName)) {
|
|
262
|
+
el.removeChild(childEl);
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
sanitizeElementTree(childEl, policy, false);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function sanitizeAttributes(el, policy, isRoot) {
|
|
269
|
+
for (const attr of Array.from(el.attributes)) {
|
|
270
|
+
const localName = attr.localName ?? attr.name;
|
|
271
|
+
if (/^on/i.test(localName)) {
|
|
272
|
+
el.removeAttributeNode(attr);
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (localName === "style") {
|
|
276
|
+
el.removeAttributeNode(attr);
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (localName === "base" && attr.namespaceURI === XML_NAMESPACE_URI) {
|
|
280
|
+
el.removeAttributeNode(attr);
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (localName === "href") {
|
|
284
|
+
const sanitizedValue = sanitizeHrefValue(attr.value, policy);
|
|
285
|
+
if (sanitizedValue === null) {
|
|
286
|
+
el.removeAttributeNode(attr);
|
|
287
|
+
} else {
|
|
288
|
+
attr.value = sanitizedValue;
|
|
289
|
+
}
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (URL_VALUED_PRESENTATION_ATTRS.has(localName)) {
|
|
293
|
+
if (!isUrlFuncIriSafe(attr.value)) {
|
|
294
|
+
el.removeAttributeNode(attr);
|
|
295
|
+
}
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (attr.name === "xmlns" || attr.name.startsWith("xmlns:")) {
|
|
299
|
+
if (!isRoot || !isEssentialRootNamespaceDeclaration(attr)) {
|
|
300
|
+
el.removeAttributeNode(attr);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function isEssentialRootNamespaceDeclaration(attr) {
|
|
306
|
+
if (attr.name === "xmlns") return true;
|
|
307
|
+
return attr.name === "xmlns:xlink" && attr.value === XLINK_NAMESPACE_URI;
|
|
308
|
+
}
|
|
309
|
+
var URL_VALUED_PRESENTATION_ATTRS = /* @__PURE__ */ new Set([
|
|
310
|
+
"fill",
|
|
311
|
+
"stroke",
|
|
312
|
+
"filter",
|
|
313
|
+
"clip-path",
|
|
314
|
+
"mask",
|
|
315
|
+
"cursor",
|
|
316
|
+
"marker",
|
|
317
|
+
"marker-start",
|
|
318
|
+
"marker-mid",
|
|
319
|
+
"marker-end"
|
|
320
|
+
]);
|
|
321
|
+
var URL_FUNC_PATTERN = /url\(\s*(['"]?)([^'")]*)\1\s*\)/gi;
|
|
322
|
+
function isUrlFuncIriSafe(rawValue) {
|
|
323
|
+
const matches = Array.from(cssUnescape(rawValue).matchAll(URL_FUNC_PATTERN));
|
|
324
|
+
if (matches.length === 0) return true;
|
|
325
|
+
return matches.every(([, , target]) => target.trim().startsWith("#"));
|
|
326
|
+
}
|
|
327
|
+
function sanitizeHrefValue(rawValue, policy) {
|
|
328
|
+
const value = rawValue.trim();
|
|
329
|
+
if (value.startsWith("#")) return value;
|
|
330
|
+
if (/^javascript:/i.test(value)) return null;
|
|
331
|
+
if (/^data:/i.test(value)) return null;
|
|
332
|
+
if (value.startsWith("//")) return null;
|
|
333
|
+
if (policy.allowSafeHref && /^https:\/\//i.test(value)) return value;
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
function sanitizeStyleText(css) {
|
|
337
|
+
const withoutComments = css.replace(/\/\*[\s\S]*?\*\//g, " ");
|
|
338
|
+
let out = cssUnescape(withoutComments);
|
|
339
|
+
out = out.replace(/@import\b[^;]*;?/gi, "");
|
|
340
|
+
out = out.replace(URL_FUNC_PATTERN, (match, _quote, target) => target.trim().startsWith("#") ? match : "none");
|
|
341
|
+
return out;
|
|
342
|
+
}
|
|
343
|
+
function cssUnescape(css) {
|
|
344
|
+
return css.replace(/\\([0-9a-fA-F]{1,6})[ \t\n\f\r]?|\\([^\r\n\f])|\\$/g, (_match, hex, literal) => {
|
|
345
|
+
if (hex !== void 0) {
|
|
346
|
+
const codePoint = Number.parseInt(hex, 16);
|
|
347
|
+
if (codePoint === 0 || codePoint > 1114111 || codePoint >= 55296 && codePoint <= 57343) return "\uFFFD";
|
|
348
|
+
return String.fromCodePoint(codePoint);
|
|
349
|
+
}
|
|
350
|
+
if (literal !== void 0) return literal;
|
|
351
|
+
return "\uFFFD";
|
|
352
|
+
});
|
|
353
|
+
}
|
|
19
354
|
export {
|
|
20
355
|
ACTION_FIELD_MARKER,
|
|
356
|
+
CONFIG_VERIFICATION_KEY_PREFIX,
|
|
21
357
|
SENSITIVE_FIELD_MARKER,
|
|
358
|
+
createOAuth2Driver,
|
|
359
|
+
createOidcDriver,
|
|
360
|
+
escapeHtml,
|
|
361
|
+
extractSvgDimensions,
|
|
22
362
|
getActionAnnotation,
|
|
23
|
-
isSensitiveField
|
|
363
|
+
isSensitiveField,
|
|
364
|
+
sanitizeSvg
|
|
24
365
|
};
|
|
25
366
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/
|
|
1
|
+
{"version":3,"sources":["../src/config-verification.ts","../src/html.ts","../src/registries/auth.ts","../src/schema-markers.ts","../../svg-sanitize/src/dimensions.ts","../../svg-sanitize/src/sanitize.ts"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crowi/plugin-api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0-alpha.10",
|
|
4
4
|
"description": "Type-only contract for Crowi 2.0 plugins. See docs/rfcs/0001-plugin-architecture.md.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,18 +25,29 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
+
"hono": "^4.12.34",
|
|
28
29
|
"zod": "^4"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
32
|
+
"@types/jest": "^30.0.0",
|
|
31
33
|
"@types/node": "^24",
|
|
34
|
+
"hono": "^4.12.34",
|
|
35
|
+
"jest": "^30.5.0",
|
|
36
|
+
"ts-jest": "^29.4.12",
|
|
32
37
|
"tsup": "^8.3.5",
|
|
33
|
-
"typescript": "^
|
|
38
|
+
"typescript": "^6.0.3",
|
|
34
39
|
"zod": "^4.4.3",
|
|
35
|
-
"@crowi/tsconfig": "0.1.0-alpha.0"
|
|
40
|
+
"@crowi/tsconfig": "0.1.0-alpha.0",
|
|
41
|
+
"@crowi/svg-sanitize": "0.1.0-alpha.1"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@xmldom/xmldom": "^0.9.12",
|
|
45
|
+
"openid-client": "^6.8.4"
|
|
36
46
|
},
|
|
37
47
|
"scripts": {
|
|
38
48
|
"build": "tsup",
|
|
39
49
|
"dev": "tsup --watch --no-clean",
|
|
40
|
-
"type-check": "tsc --noEmit"
|
|
50
|
+
"type-check": "tsc --noEmit",
|
|
51
|
+
"test": "jest --passWithNoTests"
|
|
41
52
|
}
|
|
42
53
|
}
|