atom.io 0.30.0 → 0.30.2

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.
@@ -1,116 +1,149 @@
1
1
  import * as AtomIO from 'atom.io';
2
2
  import { ReadonlySelectorFamilyToken, MutableAtomFamilyToken, SetterToolkit, disposeState, ReadonlySelectorToken } from 'atom.io';
3
- import { Store, JunctionSchema, JunctionEntries, Molecule, Junction } from 'atom.io/internal';
3
+ import { Store, JunctionSchemaBase, JunctionEntriesBase, Molecule, Junction } from 'atom.io/internal';
4
4
  import { Canonical, stringified, Json } from 'atom.io/json';
5
5
  import { findState } from 'atom.io/ephemeral';
6
+ import { Refinement } from 'atom.io/introspection';
6
7
  import { SetRTX, SetRTXJson } from 'atom.io/transceivers/set-rtx';
7
8
 
8
9
  declare function dict<State, Key extends Canonical>(family: AtomIO.ReadonlySelectorFamilyToken<State, Key> | AtomIO.RegularAtomFamilyToken<State, Key> | AtomIO.WritableSelectorFamilyToken<State, Key>, index: AtomIO.ReadonlySelectorToken<Key[]> | AtomIO.RegularAtomToken<Key[]> | AtomIO.WritableSelectorToken<Key[]>, store?: Store): AtomIO.ReadonlySelectorToken<{
9
10
  [K in stringified<Key>]: State;
10
11
  }>;
11
12
 
