alepha 0.7.5 → 0.7.6
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/LICENSE +21 -21
- package/README.md +44 -44
- package/cache/redis.cjs +4 -8
- package/cache/redis.d.ts +28 -89
- package/cache/redis.js +1 -1
- package/cache.cjs +4 -8
- package/cache.d.ts +189 -265
- package/cache.js +1 -1
- package/core.cjs +4 -8
- package/core.d.ts +950 -929
- package/core.js +1 -1
- package/datetime.cjs +4 -8
- package/datetime.d.ts +151 -146
- package/datetime.js +1 -1
- package/lock/redis.cjs +7 -49
- package/lock/redis.d.ts +15 -12
- package/lock/redis.js +1 -47
- package/lock.cjs +4 -8
- package/lock.d.ts +117 -170
- package/lock.js +1 -1
- package/package.json +70 -39
- package/postgres.cjs +4 -8
- package/postgres.d.ts +1314 -4398
- package/postgres.js +1 -1
- package/queue/redis.cjs +8 -0
- package/queue/redis.d.ts +31 -0
- package/queue/redis.js +1 -0
- package/queue.cjs +4 -8
- package/queue.d.ts +162 -205
- package/queue.js +1 -1
- package/react/auth.cjs +4 -8
- package/react/auth.d.ts +166 -282
- package/react/auth.js +1 -1
- package/react.cjs +4 -8
- package/react.d.ts +509 -551
- package/react.js +1 -1
- package/redis.cjs +4 -8
- package/redis.d.ts +59 -132
- package/redis.js +1 -1
- package/retry.cjs +4 -8
- package/retry.d.ts +34 -31
- package/retry.js +1 -1
- package/scheduler.cjs +4 -8
- package/scheduler.d.ts +125 -182
- package/scheduler.js +1 -1
- package/security.cjs +4 -8
- package/security.d.ts +472 -595
- package/security.js +1 -1
- package/server/cache.cjs +4 -8
- package/server/cache.d.ts +41 -38
- package/server/cache.js +1 -1
- package/server/cookies.cjs +4 -8
- package/server/cookies.d.ts +46 -41
- package/server/cookies.js +1 -1
- package/server/static.cjs +4 -8
- package/server/static.d.ts +98 -95
- package/server/static.js +1 -1
- package/server/swagger.cjs +4 -8
- package/server/swagger.d.ts +96 -92
- package/server/swagger.js +1 -1
- package/server.cjs +4 -8
- package/server.d.ts +754 -1025
- package/server.js +1 -1
- package/testing.cjs +8 -0
- package/testing.d.ts +1 -0
- package/testing.js +1 -0
- package/topic/redis.cjs +8 -0
- package/topic/redis.d.ts +45 -0
- package/topic/redis.js +1 -0
- package/topic.cjs +4 -8
- package/topic.d.ts +171 -163
- package/topic.js +1 -1
- package/vite.cjs +4 -8
- package/vite.d.ts +89 -82
- package/vite.js +1 -1
- package/src/cache/redis.ts +0 -1
- package/src/cache.ts +0 -1
- package/src/core.ts +0 -1
- package/src/datetime.ts +0 -1
- package/src/lock/redis.ts +0 -1
- package/src/lock.ts +0 -1
- package/src/postgres.ts +0 -1
- package/src/queue/redis.ts +0 -1
- package/src/queue.ts +0 -1
- package/src/react/auth.ts +0 -1
- package/src/react.ts +0 -1
- package/src/redis.ts +0 -1
- package/src/retry.ts +0 -1
- package/src/scheduler.ts +0 -1
- package/src/security.ts +0 -1
- package/src/server/cache.ts +0 -1
- package/src/server/cookies.ts +0 -1
- package/src/server/static.ts +0 -1
- package/src/server/swagger.ts +0 -1
- package/src/server.ts +0 -1
- package/src/topic/redis.ts +0 -1
- package/src/topic.ts +0 -1
- package/src/vite.ts +0 -1
package/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '@alepha/core'
|
|
1
|
+
export * from '@alepha/core'
|
package/datetime.cjs
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.keys(datetime).forEach(function (k) {
|
|
2
|
+
var m = require('@alepha/datetime');
|
|
3
|
+
Object.keys(m).forEach(function (k) {
|
|
8
4
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
9
5
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
6
|
+
get: function () { return m[k]; }
|
|
11
7
|
});
|
|
12
|
-
});
|
|
8
|
+
});
|
package/datetime.d.ts
CHANGED
|
@@ -1,162 +1,167 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import { Async } from
|
|
3
|
-
import dayjs, {
|
|
4
|
-
import dayjsDuration from
|
|
1
|
+
import * as _alepha_core1 from "@alepha/core";
|
|
2
|
+
import { Async } from "@alepha/core";
|
|
3
|
+
import dayjs, { Dayjs, ManipulateType } from "dayjs";
|
|
4
|
+
import dayjsDuration from "dayjs/plugin/duration.js";
|
|
5
5
|
|
|
6
|
+
//#region src/helpers/Interval.d.ts
|
|
6
7
|
declare class Interval {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
8
|
+
private timer;
|
|
9
|
+
private readonly run;
|
|
10
|
+
private duration;
|
|
11
|
+
private options;
|
|
12
|
+
constructor(duration: number, options: IntervalDescriptorOptions);
|
|
13
|
+
/**
|
|
14
|
+
* Start the interval.
|
|
15
|
+
*/
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Add time to the interval.
|
|
19
|
+
*
|
|
20
|
+
* @param amountMs
|
|
21
|
+
*/
|
|
22
|
+
add(amountMs: number): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Clear the interval.
|
|
25
|
+
*/
|
|
26
|
+
clear(): void;
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/helpers/Timeout.d.ts
|
|
28
30
|
declare class Timeout {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
31
|
+
private timer;
|
|
32
|
+
private duration;
|
|
33
|
+
private readonly now;
|
|
34
|
+
private readonly callback;
|
|
35
|
+
constructor(now: number, duration: number, callback: () => void);
|
|
36
|
+
/**
|
|
37
|
+
* Add time to the timeout.
|
|
38
|
+
*/
|
|
39
|
+
add(amountMs: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Clear the timeout.
|
|
42
|
+
*/
|
|
43
|
+
clear(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Start the timeout.
|
|
46
|
+
*
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
49
|
+
private start;
|
|
48
50
|
}
|
|
49
|
-
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/providers/DateTimeProvider.d.ts
|
|
50
53
|
type DateTime = dayjs.Dayjs;
|
|
51
54
|
type Duration = dayjsDuration.Duration;
|
|
52
55
|
type DurationLike = number | dayjsDuration.Duration | [number, ManipulateType];
|
|
53
56
|
declare class DateTimeProvider {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
57
|
+
protected log: _alepha_core1.Logger;
|
|
58
|
+
protected ref: DateTime | null;
|
|
59
|
+
protected readonly timeouts: Timeout[];
|
|
60
|
+
protected readonly intervals: Interval[];
|
|
61
|
+
constructor();
|
|
62
|
+
protected readonly start: _alepha_core1.HookDescriptor<"start">;
|
|
63
|
+
protected readonly stop: _alepha_core1.HookDescriptor<"stop">;
|
|
64
|
+
/**
|
|
65
|
+
* Create a new DateTime instance.
|
|
66
|
+
*/
|
|
67
|
+
of(date: string | number | Date | Dayjs | null | undefined): DateTime;
|
|
68
|
+
/**
|
|
69
|
+
* Get the current date.
|
|
70
|
+
*/
|
|
71
|
+
now(): DateTime;
|
|
72
|
+
/**
|
|
73
|
+
* Get the current date as a string.
|
|
74
|
+
*
|
|
75
|
+
* @param date
|
|
76
|
+
*/
|
|
77
|
+
toISOString(date?: Date | string | DateTime): string;
|
|
78
|
+
/**
|
|
79
|
+
* Get the current date as a string.
|
|
80
|
+
*/
|
|
81
|
+
nowISOString(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get the current date as a string.
|
|
84
|
+
*
|
|
85
|
+
* @protected
|
|
86
|
+
*/
|
|
87
|
+
protected getCurrentDate(): DateTime;
|
|
88
|
+
/**
|
|
89
|
+
* Create a new Duration instance.
|
|
90
|
+
*/
|
|
91
|
+
duration: (duration: DurationLike, unit?: ManipulateType) => Duration;
|
|
92
|
+
isDurationLike(value: unknown): value is DurationLike;
|
|
93
|
+
/**
|
|
94
|
+
* Return a promise that resolves after a next tick.
|
|
95
|
+
* It uses `setTimeout` with 0ms delay.
|
|
96
|
+
*/
|
|
97
|
+
tick(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Wait for a certain duration.
|
|
100
|
+
*
|
|
101
|
+
* You can clear the timeout by using the `AbortSignal` API.
|
|
102
|
+
* Aborted signal will resolve the promise immediately, it does not reject it.
|
|
103
|
+
*/
|
|
104
|
+
wait(duration: DurationLike, options?: {
|
|
105
|
+
signal?: AbortSignal;
|
|
106
|
+
now?: number;
|
|
107
|
+
}): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Run a callback after a certain duration.
|
|
110
|
+
*/
|
|
111
|
+
timeout(callback: () => void, duration: DurationLike, now?: number): Timeout;
|
|
112
|
+
/**
|
|
113
|
+
* Create an interval.
|
|
114
|
+
*
|
|
115
|
+
* @param args
|
|
116
|
+
*/
|
|
117
|
+
interval(args: IntervalDescriptorOptions): Interval;
|
|
118
|
+
/**
|
|
119
|
+
* Run a function with a deadline.
|
|
120
|
+
*/
|
|
121
|
+
deadline<T>(fn: (signal: AbortSignal) => Promise<T>, duration: DurationLike): Promise<T>;
|
|
122
|
+
/**
|
|
123
|
+
* Add time to the current date.
|
|
124
|
+
*/
|
|
125
|
+
travel(duration: DurationLike, unit?: ManipulateType): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Stop the time.
|
|
128
|
+
*/
|
|
129
|
+
pause(): dayjs.Dayjs;
|
|
130
|
+
/**
|
|
131
|
+
* Reset the reference date.
|
|
132
|
+
*/
|
|
133
|
+
reset(): void;
|
|
131
134
|
}
|
|
132
|
-
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/descriptors/$interval.d.ts
|
|
133
137
|
interface IntervalDescriptorOptions {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Whether to start the interval immediately.
|
|
140
|
+
*
|
|
141
|
+
* @default false
|
|
142
|
+
*/
|
|
143
|
+
run?: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Whether to attach the interval to the context.
|
|
146
|
+
*
|
|
147
|
+
* Attached intervals are automatically started when the context starts and stopped when the context stops.
|
|
148
|
+
*
|
|
149
|
+
* @default true
|
|
150
|
+
*/
|
|
151
|
+
attach?: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* The interval handler.
|
|
154
|
+
*/
|
|
155
|
+
handler: () => Async<void>;
|
|
156
|
+
/**
|
|
157
|
+
* The interval duration.
|
|
158
|
+
*/
|
|
159
|
+
duration: DurationLike;
|
|
156
160
|
}
|
|
157
161
|
/**
|
|
158
162
|
* Registers a new interval.
|
|
159
163
|
*/
|
|
160
164
|
declare const $interval: (options: IntervalDescriptorOptions) => Interval;
|
|
161
|
-
|
|
162
|
-
export { $interval,
|
|
165
|
+
//#endregion
|
|
166
|
+
export { $interval, DateTime, DateTimeProvider, Duration, DurationLike, Interval, IntervalDescriptorOptions, Timeout };
|
|
167
|
+
//# sourceMappingURL=index.d.ts.map
|
package/datetime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from '@alepha/datetime'
|
|
1
|
+
export * from '@alepha/datetime'
|
package/lock/redis.cjs
CHANGED
|
@@ -1,50 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
log = core.$logger();
|
|
10
|
-
redisProvider = core.$inject(redis.RedisProvider);
|
|
11
|
-
async set(key, value, nx, px) {
|
|
12
|
-
const options = {
|
|
13
|
-
GET: true
|
|
14
|
-
// all the secrets of $lock is based on this
|
|
15
|
-
};
|
|
16
|
-
if (px) {
|
|
17
|
-
options.expiration = {
|
|
18
|
-
type: "PX",
|
|
19
|
-
value: px
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
if (nx) {
|
|
23
|
-
options.condition = "NX";
|
|
24
|
-
}
|
|
25
|
-
const resp = await this.redisProvider.set(key, value, options);
|
|
26
|
-
if (resp === null) {
|
|
27
|
-
this.log.debug(`Lock already exists`, { key, value });
|
|
28
|
-
return value;
|
|
29
|
-
}
|
|
30
|
-
return resp.toString("utf-8");
|
|
31
|
-
}
|
|
32
|
-
async del(...keys) {
|
|
33
|
-
await this.redisProvider.del(keys);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
class AlephaLockRedis {
|
|
37
|
-
name = "alepha.lock.redis";
|
|
38
|
-
$services = (alepha) => alepha.with({
|
|
39
|
-
provide: lock.LockTopicProvider,
|
|
40
|
-
use: topicRedis.RedisTopicProvider,
|
|
41
|
-
optional: true
|
|
42
|
-
}).with({
|
|
43
|
-
provide: lock.LockProvider,
|
|
44
|
-
use: RedisLockProvider,
|
|
45
|
-
optional: true
|
|
46
|
-
}).with(lock.AlephaLock);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
exports.AlephaLockRedis = AlephaLockRedis;
|
|
50
|
-
exports.RedisLockProvider = RedisLockProvider;
|
|
2
|
+
var m = require('@alepha/lock-redis');
|
|
3
|
+
Object.keys(m).forEach(function (k) {
|
|
4
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
5
|
+
enumerable: true,
|
|
6
|
+
get: function () { return m[k]; }
|
|
7
|
+
});
|
|
8
|
+
});
|
package/lock/redis.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import { RedisProvider } from
|
|
1
|
+
import { LockProvider } from "@alepha/lock";
|
|
2
|
+
import * as _alepha_core0 from "@alepha/core";
|
|
3
|
+
import { Alepha } from "@alepha/core";
|
|
4
|
+
import { RedisProvider } from "@alepha/redis";
|
|
5
5
|
|
|
6
|
+
//#region src/providers/RedisLockProvider.d.ts
|
|
6
7
|
declare class RedisLockProvider implements LockProvider {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
protected readonly log: _alepha_core0.Logger;
|
|
9
|
+
protected readonly redisProvider: RedisProvider;
|
|
10
|
+
set(key: string, value: string, nx?: boolean, px?: number): Promise<string>;
|
|
11
|
+
del(...keys: string[]): Promise<void>;
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/index.d.ts
|
|
13
15
|
/**
|
|
14
16
|
* Alepha Lock Redis Module
|
|
15
17
|
*
|
|
@@ -19,8 +21,9 @@ declare class RedisLockProvider implements LockProvider {
|
|
|
19
21
|
* @module alepha.lock.redis
|
|
20
22
|
*/
|
|
21
23
|
declare class AlephaLockRedis {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
readonly name = "alepha.lock.redis";
|
|
25
|
+
readonly $services: (alepha: Alepha) => Alepha;
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
//#endregion
|
|
26
28
|
export { AlephaLockRedis, RedisLockProvider };
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
package/lock/redis.js
CHANGED
|
@@ -1,47 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { RedisTopicProvider } from '@alepha/topic-redis';
|
|
3
|
-
import { $logger, $inject } from '@alepha/core';
|
|
4
|
-
import { RedisProvider } from '@alepha/redis';
|
|
5
|
-
|
|
6
|
-
class RedisLockProvider {
|
|
7
|
-
log = $logger();
|
|
8
|
-
redisProvider = $inject(RedisProvider);
|
|
9
|
-
async set(key, value, nx, px) {
|
|
10
|
-
const options = {
|
|
11
|
-
GET: true
|
|
12
|
-
// all the secrets of $lock is based on this
|
|
13
|
-
};
|
|
14
|
-
if (px) {
|
|
15
|
-
options.expiration = {
|
|
16
|
-
type: "PX",
|
|
17
|
-
value: px
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
if (nx) {
|
|
21
|
-
options.condition = "NX";
|
|
22
|
-
}
|
|
23
|
-
const resp = await this.redisProvider.set(key, value, options);
|
|
24
|
-
if (resp === null) {
|
|
25
|
-
this.log.debug(`Lock already exists`, { key, value });
|
|
26
|
-
return value;
|
|
27
|
-
}
|
|
28
|
-
return resp.toString("utf-8");
|
|
29
|
-
}
|
|
30
|
-
async del(...keys) {
|
|
31
|
-
await this.redisProvider.del(keys);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
class AlephaLockRedis {
|
|
35
|
-
name = "alepha.lock.redis";
|
|
36
|
-
$services = (alepha) => alepha.with({
|
|
37
|
-
provide: LockTopicProvider,
|
|
38
|
-
use: RedisTopicProvider,
|
|
39
|
-
optional: true
|
|
40
|
-
}).with({
|
|
41
|
-
provide: LockProvider,
|
|
42
|
-
use: RedisLockProvider,
|
|
43
|
-
optional: true
|
|
44
|
-
}).with(AlephaLock);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export { AlephaLockRedis, RedisLockProvider };
|
|
1
|
+
export * from '@alepha/lock-redis'
|
package/lock.cjs
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.keys(lock).forEach(function (k) {
|
|
2
|
+
var m = require('@alepha/lock');
|
|
3
|
+
Object.keys(m).forEach(function (k) {
|
|
8
4
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
9
5
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
6
|
+
get: function () { return m[k]; }
|
|
11
7
|
});
|
|
12
|
-
});
|
|
8
|
+
});
|