@salesforce/platform-sdk 11.7.0 → 11.8.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/analytics/index.js +1 -1
- package/dist/analytics/method-configs.d.ts +4 -2
- package/dist/analytics/method-configs.d.ts.map +1 -1
- package/dist/analytics/proxy.d.ts +5 -1
- package/dist/analytics/proxy.d.ts.map +1 -1
- package/dist/analytics-CIbrgyL8.js +159 -0
- package/dist/data/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/dist/analytics-CY_NdbkB.js +0 -157
package/dist/analytics/index.js
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
export interface MethodConfig {
|
|
7
7
|
/** Whether this method returns a Promise and should use activityAsync */
|
|
8
8
|
isAsync: boolean;
|
|
9
|
-
/** Extract dimensional tags from the method arguments
|
|
10
|
-
|
|
9
|
+
/** Extract per-call dimensional tags from the method arguments. Static tags
|
|
10
|
+
* (surface, PFT ids) are merged in by the proxy from its getStaticTags
|
|
11
|
+
* provider, so extractTags should return only method-specific keys. */
|
|
12
|
+
extractTags: (args: unknown[]) => Record<string, string>;
|
|
11
13
|
}
|
|
12
14
|
export declare const methodConfigs: Record<string, MethodConfig>;
|
|
13
15
|
//# sourceMappingURL=method-configs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method-configs.d.ts","sourceRoot":"","sources":["../../src/analytics/method-configs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB
|
|
1
|
+
{"version":3,"file":"method-configs.d.ts","sourceRoot":"","sources":["../../src/analytics/method-configs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB;;2EAEuE;IACvE,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzD;AAMD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAoCtD,CAAC"}
|
|
@@ -8,6 +8,10 @@ import { Instrumentation } from './types';
|
|
|
8
8
|
* round-trip timing. incrementCounter() records call counts and error rates.
|
|
9
9
|
* - Sync methods use incrementCounter() only.
|
|
10
10
|
* - Unconfigured methods pass through unchanged.
|
|
11
|
+
*
|
|
12
|
+
* getStaticTags is re-read on every invocation and merged into the counter
|
|
13
|
+
* tag map so late-bound values (PFT ids, internal-session gate) reach the
|
|
14
|
+
* metric channel without proxy re-creation (W-23257158).
|
|
11
15
|
*/
|
|
12
|
-
export declare function createInstrumentedProxy(sdk: ChatSDK, instrumentation: Instrumentation,
|
|
16
|
+
export declare function createInstrumentedProxy(sdk: ChatSDK, instrumentation: Instrumentation, getStaticTags: () => Record<string, string>): ChatSDK;
|
|
13
17
|
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/analytics/proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/analytics/proxy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,OAAO,EACZ,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,OAAO,CAkCT"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { registerInstrumentedApp as h } from "o11y/client";
|
|
2
|
+
import { g as T, S as x } from "./surface-Dd2tqrPi.js";
|
|
3
|
+
import { w as v } from "./sdk-promise-D0sy7OW1.js";
|
|
4
|
+
import { getChatSDK as _ } from "./chat/index.js";
|
|
5
|
+
import { r as C } from "./TelemetryUploader-DKkdppe9.js";
|
|
6
|
+
import { analyticsContextSchema as k, sessionSchema as F, pageViewSchema as L, errorContextSchema as N, interactionSchema as D, customEventSchema as J } from "o11y_schema/sf_mcpanalytics";
|
|
7
|
+
function K(e) {
|
|
8
|
+
const n = (r, f, p, o, u) => {
|
|
9
|
+
e.error(u ?? r);
|
|
10
|
+
}, a = (r) => {
|
|
11
|
+
e.error(r.reason);
|
|
12
|
+
};
|
|
13
|
+
return window.addEventListener("error", n), window.addEventListener("unhandledrejection", a), () => {
|
|
14
|
+
window.removeEventListener("error", n), window.removeEventListener("unhandledrejection", a);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const O = "aJC", W = "sfdc.pftId", X = "sfdc.internalSession", M = "aJCEE000000FgYP4A0", I = /* @__PURE__ */ new Set(), R = /^aJC[0-9A-Za-z]{12}(?:[0-9A-Za-z]{3})?$/;
|
|
18
|
+
function S(e) {
|
|
19
|
+
return typeof e != "string" || e.length === 0 ? !1 : e.length !== 15 && e.length !== 18 ? (A(e, "Expected a 15- or 18-character Salesforce ID"), !1) : R.test(e) ? !0 : (A(e, `Expected a Product Feature Id (prefix "${O}", base62).`), !1);
|
|
20
|
+
}
|
|
21
|
+
function A(e, n) {
|
|
22
|
+
I.has(e) || (I.add(e), console.debug(`[platform-sdk:analytics] Ignoring invalid PFT Id "${e}". ${n}`));
|
|
23
|
+
}
|
|
24
|
+
function g(e) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const $ = {
|
|
28
|
+
callTool: {
|
|
29
|
+
isAsync: !0,
|
|
30
|
+
extractTags: (e) => ({ toolName: e[0]?.toolName ?? "unknown" })
|
|
31
|
+
},
|
|
32
|
+
setWidgetState: {
|
|
33
|
+
isAsync: !1,
|
|
34
|
+
extractTags: g
|
|
35
|
+
},
|
|
36
|
+
sendMessageToHost: {
|
|
37
|
+
isAsync: !0,
|
|
38
|
+
extractTags: g
|
|
39
|
+
},
|
|
40
|
+
openLink: {
|
|
41
|
+
isAsync: !0,
|
|
42
|
+
extractTags: g
|
|
43
|
+
},
|
|
44
|
+
readResource: {
|
|
45
|
+
isAsync: !0,
|
|
46
|
+
extractTags: (e) => {
|
|
47
|
+
const a = e[0]?.uri ?? "", r = a.indexOf("://");
|
|
48
|
+
return { scheme: r > 0 ? a.slice(0, r).toLowerCase() : "unknown" };
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
setDisplayMode: {
|
|
52
|
+
isAsync: !0,
|
|
53
|
+
extractTags: (e) => ({ mode: e[0] ?? "unknown" })
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
function V(e, n, a) {
|
|
57
|
+
return new Proxy(e, {
|
|
58
|
+
get(r, f, p) {
|
|
59
|
+
const o = Reflect.get(r, f, p), u = $[f];
|
|
60
|
+
return !u || typeof o != "function" ? o : (...d) => {
|
|
61
|
+
const m = { ...a(), ...u.extractTags(d) }, c = `sdk.${String(f)}`;
|
|
62
|
+
return u.isAsync ? n.activityAsync(c, async () => {
|
|
63
|
+
try {
|
|
64
|
+
const s = await o.apply(r, d);
|
|
65
|
+
return n.incrementCounter(c, 1, !1, m), s;
|
|
66
|
+
} catch (s) {
|
|
67
|
+
throw n.incrementCounter(c, 1, !0, m), s;
|
|
68
|
+
}
|
|
69
|
+
}) : (n.incrementCounter(c, 1, !1, m), o.apply(r, d));
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function Z(e) {
|
|
75
|
+
return v(Y(e), "createAnalytics");
|
|
76
|
+
}
|
|
77
|
+
async function Y(e) {
|
|
78
|
+
const { appId: n, clientSessionId: a } = e;
|
|
79
|
+
let r;
|
|
80
|
+
try {
|
|
81
|
+
r = await T();
|
|
82
|
+
} catch {
|
|
83
|
+
r = x.WebApp;
|
|
84
|
+
}
|
|
85
|
+
const f = Date.now(), p = e.sdk ?? await _();
|
|
86
|
+
let o = null;
|
|
87
|
+
e.pftId !== void 0 && S(e.pftId) && (o = e.pftId);
|
|
88
|
+
const u = e.enforceInternalGate === !0;
|
|
89
|
+
let d = !1;
|
|
90
|
+
const m = () => !u || d ? {
|
|
91
|
+
axlPftId: M,
|
|
92
|
+
...o !== null ? { pftId: o } : {}
|
|
93
|
+
} : {}, c = h("mcp-widget", {
|
|
94
|
+
appPayloadProvider: {
|
|
95
|
+
getPayload: () => ({
|
|
96
|
+
schema: k,
|
|
97
|
+
payload: {
|
|
98
|
+
appId: n,
|
|
99
|
+
surface: r,
|
|
100
|
+
...m()
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
},
|
|
104
|
+
clientSessionId: a
|
|
105
|
+
}), s = c, E = V(p, s, () => ({
|
|
106
|
+
surface: r,
|
|
107
|
+
...m()
|
|
108
|
+
})), P = K(s);
|
|
109
|
+
let y;
|
|
110
|
+
e.transport && (y = C(c, {
|
|
111
|
+
onEnvelope: (t) => {
|
|
112
|
+
e.transport.enqueue(t);
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
let w, i = !1;
|
|
116
|
+
return {
|
|
117
|
+
instrumentedSDK: E,
|
|
118
|
+
app: c,
|
|
119
|
+
trackEvent(t, l) {
|
|
120
|
+
i || s.log(J, {
|
|
121
|
+
eventName: t,
|
|
122
|
+
properties: l ? JSON.stringify(l) : ""
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
trackInteraction(t, l) {
|
|
126
|
+
i || s.log(D, {
|
|
127
|
+
elementId: t,
|
|
128
|
+
properties: l ? JSON.stringify(l) : ""
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
trackError(t, l) {
|
|
132
|
+
i || s.error(t, N, {
|
|
133
|
+
properties: l ? JSON.stringify(l) : ""
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
trackPageView(t) {
|
|
137
|
+
i || t !== w && (w = t, s.log(L, { componentRef: t }));
|
|
138
|
+
},
|
|
139
|
+
setPftId(t) {
|
|
140
|
+
i || S(t) && (o = t);
|
|
141
|
+
},
|
|
142
|
+
setInternalSession(t) {
|
|
143
|
+
i || (d = t === !0);
|
|
144
|
+
},
|
|
145
|
+
dispose() {
|
|
146
|
+
if (i) return;
|
|
147
|
+
i = !0, P();
|
|
148
|
+
const t = Date.now() - f;
|
|
149
|
+
s.log(F, { durationMs: t }), y?.dispose();
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
M as A,
|
|
155
|
+
X as I,
|
|
156
|
+
W as P,
|
|
157
|
+
Z as c,
|
|
158
|
+
S as v
|
|
159
|
+
};
|
package/dist/data/index.js
CHANGED
|
@@ -196,7 +196,7 @@ class ie {
|
|
|
196
196
|
})).structuredContent;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
|
-
const ce = "X-SFDC-Client-Name", ue = "X-SFDC-Client-Version", he = "@salesforce/platform-sdk", le = "11.
|
|
199
|
+
const ce = "X-SFDC-Client-Name", ue = "X-SFDC-Client-Version", he = "@salesforce/platform-sdk", le = "11.8.0", de = (t) => {
|
|
200
200
|
let e = y(ce, he, t);
|
|
201
201
|
return e = y(ue, le, e), u(e);
|
|
202
202
|
}, pe = "X-CSRF-Token";
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { createDataSDK as _, gql as h } from "./data/index.js";
|
|
|
7
7
|
import { createLightningSDK as I } from "./lightning/index.js";
|
|
8
8
|
import { c as b } from "./transport-CdXFRgRc.js";
|
|
9
9
|
import { T as N, r as v } from "./TelemetryUploader-DKkdppe9.js";
|
|
10
|
-
import { A as F, I as U, P as Y, c as q, v as z } from "./analytics-
|
|
10
|
+
import { A as F, I as U, P as Y, c as q, v as z } from "./analytics-CIbrgyL8.js";
|
|
11
11
|
export {
|
|
12
12
|
F as AXL_PFT_ID,
|
|
13
13
|
U as INTERNAL_SESSION_META_KEY,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/platform-sdk",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.8.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"@conduit-client/service-pubsub": "3.19.6",
|
|
116
116
|
"@conduit-client/service-retry": "3.19.6",
|
|
117
117
|
"@conduit-client/utils": "3.19.6",
|
|
118
|
-
"@salesforce/jsonrpc": "^11.
|
|
118
|
+
"@salesforce/jsonrpc": "^11.8.0",
|
|
119
119
|
"@salesforce/sf-embedding-bridge": "2.2.4-rc.1"
|
|
120
120
|
},
|
|
121
121
|
"peerDependencies": {
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { registerInstrumentedApp as P } from "o11y/client";
|
|
2
|
-
import { g as h, S as T } from "./surface-Dd2tqrPi.js";
|
|
3
|
-
import { w as x } from "./sdk-promise-D0sy7OW1.js";
|
|
4
|
-
import { getChatSDK as v } from "./chat/index.js";
|
|
5
|
-
import { r as _ } from "./TelemetryUploader-DKkdppe9.js";
|
|
6
|
-
import { analyticsContextSchema as C, sessionSchema as k, pageViewSchema as L, errorContextSchema as N, interactionSchema as D, customEventSchema as F } from "o11y_schema/sf_mcpanalytics";
|
|
7
|
-
function O(e) {
|
|
8
|
-
const r = (n, c, p, a, u) => {
|
|
9
|
-
e.error(u ?? n);
|
|
10
|
-
}, o = (n) => {
|
|
11
|
-
e.error(n.reason);
|
|
12
|
-
};
|
|
13
|
-
return window.addEventListener("error", r), window.addEventListener("unhandledrejection", o), () => {
|
|
14
|
-
window.removeEventListener("error", r), window.removeEventListener("unhandledrejection", o);
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
const J = "aJC", U = "sfdc.pftId", W = "sfdc.internalSession", K = "aJCEE000000FgYP4A0", w = /* @__PURE__ */ new Set(), M = /^aJC[0-9A-Za-z]{12}(?:[0-9A-Za-z]{3})?$/;
|
|
18
|
-
function S(e) {
|
|
19
|
-
return typeof e != "string" || e.length === 0 ? !1 : e.length !== 15 && e.length !== 18 ? (E(e, "Expected a 15- or 18-character Salesforce ID"), !1) : M.test(e) ? !0 : (E(e, `Expected a Product Feature Id (prefix "${J}", base62).`), !1);
|
|
20
|
-
}
|
|
21
|
-
function E(e, r) {
|
|
22
|
-
w.has(e) || (w.add(e), console.debug(`[platform-sdk:analytics] Ignoring invalid PFT Id "${e}". ${r}`));
|
|
23
|
-
}
|
|
24
|
-
function g(e, r) {
|
|
25
|
-
return { surface: r };
|
|
26
|
-
}
|
|
27
|
-
const R = {
|
|
28
|
-
callTool: {
|
|
29
|
-
isAsync: !0,
|
|
30
|
-
extractTags: (e, r) => ({ toolName: e[0]?.toolName ?? "unknown", surface: r })
|
|
31
|
-
},
|
|
32
|
-
setWidgetState: {
|
|
33
|
-
isAsync: !1,
|
|
34
|
-
extractTags: g
|
|
35
|
-
},
|
|
36
|
-
sendMessageToHost: {
|
|
37
|
-
isAsync: !0,
|
|
38
|
-
extractTags: g
|
|
39
|
-
},
|
|
40
|
-
openLink: {
|
|
41
|
-
isAsync: !0,
|
|
42
|
-
extractTags: g
|
|
43
|
-
},
|
|
44
|
-
readResource: {
|
|
45
|
-
isAsync: !0,
|
|
46
|
-
extractTags: (e, r) => {
|
|
47
|
-
const n = e[0]?.uri ?? "", c = n.indexOf("://");
|
|
48
|
-
return { scheme: c > 0 ? n.slice(0, c).toLowerCase() : "unknown", surface: r };
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
setDisplayMode: {
|
|
52
|
-
isAsync: !0,
|
|
53
|
-
extractTags: (e, r) => ({ mode: e[0] ?? "unknown", surface: r })
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
function $(e, r, o) {
|
|
57
|
-
return new Proxy(e, {
|
|
58
|
-
get(n, c, p) {
|
|
59
|
-
const a = Reflect.get(n, c, p), u = R[c];
|
|
60
|
-
return !u || typeof a != "function" ? a : (...d) => {
|
|
61
|
-
const f = u.extractTags(d, o), s = `sdk.${String(c)}`;
|
|
62
|
-
return u.isAsync ? r.activityAsync(s, async () => {
|
|
63
|
-
try {
|
|
64
|
-
const m = await a.apply(n, d);
|
|
65
|
-
return r.incrementCounter(s, 1, !1, f), m;
|
|
66
|
-
} catch (m) {
|
|
67
|
-
throw r.incrementCounter(s, 1, !0, f), m;
|
|
68
|
-
}
|
|
69
|
-
}) : (r.incrementCounter(s, 1, !1, f), a.apply(n, d));
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
function X(e) {
|
|
75
|
-
return x(V(e), "createAnalytics");
|
|
76
|
-
}
|
|
77
|
-
async function V(e) {
|
|
78
|
-
const { appId: r, clientSessionId: o } = e;
|
|
79
|
-
let n;
|
|
80
|
-
try {
|
|
81
|
-
n = await h();
|
|
82
|
-
} catch {
|
|
83
|
-
n = T.WebApp;
|
|
84
|
-
}
|
|
85
|
-
const c = Date.now(), p = e.sdk ?? await v();
|
|
86
|
-
let a = null;
|
|
87
|
-
e.pftId !== void 0 && S(e.pftId) && (a = e.pftId);
|
|
88
|
-
const u = e.enforceInternalGate === !0;
|
|
89
|
-
let d = !1;
|
|
90
|
-
const f = P("mcp-widget", {
|
|
91
|
-
appPayloadProvider: {
|
|
92
|
-
getPayload: () => {
|
|
93
|
-
const t = !u || d;
|
|
94
|
-
return {
|
|
95
|
-
schema: C,
|
|
96
|
-
payload: {
|
|
97
|
-
appId: r,
|
|
98
|
-
surface: n,
|
|
99
|
-
...t ? { axlPftId: K } : {},
|
|
100
|
-
...t && a !== null ? { pftId: a } : {}
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
clientSessionId: o
|
|
106
|
-
}), s = f, m = $(p, s, n), A = O(s);
|
|
107
|
-
let y;
|
|
108
|
-
e.transport && (y = _(f, {
|
|
109
|
-
onEnvelope: (t) => {
|
|
110
|
-
e.transport.enqueue(t);
|
|
111
|
-
}
|
|
112
|
-
}));
|
|
113
|
-
let I, i = !1;
|
|
114
|
-
return {
|
|
115
|
-
instrumentedSDK: m,
|
|
116
|
-
app: f,
|
|
117
|
-
trackEvent(t, l) {
|
|
118
|
-
i || s.log(F, {
|
|
119
|
-
eventName: t,
|
|
120
|
-
properties: l ? JSON.stringify(l) : ""
|
|
121
|
-
});
|
|
122
|
-
},
|
|
123
|
-
trackInteraction(t, l) {
|
|
124
|
-
i || s.log(D, {
|
|
125
|
-
elementId: t,
|
|
126
|
-
properties: l ? JSON.stringify(l) : ""
|
|
127
|
-
});
|
|
128
|
-
},
|
|
129
|
-
trackError(t, l) {
|
|
130
|
-
i || s.error(t, N, {
|
|
131
|
-
properties: l ? JSON.stringify(l) : ""
|
|
132
|
-
});
|
|
133
|
-
},
|
|
134
|
-
trackPageView(t) {
|
|
135
|
-
i || t !== I && (I = t, s.log(L, { componentRef: t }));
|
|
136
|
-
},
|
|
137
|
-
setPftId(t) {
|
|
138
|
-
i || S(t) && (a = t);
|
|
139
|
-
},
|
|
140
|
-
setInternalSession(t) {
|
|
141
|
-
i || (d = t === !0);
|
|
142
|
-
},
|
|
143
|
-
dispose() {
|
|
144
|
-
if (i) return;
|
|
145
|
-
i = !0, A();
|
|
146
|
-
const t = Date.now() - c;
|
|
147
|
-
s.log(k, { durationMs: t }), y?.dispose();
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
export {
|
|
152
|
-
K as A,
|
|
153
|
-
W as I,
|
|
154
|
-
U as P,
|
|
155
|
-
X as c,
|
|
156
|
-
S as v
|
|
157
|
-
};
|