12
- interface JoinOptions<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> extends Json.Object, JunctionSchema<ASide, BSide>, Partial<JunctionEntries<Content>> {
13
+ interface JoinOptions<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> extends JunctionSchemaBase<ASide, BSide>, Partial<JunctionEntriesBase<AType, BType, Content>> {
13
14
  readonly key: string;
14
15
  readonly cardinality: Cardinality;
16
+ readonly isAType: Refinement<string, AType>;
17
+ readonly isBType: Refinement<string, BType>;
15
18
  }
16
- type JoinStateFamilies<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> = Cardinality extends `1:1` ? (Content extends Json.Object ? {
17
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntryOf${Capitalize<BSide>}` : `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<[
18
- string,
19
+ type JoinStateFamilies<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> = Cardinality extends `1:1` ? (Content extends Json.Object ? {
20
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<[
21
+ AType,
22
+ Content
23
+ ] | null, BType>;
24
+ } & {
25
+ readonly [B in BSide as `${B}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<[
26
+ BType,
19
27
  Content
20
- ] | null, string>;
28
+ ] | null, AType>;
21
29
  } : {}) & {
22
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeyOf${Capitalize<BSide>}` : `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<string | null, string>;
30
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<AType | null, BType>;
31
+ } & {
32
+ readonly [B in BSide as `${B}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<BType | null, AType>;
23
33
  } : Cardinality extends `1:n` ? (Content extends Json.Object ? {
24
34
  readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<[
25
- string,
35
+ AType,
26
36
  Content
27
- ] | null, string>;
37
+ ] | null, BType>;
28
38
  } & {
29
39
  readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<[
30
- string,
40
+ BType,
31
41
  Content
32
- ][], string>;
42
+ ][], AType>;
33
43
  } : {}) & {
34
- readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<string | null, string>;
44
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<AType | null, BType>;
35
45
  } & {
36
- readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<string[], string>;
46
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<BType[], AType>;
37
47
  } : Cardinality extends `n:n` ? (Content extends Json.Object ? {
38
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntriesOf${Capitalize<BSide>}` : `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<[
39
- string,
48
+ readonly [A in ASide as `${A}EntriesOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<[
49
+ AType,
40
50
  Content
41
- ][], string>;
51
+ ][], BType>;
52
+ } & {
53
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<[
54
+ BType,
55
+ Content
56
+ ][], AType>;
42
57
  } : {}) & {
43
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeysOf${Capitalize<BSide>}` : `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<string[], string>;
58
+ readonly [A in ASide as `${A}KeysOf${Capitalize<BSide>}`]: ReadonlySelectorFamilyToken<AType[], BType>;
59
+ } & {
60
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorFamilyToken<BType[], AType>;
44
61
  } : never;
45
- declare class Join<const ASide extends string, const BSide extends string, const Cardinality extends `1:1` | `1:n` | `n:n`, const Content extends Json.Object | null = null> {
62
+ declare class Join<const ASide extends string, const AType extends string, const BSide extends string, const BType extends string, const Cardinality extends `1:1` | `1:n` | `n:n`, const Content extends Json.Object | null = null> {
46
63
  private options;
47
64
  private defaultContent;
48
65
  private toolkit;
49
66
  retrieve: typeof findState;
50
67
  molecules: Map<string, Molecule<any>>;
51
- relations: Junction<ASide, BSide, Content>;
52
- states: JoinStateFamilies<ASide, BSide, Cardinality, Content>;
68
+ relations: Junction<ASide, AType, BSide, BType, Content>;
69
+ states: JoinStateFamilies<ASide, AType, BSide, BType, Cardinality, Content>;
53
70
  core: {
54
71
  findRelatedKeysState: MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string>;
55
72
  };
56
73
  transact(toolkit: SetterToolkit & {
57
74
  dispose: typeof disposeState;
58
- }, run: (join: Join<ASide, BSide, Cardinality, Content>) => void): void;
75
+ }, run: (join: Join<ASide, AType, BSide, BType, Cardinality, Content>) => void): void;
59
76
  store: Store;
60
- alternates: Map<string, Join<ASide, BSide, Cardinality, Content>>;
77
+ alternates: Map<string, Join<ASide, AType, BSide, BType, Cardinality, Content>>;
61
78
  [Symbol.dispose](): void;
62
- in(store: Store): Join<ASide, BSide, Cardinality, Content>;
63
- constructor(options: JoinOptions<ASide, BSide, Cardinality, Content>, defaultContent: Content | undefined, store?: Store);
79
+ in(store: Store): Join<ASide, AType, BSide, BType, Cardinality, Content>;
80
+ constructor(options: JoinOptions<ASide, AType, BSide, BType, Cardinality, Content>, defaultContent: Content | undefined, store?: Store);
64
81
  }
65
- type JoinToken<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null = null> = {
82
+ type JoinToken<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null = null> = {
66
83
  key: string;
67
84
  type: `join`;
68
85
  cardinality: Cardinality;
69
86
  a: ASide;
70
87
  b: BSide;
88
+ __aType?: AType;
89
+ __bType?: BType;
71
90
  __content?: Content;
72
91
  };
73
- declare function join<const ASide extends string, const BSide extends string, const Cardinality extends `1:1` | `1:n` | `n:n`>(options: JoinOptions<ASide, BSide, Cardinality, null>, defaultContent?: undefined, store?: Store): JoinToken<ASide, BSide, Cardinality, null>;
74
- declare function join<const ASide extends string, const BSide extends string, const Cardinality extends `1:1` | `1:n` | `n:n`, const Content extends Json.Object>(options: JoinOptions<ASide, BSide, Cardinality, Content>, defaultContent: Content, store?: Store): JoinToken<ASide, BSide, Cardinality, Content>;
92
+ declare function join<const ASide extends string, const AType extends string, const BSide extends string, const BType extends string, const Cardinality extends `1:1` | `1:n` | `n:n`>(options: JoinOptions<ASide, AType, BSide, BType, Cardinality, null>, defaultContent?: undefined, store?: Store): JoinToken<ASide, AType, BSide, BType, Cardinality, null>;
93
+ declare function join<const ASide extends string, const AType extends string, const BSide extends string, const BType extends string, const Cardinality extends `1:1` | `1:n` | `n:n`, const Content extends Json.Object>(options: JoinOptions<ASide, AType, BSide, BType, Cardinality, Content>, defaultContent: Content, store?: Store): JoinToken<ASide, AType, BSide, BType, Cardinality, Content>;
75
94
  declare function getJoinMap(store: Store & {
76
- joins?: Map<string, Join<any, any, any, any>>;
77
- }): Map<string, Join<any, any, any, any>>;
78
- declare function getJoin<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>, store: Store): Join<ASide, BSide, Cardinality, Content>;
79
- type JoinStates<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> = Cardinality extends `1:1` ? (Content extends Json.Object ? {
80
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntryOf${Capitalize<BSide>}` : `${AB}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorToken<[
81
- string,
95
+ joins?: Map<string, Join<any, any, any, any, any, any>>;
96
+ }): Map<string, Join<any, any, any, any, any, any>>;
97
+ declare function getJoin<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>, store: Store): Join<ASide, AType, BSide, BType, Cardinality, Content>;
98
+ type JoinStates<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null> = Cardinality extends `1:1` ? (Content extends Json.Object ? {
99
+ readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorToken<[
100
+ AType,
101
+ Content
102
+ ] | null, BType>;
103
+ } & {
104
+ readonly [B in BSide as `${B}EntryOf${Capitalize<ASide>}`]: ReadonlySelectorToken<[
105
+ BType,
82
106
  Content
83
- ] | null>;
107
+ ] | null, AType>;
84
108
  } : {}) & {
85
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeyOf${Capitalize<BSide>}` : `${AB}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorToken<string | null>;
109
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorToken<AType | null, BType>;
110
+ } & {
111
+ readonly [B in BSide as `${B}KeyOf${Capitalize<ASide>}`]: ReadonlySelectorToken<BType | null, AType>;
86
112
  } : Cardinality extends `1:n` ? (Content extends Json.Object ? {
87
113
  readonly [A in ASide as `${A}EntryOf${Capitalize<BSide>}`]: ReadonlySelectorToken<[
88
- string,
114
+ AType,
89
115
  Content
90
- ] | null>;
116
+ ] | null, BType>;
91
117
  } & {
92
118
  readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorToken<[
93
- string,
119
+ BType,
94
120
  Content
95
- ][]>;
121
+ ][], AType>;
96
122
  } : {}) & {
97
- readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorToken<string | null>;
123
+ readonly [A in ASide as `${A}KeyOf${Capitalize<BSide>}`]: ReadonlySelectorToken<AType | null, BType>;
98
124
  } & {
99
- readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<string[]>;
125
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<BType[], AType>;
100
126
  } : Cardinality extends `n:n` ? (Content extends Json.Object ? {
101
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}EntriesOf${Capitalize<BSide>}` : `${AB}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorToken<[
102
- string,
127
+ readonly [A in ASide as `${A}EntriesOf${Capitalize<BSide>}`]: ReadonlySelectorToken<[
128
+ AType,
103
129
  Content
104
- ][]>;
130
+ ][], BType>;
131
+ } & {
132
+ readonly [B in BSide as `${B}EntriesOf${Capitalize<ASide>}`]: ReadonlySelectorToken<[
133
+ BType,
134
+ Content
135
+ ][], AType>;
105
136
  } : {}) & {
106
- readonly [AB in ASide | BSide as AB extends ASide ? `${AB}KeysOf${Capitalize<BSide>}` : `${AB}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<string[]>;
137
+ readonly [A in ASide as `${A}KeysOf${Capitalize<BSide>}`]: ReadonlySelectorToken<AType[], BType>;
138
+ } & {
139
+ readonly [B in BSide as `${B}KeysOf${Capitalize<ASide>}`]: ReadonlySelectorToken<BType[], AType>;
107
140
  } : never;
108
- declare function findRelationsInStore<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>, key: string, store: Store): JoinStates<ASide, BSide, Cardinality, Content>;
109
- declare function findRelations<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>, key: string): JoinStates<ASide, BSide, Cardinality, Content>;
110
- declare function editRelationsInStore<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>, change: (relations: Junction<ASide, BSide, Content>) => void, store: Store): void;
111
- declare function editRelations<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>, change: (relations: Junction<ASide, BSide, Content>) => void): void;
112
- declare function getInternalRelationsFromStore(token: JoinToken<any, any, any, any>, store: Store): MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string>;
113
- declare function getInternalRelations<ASide extends string, BSide extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, BSide, Cardinality, Content>): MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string>;
141
+ declare function findRelationsInStore<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>, key: AType | BType, store: Store): JoinStates<ASide, AType, BSide, BType, Cardinality, Content>;
142
+ declare function findRelations<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>, key: AType | BType): JoinStates<ASide, AType, BSide, BType, Cardinality, Content>;
143
+ declare function editRelationsInStore<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>, change: (relations: Junction<ASide, AType, BSide, BType, Content>) => void, store: Store): void;
144
+ declare function editRelations<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>, change: (relations: Junction<ASide, AType, BSide, BType, Content>) => void): void;
145
+ declare function getInternalRelationsFromStore(token: JoinToken<any, any, any, any, any, any>, store: Store): MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string>;
146
+ declare function getInternalRelations<ASide extends string, AType extends string, BSide extends string, BType extends string, Cardinality extends `1:1` | `1:n` | `n:n`, Content extends Json.Object | null>(token: JoinToken<ASide, AType, BSide, BType, Cardinality, Content>): MutableAtomFamilyToken<SetRTX<string>, SetRTXJson<string>, string>;
114
147
 
