@logtape/logtape 0.1.0-dev.16 → 0.1.0-dev.17

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 CHANGED
@@ -241,65 +241,28 @@ in the API reference for more details.
241
241
 
242
242
  ### File sink
243
243
 
244
- LogTape provides a platform-independent file sink. You can use it by providing
245
- a platform-specific file driver for Deno or Node.js. Here's an example of
246
- a file sink that writes log messages to a file:
247
-
248
- ~~~~ typescript
249
- // Deno
250
- import { type FileSinkDriver, getFileSink } from "@logtape/logtape";
244
+ > [!NOTE]
245
+ > File sink is unavailable in the browser environment.
251
246
 
252
- const driver: FileSinkDriver<Deno.FsFile> = {
253
- openSync(path: string) {
254
- return Deno.openSync(path, { create: true, append: true });
255
- },
256
- writeSync(fd, chunk) {
257
- fd.writeSync(chunk);
258
- },
259
- flushSync(fd) {
260
- fd.syncSync();
261
- },
262
- closeSync(fd) {
263
- fd.close();
264
- },
265
- };
266
-
267
- configure({
268
- sinks: {
269
- file: getFileSink("my-app.log", driver),
270
- },
271
- // Omitted for brevity
272
- });
273
- ~~~~
247
+ LogTape provides a file sink as well. Here's an example of a file sink that
248
+ writes log messages to a file:
274
249
 
275
250
  ~~~~ typescript
276
- // Node.js or Bun
277
- import fs from "node:fs";
278
- import { type FileSinkDriver, getFileSink } from "@logtape/logtape";
279
-
280
- const driver: FileSinkDriver<number> = {
281
- openSync(path: string) {
282
- return fs.openSync(path, "a");
283
- },
284
- writeSync: fs.writeSync,
285
- flushSync: fs.fsyncSync,
286
- closeSync: fs.closeSync,
287
- };
251
+ import { getFileSink } from "@logtape/logtape";
288
252
 
289
253
  configure({
290
254
  sinks: {
291
- file: getFileSink("my-app.log", driver),
255
+ file: getFileSink("my-app.log"),
292
256
  },
293
257
  // Omitted for brevity
294
258
  });
295
259
  ~~~~
296
260
 
297
- See also [`getFileSink()`] function, [`FileSinkOptions`] interface, and
298
- [`FileSinkDriver`] interface in the API reference for more details.
261
+ See also [`getFileSink()`] function and [`FileSinkOptions`] interface
262
+ in the API reference for more details.
299
263
 
300
264
  [`getFileSink()`]: https://jsr.io/@logtape/logtape/doc/~/getFileSink
301
265
  [`FileSinkOptions`]: https://jsr.io/@logtape/logtape/doc/~/FileSinkOptions
302
- [`FileSinkDriver`]: https://jsr.io/@logtape/logtape/doc/~/FileSinkDriver
303
266
 
304
267
  ### Text formatter
305
268
 
@@ -0,0 +1,32 @@
1
+ import * as dntShim from "./_dnt.shims.js";
2
+ import fs from "node:fs";
3
+ import { webDriver } from "./filesink.web.js";
4
+ import { getFileSink as getBaseFileSink, } from "./sink.js";
5
+ /**
6
+ * A Node.js-specific file sink driver.
7
+ */
8
+ export const nodeDriver = {
9
+ openSync(path) {
10
+ return fs.openSync(path, "a");
11
+ },
12
+ writeSync: fs.writeSync,
13
+ flushSync: fs.fsyncSync,
14
+ closeSync: fs.closeSync,
15
+ };
16
+ /**
17
+ * Get a file sink.
18
+ *
19
+ * Note that this function is unavailable in the browser.
20
+ *
21
+ * @param path A path to the file to write to.
22
+ * @param options The options for the sink.
23
+ * @returns A sink that writes to the file. The sink is also a disposable
24
+ * object that closes the file when disposed.
25
+ */
26
+ export function getFileSink(path, options = {}) {
27
+ if ("document" in dntShim.dntGlobalThis) {
28
+ return getBaseFileSink(path, { ...options, ...webDriver });
29
+ }
30
+ return getBaseFileSink(path, { ...options, ...nodeDriver });
31
+ }
32
+ // cSpell: ignore filesink
@@ -0,0 +1,12 @@
1
+ function notImplemented() {
2
+ throw new Error("File sink is not available in the browser.");
3
+ }
4
+ /**
5
+ * A browser-specific file sink driver. All methods throw an error.
6
+ */
7
+ export const webDriver = {
8
+ openSync: notImplemented,
9
+ writeSync: notImplemented,
10
+ flushSync: notImplemented,
11
+ closeSync: notImplemented,
12
+ };
package/esm/mod.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export { ConfigError, configure, reset, } from "./config.js";
2
+ export { getFileSink } from "./filesink.node.js";
2
3
  export { getLevelFilter, toFilter, } from "./filter.js";
