@blazingagents/sdk 0.34.0 → 0.36.0
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/dist/chat-transport.js +4 -1
- package/dist/client.d.ts +18 -2
- package/dist/client.js +16 -15
- package/dist/contracts/entities/agents.d.ts +7 -6
- package/dist/contracts/entities/agents.js +129 -36
- package/dist/contracts/entities/chat-connections.d.ts +9 -8
- package/dist/contracts/entities/chat-connections.js +70 -40
- package/dist/contracts/entities/chat.d.ts +8 -4
- package/dist/contracts/entities/chat.js +102 -28
- package/dist/contracts/entities/mcp-connections.d.ts +2 -0
- package/dist/contracts/entities/mcp-connections.js +36 -23
- package/dist/contracts/entities/memories.d.ts +1 -0
- package/dist/contracts/entities/memories.js +5 -3
- package/dist/contracts/entities/merchant.js +28 -9
- package/dist/contracts/entities/prompts.d.ts +2 -2
- package/dist/contracts/entities/prompts.js +42 -15
- package/dist/contracts/entities/providers.js +14 -6
- package/dist/contracts/entities/sessions.d.ts +10 -4
- package/dist/contracts/entities/sessions.js +5 -4
- package/dist/contracts/entities/skills.js +6 -3
- package/dist/contracts/entities/tasks.d.ts +4 -7
- package/dist/contracts/entities/tasks.js +45 -15
- package/dist/contracts/entities/tenants.d.ts +2 -28
- package/dist/contracts/entities/tenants.js +15 -22
- package/dist/contracts/entities/usage.d.ts +1 -1
- package/dist/contracts/entities/usage.js +16 -6
- package/dist/contracts/entities/workspaces.d.ts +1 -1
- package/dist/contracts/entities/workspaces.js +26 -10
- package/dist/contracts/index.d.ts +18 -13
- package/dist/contracts/index.js +12 -12
- package/dist/contracts/limitations.d.ts +2 -4
- package/dist/contracts/limitations.js +2 -4
- package/dist/direct-chat-transport.js +2 -1
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +21 -0
- package/dist/http.d.ts +3 -1
- package/dist/http.js +74 -2
- package/dist/index.d.ts +18 -1
- package/dist/resources/agents.d.ts +120 -1
- package/dist/resources/agents.js +1 -33
- package/dist/resources/artifacts.d.ts +42 -1
- package/dist/resources/artifacts.js +0 -12
- package/dist/resources/chat-connections.d.ts +110 -1
- package/dist/resources/chat-connections.js +31 -44
- package/dist/resources/chat-deliveries.d.ts +23 -1
- package/dist/resources/chat-deliveries.js +2 -4
- package/dist/resources/mcp-connections.d.ts +63 -1
- package/dist/resources/mcp-connections.js +10 -24
- package/dist/resources/memories.d.ts +58 -1
- package/dist/resources/memories.js +0 -15
- package/dist/resources/merchant-bindings.d.ts +39 -1
- package/dist/resources/merchant-bindings.js +0 -9
- package/dist/resources/merchant-connection.d.ts +37 -1
- package/dist/resources/merchant-connection.js +15 -16
- package/dist/resources/merchant-usage-events.d.ts +66 -1
- package/dist/resources/merchant-usage-events.js +0 -18
- package/dist/resources/prompts.d.ts +50 -1
- package/dist/resources/prompts.js +0 -15
- package/dist/resources/providers.d.ts +64 -1
- package/dist/resources/providers.js +7 -25
- package/dist/resources/sessions.d.ts +124 -1
- package/dist/resources/sessions.js +5 -36
- package/dist/resources/skills.d.ts +95 -1
- package/dist/resources/skills.js +0 -27
- package/dist/resources/tasks.d.ts +107 -1
- package/dist/resources/tasks.js +0 -30
- package/dist/resources/tenant.d.ts +23 -1
- package/dist/resources/tenant.js +2 -10
- package/dist/resources/usage.d.ts +34 -1
- package/dist/resources/usage.js +2 -15
- package/dist/resources/workspaces.d.ts +50 -1
- package/dist/resources/workspaces.js +0 -15
- package/dist/types.d.ts +17 -1083
- package/package.json +1 -2
package/dist/resources/tasks.js
CHANGED
|
@@ -9,9 +9,6 @@ import { apiPath, requestJson } from "../http.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function createTasksResource(config) {
|
|
11
11
|
return {
|
|
12
|
-
/**
|
|
13
|
-
* Creates tasks.
|
|
14
|
-
*/
|
|
15
12
|
async create({ abortSignal, ...body }) {
|
|
16
13
|
return await requestJson(config, "/v1/tasks", {
|
|
17
14
|
json: body,
|
|
@@ -19,9 +16,6 @@ export function createTasksResource(config) {
|
|
|
19
16
|
method: "POST",
|
|
20
17
|
}, createTaskResponseSchema);
|
|
21
18
|
},
|
|
22
|
-
/**
|
|
23
|
-
* Lists one page of tasks.
|
|
24
|
-
*/
|
|
25
19
|
async list(options = {}) {
|
|
26
20
|
return await requestJson(config, "/v1/tasks", {
|
|
27
21
|
signal: options.abortSignal,
|
|
@@ -33,15 +27,9 @@ export function createTasksResource(config) {
|
|
|
33
27
|
},
|
|
34
28
|
}, tasksListResponseSchema);
|
|
35
29
|
},
|
|
36
|
-
/**
|
|
37
|
-
* Retrieves tasks.
|
|
38
|
-
*/
|
|
39
30
|
async get({ taskId, abortSignal }) {
|
|
40
31
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}`, { signal: abortSignal }, taskResponseSchema);
|
|
41
32
|
},
|
|
42
|
-
/**
|
|
43
|
-
* Updates tasks.
|
|
44
|
-
*/
|
|
45
33
|
async update({ taskId, abortSignal, ...body }) {
|
|
46
34
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}`, {
|
|
47
35
|
json: body,
|
|
@@ -49,39 +37,24 @@ export function createTasksResource(config) {
|
|
|
49
37
|
method: "PATCH",
|
|
50
38
|
}, taskResponseSchema);
|
|
51
39
|
},
|
|
52
|
-
/**
|
|
53
|
-
* Deletes tasks.
|
|
54
|
-
*/
|
|
55
40
|
async delete({ taskId, abortSignal }) {
|
|
56
41
|
await requestJson(config, apiPath `/v1/tasks/${taskId}`, {
|
|
57
42
|
method: "DELETE",
|
|
58
43
|
signal: abortSignal,
|
|
59
44
|
});
|
|
60
45
|
},
|
|
61
|
-
/**
|
|
62
|
-
* Creates a Task run.
|
|
63
|
-
*/
|
|
64
46
|
async createRun({ taskId, abortSignal, ...body }) {
|
|
65
47
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}/runs`, { json: body, method: "POST", signal: abortSignal }, createTaskRunResponseSchema);
|
|
66
48
|
},
|
|
67
|
-
/**
|
|
68
|
-
* Lists one page of Task runs.
|
|
69
|
-
*/
|
|
70
49
|
async listRuns({ taskId, ...options }) {
|
|
71
50
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}/runs`, {
|
|
72
51
|
signal: options.abortSignal,
|
|
73
52
|
query: { cursor: options.cursor, limit: options.limit },
|
|
74
53
|
}, taskRunsListResponseSchema);
|
|
75
54
|
},
|
|
76
|
-
/**
|
|
77
|
-
* Retrieves a Task run.
|
|
78
|
-
*/
|
|
79
55
|
async getRun({ taskId, runId, abortSignal }) {
|
|
80
56
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}/runs/${runId}`, { signal: abortSignal }, taskRunResponseSchema);
|
|
81
57
|
},
|
|
82
|
-
/**
|
|
83
|
-
* Lists one page of Task run messages.
|
|
84
|
-
*/
|
|
85
58
|
async runMessages({ taskId, runId, ...options }) {
|
|
86
59
|
return await requestJson(config, apiPath `/v1/tasks/${taskId}/runs/${runId}/messages`, {
|
|
87
60
|
signal: options.abortSignal,
|
|
@@ -92,9 +65,6 @@ export function createTasksResource(config) {
|
|
|
92
65
|
},
|
|
93
66
|
}, taskRunMessagesResponseSchema);
|
|
94
67
|
},
|
|
95
|
-
/**
|
|
96
|
-
* Requests cancellation of a Task run.
|
|
97
|
-
*/
|
|
98
68
|
async cancelRun({ taskId, runId, abortSignal }) {
|
|
99
69
|
await requestJson(config, apiPath `/v1/tasks/${taskId}/runs/${runId}/cancel`, { method: "POST", signal: abortSignal });
|
|
100
70
|
},
|
|
@@ -1,4 +1,26 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SpendingLimitResponse, type UpdateSpendingLimitBody } from "../contracts/entities/spending-limits.ts";
|
|
2
|
+
import { type TenantSettingsResponse, type UpdateTenantSettingsBody } from "../contracts/entities/tenants.ts";
|
|
3
|
+
import type { HttpConfig, ResourceRequestOptions } from "../types.ts";
|
|
4
|
+
export interface TenantResource {
|
|
5
|
+
/**
|
|
6
|
+
* Retrieves Tenant settings.
|
|
7
|
+
* @param input - optional abortSignal.
|
|
8
|
+
* @returns The tenant settings response.
|
|
9
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
10
|
+
*/
|
|
11
|
+
get(input?: ResourceRequestOptions): Promise<TenantSettingsResponse>;
|
|
12
|
+
/** Retrieves the tenant model spending limit. Requires tenant authority. */
|
|
13
|
+
getSpendingLimit(input?: ResourceRequestOptions): Promise<SpendingLimitResponse>;
|
|
14
|
+
/**
|
|
15
|
+
* Updates Tenant settings.
|
|
16
|
+
* @param input - fields to change; optional abortSignal.
|
|
17
|
+
* @returns The tenant settings response.
|
|
18
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
19
|
+
*/
|
|
20
|
+
patch(input: UpdateTenantSettingsBody & ResourceRequestOptions): Promise<TenantSettingsResponse>;
|
|
21
|
+
/** Sets the tenant model spending limit. Pass null to disable it. Requires tenant authority. */
|
|
22
|
+
updateSpendingLimit(input: UpdateSpendingLimitBody & ResourceRequestOptions): Promise<SpendingLimitResponse>;
|
|
23
|
+
}
|
|
2
24
|
/**
|
|
3
25
|
* `client.tenant` — get/patch over `/v1/tenant` (the tenant's self-set
|
|
4
26
|
* quota row). `quota: null` means unlimited (no row).
|
package/dist/resources/tenant.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { spendingLimitResponseSchema } from "../contracts/entities/spending-limits.js";
|
|
2
|
-
import { tenantSettingsResponseSchema } from "../contracts/entities/tenants.js";
|
|
1
|
+
import { spendingLimitResponseSchema, } from "../contracts/entities/spending-limits.js";
|
|
2
|
+
import { tenantSettingsResponseSchema, } from "../contracts/entities/tenants.js";
|
|
3
3
|
import { requestJson } from "../http.js";
|
|
4
4
|
/**
|
|
5
5
|
* `client.tenant` — get/patch over `/v1/tenant` (the tenant's self-set
|
|
@@ -9,23 +9,15 @@ import { requestJson } from "../http.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function createTenantResource(config) {
|
|
11
11
|
return {
|
|
12
|
-
/** Retrieves the model spending limit using tenant authority. */
|
|
13
12
|
async getSpendingLimit({ abortSignal } = {}) {
|
|
14
13
|
return await requestJson(config, "/v1/tenant/spending-limit", { signal: abortSignal }, spendingLimitResponseSchema);
|
|
15
14
|
},
|
|
16
|
-
/** Sets the model spending limit. Null disables it. Requires tenant authority. */
|
|
17
15
|
async updateSpendingLimit({ abortSignal, ...body }) {
|
|
18
16
|
return await requestJson(config, "/v1/tenant/spending-limit", { method: "PUT", json: body, signal: abortSignal }, spendingLimitResponseSchema);
|
|
19
17
|
},
|
|
20
|
-
/**
|
|
21
|
-
* Retrieves tenant.
|
|
22
|
-
*/
|
|
23
18
|
async get({ abortSignal } = {}) {
|
|
24
19
|
return await requestJson(config, "/v1/tenant", { signal: abortSignal }, tenantSettingsResponseSchema);
|
|
25
20
|
},
|
|
26
|
-
/**
|
|
27
|
-
* Updates tenant.
|
|
28
|
-
*/
|
|
29
21
|
async patch({ abortSignal, ...body }) {
|
|
30
22
|
return await requestJson(config, "/v1/tenant", {
|
|
31
23
|
json: body,
|
|
@@ -1,4 +1,37 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SessionUsageQuery, type SessionUsageResponse, type UsageOverviewQuery, type UsageOverviewResponse, type UsageQuery, type UsageResponse } from "../contracts/entities/usage.ts";
|
|
2
|
+
import type { HttpConfig, ResourceRequestOptions } from "../types.ts";
|
|
3
|
+
export interface UsageResource {
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves usage totals.
|
|
6
|
+
* @param input - query filters; optional abortSignal.
|
|
7
|
+
* @returns The usage response.
|
|
8
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
9
|
+
*/
|
|
10
|
+
get(input?: Partial<UsageQuery> & ResourceRequestOptions): Promise<UsageResponse>;
|
|
11
|
+
/**
|
|
12
|
+
* Retrieves usage for one Agent.
|
|
13
|
+
* @param input - `agentId`; query filters; optional abortSignal.
|
|
14
|
+
* @returns The usage response.
|
|
15
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
16
|
+
*/
|
|
17
|
+
getForAgent(input: Partial<UsageQuery> & {
|
|
18
|
+
agentId: string;
|
|
19
|
+
} & ResourceRequestOptions): Promise<UsageResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* Returns totals, daily usage, and bounded Agent, user, and model rankings.
|
|
22
|
+
* @param input - query filters; optional abortSignal.
|
|
23
|
+
* @returns The usage overview response.
|
|
24
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
25
|
+
*/
|
|
26
|
+
overview(input?: Partial<UsageOverviewQuery> & ResourceRequestOptions): Promise<UsageOverviewResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves usage grouped by Session.
|
|
29
|
+
* @param input - query filters; optional abortSignal.
|
|
30
|
+
* @returns The session usage response.
|
|
31
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
32
|
+
*/
|
|
33
|
+
sessions(input: SessionUsageQuery & ResourceRequestOptions): Promise<SessionUsageResponse>;
|
|
34
|
+
}
|
|
2
35
|
/**
|
|
3
36
|
* `client.usage` — get over `/v1/usage` (tenant-wide) and
|
|
4
37
|
* `/v1/agents/:agentId/usage` (per-agent). The query shape is `UsageQuery`;
|
package/dist/resources/usage.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sessionUsageResponseSchema, usageOverviewResponseSchemaForQuery, usageResponseSchema, } from "../contracts/entities/usage.js";
|
|
2
2
|
import { apiPath, requestJson } from "../http.js";
|
|
3
3
|
/**
|
|
4
4
|
* `client.usage` — get over `/v1/usage` (tenant-wide) and
|
|
@@ -9,35 +9,22 @@ import { apiPath, requestJson } from "../http.js";
|
|
|
9
9
|
*/
|
|
10
10
|
export function createUsageResource(config) {
|
|
11
11
|
return {
|
|
12
|
-
|
|
13
|
-
* Retrieves usage grouped by Session.
|
|
14
|
-
*/
|
|
15
|
-
async sessions({ abortSignal, ...input }) {
|
|
16
|
-
const body = sessionUsageQuerySchema.parse(input);
|
|
12
|
+
async sessions({ abortSignal, ...body }) {
|
|
17
13
|
return await requestJson(config, "/v1/usage/sessions", {
|
|
18
14
|
method: "POST",
|
|
19
15
|
json: body,
|
|
20
16
|
signal: abortSignal,
|
|
21
17
|
}, sessionUsageResponseSchema);
|
|
22
18
|
},
|
|
23
|
-
/**
|
|
24
|
-
* Retrieves usage.
|
|
25
|
-
*/
|
|
26
19
|
async get({ abortSignal, ...query } = {}) {
|
|
27
20
|
return await requestJson(config, "/v1/usage", {
|
|
28
21
|
query,
|
|
29
22
|
signal: abortSignal,
|
|
30
23
|
}, usageResponseSchema);
|
|
31
24
|
},
|
|
32
|
-
/**
|
|
33
|
-
* Retrieves usage for one Agent.
|
|
34
|
-
*/
|
|
35
25
|
async getForAgent({ agentId, abortSignal, ...query }) {
|
|
36
26
|
return await requestJson(config, apiPath `/v1/agents/${agentId}/usage`, { query, signal: abortSignal }, usageResponseSchema);
|
|
37
27
|
},
|
|
38
|
-
/**
|
|
39
|
-
* Retrieves usage totals, daily usage, and bounded rankings.
|
|
40
|
-
*/
|
|
41
28
|
async overview({ abortSignal, ...query } = {}) {
|
|
42
29
|
return await requestJson(config, "/v1/usage/overview", { query, signal: abortSignal }, usageOverviewResponseSchemaForQuery(query));
|
|
43
30
|
},
|
|
@@ -1,4 +1,53 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CreateWorkspaceBody, type UpdateWorkspaceBody, type Workspace, type WorkspacesListResponse } from "../contracts/entities/workspaces.ts";
|
|
2
|
+
import type { HttpConfig, ResourceRequestOptions } from "../types.ts";
|
|
3
|
+
export interface WorkspacesResource {
|
|
4
|
+
/**
|
|
5
|
+
* Creates the Workspace.
|
|
6
|
+
* @param input - creation fields; optional abortSignal.
|
|
7
|
+
* @returns The workspace.
|
|
8
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
9
|
+
*/
|
|
10
|
+
create(input?: CreateWorkspaceBody & ResourceRequestOptions): Promise<Workspace>;
|
|
11
|
+
/**
|
|
12
|
+
* Deletes the Workspace.
|
|
13
|
+
* @param input - `workspaceId`; optional abortSignal.
|
|
14
|
+
* @returns "pending" while deletion is underway, otherwise "completed".
|
|
15
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
16
|
+
*/
|
|
17
|
+
delete(input: {
|
|
18
|
+
workspaceId: string;
|
|
19
|
+
} & ResourceRequestOptions): Promise<"completed" | "pending">;
|
|
20
|
+
/**
|
|
21
|
+
* Retrieves the Workspace.
|
|
22
|
+
* @param input - `workspaceId`; optional abortSignal.
|
|
23
|
+
* @returns The workspace.
|
|
24
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
25
|
+
*/
|
|
26
|
+
get(input: {
|
|
27
|
+
workspaceId: string;
|
|
28
|
+
} & ResourceRequestOptions): Promise<Workspace>;
|
|
29
|
+
/**
|
|
30
|
+
* Lists one page of Workspace records.
|
|
31
|
+
* @param input - filters and pagination options.
|
|
32
|
+
* @returns The workspaces list response.
|
|
33
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
34
|
+
*/
|
|
35
|
+
list(input?: WorkspacesListOptions): Promise<WorkspacesListResponse>;
|
|
36
|
+
/**
|
|
37
|
+
* Updates the Workspace.
|
|
38
|
+
* @param input - `workspaceId`; fields to change; optional abortSignal.
|
|
39
|
+
* @returns The workspace.
|
|
40
|
+
* @throws BlazingAgentsError - If the request fails, is aborted, or returns an invalid response.
|
|
41
|
+
*/
|
|
42
|
+
update(input: UpdateWorkspaceBody & {
|
|
43
|
+
workspaceId: string;
|
|
44
|
+
} & ResourceRequestOptions): Promise<Workspace>;
|
|
45
|
+
}
|
|
46
|
+
export interface WorkspacesListOptions extends ResourceRequestOptions {
|
|
47
|
+
cursor?: string;
|
|
48
|
+
limit?: number;
|
|
49
|
+
userId?: string;
|
|
50
|
+
}
|
|
2
51
|
/**
|
|
3
52
|
* Builds the Workspaces operations using the shared HTTP configuration.
|
|
4
53
|
* @param config - Shared authentication and transport configuration.
|
|
@@ -7,9 +7,6 @@ import { apiPath, requestJson, requestStream } from "../http.js";
|
|
|
7
7
|
*/
|
|
8
8
|
export function createWorkspacesResource(config) {
|
|
9
9
|
return {
|
|
10
|
-
/**
|
|
11
|
-
* Creates workspaces.
|
|
12
|
-
*/
|
|
13
10
|
async create({ abortSignal, ...body } = {}) {
|
|
14
11
|
return await requestJson(config, "/v1/workspaces", {
|
|
15
12
|
json: body,
|
|
@@ -17,22 +14,13 @@ export function createWorkspacesResource(config) {
|
|
|
17
14
|
method: "POST",
|
|
18
15
|
}, workspaceSchema);
|
|
19
16
|
},
|
|
20
|
-
/**
|
|
21
|
-
* Deletes workspaces.
|
|
22
|
-
*/
|
|
23
17
|
async delete({ workspaceId, abortSignal }) {
|
|
24
18
|
const response = await requestStream(config, apiPath `/v1/workspaces/${workspaceId}`, { method: "DELETE", signal: abortSignal });
|
|
25
19
|
return response.status === 202 ? "pending" : "completed";
|
|
26
20
|
},
|
|
27
|
-
/**
|
|
28
|
-
* Retrieves workspaces.
|
|
29
|
-
*/
|
|
30
21
|
async get({ workspaceId, abortSignal }) {
|
|
31
22
|
return await requestJson(config, apiPath `/v1/workspaces/${workspaceId}`, { signal: abortSignal }, workspaceSchema);
|
|
32
23
|
},
|
|
33
|
-
/**
|
|
34
|
-
* Lists one page of workspaces.
|
|
35
|
-
*/
|
|
36
24
|
async list({ abortSignal, ...options } = {}) {
|
|
37
25
|
return await requestJson(config, "/v1/workspaces", {
|
|
38
26
|
signal: abortSignal,
|
|
@@ -43,9 +31,6 @@ export function createWorkspacesResource(config) {
|
|
|
43
31
|
},
|
|
44
32
|
}, workspacesListResponseSchema);
|
|
45
33
|
},
|
|
46
|
-
/**
|
|
47
|
-
* Updates workspaces.
|
|
48
|
-
*/
|
|
49
34
|
async update({ workspaceId, abortSignal, ...body }) {
|
|
50
35
|
return await requestJson(config, apiPath `/v1/workspaces/${workspaceId}`, { json: body, signal: abortSignal, method: "PUT" }, workspaceSchema);
|
|
51
36
|
},
|