115
148
  declare function struct<Struct extends {
116
149
  [key: string]: unknown;
@@ -61,7 +61,7 @@ var Join = class _Join {
61
61
  if (maybeToken) {
62
62
  return maybeToken;
63
63
  }
64
- const molecule = this.molecules.get(stringifyJson(key));
64
+ const molecule = this.store.molecules.get(stringifyJson(key));
65
65
  if (molecule) {
66
66
  const family = withdraw(token, store);
67
67
  return growMoleculeInStore(molecule, family, store);
@@ -231,13 +231,6 @@ var Join = class _Join {
231
231
  },
232
232
  [`join`, `content`]
233
233
  );
234
- ({
235
- key: options.key,
236
- type: `join`,
237
- a: options.between[0],
238
- b: options.between[1],
239
- cardinality: options.cardinality
240
- });
241
234
  contentMolecules = createMoleculeFamily(store, {
242
235
  key: `${options.key}/content-molecules`,
243
236
  new: class ContentMolecule {
@@ -276,30 +269,35 @@ var Join = class _Join {
276
269
  } else {
277
270
  externalStore = baseExternalStoreConfiguration;
278
271
  }
279
- const relations = new Junction(options, {
280
- externalStore,
281
- makeContentKey: (...args) => {
282
- const sorted = args.sort();
283
- const compositeKey = `${sorted[0]}:${sorted[1]}`;
284
- const [m0, m1] = sorted.map(
285
- (key) => this.molecules.get(stringifyJson(key))
286
- );
287
- if (store.config.lifespan === `immortal` && m0 && m1) {
288
- const target = newest(store);
289
- const moleculeToken = makeMoleculeInStore(
290
- target,
291
- [m0, m1],
292
- contentMolecules,
293
- compositeKey
294
- );
295
- this.molecules.set(
296
- `"${compositeKey}"`,
297
- withdraw(moleculeToken, target)
272
+ const relations = new Junction(
273
+ options,
274
+ {
275
+ externalStore,
276
+ isAType: options.isAType,
277
+ isBType: options.isBType,
278
+ makeContentKey: (...args) => {
279
+ const sorted = args.sort();
280
+ const compositeKey = `${sorted[0]}:${sorted[1]}`;
281
+ const [m0, m1] = sorted.map(
282
+ (key) => this.molecules.get(stringifyJson(key))
298
283
  );
284
+ if (store.config.lifespan === `immortal` && m0 && m1) {
285
+ const target = newest(store);
286
+ const moleculeToken = makeMoleculeInStore(
287
+ target,
288
+ [m0, m1],
289
+ contentMolecules,
290
+ compositeKey
291
+ );
292
+ this.molecules.set(
293
+ `"${compositeKey}"`,
294
+ withdraw(moleculeToken, target)
295
+ );
296
+ }
297
+ return compositeKey;
299
298
  }
300
- return compositeKey;
301
299
  }
302
- });
300
+ );
303
301
  const createSingleKeyStateFamily = () => createReadonlySelectorFamily(
304
302
  store,
305
303
  {
@@ -334,14 +332,18 @@ var Join = class _Join {
334
332
  store,
335
333
  {
336
334
  key: `${options.key}/singleRelatedEntry`,
337
- get: (key) => ({ get }) => {
338
- const relatedKeysState = this.retrieve(relatedKeysAtoms, key);
335
+ get: (x) => ({ get }) => {
336
+ const relatedKeysState = this.retrieve(relatedKeysAtoms, x);
339
337
  const relatedKeys = get(relatedKeysState);
340
- for (const relatedKey of relatedKeys) {
341
- const contentKey = relations.makeContentKey(key, relatedKey);
338
+ for (const y of relatedKeys) {
339
+ let a = relations.isAType?.(x) ? x : void 0;
340
+ let b = a === void 0 ? x : void 0;
341
+ a ??= y;
342
+ b ??= y;
343
+ const contentKey = relations.makeContentKey(a, b);
342
344
  const contentState = this.retrieve(contentAtoms, contentKey);
343
345
  const content = get(contentState);
344
- return [relatedKey, content];
346
+ return [y, content];
345
347
  }
346
348
  return null;
347
349
  }
@@ -352,15 +354,19 @@ var Join = class _Join {
352
354
  store,
353
355
  {
354
356
  key: `${options.key}/multipleRelatedEntries`,
355
- get: (key) => ({ get }) => {
357
+ get: (x) => ({ get }) => {
356
358
  const jsonFamily = getJsonFamily(relatedKeysAtoms, store);
357
- const jsonState = this.retrieve(jsonFamily, key);
359
+ const jsonState = this.retrieve(jsonFamily, x);
358
360
  const json = get(jsonState);
359
- return json.members.map((relatedKey) => {
360
- const contentKey = relations.makeContentKey(key, relatedKey);
361
+ return json.members.map((y) => {
362
+ let a = relations.isAType?.(x) ? x : void 0;
363
+ let b = a === void 0 ? x : void 0;
364
+ a ??= y;
365
+ b ??= y;
366
+ const contentKey = relations.makeContentKey(a, b);
361
367
  const contentState = this.retrieve(contentAtoms, contentKey);
362
368
  const content = get(contentState);
363
- return [relatedKey, content];
369
+ return [y, content];
364
370
  });
365
371
  }
366
372
  },