3
4
  export { defaultConsoleFormatter, defaultTextFormatter, } from "./formatter.js";
4
5
  export { getLogger } from "./logger.js";
5
- export { getConsoleSink, getFileSink, getStreamSink, } from "./sink.js";
6
+ export { getConsoleSink, getStreamSink, } from "./sink.js";
7
+ // cSpell: ignore filesink
package/esm/sink.js CHANGED
@@ -60,6 +60,7 @@ export function getConsoleSink(options = {}) {
60
60
  }
61
61
  /**
62
62
  * Get a platform-independent file sink.
63
+ *
63
64
  * @typeParam TFile The type of the file descriptor.
64
65
  * @param path A path to the file to write to.
65
66
  * @param options The options for the sink and the file driver.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logtape/logtape",
3
- "version": "0.1.0-dev.16+907496aa",
3
+ "version": "0.1.0-dev.17+5e7affa9",
4
4
  "description": "Simple logging library for Deno/Node.js/Bun/browsers",
5
5
  "keywords": [
6
6
  "logging",
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.getFileSink = exports.nodeDriver = void 0;
30
+ const dntShim = __importStar(require("./_dnt.shims.js"));
31
+ const node_fs_1 = __importDefault(require("node:fs"));
32
+ const filesink_web_js_1 = require("./filesink.web.js");
33
+ const sink_js_1 = require("./sink.js");
34
+ /**
35
+ * A Node.js-specific file sink driver.
36
+ */
37
+ exports.nodeDriver = {
38
+ openSync(path) {
39
+ return node_fs_1.default.openSync(path, "a");
40
+ },
41
+ writeSync: node_fs_1.default.writeSync,
42
+ flushSync: node_fs_1.default.fsyncSync,
43
+ closeSync: node_fs_1.default.closeSync,
44
+ };
45
+ /**
46
+ * Get a file sink.
47
+ *
48
+ * Note that this function is unavailable in the browser.
49
+ *
50
+ * @param path A path to the file to write to.
51
+ * @param options The options for the sink.
52
+ * @returns A sink that writes to the file. The sink is also a disposable
53
+ * object that closes the file when disposed.
54
+ */
55
+ function getFileSink(path, options = {}) {
56
+ if ("document" in dntShim.dntGlobalThis) {
57
+ return (0, sink_js_1.getFileSink)(path, { ...options, ...filesink_web_js_1.webDriver });
58
+ }
59
+ return (0, sink_js_1.getFileSink)(path, { ...options, ...exports.nodeDriver });
60
+ }
61
+ exports.getFileSink = getFileSink;
62
+ // cSpell: ignore filesink
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.webDriver = void 0;
4
+ function notImplemented() {
5
+ throw new Error("File sink is not available in the browser.");
6
+ }
7
+ /**
8
+ * A browser-specific file sink driver. All methods throw an error.
9
+ */
10
+ exports.webDriver = {
11
+ openSync: notImplemented,
12
+ writeSync: notImplemented,
13
+ flushSync: notImplemented,
14
+ closeSync: notImplemented,
15
+ };
package/script/mod.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getStreamSink = exports.getFileSink = exports.getConsoleSink = exports.getLogger = exports.defaultTextFormatter = exports.defaultConsoleFormatter = exports.toFilter = exports.getLevelFilter = exports.reset = exports.configure = exports.ConfigError = void 0;
3
+ exports.getStreamSink = exports.getConsoleSink = exports.getLogger = exports.defaultTextFormatter = exports.defaultConsoleFormatter = exports.toFilter = exports.getLevelFilter = exports.getFileSink = exports.reset = exports.configure = exports.ConfigError = void 0;
4
4
  var config_js_1 = require("./config.js");
5
5
  Object.defineProperty(exports, "ConfigError", { enumerable: true, get: function () { return config_js_1.ConfigError; } });
6
6
  Object.defineProperty(exports, "configure", { enumerable: true, get: function () { return config_js_1.configure; } });
7
7
  Object.defineProperty(exports, "reset", { enumerable: true, get: function () { return config_js_1.reset; } });
8
+ var filesink_node_js_1 = require("./filesink.node.js");
9
+ Object.defineProperty(exports, "getFileSink", { enumerable: true, get: function () { return filesink_node_js_1.getFileSink; } });
8
10
  var filter_js_1 = require("./filter.js");
9
11
  Object.defineProperty(exports, "getLevelFilter", { enumerable: true, get: function () { return filter_js_1.getLevelFilter; } });
10
12
  Object.defineProperty(exports, "toFilter", { enumerable: true, get: function () { return filter_js_1.toFilter; } });
@@ -15,5 +17,5 @@ var logger_js_1 = require("./logger.js");
15
17
  Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return logger_js_1.getLogger; } });
16
18
  var sink_js_1 = require("./sink.js");
