@mapbox/mcp-server 0.13.0 → 0.14.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/README.md +100 -14
- package/dist/commonjs/cli.d.ts.map +1 -1
- package/dist/commonjs/cli.js +5 -2
- package/dist/commonjs/cli.js.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.d.ts +1 -2
- package/dist/commonjs/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.js +0 -2
- package/dist/commonjs/resources/resourceRegistry.js.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js +18 -4
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js +105 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js +7 -3
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +2 -0
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +16 -2
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js +15 -4
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/commonjs/utils/index.d.ts +2 -0
- package/dist/commonjs/utils/index.d.ts.map +1 -1
- package/dist/commonjs/utils/index.js +8 -1
- package/dist/commonjs/utils/index.js.map +1 -1
- package/dist/commonjs/utils/redactToken.d.ts +3 -0
- package/dist/commonjs/utils/redactToken.d.ts.map +1 -0
- package/dist/commonjs/utils/redactToken.js +55 -0
- package/dist/commonjs/utils/redactToken.js.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.js +97 -0
- package/dist/commonjs/utils/redactingSpanExporter.js.map +1 -0
- package/dist/commonjs/utils/tracing.d.ts.map +1 -1
- package/dist/commonjs/utils/tracing.js +4 -1
- package/dist/commonjs/utils/tracing.js.map +1 -1
- package/dist/commonjs/utils/urlSafety.d.ts +23 -7
- package/dist/commonjs/utils/urlSafety.d.ts.map +1 -1
- package/dist/commonjs/utils/urlSafety.js +84 -66
- package/dist/commonjs/utils/urlSafety.js.map +1 -1
- package/dist/commonjs/version.json +3 -3
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +5 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/resources/resourceRegistry.d.ts +1 -2
- package/dist/esm/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/esm/resources/resourceRegistry.js +0 -2
- package/dist/esm/resources/resourceRegistry.js.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppHtml.js +18 -4
- package/dist/esm/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.js +105 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js +7 -3
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +2 -0
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +17 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js +15 -4
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/redactToken.d.ts +3 -0
- package/dist/esm/utils/redactToken.d.ts.map +1 -0
- package/dist/esm/utils/redactToken.js +52 -0
- package/dist/esm/utils/redactToken.js.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.js +93 -0
- package/dist/esm/utils/redactingSpanExporter.js.map +1 -0
- package/dist/esm/utils/tracing.d.ts.map +1 -1
- package/dist/esm/utils/tracing.js +4 -1
- package/dist/esm/utils/tracing.js.map +1 -1
- package/dist/esm/utils/urlSafety.d.ts +23 -7
- package/dist/esm/utils/urlSafety.d.ts.map +1 -1
- package/dist/esm/utils/urlSafety.js +80 -66
- package/dist/esm/utils/urlSafety.js.map +1 -1
- package/dist/esm/version.json +3 -3
- package/package.json +2 -1
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js +0 -262
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js +0 -258
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"AAWA,OAAO,EAIL,KAAK,IAAI,EAGV,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic
|
|
|
7
7
|
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
8
8
|
import { trace, SpanStatusCode, SpanKind, diag, DiagLogLevel } from '@opentelemetry/api';
|
|
9
9
|
import { getVersionInfo } from './versionUtils.js';
|
|
10
|
+
import { RedactingSpanExporter } from './redactingSpanExporter.js';
|
|
10
11
|
import { ATTR_SERVICE_INSTANCE_ID } from '@opentelemetry/semantic-conventions/incubating';
|
|
11
12
|
// Suppress OpenTelemetry diagnostic logging IMMEDIATELY to avoid polluting stdio
|
|
12
13
|
// This must happen at module load time, before any OTEL operations
|
|
@@ -128,7 +129,9 @@ export async function initializeTracing() {
|
|
|
128
129
|
// Create SDK instance
|
|
129
130
|
sdk = new NodeSDK({
|
|
130
131
|
resource,
|
|
131
|
-
|
|
132
|
+
// Wrap the exporter so access tokens recorded in HTTP client span
|
|
133
|
+
// attributes (url.full, url.query) never reach the trace backend
|
|
134
|
+
traceExporter: new RedactingSpanExporter(exporters[0]),
|
|
132
135
|
instrumentations: [
|
|
133
136
|
getNodeAutoInstrumentations({
|
|
134
137
|
// Disable instrumentations that might be too noisy
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,30 @@
|
|
|
6
6
|
* Rejects:
|
|
7
7
|
* - non-http(s) schemes (e.g. file:, gopher:, data:, javascript:)
|
|
8
8
|
* - non-https URLs (markers should always be fetched over TLS)
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - IPv4/IPv6 literals outside ipaddr.js's plain "unicast" range —
|
|
10
|
+
* deny-by-default, so loopback, private, link-local, multicast,
|
|
11
|
+
* broadcast, CGNAT, reserved, and every IPv4-in-IPv6 transition/
|
|
12
|
+
* translation mechanism (mapped, compatible, 6to4, NAT64, SIIT, Teredo,
|
|
13
|
+
* AMT, ORCHID, etc.) are all rejected without needing to be named
|
|
14
|
+
* individually (CWE-918 SSRF)
|
|
15
|
+
* - well-known local hostnames, reserved local/internal-use suffixes
|
|
16
|
+
* (.internal, .local, .arpa), and dotless single-label hostnames
|
|
12
17
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
18
|
+
* Out of scope, by design, for this pre-fetch string check — all three
|
|
19
|
+
* require validating the actual connection, not the URL string, so they
|
|
20
|
+
* belong where the fetch happens, not here:
|
|
21
|
+
* - DNS rebinding (an ordinary hostname resolving to an internal address
|
|
22
|
+
* at fetch time)
|
|
23
|
+
* - port restriction
|
|
24
|
+
* - network-specific hostname suffixes (.corp, .lan, .home, etc.) —
|
|
25
|
+
* unlike .internal/.local/.arpa, these aren't globally reserved, so
|
|
26
|
+
* they can't be enumerated in general
|
|
17
27
|
*/
|
|
18
28
|
export declare function isSafeExternalUrl(rawUrl: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Same validation as isSafeExternalUrl, but returns the parsed URL on
|
|
31
|
+
* success (null otherwise) so callers that need the WHATWG-canonical form
|
|
32
|
+
* of the validated URL don't have to re-parse the raw string.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseSafeExternalUrl(rawUrl: string): URL | null;
|
|
19
35
|
//# sourceMappingURL=urlSafety.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlSafety.d.ts","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"urlSafety.d.ts","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAoF/D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Copyright (c) Mapbox, Inc.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
|
+
import ipaddr from 'ipaddr.js';
|
|
3
4
|
/**
|
|
4
5
|
* Validates that a URL is safe for server-side fetching by an upstream service
|
|
5
6
|
* (in particular, the Mapbox Static Images API which fetches custom marker
|
|
@@ -8,30 +9,55 @@
|
|
|
8
9
|
* Rejects:
|
|
9
10
|
* - non-http(s) schemes (e.g. file:, gopher:, data:, javascript:)
|
|
10
11
|
* - non-https URLs (markers should always be fetched over TLS)
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* - IPv4/IPv6 literals outside ipaddr.js's plain "unicast" range —
|
|
13
|
+
* deny-by-default, so loopback, private, link-local, multicast,
|
|
14
|
+
* broadcast, CGNAT, reserved, and every IPv4-in-IPv6 transition/
|
|
15
|
+
* translation mechanism (mapped, compatible, 6to4, NAT64, SIIT, Teredo,
|
|
16
|
+
* AMT, ORCHID, etc.) are all rejected without needing to be named
|
|
17
|
+
* individually (CWE-918 SSRF)
|
|
18
|
+
* - well-known local hostnames, reserved local/internal-use suffixes
|
|
19
|
+
* (.internal, .local, .arpa), and dotless single-label hostnames
|
|
14
20
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
21
|
+
* Out of scope, by design, for this pre-fetch string check — all three
|
|
22
|
+
* require validating the actual connection, not the URL string, so they
|
|
23
|
+
* belong where the fetch happens, not here:
|
|
24
|
+
* - DNS rebinding (an ordinary hostname resolving to an internal address
|
|
25
|
+
* at fetch time)
|
|
26
|
+
* - port restriction
|
|
27
|
+
* - network-specific hostname suffixes (.corp, .lan, .home, etc.) —
|
|
28
|
+
* unlike .internal/.local/.arpa, these aren't globally reserved, so
|
|
29
|
+
* they can't be enumerated in general
|
|
19
30
|
*/
|
|
20
31
|
export function isSafeExternalUrl(rawUrl) {
|
|
32
|
+
return parseSafeExternalUrl(rawUrl) !== null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Same validation as isSafeExternalUrl, but returns the parsed URL on
|
|
36
|
+
* success (null otherwise) so callers that need the WHATWG-canonical form
|
|
37
|
+
* of the validated URL don't have to re-parse the raw string.
|
|
38
|
+
*/
|
|
39
|
+
export function parseSafeExternalUrl(rawUrl) {
|
|
21
40
|
let parsed;
|
|
22
41
|
try {
|
|
23
42
|
parsed = new URL(rawUrl);
|
|
24
43
|
}
|
|
25
44
|
catch {
|
|
26
|
-
return
|
|
45
|
+
return null;
|
|
27
46
|
}
|
|
28
47
|
if (parsed.protocol !== 'https:') {
|
|
29
|
-
return
|
|
48
|
+
return null;
|
|
30
49
|
}
|
|
31
|
-
// Strip optional surrounding brackets from IPv6 literals
|
|
32
|
-
|
|
50
|
+
// Strip optional surrounding brackets from IPv6 literals and a trailing
|
|
51
|
+
// root-label dot (e.g. "localhost." is equivalent to "localhost"). The
|
|
52
|
+
// dotless-hostname check further below relies on this running first —
|
|
53
|
+
// without it, "intranet." would still contain a dot and slip past that
|
|
54
|
+
// check.
|
|
55
|
+
const host = parsed.hostname
|
|
56
|
+
.replace(/^\[|\]$/g, '')
|
|
57
|
+
.replace(/\.$/, '')
|
|
58
|
+
.toLowerCase();
|
|
33
59
|
if (host.length === 0) {
|
|
34
|
-
return
|
|
60
|
+
return null;
|
|
35
61
|
}
|
|
36
62
|
// Block well-known local hostnames
|
|
37
63
|
const blockedHostnames = new Set([
|
|
@@ -40,62 +66,50 @@ export function isSafeExternalUrl(rawUrl) {
|
|
|
40
66
|
'ip6-loopback',
|
|
41
67
|
'broadcasthost'
|
|
42
68
|
]);
|
|
43
|
-
|
|
44
|
-
|
|
69
|
+
// Suffixes reserved for local/internal use that no public marker image
|
|
70
|
+
// host is ever legitimately under: cloud-internal DNS zones (.internal,
|
|
71
|
+
// used by GCP/AWS service discovery — covers metadata.google.internal,
|
|
72
|
+
// the GCP metadata endpoint's actual hostname), mDNS (.local), and
|
|
73
|
+
// reverse-DNS / home-network zones reserved by RFC 6761/8375 (.arpa
|
|
74
|
+
// covers .in-addr.arpa, .ip6.arpa, and .home.arpa as suffixes of it).
|
|
75
|
+
const blockedSuffixes = ['.localhost', '.internal', '.local', '.arpa'];
|
|
76
|
+
if (blockedHostnames.has(host) ||
|
|
77
|
+
blockedSuffixes.some((suffix) => host.endsWith(suffix))) {
|
|
78
|
+
return null;
|
|
45
79
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (a === 192 && b === 168)
|
|
66
|
-
return false;
|
|
67
|
-
// 100.64/10 (CGNAT)
|
|
68
|
-
if (a === 100 && b >= 64 && b <= 127)
|
|
69
|
-
return false;
|
|
70
|
-
// 224/4 multicast and 240/4 reserved
|
|
71
|
-
if (a >= 224)
|
|
72
|
-
return false;
|
|
73
|
-
return true;
|
|
80
|
+
// If the host isn't a parseable IP literal at all, it's an ordinary
|
|
81
|
+
// hostname — allowed here (subject to the checks above), except that a
|
|
82
|
+
// public marker image host always has at least one dot; a dotless,
|
|
83
|
+
// single-label hostname only resolves via the fetcher's own network
|
|
84
|
+
// search-domain suffixing (e.g. "intranet", "metadata"), which is never
|
|
85
|
+
// the case for a legitimate external image URL. DNS rebinding on a
|
|
86
|
+
// multi-label hostname is out of scope for this pre-fetch check, see the
|
|
87
|
+
// module doc comment.
|
|
88
|
+
if (!ipaddr.isValid(host)) {
|
|
89
|
+
return host.includes('.') ? parsed : null;
|
|
90
|
+
}
|
|
91
|
+
const addr = ipaddr.parse(host);
|
|
92
|
+
// Deny by default for both IPv4 and IPv6: only plain global unicast
|
|
93
|
+
// addresses are allowed. Every other named range (private, loopback,
|
|
94
|
+
// link-local, multicast, broadcast, CGNAT, reserved, unique-local, and
|
|
95
|
+
// every IPv4-in-IPv6 transition/translation mechanism) is rejected,
|
|
96
|
+
// regardless of what it does or doesn't embed.
|
|
97
|
+
if (addr.range() !== 'unicast') {
|
|
98
|
+
return null;
|
|
74
99
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// ::
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
if (/^ff[0-9a-f]{2}:/.test(host))
|
|
88
|
-
return false;
|
|
89
|
-
// IPv4-mapped / IPv4-compatible IPv6: ::ffff:a.b.c.d or ::a.b.c.d
|
|
90
|
-
// (Node's URL parser normalises ::ffff:127.0.0.1 to ::ffff:7f00:1, so
|
|
91
|
-
// detect the embedded IPv4 either as a dotted-quad or as the
|
|
92
|
-
// ::ffff:xxxx:xxxx hex form.)
|
|
93
|
-
if (/\d+\.\d+\.\d+\.\d+/.test(host))
|
|
94
|
-
return false;
|
|
95
|
-
if (/^::ffff:[0-9a-f]{1,4}:[0-9a-f]{1,4}$/.test(host))
|
|
96
|
-
return false;
|
|
97
|
-
return true;
|
|
100
|
+
if (addr.kind() === 'ipv6') {
|
|
101
|
+
// ipaddr.js does not classify the deprecated IPv4-compatible form
|
|
102
|
+
// (::a.b.c.d, i.e. the leading 96 bits all zero) as a special range
|
|
103
|
+
// when written in plain hex, which is exactly the form Node's URL
|
|
104
|
+
// parser normalises a dotted-quad IPv4-compatible literal to — so it
|
|
105
|
+
// reaches here as ordinary 'unicast' and needs an explicit check.
|
|
106
|
+
// (::1 and :: are already excluded above via the loopback/unspecified
|
|
107
|
+
// ranges, so this only affects addresses with a genuine embedded IPv4.)
|
|
108
|
+
const bytes = addr.toByteArray();
|
|
109
|
+
if (bytes.slice(0, 12).every((b) => b === 0)) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
98
112
|
}
|
|
99
|
-
return
|
|
113
|
+
return parsed;
|
|
100
114
|
}
|
|
101
115
|
//# sourceMappingURL=urlSafety.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlSafety.js","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC
|
|
1
|
+
{"version":3,"file":"urlSafety.js","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,oBAAoB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,SAAS;IACT,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ;SACzB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,WAAW,EAAE,CAAC;IAEjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;QAC/B,WAAW;QACX,eAAe;QACf,cAAc;QACd,eAAe;KAChB,CAAC,CAAC;IACH,uEAAuE;IACvE,wEAAwE;IACxE,uEAAuE;IACvE,mEAAmE;IACnE,oEAAoE;IACpE,sEAAsE;IACtE,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvE,IACE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EACvD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,uEAAuE;IACvE,mEAAmE;IACnE,oEAAoE;IACpE,wEAAwE;IACxE,mEAAmE;IACnE,yEAAyE;IACzE,sBAAsB;IACtB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEhC,oEAAoE;IACpE,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,+CAA+C;IAC/C,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QAC3B,kEAAkE;QAClE,oEAAoE;QACpE,kEAAkE;QAClE,qEAAqE;QACrE,kEAAkE;QAClE,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/esm/version.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapbox/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Mapbox MCP server.",
|
|
5
5
|
"mcpName": "io.github.mapbox/mcp-server",
|
|
6
6
|
"main": "./dist/commonjs/index.js",
|
|
@@ -88,6 +88,7 @@
|
|
|
88
88
|
"@opentelemetry/sdk-trace-base": "^2.7.1",
|
|
89
89
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
90
90
|
"@turf/turf": "^7.3.1",
|
|
91
|
+
"ipaddr.js": "^2.4.0",
|
|
91
92
|
"patch-package": "^8.0.1",
|
|
92
93
|
"zod": "^4.3.6"
|
|
93
94
|
},
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
-
import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import { BaseResource } from '../BaseResource.js';
|
|
4
|
-
/**
|
|
5
|
-
* Serves UI App HTML for Static Map Preview
|
|
6
|
-
* Implements MCP Apps pattern with ui:// scheme
|
|
7
|
-
*/
|
|
8
|
-
export declare class StaticMapUIResource extends BaseResource {
|
|
9
|
-
readonly name = "Static Map Preview UI";
|
|
10
|
-
readonly uri = "ui://mapbox/static-map/index.html";
|
|
11
|
-
readonly description = "Interactive UI for previewing static map images (MCP Apps)";
|
|
12
|
-
readonly mimeType = "text/html;profile=mcp-app";
|
|
13
|
-
read(_uri: string, _extra?: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult>;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=StaticMapUIResource.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StaticMapUIResource.d.ts","sourceRoot":"","sources":["../../../../src/resources/ui-apps/StaticMapUIResource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,GAAG,uCAAuC;IACnD,QAAQ,CAAC,WAAW,gEAC2C;IAC/D,QAAQ,CAAC,QAAQ,+BAAsB;IAEjC,IAAI,CAER,IAAI,EAAE,MAAM,EAEZ,MAAM,CAAC,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAC9D,OAAO,CAAC,kBAAkB,CAAC;CAgP/B"}
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Copyright (c) Mapbox, Inc.
|
|
3
|
-
// Licensed under the MIT License.
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.StaticMapUIResource = void 0;
|
|
6
|
-
const server_1 = require("@modelcontextprotocol/ext-apps/server");
|
|
7
|
-
const BaseResource_js_1 = require("../BaseResource.js");
|
|
8
|
-
/**
|
|
9
|
-
* Serves UI App HTML for Static Map Preview
|
|
10
|
-
* Implements MCP Apps pattern with ui:// scheme
|
|
11
|
-
*/
|
|
12
|
-
class StaticMapUIResource extends BaseResource_js_1.BaseResource {
|
|
13
|
-
name = 'Static Map Preview UI';
|
|
14
|
-
uri = 'ui://mapbox/static-map/index.html';
|
|
15
|
-
description = 'Interactive UI for previewing static map images (MCP Apps)';
|
|
16
|
-
mimeType = server_1.RESOURCE_MIME_TYPE;
|
|
17
|
-
async read(
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
19
|
-
_uri,
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
21
|
-
_extra) {
|
|
22
|
-
// Generate HTML for static map visualization with MCP Apps protocol support
|
|
23
|
-
const html = `<!DOCTYPE html>
|
|
24
|
-
<html>
|
|
25
|
-
<head>
|
|
26
|
-
<meta charset="UTF-8">
|
|
27
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
28
|
-
<title>Static Map Preview</title>
|
|
29
|
-
<style>
|
|
30
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
31
|
-
body {
|
|
32
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
33
|
-
background: #000;
|
|
34
|
-
}
|
|
35
|
-
#toolbar {
|
|
36
|
-
display: none;
|
|
37
|
-
align-items: center;
|
|
38
|
-
justify-content: flex-end;
|
|
39
|
-
padding: 6px 10px;
|
|
40
|
-
background: rgba(0, 0, 0, 0.7);
|
|
41
|
-
gap: 8px;
|
|
42
|
-
}
|
|
43
|
-
#toolbar.visible { display: flex; }
|
|
44
|
-
#fullscreen-btn {
|
|
45
|
-
background: rgba(255, 255, 255, 0.15);
|
|
46
|
-
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
47
|
-
color: #fff;
|
|
48
|
-
padding: 4px 12px;
|
|
49
|
-
border-radius: 4px;
|
|
50
|
-
cursor: pointer;
|
|
51
|
-
font-size: 12px;
|
|
52
|
-
}
|
|
53
|
-
#fullscreen-btn:hover { background: rgba(255, 255, 255, 0.25); }
|
|
54
|
-
#image-container {
|
|
55
|
-
position: relative;
|
|
56
|
-
}
|
|
57
|
-
#preview-image {
|
|
58
|
-
display: none;
|
|
59
|
-
max-width: 100%;
|
|
60
|
-
width: 100%;
|
|
61
|
-
cursor: zoom-in;
|
|
62
|
-
}
|
|
63
|
-
#preview-image.zoomed {
|
|
64
|
-
cursor: zoom-out;
|
|
65
|
-
max-width: none;
|
|
66
|
-
width: auto;
|
|
67
|
-
}
|
|
68
|
-
#loading {
|
|
69
|
-
padding: 20px;
|
|
70
|
-
color: #fff;
|
|
71
|
-
font-size: 16px;
|
|
72
|
-
}
|
|
73
|
-
#error {
|
|
74
|
-
padding: 20px;
|
|
75
|
-
color: #ff6b6b;
|
|
76
|
-
text-align: center;
|
|
77
|
-
}
|
|
78
|
-
</style>
|
|
79
|
-
</head>
|
|
80
|
-
<body>
|
|
81
|
-
<div id="toolbar">
|
|
82
|
-
<button id="fullscreen-btn">⛶ Fullscreen</button>
|
|
83
|
-
</div>
|
|
84
|
-
<div id="image-container">
|
|
85
|
-
<div id="loading">Loading static map preview...</div>
|
|
86
|
-
<img id="preview-image" alt="Static Map Preview">
|
|
87
|
-
<div id="error" style="display:none"></div>
|
|
88
|
-
</div>
|
|
89
|
-
|
|
90
|
-
<script type="module">
|
|
91
|
-
const image = document.getElementById('preview-image');
|
|
92
|
-
const loading = document.getElementById('loading');
|
|
93
|
-
const errorDiv = document.getElementById('error');
|
|
94
|
-
const toolbar = document.getElementById('toolbar');
|
|
95
|
-
const fullscreenBtn = document.getElementById('fullscreen-btn');
|
|
96
|
-
|
|
97
|
-
let isZoomed = false;
|
|
98
|
-
let currentDisplayMode = 'inline';
|
|
99
|
-
let canFullscreen = false;
|
|
100
|
-
|
|
101
|
-
image.addEventListener('click', () => {
|
|
102
|
-
isZoomed = !isZoomed;
|
|
103
|
-
image.classList.toggle('zoomed', isZoomed);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
let messageId = 0;
|
|
107
|
-
const pendingRequests = new Map();
|
|
108
|
-
|
|
109
|
-
function sendRequest(method, params = {}) {
|
|
110
|
-
const id = ++messageId;
|
|
111
|
-
window.parent.postMessage({ jsonrpc: '2.0', id, method, params }, '*');
|
|
112
|
-
return new Promise((resolve, reject) => {
|
|
113
|
-
pendingRequests.set(id, { resolve, reject });
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function sendNotification(method, params = {}) {
|
|
118
|
-
window.parent.postMessage({ jsonrpc: '2.0', method, params }, '*');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function requestSizeToFit() {
|
|
122
|
-
if (currentDisplayMode !== 'inline') return;
|
|
123
|
-
// Use requestAnimationFrame to measure after layout so we get the
|
|
124
|
-
// actual rendered height (constrained by max-width:100%), not natural px
|
|
125
|
-
requestAnimationFrame(() => {
|
|
126
|
-
const toolbarHeight = canFullscreen ? toolbar.offsetHeight : 0;
|
|
127
|
-
sendNotification('ui/notifications/size-changed', {
|
|
128
|
-
height: Math.round(image.getBoundingClientRect().height) + toolbarHeight
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function updateFullscreenButton() {
|
|
134
|
-
fullscreenBtn.textContent =
|
|
135
|
-
currentDisplayMode === 'fullscreen' ? '⊟ Exit Fullscreen' : '⛶ Fullscreen';
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async function toggleFullscreen() {
|
|
139
|
-
const newMode = currentDisplayMode === 'fullscreen' ? 'inline' : 'fullscreen';
|
|
140
|
-
try {
|
|
141
|
-
const result = await sendRequest('ui/request-display-mode', { mode: newMode });
|
|
142
|
-
currentDisplayMode = result?.mode ?? newMode;
|
|
143
|
-
updateFullscreenButton();
|
|
144
|
-
if (currentDisplayMode === 'inline') requestSizeToFit();
|
|
145
|
-
} catch (e) {
|
|
146
|
-
console.error('Failed to change display mode:', e);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
fullscreenBtn.addEventListener('click', toggleFullscreen);
|
|
151
|
-
|
|
152
|
-
window.addEventListener('message', (event) => {
|
|
153
|
-
const message = event.data;
|
|
154
|
-
if (!message || typeof message !== 'object') return;
|
|
155
|
-
|
|
156
|
-
if (message.id !== undefined && pendingRequests.has(message.id)) {
|
|
157
|
-
const { resolve, reject } = pendingRequests.get(message.id);
|
|
158
|
-
pendingRequests.delete(message.id);
|
|
159
|
-
if (message.error) reject(new Error(message.error.message));
|
|
160
|
-
else resolve(message.result);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (message.method === 'ui/notifications/tool-result') {
|
|
165
|
-
if (message.params) handleToolResult(message.params);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (message.method === 'ui/notifications/host-context-changed') {
|
|
169
|
-
const ctx = message.params;
|
|
170
|
-
if (ctx?.displayMode) {
|
|
171
|
-
currentDisplayMode = ctx.displayMode;
|
|
172
|
-
updateFullscreenButton();
|
|
173
|
-
if (currentDisplayMode === 'inline' && image.style.display !== 'none') {
|
|
174
|
-
requestSizeToFit();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
async function handleToolResult(result) {
|
|
181
|
-
const textContent = result.content?.find(c => c.type === 'text');
|
|
182
|
-
if (!textContent?.text) {
|
|
183
|
-
loading.style.display = 'none';
|
|
184
|
-
errorDiv.textContent = 'No URL found in tool result';
|
|
185
|
-
errorDiv.style.display = 'block';
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const url = textContent.text;
|
|
190
|
-
if (!url.includes('api.mapbox.com/styles/') || !url.includes('/static/')) {
|
|
191
|
-
loading.style.display = 'none';
|
|
192
|
-
errorDiv.textContent = 'Unsupported URL format';
|
|
193
|
-
errorDiv.style.display = 'block';
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
loading.textContent = 'Fetching map from Mapbox...';
|
|
198
|
-
try {
|
|
199
|
-
const response = await fetch(url);
|
|
200
|
-
if (!response.ok) throw new Error('HTTP ' + response.status);
|
|
201
|
-
const blob = await response.blob();
|
|
202
|
-
const blobUrl = URL.createObjectURL(blob);
|
|
203
|
-
|
|
204
|
-
image.onload = () => {
|
|
205
|
-
loading.style.display = 'none';
|
|
206
|
-
image.style.display = 'block';
|
|
207
|
-
if (canFullscreen) toolbar.classList.add('visible');
|
|
208
|
-
requestSizeToFit();
|
|
209
|
-
};
|
|
210
|
-
image.src = blobUrl;
|
|
211
|
-
} catch (error) {
|
|
212
|
-
loading.style.display = 'none';
|
|
213
|
-
errorDiv.textContent = 'Failed to load image: ' + error.message;
|
|
214
|
-
errorDiv.style.display = 'block';
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
async function init() {
|
|
219
|
-
try {
|
|
220
|
-
const result = await sendRequest('ui/initialize', {
|
|
221
|
-
protocolVersion: '2026-01-26',
|
|
222
|
-
appCapabilities: {},
|
|
223
|
-
appInfo: { name: 'Static Map Preview', version: '1.0.0' }
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
sendNotification('ui/notifications/initialized', {});
|
|
227
|
-
|
|
228
|
-
const hostContext = result?.hostContext;
|
|
229
|
-
currentDisplayMode = hostContext?.displayMode ?? 'inline';
|
|
230
|
-
canFullscreen = hostContext?.availableDisplayModes?.includes('fullscreen') ?? false;
|
|
231
|
-
} catch (error) {
|
|
232
|
-
console.error('Failed to connect to MCP host:', error);
|
|
233
|
-
loading.textContent = 'Failed to connect: ' + error.message;
|
|
234
|
-
loading.style.color = '#cc0000';
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
init();
|
|
239
|
-
</script>
|
|
240
|
-
</body>
|
|
241
|
-
</html>`;
|
|
242
|
-
return {
|
|
243
|
-
contents: [
|
|
244
|
-
{
|
|
245
|
-
uri: this.uri,
|
|
246
|
-
mimeType: server_1.RESOURCE_MIME_TYPE,
|
|
247
|
-
text: html,
|
|
248
|
-
_meta: {
|
|
249
|
-
ui: {
|
|
250
|
-
csp: {
|
|
251
|
-
connectDomains: ['https://api.mapbox.com'],
|
|
252
|
-
resourceDomains: ['https://api.mapbox.com']
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
]
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
exports.StaticMapUIResource = StaticMapUIResource;
|
|
262
|
-
//# sourceMappingURL=StaticMapUIResource.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StaticMapUIResource.js","sourceRoot":"","sources":["../../../../src/resources/ui-apps/StaticMapUIResource.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAQlC,kEAA2E;AAC3E,wDAAkD;AAElD;;;GAGG;AACH,MAAa,mBAAoB,SAAQ,8BAAY;IAC1C,IAAI,GAAG,uBAAuB,CAAC;IAC/B,GAAG,GAAG,mCAAmC,CAAC;IAC1C,WAAW,GAClB,4DAA4D,CAAC;IACtD,QAAQ,GAAG,2BAAkB,CAAC;IAEvC,KAAK,CAAC,IAAI;IACR,6DAA6D;IAC7D,IAAY;IACZ,6DAA6D;IAC7D,MAA+D;QAE/D,4EAA4E;QAC5E,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0NT,CAAC;QAEL,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,QAAQ,EAAE,2BAAkB;oBAC5B,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE;wBACL,EAAE,EAAE;4BACF,GAAG,EAAE;gCACH,cAAc,EAAE,CAAC,wBAAwB,CAAC;gCAC1C,eAAe,EAAE,CAAC,wBAAwB,CAAC;6BAC5C;yBACF;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF;AA5PD,kDA4PC"}
|