@dbx-tools/model 0.9.61 → 0.9.64
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/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/package.json +1 -1
- package/lib/src/_ranking.js +28 -60
- package/lib/src/_selection.js +1 -7
- package/lib/src/model-catalog.js +1 -2
- package/lib/src/model-client.js +45 -7
- package/package.json +6 -6
- package/src/_ranking.ts +32 -62
- package/src/_selection.ts +0 -6
- package/src/model-catalog.ts +0 -1
- package/src/model-client.ts +51 -7
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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.64";
|
|
7
7
|
export * as bindings from "./src/bindings.ts";
|
|
8
8
|
export * as classes from "./src/classes.ts";
|
|
9
9
|
export * as classify from "./src/classify.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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.64";
|
|
3
3
|
export * as bindings from "./src/bindings.ts";
|
|
4
4
|
export * as classes from "./src/classes.ts";
|
|
5
5
|
export * as classify from "./src/classify.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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.64";
|
|
6
6
|
export * as bindings from "./src/bindings.js";
|
|
7
7
|
export * as classes from "./src/classes.js";
|
|
8
8
|
export * as classify from "./src/classify.js";
|
|
@@ -24,4 +24,4 @@ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model
|
|
|
24
24
|
export { DEFAULT_MODEL_CLIENT_CACHE_TTL_MS } from "./src/model-client.js";
|
|
25
25
|
export { REASONING_LEVELS } from "./src/reasoning-translation.js";
|
|
26
26
|
export * from "./exports.js";
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0ssT0FBTyxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLDJCQUEyQixFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEwsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJbEUsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNjRcIjtcbmV4cG9ydCAqIGFzIGJpbmRpbmdzIGZyb20gXCIuL3NyYy9iaW5kaW5ncy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NlcyBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0ICogYXMgY2xhc3NpZnkgZnJvbSBcIi4vc3JjL2NsYXNzaWZ5LnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtZXRhZGF0YSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEudHNcIjtcbmV4cG9ydCAqIGFzIG1ldGFkYXRhQ2FjaGUgZnJvbSBcIi4vc3JjL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsQ2xpZW50IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZWFzb25pbmdUcmFuc2xhdGlvbiBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nV2lyZSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCwgQUlfR0FURVdBWV9DT0RFWF9SRVNQT05TRVNfUEFUSCwgQU5USFJPUElDX01FU1NBR0VTX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB7IE1PREVMX01FVEFEQVRBX1RUTF9NUywgTU9ERUxfUkFURV9MSU1JVFNfVVJMLCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLCBSRVRJUkVEX01PREVMU19VUkwsIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCB9IGZyb20gXCIuL3NyYy9tZXRhZGF0YS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNZXRhZGF0YUNhY2hlUmVjb3JkLCBNZXRhZGF0YUNhY2hlT3B0aW9ucywgTWV0YWRhdGFDYWNoZU1lcmdlSW5wdXQsIE1ldGFkYXRhQ2FjaGUgfSBmcm9tIFwiLi9zcmMvbWV0YWRhdGEtY2FjaGUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsQXV0aE9wdGlvbnMsIE1vZGVsQ2xpZW50T3B0aW9ucywgTW9kZWxDbGllbnRTdGF0dXMsIE1vZGVsUHJvdG9jb2wsIE1vZGVsUm91dGVJbnB1dCwgTW9kZWxSb3V0ZSwgTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9zcmMvbW9kZWwtY2xpZW50LnRzXCI7XG5leHBvcnQgeyBSRUFTT05JTkdfTEVWRUxTIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZWFzb25pbmdMZXZlbCwgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsIEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIH0gZnJvbSBcIi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZpbmdDaGF0TWVzc2FnZSwgUmV3cml0dGVuU2VydmluZ1JlcXVlc3QgfSBmcm9tIFwiLi9zcmMvc2VydmluZy13aXJlLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
|
package/lib/package.json
CHANGED
package/lib/src/_ranking.js
CHANGED
|
@@ -3,30 +3,11 @@ import { ModelClass as ModelClassValues, } from "@dbx-tools/shared-model/contrac
|
|
|
3
3
|
import { toModelDisplayName } from "@dbx-tools/shared-model/display";
|
|
4
4
|
import Fuse from "fuse.js";
|
|
5
5
|
import { modelStatusFor } from "./_retirement.js";
|
|
6
|
-
import { classesAtOrBelow, CHAT_CLASS_ORDER,
|
|
6
|
+
import { classesAtOrBelow, CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./classes.js";
|
|
7
7
|
import { classifyEndpoints, endpointCapabilities, supportsToolsByFamily, versionTuple, } from "./classify.js";
|
|
8
|
-
import { isOpenWeightsGpt, modelFamily, modelReasoningEfforts, modelServiceNames } from "./policy.js";
|
|
8
|
+
import { isOpenWeightsGpt, modelFamily, modelReasoningEfforts, modelServiceNames, } from "./policy.js";
|
|
9
9
|
const ModelClass = ModelClassValues;
|
|
10
10
|
const DEFAULT_FUZZY_THRESHOLD = 0.4;
|
|
11
|
-
const SEARCH_INTENT_FILLERS = new Set(["a", "best", "for", "model", "models", "the"]);
|
|
12
|
-
const CHAT_SEARCH_INTENTS = new Set([
|
|
13
|
-
"chat",
|
|
14
|
-
"completion",
|
|
15
|
-
"completions",
|
|
16
|
-
"summarize",
|
|
17
|
-
"summarise",
|
|
18
|
-
"summarization",
|
|
19
|
-
"summarisation",
|
|
20
|
-
"summary",
|
|
21
|
-
]);
|
|
22
|
-
const EMBEDDING_SEARCH_INTENTS = new Set([
|
|
23
|
-
"embed",
|
|
24
|
-
"embedding",
|
|
25
|
-
"embeddings",
|
|
26
|
-
"vector",
|
|
27
|
-
"vectorize",
|
|
28
|
-
"vectorise",
|
|
29
|
-
]);
|
|
30
11
|
/** Rank endpoint records through the TypeScript-owned model policy. */
|
|
31
12
|
export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
32
13
|
const filtered = endpoints.filter((endpoint) => matchesModelQuery(endpoint, query));
|
|
@@ -46,20 +27,11 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
46
27
|
}
|
|
47
28
|
: classifyEndpoints(normalized);
|
|
48
29
|
const search = query.search?.trim();
|
|
49
|
-
const
|
|
50
|
-
const rankedSearch = searchPlan ? searchPlan.search : search;
|
|
51
|
-
const searchIntent = searchPlan?.modelClass;
|
|
52
|
-
const requestedClass = options.modelClass ?? query.modelClass ?? searchIntent;
|
|
30
|
+
const requestedClass = options.modelClass ?? query.modelClass;
|
|
53
31
|
const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
|
|
54
32
|
const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
|
|
55
33
|
const candidates = [];
|
|
56
|
-
|
|
57
|
-
if (searchIntent !== undefined &&
|
|
58
|
-
explicitClass !== undefined &&
|
|
59
|
-
isChatClass(searchIntent) !== isChatClass(explicitClass)) {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
62
|
-
if (rankedSearch && requestedClass === undefined) {
|
|
34
|
+
if (search && requestedClass === undefined) {
|
|
63
35
|
const classByName = classifyEndpointClasses(normalized);
|
|
64
36
|
for (const endpoint of normalized) {
|
|
65
37
|
if (!includeDeprecated && endpoint.status?.deprecated)
|
|
@@ -84,15 +56,17 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
84
56
|
}
|
|
85
57
|
}
|
|
86
58
|
}
|
|
87
|
-
let ranked =
|
|
88
|
-
|
|
89
|
-
|
|
59
|
+
let ranked = !search && requestedClass === undefined
|
|
60
|
+
? preferLatestWithinLeadingFamily(candidates)
|
|
61
|
+
: candidates;
|
|
62
|
+
if (search) {
|
|
63
|
+
const exact = candidates.find((candidate) => candidate.endpoint.name === search);
|
|
90
64
|
if (exact) {
|
|
91
65
|
ranked = [{ ...exact, score: 0 }];
|
|
92
66
|
}
|
|
93
67
|
else {
|
|
94
68
|
const threshold = query.threshold ?? DEFAULT_FUZZY_THRESHOLD;
|
|
95
|
-
const searchTokens = tokenize(
|
|
69
|
+
const searchTokens = tokenize(search);
|
|
96
70
|
const tokenMatches = candidates
|
|
97
71
|
.filter((candidate) => {
|
|
98
72
|
const candidateTokens = new Set(searchableValues(candidate.endpoint).flatMap(tokenize));
|
|
@@ -117,7 +91,7 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
117
91
|
useExtendedSearch: true,
|
|
118
92
|
isCaseSensitive: false,
|
|
119
93
|
});
|
|
120
|
-
const normalizedSearch = tokenize(
|
|
94
|
+
const normalizedSearch = tokenize(search).join(" ");
|
|
121
95
|
ranked = normalizedSearch
|
|
122
96
|
? fuse
|
|
123
97
|
.search(normalizedSearch)
|
|
@@ -134,6 +108,22 @@ export function rankEndpoints(endpoints, query = {}, options = {}) {
|
|
|
134
108
|
}));
|
|
135
109
|
return query.limit === undefined ? restored : restored.slice(0, Math.max(0, query.limit));
|
|
136
110
|
}
|
|
111
|
+
function preferLatestWithinLeadingFamily(candidates) {
|
|
112
|
+
const leading = candidates[0];
|
|
113
|
+
if (!leading)
|
|
114
|
+
return [];
|
|
115
|
+
const family = modelFamily(leading.endpoint.name);
|
|
116
|
+
if (!family)
|
|
117
|
+
return [...candidates];
|
|
118
|
+
const sameFamily = candidates
|
|
119
|
+
.filter((candidate) => modelFamily(candidate.endpoint.name) === family)
|
|
120
|
+
.sort(compareRanked);
|
|
121
|
+
const selected = new Set(sameFamily.map((candidate) => candidate.endpoint.name));
|
|
122
|
+
return [
|
|
123
|
+
...sameFamily,
|
|
124
|
+
...candidates.filter((candidate) => !selected.has(candidate.endpoint.name)),
|
|
125
|
+
];
|
|
126
|
+
}
|
|
137
127
|
function matchesModelQuery(endpoint, query) {
|
|
138
128
|
if (query.name !== undefined && endpoint.name !== query.name)
|
|
139
129
|
return false;
|
|
@@ -254,28 +244,6 @@ function modelVariantRank(name) {
|
|
|
254
244
|
return 1;
|
|
255
245
|
return 2;
|
|
256
246
|
}
|
|
257
|
-
/**
|
|
258
|
-
* Resolve generic job searches to the capability class that owns the work.
|
|
259
|
-
*
|
|
260
|
-
* A pure intent such as "summarize" ranks that capability directly. Mixed
|
|
261
|
-
* queries remove the intent word but retain the model identity, so "gpt chat"
|
|
262
|
-
* still uses the historical version and variant preference for GPT.
|
|
263
|
-
*/
|
|
264
|
-
function modelSearchPlan(search) {
|
|
265
|
-
const tokens = tokenize(search).filter((token) => !SEARCH_INTENT_FILLERS.has(token));
|
|
266
|
-
if (tokens.length === 0)
|
|
267
|
-
return undefined;
|
|
268
|
-
const chat = tokens.some((token) => CHAT_SEARCH_INTENTS.has(token));
|
|
269
|
-
const embedding = tokens.some((token) => EMBEDDING_SEARCH_INTENTS.has(token));
|
|
270
|
-
if (chat === embedding)
|
|
271
|
-
return undefined;
|
|
272
|
-
const intentWords = chat ? CHAT_SEARCH_INTENTS : EMBEDDING_SEARCH_INTENTS;
|
|
273
|
-
const remaining = tokens.filter((token) => !intentWords.has(token));
|
|
274
|
-
return {
|
|
275
|
-
modelClass: chat ? ModelClass.ChatThinking : ModelClass.Embedding,
|
|
276
|
-
...(remaining.length > 0 ? { search: remaining.join(" ") } : {}),
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
247
|
function tokenize(value) {
|
|
280
248
|
return value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
281
249
|
}
|
|
@@ -328,4 +296,4 @@ function finiteNumber(value) {
|
|
|
328
296
|
function booleanValue(value) {
|
|
329
297
|
return typeof value === "boolean" ? value : undefined;
|
|
330
298
|
}
|
|
331
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUsvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdEcsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFFcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2xDLE1BQU07SUFDTixZQUFZO0lBQ1osYUFBYTtJQUNiLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZUFBZTtJQUNmLGVBQWU7SUFDZixTQUFTO0NBQ1YsQ0FBQyxDQUFDO0FBQ0gsTUFBTSx3QkFBd0Is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QUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1ZhbHVlcyxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdG9Nb2RlbERpc3BsYXlOYW1lIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2Rpc3BsYXlcIjtcbmltcG9ydCBGdXNlIGZyb20gXCJmdXNlLmpzXCI7XG5cbmltcG9ydCB7IG1vZGVsU3RhdHVzRm9yIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCB7IGNsYXNzZXNBdE9yQmVsb3csIENIQVRfQ0xBU1NfT1JERVIsIGlzQ2hhdENsYXNzLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5RW5kcG9pbnRzLFxuICBlbmRwb2ludENhcGFiaWxpdGllcyxcbiAgc3VwcG9ydHNUb29sc0J5RmFtaWx5LFxuICB2ZXJzaW9uVHVwbGUsXG59IGZyb20gXCIuL2NsYXNzaWZ5LnRzXCI7XG5pbXBvcnQgeyBpc09wZW5XZWlnaHRzR3B0LCBtb2RlbEZhbWlseSwgbW9kZWxSZWFzb25pbmdFZmZvcnRzLCBtb2RlbFNlcnZpY2VOYW1lcyB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVHlwZTtcbmNvbnN0IE1vZGVsQ2xhc3MgPSBNb2RlbENsYXNzVmFsdWVzO1xuXG5jb25zdCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCA9IDAuNDtcbmNvbnN0IFNFQVJDSF9JTlRFTlRfRklMTEVSUyA9IG5ldyBTZXQoW1wiYVwiLCBcImJlc3RcIiwgXCJmb3JcIiwgXCJtb2RlbFwiLCBcIm1vZGVsc1wiLCBcInRoZVwiXSk7XG5jb25zdCBDSEFUX1NFQVJDSF9JTlRFTlRTID0gbmV3IFNldChbXG4gIFwiY2hhdFwiLFxuICBcImNvbXBsZXRpb25cIixcbiAgXCJjb21wbGV0aW9uc1wiLFxuICBcInN1bW1hcml6ZVwiLFxuICBcInN1bW1hcmlzZVwiLFxuICBcInN1bW1hcml6YXRpb25cIixcbiAgXCJzdW1tYXJpc2F0aW9uXCIsXG4gIFwic3VtbWFyeVwiLFxuXSk7XG5jb25zdCBFTUJFRERJTkdfU0VBUkNIX0lOVEVOVFMgPSBuZXcgU2V0KFtcbiAgXCJlbWJlZFwiLFxuICBcImVtYmVkZGluZ1wiLFxuICBcImVtYmVkZGluZ3NcIixcbiAgXCJ2ZWN0b3JcIixcbiAgXCJ2ZWN0b3JpemVcIixcbiAgXCJ2ZWN0b3Jpc2VcIixcbl0pO1xuXG5pbnRlcmZhY2UgTmF0aXZlUmFua2luZ09wdGlvbnMge1xuICByZWFkb25seSBpbmNsdWRlRGVwcmVjYXRlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xuICByZWFkb25seSB0YXNrPzogc3RyaW5nO1xufVxuXG4vKiogUmFuayBlbmRwb2ludCByZWNvcmRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmtFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBxdWVyeTogTW9kZWxRdWVyeSA9IHt9LFxuICBvcHRpb25zOiBOYXRpdmVSYW5raW5nT3B0aW9ucyA9IHt9LFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGZpbHRlcmVkID0gZW5kcG9pbnRzLmZpbHRlcigoZW5kcG9pbnQpID0+IG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50LCBxdWVyeSkpO1xuICBjb25zdCBvcmlnaW5hbEJ5TmFtZSA9IG5ldyBNYXAoZmlsdGVyZWQubWFwKChlbmRwb2ludCkgPT4gW2VuZHBvaW50Lm5hbWUsIGVuZHBvaW50XSkpO1xuICBjb25zdCBub3JtYWxpemVkID0gZmlsdGVyZWQubWFwKChlbmRwb2ludCkgPT4gKHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAuLi4ob3B0aW9ucy5tb2RlbENsYXNzID8geyBjbGFzczogb3B0aW9ucy5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMudGFzayA/IHsgdGFzazogb3B0aW9ucy50YXNrIH0gOiB7fSksXG4gIH0pKTtcbiAgY29uc3QgY2xhc3NpZmllZCA9IG9wdGlvbnMubW9kZWxDbGFzc1xuICAgID8ge1xuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogW10sXG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRGYXN0XTogW10sXG4gICAgICAgIFtNb2RlbENsYXNzLkVtYmVkZGluZ106IFtdLFxuICAgICAgICBbb3B0aW9ucy5tb2RlbENsYXNzXTogbm9ybWFsaXplZCxcbiAgICAgIH1cbiAgICA6IGNsYXNzaWZ5RW5kcG9pbnRzKG5vcm1hbGl6ZWQpO1xuICBjb25zdCBzZWFyY2ggPSBxdWVyeS5zZWFyY2g/LnRyaW0oKTtcbiAgY29uc3Qgc2VhcmNoUGxhbiA9IHNlYXJjaCA/IG1vZGVsU2VhcmNoUGxhbihzZWFyY2gpIDogdW5kZWZpbmVkO1xuICBjb25zdCByYW5rZWRTZWFyY2ggPSBzZWFyY2hQbGFuID8gc2VhcmNoUGxhbi5zZWFyY2ggOiBzZWFyY2g7XG4gIGNvbnN0IHNlYXJjaEludGVudCA9IHNlYXJjaFBsYW4/Lm1vZGVsQ2xhc3M7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzID8/IHF1ZXJ5Lm1vZGVsQ2xhc3MgPz8gc2VhcmNoSW50ZW50O1xuICBjb25zdCBpbmNsdWRlRGVwcmVjYXRlZCA9IHF1ZXJ5LmluY2x1ZGVEZXByZWNhdGVkID8/IG9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWQgPz8gZmFsc2U7XG4gIGNvbnN0IGVsaWdpYmxlID0gcmVxdWVzdGVkQ2xhc3MgPyBjbGFzc2VzQXRPckJlbG93KHJlcXVlc3RlZENsYXNzKSA6IENIQVRfQ0xBU1NfT1JERVI7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgY29uc3QgZXhwbGljaXRDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcyA/PyBxdWVyeS5tb2RlbENsYXNzO1xuICBpZiAoXG4gICAgc2VhcmNoSW50ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdENsYXNzICE9PSB1bmRlZmluZWQgJiZcbiAgICBpc0NoYXRDbGFzcyhzZWFyY2hJbnRlbnQpICE9PSBpc0NoYXRDbGFzcyhleHBsaWNpdENsYXNzKVxuICApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKHJhbmtlZFNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmFua2VkID0gY2FuZGlkYXRlcztcbiAgaWYgKHJhbmtlZFNlYXJjaCkge1xuICAgIGNvbnN0IGV4YWN0ID0gY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lID09PSByYW5rZWRTZWFyY2gpO1xuICAgIGlmIChleGFjdCkge1xuICAgICAgcmFua2VkID0gW3sgLi4uZXhhY3QsIHNjb3JlOiAwIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSBxdWVyeS50aHJlc2hvbGQgPz8gREVGQVVMVF9GVVpaWV9USFJFU0hPTEQ7XG4gICAgICBjb25zdCBzZWFyY2hUb2tlbnMgPSB0b2tlbml6ZShyYW5rZWRTZWFyY2gpO1xuICAgICAgY29uc3QgdG9rZW5NYXRjaGVzID0gY2FuZGlkYXRlc1xuICAgICAgICAuZmlsdGVyKChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGVUb2tlbnMgPSBuZXcgU2V0KHNlYXJjaGFibGVWYWx1ZXMoY2FuZGlkYXRlLmVuZHBvaW50KS5mbGF0TWFwKHRva2VuaXplKSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlYXJjaFRva2Vucy5sZW5ndGggPiAwICYmIHNlYXJjaFRva2Vucy5ldmVyeSgodG9rZW4pID0+IGNhbmRpZGF0ZVRva2Vucy5oYXModG9rZW4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGNhbmRpZGF0ZSkgPT4gKHsgLi4uY2FuZGlkYXRlLCBzY29yZTogMCB9KSk7XG4gICAgICBpZiAodG9rZW5NYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmFua2VkID0gdG9rZW5NYXRjaGVzLnNvcnQoY29tcGFyZVJhbmtlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmdXNlID0gbmV3IEZ1c2UoY2FuZGlkYXRlcywge1xuICAgICAgICAgIGtleXM6IFtcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5kaXNwbGF5TmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5mYW1pbHlcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5zZXJ2aWNlTmFtZXNcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgICAgICAgdXNlRXh0ZW5kZWRTZWFyY2g6IHRydWUsXG4gICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSB0b2tlbml6ZShyYW5rZWRTZWFyY2gpLmpvaW4oXCIgXCIpO1xuICAgICAgICByYW5rZWQgPSBub3JtYWxpemVkU2VhcmNoXG4gICAgICAgICAgPyBmdXNlXG4gICAgICAgICAgICAgIC5zZWFyY2gobm9ybWFsaXplZFNlYXJjaClcbiAgICAgICAgICAgICAgLmZpbHRlcigocmVzdWx0KSA9PiAocmVzdWx0LnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiAoeyAuLi5yZXN1bHQuaXRlbSwgc2NvcmU6IHJlc3VsdC5zY29yZSA/PyAwIH0pKVxuICAgICAgICAgICAgICAuc29ydChjb21wYXJlUmFua2VkKVxuICAgICAgICAgIDogW107XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3RvcmVkID0gcmFua2VkLm1hcCgocmVzdWx0KSA9PiAoe1xuICAgIC4uLnJlc3VsdCxcbiAgICBlbmRwb2ludDogb3JpZ2luYWxCeU5hbWUuZ2V0KHJlc3VsdC5lbmRwb2ludC5uYW1lKSA/PyByZXN1bHQuZW5kcG9pbnQsXG4gIH0pKTtcbiAgcmV0dXJuIHF1ZXJ5LmxpbWl0ID09PSB1bmRlZmluZWQgPyByZXN0b3JlZCA6IHJlc3RvcmVkLnNsaWNlKDAsIE1hdGgubWF4KDAsIHF1ZXJ5LmxpbWl0KSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBxdWVyeTogTW9kZWxRdWVyeSk6IGJvb2xlYW4ge1xuICBpZiAocXVlcnkubmFtZSAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50Lm5hbWUgIT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5LnRhc2sgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC50YXNrICE9PSBxdWVyeS50YXNrKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBxdWVyeS5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5pbmNsdWRlcyhxdWVyeS5yZWFzb25pbmdFZmZvcnQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgcXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChlbmRwb2ludC5kaW1lbnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gIT09IHF1ZXJ5LmRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPCBxdWVyeS5taW5EaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uID4gcXVlcnkubWF4RGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkgcmVzdWx0LnNldChlbmRwb2ludC5uYW1lLCBtb2RlbENsYXNzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogTm9ybWFsaXplIHNlcmlhbGl6ZWQgU0RLIGVuZHBvaW50IHJlY29yZHMgd2l0aG91dCBuYXRpdmUgYmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3Qgc3VtbWFyaWVzID0gZW5kcG9pbnRzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSByZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQubmFtZSk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gW107XG4gICAgY29uc3QgZW50aXRpZXMgPSBhcnJheVZhbHVlKHJlY29yZChlbmRwb2ludC5jb25maWcpLnNlcnZlZF9lbnRpdGllcykubWFwKHJlY29yZCk7XG4gICAgY29uc3QgaWRlbnRpdGllcyA9IFtcbiAgICAgIG5hbWUsXG4gICAgICAuLi5lbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIFtcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW50aXR5LmVudGl0eV9uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSksXG4gICAgICAgIF0uZmlsdGVyKChpZGVudGl0eSk6IGlkZW50aXR5IGlzIHN0cmluZyA9PiBCb29sZWFuKGlkZW50aXR5KSksXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IGVudGl0aWVzXG4gICAgICAubWFwKFxuICAgICAgICAoZW50aXR5KSA9PlxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLm5hbWUpID8/XG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICApXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uTW9kZWxzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkpO1xuICAgIGNvbnN0IGZhbWlseSA9XG4gICAgICBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAgIC5tYXAoKG1vZGVsKSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQobW9kZWwubW9kZWxfY2xhc3MpKVxuICAgICAgICAuZmluZChCb29sZWFuKSA/PyBpZGVudGl0aWVzLm1hcChtb2RlbEZhbWlseSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCByZWFzb25pbmdFZmZvcnRzID1cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsUmVhc29uaW5nRWZmb3J0cykuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0Lmxlbmd0aCAtIGxlZnQubGVuZ3RoKVswXSA/P1xuICAgICAgW107XG4gICAgY29uc3QgcHJvZmlsZSA9IGVudGl0aWVzLm1hcChtb2RlbFByb2ZpbGUpLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzUmVjb3JkID0gcmVjb3JkKGVuZHBvaW50LmNhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZm91bmRhdGlvbkRlc2NyaXB0aW9uID0gZm91bmRhdGlvbk1vZGVsc1xuICAgICAgLm1hcCgobW9kZWwpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChtb2RlbC5kZXNjcmlwdGlvbikpXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC5kZXNjcmlwdGlvbikgPz8gZm91bmRhdGlvbkRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IHN1bW1hcnk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVuZHBvaW50LCBlbnRpdGllcykpLFxuICAgICAgLi4uKGZhbWlseSA/IHsgZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50LnRhc2spXG4gICAgICAgID8geyB0YXNrOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQudGFzaykgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSlcbiAgICAgICAgPyB7IHN0YXRlOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSkgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIHN1cHBvcnRzVG9vbHM6XG4gICAgICAgIGJvb2xlYW5WYWx1ZShjYXBhYmlsaXRpZXNSZWNvcmQuZnVuY3Rpb25fY2FsbGluZykgPz8gaWRlbnRpdGllcy5zb21lKHN1cHBvcnRzVG9vbHNCeUZhbWlseSksXG4gICAgICAuLi4ocHJvZmlsZSA/IHsgcHJvZmlsZSB9IDoge30pLFxuICAgICAgc2VydmljZU5hbWVzOiBPYmplY3QuYXNzaWduKHt9LCAuLi5pZGVudGl0aWVzLm1hcChtb2RlbFNlcnZpY2VOYW1lcykpLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihyZWFzb25pbmdFZmZvcnRzLmxlbmd0aCA/IHsgcmVhc29uaW5nRWZmb3J0cyB9IDoge30pLFxuICAgICAgc3RhdHVzOiBtb2RlbFN0YXR1c0ZvciguLi5pZGVudGl0aWVzKSxcbiAgICB9O1xuICAgIHJldHVybiBbc3VtbWFyeV07XG4gIH0pO1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoc3VtbWFyaWVzKTtcbiAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gY2xhc3Nlcy5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gbW9kZWxDbGFzcyA/IHsgLi4uc3VtbWFyeSwgY2xhc3M6IG1vZGVsQ2xhc3MgfSA6IHN1bW1hcnk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlUmFua2VkKGxlZnQ6IFJhbmtlZE1vZGVsLCByaWdodDogUmFua2VkTW9kZWwpOiBudW1iZXIge1xuICBjb25zdCBzY29yZSA9IE1hdGgucm91bmQoKGxlZnQuc2NvcmUgPz8gMCkgKiAxMDAwKSAtIE1hdGgucm91bmQoKHJpZ2h0LnNjb3JlID8/IDApICogMTAwMCk7XG4gIGlmIChzY29yZSAhPT0gMCkgcmV0dXJuIHNjb3JlO1xuICBjb25zdCBsZWZ0T3NzID0gaXNPcGVuV2VpZ2h0c0dwdChsZWZ0LmVuZHBvaW50Lm5hbWUpO1xuICBjb25zdCByaWdodE9zcyA9IGlzT3BlbldlaWdodHNHcHQocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGlmIChsZWZ0T3NzICE9PSByaWdodE9zcykgcmV0dXJuIGxlZnRPc3MgPyAxIDogLTE7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxWYXJpYW50UmFuayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIS8oPzpefFstXy5dKWdwdCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDI7XG4gIGlmICgvKD86XnxbLV8uXSlzb2woPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAwO1xuICBpZiAoLyg/Ol58Wy1fLl0pbHVuYSg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZ2VuZXJpYyBqb2Igc2VhcmNoZXMgdG8gdGhlIGNhcGFiaWxpdHkgY2xhc3MgdGhhdCBvd25zIHRoZSB3b3JrLlxuICpcbiAqIEEgcHVyZSBpbnRlbnQgc3VjaCBhcyBcInN1bW1hcml6ZVwiIHJhbmtzIHRoYXQgY2FwYWJpbGl0eSBkaXJlY3RseS4gTWl4ZWRcbiAqIHF1ZXJpZXMgcmVtb3ZlIHRoZSBpbnRlbnQgd29yZCBidXQgcmV0YWluIHRoZSBtb2RlbCBpZGVudGl0eSwgc28gXCJncHQgY2hhdFwiXG4gKiBzdGlsbCB1c2VzIHRoZSBoaXN0b3JpY2FsIHZlcnNpb24gYW5kIHZhcmlhbnQgcHJlZmVyZW5jZSBmb3IgR1BULlxuICovXG5mdW5jdGlvbiBtb2RlbFNlYXJjaFBsYW4oXG4gIHNlYXJjaDogc3RyaW5nLFxuKTogeyByZWFkb25seSBtb2RlbENsYXNzOiBNb2RlbENsYXNzOyByZWFkb25seSBzZWFyY2g/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplKHNlYXJjaCkuZmlsdGVyKCh0b2tlbikgPT4gIVNFQVJDSF9JTlRFTlRfRklMTEVSUy5oYXModG9rZW4pKTtcbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNoYXQgPSB0b2tlbnMuc29tZSgodG9rZW4pID0+IENIQVRfU0VBUkNIX0lOVEVOVFMuaGFzKHRva2VuKSk7XG4gIGNvbnN0IGVtYmVkZGluZyA9IHRva2Vucy5zb21lKCh0b2tlbikgPT4gRU1CRURESU5HX1NFQVJDSF9JTlRFTlRTLmhhcyh0b2tlbikpO1xuICBpZiAoY2hhdCA9PT0gZW1iZWRkaW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBpbnRlbnRXb3JkcyA9IGNoYXQgPyBDSEFUX1NFQVJDSF9JTlRFTlRTIDogRU1CRURESU5HX1NFQVJDSF9JTlRFTlRTO1xuICBjb25zdCByZW1haW5pbmcgPSB0b2tlbnMuZmlsdGVyKCh0b2tlbikgPT4gIWludGVudFdvcmRzLmhhcyh0b2tlbikpO1xuICByZXR1cm4ge1xuICAgIG1vZGVsQ2xhc3M6IGNoYXQgPyBNb2RlbENsYXNzLkNoYXRUaGlua2luZyA6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nLFxuICAgIC4uLihyZW1haW5pbmcubGVuZ3RoID4gMCA/IHsgc2VhcmNoOiByZW1haW5pbmcuam9pbihcIiBcIikgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9rZW5pemUodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbn1cblxuZnVuY3Rpb24gc2VhcmNoYWJsZVZhbHVlcyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBlbmRwb2ludC5uYW1lLFxuICAgIGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgIGVuZHBvaW50LmZhbWlseSxcbiAgICBlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgIC4uLk9iamVjdC52YWx1ZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxQcm9maWxlKGVudGl0eTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgY29uc3Qgc291cmNlID0gcmVjb3JkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkuYWlfZ2F0ZXdheV9tb2RlbF9wcm9maWxlKTtcbiAgY29uc3QgcXVhbGl0eSA9IGZpbml0ZU51bWJlcihzb3VyY2UucXVhbGl0eSk7XG4gIGNvbnN0IHNwZWVkID0gZmluaXRlTnVtYmVyKHNvdXJjZS5zcGVlZCk7XG4gIGNvbnN0IGNvc3QgPSBmaW5pdGVOdW1iZXIoc291cmNlLmNvc3QpO1xuICBpZiAocXVhbGl0eSA9PT0gdW5kZWZpbmVkICYmIHNwZWVkID09PSB1bmRlZmluZWQgJiYgY29zdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHkgfSA6IHt9KSxcbiAgICAuLi4oc3BlZWQgIT09IHVuZGVmaW5lZCA/IHsgc3BlZWQgfSA6IHt9KSxcbiAgICAuLi4oY29zdCAhPT0gdW5kZWZpbmVkID8geyBjb3N0IH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGVkRGlzcGxheU5hbWUoXG4gIGVuZHBvaW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZW50aXRpZXM6IHJlYWRvbmx5IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHRhZyBvZiBhcnJheVZhbHVlKGVuZHBvaW50LnRhZ3MpLm1hcChyZWNvcmQpKSB7XG4gICAgaWYgKCFbXCJkaXNwbGF5X25hbWVcIiwgXCJkaXNwbGF5TmFtZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoU3RyaW5nKHRhZy5rZXkpKSkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQodGFnLnZhbHVlKTtcbiAgICBpZiAodmFsdWUpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLmRpc3BsYXlfbmFtZSkpXG4gICAgICAuZmluZChCb29sZWFuKSA/P1xuICAgIGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmV4dGVybmFsX21vZGVsKS5uYW1lKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgPyB2YWx1ZSA6IHt9O1xufVxuXG5mdW5jdGlvbiBhcnJheVZhbHVlKHZhbHVlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbn1cblxuZnVuY3Rpb24gZmluaXRlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuIl19
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JhbmtpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JhbmtpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUsvQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUVwQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBNEMsRUFDNUMsUUFBb0IsRUFBRSxFQUN0QixVQUFnQyxFQUFFO0lBRWxDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENB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eyBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1vZGVsQ2xhc3MgYXMgTW9kZWxDbGFzc1ZhbHVlcyxcbiAgdHlwZSBNb2RlbENsYXNzIGFzIE1vZGVsQ2xhc3NUeXBlLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdG9Nb2RlbERpc3BsYXlOYW1lIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2Rpc3BsYXlcIjtcbmltcG9ydCBGdXNlIGZyb20gXCJmdXNlLmpzXCI7XG5cbmltcG9ydCB7IG1vZGVsU3RhdHVzRm9yIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCB7IGNsYXNzZXNBdE9yQmVsb3csIENIQVRfQ0xBU1NfT1JERVIsIE1PREVMX0NMQVNTX09SREVSIH0gZnJvbSBcIi4vY2xhc3Nlcy50c1wiO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlFbmRwb2ludHMsXG4gIGVuZHBvaW50Q2FwYWJpbGl0aWVzLFxuICBzdXBwb3J0c1Rvb2xzQnlGYW1pbHksXG4gIHZlcnNpb25UdXBsZSxcbn0gZnJvbSBcIi4vY2xhc3NpZnkudHNcIjtcbmltcG9ydCB7XG4gIGlzT3BlbldlaWdodHNHcHQsXG4gIG1vZGVsRmFtaWx5LFxuICBtb2RlbFJlYXNvbmluZ0VmZm9ydHMsXG4gIG1vZGVsU2VydmljZU5hbWVzLFxufSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1R5cGU7XG5jb25zdCBNb2RlbENsYXNzID0gTW9kZWxDbGFzc1ZhbHVlcztcblxuY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5cbmludGVyZmFjZSBOYXRpdmVSYW5raW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG59XG5cbi8qKiBSYW5rIGVuZHBvaW50IHJlY29yZHMgdGhyb3VnaCB0aGUgVHlwZVNjcmlwdC1vd25lZCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua0VuZHBvaW50cyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4gIG9wdGlvbnM6IE5hdGl2ZVJhbmtpbmdPcHRpb25zID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgY29uc3QgZmlsdGVyZWQgPSBlbmRwb2ludHMuZmlsdGVyKChlbmRwb2ludCkgPT4gbWF0Y2hlc01vZGVsUXVlcnkoZW5kcG9pbnQsIHF1ZXJ5KSk7XG4gIGNvbnN0IG9yaWdpbmFsQnlOYW1lID0gbmV3IE1hcChmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiBbZW5kcG9pbnQubmFtZSwgZW5kcG9pbnRdKSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaWx0ZXJlZC5tYXAoKGVuZHBvaW50KSA9PiAoe1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihvcHRpb25zLm1vZGVsQ2xhc3MgPyB7IGNsYXNzOiBvcHRpb25zLm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy50YXNrID8geyB0YXNrOiBvcHRpb25zLnRhc2sgfSA6IHt9KSxcbiAgfSkpO1xuICBjb25zdCBjbGFzc2lmaWVkID0gb3B0aW9ucy5tb2RlbENsYXNzXG4gICAgPyB7XG4gICAgICAgIFtNb2RlbENsYXNzLkNoYXRUaGlua2luZ106IFtdLFxuICAgICAgICBbTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWRdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuQ2hhdEZhc3RdOiBbXSxcbiAgICAgICAgW01vZGVsQ2xhc3MuRW1iZWRkaW5nXTogW10sXG4gICAgICAgIFtvcHRpb25zLm1vZGVsQ2xhc3NdOiBub3JtYWxpemVkLFxuICAgICAgfVxuICAgIDogY2xhc3NpZnlFbmRwb2ludHMobm9ybWFsaXplZCk7XG4gIGNvbnN0IHNlYXJjaCA9IHF1ZXJ5LnNlYXJjaD8udHJpbSgpO1xuICBjb25zdCByZXF1ZXN0ZWRDbGFzcyA9IG9wdGlvbnMubW9kZWxDbGFzcyA/PyBxdWVyeS5tb2RlbENsYXNzO1xuICBjb25zdCBpbmNsdWRlRGVwcmVjYXRlZCA9IHF1ZXJ5LmluY2x1ZGVEZXByZWNhdGVkID8/IG9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWQgPz8gZmFsc2U7XG4gIGNvbnN0IGVsaWdpYmxlID0gcmVxdWVzdGVkQ2xhc3MgPyBjbGFzc2VzQXRPckJlbG93KHJlcXVlc3RlZENsYXNzKSA6IENIQVRfQ0xBU1NfT1JERVI7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IFJhbmtlZE1vZGVsW10gPSBbXTtcbiAgaWYgKHNlYXJjaCAmJiByZXF1ZXN0ZWRDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xhc3NCeU5hbWUgPSBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcyhub3JtYWxpemVkKTtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIG5vcm1hbGl6ZWQpIHtcbiAgICAgIGlmICghaW5jbHVkZURlcHJlY2F0ZWQgJiYgZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KTtcbiAgICAgIGlmICghY2FwYWJpbGl0aWVzLmNoYXQgfHwgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNhcGFiaWxpdGllcy50b29scykpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIG1vZGVsQ2xhc3M6IGNsYXNzQnlOYW1lLmdldChlbmRwb2ludC5uYW1lKSA/PyBNb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVEZXByZWNhdGVkICYmIGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFlbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgcmFua2VkID1cbiAgICAhc2VhcmNoICYmIHJlcXVlc3RlZENsYXNzID09PSB1bmRlZmluZWRcbiAgICAgID8gcHJlZmVyTGF0ZXN0V2l0aGluTGVhZGluZ0ZhbWlseShjYW5kaWRhdGVzKVxuICAgICAgOiBjYW5kaWRhdGVzO1xuICBpZiAoc2VhcmNoKSB7XG4gICAgY29uc3QgZXhhY3QgPSBjYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmVuZHBvaW50Lm5hbWUgPT09IHNlYXJjaCk7XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICByYW5rZWQgPSBbeyAuLi5leGFjdCwgc2NvcmU6IDAgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHF1ZXJ5LnRocmVzaG9sZCA/PyBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRDtcbiAgICAgIGNvbnN0IHNlYXJjaFRva2VucyA9IHRva2VuaXplKHNlYXJjaCk7XG4gICAgICBjb25zdCB0b2tlbk1hdGNoZXMgPSBjYW5kaWRhdGVzXG4gICAgICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZVRva2VucyA9IG5ldyBTZXQoc2VhcmNoYWJsZVZhbHVlcyhjYW5kaWRhdGUuZW5kcG9pbnQpLmZsYXRNYXAodG9rZW5pemUpKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc2VhcmNoVG9rZW5zLmxlbmd0aCA+IDAgJiYgc2VhcmNoVG9rZW5zLmV2ZXJ5KCh0b2tlbikgPT4gY2FuZGlkYXRlVG9rZW5zLmhhcyh0b2tlbikpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoY2FuZGlkYXRlKSA9PiAoeyAuLi5jYW5kaWRhdGUsIHNjb3JlOiAwIH0pKTtcbiAgICAgIGlmICh0b2tlbk1hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByYW5rZWQgPSB0b2tlbk1hdGNoZXMuc29ydChjb21wYXJlUmFua2VkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZ1c2UgPSBuZXcgRnVzZShjYW5kaWRhdGVzLCB7XG4gICAgICAgICAga2V5czogW1xuICAgICAgICAgICAgXCJlbmRwb2ludC5uYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LmRpc3BsYXlOYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LmZhbWlseVwiLFxuICAgICAgICAgICAgXCJlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lXCIsXG4gICAgICAgICAgICBcImVuZHBvaW50LnNlcnZpY2VOYW1lc1wiLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICAgIGlnbm9yZUxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICAgICAgICB1c2VFeHRlbmRlZFNlYXJjaDogdHJ1ZSxcbiAgICAgICAgICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRva2VuaXplKHNlYXJjaCkuam9pbihcIiBcIik7XG4gICAgICAgIHJhbmtlZCA9IG5vcm1hbGl6ZWRTZWFyY2hcbiAgICAgICAgICA/IGZ1c2VcbiAgICAgICAgICAgICAgLnNlYXJjaChub3JtYWxpemVkU2VhcmNoKVxuICAgICAgICAgICAgICAuZmlsdGVyKChyZXN1bHQpID0+IChyZXN1bHQuc2NvcmUgPz8gMCkgPD0gdGhyZXNob2xkKVxuICAgICAgICAgICAgICAubWFwKChyZXN1bHQpID0+ICh7IC4uLnJlc3VsdC5pdGVtLCBzY29yZTogcmVzdWx0LnNjb3JlID8/IDAgfSkpXG4gICAgICAgICAgICAgIC5zb3J0KGNvbXBhcmVSYW5rZWQpXG4gICAgICAgICAgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdG9yZWQgPSByYW5rZWQubWFwKChyZXN1bHQpID0+ICh7XG4gICAgLi4ucmVzdWx0LFxuICAgIGVuZHBvaW50OiBvcmlnaW5hbEJ5TmFtZS5nZXQocmVzdWx0LmVuZHBvaW50Lm5hbWUpID8/IHJlc3VsdC5lbmRwb2ludCxcbiAgfSkpO1xuICByZXR1cm4gcXVlcnkubGltaXQgPT09IHVuZGVmaW5lZCA/IHJlc3RvcmVkIDogcmVzdG9yZWQuc2xpY2UoMCwgTWF0aC5tYXgoMCwgcXVlcnkubGltaXQpKTtcbn1cblxuZnVuY3Rpb24gcHJlZmVyTGF0ZXN0V2l0aGluTGVhZGluZ0ZhbWlseShjYW5kaWRhdGVzOiByZWFkb25seSBSYW5rZWRNb2RlbFtdKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGxlYWRpbmcgPSBjYW5kaWRhdGVzWzBdO1xuICBpZiAoIWxlYWRpbmcpIHJldHVybiBbXTtcbiAgY29uc3QgZmFtaWx5ID0gbW9kZWxGYW1pbHkobGVhZGluZy5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKCFmYW1pbHkpIHJldHVybiBbLi4uY2FuZGlkYXRlc107XG4gIGNvbnN0IHNhbWVGYW1pbHkgPSBjYW5kaWRhdGVzXG4gICAgLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBtb2RlbEZhbWlseShjYW5kaWRhdGUuZW5kcG9pbnQubmFtZSkgPT09IGZhbWlseSlcbiAgICAuc29ydChjb21wYXJlUmFua2VkKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KHNhbWVGYW1pbHkubWFwKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lKSk7XG4gIHJldHVybiBbXG4gICAgLi4uc2FtZUZhbWlseSxcbiAgICAuLi5jYW5kaWRhdGVzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiAhc2VsZWN0ZWQuaGFzKGNhbmRpZGF0ZS5lbmRwb2ludC5uYW1lKSksXG4gIF07XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNNb2RlbFF1ZXJ5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBxdWVyeTogTW9kZWxRdWVyeSk6IGJvb2xlYW4ge1xuICBpZiAocXVlcnkubmFtZSAhPT0gdW5kZWZpbmVkICYmIGVuZHBvaW50Lm5hbWUgIT09IHF1ZXJ5Lm5hbWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5LnRhc2sgIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC50YXNrICE9PSBxdWVyeS50YXNrKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBxdWVyeS5yZWFzb25pbmdFZmZvcnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzPy5pbmNsdWRlcyhxdWVyeS5yZWFzb25pbmdFZmZvcnQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXG4gICAgcXVlcnkuZGltZW5zaW9uICE9PSB1bmRlZmluZWQgfHxcbiAgICBxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgIHF1ZXJ5Lm1heERpbWVuc2lvbiAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGlmIChlbmRwb2ludC5kaW1lbnNpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5kaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gIT09IHF1ZXJ5LmRpbWVuc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChxdWVyeS5taW5EaW1lbnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbmRwb2ludC5kaW1lbnNpb24gPCBxdWVyeS5taW5EaW1lbnNpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocXVlcnkubWF4RGltZW5zaW9uICE9PSB1bmRlZmluZWQgJiYgZW5kcG9pbnQuZGltZW5zaW9uID4gcXVlcnkubWF4RGltZW5zaW9uKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjbGFzc2lmaWVkID0gY2xhc3NpZnlFbmRwb2ludHMoZW5kcG9pbnRzKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ2xhc3M+KCk7XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkgcmVzdWx0LnNldChlbmRwb2ludC5uYW1lLCBtb2RlbENsYXNzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogTm9ybWFsaXplIHNlcmlhbGl6ZWQgU0RLIGVuZHBvaW50IHJlY29yZHMgd2l0aG91dCBuYXRpdmUgYmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3Qgc3VtbWFyaWVzID0gZW5kcG9pbnRzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSByZWNvcmQodmFsdWUpO1xuICAgIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQubmFtZSk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gW107XG4gICAgY29uc3QgZW50aXRpZXMgPSBhcnJheVZhbHVlKHJlY29yZChlbmRwb2ludC5jb25maWcpLnNlcnZlZF9lbnRpdGllcykubWFwKHJlY29yZCk7XG4gICAgY29uc3QgaWRlbnRpdGllcyA9IFtcbiAgICAgIG5hbWUsXG4gICAgICAuLi5lbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIFtcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW50aXR5LmVudGl0eV9uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5uYW1lKSxcbiAgICAgICAgICBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVudGl0eS5leHRlcm5hbF9tb2RlbCkubmFtZSksXG4gICAgICAgIF0uZmlsdGVyKChpZGVudGl0eSk6IGlkZW50aXR5IGlzIHN0cmluZyA9PiBCb29sZWFuKGlkZW50aXR5KSksXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3QgbW9kZWxTZXJ2aWNlTmFtZSA9IGVudGl0aWVzXG4gICAgICAubWFwKFxuICAgICAgICAoZW50aXR5KSA9PlxuICAgICAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChyZWNvcmQoZW50aXR5LmZvdW5kYXRpb25fbW9kZWwpLm5hbWUpID8/XG4gICAgICAgICAgc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVudGl0eS5lbnRpdHlfbmFtZSksXG4gICAgICApXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBmb3VuZGF0aW9uTW9kZWxzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkpO1xuICAgIGNvbnN0IGZhbWlseSA9XG4gICAgICBmb3VuZGF0aW9uTW9kZWxzXG4gICAgICAgIC5tYXAoKG1vZGVsKSA9PiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQobW9kZWwubW9kZWxfY2xhc3MpKVxuICAgICAgICAuZmluZChCb29sZWFuKSA/PyBpZGVudGl0aWVzLm1hcChtb2RlbEZhbWlseSkuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCByZWFzb25pbmdFZmZvcnRzID1cbiAgICAgIGlkZW50aXRpZXMubWFwKG1vZGVsUmVhc29uaW5nRWZmb3J0cykuc29ydCgobGVmdCwgcmlnaHQpID0+IHJpZ2h0Lmxlbmd0aCAtIGxlZnQubGVuZ3RoKVswXSA/P1xuICAgICAgW107XG4gICAgY29uc3QgcHJvZmlsZSA9IGVudGl0aWVzLm1hcChtb2RlbFByb2ZpbGUpLmZpbmQoQm9vbGVhbik7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzUmVjb3JkID0gcmVjb3JkKGVuZHBvaW50LmNhcGFiaWxpdGllcyk7XG4gICAgY29uc3QgZm91bmRhdGlvbkRlc2NyaXB0aW9uID0gZm91bmRhdGlvbk1vZGVsc1xuICAgICAgLm1hcCgobW9kZWwpID0+IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChtb2RlbC5kZXNjcmlwdGlvbikpXG4gICAgICAuZmluZChCb29sZWFuKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChlbmRwb2ludC5kZXNjcmlwdGlvbikgPz8gZm91bmRhdGlvbkRlc2NyaXB0aW9uO1xuICAgIGNvbnN0IHN1bW1hcnk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lLCBwcm92aWRlZERpc3BsYXlOYW1lKGVuZHBvaW50LCBlbnRpdGllcykpLFxuICAgICAgLi4uKGZhbWlseSA/IHsgZmFtaWx5IH0gOiB7fSksXG4gICAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKGVuZHBvaW50LnRhc2spXG4gICAgICAgID8geyB0YXNrOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQoZW5kcG9pbnQudGFzaykgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSlcbiAgICAgICAgPyB7IHN0YXRlOiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQocmVjb3JkKGVuZHBvaW50LnN0YXRlKS5yZWFkeSkgfVxuICAgICAgICA6IHt9KSxcbiAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIHN1cHBvcnRzVG9vbHM6XG4gICAgICAgIGJvb2xlYW5WYWx1ZShjYXBhYmlsaXRpZXNSZWNvcmQuZnVuY3Rpb25fY2FsbGluZykgPz8gaWRlbnRpdGllcy5zb21lKHN1cHBvcnRzVG9vbHNCeUZhbWlseSksXG4gICAgICAuLi4ocHJvZmlsZSA/IHsgcHJvZmlsZSB9IDoge30pLFxuICAgICAgc2VydmljZU5hbWVzOiBPYmplY3QuYXNzaWduKHt9LCAuLi5pZGVudGl0aWVzLm1hcChtb2RlbFNlcnZpY2VOYW1lcykpLFxuICAgICAgLi4uKG1vZGVsU2VydmljZU5hbWUgPyB7IG1vZGVsU2VydmljZU5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihyZWFzb25pbmdFZmZvcnRzLmxlbmd0aCA/IHsgcmVhc29uaW5nRWZmb3J0cyB9IDoge30pLFxuICAgICAgc3RhdHVzOiBtb2RlbFN0YXR1c0ZvciguLi5pZGVudGl0aWVzKSxcbiAgICB9O1xuICAgIHJldHVybiBbc3VtbWFyeV07XG4gIH0pO1xuICBjb25zdCBjbGFzc2VzID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoc3VtbWFyaWVzKTtcbiAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gY2xhc3Nlcy5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gbW9kZWxDbGFzcyA/IHsgLi4uc3VtbWFyeSwgY2xhc3M6IG1vZGVsQ2xhc3MgfSA6IHN1bW1hcnk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlUmFua2VkKGxlZnQ6IFJhbmtlZE1vZGVsLCByaWdodDogUmFua2VkTW9kZWwpOiBudW1iZXIge1xuICBjb25zdCBzY29yZSA9IE1hdGgucm91bmQoKGxlZnQuc2NvcmUgPz8gMCkgKiAxMDAwKSAtIE1hdGgucm91bmQoKHJpZ2h0LnNjb3JlID8/IDApICogMTAwMCk7XG4gIGlmIChzY29yZSAhPT0gMCkgcmV0dXJuIHNjb3JlO1xuICBjb25zdCBsZWZ0T3NzID0gaXNPcGVuV2VpZ2h0c0dwdChsZWZ0LmVuZHBvaW50Lm5hbWUpO1xuICBjb25zdCByaWdodE9zcyA9IGlzT3BlbldlaWdodHNHcHQocmlnaHQuZW5kcG9pbnQubmFtZSk7XG4gIGlmIChsZWZ0T3NzICE9PSByaWdodE9zcykgcmV0dXJuIGxlZnRPc3MgPyAxIDogLTE7XG4gIGNvbnN0IGxlZnRWZXJzaW9uID0gdmVyc2lvblR1cGxlKGxlZnQuZW5kcG9pbnQubmFtZSk7XG4gIGNvbnN0IHJpZ2h0VmVyc2lvbiA9IHZlcnNpb25UdXBsZShyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmlnaHRWZXJzaW9uW2luZGV4XSEgLSBsZWZ0VmVyc2lvbltpbmRleF0hO1xuICAgIGlmICh2ZXJzaW9uICE9PSAwKSByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBjb25zdCB2YXJpYW50ID0gbW9kZWxWYXJpYW50UmFuayhsZWZ0LmVuZHBvaW50Lm5hbWUpIC0gbW9kZWxWYXJpYW50UmFuayhyaWdodC5lbmRwb2ludC5uYW1lKTtcbiAgaWYgKHZhcmlhbnQgIT09IDApIHJldHVybiB2YXJpYW50O1xuICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihsZWZ0Lm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihyaWdodC5tb2RlbENsYXNzKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxWYXJpYW50UmFuayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoIS8oPzpefFstXy5dKWdwdCg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDI7XG4gIGlmICgvKD86XnxbLV8uXSlzb2woPzpbLV8uXXwkKS9pLnRlc3QobmFtZSkpIHJldHVybiAwO1xuICBpZiAoLyg/Ol58Wy1fLl0pbHVuYSg/OlstXy5dfCQpL2kudGVzdChuYW1lKSkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xufVxuXG5mdW5jdGlvbiBzZWFyY2hhYmxlVmFsdWVzKGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGVuZHBvaW50Lm5hbWUsXG4gICAgZW5kcG9pbnQuZGlzcGxheU5hbWUsXG4gICAgZW5kcG9pbnQuZmFtaWx5LFxuICAgIGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbFByb2ZpbGUoZW50aXR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICBjb25zdCBzb3VyY2UgPSByZWNvcmQocmVjb3JkKGVudGl0eS5mb3VuZGF0aW9uX21vZGVsKS5haV9nYXRld2F5X21vZGVsX3Byb2ZpbGUpO1xuICBjb25zdCBxdWFsaXR5ID0gZmluaXRlTnVtYmVyKHNvdXJjZS5xdWFsaXR5KTtcbiAgY29uc3Qgc3BlZWQgPSBmaW5pdGVOdW1iZXIoc291cmNlLnNwZWVkKTtcbiAgY29uc3QgY29zdCA9IGZpbml0ZU51bWJlcihzb3VyY2UuY29zdCk7XG4gIGlmIChxdWFsaXR5ID09PSB1bmRlZmluZWQgJiYgc3BlZWQgPT09IHVuZGVmaW5lZCAmJiBjb3N0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uKHF1YWxpdHkgIT09IHVuZGVmaW5lZCA/IHsgcXVhbGl0eSB9IDoge30pLFxuICAgIC4uLihzcGVlZCAhPT0gdW5kZWZpbmVkID8geyBzcGVlZCB9IDoge30pLFxuICAgIC4uLihjb3N0ICE9PSB1bmRlZmluZWQgPyB7IGNvc3QgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvdmlkZWREaXNwbGF5TmFtZShcbiAgZW5kcG9pbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBlbnRpdGllczogcmVhZG9ubHkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdGFnIG9mIGFycmF5VmFsdWUoZW5kcG9pbnQudGFncykubWFwKHJlY29yZCkpIHtcbiAgICBpZiAoIVtcImRpc3BsYXlfbmFtZVwiLCBcImRpc3BsYXlOYW1lXCIsIFwibmFtZVwiXS5pbmNsdWRlcyhTdHJpbmcodGFnLmtleSkpKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZCh0YWcudmFsdWUpO1xuICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZm91bmRhdGlvbl9tb2RlbCkuZGlzcGxheV9uYW1lKSlcbiAgICAgIC5maW5kKEJvb2xlYW4pID8/XG4gICAgZW50aXRpZXNcbiAgICAgIC5tYXAoKGVudGl0eSkgPT4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHJlY29yZChlbnRpdHkuZXh0ZXJuYWxfbW9kZWwpLm5hbWUpKVxuICAgICAgLmZpbmQoQm9vbGVhbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSA/IHZhbHVlIDoge307XG59XG5cbmZ1bmN0aW9uIGFycmF5VmFsdWUodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBmaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/lib/src/_selection.js
CHANGED
|
@@ -7,7 +7,6 @@ import * as object from "@dbx-tools/shared-core/object";
|
|
|
7
7
|
import { rankEndpoints } from "./_ranking.js";
|
|
8
8
|
import { FALLBACK_MODEL_IDS, modelsForClass } from "./fallback.js";
|
|
9
9
|
import { endpointSupportsTools } from "./policy.js";
|
|
10
|
-
const DEFAULT_MODEL_FAMILY_SEARCH = "gpt";
|
|
11
10
|
/** Rank a catalogue against a model query, best-first. */
|
|
12
11
|
export function lookupModels(endpoints, query = {}) {
|
|
13
12
|
return rankEndpoints(endpoints, query);
|
|
@@ -47,11 +46,6 @@ export function resolveModel(endpoints, input = {}) {
|
|
|
47
46
|
return { modelId: pinned, source: "fallback" };
|
|
48
47
|
}
|
|
49
48
|
const source = input.modelClass !== undefined ? "class" : "fallback";
|
|
50
|
-
if (input.modelClass === undefined) {
|
|
51
|
-
const [preferred] = lookupModels(endpoints, buildQuery(input, DEFAULT_MODEL_FAMILY_SEARCH));
|
|
52
|
-
if (preferred)
|
|
53
|
-
return { modelId: preferred.endpoint.name, source };
|
|
54
|
-
}
|
|
55
49
|
const [top] = lookupModels(endpoints, buildQuery(input, undefined));
|
|
56
50
|
if (top)
|
|
57
51
|
return { modelId: top.endpoint.name, source };
|
|
@@ -92,4 +86,4 @@ function pickFirstAvailable(candidates, endpoints) {
|
|
|
92
86
|
}
|
|
93
87
|
return candidates[0] ?? FALLBACK_MODEL_IDS[0];
|
|
94
88
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBV3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLENBQUM7QUFFMUMsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsT0FBTyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBNEMsRUFDNUMsTUFBYyxFQUNkLFVBQStCLEVBQUU7SUFFakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxTQUFTLEVBQUU7UUFDcEMsTUFBTTtRQUNOLEtBQUssRUFBRSxDQUFDO1FBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3pGLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3pFLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsU0FBNEMsRUFDNUMsUUFBMkIsRUFBRTtJQUU3QixJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLGFBQWE7Z0JBQUUsaUJBQWlCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQ3JCLFNBQVM7YUFDTixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM3RSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDcEMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxNQUFNO1lBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDckUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksU0FBUztZQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLEdBQUc7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBRXZELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQ2YsS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNGLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUN2QixTQUFTLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQ3pFLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ25FLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUF3QixFQUFFLE1BQTBCO0lBQ3RFLE9BQU87UUFDTCxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRixHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLEtBQUssRUFBRSxDQUFDO0tBQ1QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFNBQTRDLEVBQUUsT0FBZTtJQUN0RixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxPQUFPLG1DQUFtQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUN6QixVQUE2QixFQUM3QixTQUE0QztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnVudGltZS1pbmRlcGVuZGVudCBtb2RlbCByYW5raW5nIGFuZCBzZWxlY3Rpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvb2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUXVlcnksXG4gIFJhbmtlZE1vZGVsLFxuICBSZXNvbHZlZE1vZGVsLFxuICBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuICBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQgeyByYW5rRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcbmltcG9ydCB7IEZBTExCQUNLX01PREVMX0lEUywgbW9kZWxzRm9yQ2xhc3MgfSBmcm9tIFwiLi9mYWxsYmFjay50c1wiO1xuaW1wb3J0IHsgZW5kcG9pbnRTdXBwb3J0c1Rvb2xzIH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5cbmNvbnN0IERFRkFVTFRfTU9ERUxfRkFNSUxZX1NFQVJDSCA9IFwiZ3B0XCI7XG5cbi8qKiBSYW5rIGEgY2F0YWxvZ3VlIGFnYWluc3QgYSBtb2RlbCBxdWVyeSwgYmVzdC1maXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBNb2RlbHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBxdWVyeTogTW9kZWxRdWVyeSA9IHt9LFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIHJldHVybiByYW5rRW5kcG9pbnRzKGVuZHBvaW50cywgcXVlcnkpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgY2xvc2VzdCBtb2RlbCBpZCBpbiBvbmUgY2F0YWxvZ3VlIHNuYXBzaG90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmtNb2RlbElkKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgc2VhcmNoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVNb2RlbE9wdGlvbnMgPSB7fSxcbik6IFJlc29sdmVkTW9kZWwge1xuICBjb25zdCBbdG9wXSA9IGxvb2t1cE1vZGVscyhlbmRwb2ludHMsIHtcbiAgICBzZWFyY2gsXG4gICAgbGltaXQ6IDEsXG4gICAgLi4uKG9wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogb3B0aW9ucy50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IG9wdGlvbnMucmVxdWlyZXNUb29scyB9IDoge30pLFxuICB9KTtcbiAgaWYgKCF0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHNlYXJjaCwgbWF0Y2hlZDogZmFsc2UgfTtcbiAgcmV0dXJuIHsgbW9kZWxJZDogdG9wLmVuZHBvaW50Lm5hbWUsIG1hdGNoZWQ6IHRydWUsIHNjb3JlOiB0b3Auc2NvcmUgfTtcbn1cblxuLyoqIFJlc29sdmUgYSBzaW5nbGUgbW9kZWwgaWQgZnJvbSBhIGNhdGFsb2d1ZSBhbmQgY2FsbGVyIGludGVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQgPSB7fSxcbik6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb24ge1xuICBpZiAoaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpbnB1dC5mdXp6eSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHMsIGlucHV0LmV4cGxpY2l0KTtcbiAgICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICAgIH1cbiAgICBjb25zdCBbdG9wXSA9IGxvb2t1cE1vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIGlucHV0LmV4cGxpY2l0KSk7XG4gICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMgJiYgIXRvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0b29sLWNhcGFibGUgbW9kZWwgbWF0Y2hlcyBcIiR7aW5wdXQuZXhwbGljaXR9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogdG9wPy5lbmRwb2ludC5uYW1lID8/IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZnV6enktbWF0Y2hcIiB9O1xuICB9XG5cbiAgaWYgKGlucHV0Lm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mYWxsYmFja3MgJiYgaW5wdXQuZmFsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gIWlucHV0LnJlcXVpcmVzVG9vbHMgfHwgZW5kcG9pbnRTdXBwb3J0c1Rvb2xzKGVuZHBvaW50KSlcbiAgICAgICAgLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3QgcGlubmVkID0gaW5wdXQuZmFsbGJhY2tzLmZpbmQoKGlkKSA9PiBwcmVzZW50LmhhcyhpZCkpO1xuICAgIGlmIChwaW5uZWQpIHJldHVybiB7IG1vZGVsSWQ6IHBpbm5lZCwgc291cmNlOiBcImZhbGxiYWNrXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IFwiY2xhc3NcIiA6IFwiZmFsbGJhY2tcIjtcbiAgaWYgKGlucHV0Lm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IFtwcmVmZXJyZWRdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgREVGQVVMVF9NT0RFTF9GQU1JTFlfU0VBUkNIKSk7XG4gICAgaWYgKHByZWZlcnJlZCkgcmV0dXJuIHsgbW9kZWxJZDogcHJlZmVycmVkLmVuZHBvaW50Lm5hbWUsIHNvdXJjZSB9O1xuICB9XG4gIGNvbnN0IFt0b3BdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgdW5kZWZpbmVkKSk7XG4gIGlmICh0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBzb3VyY2UgfTtcblxuICBpZiAoaW5wdXQubGl2ZU9ubHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtYXRjaGluZyBsaXZlIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgaXMgYXZhaWxhYmxlXCIpO1xuICB9XG5cbiAgY29uc3QgZmxvb3JTb3VyY2UgPVxuICAgIGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IG1vZGVsc0ZvckNsYXNzKGlucHV0Lm1vZGVsQ2xhc3MpIDogKGlucHV0LmZhbGxiYWNrcyA/PyBbXSk7XG4gIGNvbnN0IGZsb29yID0gb2JqZWN0LnNlcXVlbmNlKGZsb29yU291cmNlKS5jb25jYXQoRkFMTEJBQ0tfTU9ERUxfSURTKS5kaXN0aW5jdCgpLnRvQXJyYXkoKTtcbiAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KFxuICAgICAgZW5kcG9pbnRzLmZpbHRlcihlbmRwb2ludFN1cHBvcnRzVG9vbHMpLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBmbG9vci5maW5kKChpZCkgPT4gYXZhaWxhYmxlLmhhcyhpZCkpO1xuICAgIGlmICghc2VsZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIk5vIHRvb2wtY2FwYWJsZSBtb2RlbCBpcyBhdmFpbGFibGVcIik7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogc2VsZWN0ZWQsIHNvdXJjZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IHBpY2tGaXJzdEF2YWlsYWJsZShmbG9vciwgZW5kcG9pbnRzKSwgc291cmNlIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUXVlcnkoaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE1vZGVsUXVlcnkge1xuICByZXR1cm4ge1xuICAgIC4uLihzZWFyY2ggIT09IHVuZGVmaW5lZCA/IHsgc2VhcmNoIH0gOiB7fSksXG4gICAgLi4uKGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzczogaW5wdXQubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IGlucHV0LnJlcXVpcmVzVG9vbHMgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogaW5wdXQudGhyZXNob2xkIH0gOiB7fSksXG4gICAgbGltaXQ6IDEsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLCBtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbW9kZWxJZCk7XG4gIGlmICghZW5kcG9pbnQgfHwgIWVuZHBvaW50U3VwcG9ydHNUb29scyhlbmRwb2ludCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbElkfVwiIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gdG9vbHNgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwaWNrRmlyc3RBdmFpbGFibGUoXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGVuZHBvaW50cy5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocHJlc2VudC5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlc1swXSA/PyBGQUxMQkFDS19NT0RFTF9JRFNbMF0hO1xufVxuIl19
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBV3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsT0FBTyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBNEMsRUFDNUMsTUFBYyxFQUNkLFVBQStCLEVBQUU7SUFFakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxTQUFTLEVBQUU7UUFDcEMsTUFBTTtRQUNOLEtBQUssRUFBRSxDQUFDO1FBQ1IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3pGLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFD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bGVjdGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCAqIGFzIG9iamVjdCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxRdWVyeSxcbiAgUmFua2VkTW9kZWwsXG4gIFJlc29sdmVkTW9kZWwsXG4gIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4gIFJlc29sdmVNb2RlbElucHV0LFxuICBSZXNvbHZlTW9kZWxPcHRpb25zLFxuICBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IHJhbmtFbmRwb2ludHMgfSBmcm9tIFwiLi9fcmFua2luZy50c1wiO1xuaW1wb3J0IHsgRkFMTEJBQ0tfTU9ERUxfSURTLCBtb2RlbHNGb3JDbGFzcyB9IGZyb20gXCIuL2ZhbGxiYWNrLnRzXCI7XG5pbXBvcnQgeyBlbmRwb2ludFN1cHBvcnRzVG9vbHMgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIFJhbmsgYSBjYXRhbG9ndWUgYWdhaW5zdCBhIG1vZGVsIHF1ZXJ5LCBiZXN0LWZpcnN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE1vZGVscyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgcmV0dXJuIHJhbmtFbmRwb2ludHMoZW5kcG9pbnRzLCBxdWVyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBjbG9zZXN0IG1vZGVsIGlkIGluIG9uZSBjYXRhbG9ndWUgc25hcHNob3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua01vZGVsSWQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFt0b3BdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywge1xuICAgIHNlYXJjaCxcbiAgICBsaW1pdDogMSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXRvcCkgcmV0dXJuIHsgbW9kZWxJZDogc2VhcmNoLCBtYXRjaGVkOiBmYWxzZSB9O1xuICByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IHRvcC5zY29yZSB9O1xufVxuXG4vKiogUmVzb2x2ZSBhIHNpbmdsZSBtb2RlbCBpZCBmcm9tIGEgY2F0YWxvZ3VlIGFuZCBjYWxsZXIgaW50ZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50cywgaW5wdXQuZXhwbGljaXQpO1xuICAgICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gICAgfVxuICAgIGNvbnN0IFt0b3BdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgaW5wdXQuZXhwbGljaXQpKTtcbiAgICBpZiAoaW5wdXQucmVxdWlyZXNUb29scyAmJiAhdG9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRvb2wtY2FwYWJsZSBtb2RlbCBtYXRjaGVzIFwiJHtpbnB1dC5leHBsaWNpdH1cImApO1xuICAgIH1cbiAgICByZXR1cm4geyBtb2RlbElkOiB0b3A/LmVuZHBvaW50Lm5hbWUgPz8gaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJmdXp6eS1tYXRjaFwiIH07XG4gIH1cblxuICBpZiAoaW5wdXQubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkICYmIGlucHV0LmZhbGxiYWNrcyAmJiBpbnB1dC5mYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KFxuICAgICAgZW5kcG9pbnRzXG4gICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KSA9PiAhaW5wdXQucmVxdWlyZXNUb29scyB8fCBlbmRwb2ludFN1cHBvcnRzVG9vbHMoZW5kcG9pbnQpKVxuICAgICAgICAubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBwaW5uZWQgPSBpbnB1dC5mYWxsYmFja3MuZmluZCgoaWQpID0+IHByZXNlbnQuaGFzKGlkKSk7XG4gICAgaWYgKHBpbm5lZCkgcmV0dXJuIHsgbW9kZWxJZDogcGlubmVkLCBzb3VyY2U6IFwiZmFsbGJhY2tcIiB9O1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8gXCJjbGFzc1wiIDogXCJmYWxsYmFja1wiO1xuICBjb25zdCBbdG9wXSA9IGxvb2t1cE1vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIHVuZGVmaW5lZCkpO1xuICBpZiAodG9wKSByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgc291cmNlIH07XG5cbiAgaWYgKGlucHV0LmxpdmVPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgbGl2ZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IGlzIGF2YWlsYWJsZVwiKTtcbiAgfVxuXG4gIGNvbnN0IGZsb29yU291cmNlID1cbiAgICBpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBtb2RlbHNGb3JDbGFzcyhpbnB1dC5tb2RlbENsYXNzKSA6IChpbnB1dC5mYWxsYmFja3MgPz8gW10pO1xuICBjb25zdCBmbG9vciA9IG9iamVjdC5zZXF1ZW5jZShmbG9vclNvdXJjZSkuY29uY2F0KEZBTExCQUNLX01PREVMX0lEUykuZGlzdGluY3QoKS50b0FycmF5KCk7XG4gIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50cy5maWx0ZXIoZW5kcG9pbnRTdXBwb3J0c1Rvb2xzKS5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gZmxvb3IuZmluZCgoaWQpID0+IGF2YWlsYWJsZS5oYXMoaWQpKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB0b29sLWNhcGFibGUgbW9kZWwgaXMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IHNlbGVjdGVkLCBzb3VyY2UgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBwaWNrRmlyc3RBdmFpbGFibGUoZmxvb3IsIGVuZHBvaW50cyksIHNvdXJjZSB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFF1ZXJ5KGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCwgc2VhcmNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNb2RlbFF1ZXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oc2VhcmNoICE9PSB1bmRlZmluZWQgPyB7IHNlYXJjaCB9IDoge30pLFxuICAgIC4uLihpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3M6IGlucHV0Lm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQucmVxdWlyZXNUb29scyAhPT0gdW5kZWZpbmVkID8geyByZXF1aXJlc1Rvb2xzOiBpbnB1dC5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgLi4uKGlucHV0LnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IGlucHV0LnRocmVzaG9sZCB9IDoge30pLFxuICAgIGxpbWl0OiAxLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSwgbW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVuZHBvaW50ID0gZW5kcG9pbnRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG1vZGVsSWQpO1xuICBpZiAoIWVuZHBvaW50IHx8ICFlbmRwb2ludFN1cHBvcnRzVG9vbHMoZW5kcG9pbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxJZH1cIiBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIHRvb2xzYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGlja0ZpcnN0QXZhaWxhYmxlKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSkpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHByZXNlbnQuaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gRkFMTEJBQ0tfTU9ERUxfSURTWzBdITtcbn1cbiJdfQ==
|
package/lib/src/model-catalog.js
CHANGED
|
@@ -179,7 +179,6 @@ export function searchServingEndpoints(input, endpoints, options = {}) {
|
|
|
179
179
|
threshold: options.threshold ?? DEFAULT_FUZZY_THRESHOLD,
|
|
180
180
|
}, {
|
|
181
181
|
includeDeprecated: true,
|
|
182
|
-
modelClass: model.ModelClass.ChatBalanced,
|
|
183
182
|
task: "llm/v1/chat",
|
|
184
183
|
}).map((ranked) => ({ endpoint: ranked.endpoint, score: ranked.score ?? 0 }));
|
|
185
184
|
}
|
|
@@ -197,4 +196,4 @@ export function resolveModelId(input, endpoints, options = {}) {
|
|
|
197
196
|
}
|
|
198
197
|
return { modelId: input, matched: false };
|
|
199
198
|
}
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxLQUFLLEdBS04sTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFFN0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQVMzQywwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFeEQsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxnRUFBZ0U7QUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztBQW9CaEQsNEVBQTRFO0FBQzVFLFNBQVMsWUFBWSxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sU0FBUyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElB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RSxDQUFDO1FBQ1QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMaXZlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBjYXRhbG9ndWUgYWNjZXNzLlxuICpcbiAqIExpc3RzIHRoZSB3b3Jrc3BhY2UncyBgL3NlcnZpbmctZW5kcG9pbnRzYCBhbmQsIHdoZW4gdGhlIGNhbGxlciBzdXBwbGllcyBhXG4gKiB0cnVzdGVkIGNyZWRlbnRpYWwgaWRlbnRpdHksIGNhY2hlcyB0aGUgcmVzdWx0IHBlciBob3N0IGFuZCBpZGVudGl0eSB3aXRoIGFcbiAqIFRUTCB2aWEgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAuIENvbmN1cnJlbnQgY2FsbGVycyBpbiB0aGUgc2FtZSBzY29wZSBzaGFyZVxuICogb25lIGluLWZsaWdodCBwcm9taXNlLiBTdXJmYWNlcyBlYWNoIGVuZHBvaW50IGFzIGEgc3RhYmxlXG4gKiB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeX0gLSBpbmNsdWRpbmcgdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJXG4gKiBgcXVhbGl0eWAgLyBgc3BlZWRgIC8gYGNvc3RgIHByb2ZpbGUgd2hlbiBwcmVzZW50LCB0aGUgY2xhc3NpZmllZFxuICoge0BsaW5rIE1vZGVsQ2xhc3N9LCBhbmQgKGZvciBlbWJlZGRpbmcgZW5kcG9pbnRzKSB0aGUgbWVhc3VyZWQgdmVjdG9yXG4gKiBgZGltZW5zaW9uYCAtIGFuZCBzbmFwcyBsb29zZSwgaHVtYW4tdHlwZWQgbmFtZXMgdG8gcmVhbCBlbmRwb2ludCBpZHNcbiAqIHRocm91Z2ggdGhlIFR5cGVTY3JpcHQgbW9kZWwgcmFua2VyIHNvIHRva2VucyBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZSB0b1xuICogYGRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZgLlxuICpcbiAqIFRoZSBjbGFzcyBzdGFtcCBhbmQgZW1iZWRkaW5nIGRpbWVuc2lvbiBhcmUgY29tcHV0ZWQgb25jZSBwZXIgY2FjaGUgbG9hZDpcbiAqIGV2ZXJ5IGVtYmVkZGluZyBlbmRwb2ludCBpcyBcInBpbmdlZFwiIGluIHBhcmFsbGVsIGFuZCB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICogbGVuZ3RoIHJlY29yZGVkLCBzbyB0aGUgY29zdCBpcyBwYWlkIG9uIGEgY2FjaGUgbWlzcywgbm90IHBlciByZWFkLiBUaGUgcGluZ1xuICogaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWx1cmUgbG9ncyBhdCBkZWJ1ZyBhbmQgbGVhdmVzIGBkaW1lbnNpb25gIHVuc2V0IHJhdGhlclxuICogdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsaXN0aW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBtb2RlbCxcbiAgdHlwZSBSZXNvbHZlZE1vZGVsLFxuICB0eXBlIFJlc29sdmVNb2RlbE9wdGlvbnMsXG4gIHR5cGUgU2NvcmVkRW5kcG9pbnQsXG4gIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbmltcG9ydCB7IGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzLCBub3JtYWxpemVFbmRwb2ludHMsIHJhbmtFbmRwb2ludHMgfSBmcm9tIFwiLi9fcmFua2luZy50c1wiO1xuXG5jb25zdCB7IE1vZGVsQ2xhc3MgfSA9IG1vZGVsO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvc2VydmluZ1wiKTtcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHR5cGUgZm9yIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQsIHJlLWV4cG9ydGVkIHNvIHRoZSByZXN0XG4gKiBvZiB0aGlzIHBhY2thZ2UgY2FuIGtlZXAgaW1wb3J0aW5nIGl0IGZyb20gaGVyZS4gU2VlXG4gKiBgYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2VgIChub2RlLWFwcGtpdCkgZm9yIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IFBpY2s8YXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2UsIFwic2VydmluZ0VuZHBvaW50c1wiPjtcblxuLyoqIERlZmF1bHQgVFRMIGZvciB0aGUgaW4tbWVtb3J5IGVuZHBvaW50IGNhY2hlLiBNYXRjaGVzIHRoZSBEYXRhYnJpY2tzIFNESydzIHNlc3Npb24gbGlmZXRpbWUgYnVkZ2V0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqIERlZmF1bHQgZnV6enkgZGlzdGFuY2UgdGhyZXNob2xkIGJlbG93IHdoaWNoIGEgbWF0Y2ggaXMgYWNjZXB0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GVVpaWV9USFJFU0hPTEQgPSAwLjQ7XG5cbi8qKiBDYWNoZSBrZXkgcGFydHMgdW5kZXIgd2hpY2ggZW5kcG9pbnQgbGlzdGluZ3MgYXJlIHN0b3JlZC4gKi9cbmNvbnN0IENBQ0hFX0tFWV9OQU1FU1BBQ0UgPSBcInNlcnZpbmctZW5kcG9pbnRzXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMge1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2FjaGUgVFRMIGZvciB0aGlzIGNhbGwsIGluIG1pbGxpc2Vjb25kcy4gRm9yd2FyZGVkIHRvXG4gICAqIGBDYWNoZU1hbmFnZXJgIGFzIHNlY29uZHMuXG4gICAqL1xuICB0dGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgdXNlZCBieSBgY2xpZW50YC5cbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIGhhc2hlZCBiZWZvcmUgaXQgZW50ZXJzIHRoZSBjYWNoZSBrZXkgYW5kIGlzIG5ldmVyIGxvZ2dlZC5cbiAgICogT21pdCBpdCB3aGVuIHRoZSBjYWxsZXIgY2Fubm90IHByb3ZlIHRoZSBjcmVkZW50aWFsIGlkZW50aXR5OyB0aGF0IGNhbGxcbiAgICogYnlwYXNzZXMgc2hhcmVkIGNhY2hpbmcgc28gb25lIHByaW5jaXBhbCBjYW4gbmV2ZXIgcmVhZCBhbm90aGVyJ3NcbiAgICogY2F0YWxvZ3VlLlxuICAgKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIEhhc2ggYW4gb3BhcXVlIGNyZWRlbnRpYWwgaWRlbnRpdHkgYmVmb3JlIGhhbmRpbmcgaXQgdG8gQ2FjaGVNYW5hZ2VyLiAqL1xuZnVuY3Rpb24gY2FjaGVVc2VyS2V5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYG1vZGVsLSR7Y3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaWRlbnRpdHkpLmRpZ2VzdChcImhleFwiKX1gO1xufVxuXG4vKipcbiAqIExpc3QgTW9kZWwgU2VydmluZyBlbmRwb2ludHMgZm9yIHRoZSB3b3Jrc3BhY2Ugb3duaW5nIGBjbGllbnRgLCByb3V0ZWRcbiAqIHRocm91Z2ggQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAuIFRoZSBtYW5hZ2VyIGdpdmVzIHVzIGV2ZXJ5dGhpbmdcbiAqIGBjYWNoZXRvb2xzLlRUTENhY2hlYCBwcm92aWRlcyBwbHVzIHdoYXQgYGNhY2hldG9vbHMtYXN5bmNgIGFkZHMgb24gdG9wOlxuICogcGVyLWVudHJ5IFRUTCwgaW4tZmxpZ2h0IHJlcXVlc3QgY29hbGVzY2luZyAoY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIG9uZVxuICogZmV0Y2ggdmlhIHRoZSBtYW5hZ2VyJ3MgaW50ZXJuYWwgYGluRmxpZ2h0UmVxdWVzdHNgIG1hcCksIGJvdW5kZWQgc2l6ZSxcbiAqIHRlbGVtZXRyeSBzcGFucyAoYGNhY2hlLmdldE9yRXhlY3V0ZWApLCBhbmQgb3B0aW9uYWwgTGFrZWJhc2UgcGVyc2lzdGVuY2Ugc29cbiAqIHRoZSBjYXRhbG9ndWUgc3Vydml2ZXMgcmVzdGFydHMgd2hlbiB0aGUgbGFrZWJhc2UgcGx1Z2luIGlzIHdpcmVkIHVwLlxuICpcbiAqIFJldHVybnMgcGxhaW4ge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IG9iamVjdHMgKGEgc3RhYmxlIHN1YnNldCBvZiB0aGVcbiAqIFNESyB0eXBlKSBzbyBjYWNoZSBoaXRzIG5ldmVyIGV4cG9zZSBzdGFsZSBTREsgaW50ZXJuYWxzLiBFcnJvcnMgZnJvbVxuICogYENhY2hlTWFuYWdlcmAgb3IgdGhlIFNESyBmZXRjaCBwcm9wYWdhdGUgdG8gdGhlIGNhbGxlciAtIHdlIGRvbid0IHN3YWxsb3dcbiAqIHRoZW0gc28gdXNlcnMgc2VlIHRoZSByZWFsIGF1dGggLyBuZXR3b3JrIGlzc3VlLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAgc28gbXVsdGktaG9zdCBhcHBzIHNoYXJlIG9uZSBlbnRyeSBwZXJcbiAqICAgd29ya3NwYWNlLlxuICogQHBhcmFtIG9wdGlvbnMudHRsTXMgLSBPdmVycmlkZSB0aGUgZGVmYXVsdCBUVEwganVzdCBmb3IgdGhpcyBjYWxsLiBGb3J3YXJkZWRcbiAqICAgdG8gYENhY2hlTWFuYWdlcmAgYXMgc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgb3B0aW9uczogTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBpZiAoIW9wdGlvbnMuY2FjaGVJZGVudGl0eSkgcmV0dXJuIGZldGNoRW5kcG9pbnRzKGNsaWVudCk7XG4gIGNvbnN0IHR0bFNlYyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKG9wdGlvbnMudHRsTXMgPz8gREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMpIC8gMTAwMCkpO1xuICByZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldE9yRXhlY3V0ZShcbiAgICBbQ0FDSEVfS0VZX05BTUVTUEFDRSwgaG9zdF0sXG4gICAgKCkgPT4gZmV0Y2hFbmRwb2ludHMoY2xpZW50KSxcbiAgICBjYWNoZVVzZXJLZXkob3B0aW9ucy5jYWNoZUlkZW50aXR5KSxcbiAgICB7IHR0bDogdHRsU2VjIH0sXG4gICk7XG59XG5cbi8qKlxuICogTGlzdCB0aGUgd29ya3NwYWNlJ3Mgc2VydmluZyBlbmRwb2ludHMgYXMgbWluaW1hbFxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IG9iamVjdHMgc3RyYWlnaHQgZnJvbSB0aGUgU0RLOiBubyBjYWNoaW5nLCBhbmRcbiAqIG5vbmUgb2YgdGhlIGNhY2hlLWxvYWQgZW5yaWNobWVudCAoe0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfSBhZGRzIHRoZVxuICoge0BsaW5rIE1vZGVsQ2xhc3N9IHN0YW1wIGFuZCB0aGUgZW1iZWRkaW5nLWRpbWVuc2lvbiBwcm9iZSkuIFVzZSB0aGlzIGZvciBhXG4gKiBvbmUtc2hvdCwgZGVwZW5kZW5jeS1saWdodCBsaXN0aW5nIC0gZS5nLiBhIENMSSB0aGF0IG9ubHkgbmVlZHMgbmFtZXMvdGFza3NcbiAqIGZvciBmdXp6eSByZXNvbHV0aW9uIGFuZCBkb2Vzbid0IHdhbnQgQXBwS2l0J3MgYENhY2hlTWFuYWdlcmAgb3IgdGhlXG4gKiBwZXItZW1iZWRkaW5nIHBpbmcgY29zdC4gUHJlZmVyIHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gZm9yIHRoZSBjYWNoZWQsXG4gKiBlbnJpY2hlZCB2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZpbmdFbmRwb2ludHNVbmNhY2hlZChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3QgZW5kcG9pbnRzOiB1bmtub3duW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBlcCBvZiBjbGllbnQuc2VydmluZ0VuZHBvaW50cy5saXN0KCkpIHtcbiAgICBlbmRwb2ludHMucHVzaChlcCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZUVuZHBvaW50cyhlbmRwb2ludHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEVuZHBvaW50cyhjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCBjbGFzc2lmaWVkID0gc3RhbXBNb2RlbENsYXNzZXMoYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHNVbmNhY2hlZChjbGllbnQpKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoY2xpZW50LCBjbGFzc2lmaWVkKTtcbiAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkXCIsIHsgY291bnQ6IG91dC5sZW5ndGgsIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCB9KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTdGFtcCBlYWNoIHN1bW1hcnkncyB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeS5jbGFzc30gZnJvbSB0aGUgcmVsYXRpdmVcbiAqIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSB3aG9sZSBzZXQuIEVuZHBvaW50cyB0aGUgY2xhc3NpZmllciBkb2Vzbid0IHJlY29nbml6ZVxuICogKGN1c3RvbSwgdW5zY29yZWQsIG5vbi1MTE0pIGFyZSBsZWZ0IHdpdGhvdXQgYSBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gc3RhbXBNb2RlbENsYXNzZXMoc3VtbWFyaWVzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10pOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10ge1xuICBjb25zdCBjbGFzc09mID0gY2xhc3NpZnlFbmRwb2ludENsYXNzZXMoc3VtbWFyaWVzKTtcbiAgcmV0dXJuIHN1bW1hcmllcy5tYXAoKHN1bW1hcnkpID0+IHtcbiAgICBjb25zdCBjbHMgPSBjbGFzc09mLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIHJldHVybiBjbHMgPT09IHVuZGVmaW5lZCA/IHN1bW1hcnkgOiB7IC4uLnN1bW1hcnksIGNsYXNzOiBjbHMgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogTWVhc3VyZSB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gb2YgZXZlcnkge0BsaW5rIE1vZGVsQ2xhc3MuRW1iZWRkaW5nfVxuICogZW5kcG9pbnQgYnkgcGluZ2luZyBpdCBvbmNlLCBhbGwgaW4gcGFyYWxsZWwuIFJ1bnMgb25seSBvbiBhIGNhY2hlIG1pc3MgKGl0J3NcbiAqIGNhbGxlZCBmcm9tIHtAbGluayBmZXRjaEVuZHBvaW50c30pLCBzbyB0aGUgcHJvYmUgY29zdCBpcyBhbW9ydGl6ZWQgYWNyb3NzIHRoZVxuICogY2FjaGVkIFRUTCB3aW5kb3cuIFBlci1lbmRwb2ludCBmYWlsdXJlcyBhcmUgc3dhbGxvd2VkIChsb2dnZWQgYXQgd2Fybikgc28gb25lXG4gKiB1bnJlYWNoYWJsZSBlbWJlZGRpbmcgbW9kZWwgbmV2ZXIgZmFpbHMgdGhlIGxpc3RpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIHN1bW1hcmllczogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHN1bW1hcmllcy5tYXAoYXN5bmMgKHN1bW1hcnkpID0+IHtcbiAgICAgIGlmIChzdW1tYXJ5LmNsYXNzICE9PSBNb2RlbENsYXNzLkVtYmVkZGluZykgcmV0dXJuIHN1bW1hcnk7XG4gICAgICBjb25zdCBkaW1lbnNpb24gPSBhd2FpdCBwaW5nRW1iZWRkaW5nRGltZW5zaW9uKGNsaWVudCwgc3VtbWFyeS5uYW1lKTtcbiAgICAgIHJldHVybiBkaW1lbnNpb24gPT09IHVuZGVmaW5lZCA/IHN1bW1hcnkgOiB7IC4uLnN1bW1hcnksIGRpbWVuc2lvbiB9O1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGVtYmVkZGluZyBkaW1lbnNpb24gcHJvYmU6IHF1ZXJ5IGBuYW1lYCB3aXRoIGEgdGlueSBgXCJwaW5nXCJgXG4gKiBpbnB1dCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHZlY3Rvci4gUmV0dXJucyBgdW5kZWZpbmVkYCAoYW5kXG4gKiBsb2dzIGF0IHdhcm4pIHdoZW4gdGhlIGVuZHBvaW50IGNhbid0IGJlIHF1ZXJpZWQgb3IgcmV0dXJucyBubyB2ZWN0b3IgLSB0aGVcbiAqIGRpbWVuc2lvbiBpcyBpbmZvcm1hdGlvbmFsLCBuZXZlciByZXF1aXJlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMucXVlcnkoeyBuYW1lLCBpbnB1dDogXCJwaW5nXCIgfSk7XG4gICAgY29uc3QgZGltZW5zaW9uID0gcmVzcG9uc2UuZGF0YT8uWzBdPy5lbWJlZGRpbmc/Lmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGRpbWVuc2lvbiA9PT0gXCJudW1iZXJcIiAmJiBkaW1lbnNpb24gPiAwKSByZXR1cm4gZGltZW5zaW9uO1xuICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIHBpbmcgcmV0dXJuZWQgbm8gdmVjdG9yXCIsIHsgbmFtZSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIGZhaWxlZFwiLCB7IG5hbWUsIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JjZS1ldmljdCBjYWNoZWQgZW5kcG9pbnQgbGlzdGluZ3MgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBBIGhvc3QgYW5kXG4gKiBpZGVudGl0eSBkZWxldGUgb25seSB0aGF0IHByaW5jaXBhbCdzIHdvcmtzcGFjZSBlbnRyeS4gQmVjYXVzZSBDYWNoZU1hbmFnZXJcbiAqIGNhbm5vdCBlbnVtZXJhdGUgYSBuYW1lc3BhY2UsIG9taXR0aW5nIGVpdGhlciB2YWx1ZSBjbGVhcnMgdGhlIGNvbXBsZXRlXG4gKiBtYW5hZ2VyIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHRlc3RzIG9yIGFkbWluaXN0cmF0aXZlIHJlZnJlc2hlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyU2VydmluZ0VuZHBvaW50c0NhY2hlKFxuICBob3N0Pzogc3RyaW5nLFxuICBjYWNoZUlkZW50aXR5Pzogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpO1xuICBpZiAoaG9zdCAmJiBjYWNoZUlkZW50aXR5KSB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGUuZ2VuZXJhdGVLZXkoW0NBQ0hFX0tFWV9OQU1FU1BBQ0UsIGhvc3RdLCBjYWNoZVVzZXJLZXkoY2FjaGVJZGVudGl0eSkpO1xuICAgIGF3YWl0IGNhY2hlLmRlbGV0ZShrZXkpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNhY2hlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZnV6enktcmVzb2x2aW5nIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIGFnYWluc3QgdGhlIGxpdmVcbiAqIGVuZHBvaW50IGxpc3QuIGBzY29yZWAgaXMgdGhlIHJhbmtlcidzIGRpc3RhbmNlIChgMGAgaXMgZXhhY3QsIGAxYCBpcyBubyBtYXRjaCk7XG4gKiBgbWF0Y2hlZGAgaXMgYGZhbHNlYCB3aGVuIHRoZSBzY29yZSBleGNlZWRzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBzb1xuICogY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCAoRGF0YWJyaWNrcyB3aWxsIHRoZW4gcmV0dXJuIGFcbiAqIGNsZWFuIDQwNCkuXG4gKi9cbi8qKlxuICogRnV6enktcmFuayBlbmRwb2ludHMgYnkgaG93IGNsb3NlbHkgdGhlaXIgYG5hbWVgIG1hdGNoZXMgYGlucHV0YCwgYmVzdFxuICogKGxvd2VzdCBzY29yZSkgZmlyc3QsIGtlZXBpbmcgb25seSB0aG9zZSB3aXRoaW4gYHRocmVzaG9sZGA6XG4gKlxuICogMS4gQW4gZXhhY3QgbmFtZSBtYXRjaCBzaG9ydC1jaXJjdWl0cyB0byBhIHNpbmdsZSBgc2NvcmU6IDBgIHJlc3VsdC5cbiAqIDIuIE90aGVyd2lzZSB0aGUgc2hhcmVkIFR5cGVTY3JpcHQgcG9saWN5IHRva2VuaXplcyBhbmQgc2NvcmVzIGV2ZXJ5IGVuZHBvaW50IHRocm91Z2ggdGhlXG4gKiAgICBzYW1lIGZ1enp5LWRpc3RhbmNlIHBvbGljeSB1c2VkIGJ5IHtAbGluayBsb29rdXBNb2RlbHN9LlxuICpcbiAqIFJldHVybnMgYFtdYCBmb3IgYW4gZW1wdHkgZW5kcG9pbnQgbGlzdCBvciB3aGVuIGBpbnB1dGAgdG9rZW5pemVzIHRvIG5vdGhpbmcsXG4gKiBzbyBjYWxsZXJzIGZhbGwgYmFjayB0byB0aGUgcmF3IGlucHV0IGFuZCBsZXQgRGF0YWJyaWNrcyBzdXJmYWNlIGEgY2xlYW4gNDA0LlxuICogVGhpcyBtdWx0aS1yZXN1bHQgY29yZSBpcyBzaGFyZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAoc2luZ2xlIGJlc3QpIGFuZFxuICogdGhlIHJhbmtlZCBgbG9va3VwTW9kZWxzYCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBTY29yZWRFbmRwb2ludFtdIHtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDAgfHwgIWlucHV0LnRyaW0oKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gcmFua0VuZHBvaW50cyhcbiAgICBlbmRwb2ludHMsXG4gICAge1xuICAgICAgc2VhcmNoOiBpbnB1dCxcbiAgICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgICB0aHJlc2hvbGQ6IG9wdGlvbnMudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xELFxuICAgIH0sXG4gICAge1xuICAgICAgaW5jbHVkZURlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICBtb2RlbENsYXNzOiBtb2RlbC5Nb2RlbENsYXNzLkNoYXRCYWxhbmNlZCxcbiAgICAgIHRhc2s6IFwibGxtL3YxL2NoYXRcIixcbiAgICB9LFxuICApLm1hcCgocmFua2VkKSA9PiAoeyBlbmRwb2ludDogcmFua2VkLmVuZHBvaW50LCBzY29yZTogcmFua2VkLnNjb3JlID8/IDAgfSkpO1xufVxuXG4vKipcbiAqIFNuYXAgYSB1c2VyLXN1cHBsaWVkIG1vZGVsIG5hbWUgdG8gdGhlIHNpbmdsZSBjbG9zZXN0IGNvbmZpZ3VyZWQgc2VydmluZ1xuICogZW5kcG9pbnQgdmlhIHtAbGluayBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzfS4gUmV0dXJucyB0aGUgaW5wdXQgdW5jaGFuZ2VkIHdpdGhcbiAqIGBtYXRjaGVkOiBmYWxzZWAgd2hlbiBub3RoaW5nIHNjb3JlcyB3aXRoaW4gdGhlIHRocmVzaG9sZCAob3IgdGhlIGNhdGFsb2d1ZVxuICogaXMgZW1wdHkpLCBzbyBhIGRlbGliZXJhdGUgbW9kZWwgaWQgaXMgbmV2ZXIgc2lsZW50bHkgcmV3cml0dGVuIHRvIGFcbiAqIHNpbWlsYXItbG9va2luZyBuZWlnaGJvdXIgYW5kIHRoZSB1cHN0cmVhbSBjYWxsIHN1cmZhY2VzIHRoZSBjYW5vbmljYWwgNDA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsSWQoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsIHtcbiAgY29uc3QgW2Jlc3RdID0gc2VhcmNoU2VydmluZ0VuZHBvaW50cyhpbnB1dCwgZW5kcG9pbnRzLCBvcHRpb25zKTtcbiAgaWYgKGJlc3QpIHtcbiAgICByZXR1cm4geyBtb2RlbElkOiBiZXN0LmVuZHBvaW50Lm5hbWUsIG1hdGNoZWQ6IHRydWUsIHNjb3JlOiBiZXN0LnNjb3JlIH07XG4gIH1cbiAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQsIG1hdGNoZWQ6IGZhbHNlIH07XG59XG4iXX0=
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RlbC1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFDTCxLQUFLLEdBS04sTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFFN0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQVMzQywwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFeEQsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQyxnRUFBZ0U7QUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztBQW9CaEQsNEVBQTRFO0FBQzVFLFNBQVMsWUFBWSxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sU0FBUyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQ3hFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElB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LFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGl2ZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlIGFjY2Vzcy5cbiAqXG4gKiBMaXN0cyB0aGUgd29ya3NwYWNlJ3MgYC9zZXJ2aW5nLWVuZHBvaW50c2AgYW5kLCB3aGVuIHRoZSBjYWxsZXIgc3VwcGxpZXMgYVxuICogdHJ1c3RlZCBjcmVkZW50aWFsIGlkZW50aXR5LCBjYWNoZXMgdGhlIHJlc3VsdCBwZXIgaG9zdCBhbmQgaWRlbnRpdHkgd2l0aCBhXG4gKiBUVEwgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBDb25jdXJyZW50IGNhbGxlcnMgaW4gdGhlIHNhbWUgc2NvcGUgc2hhcmVcbiAqIG9uZSBpbi1mbGlnaHQgcHJvbWlzZS4gU3VyZmFjZXMgZWFjaCBlbmRwb2ludCBhcyBhIHN0YWJsZVxuICoge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnl9IC0gaW5jbHVkaW5nIHRoZSBGb3VuZGF0aW9uIE1vZGVsIEFQSVxuICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBwcm9maWxlIHdoZW4gcHJlc2VudCwgdGhlIGNsYXNzaWZpZWRcbiAqIHtAbGluayBNb2RlbENsYXNzfSwgYW5kIChmb3IgZW1iZWRkaW5nIGVuZHBvaW50cykgdGhlIG1lYXN1cmVkIHZlY3RvclxuICogYGRpbWVuc2lvbmAgLSBhbmQgc25hcHMgbG9vc2UsIGh1bWFuLXR5cGVkIG5hbWVzIHRvIHJlYWwgZW5kcG9pbnQgaWRzXG4gKiB0aHJvdWdoIHRoZSBUeXBlU2NyaXB0IG1vZGVsIHJhbmtlciBzbyB0b2tlbnMgbGlrZSBgXCJjbGF1ZGUgc29ubmV0XCJgIHJlc29sdmUgdG9cbiAqIGBkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02YC5cbiAqXG4gKiBUaGUgY2xhc3Mgc3RhbXAgYW5kIGVtYmVkZGluZyBkaW1lbnNpb24gYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGNhY2hlIGxvYWQ6XG4gKiBldmVyeSBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgXCJwaW5nZWRcIiBpbiBwYXJhbGxlbCBhbmQgdGhlIHJlc3VsdGluZyB2ZWN0b3JcbiAqIGxlbmd0aCByZWNvcmRlZCwgc28gdGhlIGNvc3QgaXMgcGFpZCBvbiBhIGNhY2hlIG1pc3MsIG5vdCBwZXIgcmVhZC4gVGhlIHBpbmdcbiAqIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsdXJlIGxvZ3MgYXQgZGVidWcgYW5kIGxlYXZlcyBgZGltZW5zaW9uYCB1bnNldCByYXRoZXJcbiAqIHRoYW4gZmFpbGluZyB0aGUgd2hvbGUgbGlzdGluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgbW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlTW9kZWxPcHRpb25zLFxuICB0eXBlIFNjb3JlZEVuZHBvaW50LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBjbGFzc2lmeUVuZHBvaW50Q2xhc3Nlcywgbm9ybWFsaXplRW5kcG9pbnRzLCByYW5rRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcblxuY29uc3QgeyBNb2RlbENsYXNzIH0gPSBtb2RlbDtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL3NlcnZpbmdcIik7XG5cbi8qKlxuICogU3RydWN0dXJhbCB0eXBlIGZvciB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LCByZS1leHBvcnRlZCBzbyB0aGUgcmVzdFxuICogb2YgdGhpcyBwYWNrYWdlIGNhbiBrZWVwIGltcG9ydGluZyBpdCBmcm9tIGhlcmUuIFNlZVxuICogYGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlYCAobm9kZS1hcHBraXQpIGZvciB0aGUgY2Fub25pY2FsIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBQaWNrPGFwcGtpdC5Xb3Jrc3BhY2VDbGllbnRMaWtlLCBcInNlcnZpbmdFbmRwb2ludHNcIj47XG5cbi8qKiBEZWZhdWx0IFRUTCBmb3IgdGhlIGluLW1lbW9yeSBlbmRwb2ludCBjYWNoZS4gTWF0Y2hlcyB0aGUgRGF0YWJyaWNrcyBTREsncyBzZXNzaW9uIGxpZmV0aW1lIGJ1ZGdldC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBEZWZhdWx0IGZ1enp5IGRpc3RhbmNlIHRocmVzaG9sZCBiZWxvdyB3aGljaCBhIG1hdGNoIGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEID0gMC40O1xuXG4vKiogQ2FjaGUga2V5IHBhcnRzIHVuZGVyIHdoaWNoIGVuZHBvaW50IGxpc3RpbmdzIGFyZSBzdG9yZWQuICovXG5jb25zdCBDQUNIRV9LRVlfTkFNRVNQQUNFID0gXCJzZXJ2aW5nLWVuZHBvaW50c1wiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCBmb3IgdGhpcyBjYWxsLCBpbiBtaWxsaXNlY29uZHMuIEZvcndhcmRlZCB0b1xuICAgKiBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUcnVzdGVkIGlkZW50aXR5IG9mIHRoZSBjcmVkZW50aWFsIHVzZWQgYnkgYGNsaWVudGAuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyBoYXNoZWQgYmVmb3JlIGl0IGVudGVycyB0aGUgY2FjaGUga2V5IGFuZCBpcyBuZXZlciBsb2dnZWQuXG4gICAqIE9taXQgaXQgd2hlbiB0aGUgY2FsbGVyIGNhbm5vdCBwcm92ZSB0aGUgY3JlZGVudGlhbCBpZGVudGl0eTsgdGhhdCBjYWxsXG4gICAqIGJ5cGFzc2VzIHNoYXJlZCBjYWNoaW5nIHNvIG9uZSBwcmluY2lwYWwgY2FuIG5ldmVyIHJlYWQgYW5vdGhlcidzXG4gICAqIGNhdGFsb2d1ZS5cbiAgICovXG4gIGNhY2hlSWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBIYXNoIGFuIG9wYXF1ZSBjcmVkZW50aWFsIGlkZW50aXR5IGJlZm9yZSBoYW5kaW5nIGl0IHRvIENhY2hlTWFuYWdlci4gKi9cbmZ1bmN0aW9uIGNhY2hlVXNlcktleShpZGVudGl0eTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtb2RlbC0ke2NyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGlkZW50aXR5KS5kaWdlc3QoXCJoZXhcIil9YDtcbn1cblxuLyoqXG4gKiBMaXN0IE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIGZvciB0aGUgd29ya3NwYWNlIG93bmluZyBgY2xpZW50YCwgcm91dGVkXG4gKiB0aHJvdWdoIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLiBUaGUgbWFuYWdlciBnaXZlcyB1cyBldmVyeXRoaW5nXG4gKiBgY2FjaGV0b29scy5UVExDYWNoZWAgcHJvdmlkZXMgcGx1cyB3aGF0IGBjYWNoZXRvb2xzLWFzeW5jYCBhZGRzIG9uIHRvcDpcbiAqIHBlci1lbnRyeSBUVEwsIGluLWZsaWdodCByZXF1ZXN0IGNvYWxlc2NpbmcgKGNvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmVcbiAqIGZldGNoIHZpYSB0aGUgbWFuYWdlcidzIGludGVybmFsIGBpbkZsaWdodFJlcXVlc3RzYCBtYXApLCBib3VuZGVkIHNpemUsXG4gKiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSwgYW5kIG9wdGlvbmFsIExha2ViYXNlIHBlcnNpc3RlbmNlIHNvXG4gKiB0aGUgY2F0YWxvZ3VlIHN1cnZpdmVzIHJlc3RhcnRzIHdoZW4gdGhlIGxha2ViYXNlIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAqXG4gKiBSZXR1cm5zIHBsYWluIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIChhIHN0YWJsZSBzdWJzZXQgb2YgdGhlXG4gKiBTREsgdHlwZSkgc28gY2FjaGUgaGl0cyBuZXZlciBleHBvc2Ugc3RhbGUgU0RLIGludGVybmFscy4gRXJyb3JzIGZyb21cbiAqIGBDYWNoZU1hbmFnZXJgIG9yIHRoZSBTREsgZmV0Y2ggcHJvcGFnYXRlIHRvIHRoZSBjYWxsZXIgLSB3ZSBkb24ndCBzd2FsbG93XG4gKiB0aGVtIHNvIHVzZXJzIHNlZSB0aGUgcmVhbCBhdXRoIC8gbmV0d29yayBpc3N1ZS5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFdvcmtzcGFjZSBob3N0IHVzZWQgYXMgdGhlIGNhY2hlIGtleS4gUGFzcyB0aGUgdmFsdWUgcmVzb2x2ZWRcbiAqICAgZnJvbSBgY2xpZW50LmNvbmZpZy5nZXRIb3N0KClgIHNvIG11bHRpLWhvc3QgYXBwcyBzaGFyZSBvbmUgZW50cnkgcGVyXG4gKiAgIHdvcmtzcGFjZS5cbiAqIEBwYXJhbSBvcHRpb25zLnR0bE1zIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgVFRMIGp1c3QgZm9yIHRoaXMgY2FsbC4gRm9yd2FyZGVkXG4gKiAgIHRvIGBDYWNoZU1hbmFnZXJgIGFzIHNlY29uZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgaWYgKCFvcHRpb25zLmNhY2hlSWRlbnRpdHkpIHJldHVybiBmZXRjaEVuZHBvaW50cyhjbGllbnQpO1xuICBjb25zdCB0dGxTZWMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChvcHRpb25zLnR0bE1zID8/IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TKSAvIDEwMDApKTtcbiAgcmV0dXJuIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXRPckV4ZWN1dGUoXG4gICAgW0NBQ0hFX0tFWV9OQU1FU1BBQ0UsIGhvc3RdLFxuICAgICgpID0+IGZldGNoRW5kcG9pbnRzKGNsaWVudCksXG4gICAgY2FjaGVVc2VyS2V5KG9wdGlvbnMuY2FjaGVJZGVudGl0eSksXG4gICAgeyB0dGw6IHR0bFNlYyB9LFxuICApO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnRzIGFzIG1pbmltYWxcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIHN0cmFpZ2h0IGZyb20gdGhlIFNESzogbm8gY2FjaGluZywgYW5kXG4gKiBub25lIG9mIHRoZSBjYWNoZS1sb2FkIGVucmljaG1lbnQgKHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYWRkcyB0aGVcbiAqIHtAbGluayBNb2RlbENsYXNzfSBzdGFtcCBhbmQgdGhlIGVtYmVkZGluZy1kaW1lbnNpb24gcHJvYmUpLiBVc2UgdGhpcyBmb3IgYVxuICogb25lLXNob3QsIGRlcGVuZGVuY3ktbGlnaHQgbGlzdGluZyAtIGUuZy4gYSBDTEkgdGhhdCBvbmx5IG5lZWRzIG5hbWVzL3Rhc2tzXG4gKiBmb3IgZnV6enkgcmVzb2x1dGlvbiBhbmQgZG9lc24ndCB3YW50IEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgIG9yIHRoZVxuICogcGVyLWVtYmVkZGluZyBwaW5nIGNvc3QuIFByZWZlciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGZvciB0aGUgY2FjaGVkLFxuICogZW5yaWNoZWQgdmlldy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IGVuZHBvaW50czogdW5rbm93bltdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgZXAgb2YgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMubGlzdCgpKSB7XG4gICAgZW5kcG9pbnRzLnB1c2goZXApO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVFbmRwb2ludHMoZW5kcG9pbnRzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFbmRwb2ludHMoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgY2xhc3NpZmllZCA9IHN0YW1wTW9kZWxDbGFzc2VzKGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoY2xpZW50KSk7XG4gIGNvbnN0IG91dCA9IGF3YWl0IG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKGNsaWVudCwgY2xhc3NpZmllZCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7IGNvdW50OiBvdXQubGVuZ3RoLCBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3RhbXAgZWFjaCBzdW1tYXJ5J3Mge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkuY2xhc3N9IGZyb20gdGhlIHJlbGF0aXZlXG4gKiBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgd2hvbGUgc2V0LiBFbmRwb2ludHMgdGhlIGNsYXNzaWZpZXIgZG9lc24ndCByZWNvZ25pemVcbiAqIChjdXN0b20sIHVuc2NvcmVkLCBub24tTExNKSBhcmUgbGVmdCB3aXRob3V0IGEgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wTW9kZWxDbGFzc2VzKHN1bW1hcmllczogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgY29uc3QgY2xhc3NPZiA9IGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKHN1bW1hcmllcyk7XG4gIHJldHVybiBzdW1tYXJpZXMubWFwKChzdW1tYXJ5KSA9PiB7XG4gICAgY29uc3QgY2xzID0gY2xhc3NPZi5nZXQoc3VtbWFyeS5uYW1lKTtcbiAgICByZXR1cm4gY2xzID09PSB1bmRlZmluZWQgPyBzdW1tYXJ5IDogeyAuLi5zdW1tYXJ5LCBjbGFzczogY2xzIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIE1lYXN1cmUgdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIG9mIGV2ZXJ5IHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ31cbiAqIGVuZHBvaW50IGJ5IHBpbmdpbmcgaXQgb25jZSwgYWxsIGluIHBhcmFsbGVsLiBSdW5zIG9ubHkgb24gYSBjYWNoZSBtaXNzIChpdCdzXG4gKiBjYWxsZWQgZnJvbSB7QGxpbmsgZmV0Y2hFbmRwb2ludHN9KSwgc28gdGhlIHByb2JlIGNvc3QgaXMgYW1vcnRpemVkIGFjcm9zcyB0aGVcbiAqIGNhY2hlZCBUVEwgd2luZG93LiBQZXItZW5kcG9pbnQgZmFpbHVyZXMgYXJlIHN3YWxsb3dlZCAobG9nZ2VkIGF0IHdhcm4pIHNvIG9uZVxuICogdW5yZWFjaGFibGUgZW1iZWRkaW5nIG1vZGVsIG5ldmVyIGZhaWxzIHRoZSBsaXN0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBzdW1tYXJpZXM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICBzdW1tYXJpZXMubWFwKGFzeW5jIChzdW1tYXJ5KSA9PiB7XG4gICAgICBpZiAoc3VtbWFyeS5jbGFzcyAhPT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcpIHJldHVybiBzdW1tYXJ5O1xuICAgICAgY29uc3QgZGltZW5zaW9uID0gYXdhaXQgcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihjbGllbnQsIHN1bW1hcnkubmFtZSk7XG4gICAgICByZXR1cm4gZGltZW5zaW9uID09PSB1bmRlZmluZWQgPyBzdW1tYXJ5IDogeyAuLi5zdW1tYXJ5LCBkaW1lbnNpb24gfTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBlbWJlZGRpbmcgZGltZW5zaW9uIHByb2JlOiBxdWVyeSBgbmFtZWAgd2l0aCBhIHRpbnkgYFwicGluZ1wiYFxuICogaW5wdXQgYW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuIFJldHVybnMgYHVuZGVmaW5lZGAgKGFuZFxuICogbG9ncyBhdCB3YXJuKSB3aGVuIHRoZSBlbmRwb2ludCBjYW4ndCBiZSBxdWVyaWVkIG9yIHJldHVybnMgbm8gdmVjdG9yIC0gdGhlXG4gKiBkaW1lbnNpb24gaXMgaW5mb3JtYXRpb25hbCwgbmV2ZXIgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLnF1ZXJ5KHsgbmFtZSwgaW5wdXQ6IFwicGluZ1wiIH0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHJlc3BvbnNlLmRhdGE/LlswXT8uZW1iZWRkaW5nPy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBkaW1lbnNpb24gPT09IFwibnVtYmVyXCIgJiYgZGltZW5zaW9uID4gMCkgcmV0dXJuIGRpbWVuc2lvbjtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIHJldHVybmVkIG5vIHZlY3RvclwiLCB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyBmYWlsZWRcIiwgeyBuYW1lLCBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gQSBob3N0IGFuZFxuICogaWRlbnRpdHkgZGVsZXRlIG9ubHkgdGhhdCBwcmluY2lwYWwncyB3b3Jrc3BhY2UgZW50cnkuIEJlY2F1c2UgQ2FjaGVNYW5hZ2VyXG4gKiBjYW5ub3QgZW51bWVyYXRlIGEgbmFtZXNwYWNlLCBvbWl0dGluZyBlaXRoZXIgdmFsdWUgY2xlYXJzIHRoZSBjb21wbGV0ZVxuICogbWFuYWdlciBhbmQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB0ZXN0cyBvciBhZG1pbmlzdHJhdGl2ZSByZWZyZXNoZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShcbiAgaG9zdD86IHN0cmluZyxcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKTtcbiAgaWYgKGhvc3QgJiYgY2FjaGVJZGVudGl0eSkge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlLmdlbmVyYXRlS2V5KFtDQUNIRV9LRVlfTkFNRVNQQUNFLCBob3N0XSwgY2FjaGVVc2VyS2V5KGNhY2hlSWRlbnRpdHkpKTtcbiAgICBhd2FpdCBjYWNoZS5kZWxldGUoa2V5KTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjYWNoZS5jbGVhcigpO1xuICB9XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGZ1enp5LXJlc29sdmluZyBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSBhZ2FpbnN0IHRoZSBsaXZlXG4gKiBlbmRwb2ludCBsaXN0LiBgc2NvcmVgIGlzIHRoZSByYW5rZXIncyBkaXN0YW5jZSAoYDBgIGlzIGV4YWN0LCBgMWAgaXMgbm8gbWF0Y2gpO1xuICogYG1hdGNoZWRgIGlzIGBmYWxzZWAgd2hlbiB0aGUgc2NvcmUgZXhjZWVkcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQgc29cbiAqIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgKERhdGFicmlja3Mgd2lsbCB0aGVuIHJldHVybiBhXG4gKiBjbGVhbiA0MDQpLlxuICovXG4vKipcbiAqIEZ1enp5LXJhbmsgZW5kcG9pbnRzIGJ5IGhvdyBjbG9zZWx5IHRoZWlyIGBuYW1lYCBtYXRjaGVzIGBpbnB1dGAsIGJlc3RcbiAqIChsb3dlc3Qgc2NvcmUpIGZpcnN0LCBrZWVwaW5nIG9ubHkgdGhvc2Ugd2l0aGluIGB0aHJlc2hvbGRgOlxuICpcbiAqIDEuIEFuIGV4YWN0IG5hbWUgbWF0Y2ggc2hvcnQtY2lyY3VpdHMgdG8gYSBzaW5nbGUgYHNjb3JlOiAwYCByZXN1bHQuXG4gKiAyLiBPdGhlcndpc2UgdGhlIHNoYXJlZCBUeXBlU2NyaXB0IHBvbGljeSB0b2tlbml6ZXMgYW5kIHNjb3JlcyBldmVyeSBlbmRwb2ludCB0aHJvdWdoIHRoZVxuICogICAgc2FtZSBmdXp6eS1kaXN0YW5jZSBwb2xpY3kgdXNlZCBieSB7QGxpbmsgbG9va3VwTW9kZWxzfS5cbiAqXG4gKiBSZXR1cm5zIGBbXWAgZm9yIGFuIGVtcHR5IGVuZHBvaW50IGxpc3Qgb3Igd2hlbiBgaW5wdXRgIHRva2VuaXplcyB0byBub3RoaW5nLFxuICogc28gY2FsbGVycyBmYWxsIGJhY2sgdG8gdGhlIHJhdyBpbnB1dCBhbmQgbGV0IERhdGFicmlja3Mgc3VyZmFjZSBhIGNsZWFuIDQwNC5cbiAqIFRoaXMgbXVsdGktcmVzdWx0IGNvcmUgaXMgc2hhcmVkIGJ5IHtAbGluayByZXNvbHZlTW9kZWxJZH0gKHNpbmdsZSBiZXN0KSBhbmRcbiAqIHRoZSByYW5rZWQgYGxvb2t1cE1vZGVsc2Agc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogU2NvcmVkRW5kcG9pbnRbXSB7XG4gIGlmIChlbmRwb2ludHMubGVuZ3RoID09PSAwIHx8ICFpbnB1dC50cmltKCkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHJhbmtFbmRwb2ludHMoXG4gICAgZW5kcG9pbnRzLFxuICAgIHtcbiAgICAgIHNlYXJjaDogaW5wdXQsXG4gICAgICAuLi4ob3B0aW9ucy5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IG9wdGlvbnMucmVxdWlyZXNUb29scyB9IDoge30pLFxuICAgICAgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCA/PyBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGluY2x1ZGVEZXByZWNhdGVkOiB0cnVlLFxuICAgICAgdGFzazogXCJsbG0vdjEvY2hhdFwiLFxuICAgIH0sXG4gICkubWFwKChyYW5rZWQpID0+ICh7IGVuZHBvaW50OiByYW5rZWQuZW5kcG9pbnQsIHNjb3JlOiByYW5rZWQuc2NvcmUgPz8gMCB9KSk7XG59XG5cbi8qKlxuICogU25hcCBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSB0byB0aGUgc2luZ2xlIGNsb3Nlc3QgY29uZmlndXJlZCBzZXJ2aW5nXG4gKiBlbmRwb2ludCB2aWEge0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9LiBSZXR1cm5zIHRoZSBpbnB1dCB1bmNoYW5nZWQgd2l0aFxuICogYG1hdGNoZWQ6IGZhbHNlYCB3aGVuIG5vdGhpbmcgc2NvcmVzIHdpdGhpbiB0aGUgdGhyZXNob2xkIChvciB0aGUgY2F0YWxvZ3VlXG4gKiBpcyBlbXB0eSksIHNvIGEgZGVsaWJlcmF0ZSBtb2RlbCBpZCBpcyBuZXZlciBzaWxlbnRseSByZXdyaXR0ZW4gdG8gYVxuICogc2ltaWxhci1sb29raW5nIG5laWdoYm91ciBhbmQgdGhlIHVwc3RyZWFtIGNhbGwgc3VyZmFjZXMgdGhlIGNhbm9uaWNhbCA0MDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWxJZChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG9wdGlvbnM6IFJlc29sdmVNb2RlbE9wdGlvbnMgPSB7fSxcbik6IFJlc29sdmVkTW9kZWwge1xuICBjb25zdCBbYmVzdF0gPSBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKGlucHV0LCBlbmRwb2ludHMsIG9wdGlvbnMpO1xuICBpZiAoYmVzdCkge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGJlc3QuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IGJlc3Quc2NvcmUgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBpbnB1dCwgbWF0Y2hlZDogZmFsc2UgfTtcbn1cbiJdfQ==
|
package/lib/src/model-client.js
CHANGED
|
@@ -37,13 +37,21 @@ class AuthenticatedModelClient {
|
|
|
37
37
|
workspaceId() {
|
|
38
38
|
return this.auth.workspaceId;
|
|
39
39
|
}
|
|
40
|
-
async request(path) {
|
|
40
|
+
async request(path, init = {}) {
|
|
41
41
|
const url = new URL(path, `${this.host().replace(/\/$/, "")}/`).toString();
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const headers = new Headers(init.headers);
|
|
43
|
+
for (const [name, value] of Object.entries(await this.auth.headers())) {
|
|
44
|
+
headers.set(name, value);
|
|
45
|
+
}
|
|
46
|
+
if (init.body !== undefined && !headers.has("content-type")) {
|
|
47
|
+
headers.set("content-type", "application/json");
|
|
48
|
+
}
|
|
49
|
+
let response = await this.fetcher(url, { ...init, headers });
|
|
44
50
|
if (response.status === 401) {
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
for (const [name, value] of Object.entries(await this.auth.headers({ refresh: true }))) {
|
|
52
|
+
headers.set(name, value);
|
|
53
|
+
}
|
|
54
|
+
response = await this.fetcher(url, { ...init, headers });
|
|
47
55
|
}
|
|
48
56
|
const text = await response.text();
|
|
49
57
|
if (!response.ok) {
|
|
@@ -132,7 +140,7 @@ class DefaultModelClient {
|
|
|
132
140
|
if (!object.isRecord(response) || !Array.isArray(response.endpoints)) {
|
|
133
141
|
throw new Error("Databricks serving-endpoints response is missing an endpoints array");
|
|
134
142
|
}
|
|
135
|
-
const endpoints = normalizeEndpoints(response.endpoints);
|
|
143
|
+
const endpoints = await this.measureEmbeddingDimensions(normalizeEndpoints(response.endpoints));
|
|
136
144
|
logger.debug("listed", {
|
|
137
145
|
count: endpoints.length,
|
|
138
146
|
host: this.client.host(),
|
|
@@ -140,6 +148,36 @@ class DefaultModelClient {
|
|
|
140
148
|
});
|
|
141
149
|
return endpoints;
|
|
142
150
|
}
|
|
151
|
+
async measureEmbeddingDimensions(endpoints) {
|
|
152
|
+
return Promise.all(endpoints.map(async (endpoint) => {
|
|
153
|
+
if (endpoint.class !== ModelClass.Embedding || endpoint.dimension !== undefined) {
|
|
154
|
+
return endpoint;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const response = await this.client.request(`/serving-endpoints/${encodeURIComponent(endpoint.name)}/invocations`, {
|
|
158
|
+
method: "POST",
|
|
159
|
+
body: JSON.stringify({ input: ["ping"] }),
|
|
160
|
+
});
|
|
161
|
+
const dimension = embeddingDimension(response);
|
|
162
|
+
return dimension === undefined ? endpoint : { ...endpoint, dimension };
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
logger.warn("embedding dimension probe failed", {
|
|
166
|
+
model: endpoint.name,
|
|
167
|
+
error,
|
|
168
|
+
});
|
|
169
|
+
return endpoint;
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function embeddingDimension(value) {
|
|
175
|
+
if (!object.isRecord(value) || !Array.isArray(value.data))
|
|
176
|
+
return undefined;
|
|
177
|
+
const first = value.data[0];
|
|
178
|
+
if (!object.isRecord(first) || !Array.isArray(first.embedding))
|
|
179
|
+
return undefined;
|
|
180
|
+
return first.embedding.length > 0 ? first.embedding.length : undefined;
|
|
143
181
|
}
|
|
144
182
|
/** Create an authentication-aware Databricks model client. */
|
|
145
183
|
export async function createModelClient(options = {}) {
|
|
@@ -202,4 +240,4 @@ function cloneEndpoint(endpoint) {
|
|
|
202
240
|
...(endpoint.status ? { status: { ...endpoint.status } } : {}),
|
|
203
241
|
};
|
|
204
242
|
}
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQXNFL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxD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QWdCLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBjbGllbnQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9ydGFibGUgZW50cnkgcG9pbnQgdXNlZCBieSBnZW5lcmF0ZWQgUHl0aG9uIGJpbmRpbmdzLiBJdCBrZWVwc1xuICogYXV0aGVudGljYXRpb24sIGVuZHBvaW50IGRpc2NvdmVyeSwgY2FjaGluZywgbm9ybWFsaXphdGlvbiwgcmFua2luZywgcm91dGVcbiAqIHNlbGVjdGlvbiwgcm91dGUgY29uc3RydWN0aW9uLCBhbmQgcHVibGlzaGVkIG1ldGFkYXRhIGluIE5vZGUgd2hpbGUgZXhwb3NpbmdcbiAqIG9uZSBzbWFsbCBjbGllbnQuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICBjcmVhdGVBdXRoQ2xpZW50LFxuICB0eXBlIEF1dGhDbGllbnQsXG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGgvY2xpZW50XCI7XG5pbXBvcnQgeyBsaXN0UHJvZmlsZXMgYXMgbGlzdEF1dGhQcm9maWxlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGgvcHJvZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL29iamVjdFwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBNb2RlbE1ldGFkYXRhLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUVuZHBvaW50cyB9IGZyb20gXCIuL19yYW5raW5nLnRzXCI7XG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJlc29sdmVNb2RlbCB9IGZyb20gXCIuL19zZWxlY3Rpb24udHNcIjtcbmltcG9ydCB7IGNoYXRDb21wbGV0aW9uc1VybCwgaW52b2NhdGlvbnNVcmwsIHJlc3BvbnNlc1Vwc3RyZWFtVXJsIH0gZnJvbSBcIi4vaW52b2tlLnRzXCI7XG5pbXBvcnQgeyBoeWRyYXRlTW9kZWxNZXRhZGF0YSwgbW9kZWxNZXRhZGF0YUZvciB9IGZyb20gXCIuL21ldGFkYXRhLnRzXCI7XG5pbXBvcnQgeyBtb2RlbFNlcnZpbmdBcGkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL2NsaWVudFwiKTtcblxuLyoqIERlZmF1bHQgbGlmZXRpbWUgZm9yIG9uZSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogQXV0aGVudGljYXRpb24gb3B0aW9ucyBleHBvc2VkIGJ5IHRoZSBwb3J0YWJsZSBtb2RlbCBjbGllbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQXV0aE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBwcm9maWxlIG5hbWUuICovXG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25zdHJ1Y3Rpb24gb3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU1vZGVsQ2xpZW50fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnRPcHRpb25zIHtcbiAgLyoqIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gYW5kIHByb2ZpbGUgc2VsZWN0aW9uIG9wdGlvbnMuICovXG4gIGF1dGg/OiBNb2RlbEF1dGhPcHRpb25zO1xuICAvKiogSW4tbWVtb3J5IGVuZHBvaW50IGNhdGFsb2d1ZSBUVEwgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICBjYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKiogSHlkcmF0ZSBOb2RlLW9ubHkgbWV0YWRhdGEgY2FjaGVzIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIGNsaWVudC4gKi9cbiAgaHlkcmF0ZU1ldGFkYXRhPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlY3JldC1mcmVlIHJ1bnRpbWUgaWRlbnRpdHkgYW5kIGNhY2hlIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50U3RhdHVzIHtcbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwcmluY2lwYWw6IHN0cmluZztcbiAgcmVhZG9ubHkgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM6IG51bWJlcjtcbn1cblxuLyoqIFNlcnZpbmcgcHJvdG9jb2wgc2VsZWN0ZWQgZm9yIG9uZSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvdG9jb2wgPSBcImNoYXRcIiB8IFwicmVzcG9uc2VzXCIgfCBcImVtYmVkZGluZ3NcIjtcblxuLyoqIE1vZGVsIHNlbGVjdGlvbiBwbHVzIHJvdXRlIGNvbnRyb2xzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJvdXRlSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBGb3JjZSBhIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlIHJlZnJlc2ggYmVmb3JlIHNlbGVjdGlvbi4gKi9cbiAgcmVmcmVzaD86IGJvb2xlYW47XG4gIC8qKiBSZXF1ZXN0ZWQgdXBzdHJlYW0gcHJvdG9jb2wuIERlZmF1bHRzIGZyb20gZW5kcG9pbnQgdGFzayBhbmQgbW9kZWwgcG9saWN5LiAqL1xuICBwcm90b2NvbD86IE1vZGVsUHJvdG9jb2w7XG4gIC8qKiBXaGV0aGVyIGF1dGhlbnRpY2F0aW9uIG1heSBydW4gYW4gaW50ZXJhY3RpdmUgbG9naW4uICovXG4gIGxvZ2luPzogYm9vbGVhbjtcbn1cblxuLyoqIEZ1bGx5IHJlc29sdmVkIERhdGFicmlja3Mgcm91dGUgZm9yIGEgbW9kZWwgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZSB7XG4gIHJlYWRvbmx5IG1vZGVsSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICByZWFkb25seSBzb3VyY2U6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb25bXCJzb3VyY2VcIl07XG4gIHJlYWRvbmx5IHByb3RvY29sOiBNb2RlbFByb3RvY29sO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaUJhc2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBtZXRhZGF0YTogTW9kZWxNZXRhZGF0YTtcbn1cblxuLyoqIFN0YWJsZSBtb2RlbCBmYWNhZGUgc2hhcmVkIGJ5IE5vZGUgYW5kIGdlbmVyYXRlZCBsYW5ndWFnZSBiaW5kaW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnQge1xuICBsaXN0TW9kZWxzKHJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+O1xuICBzZWFyY2hNb2RlbHMocXVlcnk/OiBNb2RlbFF1ZXJ5LCByZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8UmFua2VkTW9kZWxbXT47XG4gIHJvdXRlKGlucHV0PzogTW9kZWxSb3V0ZUlucHV0KTogUHJvbWlzZTxNb2RlbFJvdXRlPjtcbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhO1xuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXM7XG59XG5cbmludGVyZmFjZSBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50O1xuICBob3N0KCk6IHN0cmluZztcbiAgcHJpbmNpcGFsKCk6IHN0cmluZztcbiAgd29ya3NwYWNlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZXF1ZXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmNsYXNzIEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudCBpbXBsZW1lbnRzIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZXRjaGVyOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCxcbiAgKSB7fVxuXG4gIGhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmhvc3Q7XG4gIH1cblxuICBwcmluY2lwYWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnByaW5jaXBhbDtcbiAgfVxuXG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC53b3Jrc3BhY2VJZDtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBgJHt0aGlzLmhvc3QoKS5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCk7XG4gICAgbGV0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLmF1dGguaGVhZGVycygpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGhlYWRlcnMgPSBhd2FpdCB0aGlzLmF1dGguaGVhZGVycyh7IHJlZnJlc2g6IHRydWUgfSk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgaGVhZGVycyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgQVBJICR7cGF0aH0gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dGV4dH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmludGVyZmFjZSBDYXRhbG9ndWVFbnRyeSB7XG4gIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbmNvbnN0IGNhdGFsb2d1ZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhdGFsb2d1ZUVudHJ5PigpO1xuXG5jbGFzcyBEZWZhdWx0TW9kZWxDbGllbnQgaW1wbGVtZW50cyBNb2RlbENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXIsXG4gICkge31cblxuICBhc3luYyBsaXN0TW9kZWxzKHJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgcmV0dXJuIGNsb25lRW5kcG9pbnRzKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpKTtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaE1vZGVscyhxdWVyeTogTW9kZWxRdWVyeSA9IHt9LCByZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgICByZXR1cm4gbG9va3VwTW9kZWxzKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpLCBxdWVyeSkubWFwKCh7IGVuZHBvaW50LCAuLi5yYW5rZWQgfSkgPT4gKHtcbiAgICAgIC4uLnJhbmtlZCxcbiAgICAgIGVuZHBvaW50OiBjbG9uZUVuZHBvaW50KGVuZHBvaW50KSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyByb3V0ZShpbnB1dDogTW9kZWxSb3V0ZUlucHV0ID0ge30pOiBQcm9taXNlPE1vZGVsUm91dGU+IHtcbiAgICBjb25zdCB7IHJlZnJlc2ggPSBmYWxzZSwgcHJvdG9jb2w6IHJlcXVlc3RlZFByb3RvY29sLCBsb2dpbiwgLi4uc2VsZWN0aW9uIH0gPSBpbnB1dDtcbiAgICBjb25zdCBlZmZlY3RpdmVTZWxlY3Rpb24gPVxuICAgICAgcmVxdWVzdGVkUHJvdG9jb2wgPT09IFwiZW1iZWRkaW5nc1wiICYmIHNlbGVjdGlvbi5tb2RlbENsYXNzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IC4uLnNlbGVjdGlvbiwgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfVxuICAgICAgICA6IHNlbGVjdGlvbjtcbiAgICBjb25zdCBjYXRhbG9ndWUgPSBhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKTtcbiAgICBsZXQgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwoY2F0YWxvZ3VlLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIGlmIChpc1VubWF0Y2hlZEV4cGxpY2l0KGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uLCByZXNvbHZlZCkpIHtcbiAgICAgIHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHRydWUpLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IChhd2FpdCB0aGlzLmNhdGFsb2d1ZShmYWxzZSkpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcmVzb2x2ZWQubW9kZWxJZCxcbiAgICApO1xuICAgIGNvbnN0IHByb3RvY29sID0gcmVxdWVzdGVkUHJvdG9jb2wgPz8gaW5mZXJQcm90b2NvbChlbmRwb2ludCwgcmVzb2x2ZWQubW9kZWxJZCk7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY2xpZW50Lmhvc3QoKTtcbiAgICBjb25zdCB1cmwgPSByb3V0ZVVybChob3N0LCByZXNvbHZlZC5tb2RlbElkLCBwcm90b2NvbCk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMuY2xpZW50LmF1dGguaGVhZGVycyh7IGxvZ2luIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbElkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgICAgLi4uKGVuZHBvaW50ID8geyBlbmRwb2ludDogY2xvbmVFbmRwb2ludChlbmRwb2ludCkgfSA6IHt9KSxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBob3N0LFxuICAgICAgYXBpQmFzZTogbmV3IFVSTChcInNlcnZpbmctZW5kcG9pbnRzXCIsIGAke2hvc3QucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiBtb2RlbE1ldGFkYXRhRm9yKGVuZHBvaW50ID8/IHJlc29sdmVkLm1vZGVsSWQpLFxuICAgIH07XG4gIH1cblxuICBtZXRhZGF0YShtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGEge1xuICAgIHJldHVybiBtb2RlbE1ldGFkYXRhRm9yKG1vZGVsKTtcbiAgfVxuXG4gIHN0YXR1cygpOiBNb2RlbENsaWVudFN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLih0aGlzLmNsaWVudC5hdXRoLnByb2ZpbGUgPyB7IHByb2ZpbGU6IHRoaXMuY2xpZW50LmF1dGgucHJvZmlsZSB9IDoge30pLFxuICAgICAgaG9zdDogdGhpcy5jbGllbnQuaG9zdCgpLFxuICAgICAgcHJpbmNpcGFsOiB0aGlzLmNsaWVudC5wcmluY2lwYWwoKSxcbiAgICAgIC4uLih0aGlzLmNsaWVudC53b3Jrc3BhY2VJZCgpID8geyB3b3Jrc3BhY2VJZDogdGhpcy5jbGllbnQud29ya3NwYWNlSWQoKSB9IDoge30pLFxuICAgICAgY2FjaGVUdGxNczogdGhpcy5jYWNoZVR0bE1zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhdGFsb2d1ZShyZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBrZXkgPSBjYXRhbG9ndWVLZXkodGhpcy5jbGllbnQpO1xuICAgIGlmIChyZWZyZXNoKSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGN1cnJlbnQgJiYgRGF0ZS5ub3coKSA8IGN1cnJlbnQuZXhwaXJlc0F0KSByZXR1cm4gY3VycmVudC5wcm9taXNlO1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmZldGNoQ2F0YWxvZ3VlKCk7XG4gICAgY29uc3QgZW50cnk6IENhdGFsb2d1ZUVudHJ5ID0geyBwcm9taXNlLCBleHBpcmVzQXQ6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB9O1xuICAgIGNhdGFsb2d1ZUNhY2hlLnNldChrZXksIGVudHJ5KTtcbiAgICB2b2lkIHByb21pc2UudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgZW50cnkuZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHRoaXMuY2FjaGVUdGxNcztcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChjYXRhbG9ndWVDYWNoZS5nZXQoa2V5KSA9PT0gZW50cnkpIGNhdGFsb2d1ZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENhdGFsb2d1ZSgpOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KFwiL2FwaS8yLjAvc2VydmluZy1lbmRwb2ludHNcIik7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocmVzcG9uc2UpIHx8ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVuZHBvaW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgcmVzcG9uc2UgaXMgbWlzc2luZyBhbiBlbmRwb2ludHMgYXJyYXlcIik7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50cyA9IG5vcm1hbGl6ZUVuZHBvaW50cyhyZXNwb25zZS5lbmRwb2ludHMpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7XG4gICAgICBjb3VudDogZW5kcG9pbnRzLmxlbmd0aCxcbiAgICAgIGhvc3Q6IHRoaXMuY2xpZW50Lmhvc3QoKSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYW4gYXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBtb2RlbCBjbGllbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnQob3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zID0ge30pOiBQcm9taXNlPE1vZGVsQ2xpZW50PiB7XG4gIGNvbnN0IGNhY2hlVHRsTXMgPSB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyk7XG4gIGlmIChvcHRpb25zLmh5ZHJhdGVNZXRhZGF0YSA/PyB0cnVlKSBhd2FpdCBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChcbiAgICBuZXcgQXV0aGVudGljYXRlZE1vZGVsQ2xpZW50KGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoKSwgZ2xvYmFsVGhpcy5mZXRjaCksXG4gICAgY2FjaGVUdGxNcyxcbiAgKTtcbn1cblxuLyoqIExpc3QgY29uZmlndXJlZCBEYXRhYnJpY2tzIHByb2ZpbGVzIG91dHNpZGUgdGhlIG1vZGVsIGNsaWVudCBmYWNhZGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFByb2ZpbGVzKHJlZnJlc2ggPSBmYWxzZSk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeVtdIHtcbiAgcmV0dXJuIGxpc3RBdXRoUHJvZmlsZXMoeyByZWZyZXNoIH0pO1xufVxuXG4vKiogQGludGVybmFsIENvbnN0cnVjdCBhIG1vZGVsIGNsaWVudCBhcm91bmQgYSB0ZXN0IG9yIGhvc3Qtb3duZWQgRGF0YWJyaWNrcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnRXaXRoRGF0YWJyaWNrc0NsaWVudChcbiAgY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQsXG4gIGNhY2hlVHRsTXMgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMsXG4pOiBNb2RlbENsaWVudCB7XG4gIHJldHVybiBuZXcgRGVmYXVsdE1vZGVsQ2xpZW50KGNsaWVudCwgdmFsaWRhdGVDYWNoZVR0bChjYWNoZVR0bE1zKSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgQ3JlYXRlIGEgbW9kZWwgY2xpZW50IHdpdGggaW5qZWN0YWJsZSBhdXRoIGhvc3QgY2FwYWJpbGl0aWVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERlcGVuZGVuY2llcyhcbiAgb3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBpZiAob3B0aW9ucy5oeWRyYXRlTWV0YWRhdGEgPz8gdHJ1ZSkgYXdhaXQgaHlkcmF0ZU1vZGVsTWV0YWRhdGEoKTtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChcbiAgICAgIGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoLCBkZXBlbmRlbmNpZXMpLFxuICAgICAgZGVwZW5kZW5jaWVzLmZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2gsXG4gICAgKSxcbiAgICB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2FjaGVUdGwodmFsdWUgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIGNsaWVudCBjYWNoZVR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlS2V5KGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtjbGllbnQuaG9zdCgpLCBjbGllbnQud29ya3NwYWNlSWQoKSA/PyBcIlwiLCBjbGllbnQucHJpbmNpcGFsKCldLmpvaW4oXCJcXHUwMDAwXCIpO1xufVxuXG5mdW5jdGlvbiBpbmZlclByb3RvY29sKFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB8IHVuZGVmaW5lZCxcbiAgbW9kZWxJZDogc3RyaW5nLFxuKTogTW9kZWxQcm90b2NvbCB7XG4gIGlmIChlbmRwb2ludD8udGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiKSByZXR1cm4gXCJlbWJlZGRpbmdzXCI7XG4gIHJldHVybiBtb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVXJsKGhvc3Q6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nLCBwcm90b2NvbDogTW9kZWxQcm90b2NvbCk6IHN0cmluZyB7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJyZXNwb25zZXNcIikgcmV0dXJuIHJlc3BvbnNlc1Vwc3RyZWFtVXJsKGhvc3QsIG1vZGVsSWQpO1xuICBpZiAocHJvdG9jb2wgPT09IFwiY2hhdFwiICYmIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKSA9PT0gXCJyZXNwb25zZXNcIikge1xuICAgIHJldHVybiBjaGF0Q29tcGxldGlvbnNVcmwoaG9zdCk7XG4gIH1cbiAgcmV0dXJuIGludm9jYXRpb25zVXJsKGhvc3QsIG1vZGVsSWQpO1xufVxuXG5mdW5jdGlvbiBpc1VubWF0Y2hlZEV4cGxpY2l0KFxuICBjYXRhbG9ndWU6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LFxuICByZXNvbHZlZDogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBpbnB1dC5mdXp6eSAhPT0gZmFsc2UgJiZcbiAgICByZXNvbHZlZC5tb2RlbElkID09PSBpbnB1dC5leHBsaWNpdCAmJlxuICAgICFjYXRhbG9ndWUuc29tZSgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUgPT09IGlucHV0LmV4cGxpY2l0KVxuICApO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50cyhlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIHJldHVybiBlbmRwb2ludHMubWFwKGNsb25lRW5kcG9pbnQpO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB7XG4gIHJldHVybiB7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKGVuZHBvaW50LnByb2ZpbGUgPyB7IHByb2ZpbGU6IHsgLi4uZW5kcG9pbnQucHJvZmlsZSB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/IHsgc2VydmljZU5hbWVzOiB7IC4uLmVuZHBvaW50LnNlcnZpY2VOYW1lcyB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPyB7IHJlYXNvbmluZ0VmZm9ydHM6IFsuLi5lbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzXSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zdGF0dXMgPyB7IHN0YXR1czogeyAuLi5lbmRwb2ludC5zdGF0dXMgfSB9IDoge30pLFxuICB9O1xufVxuIl19
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQXNFL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxD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QUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFGLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIGNsaWVudC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb3J0YWJsZSBlbnRyeSBwb2ludCB1c2VkIGJ5IGdlbmVyYXRlZCBQeXRob24gYmluZGluZ3MuIEl0IGtlZXBzXG4gKiBhdXRoZW50aWNhdGlvbiwgZW5kcG9pbnQgZGlzY292ZXJ5LCBjYWNoaW5nLCBub3JtYWxpemF0aW9uLCByYW5raW5nLCByb3V0ZVxuICogc2VsZWN0aW9uLCByb3V0ZSBjb25zdHJ1Y3Rpb24sIGFuZCBwdWJsaXNoZWQgbWV0YWRhdGEgaW4gTm9kZSB3aGlsZSBleHBvc2luZ1xuICogb25lIHNtYWxsIGNsaWVudC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7XG4gIGNyZWF0ZUF1dGhDbGllbnQsXG4gIHR5cGUgQXV0aENsaWVudCxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aC9jbGllbnRcIjtcbmltcG9ydCB7IGxpc3RQcm9maWxlcyBhcyBsaXN0QXV0aFByb2ZpbGVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aC9wcm9maWxlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5pbXBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvb2JqZWN0XCI7XG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIE1vZGVsTWV0YWRhdGEsXG4gIHR5cGUgTW9kZWxRdWVyeSxcbiAgdHlwZSBSYW5rZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuICB0eXBlIFJlc29sdmVNb2RlbElucHV0LFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcbmltcG9ydCB7IGxvb2t1cE1vZGVscywgcmVzb2x2ZU1vZGVsIH0gZnJvbSBcIi4vX3NlbGVjdGlvbi50c1wiO1xuaW1wb3J0IHsgY2hhdENvbXBsZXRpb25zVXJsLCBpbnZvY2F0aW9uc1VybCwgcmVzcG9uc2VzVXBzdHJlYW1VcmwgfSBmcm9tIFwiLi9pbnZva2UudHNcIjtcbmltcG9ydCB7IGh5ZHJhdGVNb2RlbE1ldGFkYXRhLCBtb2RlbE1ldGFkYXRhRm9yIH0gZnJvbSBcIi4vbWV0YWRhdGEudHNcIjtcbmltcG9ydCB7IG1vZGVsU2VydmluZ0FwaSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvY2xpZW50XCIpO1xuXG4vKiogRGVmYXVsdCBsaWZldGltZSBmb3Igb25lIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBBdXRoZW50aWNhdGlvbiBvcHRpb25zIGV4cG9zZWQgYnkgdGhlIHBvcnRhYmxlIG1vZGVsIGNsaWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBdXRoT3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIHByb2ZpbGUgbmFtZS4gKi9cbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuLyoqIENvbnN0cnVjdGlvbiBvcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBhbmQgcHJvZmlsZSBzZWxlY3Rpb24gb3B0aW9ucy4gKi9cbiAgYXV0aD86IE1vZGVsQXV0aE9wdGlvbnM7XG4gIC8qKiBJbi1tZW1vcnkgZW5kcG9pbnQgY2F0YWxvZ3VlIFRUTCBpbiBtaWxsaXNlY29uZHMuICovXG4gIGNhY2hlVHRsTXM/OiBudW1iZXI7XG4gIC8qKiBIeWRyYXRlIE5vZGUtb25seSBtZXRhZGF0YSBjYWNoZXMgYmVmb3JlIGNvbnN0cnVjdGluZyB0aGUgY2xpZW50LiAqL1xuICBoeWRyYXRlTWV0YWRhdGE/OiBib29sZWFuO1xufVxuXG4vKiogU2VjcmV0LWZyZWUgcnVudGltZSBpZGVudGl0eSBhbmQgY2FjaGUgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnRTdGF0dXMge1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaW5jaXBhbDogc3RyaW5nO1xuICByZWFkb25seSB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgY2FjaGVUdGxNczogbnVtYmVyO1xufVxuXG4vKiogU2VydmluZyBwcm90b2NvbCBzZWxlY3RlZCBmb3Igb25lIHJlc29sdmVkIG1vZGVsLiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxQcm90b2NvbCA9IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB8IFwiZW1iZWRkaW5nc1wiO1xuXG4vKiogTW9kZWwgc2VsZWN0aW9uIHBsdXMgcm91dGUgY29udHJvbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGVJbnB1dCBleHRlbmRzIFJlc29sdmVNb2RlbElucHV0IHtcbiAgLyoqIEZvcmNlIGEgbGl2ZSBlbmRwb2ludCBjYXRhbG9ndWUgcmVmcmVzaCBiZWZvcmUgc2VsZWN0aW9uLiAqL1xuICByZWZyZXNoPzogYm9vbGVhbjtcbiAgLyoqIFJlcXVlc3RlZCB1cHN0cmVhbSBwcm90b2NvbC4gRGVmYXVsdHMgZnJvbSBlbmRwb2ludCB0YXNrIGFuZCBtb2RlbCBwb2xpY3kuICovXG4gIHByb3RvY29sPzogTW9kZWxQcm90b2NvbDtcbiAgLyoqIFdoZXRoZXIgYXV0aGVudGljYXRpb24gbWF5IHJ1biBhbiBpbnRlcmFjdGl2ZSBsb2dpbi4gKi9cbiAgbG9naW4/OiBib29sZWFuO1xufVxuXG4vKiogRnVsbHkgcmVzb2x2ZWQgRGF0YWJyaWNrcyByb3V0ZSBmb3IgYSBtb2RlbCByZXF1ZXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJvdXRlIHtcbiAgcmVhZG9ubHkgbW9kZWxJZDogc3RyaW5nO1xuICByZWFkb25seSBlbmRwb2ludD86IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIHJlYWRvbmx5IHNvdXJjZTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbltcInNvdXJjZVwiXTtcbiAgcmVhZG9ubHkgcHJvdG9jb2w6IE1vZGVsUHJvdG9jb2w7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBpQmFzZTogc3RyaW5nO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBNb2RlbE1ldGFkYXRhO1xufVxuXG4vKiogU3RhYmxlIG1vZGVsIGZhY2FkZSBzaGFyZWQgYnkgTm9kZSBhbmQgZ2VuZXJhdGVkIGxhbmd1YWdlIGJpbmRpbmdzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudCB7XG4gIGxpc3RNb2RlbHMocmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT47XG4gIHNlYXJjaE1vZGVscyhxdWVyeT86IE1vZGVsUXVlcnksIHJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPjtcbiAgcm91dGUoaW5wdXQ/OiBNb2RlbFJvdXRlSW5wdXQpOiBQcm9taXNlPE1vZGVsUm91dGU+O1xuICBtZXRhZGF0YShtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGE7XG4gIHN0YXR1cygpOiBNb2RlbENsaWVudFN0YXR1cztcbn1cblxuaW50ZXJmYWNlIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQ7XG4gIGhvc3QoKTogc3RyaW5nO1xuICBwcmluY2lwYWwoKTogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlcXVlc3QocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5jbGFzcyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQgaW1wbGVtZW50cyBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hlcjogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4gICkge31cblxuICBob3N0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5ob3N0O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5wcmluY2lwYWw7XG4gIH1cblxuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGgud29ya3NwYWNlSWQ7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KHBhdGg6IHN0cmluZywgaW5pdDogUmVxdWVzdEluaXQgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYCR7dGhpcy5ob3N0KCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCB0aGlzLmF1dGguaGVhZGVycygpKSkge1xuICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaW5pdC5ib2R5ICE9PSB1bmRlZmluZWQgJiYgIWhlYWRlcnMuaGFzKFwiY29udGVudC10eXBlXCIpKSB7XG4gICAgICBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgfVxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgLi4uaW5pdCwgaGVhZGVycyB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCB0aGlzLmF1dGguaGVhZGVycyh7IHJlZnJlc2g6IHRydWUgfSkpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaGVyKHVybCwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERhdGFicmlja3MgTW9kZWwgU2VydmluZyBBUEkgJHtwYXRofSByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt0ZXh0fWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dCA/IEpTT04ucGFyc2UodGV4dCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhdGFsb2d1ZUVudHJ5IHtcbiAgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+O1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbn1cblxuY29uc3QgY2F0YWxvZ3VlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2F0YWxvZ3VlRW50cnk+KCk7XG5cbmNsYXNzIERlZmF1bHRNb2RlbENsaWVudCBpbXBsZW1lbnRzIE1vZGVsQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IERhdGFicmlja3NNb2RlbENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlVHRsTXM6IG51bWJlcixcbiAgKSB7fVxuXG4gIGFzeW5jIGxpc3RNb2RlbHMocmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICByZXR1cm4gY2xvbmVFbmRwb2ludHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoTW9kZWxzKHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sIHJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmFua2VkTW9kZWxbXT4ge1xuICAgIHJldHVybiBsb29rdXBNb2RlbHMoYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCksIHF1ZXJ5KS5tYXAoKHsgZW5kcG9pbnQsIC4uLnJhbmtlZCB9KSA9PiAoe1xuICAgICAgLi4ucmFua2VkLFxuICAgICAgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpLFxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIHJvdXRlKGlucHV0OiBNb2RlbFJvdXRlSW5wdXQgPSB7fSk6IFByb21pc2U8TW9kZWxSb3V0ZT4ge1xuICAgIGNvbnN0IHsgcmVmcmVzaCA9IGZhbHNlLCBwcm90b2NvbDogcmVxdWVzdGVkUHJvdG9jb2wsIGxvZ2luLCAuLi5zZWxlY3Rpb24gfSA9IGlucHV0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZVNlbGVjdGlvbiA9XG4gICAgICByZXF1ZXN0ZWRQcm90b2NvbCA9PT0gXCJlbWJlZGRpbmdzXCIgJiYgc2VsZWN0aW9uLm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgLi4uc2VsZWN0aW9uLCBtb2RlbENsYXNzOiBNb2RlbENsYXNzLkVtYmVkZGluZyB9XG4gICAgICAgIDogc2VsZWN0aW9uO1xuICAgIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpO1xuICAgIGxldCByZXNvbHZlZCA9IHJlc29sdmVNb2RlbChjYXRhbG9ndWUsIGVmZmVjdGl2ZVNlbGVjdGlvbik7XG4gICAgaWYgKGlzVW5tYXRjaGVkRXhwbGljaXQoY2F0YWxvZ3VlLCBlZmZlY3RpdmVTZWxlY3Rpb24sIHJlc29sdmVkKSkge1xuICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwoYXdhaXQgdGhpcy5jYXRhbG9ndWUodHJ1ZSksIGVmZmVjdGl2ZVNlbGVjdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKGZhbHNlKSkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSByZXNvbHZlZC5tb2RlbElkLFxuICAgICk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSByZXF1ZXN0ZWRQcm90b2NvbCA/PyBpbmZlclByb3RvY29sKGVuZHBvaW50LCByZXNvbHZlZC5tb2RlbElkKTtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5jbGllbnQuaG9zdCgpO1xuICAgIGNvbnN0IHVybCA9IHJvdXRlVXJsKGhvc3QsIHJlc29sdmVkLm1vZGVsSWQsIHByb3RvY29sKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgdGhpcy5jbGllbnQuYXV0aC5oZWFkZXJzKHsgbG9naW4gfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsSWQ6IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgICAuLi4oZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBjbG9uZUVuZHBvaW50KGVuZHBvaW50KSB9IDoge30pLFxuICAgICAgc291cmNlOiByZXNvbHZlZC5zb3VyY2UsXG4gICAgICBwcm90b2NvbCxcbiAgICAgIGhvc3QsXG4gICAgICBhcGlCYXNlOiBuZXcgVVJMKFwic2VydmluZy1lbmRwb2ludHNcIiwgYCR7aG9zdC5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCksXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0YWRhdGE6IG1vZGVsTWV0YWRhdGFGb3IoZW5kcG9pbnQgPz8gcmVzb2x2ZWQubW9kZWxJZCksXG4gICAgfTtcbiAgfVxuXG4gIG1ldGFkYXRhKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YSB7XG4gICAgcmV0dXJuIG1vZGVsTWV0YWRhdGFGb3IobW9kZWwpO1xuICB9XG5cbiAgc3RhdHVzKCk6IE1vZGVsQ2xpZW50U3RhdHVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHRoaXMuY2xpZW50LmF1dGgucHJvZmlsZSA/IHsgcHJvZmlsZTogdGhpcy5jbGllbnQuYXV0aC5wcm9maWxlIH0gOiB7fSksXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBwcmluY2lwYWw6IHRoaXMuY2xpZW50LnByaW5jaXBhbCgpLFxuICAgICAgLi4uKHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgPyB7IHdvcmtzcGFjZUlkOiB0aGlzLmNsaWVudC53b3Jrc3BhY2VJZCgpIH0gOiB7fSksXG4gICAgICBjYWNoZVR0bE1zOiB0aGlzLmNhY2hlVHRsTXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2F0YWxvZ3VlKHJlZnJlc2g6IGJvb2xlYW4pOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGtleSA9IGNhdGFsb2d1ZUtleSh0aGlzLmNsaWVudCk7XG4gICAgaWYgKHJlZnJlc2gpIGNhdGFsb2d1ZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBjYXRhbG9ndWVDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VycmVudCAmJiBEYXRlLm5vdygpIDwgY3VycmVudC5leHBpcmVzQXQpIHJldHVybiBjdXJyZW50LnByb21pc2U7XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZmV0Y2hDYXRhbG9ndWUoKTtcbiAgICBjb25zdCBlbnRyeTogQ2F0YWxvZ3VlRW50cnkgPSB7IHByb21pc2UsIGV4cGlyZXNBdDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgY2F0YWxvZ3VlQ2FjaGUuc2V0KGtleSwgZW50cnkpO1xuICAgIHZvaWQgcHJvbWlzZS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBlbnRyeS5leHBpcmVzQXQgPSBEYXRlLm5vdygpICsgdGhpcy5jYWNoZVR0bE1zO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpID09PSBlbnRyeSkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQ2F0YWxvZ3VlKCk6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3QoXCIvYXBpLzIuMC9zZXJ2aW5nLWVuZHBvaW50c1wiKTtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChyZXNwb25zZSkgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuZW5kcG9pbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJyaWNrcyBzZXJ2aW5nLWVuZHBvaW50cyByZXNwb25zZSBpcyBtaXNzaW5nIGFuIGVuZHBvaW50cyBhcnJheVwiKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgdGhpcy5tZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhub3JtYWxpemVFbmRwb2ludHMocmVzcG9uc2UuZW5kcG9pbnRzKSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkXCIsIHtcbiAgICAgIGNvdW50OiBlbmRwb2ludHMubGVuZ3RoLFxuICAgICAgaG9zdDogdGhpcy5jbGllbnQuaG9zdCgpLFxuICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgIH0pO1xuICAgIHJldHVybiBlbmRwb2ludHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lYXN1cmVFbWJlZGRpbmdEaW1lbnNpb25zKFxuICAgIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICApOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGVuZHBvaW50cy5tYXAoYXN5bmMgKGVuZHBvaW50KSA9PiB7XG4gICAgICAgIGlmIChlbmRwb2ludC5jbGFzcyAhPT0gTW9kZWxDbGFzcy5FbWJlZGRpbmcgfHwgZW5kcG9pbnQuZGltZW5zaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnJlcXVlc3QoXG4gICAgICAgICAgICBgL3NlcnZpbmctZW5kcG9pbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGVuZHBvaW50Lm5hbWUpfS9pbnZvY2F0aW9uc2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaW5wdXQ6IFtcInBpbmdcIl0gfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZGltZW5zaW9uID0gZW1iZWRkaW5nRGltZW5zaW9uKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gZGltZW5zaW9uID09PSB1bmRlZmluZWQgPyBlbmRwb2ludCA6IHsgLi4uZW5kcG9pbnQsIGRpbWVuc2lvbiB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFwiZW1iZWRkaW5nIGRpbWVuc2lvbiBwcm9iZSBmYWlsZWRcIiwge1xuICAgICAgICAgICAgbW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1iZWRkaW5nRGltZW5zaW9uKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlLmRhdGEpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdCA9IHZhbHVlLmRhdGFbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKGZpcnN0KSB8fCAhQXJyYXkuaXNBcnJheShmaXJzdC5lbWJlZGRpbmcpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZmlyc3QuZW1iZWRkaW5nLmxlbmd0aCA+IDAgPyBmaXJzdC5lbWJlZGRpbmcubGVuZ3RoIDogdW5kZWZpbmVkO1xufVxuXG4vKiogQ3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50KG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBjb25zdCBjYWNoZVR0bE1zID0gdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpO1xuICBpZiAob3B0aW9ucy5oeWRyYXRlTWV0YWRhdGEgPz8gdHJ1ZSkgYXdhaXQgaHlkcmF0ZU1vZGVsTWV0YWRhdGEoKTtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMuYXV0aCksIGdsb2JhbFRoaXMuZmV0Y2gpLFxuICAgIGNhY2hlVHRsTXMsXG4gICk7XG59XG5cbi8qKiBMaXN0IGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBwcm9maWxlcyBvdXRzaWRlIHRoZSBtb2RlbCBjbGllbnQgZmFjYWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RQcm9maWxlcyhyZWZyZXNoID0gZmFsc2UpOiBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnlbXSB7XG4gIHJldHVybiBsaXN0QXV0aFByb2ZpbGVzKHsgcmVmcmVzaCB9KTtcbn1cblxuLyoqIEBpbnRlcm5hbCBDb25zdHJ1Y3QgYSBtb2RlbCBjbGllbnQgYXJvdW5kIGEgdGVzdCBvciBob3N0LW93bmVkIERhdGFicmlja3MgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERhdGFicmlja3NDbGllbnQoXG4gIGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICBjYWNoZVR0bE1zID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TLFxuKTogTW9kZWxDbGllbnQge1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChjbGllbnQsIHZhbGlkYXRlQ2FjaGVUdGwoY2FjaGVUdGxNcykpO1xufVxuXG4vKiogQGludGVybmFsIENyZWF0ZSBhIG1vZGVsIGNsaWVudCB3aXRoIGluamVjdGFibGUgYXV0aCBob3N0IGNhcGFiaWxpdGllcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNb2RlbENsaWVudFdpdGhEZXBlbmRlbmNpZXMoXG4gIG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8TW9kZWxDbGllbnQ+IHtcbiAgaWYgKG9wdGlvbnMuaHlkcmF0ZU1ldGFkYXRhID8/IHRydWUpIGF3YWl0IGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk7XG4gIHJldHVybiBuZXcgRGVmYXVsdE1vZGVsQ2xpZW50KFxuICAgIG5ldyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQoXG4gICAgICBhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMuYXV0aCwgZGVwZW5kZW5jaWVzKSxcbiAgICAgIGRlcGVuZGVuY2llcy5mZXRjaCA/PyBnbG9iYWxUaGlzLmZldGNoLFxuICAgICksXG4gICAgdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpLFxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNhY2hlVHRsKHZhbHVlID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TKTogbnVtYmVyIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNb2RlbCBjbGllbnQgY2FjaGVUdGxNcyBtdXN0IGJlIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNhdGFsb2d1ZUtleShjbGllbnQ6IERhdGFicmlja3NNb2RlbENsaWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBbY2xpZW50Lmhvc3QoKSwgY2xpZW50LndvcmtzcGFjZUlkKCkgPz8gXCJcIiwgY2xpZW50LnByaW5jaXBhbCgpXS5qb2luKFwiXFx1MDAwMFwiKTtcbn1cblxuZnVuY3Rpb24gaW5mZXJQcm90b2NvbChcbiAgZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCB1bmRlZmluZWQsXG4gIG1vZGVsSWQ6IHN0cmluZyxcbik6IE1vZGVsUHJvdG9jb2wge1xuICBpZiAoZW5kcG9pbnQ/LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIikgcmV0dXJuIFwiZW1iZWRkaW5nc1wiO1xuICByZXR1cm4gbW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG5mdW5jdGlvbiByb3V0ZVVybChob3N0OiBzdHJpbmcsIG1vZGVsSWQ6IHN0cmluZywgcHJvdG9jb2w6IE1vZGVsUHJvdG9jb2wpOiBzdHJpbmcge1xuICBpZiAocHJvdG9jb2wgPT09IFwicmVzcG9uc2VzXCIpIHJldHVybiByZXNwb25zZXNVcHN0cmVhbVVybChob3N0LCBtb2RlbElkKTtcbiAgaWYgKHByb3RvY29sID09PSBcImNoYXRcIiAmJiBtb2RlbFNlcnZpbmdBcGkobW9kZWxJZCkgPT09IFwicmVzcG9uc2VzXCIpIHtcbiAgICByZXR1cm4gY2hhdENvbXBsZXRpb25zVXJsKGhvc3QpO1xuICB9XG4gIHJldHVybiBpbnZvY2F0aW9uc1VybChob3N0LCBtb2RlbElkKTtcbn1cblxuZnVuY3Rpb24gaXNVbm1hdGNoZWRFeHBsaWNpdChcbiAgY2F0YWxvZ3VlOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaW5wdXQuZnV6enkgIT09IGZhbHNlICYmXG4gICAgcmVzb2x2ZWQubW9kZWxJZCA9PT0gaW5wdXQuZXhwbGljaXQgJiZcbiAgICAhY2F0YWxvZ3VlLnNvbWUoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBpbnB1dC5leHBsaWNpdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmRwb2ludHMoZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10pOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10ge1xuICByZXR1cm4gZW5kcG9pbnRzLm1hcChjbG9uZUVuZHBvaW50KTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbmRwb2ludChlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkge1xuICByZXR1cm4ge1xuICAgIC4uLmVuZHBvaW50LFxuICAgIC4uLihlbmRwb2ludC5wcm9maWxlID8geyBwcm9maWxlOiB7IC4uLmVuZHBvaW50LnByb2ZpbGUgfSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zZXJ2aWNlTmFtZXMgPyB7IHNlcnZpY2VOYW1lczogeyAuLi5lbmRwb2ludC5zZXJ2aWNlTmFtZXMgfSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzID8geyByZWFzb25pbmdFZmZvcnRzOiBbLi4uZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0c10gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuc3RhdHVzID8geyBzdGF0dXM6IHsgLi4uZW5kcG9pbnQuc3RhdHVzIH0gfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/appkit": "^0.9.
|
|
31
|
-
"@dbx-tools/auth": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-auth": "^0.9.
|
|
33
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
34
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
30
|
+
"@dbx-tools/appkit": "^0.9.64",
|
|
31
|
+
"@dbx-tools/auth": "^0.9.64",
|
|
32
|
+
"@dbx-tools/shared-auth": "^0.9.64",
|
|
33
|
+
"@dbx-tools/shared-core": "^0.9.64",
|
|
34
|
+
"@dbx-tools/shared-model": "^0.9.64",
|
|
35
35
|
"cacache": "^21.0.1",
|
|
36
36
|
"env-paths": "^4.0.0",
|
|
37
37
|
"fuse.js": "^7.4.2"
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"./package.json": "./package.json"
|
|
103
103
|
}
|
|
104
104
|
},
|
|
105
|
-
"version": "0.9.
|
|
105
|
+
"version": "0.9.64",
|
|
106
106
|
"types": "./lib/index.d.ts",
|
|
107
107
|
"dbxToolsConfig": {
|
|
108
108
|
"tags": [
|
package/src/_ranking.ts
CHANGED
|
@@ -10,38 +10,24 @@ import { toModelDisplayName } from "@dbx-tools/shared-model/display";
|
|
|
10
10
|
import Fuse from "fuse.js";
|
|
11
11
|
|
|
12
12
|
import { modelStatusFor } from "./_retirement.ts";
|
|
13
|
-
import { classesAtOrBelow, CHAT_CLASS_ORDER,
|
|
13
|
+
import { classesAtOrBelow, CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./classes.ts";
|
|
14
14
|
import {
|
|
15
15
|
classifyEndpoints,
|
|
16
16
|
endpointCapabilities,
|
|
17
17
|
supportsToolsByFamily,
|
|
18
18
|
versionTuple,
|
|
19
19
|
} from "./classify.ts";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
isOpenWeightsGpt,
|
|
22
|
+
modelFamily,
|
|
23
|
+
modelReasoningEfforts,
|
|
24
|
+
modelServiceNames,
|
|
25
|
+
} from "./policy.ts";
|
|
21
26
|
|
|
22
27
|
type ModelClass = ModelClassType;
|
|
23
28
|
const ModelClass = ModelClassValues;
|
|
24
29
|
|
|
25
30
|
const DEFAULT_FUZZY_THRESHOLD = 0.4;
|
|
26
|
-
const SEARCH_INTENT_FILLERS = new Set(["a", "best", "for", "model", "models", "the"]);
|
|
27
|
-
const CHAT_SEARCH_INTENTS = new Set([
|
|
28
|
-
"chat",
|
|
29
|
-
"completion",
|
|
30
|
-
"completions",
|
|
31
|
-
"summarize",
|
|
32
|
-
"summarise",
|
|
33
|
-
"summarization",
|
|
34
|
-
"summarisation",
|
|
35
|
-
"summary",
|
|
36
|
-
]);
|
|
37
|
-
const EMBEDDING_SEARCH_INTENTS = new Set([
|
|
38
|
-
"embed",
|
|
39
|
-
"embedding",
|
|
40
|
-
"embeddings",
|
|
41
|
-
"vector",
|
|
42
|
-
"vectorize",
|
|
43
|
-
"vectorise",
|
|
44
|
-
]);
|
|
45
31
|
|
|
46
32
|
interface NativeRankingOptions {
|
|
47
33
|
readonly includeDeprecated?: boolean;
|
|
@@ -72,22 +58,11 @@ export function rankEndpoints(
|
|
|
72
58
|
}
|
|
73
59
|
: classifyEndpoints(normalized);
|
|
74
60
|
const search = query.search?.trim();
|
|
75
|
-
const
|
|
76
|
-
const rankedSearch = searchPlan ? searchPlan.search : search;
|
|
77
|
-
const searchIntent = searchPlan?.modelClass;
|
|
78
|
-
const requestedClass = options.modelClass ?? query.modelClass ?? searchIntent;
|
|
61
|
+
const requestedClass = options.modelClass ?? query.modelClass;
|
|
79
62
|
const includeDeprecated = query.includeDeprecated ?? options.includeDeprecated ?? false;
|
|
80
63
|
const eligible = requestedClass ? classesAtOrBelow(requestedClass) : CHAT_CLASS_ORDER;
|
|
81
64
|
const candidates: RankedModel[] = [];
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
searchIntent !== undefined &&
|
|
85
|
-
explicitClass !== undefined &&
|
|
86
|
-
isChatClass(searchIntent) !== isChatClass(explicitClass)
|
|
87
|
-
) {
|
|
88
|
-
return [];
|
|
89
|
-
}
|
|
90
|
-
if (rankedSearch && requestedClass === undefined) {
|
|
65
|
+
if (search && requestedClass === undefined) {
|
|
91
66
|
const classByName = classifyEndpointClasses(normalized);
|
|
92
67
|
for (const endpoint of normalized) {
|
|
93
68
|
if (!includeDeprecated && endpoint.status?.deprecated) continue;
|
|
@@ -108,14 +83,17 @@ export function rankEndpoints(
|
|
|
108
83
|
}
|
|
109
84
|
}
|
|
110
85
|
|
|
111
|
-
let ranked =
|
|
112
|
-
|
|
113
|
-
|
|
86
|
+
let ranked =
|
|
87
|
+
!search && requestedClass === undefined
|
|
88
|
+
? preferLatestWithinLeadingFamily(candidates)
|
|
89
|
+
: candidates;
|
|
90
|
+
if (search) {
|
|
91
|
+
const exact = candidates.find((candidate) => candidate.endpoint.name === search);
|
|
114
92
|
if (exact) {
|
|
115
93
|
ranked = [{ ...exact, score: 0 }];
|
|
116
94
|
} else {
|
|
117
95
|
const threshold = query.threshold ?? DEFAULT_FUZZY_THRESHOLD;
|
|
118
|
-
const searchTokens = tokenize(
|
|
96
|
+
const searchTokens = tokenize(search);
|
|
119
97
|
const tokenMatches = candidates
|
|
120
98
|
.filter((candidate) => {
|
|
121
99
|
const candidateTokens = new Set(searchableValues(candidate.endpoint).flatMap(tokenize));
|
|
@@ -141,7 +119,7 @@ export function rankEndpoints(
|
|
|
141
119
|
useExtendedSearch: true,
|
|
142
120
|
isCaseSensitive: false,
|
|
143
121
|
});
|
|
144
|
-
const normalizedSearch = tokenize(
|
|
122
|
+
const normalizedSearch = tokenize(search).join(" ");
|
|
145
123
|
ranked = normalizedSearch
|
|
146
124
|
? fuse
|
|
147
125
|
.search(normalizedSearch)
|
|
@@ -159,6 +137,21 @@ export function rankEndpoints(
|
|
|
159
137
|
return query.limit === undefined ? restored : restored.slice(0, Math.max(0, query.limit));
|
|
160
138
|
}
|
|
161
139
|
|
|
140
|
+
function preferLatestWithinLeadingFamily(candidates: readonly RankedModel[]): RankedModel[] {
|
|
141
|
+
const leading = candidates[0];
|
|
142
|
+
if (!leading) return [];
|
|
143
|
+
const family = modelFamily(leading.endpoint.name);
|
|
144
|
+
if (!family) return [...candidates];
|
|
145
|
+
const sameFamily = candidates
|
|
146
|
+
.filter((candidate) => modelFamily(candidate.endpoint.name) === family)
|
|
147
|
+
.sort(compareRanked);
|
|
148
|
+
const selected = new Set(sameFamily.map((candidate) => candidate.endpoint.name));
|
|
149
|
+
return [
|
|
150
|
+
...sameFamily,
|
|
151
|
+
...candidates.filter((candidate) => !selected.has(candidate.endpoint.name)),
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
|
|
162
155
|
function matchesModelQuery(endpoint: ServingEndpointSummary, query: ModelQuery): boolean {
|
|
163
156
|
if (query.name !== undefined && endpoint.name !== query.name) return false;
|
|
164
157
|
if (query.task !== undefined && endpoint.task !== query.task) return false;
|
|
@@ -283,29 +276,6 @@ function modelVariantRank(name: string): number {
|
|
|
283
276
|
return 2;
|
|
284
277
|
}
|
|
285
278
|
|
|
286
|
-
/**
|
|
287
|
-
* Resolve generic job searches to the capability class that owns the work.
|
|
288
|
-
*
|
|
289
|
-
* A pure intent such as "summarize" ranks that capability directly. Mixed
|
|
290
|
-
* queries remove the intent word but retain the model identity, so "gpt chat"
|
|
291
|
-
* still uses the historical version and variant preference for GPT.
|
|
292
|
-
*/
|
|
293
|
-
function modelSearchPlan(
|
|
294
|
-
search: string,
|
|
295
|
-
): { readonly modelClass: ModelClass; readonly search?: string } | undefined {
|
|
296
|
-
const tokens = tokenize(search).filter((token) => !SEARCH_INTENT_FILLERS.has(token));
|
|
297
|
-
if (tokens.length === 0) return undefined;
|
|
298
|
-
const chat = tokens.some((token) => CHAT_SEARCH_INTENTS.has(token));
|
|
299
|
-
const embedding = tokens.some((token) => EMBEDDING_SEARCH_INTENTS.has(token));
|
|
300
|
-
if (chat === embedding) return undefined;
|
|
301
|
-
const intentWords = chat ? CHAT_SEARCH_INTENTS : EMBEDDING_SEARCH_INTENTS;
|
|
302
|
-
const remaining = tokens.filter((token) => !intentWords.has(token));
|
|
303
|
-
return {
|
|
304
|
-
modelClass: chat ? ModelClass.ChatThinking : ModelClass.Embedding,
|
|
305
|
-
...(remaining.length > 0 ? { search: remaining.join(" ") } : {}),
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
|
|
309
279
|
function tokenize(value: string): string[] {
|
|
310
280
|
return value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
311
281
|
}
|
package/src/_selection.ts
CHANGED
|
@@ -18,8 +18,6 @@ import { rankEndpoints } from "./_ranking.ts";
|
|
|
18
18
|
import { FALLBACK_MODEL_IDS, modelsForClass } from "./fallback.ts";
|
|
19
19
|
import { endpointSupportsTools } from "./policy.ts";
|
|
20
20
|
|
|
21
|
-
const DEFAULT_MODEL_FAMILY_SEARCH = "gpt";
|
|
22
|
-
|
|
23
21
|
/** Rank a catalogue against a model query, best-first. */
|
|
24
22
|
export function lookupModels(
|
|
25
23
|
endpoints: readonly ServingEndpointSummary[],
|
|
@@ -72,10 +70,6 @@ export function resolveModel(
|
|
|
72
70
|
}
|
|
73
71
|
|
|
74
72
|
const source = input.modelClass !== undefined ? "class" : "fallback";
|
|
75
|
-
if (input.modelClass === undefined) {
|
|
76
|
-
const [preferred] = lookupModels(endpoints, buildQuery(input, DEFAULT_MODEL_FAMILY_SEARCH));
|
|
77
|
-
if (preferred) return { modelId: preferred.endpoint.name, source };
|
|
78
|
-
}
|
|
79
73
|
const [top] = lookupModels(endpoints, buildQuery(input, undefined));
|
|
80
74
|
if (top) return { modelId: top.endpoint.name, source };
|
|
81
75
|
|
package/src/model-catalog.ts
CHANGED
package/src/model-client.ts
CHANGED
|
@@ -103,7 +103,7 @@ interface DatabricksModelClient {
|
|
|
103
103
|
host(): string;
|
|
104
104
|
principal(): string;
|
|
105
105
|
workspaceId(): string | undefined;
|
|
106
|
-
request(path: string): Promise<unknown>;
|
|
106
|
+
request(path: string, init?: RequestInit): Promise<unknown>;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
class AuthenticatedModelClient implements DatabricksModelClient {
|
|
@@ -124,13 +124,21 @@ class AuthenticatedModelClient implements DatabricksModelClient {
|
|
|
124
124
|
return this.auth.workspaceId;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
async request(path: string): Promise<unknown> {
|
|
127
|
+
async request(path: string, init: RequestInit = {}): Promise<unknown> {
|
|
128
128
|
const url = new URL(path, `${this.host().replace(/\/$/, "")}/`).toString();
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
const headers = new Headers(init.headers);
|
|
130
|
+
for (const [name, value] of Object.entries(await this.auth.headers())) {
|
|
131
|
+
headers.set(name, value);
|
|
132
|
+
}
|
|
133
|
+
if (init.body !== undefined && !headers.has("content-type")) {
|
|
134
|
+
headers.set("content-type", "application/json");
|
|
135
|
+
}
|
|
136
|
+
let response = await this.fetcher(url, { ...init, headers });
|
|
131
137
|
if (response.status === 401) {
|
|
132
|
-
|
|
133
|
-
|
|
138
|
+
for (const [name, value] of Object.entries(await this.auth.headers({ refresh: true }))) {
|
|
139
|
+
headers.set(name, value);
|
|
140
|
+
}
|
|
141
|
+
response = await this.fetcher(url, { ...init, headers });
|
|
134
142
|
}
|
|
135
143
|
const text = await response.text();
|
|
136
144
|
if (!response.ok) {
|
|
@@ -236,7 +244,7 @@ class DefaultModelClient implements ModelClient {
|
|
|
236
244
|
if (!object.isRecord(response) || !Array.isArray(response.endpoints)) {
|
|
237
245
|
throw new Error("Databricks serving-endpoints response is missing an endpoints array");
|
|
238
246
|
}
|
|
239
|
-
const endpoints = normalizeEndpoints(response.endpoints);
|
|
247
|
+
const endpoints = await this.measureEmbeddingDimensions(normalizeEndpoints(response.endpoints));
|
|
240
248
|
logger.debug("listed", {
|
|
241
249
|
count: endpoints.length,
|
|
242
250
|
host: this.client.host(),
|
|
@@ -244,6 +252,42 @@ class DefaultModelClient implements ModelClient {
|
|
|
244
252
|
});
|
|
245
253
|
return endpoints;
|
|
246
254
|
}
|
|
255
|
+
|
|
256
|
+
private async measureEmbeddingDimensions(
|
|
257
|
+
endpoints: readonly ServingEndpointSummary[],
|
|
258
|
+
): Promise<ServingEndpointSummary[]> {
|
|
259
|
+
return Promise.all(
|
|
260
|
+
endpoints.map(async (endpoint) => {
|
|
261
|
+
if (endpoint.class !== ModelClass.Embedding || endpoint.dimension !== undefined) {
|
|
262
|
+
return endpoint;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
const response = await this.client.request(
|
|
266
|
+
`/serving-endpoints/${encodeURIComponent(endpoint.name)}/invocations`,
|
|
267
|
+
{
|
|
268
|
+
method: "POST",
|
|
269
|
+
body: JSON.stringify({ input: ["ping"] }),
|
|
270
|
+
},
|
|
271
|
+
);
|
|
272
|
+
const dimension = embeddingDimension(response);
|
|
273
|
+
return dimension === undefined ? endpoint : { ...endpoint, dimension };
|
|
274
|
+
} catch (error) {
|
|
275
|
+
logger.warn("embedding dimension probe failed", {
|
|
276
|
+
model: endpoint.name,
|
|
277
|
+
error,
|
|
278
|
+
});
|
|
279
|
+
return endpoint;
|
|
280
|
+
}
|
|
281
|
+
}),
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function embeddingDimension(value: unknown): number | undefined {
|
|
287
|
+
if (!object.isRecord(value) || !Array.isArray(value.data)) return undefined;
|
|
288
|
+
const first = value.data[0];
|
|
289
|
+
if (!object.isRecord(first) || !Array.isArray(first.embedding)) return undefined;
|
|
290
|
+
return first.embedding.length > 0 ? first.embedding.length : undefined;
|
|
247
291
|
}
|
|
248
292
|
|
|
249
293
|
/** Create an authentication-aware Databricks model client. */
|