every-plugin 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/rspack/index.cjs +267 -0
- package/dist/build/rspack/index.d.cts +20 -0
- package/dist/build/rspack/index.d.mts +20 -0
- package/dist/build/rspack/index.mjs +265 -0
- package/dist/chunk-QQAxy9l9.mjs +31 -0
- package/dist/chunk-zltIcp7o.cjs +46 -0
- package/dist/effect.cjs +9 -0
- package/dist/effect.d.cts +1 -0
- package/dist/effect.d.mts +1 -0
- package/dist/effect.mjs +3 -0
- package/dist/errors-CVnoPl9v.cjs +68 -0
- package/dist/errors-Car4tFVP.d.mts +75 -0
- package/dist/errors-D7keKf7a.mjs +63 -0
- package/dist/errors-DKPPPYYT.d.cts +75 -0
- package/dist/errors.cjs +4 -0
- package/dist/errors.d.cts +3 -0
- package/dist/errors.d.mts +3 -0
- package/dist/errors.mjs +4 -0
- package/dist/fetch-Cc95-7kM.cjs +336 -0
- package/dist/fetch-KLktuWuM.mjs +335 -0
- package/dist/index-bwAhA9ca.d.mts +383 -0
- package/dist/index-matrPV4m.d.cts +382 -0
- package/dist/index.cjs +57 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +52 -0
- package/dist/{runtime/services/normalize.d.ts → normalize-BLTyqFww.d.mts} +5 -2
- package/dist/{runtime/services/normalize.js → normalize-BW7kk8Lk.d.cts} +5 -1
- package/dist/normalize-D4Qh0wVk.cjs +28 -0
- package/dist/normalize-D7nae0Hn.mjs +22 -0
- package/dist/openapi.DrTcell5-C6kyDyUK.mjs +669 -0
- package/dist/openapi.DrTcell5-DDf4D5V3.cjs +687 -0
- package/dist/orpc.cjs +46 -0
- package/dist/orpc.d.cts +7 -0
- package/dist/orpc.d.mts +7 -0
- package/dist/orpc.mjs +11 -0
- package/dist/package-Ba1JsQFb.mjs +149 -0
- package/dist/package-C09aaCqd.cjs +154 -0
- package/dist/plugins-C-7lh5gK.cjs +128 -0
- package/dist/plugins-Ps5Xxpk2.mjs +128 -0
- package/dist/runtime/index.cjs +6 -0
- package/dist/runtime/index.d.cts +5 -0
- package/dist/runtime/index.d.mts +5 -0
- package/dist/runtime/index.mjs +5 -0
- package/dist/runtime/services/normalize.cjs +3 -0
- package/dist/runtime/services/normalize.d.cts +2 -0
- package/dist/runtime/services/normalize.d.mts +2 -0
- package/dist/runtime/services/normalize.mjs +3 -0
- package/dist/runtime-CdAK1Q5M.cjs +523 -0
- package/dist/runtime-I62RA1Vo.mjs +458 -0
- package/dist/standard-DaxKTFui.mjs +595 -0
- package/dist/standard-eUgUkWaf.cjs +702 -0
- package/dist/testing/index.cjs +78 -0
- package/dist/testing/index.d.cts +60 -0
- package/dist/testing/index.d.mts +60 -0
- package/dist/testing/index.mjs +75 -0
- package/dist/zod-A7Pti5IV.d.cts +4 -0
- package/dist/zod-BVo51kgJ.mjs +10 -0
- package/dist/zod-D4CFw8d9.d.mts +4 -0
- package/dist/zod-DYghWCz1.cjs +14 -0
- package/dist/zod.cjs +10 -0
- package/dist/zod.d.cts +2 -0
- package/dist/zod.d.mts +2 -0
- package/dist/zod.mjs +5 -0
- package/dist/zod4-BXTBR1od.cjs +318 -0
- package/dist/zod4-VpXuwRO7.mjs +317 -0
- package/package.json +64 -27
- package/dist/effect.d.ts +0 -2
- package/dist/effect.d.ts.map +0 -1
- package/dist/effect.js +0 -1
- package/dist/errors.d.ts +0 -70
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -61
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5
- package/dist/orpc.d.ts +0 -10
- package/dist/orpc.d.ts.map +0 -1
- package/dist/orpc.js +0 -6
- package/dist/plugin.d.ts +0 -57
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -43
- package/dist/runtime/errors.d.ts +0 -36
- package/dist/runtime/errors.d.ts.map +0 -1
- package/dist/runtime/errors.js +0 -47
- package/dist/runtime/index.d.ts +0 -20
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -131
- package/dist/runtime/services/module-federation.service.d.ts +0 -13
- package/dist/runtime/services/module-federation.service.d.ts.map +0 -1
- package/dist/runtime/services/module-federation.service.js +0 -155
- package/dist/runtime/services/normalize.d.ts.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.d.ts +0 -14
- package/dist/runtime/services/plugin-lifecycle.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.js +0 -34
- package/dist/runtime/services/plugin-loader.service.d.ts +0 -45
- package/dist/runtime/services/plugin-loader.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin-loader.service.js +0 -93
- package/dist/runtime/services/plugin.service.d.ts +0 -36
- package/dist/runtime/services/plugin.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin.service.js +0 -31
- package/dist/runtime/services/secrets.service.d.ts +0 -15
- package/dist/runtime/services/secrets.service.d.ts.map +0 -1
- package/dist/runtime/services/secrets.service.js +0 -35
- package/dist/runtime/services.d.ts +0 -6
- package/dist/runtime/services.d.ts.map +0 -1
- package/dist/runtime/services.js +0 -5
- package/dist/runtime/validation.d.ts +0 -5
- package/dist/runtime/validation.d.ts.map +0 -1
- package/dist/runtime/validation.js +0 -13
- package/dist/testing/index.d.ts +0 -59
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -45
- package/dist/testing/mocks/module-federation.service.d.ts +0 -6
- package/dist/testing/mocks/module-federation.service.d.ts.map +0 -1
- package/dist/testing/mocks/module-federation.service.js +0 -29
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types.d.ts +0 -187
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/zod.d.ts +0 -2
- package/dist/zod.d.ts.map +0 -1
- package/dist/zod.js +0 -1
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { _ as tryDecodeURIComponent, a as toHttpPath, h as stringifyJSON, i as standardizeHTTPPath, l as isORPCErrorStatus, n as StandardOpenAPISerializer, o as StandardBracketNotationSerializer, p as isObject, t as StandardOpenAPIJsonSerializer, v as value } from "./standard-DaxKTFui.mjs";
|
|
2
|
+
import { createContractedProcedure, getLazyMeta, getRouter, isProcedure, traverseContractProcedures, unlazy } from "@orpc/server";
|
|
3
|
+
import { fallbackContractConfig } from "@orpc/contract";
|
|
4
|
+
import { FetchHandler } from "@orpc/server/fetch";
|
|
5
|
+
import { StandardHandler } from "@orpc/server/standard";
|
|
6
|
+
|
|
7
|
+
//#region ../../node_modules/.bun/rou3@0.7.10/node_modules/rou3/dist/index.mjs
|
|
8
|
+
const NullProtoObj = /* @__PURE__ */ (() => {
|
|
9
|
+
const e = function() {};
|
|
10
|
+
return e.prototype = Object.create(null), Object.freeze(e.prototype), e;
|
|
11
|
+
})();
|
|
12
|
+
/**
|
|
13
|
+
* Create a new router context.
|
|
14
|
+
*/
|
|
15
|
+
function createRouter() {
|
|
16
|
+
return {
|
|
17
|
+
root: { key: "" },
|
|
18
|
+
static: new NullProtoObj()
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function splitPath(path) {
|
|
22
|
+
const [_, ...s] = path.split("/");
|
|
23
|
+
return s[s.length - 1] === "" ? s.slice(0, -1) : s;
|
|
24
|
+
}
|
|
25
|
+
function getMatchParams(segments, paramsMap) {
|
|
26
|
+
const params = new NullProtoObj();
|
|
27
|
+
for (const [index, name] of paramsMap) {
|
|
28
|
+
const segment = index < 0 ? segments.slice(-1 * index).join("/") : segments[index];
|
|
29
|
+
if (typeof name === "string") params[name] = segment;
|
|
30
|
+
else {
|
|
31
|
+
const match = segment.match(name);
|
|
32
|
+
if (match) for (const key in match.groups) params[key] = match.groups[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return params;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Add a route to the router context.
|
|
39
|
+
*/
|
|
40
|
+
function addRoute(ctx, method = "", path, data) {
|
|
41
|
+
method = method.toUpperCase();
|
|
42
|
+
if (path.charCodeAt(0) !== 47) path = `/${path}`;
|
|
43
|
+
const segments = splitPath(path);
|
|
44
|
+
let node = ctx.root;
|
|
45
|
+
let _unnamedParamIndex = 0;
|
|
46
|
+
const paramsMap = [];
|
|
47
|
+
const paramsRegexp = [];
|
|
48
|
+
for (let i = 0; i < segments.length; i++) {
|
|
49
|
+
const segment = segments[i];
|
|
50
|
+
if (segment.startsWith("**")) {
|
|
51
|
+
if (!node.wildcard) node.wildcard = { key: "**" };
|
|
52
|
+
node = node.wildcard;
|
|
53
|
+
paramsMap.push([
|
|
54
|
+
-i,
|
|
55
|
+
segment.split(":")[1] || "_",
|
|
56
|
+
segment.length === 2
|
|
57
|
+
]);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (segment === "*" || segment.includes(":")) {
|
|
61
|
+
if (!node.param) node.param = { key: "*" };
|
|
62
|
+
node = node.param;
|
|
63
|
+
if (segment === "*") paramsMap.push([
|
|
64
|
+
i,
|
|
65
|
+
`_${_unnamedParamIndex++}`,
|
|
66
|
+
true
|
|
67
|
+
]);
|
|
68
|
+
else if (segment.includes(":", 1)) {
|
|
69
|
+
const regexp = getParamRegexp(segment);
|
|
70
|
+
paramsRegexp[i] = regexp;
|
|
71
|
+
node.hasRegexParam = true;
|
|
72
|
+
paramsMap.push([
|
|
73
|
+
i,
|
|
74
|
+
regexp,
|
|
75
|
+
false
|
|
76
|
+
]);
|
|
77
|
+
} else paramsMap.push([
|
|
78
|
+
i,
|
|
79
|
+
segment.slice(1),
|
|
80
|
+
false
|
|
81
|
+
]);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const child = node.static?.[segment];
|
|
85
|
+
if (child) node = child;
|
|
86
|
+
else {
|
|
87
|
+
const staticNode = { key: segment };
|
|
88
|
+
if (!node.static) node.static = new NullProtoObj();
|
|
89
|
+
node.static[segment] = staticNode;
|
|
90
|
+
node = staticNode;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const hasParams = paramsMap.length > 0;
|
|
94
|
+
if (!node.methods) node.methods = new NullProtoObj();
|
|
95
|
+
node.methods[method] ??= [];
|
|
96
|
+
node.methods[method].push({
|
|
97
|
+
data: data || null,
|
|
98
|
+
paramsRegexp,
|
|
99
|
+
paramsMap: hasParams ? paramsMap : void 0
|
|
100
|
+
});
|
|
101
|
+
if (!hasParams) ctx.static[path] = node;
|
|
102
|
+
}
|
|
103
|
+
function getParamRegexp(segment) {
|
|
104
|
+
const regex = segment.replace(/:(\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\./g, "\\.");
|
|
105
|
+
return /* @__PURE__ */ new RegExp(`^${regex}$`);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Find a route by path.
|
|
109
|
+
*/
|
|
110
|
+
function findRoute(ctx, method = "", path, opts) {
|
|
111
|
+
if (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);
|
|
112
|
+
const staticNode = ctx.static[path];
|
|
113
|
+
if (staticNode && staticNode.methods) {
|
|
114
|
+
const staticMatch = staticNode.methods[method] || staticNode.methods[""];
|
|
115
|
+
if (staticMatch !== void 0) return staticMatch[0];
|
|
116
|
+
}
|
|
117
|
+
const segments = splitPath(path);
|
|
118
|
+
const match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];
|
|
119
|
+
if (match === void 0) return;
|
|
120
|
+
if (opts?.params === false) return match;
|
|
121
|
+
return {
|
|
122
|
+
data: match.data,
|
|
123
|
+
params: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function _lookupTree(ctx, node, method, segments, index) {
|
|
127
|
+
if (index === segments.length) {
|
|
128
|
+
if (node.methods) {
|
|
129
|
+
const match = node.methods[method] || node.methods[""];
|
|
130
|
+
if (match) return match;
|
|
131
|
+
}
|
|
132
|
+
if (node.param && node.param.methods) {
|
|
133
|
+
const match = node.param.methods[method] || node.param.methods[""];
|
|
134
|
+
if (match) {
|
|
135
|
+
const pMap = match[0].paramsMap;
|
|
136
|
+
if (pMap?.[pMap?.length - 1]?.[2]) return match;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (node.wildcard && node.wildcard.methods) {
|
|
140
|
+
const match = node.wildcard.methods[method] || node.wildcard.methods[""];
|
|
141
|
+
if (match) {
|
|
142
|
+
const pMap = match[0].paramsMap;
|
|
143
|
+
if (pMap?.[pMap?.length - 1]?.[2]) return match;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const segment = segments[index];
|
|
149
|
+
if (node.static) {
|
|
150
|
+
const staticChild = node.static[segment];
|
|
151
|
+
if (staticChild) {
|
|
152
|
+
const match = _lookupTree(ctx, staticChild, method, segments, index + 1);
|
|
153
|
+
if (match) return match;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (node.param) {
|
|
157
|
+
const match = _lookupTree(ctx, node.param, method, segments, index + 1);
|
|
158
|
+
if (match) {
|
|
159
|
+
if (node.param.hasRegexParam) {
|
|
160
|
+
const exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);
|
|
161
|
+
return exactMatch ? [exactMatch] : void 0;
|
|
162
|
+
}
|
|
163
|
+
return match;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[""];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
//#endregion
|
|
170
|
+
//#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/shared/openapi.DIt-Z9W1.mjs
|
|
171
|
+
var StandardOpenAPICodec = class {
|
|
172
|
+
constructor(serializer, options = {}) {
|
|
173
|
+
this.serializer = serializer;
|
|
174
|
+
this.customErrorResponseBodyEncoder = options.customErrorResponseBodyEncoder;
|
|
175
|
+
}
|
|
176
|
+
customErrorResponseBodyEncoder;
|
|
177
|
+
async decode(request, params, procedure) {
|
|
178
|
+
if (fallbackContractConfig("defaultInputStructure", procedure["~orpc"].route.inputStructure) === "compact") {
|
|
179
|
+
const data = request.method === "GET" ? this.serializer.deserialize(request.url.searchParams) : this.serializer.deserialize(await request.body());
|
|
180
|
+
if (data === void 0) return params;
|
|
181
|
+
if (isObject(data)) return {
|
|
182
|
+
...params,
|
|
183
|
+
...data
|
|
184
|
+
};
|
|
185
|
+
return data;
|
|
186
|
+
}
|
|
187
|
+
const deserializeSearchParams = () => {
|
|
188
|
+
return this.serializer.deserialize(request.url.searchParams);
|
|
189
|
+
};
|
|
190
|
+
return {
|
|
191
|
+
params,
|
|
192
|
+
get query() {
|
|
193
|
+
const value$1 = deserializeSearchParams();
|
|
194
|
+
Object.defineProperty(this, "query", {
|
|
195
|
+
value: value$1,
|
|
196
|
+
writable: true
|
|
197
|
+
});
|
|
198
|
+
return value$1;
|
|
199
|
+
},
|
|
200
|
+
set query(value$1) {
|
|
201
|
+
Object.defineProperty(this, "query", {
|
|
202
|
+
value: value$1,
|
|
203
|
+
writable: true
|
|
204
|
+
});
|
|
205
|
+
},
|
|
206
|
+
headers: request.headers,
|
|
207
|
+
body: this.serializer.deserialize(await request.body())
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
encode(output, procedure) {
|
|
211
|
+
const successStatus = fallbackContractConfig("defaultSuccessStatus", procedure["~orpc"].route.successStatus);
|
|
212
|
+
if (fallbackContractConfig("defaultOutputStructure", procedure["~orpc"].route.outputStructure) === "compact") return {
|
|
213
|
+
status: successStatus,
|
|
214
|
+
headers: {},
|
|
215
|
+
body: this.serializer.serialize(output)
|
|
216
|
+
};
|
|
217
|
+
if (!this.#isDetailedOutput(output)) throw new Error(`
|
|
218
|
+
Invalid "detailed" output structure:
|
|
219
|
+
\u2022 Expected an object with optional properties:
|
|
220
|
+
- status (number 200-399)
|
|
221
|
+
- headers (Record<string, string | string[]>)
|
|
222
|
+
- body (any)
|
|
223
|
+
\u2022 No extra keys allowed.
|
|
224
|
+
|
|
225
|
+
Actual value:
|
|
226
|
+
${stringifyJSON(output)}
|
|
227
|
+
`);
|
|
228
|
+
return {
|
|
229
|
+
status: output.status ?? successStatus,
|
|
230
|
+
headers: output.headers ?? {},
|
|
231
|
+
body: this.serializer.serialize(output.body)
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
encodeError(error) {
|
|
235
|
+
const body = this.customErrorResponseBodyEncoder?.(error) ?? error.toJSON();
|
|
236
|
+
return {
|
|
237
|
+
status: error.status,
|
|
238
|
+
headers: {},
|
|
239
|
+
body: this.serializer.serialize(body, { outputFormat: "plain" })
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
#isDetailedOutput(output) {
|
|
243
|
+
if (!isObject(output)) return false;
|
|
244
|
+
if (output.headers && !isObject(output.headers)) return false;
|
|
245
|
+
if (output.status !== void 0 && (typeof output.status !== "number" || !Number.isInteger(output.status) || isORPCErrorStatus(output.status))) return false;
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
function toRou3Pattern(path) {
|
|
250
|
+
return standardizeHTTPPath(path).replace(/\/\{\+([^}]+)\}/g, "/**:$1").replace(/\/\{([^}]+)\}/g, "/:$1");
|
|
251
|
+
}
|
|
252
|
+
function decodeParams(params) {
|
|
253
|
+
return Object.fromEntries(Object.entries(params).map(([key, value$1]) => [key, tryDecodeURIComponent(value$1)]));
|
|
254
|
+
}
|
|
255
|
+
var StandardOpenAPIMatcher = class {
|
|
256
|
+
filter;
|
|
257
|
+
tree = createRouter();
|
|
258
|
+
pendingRouters = [];
|
|
259
|
+
constructor(options = {}) {
|
|
260
|
+
this.filter = options.filter ?? true;
|
|
261
|
+
}
|
|
262
|
+
init(router, path = []) {
|
|
263
|
+
const laziedOptions = traverseContractProcedures({
|
|
264
|
+
router,
|
|
265
|
+
path
|
|
266
|
+
}, (traverseOptions) => {
|
|
267
|
+
if (!value(this.filter, traverseOptions)) return;
|
|
268
|
+
const { path: path2, contract } = traverseOptions;
|
|
269
|
+
const method = fallbackContractConfig("defaultMethod", contract["~orpc"].route.method);
|
|
270
|
+
const httpPath = toRou3Pattern(contract["~orpc"].route.path ?? toHttpPath(path2));
|
|
271
|
+
if (isProcedure(contract)) addRoute(this.tree, method, httpPath, {
|
|
272
|
+
path: path2,
|
|
273
|
+
contract,
|
|
274
|
+
procedure: contract,
|
|
275
|
+
router
|
|
276
|
+
});
|
|
277
|
+
else addRoute(this.tree, method, httpPath, {
|
|
278
|
+
path: path2,
|
|
279
|
+
contract,
|
|
280
|
+
procedure: void 0,
|
|
281
|
+
router
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
this.pendingRouters.push(...laziedOptions.map((option) => ({
|
|
285
|
+
...option,
|
|
286
|
+
httpPathPrefix: toHttpPath(option.path),
|
|
287
|
+
laziedPrefix: getLazyMeta(option.router).prefix
|
|
288
|
+
})));
|
|
289
|
+
}
|
|
290
|
+
async match(method, pathname) {
|
|
291
|
+
if (this.pendingRouters.length) {
|
|
292
|
+
const newPendingRouters = [];
|
|
293
|
+
for (const pendingRouter of this.pendingRouters) if (!pendingRouter.laziedPrefix || pathname.startsWith(pendingRouter.laziedPrefix) || pathname.startsWith(pendingRouter.httpPathPrefix)) {
|
|
294
|
+
const { default: router } = await unlazy(pendingRouter.router);
|
|
295
|
+
this.init(router, pendingRouter.path);
|
|
296
|
+
} else newPendingRouters.push(pendingRouter);
|
|
297
|
+
this.pendingRouters = newPendingRouters;
|
|
298
|
+
}
|
|
299
|
+
const match = findRoute(this.tree, method, pathname);
|
|
300
|
+
if (!match) return;
|
|
301
|
+
if (!match.data.procedure) {
|
|
302
|
+
const { default: maybeProcedure } = await unlazy(getRouter(match.data.router, match.data.path));
|
|
303
|
+
if (!isProcedure(maybeProcedure)) throw new Error(`
|
|
304
|
+
[Contract-First] Missing or invalid implementation for procedure at path: ${toHttpPath(match.data.path)}.
|
|
305
|
+
Ensure that the procedure is correctly defined and matches the expected contract.
|
|
306
|
+
`);
|
|
307
|
+
match.data.procedure = createContractedProcedure(maybeProcedure, match.data.contract);
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
path: match.data.path,
|
|
311
|
+
procedure: match.data.procedure,
|
|
312
|
+
params: match.params ? decodeParams(match.params) : void 0
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
var StandardOpenAPIHandler = class extends StandardHandler {
|
|
317
|
+
constructor(router, options) {
|
|
318
|
+
const serializer = new StandardOpenAPISerializer(new StandardOpenAPIJsonSerializer(options), new StandardBracketNotationSerializer(options));
|
|
319
|
+
const matcher = new StandardOpenAPIMatcher(options);
|
|
320
|
+
const codec = new StandardOpenAPICodec(serializer, options);
|
|
321
|
+
super(router, matcher, codec, options);
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
//#endregion
|
|
326
|
+
//#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/adapters/fetch/index.mjs
|
|
327
|
+
var OpenAPIHandler = class extends FetchHandler {
|
|
328
|
+
constructor(router, options = {}) {
|
|
329
|
+
super(new StandardOpenAPIHandler(router, options), options);
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
//#endregion
|
|
334
|
+
export { OpenAPIHandler };
|
|
335
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2gtS0xrdHVXdU0ubWpzIiwibmFtZXMiOlsidmFsdWUiLCIjaXNEZXRhaWxlZE91dHB1dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL3JvdTNAMC43LjEwL25vZGVfbW9kdWxlcy9yb3UzL2Rpc3QvaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMrb3BlbmFwaUAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL29wZW5hcGkvZGlzdC9zaGFyZWQvb3BlbmFwaS5ESXQtWjlXMS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpQDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS9kaXN0L2FkYXB0ZXJzL2ZldGNoL2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBOdWxsUHJvdG9PYmogPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcblx0Y29uc3QgZSA9IGZ1bmN0aW9uKCkge307XG5cdHJldHVybiBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCksIE9iamVjdC5mcmVlemUoZS5wcm90b3R5cGUpLCBlO1xufSkoKTtcblxuLyoqXG4qIENyZWF0ZSBhIG5ldyByb3V0ZXIgY29udGV4dC5cbiovXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXIoKSB7XG5cdHJldHVybiB7XG5cdFx0cm9vdDogeyBrZXk6IFwiXCIgfSxcblx0XHRzdGF0aWM6IG5ldyBOdWxsUHJvdG9PYmooKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFBhdGgocGF0aCkge1xuXHRjb25zdCBbXywgLi4uc10gPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0cmV0dXJuIHNbcy5sZW5ndGggLSAxXSA9PT0gXCJcIiA/IHMuc2xpY2UoMCwgLTEpIDogcztcbn1cbmZ1bmN0aW9uIGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBwYXJhbXNNYXApIHtcblx0Y29uc3QgcGFyYW1zID0gbmV3IE51bGxQcm90b09iaigpO1xuXHRmb3IgKGNvbnN0IFtpbmRleCwgbmFtZV0gb2YgcGFyYW1zTWFwKSB7XG5cdFx0Y29uc3Qgc2VnbWVudCA9IGluZGV4IDwgMCA/IHNlZ21lbnRzLnNsaWNlKC0xICogaW5kZXgpLmpvaW4oXCIvXCIpIDogc2VnbWVudHNbaW5kZXhdO1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgcGFyYW1zW25hbWVdID0gc2VnbWVudDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gc2VnbWVudC5tYXRjaChuYW1lKTtcblx0XHRcdGlmIChtYXRjaCkgZm9yIChjb25zdCBrZXkgaW4gbWF0Y2guZ3JvdXBzKSBwYXJhbXNba2V5XSA9IG1hdGNoLmdyb3Vwc1trZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGFyYW1zO1xufVxuXG4vKipcbiogQWRkIGEgcm91dGUgdG8gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIGFkZFJvdXRlKGN0eCwgbWV0aG9kID0gXCJcIiwgcGF0aCwgZGF0YSkge1xuXHRtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblx0aWYgKHBhdGguY2hhckNvZGVBdCgwKSAhPT0gNDcpIHBhdGggPSBgLyR7cGF0aH1gO1xuXHRjb25zdCBzZWdtZW50cyA9IHNwbGl0UGF0aChwYXRoKTtcblx0bGV0IG5vZGUgPSBjdHgucm9vdDtcblx0bGV0IF91bm5hbWVkUGFyYW1JbmRleCA9IDA7XG5cdGNvbnN0IHBhcmFtc01hcCA9IFtdO1xuXHRjb25zdCBwYXJhbXNSZWdleHAgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcblx0XHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRcdGlmICghbm9kZS53aWxkY2FyZCkgbm9kZS53aWxkY2FyZCA9IHsga2V5OiBcIioqXCIgfTtcblx0XHRcdG5vZGUgPSBub2RlLndpbGRjYXJkO1xuXHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHQtaSxcblx0XHRcdFx0c2VnbWVudC5zcGxpdChcIjpcIilbMV0gfHwgXCJfXCIsXG5cdFx0XHRcdHNlZ21lbnQubGVuZ3RoID09PSAyXG5cdFx0XHRdKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIgfHwgc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRcdGlmICghbm9kZS5wYXJhbSkgbm9kZS5wYXJhbSA9IHsga2V5OiBcIipcIiB9O1xuXHRcdFx0bm9kZSA9IG5vZGUucGFyYW07XG5cdFx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIpIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0YF8ke191bm5hbWVkUGFyYW1JbmRleCsrfWAsXG5cdFx0XHRcdHRydWVcblx0XHRcdF0pO1xuXHRcdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIiwgMSkpIHtcblx0XHRcdFx0Y29uc3QgcmVnZXhwID0gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCk7XG5cdFx0XHRcdHBhcmFtc1JlZ2V4cFtpXSA9IHJlZ2V4cDtcblx0XHRcdFx0bm9kZS5oYXNSZWdleFBhcmFtID0gdHJ1ZTtcblx0XHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHRcdGksXG5cdFx0XHRcdFx0cmVnZXhwLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdF0pO1xuXHRcdFx0fSBlbHNlIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0c2VnbWVudC5zbGljZSgxKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdF0pO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0XHRpZiAoY2hpbGQpIG5vZGUgPSBjaGlsZDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHN0YXRpY05vZGUgPSB7IGtleTogc2VnbWVudCB9O1xuXHRcdFx0aWYgKCFub2RlLnN0YXRpYykgbm9kZS5zdGF0aWMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdFx0XHRub2RlLnN0YXRpY1tzZWdtZW50XSA9IHN0YXRpY05vZGU7XG5cdFx0XHRub2RlID0gc3RhdGljTm9kZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGFzUGFyYW1zID0gcGFyYW1zTWFwLmxlbmd0aCA+IDA7XG5cdGlmICghbm9kZS5tZXRob2RzKSBub2RlLm1ldGhvZHMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdG5vZGUubWV0aG9kc1ttZXRob2RdID8/PSBbXTtcblx0bm9kZS5tZXRob2RzW21ldGhvZF0ucHVzaCh7XG5cdFx0ZGF0YTogZGF0YSB8fCBudWxsLFxuXHRcdHBhcmFtc1JlZ2V4cCxcblx0XHRwYXJhbXNNYXA6IGhhc1BhcmFtcyA/IHBhcmFtc01hcCA6IHZvaWQgMFxuXHR9KTtcblx0aWYgKCFoYXNQYXJhbXMpIGN0eC5zdGF0aWNbcGF0aF0gPSBub2RlO1xufVxuZnVuY3Rpb24gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCkge1xuXHRjb25zdCByZWdleCA9IHNlZ21lbnQucmVwbGFjZSgvOihcXHcrKS9nLCAoXywgaWQpID0+IGAoPzwke2lkfT5bXi9dKylgKS5yZXBsYWNlKC9cXC4vZywgXCJcXFxcLlwiKTtcblx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVnRXhwKGBeJHtyZWdleH0kYCk7XG59XG5cbi8qKlxuKiBGaW5kIGEgcm91dGUgYnkgcGF0aC5cbiovXG5mdW5jdGlvbiBmaW5kUm91dGUoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc3RhdGljTm9kZSA9IGN0eC5zdGF0aWNbcGF0aF07XG5cdGlmIChzdGF0aWNOb2RlICYmIHN0YXRpY05vZGUubWV0aG9kcykge1xuXHRcdGNvbnN0IHN0YXRpY01hdGNoID0gc3RhdGljTm9kZS5tZXRob2RzW21ldGhvZF0gfHwgc3RhdGljTm9kZS5tZXRob2RzW1wiXCJdO1xuXHRcdGlmIChzdGF0aWNNYXRjaCAhPT0gdm9pZCAwKSByZXR1cm4gc3RhdGljTWF0Y2hbMF07XG5cdH1cblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBjdHgucm9vdCwgbWV0aG9kLCBzZWdtZW50cywgMCk/LlswXTtcblx0aWYgKG1hdGNoID09PSB2b2lkIDApIHJldHVybjtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaDtcblx0cmV0dXJuIHtcblx0XHRkYXRhOiBtYXRjaC5kYXRhLFxuXHRcdHBhcmFtczogbWF0Y2gucGFyYW1zTWFwID8gZ2V0TWF0Y2hQYXJhbXMoc2VnbWVudHMsIG1hdGNoLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0fTtcbn1cbmZ1bmN0aW9uIF9sb29rdXBUcmVlKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0XHRpZiAobm9kZS5wYXJhbSAmJiBub2RlLnBhcmFtLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS5wYXJhbS5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS5wYXJhbS5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS53aWxkY2FyZC5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS53aWxkY2FyZC5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKG5vZGUuc3RhdGljKSB7XG5cdFx0Y29uc3Qgc3RhdGljQ2hpbGQgPSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRpZiAoc3RhdGljQ2hpbGQpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBzdGF0aWNDaGlsZCwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0fVxuXHRpZiAobm9kZS5wYXJhbSkge1xuXHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBub2RlLnBhcmFtLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0aWYgKG5vZGUucGFyYW0uaGFzUmVnZXhQYXJhbSkge1xuXHRcdFx0XHRjb25zdCBleGFjdE1hdGNoID0gbWF0Y2guZmluZCgobSkgPT4gbS5wYXJhbXNSZWdleHBbaW5kZXhdPy50ZXN0KHNlZ21lbnQpKSB8fCBtYXRjaC5maW5kKChtKSA9PiAhbS5wYXJhbXNSZWdleHBbaW5kZXhdKTtcblx0XHRcdFx0cmV0dXJuIGV4YWN0TWF0Y2ggPyBbZXhhY3RNYXRjaF0gOiB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fVxuXHR9XG5cdGlmIChub2RlLndpbGRjYXJkICYmIG5vZGUud2lsZGNhcmQubWV0aG9kcykgcmV0dXJuIG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcbn1cblxuLyoqXG4qIFJlbW92ZSBhIHJvdXRlIGZyb20gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIHJlbW92ZVJvdXRlKGN0eCwgbWV0aG9kLCBwYXRoKSB7XG5cdGNvbnN0IHNlZ21lbnRzID0gc3BsaXRQYXRoKHBhdGgpO1xuXHRyZXR1cm4gX3JlbW92ZShjdHgucm9vdCwgbWV0aG9kIHx8IFwiXCIsIHNlZ21lbnRzLCAwKTtcbn1cbmZ1bmN0aW9uIF9yZW1vdmUobm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzICYmIG1ldGhvZCBpbiBub2RlLm1ldGhvZHMpIHtcblx0XHRcdGRlbGV0ZSBub2RlLm1ldGhvZHNbbWV0aG9kXTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLm1ldGhvZHMpLmxlbmd0aCA9PT0gMCkgbm9kZS5tZXRob2RzID0gdm9pZCAwO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQgPT09IFwiKlwiKSB7XG5cdFx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRcdF9yZW1vdmUobm9kZS5wYXJhbSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChfaXNFbXB0eU5vZGUobm9kZS5wYXJhbSkpIG5vZGUucGFyYW0gPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRpZiAobm9kZS53aWxkY2FyZCkge1xuXHRcdFx0X3JlbW92ZShub2RlLndpbGRjYXJkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdFx0aWYgKF9pc0VtcHR5Tm9kZShub2RlLndpbGRjYXJkKSkgbm9kZS53aWxkY2FyZCA9IHZvaWQgMDtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IGNoaWxkTm9kZSA9IG5vZGUuc3RhdGljPy5bc2VnbWVudF07XG5cdGlmIChjaGlsZE5vZGUpIHtcblx0XHRfcmVtb3ZlKGNoaWxkTm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRpZiAoX2lzRW1wdHlOb2RlKGNoaWxkTm9kZSkpIHtcblx0XHRcdGRlbGV0ZSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLnN0YXRpYykubGVuZ3RoID09PSAwKSBub2RlLnN0YXRpYyA9IHZvaWQgMDtcblx0XHR9XG5cdH1cbn1cbmZ1bmN0aW9uIF9pc0VtcHR5Tm9kZShub2RlKSB7XG5cdHJldHVybiBub2RlLm1ldGhvZHMgPT09IHZvaWQgMCAmJiBub2RlLnN0YXRpYyA9PT0gdm9pZCAwICYmIG5vZGUucGFyYW0gPT09IHZvaWQgMCAmJiBub2RlLndpbGRjYXJkID09PSB2b2lkIDA7XG59XG5cbi8qKlxuKiBGaW5kIGFsbCByb3V0ZSBwYXR0ZXJucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXRoLlxuKi9cbmZ1bmN0aW9uIGZpbmRBbGxSb3V0ZXMoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoZXMgPSBfZmluZEFsbChjdHgsIGN0eC5yb290LCBtZXRob2QsIHNlZ21lbnRzLCAwKTtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaGVzO1xuXHRyZXR1cm4gbWF0Y2hlcy5tYXAoKG0pID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGF0YTogbS5kYXRhLFxuXHRcdFx0cGFyYW1zOiBtLnBhcmFtc01hcCA/IGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBtLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0XHR9O1xuXHR9KTtcbn1cbmZ1bmN0aW9uIF9maW5kQWxsKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgsIG1hdGNoZXMgPSBbXSkge1xuXHRjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaW5kZXhdO1xuXHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRfZmluZEFsbChjdHgsIG5vZGUucGFyYW0sIG1ldGhvZCwgc2VnbWVudHMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7XG5cdFx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggJiYgbm9kZS5wYXJhbS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUucGFyYW0ubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUucGFyYW0ubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRjb25zdCBwTWFwID0gbWF0Y2hbMF0ucGFyYW1zTWFwO1xuXHRcdFx0XHRpZiAocE1hcD8uW3BNYXA/Lmxlbmd0aCAtIDFdPy5bMl0pIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0YXRpY0NoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0aWYgKHN0YXRpY0NoaWxkKSBfZmluZEFsbChjdHgsIHN0YXRpY0NoaWxkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEsIG1hdGNoZXMpO1xuXHRpZiAoaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAmJiBub2RlLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZXM7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVG9SZWdFeHAocm91dGUgPSBcIi9cIikge1xuXHRjb25zdCByZVNlZ21lbnRzID0gW107XG5cdGxldCBpZEN0ciA9IDA7XG5cdGZvciAoY29uc3Qgc2VnbWVudCBvZiByb3V0ZS5zcGxpdChcIi9cIikpIHtcblx0XHRpZiAoIXNlZ21lbnQpIGNvbnRpbnVlO1xuXHRcdGlmIChzZWdtZW50ID09PSBcIipcIikgcmVTZWdtZW50cy5wdXNoKGAoPzxfJHtpZEN0cisrfT5bXi9dKilgKTtcblx0XHRlbHNlIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqKlwiKSkgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQgPT09IFwiKipcIiA/IFwiPyg/PF8+LiopXCIgOiBgPyg/PCR7c2VnbWVudC5zbGljZSgzKX0+LispYCk7XG5cdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHJlU2VnbWVudHMucHVzaChzZWdtZW50LnJlcGxhY2UoLzooXFx3KykvZywgKF8sIGlkKSA9PiBgKD88JHtpZH0+W14vXSspYCkucmVwbGFjZSgvXFwuL2csIFwiXFxcXC5cIikpO1xuXHRcdGVsc2UgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHR9XG5cdHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IFJlZ0V4cChgXi8ke3JlU2VnbWVudHMuam9pbihcIi9cIil9Lz8kYCk7XG59XG5cbmV4cG9ydCB7IE51bGxQcm90b09iaiwgYWRkUm91dGUsIGNyZWF0ZVJvdXRlciwgZmluZEFsbFJvdXRlcywgZmluZFJvdXRlLCByZW1vdmVSb3V0ZSwgcm91dGVUb1JlZ0V4cCB9OyIsImltcG9ydCB7IHN0YW5kYXJkaXplSFRUUFBhdGgsIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyLCBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIsIFN0YW5kYXJkT3BlbkFQSVNlcmlhbGl6ZXIgfSBmcm9tICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgeyBTdGFuZGFyZEhhbmRsZXIgfSBmcm9tICdAb3JwYy9zZXJ2ZXIvc3RhbmRhcmQnO1xuaW1wb3J0IHsgaXNPUlBDRXJyb3JTdGF0dXMgfSBmcm9tICdAb3JwYy9jbGllbnQnO1xuaW1wb3J0IHsgZmFsbGJhY2tDb250cmFjdENvbmZpZyB9IGZyb20gJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCB7IGlzT2JqZWN0LCBzdHJpbmdpZnlKU09OLCB0cnlEZWNvZGVVUklDb21wb25lbnQsIHZhbHVlIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IHRvSHR0cFBhdGggfSBmcm9tICdAb3JwYy9jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgdHJhdmVyc2VDb250cmFjdFByb2NlZHVyZXMsIGlzUHJvY2VkdXJlLCBnZXRMYXp5TWV0YSwgdW5sYXp5LCBnZXRSb3V0ZXIsIGNyZWF0ZUNvbnRyYWN0ZWRQcm9jZWR1cmUgfSBmcm9tICdAb3JwYy9zZXJ2ZXInO1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBhZGRSb3V0ZSwgZmluZFJvdXRlIH0gZnJvbSAncm91Myc7XG5cbmNsYXNzIFN0YW5kYXJkT3BlbkFQSUNvZGVjIHtcbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5zZXJpYWxpemVyID0gc2VyaWFsaXplcjtcbiAgICB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlciA9IG9wdGlvbnMuY3VzdG9tRXJyb3JSZXNwb25zZUJvZHlFbmNvZGVyO1xuICB9XG4gIGN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlcjtcbiAgYXN5bmMgZGVjb2RlKHJlcXVlc3QsIHBhcmFtcywgcHJvY2VkdXJlKSB7XG4gICAgY29uc3QgaW5wdXRTdHJ1Y3R1cmUgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdElucHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLmlucHV0U3RydWN0dXJlKTtcbiAgICBpZiAoaW5wdXRTdHJ1Y3R1cmUgPT09IFwiY29tcGFjdFwiKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIgPyB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVxdWVzdC51cmwuc2VhcmNoUGFyYW1zKSA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhd2FpdCByZXF1ZXN0LmJvZHkoKSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgLi4uZGF0YVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGRlc2VyaWFsaXplU2VhcmNoUGFyYW1zID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXF1ZXN0LnVybC5zZWFyY2hQYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtcyxcbiAgICAgIGdldCBxdWVyeSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNlcmlhbGl6ZVNlYXJjaFBhcmFtcygpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCBxdWVyeSh2YWx1ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgIH0sXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXdhaXQgcmVxdWVzdC5ib2R5KCkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGUob3V0cHV0LCBwcm9jZWR1cmUpIHtcbiAgICBjb25zdCBzdWNjZXNzU3RhdHVzID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRTdWNjZXNzU3RhdHVzXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLnN1Y2Nlc3NTdGF0dXMpO1xuICAgIGNvbnN0IG91dHB1dFN0cnVjdHVyZSA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0T3V0cHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLm91dHB1dFN0cnVjdHVyZSk7XG4gICAgaWYgKG91dHB1dFN0cnVjdHVyZSA9PT0gXCJjb21wYWN0XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogc3VjY2Vzc1N0YXR1cyxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0KVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0RldGFpbGVkT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgIEludmFsaWQgXCJkZXRhaWxlZFwiIG91dHB1dCBzdHJ1Y3R1cmU6XG4gICAgICAgIFxcdTIwMjIgRXhwZWN0ZWQgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgcHJvcGVydGllczpcbiAgICAgICAgICAtIHN0YXR1cyAobnVtYmVyIDIwMC0zOTkpXG4gICAgICAgICAgLSBoZWFkZXJzIChSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4pXG4gICAgICAgICAgLSBib2R5IChhbnkpXG4gICAgICAgIFxcdTIwMjIgTm8gZXh0cmEga2V5cyBhbGxvd2VkLlxuXG4gICAgICAgIEFjdHVhbCB2YWx1ZTpcbiAgICAgICAgICAke3N0cmluZ2lmeUpTT04ob3V0cHV0KX1cbiAgICAgIGApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBvdXRwdXQuc3RhdHVzID8/IHN1Y2Nlc3NTdGF0dXMsXG4gICAgICBoZWFkZXJzOiBvdXRwdXQuaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0LmJvZHkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGVFcnJvcihlcnJvcikge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2Rlcj8uKGVycm9yKSA/PyBlcnJvci50b0pTT04oKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvci5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KVxuICAgIH07XG4gIH1cbiAgI2lzRGV0YWlsZWRPdXRwdXQob3V0cHV0KSB7XG4gICAgaWYgKCFpc09iamVjdChvdXRwdXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaGVhZGVycyAmJiAhaXNPYmplY3Qob3V0cHV0LmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3RhdHVzICE9PSB2b2lkIDAgJiYgKHR5cGVvZiBvdXRwdXQuc3RhdHVzICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG91dHB1dC5zdGF0dXMpIHx8IGlzT1JQQ0Vycm9yU3RhdHVzKG91dHB1dC5zdGF0dXMpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1JvdTNQYXR0ZXJuKHBhdGgpIHtcbiAgcmV0dXJuIHN0YW5kYXJkaXplSFRUUFBhdGgocGF0aCkucmVwbGFjZSgvXFwvXFx7XFwrKFtefV0rKVxcfS9nLCBcIi8qKjokMVwiKS5yZXBsYWNlKC9cXC9cXHsoW159XSspXFx9L2csIFwiLzokMVwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVBhcmFtcyhwYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpXSkpO1xufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIHtcbiAgZmlsdGVyO1xuICB0cmVlID0gY3JlYXRlUm91dGVyKCk7XG4gIHBlbmRpbmdSb3V0ZXJzID0gW107XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIgPz8gdHJ1ZTtcbiAgfVxuICBpbml0KHJvdXRlciwgcGF0aCA9IFtdKSB7XG4gICAgY29uc3QgbGF6aWVkT3B0aW9ucyA9IHRyYXZlcnNlQ29udHJhY3RQcm9jZWR1cmVzKHsgcm91dGVyLCBwYXRoIH0sICh0cmF2ZXJzZU9wdGlvbnMpID0+IHtcbiAgICAgIGlmICghdmFsdWUodGhpcy5maWx0ZXIsIHRyYXZlcnNlT3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXRoOiBwYXRoMiwgY29udHJhY3QgfSA9IHRyYXZlcnNlT3B0aW9ucztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0TWV0aG9kXCIsIGNvbnRyYWN0W1wifm9ycGNcIl0ucm91dGUubWV0aG9kKTtcbiAgICAgIGNvbnN0IGh0dHBQYXRoID0gdG9Sb3UzUGF0dGVybihjb250cmFjdFtcIn5vcnBjXCJdLnJvdXRlLnBhdGggPz8gdG9IdHRwUGF0aChwYXRoMikpO1xuICAgICAgaWYgKGlzUHJvY2VkdXJlKGNvbnRyYWN0KSkge1xuICAgICAgICBhZGRSb3V0ZSh0aGlzLnRyZWUsIG1ldGhvZCwgaHR0cFBhdGgsIHtcbiAgICAgICAgICBwYXRoOiBwYXRoMixcbiAgICAgICAgICBjb250cmFjdCxcbiAgICAgICAgICBwcm9jZWR1cmU6IGNvbnRyYWN0LFxuICAgICAgICAgIC8vIHRoaXMgbWVhbiBkZXYgbm90IHVzZWQgY29udHJhY3QtZmlyc3Qgc28gd2UgY2FuIHVzZWQgY29udHJhY3QgYXMgcHJvY2VkdXJlIGRpcmVjdGx5XG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUm91dGUodGhpcy50cmVlLCBtZXRob2QsIGh0dHBQYXRoLCB7XG4gICAgICAgICAgcGF0aDogcGF0aDIsXG4gICAgICAgICAgY29udHJhY3QsXG4gICAgICAgICAgcHJvY2VkdXJlOiB2b2lkIDAsXG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JvdXRlcnMucHVzaCguLi5sYXppZWRPcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgaHR0cFBhdGhQcmVmaXg6IHRvSHR0cFBhdGgob3B0aW9uLnBhdGgpLFxuICAgICAgbGF6aWVkUHJlZml4OiBnZXRMYXp5TWV0YShvcHRpb24ucm91dGVyKS5wcmVmaXhcbiAgICB9KSkpO1xuICB9XG4gIGFzeW5jIG1hdGNoKG1ldGhvZCwgcGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUm91dGVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5ld1BlbmRpbmdSb3V0ZXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBlbmRpbmdSb3V0ZXIgb2YgdGhpcy5wZW5kaW5nUm91dGVycykge1xuICAgICAgICBpZiAoIXBlbmRpbmdSb3V0ZXIubGF6aWVkUHJlZml4IHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5sYXppZWRQcmVmaXgpIHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5odHRwUGF0aFByZWZpeCkpIHtcbiAgICAgICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlciB9ID0gYXdhaXQgdW5sYXp5KHBlbmRpbmdSb3V0ZXIucm91dGVyKTtcbiAgICAgICAgICB0aGlzLmluaXQocm91dGVyLCBwZW5kaW5nUm91dGVyLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1BlbmRpbmdSb3V0ZXJzLnB1c2gocGVuZGluZ1JvdXRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ1JvdXRlcnMgPSBuZXdQZW5kaW5nUm91dGVycztcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBmaW5kUm91dGUodGhpcy50cmVlLCBtZXRob2QsIHBhdGhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoLmRhdGEucHJvY2VkdXJlKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IG1heWJlUHJvY2VkdXJlIH0gPSBhd2FpdCB1bmxhenkoZ2V0Um91dGVyKG1hdGNoLmRhdGEucm91dGVyLCBtYXRjaC5kYXRhLnBhdGgpKTtcbiAgICAgIGlmICghaXNQcm9jZWR1cmUobWF5YmVQcm9jZWR1cmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgICAgW0NvbnRyYWN0LUZpcnN0XSBNaXNzaW5nIG9yIGludmFsaWQgaW1wbGVtZW50YXRpb24gZm9yIHByb2NlZHVyZSBhdCBwYXRoOiAke3RvSHR0cFBhdGgobWF0Y2guZGF0YS5wYXRoKX0uXG4gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHByb2NlZHVyZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCBhbmQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgY29udHJhY3QuXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgICAgbWF0Y2guZGF0YS5wcm9jZWR1cmUgPSBjcmVhdGVDb250cmFjdGVkUHJvY2VkdXJlKG1heWJlUHJvY2VkdXJlLCBtYXRjaC5kYXRhLmNvbnRyYWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IG1hdGNoLmRhdGEucGF0aCxcbiAgICAgIHByb2NlZHVyZTogbWF0Y2guZGF0YS5wcm9jZWR1cmUsXG4gICAgICBwYXJhbXM6IG1hdGNoLnBhcmFtcyA/IGRlY29kZVBhcmFtcyhtYXRjaC5wYXJhbXMpIDogdm9pZCAwXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgU3RhbmRhcmRIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QganNvblNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRPcGVuQVBJSnNvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3QgYnJhY2tldE5vdGF0aW9uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBtYXRjaGVyID0gbmV3IFN0YW5kYXJkT3BlbkFQSU1hdGNoZXIob3B0aW9ucyk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgU3RhbmRhcmRPcGVuQVBJQ29kZWMoc2VyaWFsaXplciwgb3B0aW9ucyk7XG4gICAgc3VwZXIocm91dGVyLCBtYXRjaGVyLCBjb2RlYywgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RhbmRhcmRPcGVuQVBJQ29kZWMgYXMgUywgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciBhcyBhLCBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIGFzIGIsIGRlY29kZVBhcmFtcyBhcyBkLCB0b1JvdTNQYXR0ZXJuIGFzIHQgfTtcbiIsImltcG9ydCB7IEZldGNoSGFuZGxlciB9IGZyb20gJ0BvcnBjL3NlcnZlci9mZXRjaCc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudCc7XG5pbXBvcnQgJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IGEgYXMgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9vcGVuYXBpLkRJdC1aOVcxLm1qcyc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlcic7XG5pbXBvcnQgJ3JvdTMnO1xuaW1wb3J0ICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlci9zdGFuZGFyZCc7XG5cbmNsYXNzIE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgRmV0Y2hIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihuZXcgU3RhbmRhcmRPcGVuQVBJSGFuZGxlcihyb3V0ZXIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgeyBPcGVuQVBJSGFuZGxlciB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FB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
|