17
19
  Object.defineProperty(exports, "getConsoleSink", { enumerable: true, get: function () { return sink_js_1.getConsoleSink; } });
18
- Object.defineProperty(exports, "getFileSink", { enumerable: true, get: function () { return sink_js_1.getFileSink; } });
19
20
  Object.defineProperty(exports, "getStreamSink", { enumerable: true, get: function () { return sink_js_1.getStreamSink; } });
21
+ // cSpell: ignore filesink
package/script/sink.js CHANGED
@@ -65,6 +65,7 @@ function getConsoleSink(options = {}) {
65
65
  exports.getConsoleSink = getConsoleSink;
66
66
  /**
67
67
  * Get a platform-independent file sink.
68
+ *
68
69
  * @typeParam TFile The type of the file descriptor.
69
70
  * @param path A path to the file to write to.
70
71
  * @param options The options for the sink and the file driver.
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { type FileSinkDriver, type FileSinkOptions, type Sink } from "./sink.js";
3
+ /**
4
+ * A Node.js-specific file sink driver.
5
+ */
6
+ export declare const nodeDriver: FileSinkDriver<number>;
7
+ /**
8
+ * Get a file sink.
9
+ *
10
+ * Note that this function is unavailable in the browser.
11
+ *
12
+ * @param path A path to the file to write to.
13
+ * @param options The options for the sink.
14
+ * @returns A sink that writes to the file. The sink is also a disposable
15
+ * object that closes the file when disposed.
16
+ */
17
+ export declare function getFileSink(path: string, options?: FileSinkOptions): Sink & Disposable;
18
+ //# sourceMappingURL=filesink.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesink.node.d.ts","sourceRoot":"","sources":["../src/filesink.node.ts"],"names":[],"mappings":";AAGA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EAEpB,KAAK,IAAI,EACV,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,MAAM,CAO7C,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,IAAI,GAAG,UAAU,CAKnB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesink.test.d.ts","sourceRoot":"","sources":["../src/filesink.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { FileSinkDriver } from "./sink.js";
2
+ /**
3
+ * A browser-specific file sink driver. All methods throw an error.
4
+ */
5
+ export declare const webDriver: FileSinkDriver<void>;
6
+ //# sourceMappingURL=filesink.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesink.web.d.ts","sourceRoot":"","sources":["../src/filesink.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAMhD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,cAAc,CAAC,IAAI,CAK1C,CAAC"}
package/types/mod.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  export { type Config, ConfigError, configure, type LoggerConfig, reset, } from "./config.js";
2
+ export { getFileSink } from "./filesink.node.js";
2
3
  export { type Filter, type FilterLike, getLevelFilter, toFilter, } from "./filter.js";
3
4
  export { type ConsoleFormatter, defaultConsoleFormatter, defaultTextFormatter, type TextFormatter, } from "./formatter.js";
4
5
  export { getLogger, type Logger } from "./logger.js";
5
6
  export type { LogLevel, LogRecord } from "./record.js";
6
- export { type ConsoleSinkOptions, type FileSinkDriver, type FileSinkOptions, getConsoleSink, getFileSink, getStreamSink, type Sink, type StreamSinkOptions, } from "./sink.js";
7
+ export { type ConsoleSinkOptions, type FileSinkDriver, type FileSinkOptions, getConsoleSink, getStreamSink, type Sink, type StreamSinkOptions, } from "./sink.js";
7
8
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,WAAW,EACX,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,GACN,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,MAAM,EACX,KAAK,UAAU,EACf,cAAc,EACd,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,cAAc,EACd,WAAW,EACX,aAAa,EACb,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EACX,WAAW,EACX,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,GACN,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,KAAK,MAAM,EACX,KAAK,UAAU,EACf,cAAc,EACd,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,gBAAgB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,cAAc,EACd,aAAa,EACb,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC"}
package/types/sink.d.ts CHANGED
@@ -107,6 +107,7 @@ export interface FileSinkDriver<TFile> {
107
107
  }
108
108
  /**
109
109
  * Get a platform-independent file sink.
110
+ *
110
111
  * @typeParam TFile The type of the file descriptor.
111
112
  * @param path A path to the file to write to.
112
113
  * @param options The options for the sink and the file driver.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../src/sink.ts"],"names":[],"mappings":";;;AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,OAAO,CAAC,cAAc,EAC9B,OAAO,GAAE,iBAAsB,GAC9B,IAAI,GAAG,UAAU,CAUnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAYrE;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAE9B;;;;OAIG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9C;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,GAC/C,IAAI,GAAG,UAAU,CAUnB"}
1
+ {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../src/sink.ts"],"names":[],"mappings":";;;AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,OAAO,CAAC,cAAc,EAC9B,OAAO,GAAE,iBAAsB,GAC9B,IAAI,GAAG,UAAU,CAUnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAE7B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAYrE;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAE9B;;;;OAIG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9C;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,GAC/C,IAAI,GAAG,UAAU,CAUnB"}