@dbx-tools/model 0.9.32 → 0.9.36
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 +3 -3
- package/exports.ts +1 -0
- package/index.ts +12 -8
- package/lib/index.d.ts +12 -8
- package/lib/index.js +8 -5
- package/lib/scripts/generate-metadata.d.ts +1 -0
- package/lib/scripts/generate-metadata.js +65 -0
- package/lib/src/_metadata-contract.d.ts +12 -6
- package/lib/src/_metadata-contract.js +3 -1
- package/lib/src/_metadata-generator.d.ts +3 -1
- package/lib/src/_metadata-generator.js +148 -1
- package/lib/src/_ranking.js +39 -12
- package/lib/src/_selection.d.ts +1 -17
- package/lib/src/_selection.js +1 -1
- package/lib/src/classify.d.ts +1 -17
- package/lib/src/classify.js +1 -1
- package/lib/src/generated/model-reasoning.json +147 -0
- package/lib/src/invoke.d.ts +8 -0
- package/lib/src/invoke.js +13 -1
- package/lib/src/metadata-cache.d.ts +84 -0
- package/lib/src/metadata-cache.js +226 -0
- package/lib/src/metadata.d.ts +52 -17
- package/lib/src/metadata.js +251 -18
- package/lib/src/model-catalog.d.ts +1 -19
- package/lib/src/model-catalog.js +9 -2
- package/lib/src/model-client.d.ts +11 -19
- package/lib/src/model-client.js +42 -24
- package/lib/src/reasoning-translation.d.ts +105 -0
- package/lib/src/reasoning-translation.js +444 -0
- package/lib/src/resolve.d.ts +2 -4
- package/lib/src/resolve.js +2 -2
- package/lib/src/serving-wire.d.ts +37 -0
- package/lib/src/serving-wire.js +211 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +110 -17
- package/src/_metadata-contract.ts +17 -7
- package/src/_metadata-generator.ts +160 -0
- package/src/_ranking.ts +40 -11
- package/src/_selection.ts +4 -19
- package/src/classify.ts +2 -18
- package/src/generated/model-reasoning.json +147 -0
- package/src/invoke.ts +16 -0
- package/src/metadata-cache.ts +307 -0
- package/src/metadata.ts +334 -43
- package/src/model-catalog.ts +8 -25
- package/src/model-client.ts +67 -44
- package/src/reasoning-translation.ts +495 -0
- package/src/resolve.ts +10 -11
- package/src/serving-wire.ts +231 -0
- package/lib/src/python.d.ts +0 -2
- package/lib/src/python.js +0 -3
- package/src/python.ts +0 -2
package/README.md
CHANGED
|
@@ -76,8 +76,8 @@ const response = await fetch(route.url, {
|
|
|
76
76
|
});
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
`createModelClient()` is the portable auth-backed facade
|
|
80
|
-
|
|
79
|
+
`createModelClient()` is the portable auth-backed facade used by Node clients.
|
|
80
|
+
It lists and normalizes endpoints, caches one
|
|
81
81
|
catalogue per host, workspace ID, and principal, refreshes once after an
|
|
82
82
|
unmatched fuzzy request, resolves routes, returns complete authentication
|
|
83
83
|
headers, exposes profiles, and returns the package's generated metadata. Its
|
|
@@ -240,7 +240,7 @@ const status = metadata.modelStatusFor("system.ai.gemini-2-5-pro");
|
|
|
240
240
|
```
|
|
241
241
|
|
|
242
242
|
The package ships committed snapshots generated from Databricks documentation
|
|
243
|
-
by `bun run model
|
|
243
|
+
by `bun run --filter '@dbx-tools/model' metadata`. Runtime calls normalize endpoint, display,
|
|
244
244
|
foundation-model, and provider identities into memoized sets and maps; they do
|
|
245
245
|
not fetch documentation. `modelMetadataFor()` returns status, capabilities, and
|
|
246
246
|
published limits together for a string or `ServingEndpointSummary`.
|
package/exports.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createModelClient } from "./src/model-client.ts";
|
package/index.ts
CHANGED
|
@@ -3,27 +3,31 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.36";
|
|
7
7
|
export * as classes from "./src/classes.ts";
|
|
8
8
|
export * as classify from "./src/classify.ts";
|
|
9
9
|
export * as fallback from "./src/fallback.ts";
|
|
10
10
|
export * as invoke from "./src/invoke.ts";
|
|
11
11
|
export * as metadata from "./src/metadata.ts";
|
|
12
|
+
export * as metadataCache from "./src/metadata-cache.ts";
|
|
12
13
|
export * as modelCatalog from "./src/model-catalog.ts";
|
|
13
14
|
export * as modelClient from "./src/model-client.ts";
|
|
14
15
|
export * as policy from "./src/policy.ts";
|
|
15
|
-
export * as
|
|
16
|
+
export * as reasoningTranslation from "./src/reasoning-translation.ts";
|
|
16
17
|
export * as resolve from "./src/resolve.ts";
|
|
18
|
+
export * as servingWire from "./src/serving-wire.ts";
|
|
17
19
|
export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
|
|
18
|
-
export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
|
|
19
20
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
20
|
-
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.ts";
|
|
21
|
+
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
|
21
22
|
export type { AuthenticatingClientLike } from "./src/invoke.ts";
|
|
22
|
-
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
23
|
-
export type {
|
|
23
|
+
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
24
|
+
export type { MetadataCacheRecord, MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
|
|
24
25
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
|
|
25
|
-
export type { WorkspaceClientLike, ListServingEndpointsOptions
|
|
26
|
+
export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
|
|
26
27
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.ts";
|
|
27
|
-
export type { ModelClientOptions, ModelClientStatus, ModelProtocol, ModelRouteInput, ModelRoute, ModelClient } from "./src/model-client.ts";
|
|
28
|
+
export type { ModelAuthOptions, ModelClientOptions, ModelClientStatus, ModelProtocol, ModelRouteInput, ModelRoute, ModelClient } from "./src/model-client.ts";
|
|
29
|
+
export { REASONING_LEVELS } from "./src/reasoning-translation.ts";
|
|
30
|
+
export type { ReasoningLevel, ReasoningModelCatalogue, AdaptedRequestReasoning } from "./src/reasoning-translation.ts";
|
|
28
31
|
export type { SelectModelInput, SearchModelsInput } from "./src/resolve.ts";
|
|
32
|
+
export type { ServingChatMessage, RewrittenServingRequest } from "./src/serving-wire.ts";
|
|
29
33
|
export * from "./exports.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.36";
|
|
3
3
|
export * as classes from "./src/classes.ts";
|
|
4
4
|
export * as classify from "./src/classify.ts";
|
|
5
5
|
export * as fallback from "./src/fallback.ts";
|
|
6
6
|
export * as invoke from "./src/invoke.ts";
|
|
7
7
|
export * as metadata from "./src/metadata.ts";
|
|
8
|
+
export * as metadataCache from "./src/metadata-cache.ts";
|
|
8
9
|
export * as modelCatalog from "./src/model-catalog.ts";
|
|
9
10
|
export * as modelClient from "./src/model-client.ts";
|
|
10
11
|
export * as policy from "./src/policy.ts";
|
|
11
|
-
export * as
|
|
12
|
+
export * as reasoningTranslation from "./src/reasoning-translation.ts";
|
|
12
13
|
export * as resolve from "./src/resolve.ts";
|
|
14
|
+
export * as servingWire from "./src/serving-wire.ts";
|
|
13
15
|
export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
|
|
14
|
-
export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
|
|
15
16
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
|
|
16
|
-
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.ts";
|
|
17
|
+
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.ts";
|
|
17
18
|
export type { AuthenticatingClientLike } from "./src/invoke.ts";
|
|
18
|
-
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
19
|
-
export type {
|
|
19
|
+
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.ts";
|
|
20
|
+
export type { MetadataCacheRecord, MetadataCacheOptions, MetadataCacheMergeInput, MetadataCache } from "./src/metadata-cache.ts";
|
|
20
21
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
|
|
21
|
-
export type { WorkspaceClientLike, ListServingEndpointsOptions
|
|
22
|
+
export type { WorkspaceClientLike, ListServingEndpointsOptions } from "./src/model-catalog.ts";
|
|
22
23
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.ts";
|
|
23
|
-
export type { ModelClientOptions, ModelClientStatus, ModelProtocol, ModelRouteInput, ModelRoute, ModelClient } from "./src/model-client.ts";
|
|
24
|
+
export type { ModelAuthOptions, ModelClientOptions, ModelClientStatus, ModelProtocol, ModelRouteInput, ModelRoute, ModelClient } from "./src/model-client.ts";
|
|
25
|
+
export { REASONING_LEVELS } from "./src/reasoning-translation.ts";
|
|
26
|
+
export type { ReasoningLevel, ReasoningModelCatalogue, AdaptedRequestReasoning } from "./src/reasoning-translation.ts";
|
|
24
27
|
export type { SelectModelInput, SearchModelsInput } from "./src/resolve.ts";
|
|
28
|
+
export type { ServingChatMessage, RewrittenServingRequest } from "./src/serving-wire.ts";
|
|
25
29
|
export * from "./exports.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,22 +2,25 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.36";
|
|
6
6
|
export * as classes from "./src/classes.js";
|
|
7
7
|
export * as classify from "./src/classify.js";
|
|
8
8
|
export * as fallback from "./src/fallback.js";
|
|
9
9
|
export * as invoke from "./src/invoke.js";
|
|
10
10
|
export * as metadata from "./src/metadata.js";
|
|
11
|
+
export * as metadataCache from "./src/metadata-cache.js";
|
|
11
12
|
export * as modelCatalog from "./src/model-catalog.js";
|
|
12
13
|
export * as modelClient from "./src/model-client.js";
|
|
13
14
|
export * as policy from "./src/policy.js";
|
|
14
|
-
export * as
|
|
15
|
+
export * as reasoningTranslation from "./src/reasoning-translation.js";
|
|
15
16
|
export * as resolve from "./src/resolve.js";
|
|
17
|
+
export * as servingWire from "./src/serving-wire.js";
|
|
16
18
|
export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.js";
|
|
17
19
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.js";
|
|
18
|
-
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.js";
|
|
19
|
-
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.js";
|
|
20
|
+
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH, AI_GATEWAY_CODEX_RESPONSES_PATH, ANTHROPIC_MESSAGES_PATH } from "./src/invoke.js";
|
|
21
|
+
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL } from "./src/metadata.js";
|
|
20
22
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.js";
|
|
21
23
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
|
|
24
|
+
export { REASONING_LEVELS } from "./src/reasoning-translation.js";
|
|
22
25
|
export * from "./exports.js";
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssYUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxvQkFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNLLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxMLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSWxFLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9tb2RlbFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjM2XCI7XG5leHBvcnQgKiBhcyBjbGFzc2VzIGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGZhbGxiYWNrIGZyb20gXCIuL3NyYy9mYWxsYmFjay50c1wiO1xuZXhwb3J0ICogYXMgaW52b2tlIGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhIGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0ICogYXMgbWV0YWRhdGFDYWNoZSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2F0YWxvZyBmcm9tIFwiLi9zcmMvbW9kZWwtY2F0YWxvZy50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWxDbGllbnQgZnJvbSBcIi4vc3JjL21vZGVsLWNsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgcG9saWN5IGZyb20gXCIuL3NyYy9wb2xpY3kudHNcIjtcbmV4cG9ydCAqIGFzIHJlYXNvbmluZ1RyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHJlc29sdmUgZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpbmdXaXJlIGZyb20gXCIuL3NyYy9zZXJ2aW5nLXdpcmUudHNcIjtcbmV4cG9ydCB7IENIQVRfQ0xBU1NfT1JERVIsIE1PREVMX0NMQVNTX09SREVSIH0gZnJvbSBcIi4vc3JjL2NsYXNzZXMudHNcIjtcbmV4cG9ydCB7IEZBTExCQUNLX01PREVMX0lEUyB9IGZyb20gXCIuL3NyYy9mYWxsYmFjay50c1wiO1xuZXhwb3J0IHsgSU5WT0NBVElPTlNfU1VGRklYLCBSRVNQT05TRVNfUEFUSCwgT1BFTl9SRVNQT05TRVNfUEFUSCwgQ0hBVF9DT01QTEVUSU9OU19QQVRILCBBSV9HQVRFV0FZX0NPREVYX1JFU1BPTlNFU19QQVRILCBBTlRIUk9QSUNfTUVTU0FHRVNfUEFUSCB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0aGVudGljYXRpbmdDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2ludm9rZS50c1wiO1xuZXhwb3J0IHsgTU9ERUxfTUVUQURBVEFfVFRMX01TLCBNT0RFTF9SQVRFX0xJTUlUU19VUkwsIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCwgUVVFUllfUkVBU09OX01PREVMU19VUkwsIFJFVElSRURfTU9ERUxTX1VSTCwgV0VCX1NFQVJDSF9NT0RFTFNfVVJMIH0gZnJvbSBcIi4vc3JjL21ldGFkYXRhLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1ldGFkYXRhQ2FjaGVSZWNvcmQsIE1ldGFkYXRhQ2FjaGVPcHRpb25zLCBNZXRhZGF0YUNhY2hlTWVyZ2VJbnB1dCwgTWV0YWRhdGFDYWNoZSB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS1jYWNoZS50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMsIERFRkFVTFRfRlVaWllfVEhSRVNIT0xEIH0gZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSwgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxBdXRoT3B0aW9ucywgTW9kZWxDbGllbnRPcHRpb25zLCBNb2RlbENsaWVudFN0YXR1cywgTW9kZWxQcm90b2NvbCwgTW9kZWxSb3V0ZUlucHV0LCBNb2RlbFJvdXRlLCBNb2RlbENsaWVudCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCB7IFJFQVNPTklOR19MRVZFTFMgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlYXNvbmluZ0xldmVsLCBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSwgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlLCBSZXdyaXR0ZW5TZXJ2aW5nUmVxdWVzdCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLXdpcmUudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4cG9ydHMudHNcIjtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "../src/_metadata-contract.js";
|
|
5
|
+
import { parseModelCapabilities, parseModelRateLimits, parseReasoningModels, parseRetiredModels, } from "../src/_metadata-generator.js";
|
|
6
|
+
const repositoryRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../../../..");
|
|
7
|
+
const nodeOutput = resolve(repositoryRoot, "packages/js/node/model/src/generated");
|
|
8
|
+
const now = Math.floor(Date.now() / 1000);
|
|
9
|
+
await Promise.all([
|
|
10
|
+
refreshSnapshot("retired-models.json", async () => parseRetiredModels(await loadPage(RETIRED_MODELS_URL), now)),
|
|
11
|
+
refreshSnapshot("model-capabilities.json", async () => {
|
|
12
|
+
const [responsesHtml, webSearchHtml] = await Promise.all([
|
|
13
|
+
loadPage(OPENAI_RESPONSES_MODELS_URL),
|
|
14
|
+
loadPage(WEB_SEARCH_MODELS_URL),
|
|
15
|
+
]);
|
|
16
|
+
return parseModelCapabilities(responsesHtml, webSearchHtml, now);
|
|
17
|
+
}),
|
|
18
|
+
refreshSnapshot("model-rate-limits.json", async () => parseModelRateLimits(await loadPage(MODEL_RATE_LIMITS_URL), now)),
|
|
19
|
+
refreshSnapshot("model-reasoning.json", async () => parseReasoningModels(await loadPage(QUERY_REASON_MODELS_URL), now)),
|
|
20
|
+
]);
|
|
21
|
+
async function refreshSnapshot(filename, loadSnapshot) {
|
|
22
|
+
const primaryPath = resolve(nodeOutput, filename);
|
|
23
|
+
const existing = await readSnapshot(primaryPath);
|
|
24
|
+
if (existing && now - existing.generatedAt < MODEL_METADATA_TTL_MS / 1000) {
|
|
25
|
+
await writeSnapshot(primaryPath, existing);
|
|
26
|
+
console.log(`${filename}: current`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const snapshot = await loadSnapshot();
|
|
31
|
+
await writeSnapshot(primaryPath, snapshot);
|
|
32
|
+
console.log(`${filename}: refreshed`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (!existing)
|
|
36
|
+
throw error;
|
|
37
|
+
await writeSnapshot(primaryPath, existing);
|
|
38
|
+
console.warn(`${filename}: refresh failed; retained committed snapshot`, error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function loadPage(url) {
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
headers: { "user-agent": "dbx-tools-model-metadata/1" },
|
|
44
|
+
signal: AbortSignal.timeout(15_000),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
throw new Error(`Databricks documentation returned HTTP ${response.status}: ${url}`);
|
|
48
|
+
}
|
|
49
|
+
return response.text();
|
|
50
|
+
}
|
|
51
|
+
async function readSnapshot(path) {
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function writeSnapshot(path, snapshot) {
|
|
60
|
+
await mkdir(dirname(path), { recursive: true });
|
|
61
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
62
|
+
await writeFile(temporary, `${JSON.stringify(snapshot, null, 2)}\n`);
|
|
63
|
+
await rename(temporary, path);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtbWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zY3JpcHRzL2dlbmVyYXRlLW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwrQkFBK0IsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7QUFDbkYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFFMUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ2hCLGVBQWUsQ0FBd0IscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FDdkUsa0JBQWtCLENBQUMsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FDNUQ7SUFDRCxlQUFlLENBQTRCLHlCQUF5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RSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDL0MsTUFBTSxTQUFTLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgcmVuYW1lLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxSYXRlTGltaXRzU25hcHNob3QsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG4gIHR5cGUgUmV0aXJlZE1vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi4vc3JjL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuaW1wb3J0IHtcbiAgcGFyc2VNb2RlbENhcGFiaWxpdGllcyxcbiAgcGFyc2VNb2RlbFJhdGVMaW1pdHMsXG4gIHBhcnNlUmVhc29uaW5nTW9kZWxzLFxuICBwYXJzZVJldGlyZWRNb2RlbHMsXG59IGZyb20gXCIuLi9zcmMvX21ldGFkYXRhLWdlbmVyYXRvci50c1wiO1xuXG5jb25zdCByZXBvc2l0b3J5Um9vdCA9IHJlc29sdmUoZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpLCBcIi4uLy4uLy4uLy4uLy4uXCIpO1xuY29uc3Qgbm9kZU91dHB1dCA9IHJlc29sdmUocmVwb3NpdG9yeVJvb3QsIFwicGFja2FnZXMvanMvbm9kZS9tb2RlbC9zcmMvZ2VuZXJhdGVkXCIpO1xuY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbmF3YWl0IFByb21pc2UuYWxsKFtcbiAgcmVmcmVzaFNuYXBzaG90PFJldGlyZWRNb2RlbHNTbmFwc2hvdD4oXCJyZXRpcmVkLW1vZGVscy5qc29uXCIsIGFzeW5jICgpID0+XG4gICAgcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vdyksXG4gICksXG4gIHJlZnJlc2hTbmFwc2hvdDxNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90PihcIm1vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmVzcG9uc2VzSHRtbCwgd2ViU2VhcmNoSHRtbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBsb2FkUGFnZShPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwpLFxuICAgICAgbG9hZFBhZ2UoV0VCX1NFQVJDSF9NT0RFTFNfVVJMKSxcbiAgICBdKTtcbiAgICByZXR1cm4gcGFyc2VNb2RlbENhcGFiaWxpdGllcyhyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sLCBub3cpO1xuICB9KSxcbiAgcmVmcmVzaFNuYXBzaG90PE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90PihcIm1vZGVsLXJhdGUtbGltaXRzLmpzb25cIiwgYXN5bmMgKCkgPT5cbiAgICBwYXJzZU1vZGVsUmF0ZUxpbWl0cyhhd2FpdCBsb2FkUGFnZShNT0RFTF9SQVRFX0xJTUlUU19VUkwpLCBub3cpLFxuICApLFxuICByZWZyZXNoU25hcHNob3Q8UmVhc29uaW5nTW9kZWxzU25hcHNob3Q+KFwibW9kZWwtcmVhc29uaW5nLmpzb25cIiwgYXN5bmMgKCkgPT5cbiAgICBwYXJzZVJlYXNvbmluZ01vZGVscyhhd2FpdCBsb2FkUGFnZShRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCksIG5vdyksXG4gICksXG5dKTtcblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFNuYXBzaG90PFQgZXh0ZW5kcyB7IHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXIgfT4oXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGxvYWRTbmFwc2hvdDogKCkgPT4gUHJvbWlzZTxUPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmltYXJ5UGF0aCA9IHJlc29sdmUobm9kZU91dHB1dCwgZmlsZW5hbWUpO1xuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRTbmFwc2hvdDxUPihwcmltYXJ5UGF0aCk7XG4gIGlmIChleGlzdGluZyAmJiBub3cgLSBleGlzdGluZy5nZW5lcmF0ZWRBdCA8IE1PREVMX01FVEFEQVRBX1RUTF9NUyAvIDEwMDApIHtcbiAgICBhd2FpdCB3cml0ZVNuYXBzaG90KHByaW1hcnlQYXRoLCBleGlzdGluZyk7XG4gICAgY29uc29sZS5sb2coYCR7ZmlsZW5hbWV9OiBjdXJyZW50YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBsb2FkU25hcHNob3QoKTtcbiAgICBhd2FpdCB3cml0ZVNuYXBzaG90KHByaW1hcnlQYXRoLCBzbmFwc2hvdCk7XG4gICAgY29uc29sZS5sb2coYCR7ZmlsZW5hbWV9OiByZWZyZXNoZWRgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWV4aXN0aW5nKSB0aHJvdyBlcnJvcjtcbiAgICBhd2FpdCB3cml0ZVNuYXBzaG90KHByaW1hcnlQYXRoLCBleGlzdGluZyk7XG4gICAgY29uc29sZS53YXJuKGAke2ZpbGVuYW1lfTogcmVmcmVzaCBmYWlsZWQ7IHJldGFpbmVkIGNvbW1pdHRlZCBzbmFwc2hvdGAsIGVycm9yKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkUGFnZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogeyBcInVzZXItYWdlbnRcIjogXCJkYngtdG9vbHMtbW9kZWwtbWV0YWRhdGEvMVwiIH0sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dXJsfWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTbmFwc2hvdDxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIikpIGFzIFQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTbmFwc2hvdChwYXRoOiBzdHJpbmcsIHNuYXBzaG90OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbWtkaXIoZGlybmFtZShwYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHRlbXBvcmFyeSA9IGAke3BhdGh9LiR7cHJvY2Vzcy5waWR9LnRtcGA7XG4gIGF3YWl0IHdyaXRlRmlsZSh0ZW1wb3JhcnksIGAke0pTT04uc3RyaW5naWZ5KHNuYXBzaG90LCBudWxsLCAyKX1cXG5gKTtcbiAgYXdhaXQgcmVuYW1lKHRlbXBvcmFyeSwgcGF0aCk7XG59XG4iXX0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ModelRateLimits } from "@dbx-tools/shared-model/contracts";
|
|
1
2
|
/** One day, matching the refresh cadence of Databricks model documentation. */
|
|
2
3
|
export declare const MODEL_METADATA_TTL_MS: number;
|
|
3
4
|
/** Databricks documentation URL for retired foundation models. */
|
|
@@ -8,6 +9,8 @@ export declare const OPENAI_RESPONSES_MODELS_URL = "https://docs.databricks.com/
|
|
|
8
9
|
export declare const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/web-search";
|
|
9
10
|
/** Databricks documentation URL for Foundation Model API limits. */
|
|
10
11
|
export declare const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
|
|
12
|
+
/** Databricks documentation URL for reasoning-effort model policy. */
|
|
13
|
+
export declare const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
|
|
11
14
|
/** Build-generated retired-model snapshot. */
|
|
12
15
|
export interface RetiredModelsSnapshot {
|
|
13
16
|
readonly generatedAt: number;
|
|
@@ -25,12 +28,6 @@ export interface ModelCapabilitiesSnapshot {
|
|
|
25
28
|
readonly generatedAt: number;
|
|
26
29
|
readonly capabilities: ModelCapabilityCatalogue;
|
|
27
30
|
}
|
|
28
|
-
/** Published pay-per-token limits for one model. */
|
|
29
|
-
export interface ModelRateLimits {
|
|
30
|
-
readonly inputTokensPerMinute: number | null;
|
|
31
|
-
readonly outputTokensPerMinute: number | null;
|
|
32
|
-
readonly queriesPerHour: number | null;
|
|
33
|
-
}
|
|
34
31
|
/** Model limits keyed by normalized Databricks model identity. */
|
|
35
32
|
export interface ModelRateLimitCatalogue {
|
|
36
33
|
readonly models: Readonly<Record<string, ModelRateLimits>>;
|
|
@@ -40,3 +37,12 @@ export interface ModelRateLimitsSnapshot {
|
|
|
40
37
|
readonly generatedAt: number;
|
|
41
38
|
readonly catalogue: ModelRateLimitCatalogue;
|
|
42
39
|
}
|
|
40
|
+
/** Documented generic reasoning levels keyed by normalized model identity. */
|
|
41
|
+
export interface ReasoningModelCatalogue {
|
|
42
|
+
readonly models: Readonly<Record<string, readonly string[]>>;
|
|
43
|
+
}
|
|
44
|
+
/** Build-generated reasoning-effort documentation snapshot. */
|
|
45
|
+
export interface ReasoningModelsSnapshot {
|
|
46
|
+
readonly generatedAt: number;
|
|
47
|
+
readonly catalogue: ReasoningModelCatalogue;
|
|
48
|
+
}
|
|
@@ -8,4 +8,6 @@ export const OPENAI_RESPONSES_MODELS_URL = "https://docs.databricks.com/aws/en/m
|
|
|
8
8
|
export const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/web-search";
|
|
9
9
|
/** Databricks documentation URL for Foundation Model API limits. */
|
|
10
10
|
export const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
|
|
11
|
-
|
|
11
|
+
/** Databricks documentation URL for reasoning-effort model policy. */
|
|
12
|
+
export const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19tZXRhZGF0YS1jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXpELGtFQUFrRTtBQUNsRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FDN0IsMkVBQTJFLENBQUM7QUFFOUUsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUN0QywwRkFBMEYsQ0FBQztBQUU3Rix3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLDhFQUE4RSxDQUFDO0FBRWpGLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsa0ZBQWtGLENBQUM7QUFFckYsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUNsQyx1RkFBdUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTW9kZWxSYXRlTGltaXRzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG4vKiogT25lIGRheSwgbWF0Y2hpbmcgdGhlIHJlZnJlc2ggY2FkZW5jZSBvZiBEYXRhYnJpY2tzIG1vZGVsIGRvY3VtZW50YXRpb24uICovXG5leHBvcnQgY29uc3QgTU9ERUxfTUVUQURBVEFfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJldGlyZWQgZm91bmRhdGlvbiBtb2RlbHMuICovXG5leHBvcnQgY29uc3QgUkVUSVJFRF9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvcmV0aXJlZC1tb2RlbHMtcG9saWN5XCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBPcGVuQUkgUmVzcG9uc2VzIG1vZGVsIHN1cHBvcnQuICovXG5leHBvcnQgY29uc3QgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1vcGVuYWktcmVzcG9uc2VzXCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBzdXBwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL21vZGVsLXNlcnZpbmcvd2ViLXNlYXJjaFwiO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgRm91bmRhdGlvbiBNb2RlbCBBUEkgbGltaXRzLiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX1JBVEVfTElNSVRTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL2ZvdW5kYXRpb24tbW9kZWwtYXBpcy9saW1pdHNcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJlYXNvbmluZy1lZmZvcnQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGNvbnN0IFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1yZWFzb24tbW9kZWxzXCI7XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgcmV0aXJlZC1tb2RlbCBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0aXJlZE1vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbW9kZWxzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgbW9kZWwgaWRlbnRpdGllcyBncm91cGVkIGJ5IGRvY3VtZW50ZWQgY2FwYWJpbGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgcmVzcG9uc2VzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VJbnB1dDogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGFwcGx5UGF0Y2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB3ZWJTZWFyY2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogQnVpbGQtZ2VuZXJhdGVkIG1vZGVsLWNhcGFiaWxpdHkgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcbn1cblxuLyoqIE1vZGVsIGxpbWl0cyBrZXllZCBieSBub3JtYWxpemVkIERhdGFicmlja3MgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbC1yYXRlLWxpbWl0IHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhdGFsb2d1ZTogTW9kZWxSYXRlTGltaXRDYXRhbG9ndWU7XG59XG5cbi8qKiBEb2N1bWVudGVkIGdlbmVyaWMgcmVhc29uaW5nIGxldmVscyBrZXllZCBieSBub3JtYWxpemVkIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCByZWFzb25pbmctZWZmb3J0IGRvY3VtZW50YXRpb24gc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cbiJdfQ==
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { ModelCapabilitiesSnapshot, ModelRateLimitsSnapshot, RetiredModelsSnapshot } from "./_metadata-contract.ts";
|
|
1
|
+
import type { ModelCapabilitiesSnapshot, ModelRateLimitsSnapshot, ReasoningModelsSnapshot, RetiredModelsSnapshot } from "./_metadata-contract.ts";
|
|
2
2
|
/** Parse retired model names from Databricks retirement-policy HTML. */
|
|
3
3
|
export declare function parseRetiredModels(html: string, generatedAt: number): RetiredModelsSnapshot;
|
|
4
4
|
/** Parse Responses and web-search documentation into model capability sets. */
|
|
5
5
|
export declare function parseModelCapabilities(responsesHtml: string, webSearchHtml: string, generatedAt: number): ModelCapabilitiesSnapshot;
|
|
6
6
|
/** Parse pay-per-token limits from Databricks Foundation Model API HTML. */
|
|
7
7
|
export declare function parseModelRateLimits(html: string, generatedAt: number): ModelRateLimitsSnapshot;
|
|
8
|
+
/** Parse reasoning-effort ladders from the Query reasoning models HTML table. */
|
|
9
|
+
export declare function parseReasoningModels(html: string, generatedAt: number): ReasoningModelsSnapshot;
|
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
import { load } from "cheerio";
|
|
2
2
|
import { modelSearchQuery } from "./policy.js";
|
|
3
|
+
import { parseReasoning, REASONING_LEVELS, uniqueReasoningLevels, } from "./reasoning-translation.js";
|
|
4
|
+
const ACCEPTED_VALUES_PATTERN = /(?:accepted values(?:\s+are|\s+vary)?|accepts(?:\s+values?(?:\s+of)?)?)\s*:?\s*([^.]+)/gi;
|
|
5
|
+
const FOR_MODEL_PATTERN = /For\s+([^,]+?),\s+(?:this parameter accepts(?:\s+values?\s+of)?|the (?:`?reasoning_effort`?|effort) parameter accepts(?:\s+values?\s+of)?)\s*([^.]+)/gi;
|
|
6
|
+
const TOKEN_PATTERN = /'([^']+)'|"([^"]+)"|`([^`]+)`|\b([a-z][a-z0-9_-]*)\b/gi;
|
|
7
|
+
const MODEL_CODE_PATTERN = /\bdatabricks-[a-z0-9][a-z0-9._-]*/gi;
|
|
8
|
+
/** Wire tokens advertised in Databricks docs; excludes prose words like `default`. */
|
|
9
|
+
const DOCUMENTATION_EFFORT_TOKENS = new Set([
|
|
10
|
+
"none",
|
|
11
|
+
"minimal",
|
|
12
|
+
"low",
|
|
13
|
+
"medium",
|
|
14
|
+
"high",
|
|
15
|
+
"xhigh",
|
|
16
|
+
"extra-high",
|
|
17
|
+
"extrahigh",
|
|
18
|
+
"ultra",
|
|
19
|
+
"ultra-high",
|
|
20
|
+
"max",
|
|
21
|
+
"maximum",
|
|
22
|
+
"disabled",
|
|
23
|
+
]);
|
|
3
24
|
/** Parse retired model names from Databricks retirement-policy HTML. */
|
|
4
25
|
export function parseRetiredModels(html, generatedAt) {
|
|
5
26
|
const $ = load(html);
|
|
@@ -85,6 +106,132 @@ export function parseModelRateLimits(html, generatedAt) {
|
|
|
85
106
|
}
|
|
86
107
|
return { generatedAt, catalogue: { models: sortRecord(models) } };
|
|
87
108
|
}
|
|
109
|
+
/** Parse reasoning-effort ladders from the Query reasoning models HTML table. */
|
|
110
|
+
export function parseReasoningModels(html, generatedAt) {
|
|
111
|
+
const $ = load(html);
|
|
112
|
+
const models = {};
|
|
113
|
+
$("table").each((_, table) => {
|
|
114
|
+
const rows = $(table).find("tr");
|
|
115
|
+
const headers = $(rows.get(0))
|
|
116
|
+
.find("th, td")
|
|
117
|
+
.toArray()
|
|
118
|
+
.map((cell) => collapseText($(cell)).toLowerCase());
|
|
119
|
+
if (!headers.some((header) => header.includes("model")))
|
|
120
|
+
return;
|
|
121
|
+
if (!headers.some((header) => header.includes("parameter")))
|
|
122
|
+
return;
|
|
123
|
+
rows.slice(1).each((__, row) => {
|
|
124
|
+
const cells = $(row).find("th, td").toArray().map((cell) => $(cell));
|
|
125
|
+
if (cells.length < 2)
|
|
126
|
+
return;
|
|
127
|
+
const modelNames = reasoningModelNamesFromCell(cells[0], $);
|
|
128
|
+
if (modelNames.length === 0)
|
|
129
|
+
return;
|
|
130
|
+
const parametersText = collapseText(cells[cells.length - 1]);
|
|
131
|
+
const perModel = reasoningLevelsByModelSection(parametersText, modelNames);
|
|
132
|
+
if (Object.keys(perModel).length > 0) {
|
|
133
|
+
for (const [key, levels] of Object.entries(perModel)) {
|
|
134
|
+
if (levels.length > 0)
|
|
135
|
+
models[key] = sortReasoningLevels(levels);
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const shared = sortReasoningLevels(extractAcceptedReasoningLevels(parametersText));
|
|
140
|
+
if (shared.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
for (const name of modelNames) {
|
|
143
|
+
const key = modelKey(name);
|
|
144
|
+
if (key)
|
|
145
|
+
models[key] = shared;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
if (Object.keys(models).length === 0) {
|
|
150
|
+
throw new Error("Databricks reasoning documentation contained no model effort ladders");
|
|
151
|
+
}
|
|
152
|
+
return { generatedAt, catalogue: { models: sortRecord(models) } };
|
|
153
|
+
}
|
|
154
|
+
function reasoningModelNamesFromCell(cell, $) {
|
|
155
|
+
const names = new Set();
|
|
156
|
+
cell.find("code").each((_, code) => {
|
|
157
|
+
const text = collapseText($(code));
|
|
158
|
+
if (text.startsWith("databricks-"))
|
|
159
|
+
names.add(text);
|
|
160
|
+
});
|
|
161
|
+
if (names.size === 0) {
|
|
162
|
+
for (const match of collapseText(cell).matchAll(MODEL_CODE_PATTERN)) {
|
|
163
|
+
names.add(match[0]);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [...names];
|
|
167
|
+
}
|
|
168
|
+
function extractAcceptedReasoningLevels(text) {
|
|
169
|
+
const levels = [];
|
|
170
|
+
for (const match of text.matchAll(ACCEPTED_VALUES_PATTERN)) {
|
|
171
|
+
const fragment = match[1];
|
|
172
|
+
if (!fragment || /vary by model/i.test(fragment))
|
|
173
|
+
continue;
|
|
174
|
+
levels.push(...documentationEffortLevels(fragment));
|
|
175
|
+
}
|
|
176
|
+
return levels;
|
|
177
|
+
}
|
|
178
|
+
function reasoningLevelsByModelSection(parametersText, rowModels) {
|
|
179
|
+
const result = {};
|
|
180
|
+
for (const match of parametersText.matchAll(FOR_MODEL_PATTERN)) {
|
|
181
|
+
const label = match[1]?.trim();
|
|
182
|
+
const fragment = match[2];
|
|
183
|
+
if (!label || !fragment)
|
|
184
|
+
continue;
|
|
185
|
+
const levels = uniqueReasoningLevels(documentationEffortLevels(fragment));
|
|
186
|
+
if (levels.length === 0)
|
|
187
|
+
continue;
|
|
188
|
+
const matched = rowModels.filter((model) => reasoningModelLabelMatches(label, model));
|
|
189
|
+
// Only attach explicit "For <model>" clauses to models listed in the row.
|
|
190
|
+
if (matched.length === 0)
|
|
191
|
+
continue;
|
|
192
|
+
for (const target of matched) {
|
|
193
|
+
const key = modelKey(target);
|
|
194
|
+
if (key)
|
|
195
|
+
result[key] = sortReasoningLevels(levels);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
function documentationEffortLevels(fragment) {
|
|
201
|
+
return reasoningTokensFromFragment(fragment).flatMap((token) => {
|
|
202
|
+
const normalized = token.toLowerCase().replace(/[_\s]+/g, "-");
|
|
203
|
+
if (!DOCUMENTATION_EFFORT_TOKENS.has(normalized) &&
|
|
204
|
+
!DOCUMENTATION_EFFORT_TOKENS.has(token.toLowerCase())) {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
const level = parseReasoning(token);
|
|
208
|
+
return level ? [level] : [];
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function sortReasoningLevels(levels) {
|
|
212
|
+
return uniqueReasoningLevels(levels).sort((left, right) => REASONING_LEVELS.indexOf(left) - REASONING_LEVELS.indexOf(right));
|
|
213
|
+
}
|
|
214
|
+
function reasoningModelLabelMatches(label, model) {
|
|
215
|
+
const left = label
|
|
216
|
+
.toLowerCase()
|
|
217
|
+
.replace(/^databricks-/, "")
|
|
218
|
+
.replace(/[^a-z0-9]+/g, "");
|
|
219
|
+
const right = model
|
|
220
|
+
.toLowerCase()
|
|
221
|
+
.replace(/^databricks-/, "")
|
|
222
|
+
.replace(/[^a-z0-9]+/g, "");
|
|
223
|
+
return left === right || right.includes(left) || left.includes(right);
|
|
224
|
+
}
|
|
225
|
+
function reasoningTokensFromFragment(fragment) {
|
|
226
|
+
const tokens = [];
|
|
227
|
+
for (const part of fragment.matchAll(TOKEN_PATTERN)) {
|
|
228
|
+
const token = part[1] ?? part[2] ?? part[3] ?? part[4];
|
|
229
|
+
if (!token || token === "and" || token === "or" || token === "of")
|
|
230
|
+
continue;
|
|
231
|
+
tokens.push(token.replace(/^["'`]+|["'`]+$/g, ""));
|
|
232
|
+
}
|
|
233
|
+
return tokens;
|
|
234
|
+
}
|
|
88
235
|
function modelsAfterHeading($, headingId) {
|
|
89
236
|
return [
|
|
90
237
|
...new Set(codeValuesAfterHeading($, headingId).flatMap((value) => modelKey(value) ?? [])),
|
|
@@ -179,4 +326,4 @@ function number(value) {
|
|
|
179
326
|
function sortRecord(record) {
|
|
180
327
|
return Object.fromEntries(Object.entries(record).sort(([left], [right]) => left.localeCompare(right)));
|
|
181
328
|
}
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBUWhELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUkvQyx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxXQUFtQjtJQUNsRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNqQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakYsSUFBSSxNQUFNLEtBQUssWUFBWSxJQUFJLE1BQU0sS0FBSyxlQUFlO1lBQUUsT0FBTztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxPQUFPO29CQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNoRyxPQUFPO1FBQ0wsV0FBVztRQUNYLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUN6RDtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsYUFBcUIsRUFDckIsYUFBcUIsRUFDckIsV0FBbUI7SUFFbkIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUMvRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUM7U0FDM0UsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUNULFdBQVcsRUFBRSxDQUFDO0lBQ2pCLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0UsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RixNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQ2xGLGFBQWEsQ0FDZDtRQUNDLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN4RSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDRCxPQUFPO1FBQ0wsV0FBVztRQUNYLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRTtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBWSxFQUFFLFdBQW1CO0lBQ3BFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQixNQUFNLE1BQU0sR0FBOEQsRUFBRSxDQUFDO0lBQzdFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2QsT0FBTyxFQUFFO2FBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7aUJBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUM7aUJBQ2QsT0FBTyxFQUFFO2lCQUNULEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxHQUFHO2dCQUFFLE9BQU87WUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHO2dCQUNaLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2pELGNBQWMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDbEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNwRSxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFhLEVBQUUsU0FBaUI7SUFDMUQsT0FBTztRQUNMLEdBQUcsSUFBSSxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQzNGLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxDQUFhLEVBQUUsU0FBNEI7SUFDeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2pDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixLQUFLLE1BQU0sT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQzdELElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1RCxhQUFhLEdBQUcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pFLFNBQVM7UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWE7WUFBRSxTQUFTO1FBQzdCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckYsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLO2dCQUFFLFNBQVM7WUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLENBQWEsRUFBRSxTQUFpQjtJQUM5RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDcEQsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU07WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLENBQWEsRUFBRSxTQUFpQjtJQUN2RCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDaEYsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRixNQUFNLFFBQVEsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxJQUFJLEtBQUs7WUFBRSxNQUFNO1FBQy9ELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQXdCO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsT0FBa0I7SUFDdEMsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQWE7SUFDaEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoRixPQUFPLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBeUI7SUFDekMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxLQUF5QjtJQUN2QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyRSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUksTUFBbUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUM1RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWQsIHR5cGUgQ2hlZXJpb0FQSSB9IGZyb20gXCJjaGVlcmlvXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdCxcbiAgTW9kZWxSYXRlTGltaXRDYXRhbG9ndWUsXG4gIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICBSZXRpcmVkTW9kZWxzU25hcHNob3QsXG59IGZyb20gXCIuL19tZXRhZGF0YS1jb250cmFjdC50c1wiO1xuaW1wb3J0IHsgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG50eXBlIFNlbGVjdGlvbiA9IFJldHVyblR5cGU8Q2hlZXJpb0FQST47XG5cbi8qKiBQYXJzZSByZXRpcmVkIG1vZGVsIG5hbWVzIGZyb20gRGF0YWJyaWNrcyByZXRpcmVtZW50LXBvbGljeSBIVE1MLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0aXJlZE1vZGVscyhodG1sOiBzdHJpbmcsIGdlbmVyYXRlZEF0OiBudW1iZXIpOiBSZXRpcmVkTW9kZWxzU25hcHNob3Qge1xuICBjb25zdCAkID0gbG9hZChodG1sKTtcbiAgY29uc3QgbW9kZWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICQoXCJ0YWJsZVwiKS5lYWNoKChfLCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSAkKHRhYmxlKS5maW5kKFwidHJcIik7XG4gICAgY29uc3QgaGVhZGVyID0gY29sbGFwc2VUZXh0KCQocm93cy5nZXQoMCkpLmZpbmQoXCJ0aCwgdGRcIikuZmlyc3QoKSkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaGVhZGVyICE9PSBcIm9wZW4gbW9kZWxcIiAmJiBoZWFkZXIgIT09IFwicGFydG5lciBtb2RlbFwiKSByZXR1cm47XG4gICAgcm93cy5zbGljZSgxKS5lYWNoKChfXywgcm93KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29sbGFwc2VUZXh0KCQocm93KS5maW5kKFwidGgsIHRkXCIpLmZpcnN0KCkpLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCk7XG4gICAgICAgIGlmICh0cmltbWVkKSBtb2RlbHMuYWRkKHRyaW1tZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKG1vZGVscy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHJldGlyZW1lbnQgdGFibGVzIGNvbnRhaW5lZCBubyBtb2RlbCBuYW1lc1wiKTtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRBdCxcbiAgICBtb2RlbHM6IFsuLi5tb2RlbHNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PlxuICAgICAgbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0LCBcImVuXCIsIHsgc2Vuc2l0aXZpdHk6IFwiYmFzZVwiIH0pLFxuICAgICksXG4gIH07XG59XG5cbi8qKiBQYXJzZSBSZXNwb25zZXMgYW5kIHdlYi1zZWFyY2ggZG9jdW1lbnRhdGlvbiBpbnRvIG1vZGVsIGNhcGFiaWxpdHkgc2V0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKFxuICByZXNwb25zZXNIdG1sOiBzdHJpbmcsXG4gIHdlYlNlYXJjaEh0bWw6IHN0cmluZyxcbiAgZ2VuZXJhdGVkQXQ6IG51bWJlcixcbik6IE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Qge1xuICBjb25zdCByZXNwb25zZXNEb2N1bWVudCA9IGxvYWQocmVzcG9uc2VzSHRtbCk7XG4gIGNvbnN0IHJlc3BvbnNlcyA9IG1vZGVsc0FmdGVySGVhZGluZyhyZXNwb25zZXNEb2N1bWVudCwgXCJkYXRhYnJpY2tzLWhvc3RlZC1mb3VuZGF0aW9uLW1vZGVsc1wiKTtcbiAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gY29udGFpbmVkIG5vIE9wZW5BSSBSZXNwb25zZXMgbW9kZWxzXCIpO1xuICB9XG4gIGNvbnN0IGlucHV0VHlwZXMgPSBzZWN0aW9uRWxlbWVudHMocmVzcG9uc2VzRG9jdW1lbnQsIFwic3VwcG9ydGVkLWlucHV0LXR5cGVzXCIpXG4gICAgLm1hcCgoZWxlbWVudCkgPT4gY29sbGFwc2VUZXh0KGVsZW1lbnQpKVxuICAgIC5qb2luKFwiIFwiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpbnB1dFR5cGVXb3JkcyA9IG5ldyBTZXQoaW5wdXRUeXBlcy5zcGxpdCgvW15hLXowLTldKy8pLmZpbHRlcihCb29sZWFuKSk7XG4gIGNvbnN0IGltYWdlSW5wdXQgPSBpbnB1dFR5cGVXb3Jkcy5oYXMoXCJ0ZXh0XCIpICYmIGlucHV0VHlwZVdvcmRzLmhhcyhcImltYWdlXCIpID8gcmVzcG9uc2VzIDogW107XG4gIGNvbnN0IGFwcGx5UGF0Y2ggPSBjb2RlVmFsdWVzQWZ0ZXJIZWFkaW5nKHJlc3BvbnNlc0RvY3VtZW50LCBcImxpbWl0YXRpb25zXCIpLmluY2x1ZGVzKFxuICAgIFwiYXBwbHlfcGF0Y2hcIixcbiAgKVxuICAgID8gcmVzcG9uc2VzXG4gICAgOiBbXTtcbiAgY29uc3Qgd2ViU2VhcmNoID0gbmF0aXZlV2ViU2VhcmNoTW9kZWxzKGxvYWQod2ViU2VhcmNoSHRtbCksIHJlc3BvbnNlcyk7XG4gIGlmICh3ZWJTZWFyY2gubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbHNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZWRBdCxcbiAgICBjYXBhYmlsaXRpZXM6IHsgcmVzcG9uc2VzLCBpbWFnZUlucHV0LCBhcHBseVBhdGNoLCB3ZWJTZWFyY2ggfSxcbiAgfTtcbn1cblxuLyoqIFBhcnNlIHBheS1wZXItdG9rZW4gbGltaXRzIGZyb20gRGF0YWJyaWNrcyBGb3VuZGF0aW9uIE1vZGVsIEFQSSBIVE1MLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTW9kZWxSYXRlTGltaXRzKGh0bWw6IHN0cmluZywgZ2VuZXJhdGVkQXQ6IG51bWJlcik6IE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90IHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IG1vZGVsczogUmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRDYXRhbG9ndWVbXCJtb2RlbHNcIl1bc3RyaW5nXT4gPSB7fTtcbiAgJChcInRhYmxlXCIpLmVhY2goKF8sIHRhYmxlKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9ICQodGFibGUpLmZpbmQoXCJ0clwiKTtcbiAgICBjb25zdCBoZWFkZXJzID0gJChyb3dzLmdldCgwKSlcbiAgICAgIC5maW5kKFwidGgsIHRkXCIpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKChjZWxsKSA9PiBjb2xsYXBzZVRleHQoJChjZWxsKSkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3QgbW9kZWxJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJtb2RlbFwiKSk7XG4gICAgY29uc3QgaW5wdXRJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJpdHBtXCIpKTtcbiAgICBjb25zdCBvdXRwdXRJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJvdHBtXCIpKTtcbiAgICBjb25zdCBxdWVyeUluZGV4ID0gaGVhZGVycy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZS5pbmNsdWRlcyhcInFwaFwiKSk7XG4gICAgaWYgKG1vZGVsSW5kZXggPCAwIHx8IGlucHV0SW5kZXggPCAwIHx8IG91dHB1dEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIHJvd3Muc2xpY2UoMSkuZWFjaCgoX18sIHJvdykgPT4ge1xuICAgICAgY29uc3QgY2VsbHMgPSAkKHJvdylcbiAgICAgICAgLmZpbmQoXCJ0aCwgdGRcIilcbiAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAubWFwKChjZWxsKSA9PiBjb2xsYXBzZVRleHQoJChjZWxsKSkpO1xuICAgICAgY29uc3Qga2V5ID0gbW9kZWxLZXkoY2VsbHNbbW9kZWxJbmRleF0pO1xuICAgICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICAgIG1vZGVsc1trZXldID0ge1xuICAgICAgICBpbnB1dFRva2Vuc1Blck1pbnV0ZTogbnVtYmVyKGNlbGxzW2lucHV0SW5kZXhdKSxcbiAgICAgICAgb3V0cHV0VG9rZW5zUGVyTWludXRlOiBudW1iZXIoY2VsbHNbb3V0cHV0SW5kZXhdKSxcbiAgICAgICAgcXVlcmllc1BlckhvdXI6IHF1ZXJ5SW5kZXggPCAwID8gbnVsbCA6IG51bWJlcihjZWxsc1txdWVyeUluZGV4XSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKG1vZGVscykubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBtb2RlbC1saW1pdCBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBtb2RlbHNcIik7XG4gIH1cbiAgcmV0dXJuIHsgZ2VuZXJhdGVkQXQsIGNhdGFsb2d1ZTogeyBtb2RlbHM6IHNvcnRSZWNvcmQobW9kZWxzKSB9IH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsc0FmdGVySGVhZGluZygkOiBDaGVlcmlvQVBJLCBoZWFkaW5nSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KGNvZGVWYWx1ZXNBZnRlckhlYWRpbmcoJCwgaGVhZGluZ0lkKS5mbGF0TWFwKCh2YWx1ZSkgPT4gbW9kZWxLZXkodmFsdWUpID8/IFtdKSksXG4gIF0uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBuYXRpdmVXZWJTZWFyY2hNb2RlbHMoJDogQ2hlZXJpb0FQSSwgcmVzcG9uc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmFtaWxpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbW9kZWxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGxldCBuYXRpdmVTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBzZWN0aW9uRWxlbWVudHMoJCwgXCJzdXBwb3J0ZWQtbW9kZWxzXCIpKSB7XG4gICAgaWYgKGhlYWRpbmdMZXZlbChub2RlVGFnTmFtZShlbGVtZW50LmdldCgwKSkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hdGl2ZVNlY3Rpb24gPSAhY29sbGFwc2VUZXh0KGVsZW1lbnQpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJ2aWEgbWNwXCIpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghbmF0aXZlU2VjdGlvbikgY29udGludWU7XG4gICAgY29uc3QgdmFsdWVzID0gbm9kZVRhZ05hbWUoZWxlbWVudC5nZXQoMCkpID09PSBcImNvZGVcIiA/IFtjb2xsYXBzZVRleHQoZWxlbWVudCldIDogW107XG4gICAgZWxlbWVudC5maW5kKFwiY29kZVwiKS5lYWNoKChfLCBjb2RlKSA9PiB7XG4gICAgICB2YWx1ZXMucHVzaChjb2xsYXBzZVRleHQoJChjb2RlKSkpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IG1vZGVsS2V5KHZhbHVlKTtcbiAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgbW9kZWxzLmFkZChtb2RlbCk7XG4gICAgICBmYW1pbGllcy5hZGQobW9kZWwuc3BsaXQoXCItXCIsIDEpWzBdKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBtb2RlbCBvZiByZXNwb25zZXMpIHtcbiAgICBpZiAoZmFtaWxpZXMuaGFzKG1vZGVsLnNwbGl0KFwiLVwiLCAxKVswXSkpIG1vZGVscy5hZGQobW9kZWwpO1xuICB9XG4gIHJldHVybiBbLi4ubW9kZWxzXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvZGVWYWx1ZXNBZnRlckhlYWRpbmcoJDogQ2hlZXJpb0FQSSwgaGVhZGluZ0lkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHNlY3Rpb25FbGVtZW50cygkLCBoZWFkaW5nSWQpKSB7XG4gICAgaWYgKG5vZGVUYWdOYW1lKGVsZW1lbnQuZ2V0KDApKSA9PT0gXCJjb2RlXCIpIHZhbHVlcy5wdXNoKGNvbGxhcHNlVGV4dChlbGVtZW50KSk7XG4gICAgZWxlbWVudC5maW5kKFwiY29kZVwiKS5lYWNoKChfLCBjb2RlKSA9PiB7XG4gICAgICB2YWx1ZXMucHVzaChjb2xsYXBzZVRleHQoJChjb2RlKSkpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIHNlY3Rpb25FbGVtZW50cygkOiBDaGVlcmlvQVBJLCBoZWFkaW5nSWQ6IHN0cmluZyk6IFNlbGVjdGlvbltdIHtcbiAgY29uc3QgaGVhZGluZyA9ICQoYCMke2hlYWRpbmdJZH1gKS5maXJzdCgpO1xuICBpZiAoaGVhZGluZy5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGNhcGFiaWxpdHkgcGFnZSBpcyBtaXNzaW5nIHNlY3Rpb24gJHtoZWFkaW5nSWR9YCk7XG4gIGNvbnN0IGxldmVsID0gaGVhZGluZ0xldmVsKG5vZGVUYWdOYW1lKGhlYWRpbmcuZ2V0KDApKSk7XG4gIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkKVxuICAgIHRocm93IG5ldyBFcnJvcihgRGF0YWJyaWNrcyBjYXBhYmlsaXR5IHNlY3Rpb24gJHtoZWFkaW5nSWR9IGlzIG5vdCBhIGhlYWRpbmdgKTtcbiAgY29uc3QgZWxlbWVudHM6IFNlbGVjdGlvbltdID0gW107XG4gIGxldCBzaWJsaW5nID0gaGVhZGluZy5uZXh0KCk7XG4gIHdoaWxlIChzaWJsaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzaWJsaW5nTGV2ZWwgPSBoZWFkaW5nTGV2ZWwobm9kZVRhZ05hbWUoc2libGluZy5nZXQoMCkpKTtcbiAgICBpZiAoc2libGluZ0xldmVsICE9PSB1bmRlZmluZWQgJiYgc2libGluZ0xldmVsIDw9IGxldmVsKSBicmVhaztcbiAgICBlbGVtZW50cy5wdXNoKHNpYmxpbmcpO1xuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHQoKTtcbiAgfVxuICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIGhlYWRpbmdMZXZlbChuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eaChbMS02XSkkLy5leGVjKG5hbWUgPz8gXCJcIik7XG4gIHJldHVybiBtYXRjaCA/IE51bWJlcihtYXRjaFsxXSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxhcHNlVGV4dChlbGVtZW50OiBTZWxlY3Rpb24pOiBzdHJpbmcge1xuICByZXR1cm4gZWxlbWVudC50ZXh0KCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG59XG5cbmZ1bmN0aW9uIG5vZGVUYWdOYW1lKG5vZGU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIgfHwgIShcInRhZ05hbWVcIiBpbiBub2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBub2RlLnRhZ05hbWUgPT09IFwic3RyaW5nXCIgPyBub2RlLnRhZ05hbWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgbmFtZSA9IHZhbHVlLnRyaW0oKS5yZXBsYWNlKC9cXCorJC8sIFwiXCIpLnRyaW0oKTtcbiAgZm9yIChjb25zdCBzdWZmaXggb2YgW1wiKFB1YmxpYyBQcmV2aWV3KVwiLCBcIihCZXRhKVwiLCBcIihQcmV2aWV3KVwiXSkge1xuICAgIGlmIChuYW1lLmVuZHNXaXRoKHN1ZmZpeCkpIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG1vZGVsU2VhcmNoUXVlcnkobmFtZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZS5yZXBsYWNlQWxsKFwiLFwiLCBcIlwiKS50cmltKCkpO1xuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIocGFyc2VkKSAmJiBwYXJzZWQgPj0gMCA/IHBhcnNlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNvcnRSZWNvcmQ8VD4ocmVjb3JkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUPj4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpLFxuICApO1xufVxuIl19
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQW1CLE1BQU0sU0FBUyxDQUFDO0FBU2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxNQUFNLHVCQUF1QixHQUMzQiwwRkFBMEYsQ0FBQztBQUM3RixNQUFNLGlCQUFpQixHQUNyQix3SkFBd0osQ0FBQztBQUMzSixNQUFNLGFBQWEsR0FBRyx3REFBd0QsQ0FBQztBQUMvRSxNQUFNLGtCQUFrQixHQUFHLHFDQUFxQyxDQUFDO0FBQ2pFLHNGQUFzRjtBQUN0RixNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLE1BQU07SUFDTixTQUFTO0lBQ1QsS0FBSztJQUNMLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFlBQVk7SUFDWixXQUFXO0lBQ1gsT0FBTztJQUNQLFlBQVk7SUFDWixLQUFLO0lBQ0wsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxXQUFtQjtJQUNsRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNqQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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Q0FBQyxNQUFNLENBQUM7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBeUI7SUFDdkMsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDckUsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFJLE1BQW1DO0lBQ3hELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDNUUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkLCB0eXBlIENoZWVyaW9BUEkgfSBmcm9tIFwiY2hlZXJpb1wiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlLFxuICBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCxcbiAgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG4gIFJldGlyZWRNb2RlbHNTbmFwc2hvdCxcbn0gZnJvbSBcIi4vX21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQgeyBtb2RlbFNlYXJjaFF1ZXJ5IH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZVJlYXNvbmluZyxcbiAgUkVBU09OSU5HX0xFVkVMUyxcbiAgdHlwZSBSZWFzb25pbmdMZXZlbCxcbiAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzLFxufSBmcm9tIFwiLi9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcblxudHlwZSBTZWxlY3Rpb24gPSBSZXR1cm5UeXBlPENoZWVyaW9BUEk+O1xuXG5jb25zdCBBQ0NFUFRFRF9WQUxVRVNfUEFUVEVSTiA9XG4gIC8oPzphY2NlcHRlZCB2YWx1ZXMoPzpcXHMrYXJlfFxccyt2YXJ5KT98YWNjZXB0cyg/Olxccyt2YWx1ZXM/KD86XFxzK29mKT8pPylcXHMqOj9cXHMqKFteLl0rKS9naTtcbmNvbnN0IEZPUl9NT0RFTF9QQVRURVJOID1cbiAgL0ZvclxccysoW14sXSs/KSxcXHMrKD86dGhpcyBwYXJhbWV0ZXIgYWNjZXB0cyg/Olxccyt2YWx1ZXM/XFxzK29mKT98dGhlICg/OmA/cmVhc29uaW5nX2VmZm9ydGA/fGVmZm9ydCkgcGFyYW1ldGVyIGFjY2VwdHMoPzpcXHMrdmFsdWVzP1xccytvZik/KVxccyooW14uXSspL2dpO1xuY29uc3QgVE9LRU5fUEFUVEVSTiA9IC8nKFteJ10rKSd8XCIoW15cIl0rKVwifGAoW15gXSspYHxcXGIoW2Etel1bYS16MC05Xy1dKilcXGIvZ2k7XG5jb25zdCBNT0RFTF9DT0RFX1BBVFRFUk4gPSAvXFxiZGF0YWJyaWNrcy1bYS16MC05XVthLXowLTkuXy1dKi9naTtcbi8qKiBXaXJlIHRva2VucyBhZHZlcnRpc2VkIGluIERhdGFicmlja3MgZG9jczsgZXhjbHVkZXMgcHJvc2Ugd29yZHMgbGlrZSBgZGVmYXVsdGAuICovXG5jb25zdCBET0NVTUVOVEFUSU9OX0VGRk9SVF9UT0tFTlMgPSBuZXcgU2V0KFtcbiAgXCJub25lXCIsXG4gIFwibWluaW1hbFwiLFxuICBcImxvd1wiLFxuICBcIm1lZGl1bVwiLFxuICBcImhpZ2hcIixcbiAgXCJ4aGlnaFwiLFxuICBcImV4dHJhLWhpZ2hcIixcbiAgXCJleHRyYWhpZ2hcIixcbiAgXCJ1bHRyYVwiLFxuICBcInVsdHJhLWhpZ2hcIixcbiAgXCJtYXhcIixcbiAgXCJtYXhpbXVtXCIsXG4gIFwiZGlzYWJsZWRcIixcbl0pO1xuXG4vKiogUGFyc2UgcmV0aXJlZCBtb2RlbCBuYW1lcyBmcm9tIERhdGFicmlja3MgcmV0aXJlbWVudC1wb2xpY3kgSFRNTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldGlyZWRNb2RlbHMoaHRtbDogc3RyaW5nLCBnZW5lcmF0ZWRBdDogbnVtYmVyKTogUmV0aXJlZE1vZGVsc1NuYXBzaG90IHtcbiAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gIGNvbnN0IG1vZGVscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAkKFwidGFibGVcIikuZWFjaCgoXywgdGFibGUpID0+IHtcbiAgICBjb25zdCByb3dzID0gJCh0YWJsZSkuZmluZChcInRyXCIpO1xuICAgIGNvbnN0IGhlYWRlciA9IGNvbGxhcHNlVGV4dCgkKHJvd3MuZ2V0KDApKS5maW5kKFwidGgsIHRkXCIpLmZpcnN0KCkpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhlYWRlciAhPT0gXCJvcGVuIG1vZGVsXCIgJiYgaGVhZGVyICE9PSBcInBhcnRuZXIgbW9kZWxcIikgcmV0dXJuO1xuICAgIHJvd3Muc2xpY2UoMSkuZWFjaCgoX18sIHJvdykgPT4ge1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGNvbGxhcHNlVGV4dCgkKHJvdykuZmluZChcInRoLCB0ZFwiKS5maXJzdCgpKS5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IG5hbWUudHJpbSgpO1xuICAgICAgICBpZiAodHJpbW1lZCkgbW9kZWxzLmFkZCh0cmltbWVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChtb2RlbHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyByZXRpcmVtZW50IHRhYmxlcyBjb250YWluZWQgbm8gbW9kZWwgbmFtZXNcIik7XG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGVkQXQsXG4gICAgbW9kZWxzOiBbLi4ubW9kZWxzXS5zb3J0KChsZWZ0LCByaWdodCkgPT5cbiAgICAgIGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCwgXCJlblwiLCB7IHNlbnNpdGl2aXR5OiBcImJhc2VcIiB9KSxcbiAgICApLFxuICB9O1xufVxuXG4vKiogUGFyc2UgUmVzcG9uc2VzIGFuZCB3ZWItc2VhcmNoIGRvY3VtZW50YXRpb24gaW50byBtb2RlbCBjYXBhYmlsaXR5IHNldHMuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNb2RlbENhcGFiaWxpdGllcyhcbiAgcmVzcG9uc2VzSHRtbDogc3RyaW5nLFxuICB3ZWJTZWFyY2hIdG1sOiBzdHJpbmcsXG4gIGdlbmVyYXRlZEF0OiBudW1iZXIsXG4pOiBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90IHtcbiAgY29uc3QgcmVzcG9uc2VzRG9jdW1lbnQgPSBsb2FkKHJlc3BvbnNlc0h0bWwpO1xuICBjb25zdCByZXNwb25zZXMgPSBtb2RlbHNBZnRlckhlYWRpbmcocmVzcG9uc2VzRG9jdW1lbnQsIFwiZGF0YWJyaWNrcy1ob3N0ZWQtZm91bmRhdGlvbi1tb2RlbHNcIik7XG4gIGlmIChyZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBubyBPcGVuQUkgUmVzcG9uc2VzIG1vZGVsc1wiKTtcbiAgfVxuICBjb25zdCBpbnB1dFR5cGVzID0gc2VjdGlvbkVsZW1lbnRzKHJlc3BvbnNlc0RvY3VtZW50LCBcInN1cHBvcnRlZC1pbnB1dC10eXBlc1wiKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGNvbGxhcHNlVGV4dChlbGVtZW50KSlcbiAgICAuam9pbihcIiBcIilcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaW5wdXRUeXBlV29yZHMgPSBuZXcgU2V0KGlucHV0VHlwZXMuc3BsaXQoL1teYS16MC05XSsvKS5maWx0ZXIoQm9vbGVhbikpO1xuICBjb25zdCBpbWFnZUlucHV0ID0gaW5wdXRUeXBlV29yZHMuaGFzKFwidGV4dFwiKSAmJiBpbnB1dFR5cGVXb3Jkcy5oYXMoXCJpbWFnZVwiKSA/IHJlc3BvbnNlcyA6IFtdO1xuICBjb25zdCBhcHBseVBhdGNoID0gY29kZVZhbHVlc0FmdGVySGVhZGluZyhyZXNwb25zZXNEb2N1bWVudCwgXCJsaW1pdGF0aW9uc1wiKS5pbmNsdWRlcyhcbiAgICBcImFwcGx5X3BhdGNoXCIsXG4gIClcbiAgICA/IHJlc3BvbnNlc1xuICAgIDogW107XG4gIGNvbnN0IHdlYlNlYXJjaCA9IG5hdGl2ZVdlYlNlYXJjaE1vZGVscyhsb2FkKHdlYlNlYXJjaEh0bWwpLCByZXNwb25zZXMpO1xuICBpZiAod2ViU2VhcmNoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbmF0aXZlIHdlYi1zZWFyY2ggbW9kZWxzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2VuZXJhdGVkQXQsXG4gICAgY2FwYWJpbGl0aWVzOiB7IHJlc3BvbnNlcywgaW1hZ2VJbnB1dCwgYXBwbHlQYXRjaCwgd2ViU2VhcmNoIH0sXG4gIH07XG59XG5cbi8qKiBQYXJzZSBwYXktcGVyLXRva2VuIGxpbWl0cyBmcm9tIERhdGFicmlja3MgRm91bmRhdGlvbiBNb2RlbCBBUEkgSFRNTC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsUmF0ZUxpbWl0cyhodG1sOiBzdHJpbmcsIGdlbmVyYXRlZEF0OiBudW1iZXIpOiBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCB7XG4gIGNvbnN0ICQgPSBsb2FkKGh0bWwpO1xuICBjb25zdCBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlW1wibW9kZWxzXCJdW3N0cmluZ10+ID0ge307XG4gICQoXCJ0YWJsZVwiKS5lYWNoKChfLCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSAkKHRhYmxlKS5maW5kKFwidHJcIik7XG4gICAgY29uc3QgaGVhZGVycyA9ICQocm93cy5nZXQoMCkpXG4gICAgICAuZmluZChcInRoLCB0ZFwiKVxuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoY2VsbCkgPT4gY29sbGFwc2VUZXh0KCQoY2VsbCkpLnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IG1vZGVsSW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwibW9kZWxcIikpO1xuICAgIGNvbnN0IGlucHV0SW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwiaXRwbVwiKSk7XG4gICAgY29uc3Qgb3V0cHV0SW5kZXggPSBoZWFkZXJzLmZpbmRJbmRleCgodmFsdWUpID0+IHZhbHVlLmluY2x1ZGVzKFwib3RwbVwiKSk7XG4gICAgY29uc3QgcXVlcnlJbmRleCA9IGhlYWRlcnMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUuaW5jbHVkZXMoXCJxcGhcIikpO1xuICAgIGlmIChtb2RlbEluZGV4IDwgMCB8fCBpbnB1dEluZGV4IDwgMCB8fCBvdXRwdXRJbmRleCA8IDApIHJldHVybjtcbiAgICByb3dzLnNsaWNlKDEpLmVhY2goKF9fLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IGNlbGxzID0gJChyb3cpXG4gICAgICAgIC5maW5kKFwidGgsIHRkXCIpXG4gICAgICAgIC50b0FycmF5KClcbiAgICAgICAgLm1hcCgoY2VsbCkgPT4gY29sbGFwc2VUZXh0KCQoY2VsbCkpKTtcbiAgICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KGNlbGxzW21vZGVsSW5kZXhdKTtcbiAgICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgICBtb2RlbHNba2V5XSA9IHtcbiAgICAgICAgaW5wdXRUb2tlbnNQZXJNaW51dGU6IG51bWJlcihjZWxsc1tpbnB1dEluZGV4XSksXG4gICAgICAgIG91dHB1dFRva2Vuc1Blck1pbnV0ZTogbnVtYmVyKGNlbGxzW291dHB1dEluZGV4XSksXG4gICAgICAgIHF1ZXJpZXNQZXJIb3VyOiBxdWVyeUluZGV4IDwgMCA/IG51bGwgOiBudW1iZXIoY2VsbHNbcXVlcnlJbmRleF0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG4gIGlmIChPYmplY3Qua2V5cyhtb2RlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgbW9kZWwtbGltaXQgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbW9kZWxzXCIpO1xuICB9XG4gIHJldHVybiB7IGdlbmVyYXRlZEF0LCBjYXRhbG9ndWU6IHsgbW9kZWxzOiBzb3J0UmVjb3JkKG1vZGVscykgfSB9O1xufVxuXG4vKiogUGFyc2UgcmVhc29uaW5nLWVmZm9ydCBsYWRkZXJzIGZyb20gdGhlIFF1ZXJ5IHJlYXNvbmluZyBtb2RlbHMgSFRNTCB0YWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYXNvbmluZ01vZGVscyhcbiAgaHRtbDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBdDogbnVtYmVyLFxuKTogUmVhc29uaW5nTW9kZWxzU25hcHNob3Qge1xuICBjb25zdCAkID0gbG9hZChodG1sKTtcbiAgY29uc3QgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBSZWFzb25pbmdMZXZlbFtdPiA9IHt9O1xuICAkKFwidGFibGVcIikuZWFjaCgoXywgdGFibGUpID0+IHtcbiAgICBjb25zdCByb3dzID0gJCh0YWJsZSkuZmluZChcInRyXCIpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSAkKHJvd3MuZ2V0KDApKVxuICAgICAgLmZpbmQoXCJ0aCwgdGRcIilcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXAoKGNlbGwpID0+IGNvbGxhcHNlVGV4dCgkKGNlbGwpKS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoIWhlYWRlcnMuc29tZSgoaGVhZGVyKSA9PiBoZWFkZXIuaW5jbHVkZXMoXCJtb2RlbFwiKSkpIHJldHVybjtcbiAgICBpZiAoIWhlYWRlcnMuc29tZSgoaGVhZGVyKSA9PiBoZWFkZXIuaW5jbHVkZXMoXCJwYXJhbWV0ZXJcIikpKSByZXR1cm47XG4gICAgcm93cy5zbGljZSgxKS5lYWNoKChfXywgcm93KSA9PiB7XG4gICAgICBjb25zdCBjZWxscyA9ICQocm93KS5maW5kKFwidGgsIHRkXCIpLnRvQXJyYXkoKS5tYXAoKGNlbGwpID0+ICQoY2VsbCkpO1xuICAgICAgaWYgKGNlbGxzLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZXMgPSByZWFzb25pbmdNb2RlbE5hbWVzRnJvbUNlbGwoY2VsbHNbMF0hLCAkKTtcbiAgICAgIGlmIChtb2RlbE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyYW1ldGVyc1RleHQgPSBjb2xsYXBzZVRleHQoY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV0hKTtcbiAgICAgIGNvbnN0IHBlck1vZGVsID0gcmVhc29uaW5nTGV2ZWxzQnlNb2RlbFNlY3Rpb24ocGFyYW1ldGVyc1RleHQsIG1vZGVsTmFtZXMpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBlck1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgbGV2ZWxzXSBvZiBPYmplY3QuZW50cmllcyhwZXJNb2RlbCkpIHtcbiAgICAgICAgICBpZiAobGV2ZWxzLmxlbmd0aCA+IDApIG1vZGVsc1trZXldID0gc29ydFJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNoYXJlZCA9IHNvcnRSZWFzb25pbmdMZXZlbHMoZXh0cmFjdEFjY2VwdGVkUmVhc29uaW5nTGV2ZWxzKHBhcmFtZXRlcnNUZXh0KSk7XG4gICAgICBpZiAoc2hhcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG1vZGVsTmFtZXMpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbW9kZWxLZXkobmFtZSk7XG4gICAgICAgIGlmIChrZXkpIG1vZGVsc1trZXldID0gc2hhcmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKE9iamVjdC5rZXlzKG1vZGVscykubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyByZWFzb25pbmcgZG9jdW1lbnRhdGlvbiBjb250YWluZWQgbm8gbW9kZWwgZWZmb3J0IGxhZGRlcnNcIik7XG4gIH1cbiAgcmV0dXJuIHsgZ2VuZXJhdGVkQXQsIGNhdGFsb2d1ZTogeyBtb2RlbHM6IHNvcnRSZWNvcmQobW9kZWxzKSB9IH07XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsTmFtZXNGcm9tQ2VsbChjZWxsOiBTZWxlY3Rpb24sICQ6IENoZWVyaW9BUEkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNlbGwuZmluZChcImNvZGVcIikuZWFjaCgoXywgY29kZSkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBjb2xsYXBzZVRleHQoJChjb2RlKSk7XG4gICAgaWYgKHRleHQuc3RhcnRzV2l0aChcImRhdGFicmlja3MtXCIpKSBuYW1lcy5hZGQodGV4dCk7XG4gIH0pO1xuICBpZiAobmFtZXMuc2l6ZSA9PT0gMCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgY29sbGFwc2VUZXh0KGNlbGwpLm1hdGNoQWxsKE1PREVMX0NPREVfUEFUVEVSTikpIHtcbiAgICAgIG5hbWVzLmFkZChtYXRjaFswXSEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5hbWVzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFjY2VwdGVkUmVhc29uaW5nTGV2ZWxzKHRleHQ6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBsZXZlbHM6IFJlYXNvbmluZ0xldmVsW10gPSBbXTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKEFDQ0VQVEVEX1ZBTFVFU19QQVRURVJOKSkge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gbWF0Y2hbMV07XG4gICAgaWYgKCFmcmFnbWVudCB8fCAvdmFyeSBieSBtb2RlbC9pLnRlc3QoZnJhZ21lbnQpKSBjb250aW51ZTtcbiAgICBsZXZlbHMucHVzaCguLi5kb2N1bWVudGF0aW9uRWZmb3J0TGV2ZWxzKGZyYWdtZW50KSk7XG4gIH1cbiAgcmV0dXJuIGxldmVscztcbn1cblxuZnVuY3Rpb24gcmVhc29uaW5nTGV2ZWxzQnlNb2RlbFNlY3Rpb24oXG4gIHBhcmFtZXRlcnNUZXh0OiBzdHJpbmcsXG4gIHJvd01vZGVsczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWxbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBwYXJhbWV0ZXJzVGV4dC5tYXRjaEFsbChGT1JfTU9ERUxfUEFUVEVSTikpIHtcbiAgICBjb25zdCBsYWJlbCA9IG1hdGNoWzFdPy50cmltKCk7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBtYXRjaFsyXTtcbiAgICBpZiAoIWxhYmVsIHx8ICFmcmFnbWVudCkgY29udGludWU7XG4gICAgY29uc3QgbGV2ZWxzID0gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGRvY3VtZW50YXRpb25FZmZvcnRMZXZlbHMoZnJhZ21lbnQpKTtcbiAgICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHJvd01vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiByZWFzb25pbmdNb2RlbExhYmVsTWF0Y2hlcyhsYWJlbCwgbW9kZWwpKTtcbiAgICAvLyBPbmx5IGF0dGFjaCBleHBsaWNpdCBcIkZvciA8bW9kZWw+XCIgY2xhdXNlcyB0byBtb2RlbHMgbGlzdGVkIGluIHRoZSByb3cuXG4gICAgaWYgKG1hdGNoZWQubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBtYXRjaGVkKSB7XG4gICAgICBjb25zdCBrZXkgPSBtb2RlbEtleSh0YXJnZXQpO1xuICAgICAgaWYgKGtleSkgcmVzdWx0W2tleV0gPSBzb3J0UmVhc29uaW5nTGV2ZWxzKGxldmVscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGRvY3VtZW50YXRpb25FZmZvcnRMZXZlbHMoZnJhZ21lbnQ6IHN0cmluZyk6IFJlYXNvbmluZ0xldmVsW10ge1xuICByZXR1cm4gcmVhc29uaW5nVG9rZW5zRnJvbUZyYWdtZW50KGZyYWdtZW50KS5mbGF0TWFwKCh0b2tlbikgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0b2tlbi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpO1xuICAgIGlmIChcbiAgICAgICFET0NVTUVOVEFUSU9OX0VGRk9SVF9UT0tFTlMuaGFzKG5vcm1hbGl6ZWQpICYmXG4gICAgICAhRE9DVU1FTlRBVElPTl9FRkZPUlRfVE9LRU5TLmhhcyh0b2tlbi50b0xvd2VyQ2FzZSgpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBsZXZlbCA9IHBhcnNlUmVhc29uaW5nKHRva2VuKTtcbiAgICByZXR1cm4gbGV2ZWwgPyBbbGV2ZWxdIDogW107XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzb3J0UmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICByZXR1cm4gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscykuc29ydChcbiAgICAobGVmdCwgcmlnaHQpID0+IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihsZWZ0KSAtIFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihyaWdodCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsTGFiZWxNYXRjaGVzKGxhYmVsOiBzdHJpbmcsIG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbGVmdCA9IGxhYmVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIlwiKTtcbiAgY29uc3QgcmlnaHQgPSBtb2RlbFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15kYXRhYnJpY2tzLS8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCJcIik7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodCB8fCByaWdodC5pbmNsdWRlcyhsZWZ0KSB8fCBsZWZ0LmluY2x1ZGVzKHJpZ2h0KTtcbn1cblxuZnVuY3Rpb24gcmVhc29uaW5nVG9rZW5zRnJvbUZyYWdtZW50KGZyYWdtZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIGZyYWdtZW50Lm1hdGNoQWxsKFRPS0VOX1BBVFRFUk4pKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwYXJ0WzFdID8/IHBhcnRbMl0gPz8gcGFydFszXSA/PyBwYXJ0WzRdO1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4gPT09IFwiYW5kXCIgfHwgdG9rZW4gPT09IFwib3JcIiB8fCB0b2tlbiA9PT0gXCJvZlwiKSBjb250aW51ZTtcbiAgICB0b2tlbnMucHVzaCh0b2tlbi5yZXBsYWNlKC9eW1wiJ2BdK3xbXCInYF0rJC9nLCBcIlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gbW9kZWxzQWZ0ZXJIZWFkaW5nKCQ6IENoZWVyaW9BUEksIGhlYWRpbmdJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoY29kZVZhbHVlc0FmdGVySGVhZGluZygkLCBoZWFkaW5nSWQpLmZsYXRNYXAoKHZhbHVlKSA9PiBtb2RlbEtleSh2YWx1ZSkgPz8gW10pKSxcbiAgXS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5hdGl2ZVdlYlNlYXJjaE1vZGVscygkOiBDaGVlcmlvQVBJLCByZXNwb25zZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBmYW1pbGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtb2RlbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbGV0IG5hdGl2ZVNlY3Rpb24gPSBmYWxzZTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHNlY3Rpb25FbGVtZW50cygkLCBcInN1cHBvcnRlZC1tb2RlbHNcIikpIHtcbiAgICBpZiAoaGVhZGluZ0xldmVsKG5vZGVUYWdOYW1lKGVsZW1lbnQuZ2V0KDApKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmF0aXZlU2VjdGlvbiA9ICFjb2xsYXBzZVRleHQoZWxlbWVudCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInZpYSBtY3BcIik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFuYXRpdmVTZWN0aW9uKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZXMgPSBub2RlVGFnTmFtZShlbGVtZW50LmdldCgwKSkgPT09IFwiY29kZVwiID8gW2NvbGxhcHNlVGV4dChlbGVtZW50KV0gOiBbXTtcbiAgICBlbGVtZW50LmZpbmQoXCJjb2RlXCIpLmVhY2goKF8sIGNvZGUpID0+IHtcbiAgICAgIHZhbHVlcy5wdXNoKGNvbGxhcHNlVGV4dCgkKGNvZGUpKSk7XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gbW9kZWxLZXkodmFsdWUpO1xuICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICBtb2RlbHMuYWRkKG1vZGVsKTtcbiAgICAgIGZhbWlsaWVzLmFkZChtb2RlbC5zcGxpdChcIi1cIiwgMSlbMF0pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJlc3BvbnNlcykge1xuICAgIGlmIChmYW1pbGllcy5oYXMobW9kZWwuc3BsaXQoXCItXCIsIDEpWzBdKSkgbW9kZWxzLmFkZChtb2RlbCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5tb2RlbHNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29kZVZhbHVlc0FmdGVySGVhZGluZygkOiBDaGVlcmlvQVBJLCBoZWFkaW5nSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc2VjdGlvbkVsZW1lbnRzKCQsIGhlYWRpbmdJZCkpIHtcbiAgICBpZiAobm9kZVRhZ05hbWUoZWxlbWVudC5nZXQoMCkpID09PSBcImNvZGVcIikgdmFsdWVzLnB1c2goY29sbGFwc2VUZXh0KGVsZW1lbnQpKTtcbiAgICBlbGVtZW50LmZpbmQoXCJjb2RlXCIpLmVhY2goKF8sIGNvZGUpID0+IHtcbiAgICAgIHZhbHVlcy5wdXNoKGNvbGxhcHNlVGV4dCgkKGNvZGUpKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gc2VjdGlvbkVsZW1lbnRzKCQ6IENoZWVyaW9BUEksIGhlYWRpbmdJZDogc3RyaW5nKTogU2VsZWN0aW9uW10ge1xuICBjb25zdCBoZWFkaW5nID0gJChgIyR7aGVhZGluZ0lkfWApLmZpcnN0KCk7XG4gIGlmIChoZWFkaW5nLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgY2FwYWJpbGl0eSBwYWdlIGlzIG1pc3Npbmcgc2VjdGlvbiAke2hlYWRpbmdJZH1gKTtcbiAgY29uc3QgbGV2ZWwgPSBoZWFkaW5nTGV2ZWwobm9kZVRhZ05hbWUoaGVhZGluZy5nZXQoMCkpKTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGNhcGFiaWxpdHkgc2VjdGlvbiAke2hlYWRpbmdJZH0gaXMgbm90IGEgaGVhZGluZ2ApO1xuICBjb25zdCBlbGVtZW50czogU2VsZWN0aW9uW10gPSBbXTtcbiAgbGV0IHNpYmxpbmcgPSBoZWFkaW5nLm5leHQoKTtcbiAgd2hpbGUgKHNpYmxpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNpYmxpbmdMZXZlbCA9IGhlYWRpbmdMZXZlbChub2RlVGFnTmFtZShzaWJsaW5nLmdldCgwKSkpO1xuICAgIGlmIChzaWJsaW5nTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBzaWJsaW5nTGV2ZWwgPD0gbGV2ZWwpIGJyZWFrO1xuICAgIGVsZW1lbnRzLnB1c2goc2libGluZyk7XG4gICAgc2libGluZyA9IHNpYmxpbmcubmV4dCgpO1xuICB9XG4gIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gaGVhZGluZ0xldmVsKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL15oKFsxLTZdKSQvLmV4ZWMobmFtZSA/PyBcIlwiKTtcbiAgcmV0dXJuIG1hdGNoID8gTnVtYmVyKG1hdGNoWzFdKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29sbGFwc2VUZXh0KGVsZW1lbnQ6IFNlbGVjdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBlbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbn1cblxuZnVuY3Rpb24gbm9kZVRhZ05hbWUobm9kZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIiB8fCAhKFwidGFnTmFtZVwiIGluIG5vZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIG5vZGUudGFnTmFtZSA9PT0gXCJzdHJpbmdcIiA/IG5vZGUudGFnTmFtZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbW9kZWxLZXkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBuYW1lID0gdmFsdWUudHJpbSgpLnJlcGxhY2UoL1xcKiskLywgXCJcIikudHJpbSgpO1xuICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBbXCIoUHVibGljIFByZXZpZXcpXCIsIFwiKEJldGEpXCIsIFwiKFByZXZpZXcpXCJdKSB7XG4gICAgaWYgKG5hbWUuZW5kc1dpdGgoc3VmZml4KSkgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeShuYW1lKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlLnJlcGxhY2VBbGwoXCIsXCIsIFwiXCIpLnRyaW0oKSk7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihwYXJzZWQpICYmIHBhcnNlZCA+PSAwID8gcGFyc2VkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gc29ydFJlY29yZDxUPihyZWNvcmQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFQ+Pik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLnNvcnQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSksXG4gICk7XG59XG4iXX0=
|