effect-app 0.180.2 → 0.180.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @effect-app/prelude
2
2
 
3
+ ## 0.180.4
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [81f152f]
8
+ - @effect-app/core@0.150.2
9
+ - @effect-app/schema@0.202.2
10
+
11
+ ## 0.180.3
12
+
13
+ ### Patch Changes
14
+
15
+ - add fiberbag
16
+
3
17
  ## 0.180.2
4
18
 
5
19
  ### Patch Changes
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FiberBag = void 0;
7
+ var _core = require("@effect-app/core");
8
+ var _service = require("../service.cjs");
9
+ const make = _core.Effect.gen(function* ($) {
10
+ const ref = yield* $(_core.Ref.make([]));
11
+ return {
12
+ join: ref.pipe(_core.Ref.get, _core.Effect.tap(bag => _core.Effect.logDebug("[FiberBag] Joining " + bag.length + " fibers")), _core.Effect.andThen(_core.Fiber.joinAll)),
13
+ add: (...fibers) => ref.pipe(_core.Ref.update(_ => [..._, ...fibers])),
14
+ addAll: fibers => ref.pipe(_core.Ref.update(_ => [..._, ...fibers]))
15
+ };
16
+ });
17
+ /**
18
+ * Whenever you fork long running fibers e.g via `Effect.forkScoped` or `Effect.forkDaemon`
19
+ * you should register these long running fibers in a `FiberBag`, and join them at the end of your main program.
20
+ * This way any errors will blow up the main program instead of fibers dying unknowingly.
21
+ */
22
+ class FiberBag extends (0, _service.TagClassMakeId)("FiberBag", make)() {
23
+ static Live = this.toLayer();
24
+ static JoinLive = this.pipe(_core.Effect.andThen(_ => _.join), _core.Layer.effectDiscard, _core.Layer.provide(this.Live));
25
+ }
26
+ exports.FiberBag = FiberBag;
27
+ //# sourceMappingURL=FiberBag.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiberBag.cjs","names":["_core","require","_service","make","Effect","gen","$","ref","Ref","join","pipe","get","tap","bag","logDebug","length","andThen","Fiber","joinAll","add","fibers","update","_","addAll","FiberBag","TagClassMakeId","Live","toLayer","JoinLive","Layer","effectDiscard","provide"],"sources":["../../src/services/FiberBag.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAEA,MAAME,IAAI,GAAGC,YAAM,CAACC,GAAG,CAAC,WAAUC,CAAC;EACjC,MAAMC,GAAG,GAAG,OAAOD,CAAC,CAACE,SAAG,CAACL,IAAI,CAAsC,EAAE,CAAC,CAAC;EACvE,OAAO;IACLM,IAAI,EAAEF,GAAG,CAACG,IAAI,CACZF,SAAG,CAACG,GAAG,EACPP,YAAM,CAACQ,GAAG,CAAEC,GAAG,IAAKT,YAAM,CAACU,QAAQ,CAAC,qBAAqB,GAAGD,GAAG,CAACE,MAAM,GAAG,SAAS,CAAC,CAAC,EACpFX,YAAM,CAACY,OAAO,CAACC,WAAK,CAACC,OAAO,CAAC,CAC9B;IACDC,GAAG,EAAEA,CAAC,GAAGC,MAAkC,KAAKb,GAAG,CAACG,IAAI,CAACF,SAAG,CAACa,MAAM,CAAEC,CAAC,IAAK,CAAC,GAAGA,CAAC,EAAE,GAAGF,MAAM,CAAC,CAAC,CAAC;IAC9FG,MAAM,EAAGH,MAA2C,IAAKb,GAAG,CAACG,IAAI,CAACF,SAAG,CAACa,MAAM,CAAEC,CAAC,IAAK,CAAC,GAAGA,CAAC,EAAE,GAAGF,MAAM,CAAC,CAAC;GACvG;AACH,CAAC,CAAC;AAEF;;;;;AAKM,MAAOI,QAAS,SAAQ,IAAAC,uBAAc,EAAC,UAAU,EAAEtB,IAAI,CAAC,EAAY;EACxE,OAAgBuB,IAAI,GAAG,IAAI,CAACC,OAAO,EAAE;EACrC,OAAgBC,QAAQ,GAAG,IAAI,CAAClB,IAAI,CAACN,YAAM,CAACY,OAAO,CAAEM,CAAC,IAAKA,CAAC,CAACb,IAAI,CAAC,EAAEoB,WAAK,CAACC,aAAa,EAAED,WAAK,CAACE,OAAO,CAAC,IAAI,CAACL,IAAI,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { Effect, Fiber, Layer } from "@effect-app/core";
2
+ declare const FiberBag_base: {
3
+ new (service: {
4
+ join: Effect.Effect<void, never, never>;
5
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
6
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
7
+ }): Readonly<{
8
+ join: Effect.Effect<void, never, never>;
9
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
10
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
11
+ }> & import("effect/Context").TagClassShape<"FiberBag", {
12
+ join: Effect.Effect<void, never, never>;
13
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
14
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
15
+ }>;
16
+ toLayer: {
17
+ (): Layer<FiberBag, never, never>;
18
+ <E, R>(eff: Effect<{
19
+ join: Effect.Effect<void, never, never>;
20
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
21
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
22
+ }, E, R>): Layer<FiberBag, E, R>;
23
+ };
24
+ toLayerScoped: {
25
+ (): Layer<FiberBag, never, never>;
26
+ <E_1, R_1>(eff: Effect<{
27
+ join: Effect.Effect<void, never, never>;
28
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
29
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
30
+ }, E_1, R_1>): Layer<FiberBag, E_1, Exclude<R_1, import("effect/Scope").Scope>>;
31
+ };
32
+ wrap: (service: {
33
+ join: Effect.Effect<void, never, never>;
34
+ add: (...fibers: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
35
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, never>;
36
+ }) => FiberBag;
37
+ make: Effect<FiberBag, never, never>;
38
+ } & import("effect/Context").Tag<FiberBag, FiberBag> & {
39
+ $: {
40
+ join: Effect.Effect<void, never, FiberBag>;
41
+ };
42
+ } & {
43
+ add: (...args: Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, FiberBag>;
44
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => Effect.Effect<void, never, FiberBag>;
45
+ };
46
+ /**
47
+ * Whenever you fork long running fibers e.g via `Effect.forkScoped` or `Effect.forkDaemon`
48
+ * you should register these long running fibers in a `FiberBag`, and join them at the end of your main program.
49
+ * This way any errors will blow up the main program instead of fibers dying unknowingly.
50
+ */
51
+ export declare class FiberBag extends FiberBag_base {
52
+ static readonly Live: Layer<FiberBag, never, never>;
53
+ static readonly JoinLive: Layer.Layer<never, never, never>;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=FiberBag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FiberBag.d.ts","sourceRoot":"","sources":["../../src/services/FiberBag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAO,MAAM,kBAAkB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgB5D;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,aAA4C;IACxE,MAAM,CAAC,QAAQ,CAAC,IAAI,gCAAiB;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,mCAA0F;CACnH"}
@@ -0,0 +1,20 @@
1
+ import { Effect, Fiber, Layer, Ref } from "@effect-app/core";
2
+ import { TagClassMakeId } from "../service.js";
3
+ const make = Effect.gen(function* ($) {
4
+ const ref = yield* $(Ref.make([]));
5
+ return {
6
+ join: ref.pipe(Ref.get, Effect.tap((bag) => Effect.logDebug("[FiberBag] Joining " + bag.length + " fibers")), Effect.andThen(Fiber.joinAll)),
7
+ add: (...fibers) => ref.pipe(Ref.update((_) => [..._, ...fibers])),
8
+ addAll: (fibers) => ref.pipe(Ref.update((_) => [..._, ...fibers]))
9
+ };
10
+ });
11
+ /**
12
+ * Whenever you fork long running fibers e.g via `Effect.forkScoped` or `Effect.forkDaemon`
13
+ * you should register these long running fibers in a `FiberBag`, and join them at the end of your main program.
14
+ * This way any errors will blow up the main program instead of fibers dying unknowingly.
15
+ */
16
+ export class FiberBag extends TagClassMakeId("FiberBag", make)() {
17
+ static Live = this.toLayer();
18
+ static JoinLive = this.pipe(Effect.andThen((_) => _.join), Layer.effectDiscard, Layer.provide(this.Live));
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmliZXJCYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvRmliZXJCYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBQyxDQUFDO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFzQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE9BQU87UUFDTCxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FDWixHQUFHLENBQUMsR0FBRyxFQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxFQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FDOUI7UUFDRCxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQWtDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxFQUFFLENBQUMsTUFBMkMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUN4RyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLFFBQVMsU0FBUSxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFZO0lBQ3hFLE1BQU0sQ0FBVSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3JDLE1BQU0sQ0FBVSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-app",
3
- "version": "0.180.2",
3
+ "version": "0.180.4",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -13,9 +13,9 @@
13
13
  "ts-pattern": "^5.0.8",
14
14
  "uuid": "^9.0.1",
15
15
  "validator": "^13.11.0",
16
- "@effect-app/core": "0.150.1",
17
16
  "@effect-app/fluent-extensions": "0.143.1",
18
- "@effect-app/schema": "0.202.1"
17
+ "@effect-app/core": "0.150.2",
18
+ "@effect-app/schema": "0.202.2"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@babel/cli": "^7.23.9",
@@ -263,6 +263,16 @@
263
263
  "default": "./_cjs/service.cjs"
264
264
  }
265
265
  },
266
+ "./services/FiberBag": {
267
+ "import": {
268
+ "types": "./dist/services/FiberBag.d.ts",
269
+ "default": "./dist/services/FiberBag.js"
270
+ },
271
+ "require": {
272
+ "types": "./dist/services/FiberBag.d.ts",
273
+ "default": "./_cjs/services/FiberBag.cjs"
274
+ }
275
+ },
266
276
  "./utils": {
267
277
  "import": {
268
278
  "types": "./dist/utils.d.ts",
@@ -0,0 +1,25 @@
1
+ import { Effect, Fiber, Layer, Ref } from "@effect-app/core"
2
+ import { TagClassMakeId } from "../service.js"
3
+
4
+ const make = Effect.gen(function*($) {
5
+ const ref = yield* $(Ref.make<readonly Fiber.Fiber<void, never>[]>([]))
6
+ return {
7
+ join: ref.pipe(
8
+ Ref.get,
9
+ Effect.tap((bag) => Effect.logDebug("[FiberBag] Joining " + bag.length + " fibers")),
10
+ Effect.andThen(Fiber.joinAll)
11
+ ),
12
+ add: (...fibers: Fiber.Fiber<void, never>[]) => ref.pipe(Ref.update((_) => [..._, ...fibers])),
13
+ addAll: (fibers: readonly Fiber.Fiber<void, never>[]) => ref.pipe(Ref.update((_) => [..._, ...fibers]))
14
+ }
15
+ })
16
+
17
+ /**
18
+ * Whenever you fork long running fibers e.g via `Effect.forkScoped` or `Effect.forkDaemon`
19
+ * you should register these long running fibers in a `FiberBag`, and join them at the end of your main program.
20
+ * This way any errors will blow up the main program instead of fibers dying unknowingly.
21
+ */
22
+ export class FiberBag extends TagClassMakeId("FiberBag", make)<FiberBag>() {
23
+ static readonly Live = this.toLayer()
24
+ static readonly JoinLive = this.pipe(Effect.andThen((_) => _.join), Layer.effectDiscard, Layer.provide(this.Live))
25
+ }
@@ -1,23 +0,0 @@
1
- // vitest.config.ts
2
- import { defineConfig } from "file:///Users/patrickroza/Projects/Personal/effect-ts-app/libs/node_modules/.pnpm/vite@4.0.0_@types+node@18.11.12/node_modules/vite/dist/node/index.js";
3
-
4
- // ../../vite.config.base.ts
5
- import { tsPlugin } from "file:///Users/patrickroza/Projects/Personal/effect-ts-app/libs/packages/compiler/dist/vitePlugin.js";
6
- function makeConfig() {
7
- return {
8
- plugins: [tsPlugin({})],
9
- test: {
10
- include: ["./_src/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
11
- exclude: ["./_test/**/*"],
12
- reporters: "verbose",
13
- globals: true
14
- }
15
- };
16
- }
17
-
18
- // vitest.config.ts
19
- var vitest_config_default = defineConfig(makeConfig());
20
- export {
21
- vitest_config_default as default
22
- };
23
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZXN0LmNvbmZpZy50cyIsICIuLi8uLi92aXRlLmNvbmZpZy5iYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL1Byb2plY3RzL1BlcnNvbmFsL2VmZmVjdC10cy1hcHAvbGlicy9wYWNrYWdlcy9ib2lsZXJwbGF0ZS1wcmVsdWRlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvcGF0cmlja3JvemEvUHJvamVjdHMvUGVyc29uYWwvZWZmZWN0LXRzLWFwcC9saWJzL3BhY2thZ2VzL2JvaWxlcnBsYXRlLXByZWx1ZGUvdml0ZXN0LmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvcGF0cmlja3JvemEvUHJvamVjdHMvUGVyc29uYWwvZWZmZWN0LXRzLWFwcC9saWJzL3BhY2thZ2VzL2JvaWxlcnBsYXRlLXByZWx1ZGUvdml0ZXN0LmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBtYWtlQ29uZmlnIGZyb20gXCIuLi8uLi92aXRlLmNvbmZpZy5iYXNlXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKG1ha2VDb25maWcoKSlcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL1Byb2plY3RzL1BlcnNvbmFsL2VmZmVjdC10cy1hcHAvbGlic1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL1Byb2plY3RzL1BlcnNvbmFsL2VmZmVjdC10cy1hcHAvbGlicy92aXRlLmNvbmZpZy5iYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9Qcm9qZWN0cy9QZXJzb25hbC9lZmZlY3QtdHMtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IHRzUGx1Z2luIH0gZnJvbSBcIkBlZmZlY3QtdHMtYXBwL2NvbXBpbGVyL3ZpdGVQbHVnaW5cIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZUNvbmZpZygpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIHBsdWdpbnM6IFt0c1BsdWdpbih7fSldLFxuICAgIHRlc3Q6IHtcbiAgICAgIGluY2x1ZGU6IFtcIi4vX3NyYy8qKi8qLnRlc3Que2pzLG1qcyxjanMsdHMsbXRzLGN0cyxqc3gsdHN4fVwiXSxcbiAgICAgIGV4Y2x1ZGU6IFtcIi4vX3Rlc3QvKiovKlwiXSxcbiAgICAgIHJlcG9ydGVyczogXCJ2ZXJib3NlXCIsXG4gICAgICBnbG9iYWxzOiB0cnVlXG4gICAgfSxcbiAgICAvLyByZXNvbHZlOiB7XG4gICAgLy8gICBhbGlhczoge1xuICAgIC8vICAgICBcIkBlZmZlY3QvaW8vdGVzdFwiOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi90ZXN0XCIpLFxuICAgIC8vICAgICBcIkBlZmZlY3QvaW9cIjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCIvc3JjXCIpXG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxvQkFBb0I7OztBQ0E3QixTQUFTLGdCQUFnQjtBQUNWLFNBQVIsYUFBOEI7QUFDbkMsU0FBTztBQUFBLElBRUwsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUN0QixNQUFNO0FBQUEsTUFDSixTQUFTLENBQUMsa0RBQWtEO0FBQUEsTUFDNUQsU0FBUyxDQUFDLGNBQWM7QUFBQSxNQUN4QixXQUFXO0FBQUEsTUFDWCxTQUFTO0FBQUEsSUFDWDtBQUFBLEVBT0Y7QUFDRjs7O0FEZkEsSUFBTyx3QkFBUSxhQUFhLFdBQVcsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K