@aws-sdk/client-sagemaker-edge 3.199.0 → 3.201.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/CHANGELOG.md +19 -0
- package/dist-cjs/endpoint/EndpointParameters.js +2 -3
- package/dist-cjs/protocols/Aws_restJson1.js +10 -14
- package/dist-cjs/runtimeConfig.browser.js +16 -16
- package/dist-cjs/runtimeConfig.js +20 -19
- package/dist-cjs/runtimeConfig.native.js +1 -2
- package/dist-cjs/runtimeConfig.shared.js +8 -11
- package/package.json +33 -33
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.201.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.200.0...v3.201.0) (2022-11-01)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* end support for Node.js 12.x ([#4123](https://github.com/aws/aws-sdk-js-v3/issues/4123)) ([83f913e](https://github.com/aws/aws-sdk-js-v3/commit/83f913ec2ac3878d8726c6964f585550dc5caf3e))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [3.200.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.199.0...v3.200.0) (2022-10-31)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @aws-sdk/client-sagemaker-edge
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
# [3.199.0](https://github.com/aws/aws-sdk-js-v3/compare/v3.198.0...v3.199.0) (2022-10-28)
|
|
7
26
|
|
|
8
27
|
**Note:** Version bump only for package @aws-sdk/client-sagemaker-edge
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.resolveClientEndpointParameters = void 0;
|
|
4
4
|
const resolveClientEndpointParameters = (options) => {
|
|
5
|
-
var _a, _b;
|
|
6
5
|
return {
|
|
7
6
|
...options,
|
|
8
|
-
useDualstackEndpoint:
|
|
9
|
-
useFipsEndpoint:
|
|
7
|
+
useDualstackEndpoint: options.useDualstackEndpoint ?? false,
|
|
8
|
+
useFipsEndpoint: options.useFipsEndpoint ?? false,
|
|
10
9
|
defaultSigningName: "sagemaker",
|
|
11
10
|
};
|
|
12
11
|
};
|
|
@@ -10,7 +10,7 @@ const serializeAws_restJson1GetDeploymentsCommand = async (input, context) => {
|
|
|
10
10
|
const headers = {
|
|
11
11
|
"content-type": "application/json",
|
|
12
12
|
};
|
|
13
|
-
const resolvedPath = `${
|
|
13
|
+
const resolvedPath = `${basePath?.endsWith("/") ? basePath.slice(0, -1) : basePath || ""}` + "/GetDeployments";
|
|
14
14
|
let body;
|
|
15
15
|
body = JSON.stringify({
|
|
16
16
|
...(input.DeviceFleetName != null && { DeviceFleetName: input.DeviceFleetName }),
|
|
@@ -32,7 +32,7 @@ const serializeAws_restJson1GetDeviceRegistrationCommand = async (input, context
|
|
|
32
32
|
const headers = {
|
|
33
33
|
"content-type": "application/json",
|
|
34
34
|
};
|
|
35
|
-
const resolvedPath = `${
|
|
35
|
+
const resolvedPath = `${basePath?.endsWith("/") ? basePath.slice(0, -1) : basePath || ""}` + "/GetDeviceRegistration";
|
|
36
36
|
let body;
|
|
37
37
|
body = JSON.stringify({
|
|
38
38
|
...(input.DeviceFleetName != null && { DeviceFleetName: input.DeviceFleetName }),
|
|
@@ -54,7 +54,7 @@ const serializeAws_restJson1SendHeartbeatCommand = async (input, context) => {
|
|
|
54
54
|
const headers = {
|
|
55
55
|
"content-type": "application/json",
|
|
56
56
|
};
|
|
57
|
-
const resolvedPath = `${
|
|
57
|
+
const resolvedPath = `${basePath?.endsWith("/") ? basePath.slice(0, -1) : basePath || ""}` + "/SendHeartbeat";
|
|
58
58
|
let body;
|
|
59
59
|
body = JSON.stringify({
|
|
60
60
|
...(input.AgentMetrics != null && { AgentMetrics: serializeAws_restJson1EdgeMetrics(input.AgentMetrics, context) }),
|
|
@@ -300,15 +300,12 @@ const deserializeAws_restJson1EdgeDeployments = (output, context) => {
|
|
|
300
300
|
});
|
|
301
301
|
return retVal;
|
|
302
302
|
};
|
|
303
|
-
const deserializeMetadata = (output) => {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
cfId: output.headers["x-amz-cf-id"],
|
|
310
|
-
});
|
|
311
|
-
};
|
|
303
|
+
const deserializeMetadata = (output) => ({
|
|
304
|
+
httpStatusCode: output.statusCode,
|
|
305
|
+
requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"],
|
|
306
|
+
extendedRequestId: output.headers["x-amz-id-2"],
|
|
307
|
+
cfId: output.headers["x-amz-cf-id"],
|
|
308
|
+
});
|
|
312
309
|
const collectBody = (streamBody = new Uint8Array(), context) => {
|
|
313
310
|
if (streamBody instanceof Uint8Array) {
|
|
314
311
|
return Promise.resolve(streamBody);
|
|
@@ -328,9 +325,8 @@ const parseBody = (streamBody, context) => collectBodyString(streamBody, context
|
|
|
328
325
|
return {};
|
|
329
326
|
});
|
|
330
327
|
const parseErrorBody = async (errorBody, context) => {
|
|
331
|
-
var _a;
|
|
332
328
|
const value = await parseBody(errorBody, context);
|
|
333
|
-
value.message =
|
|
329
|
+
value.message = value.message ?? value.Message;
|
|
334
330
|
return value;
|
|
335
331
|
};
|
|
336
332
|
const loadRestJsonErrorCode = (output, data) => {
|
|
@@ -16,7 +16,6 @@ const runtimeConfig_shared_1 = require("./runtimeConfig.shared");
|
|
|
16
16
|
const smithy_client_1 = require("@aws-sdk/smithy-client");
|
|
17
17
|
const util_defaults_mode_browser_1 = require("@aws-sdk/util-defaults-mode-browser");
|
|
18
18
|
const getRuntimeConfig = (config) => {
|
|
19
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
20
19
|
const defaultsMode = (0, util_defaults_mode_browser_1.resolveDefaultsModeConfig)(config);
|
|
21
20
|
const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);
|
|
22
21
|
const clientSharedValues = (0, runtimeConfig_shared_1.getRuntimeConfig)(config);
|
|
@@ -25,21 +24,22 @@ const getRuntimeConfig = (config) => {
|
|
|
25
24
|
...config,
|
|
26
25
|
runtime: "browser",
|
|
27
26
|
defaultsMode,
|
|
28
|
-
base64Decoder:
|
|
29
|
-
base64Encoder:
|
|
30
|
-
bodyLengthChecker:
|
|
31
|
-
credentialDefaultProvider:
|
|
32
|
-
defaultUserAgentProvider:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
base64Decoder: config?.base64Decoder ?? util_base64_browser_1.fromBase64,
|
|
28
|
+
base64Encoder: config?.base64Encoder ?? util_base64_browser_1.toBase64,
|
|
29
|
+
bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_browser_1.calculateBodyLength,
|
|
30
|
+
credentialDefaultProvider: config?.credentialDefaultProvider ?? ((_) => () => Promise.reject(new Error("Credential is missing"))),
|
|
31
|
+
defaultUserAgentProvider: config?.defaultUserAgentProvider ??
|
|
32
|
+
(0, util_user_agent_browser_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),
|
|
33
|
+
maxAttempts: config?.maxAttempts ?? middleware_retry_1.DEFAULT_MAX_ATTEMPTS,
|
|
34
|
+
region: config?.region ?? (0, invalid_dependency_1.invalidProvider)("Region is missing"),
|
|
35
|
+
requestHandler: config?.requestHandler ?? new fetch_http_handler_1.FetchHttpHandler(defaultConfigProvider),
|
|
36
|
+
retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || middleware_retry_1.DEFAULT_RETRY_MODE),
|
|
37
|
+
sha256: config?.sha256 ?? sha256_browser_1.Sha256,
|
|
38
|
+
streamCollector: config?.streamCollector ?? fetch_http_handler_1.streamCollector,
|
|
39
|
+
useDualstackEndpoint: config?.useDualstackEndpoint ?? (() => Promise.resolve(config_resolver_1.DEFAULT_USE_DUALSTACK_ENDPOINT)),
|
|
40
|
+
useFipsEndpoint: config?.useFipsEndpoint ?? (() => Promise.resolve(config_resolver_1.DEFAULT_USE_FIPS_ENDPOINT)),
|
|
41
|
+
utf8Decoder: config?.utf8Decoder ?? util_utf8_browser_1.fromUtf8,
|
|
42
|
+
utf8Encoder: config?.utf8Encoder ?? util_utf8_browser_1.toUtf8,
|
|
43
43
|
};
|
|
44
44
|
};
|
|
45
45
|
exports.getRuntimeConfig = getRuntimeConfig;
|
|
@@ -19,7 +19,6 @@ const smithy_client_1 = require("@aws-sdk/smithy-client");
|
|
|
19
19
|
const util_defaults_mode_node_1 = require("@aws-sdk/util-defaults-mode-node");
|
|
20
20
|
const smithy_client_2 = require("@aws-sdk/smithy-client");
|
|
21
21
|
const getRuntimeConfig = (config) => {
|
|
22
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
23
22
|
(0, smithy_client_2.emitWarningIfUnsupportedVersion)(process.version);
|
|
24
23
|
const defaultsMode = (0, util_defaults_mode_node_1.resolveDefaultsModeConfig)(config);
|
|
25
24
|
const defaultConfigProvider = () => defaultsMode().then(smithy_client_1.loadConfigsForDefaultMode);
|
|
@@ -29,24 +28,26 @@ const getRuntimeConfig = (config) => {
|
|
|
29
28
|
...config,
|
|
30
29
|
runtime: "node",
|
|
31
30
|
defaultsMode,
|
|
32
|
-
base64Decoder:
|
|
33
|
-
base64Encoder:
|
|
34
|
-
bodyLengthChecker:
|
|
35
|
-
credentialDefaultProvider:
|
|
36
|
-
defaultUserAgentProvider:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
31
|
+
base64Decoder: config?.base64Decoder ?? util_base64_node_1.fromBase64,
|
|
32
|
+
base64Encoder: config?.base64Encoder ?? util_base64_node_1.toBase64,
|
|
33
|
+
bodyLengthChecker: config?.bodyLengthChecker ?? util_body_length_node_1.calculateBodyLength,
|
|
34
|
+
credentialDefaultProvider: config?.credentialDefaultProvider ?? (0, client_sts_1.decorateDefaultCredentialProvider)(credential_provider_node_1.defaultProvider),
|
|
35
|
+
defaultUserAgentProvider: config?.defaultUserAgentProvider ??
|
|
36
|
+
(0, util_user_agent_node_1.defaultUserAgent)({ serviceId: clientSharedValues.serviceId, clientVersion: package_json_1.default.version }),
|
|
37
|
+
maxAttempts: config?.maxAttempts ?? (0, node_config_provider_1.loadConfig)(middleware_retry_1.NODE_MAX_ATTEMPT_CONFIG_OPTIONS),
|
|
38
|
+
region: config?.region ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_REGION_CONFIG_OPTIONS, config_resolver_1.NODE_REGION_CONFIG_FILE_OPTIONS),
|
|
39
|
+
requestHandler: config?.requestHandler ?? new node_http_handler_1.NodeHttpHandler(defaultConfigProvider),
|
|
40
|
+
retryMode: config?.retryMode ??
|
|
41
|
+
(0, node_config_provider_1.loadConfig)({
|
|
42
|
+
...middleware_retry_1.NODE_RETRY_MODE_CONFIG_OPTIONS,
|
|
43
|
+
default: async () => (await defaultConfigProvider()).retryMode || middleware_retry_1.DEFAULT_RETRY_MODE,
|
|
44
|
+
}),
|
|
45
|
+
sha256: config?.sha256 ?? hash_node_1.Hash.bind(null, "sha256"),
|
|
46
|
+
streamCollector: config?.streamCollector ?? node_http_handler_1.streamCollector,
|
|
47
|
+
useDualstackEndpoint: config?.useDualstackEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS),
|
|
48
|
+
useFipsEndpoint: config?.useFipsEndpoint ?? (0, node_config_provider_1.loadConfig)(config_resolver_1.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS),
|
|
49
|
+
utf8Decoder: config?.utf8Decoder ?? util_utf8_node_1.fromUtf8,
|
|
50
|
+
utf8Encoder: config?.utf8Encoder ?? util_utf8_node_1.toUtf8,
|
|
50
51
|
};
|
|
51
52
|
};
|
|
52
53
|
exports.getRuntimeConfig = getRuntimeConfig;
|
|
@@ -4,13 +4,12 @@ exports.getRuntimeConfig = void 0;
|
|
|
4
4
|
const sha256_js_1 = require("@aws-crypto/sha256-js");
|
|
5
5
|
const runtimeConfig_browser_1 = require("./runtimeConfig.browser");
|
|
6
6
|
const getRuntimeConfig = (config) => {
|
|
7
|
-
var _a;
|
|
8
7
|
const browserDefaults = (0, runtimeConfig_browser_1.getRuntimeConfig)(config);
|
|
9
8
|
return {
|
|
10
9
|
...browserDefaults,
|
|
11
10
|
...config,
|
|
12
11
|
runtime: "react-native",
|
|
13
|
-
sha256:
|
|
12
|
+
sha256: config?.sha256 ?? sha256_js_1.Sha256,
|
|
14
13
|
};
|
|
15
14
|
};
|
|
16
15
|
exports.getRuntimeConfig = getRuntimeConfig;
|
|
@@ -3,15 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getRuntimeConfig = void 0;
|
|
4
4
|
const url_parser_1 = require("@aws-sdk/url-parser");
|
|
5
5
|
const endpointResolver_1 = require("./endpoint/endpointResolver");
|
|
6
|
-
const getRuntimeConfig = (config) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
urlParser: (_e = config === null || config === void 0 ? void 0 : config.urlParser) !== null && _e !== void 0 ? _e : url_parser_1.parseUrl,
|
|
15
|
-
});
|
|
16
|
-
};
|
|
6
|
+
const getRuntimeConfig = (config) => ({
|
|
7
|
+
apiVersion: "2020-09-23",
|
|
8
|
+
disableHostPrefix: config?.disableHostPrefix ?? false,
|
|
9
|
+
endpointProvider: config?.endpointProvider ?? endpointResolver_1.defaultEndpointResolver,
|
|
10
|
+
logger: config?.logger ?? {},
|
|
11
|
+
serviceId: config?.serviceId ?? "Sagemaker Edge",
|
|
12
|
+
urlParser: config?.urlParser ?? url_parser_1.parseUrl,
|
|
13
|
+
});
|
|
17
14
|
exports.getRuntimeConfig = getRuntimeConfig;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-sagemaker-edge",
|
|
3
3
|
"description": "AWS SDK for JavaScript Sagemaker Edge Client for Node.js, Browser and React Native",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.201.0",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'",
|
|
7
7
|
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
@@ -19,44 +19,44 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@aws-crypto/sha256-browser": "2.0.0",
|
|
21
21
|
"@aws-crypto/sha256-js": "2.0.0",
|
|
22
|
-
"@aws-sdk/client-sts": "3.
|
|
23
|
-
"@aws-sdk/config-resolver": "3.
|
|
24
|
-
"@aws-sdk/credential-provider-node": "3.
|
|
25
|
-
"@aws-sdk/fetch-http-handler": "3.
|
|
26
|
-
"@aws-sdk/hash-node": "3.
|
|
27
|
-
"@aws-sdk/invalid-dependency": "3.
|
|
28
|
-
"@aws-sdk/middleware-content-length": "3.
|
|
29
|
-
"@aws-sdk/middleware-endpoint": "3.
|
|
30
|
-
"@aws-sdk/middleware-host-header": "3.
|
|
31
|
-
"@aws-sdk/middleware-logger": "3.
|
|
32
|
-
"@aws-sdk/middleware-recursion-detection": "3.
|
|
33
|
-
"@aws-sdk/middleware-retry": "3.
|
|
34
|
-
"@aws-sdk/middleware-serde": "3.
|
|
35
|
-
"@aws-sdk/middleware-signing": "3.
|
|
36
|
-
"@aws-sdk/middleware-stack": "3.
|
|
37
|
-
"@aws-sdk/middleware-user-agent": "3.
|
|
38
|
-
"@aws-sdk/node-config-provider": "3.
|
|
39
|
-
"@aws-sdk/node-http-handler": "3.
|
|
40
|
-
"@aws-sdk/protocol-http": "3.
|
|
41
|
-
"@aws-sdk/smithy-client": "3.
|
|
42
|
-
"@aws-sdk/types": "3.
|
|
43
|
-
"@aws-sdk/url-parser": "3.
|
|
22
|
+
"@aws-sdk/client-sts": "3.201.0",
|
|
23
|
+
"@aws-sdk/config-resolver": "3.201.0",
|
|
24
|
+
"@aws-sdk/credential-provider-node": "3.201.0",
|
|
25
|
+
"@aws-sdk/fetch-http-handler": "3.201.0",
|
|
26
|
+
"@aws-sdk/hash-node": "3.201.0",
|
|
27
|
+
"@aws-sdk/invalid-dependency": "3.201.0",
|
|
28
|
+
"@aws-sdk/middleware-content-length": "3.201.0",
|
|
29
|
+
"@aws-sdk/middleware-endpoint": "3.201.0",
|
|
30
|
+
"@aws-sdk/middleware-host-header": "3.201.0",
|
|
31
|
+
"@aws-sdk/middleware-logger": "3.201.0",
|
|
32
|
+
"@aws-sdk/middleware-recursion-detection": "3.201.0",
|
|
33
|
+
"@aws-sdk/middleware-retry": "3.201.0",
|
|
34
|
+
"@aws-sdk/middleware-serde": "3.201.0",
|
|
35
|
+
"@aws-sdk/middleware-signing": "3.201.0",
|
|
36
|
+
"@aws-sdk/middleware-stack": "3.201.0",
|
|
37
|
+
"@aws-sdk/middleware-user-agent": "3.201.0",
|
|
38
|
+
"@aws-sdk/node-config-provider": "3.201.0",
|
|
39
|
+
"@aws-sdk/node-http-handler": "3.201.0",
|
|
40
|
+
"@aws-sdk/protocol-http": "3.201.0",
|
|
41
|
+
"@aws-sdk/smithy-client": "3.201.0",
|
|
42
|
+
"@aws-sdk/types": "3.201.0",
|
|
43
|
+
"@aws-sdk/url-parser": "3.201.0",
|
|
44
44
|
"@aws-sdk/util-base64-browser": "3.188.0",
|
|
45
|
-
"@aws-sdk/util-base64-node": "3.
|
|
45
|
+
"@aws-sdk/util-base64-node": "3.201.0",
|
|
46
46
|
"@aws-sdk/util-body-length-browser": "3.188.0",
|
|
47
|
-
"@aws-sdk/util-body-length-node": "3.
|
|
48
|
-
"@aws-sdk/util-defaults-mode-browser": "3.
|
|
49
|
-
"@aws-sdk/util-defaults-mode-node": "3.
|
|
50
|
-
"@aws-sdk/util-endpoints": "3.
|
|
51
|
-
"@aws-sdk/util-user-agent-browser": "3.
|
|
52
|
-
"@aws-sdk/util-user-agent-node": "3.
|
|
47
|
+
"@aws-sdk/util-body-length-node": "3.201.0",
|
|
48
|
+
"@aws-sdk/util-defaults-mode-browser": "3.201.0",
|
|
49
|
+
"@aws-sdk/util-defaults-mode-node": "3.201.0",
|
|
50
|
+
"@aws-sdk/util-endpoints": "3.201.0",
|
|
51
|
+
"@aws-sdk/util-user-agent-browser": "3.201.0",
|
|
52
|
+
"@aws-sdk/util-user-agent-node": "3.201.0",
|
|
53
53
|
"@aws-sdk/util-utf8-browser": "3.188.0",
|
|
54
|
-
"@aws-sdk/util-utf8-node": "3.
|
|
54
|
+
"@aws-sdk/util-utf8-node": "3.201.0",
|
|
55
55
|
"tslib": "^2.3.1"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@aws-sdk/service-client-documentation-generator": "3.188.0",
|
|
59
|
-
"@tsconfig/
|
|
59
|
+
"@tsconfig/node14": "1.0.3",
|
|
60
60
|
"@types/node": "^12.7.5",
|
|
61
61
|
"concurrently": "7.0.0",
|
|
62
62
|
"downlevel-dts": "0.10.1",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"engines": {
|
|
73
|
-
"node": ">=
|
|
73
|
+
"node": ">=14.0.0"
|
|
74
74
|
},
|
|
75
75
|
"typesVersions": {
|
|
76
76
|
"<4.0": {
|