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