@spinajs/http 2.0.486 → 2.0.488

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 (74) hide show
  1. package/README.md +370 -5
  2. package/lib/cjs/base-controller.d.ts +35 -0
  3. package/lib/cjs/base-controller.d.ts.map +1 -0
  4. package/lib/cjs/base-controller.js +100 -0
  5. package/lib/cjs/base-controller.js.map +1 -0
  6. package/lib/cjs/cache.d.ts +25 -3
  7. package/lib/cjs/cache.d.ts.map +1 -1
  8. package/lib/cjs/cache.js +26 -9
  9. package/lib/cjs/cache.js.map +1 -1
  10. package/lib/cjs/cli/GenerateControllerCache.d.ts +13 -4
  11. package/lib/cjs/cli/GenerateControllerCache.d.ts.map +1 -1
  12. package/lib/cjs/cli/GenerateControllerCache.js +37 -10
  13. package/lib/cjs/cli/GenerateControllerCache.js.map +1 -1
  14. package/lib/cjs/controller-sources.d.ts +36 -0
  15. package/lib/cjs/controller-sources.d.ts.map +1 -0
  16. package/lib/cjs/controller-sources.js +73 -0
  17. package/lib/cjs/controller-sources.js.map +1 -0
  18. package/lib/cjs/controllers.d.ts +19 -36
  19. package/lib/cjs/controllers.d.ts.map +1 -1
  20. package/lib/cjs/controllers.js +98 -302
  21. package/lib/cjs/controllers.js.map +1 -1
  22. package/lib/cjs/exceptions.d.ts +12 -0
  23. package/lib/cjs/exceptions.d.ts.map +1 -1
  24. package/lib/cjs/exceptions.js +15 -1
  25. package/lib/cjs/exceptions.js.map +1 -1
  26. package/lib/cjs/index.d.ts +4 -0
  27. package/lib/cjs/index.d.ts.map +1 -1
  28. package/lib/cjs/index.js +4 -0
  29. package/lib/cjs/index.js.map +1 -1
  30. package/lib/cjs/middlewares/RequestId.d.ts.map +1 -1
  31. package/lib/cjs/middlewares/RequestId.js +4 -0
  32. package/lib/cjs/middlewares/RequestId.js.map +1 -1
  33. package/lib/cjs/route-builder.d.ts +61 -0
  34. package/lib/cjs/route-builder.d.ts.map +1 -0
  35. package/lib/cjs/route-builder.js +228 -0
  36. package/lib/cjs/route-builder.js.map +1 -0
  37. package/lib/mjs/base-controller.d.ts +35 -0
  38. package/lib/mjs/base-controller.d.ts.map +1 -0
  39. package/lib/mjs/base-controller.js +93 -0
  40. package/lib/mjs/base-controller.js.map +1 -0
  41. package/lib/mjs/cache.d.ts +25 -3
  42. package/lib/mjs/cache.d.ts.map +1 -1
  43. package/lib/mjs/cache.js +25 -10
  44. package/lib/mjs/cache.js.map +1 -1
  45. package/lib/mjs/cli/GenerateControllerCache.d.ts +13 -4
  46. package/lib/mjs/cli/GenerateControllerCache.d.ts.map +1 -1
  47. package/lib/mjs/cli/GenerateControllerCache.js +39 -12
  48. package/lib/mjs/cli/GenerateControllerCache.js.map +1 -1
  49. package/lib/mjs/controller-sources.d.ts +36 -0
  50. package/lib/mjs/controller-sources.d.ts.map +1 -0
  51. package/lib/mjs/controller-sources.js +69 -0
  52. package/lib/mjs/controller-sources.js.map +1 -0
  53. package/lib/mjs/controllers.d.ts +19 -36
  54. package/lib/mjs/controllers.d.ts.map +1 -1
  55. package/lib/mjs/controllers.js +95 -298
  56. package/lib/mjs/controllers.js.map +1 -1
  57. package/lib/mjs/exceptions.d.ts +12 -0
  58. package/lib/mjs/exceptions.d.ts.map +1 -1
  59. package/lib/mjs/exceptions.js +12 -0
  60. package/lib/mjs/exceptions.js.map +1 -1
  61. package/lib/mjs/index.d.ts +4 -0
  62. package/lib/mjs/index.d.ts.map +1 -1
  63. package/lib/mjs/index.js +4 -0
  64. package/lib/mjs/index.js.map +1 -1
  65. package/lib/mjs/middlewares/RequestId.d.ts.map +1 -1
  66. package/lib/mjs/middlewares/RequestId.js +4 -0
  67. package/lib/mjs/middlewares/RequestId.js.map +1 -1
  68. package/lib/mjs/route-builder.d.ts +61 -0
  69. package/lib/mjs/route-builder.d.ts.map +1 -0
  70. package/lib/mjs/route-builder.js +216 -0
  71. package/lib/mjs/route-builder.js.map +1 -0
  72. package/lib/tsconfig.cjs.tsbuildinfo +1 -1
  73. package/lib/tsconfig.mjs.tsbuildinfo +1 -1
  74. package/package.json +11 -11
@@ -0,0 +1,61 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import Express from 'express';
3
+ import { IContainer } from '@spinajs/di';
4
+ import { Log } from '@spinajs/log';
5
+ import { Configuration } from '@spinajs/configuration';
6
+ import { Request as sRequest, IController, IControllerDescriptor, RouteMiddleware, IRoute, BasePolicy, IActionLocalStoregeContext } from './interfaces.js';
7
+ /**
8
+ * Controller shape needed by the route wiring helpers: the IController
9
+ * surface plus indexed access to action methods. Structural on purpose —
10
+ * avoids importing BaseController and creating a module cycle.
11
+ */
12
+ export type ControllerActionHost = IController & {
13
+ [action: string]: any;
14
+ };
15
+ /**
16
+ * Computes the final express path for a route: `/BasePath/Path`, falling back
17
+ * to the method name when the route has no explicit path, with optional
18
+ * global route prefix (`http.controllers.route.prefix`).
19
+ */
20
+ export declare function buildRoutePath(basePath: string, route: IRoute, globalPrefix?: string): string;
21
+ /**
22
+ * Resolves controller-wise + route-wise middleware descriptors into instances.
23
+ */
24
+ export declare function resolveRouteMiddlewares(descriptor: IControllerDescriptor, route: IRoute, container: IContainer): Promise<RouteMiddleware[]>;
25
+ /**
26
+ * Resolves controller-wise + route-wise policy descriptors into instances.
27
+ *
28
+ * String policy descriptors are configuration keys pointing at a policy type
29
+ * name. A key that does not resolve to a registered BasePolicy type throws
30
+ * {@link RouteRegistrationException} — a silently dropped policy would leave
31
+ * the route unprotected.
32
+ */
33
+ export declare function resolveRoutePolicies(descriptor: IControllerDescriptor, route: IRoute, container: IContainer, cfg: Configuration, log: Log, controllerName: string, path: string): Promise<BasePolicy[]>;
34
+ /**
35
+ * Express handler gating a route behind its policies.
36
+ *
37
+ * Executes all policies enabled for the route; if at least ONE policy resolves
38
+ * without error the route is allowed to execute. This allows multiple access
39
+ * paths to a resource, e.g. token access & session.
40
+ */
41
+ export declare function createPolicyGate(policies: BasePolicy[], route: IRoute, controller: IController, log: Log): Express.RequestHandler;
42
+ /**
43
+ * Wraps a middleware onBefore/onAfter action into an express handler that
44
+ * forwards both resolution and rejection to `next`.
45
+ */
46
+ export declare function wrapMiddlewareAction(source: object, action: (req: Express.Request, res: Express.Response, route: IRoute, controller: IController) => Promise<void>, route: IRoute, controller: IController): Express.RequestHandler;
47
+ /**
48
+ * Express handler invoking the controller action: extracts route arguments,
49
+ * runs the action inside the request-scoped AsyncLocalStorage context, lets
50
+ * middlewares inspect the produced Response and stores it in
51
+ * `res.locals.response` for the response pipeline. All sync and async errors
52
+ * are forwarded to `next`.
53
+ */
54
+ export declare function createActionHandler(controller: ControllerActionHost, route: IRoute, enabledMiddlewares: RouteMiddleware[], storage: AsyncLocalStorage<IActionLocalStoregeContext>): Express.RequestHandler;
55
+ /**
56
+ * Extracts route argument values for an action call. Route-arg handlers are
57
+ * resolved from DI by parameter type and executed in Priority order
58
+ * (higher first).
59
+ */
60
+ export declare function extractRouteArgs(route: IRoute, req: sRequest, res: Express.Response, controllerName: string): Promise<any[]>;
61
+ //# sourceMappingURL=route-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-builder.d.ts","sourceRoot":"","sources":["../../src/route-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAM,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAY,WAAW,EAAE,qBAAqB,EAAqB,eAAe,EAAE,MAAM,EAAyB,UAAU,EAAiB,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG9N;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAM3I;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,EACrB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAiDjI;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9G,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,cAAc,CAgBxB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,oBAAoB,EAChC,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,eAAe,EAAE,EACrC,OAAO,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,GACrD,OAAO,CAAC,cAAc,CA2CxB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAkClI"}
@@ -0,0 +1,216 @@
1
+ import { isPromise, tryGetHash } from '@spinajs/util';
2
+ import _ from 'lodash';
3
+ import { DI } from '@spinajs/di';
4
+ import { UnexpectedServerError } from '@spinajs/exceptions';
5
+ import { Response, BasePolicy } from './interfaces.js';
6
+ import { RouteRegistrationException } from './exceptions.js';
7
+ /**
8
+ * Computes the final express path for a route: `/BasePath/Path`, falling back
9
+ * to the method name when the route has no explicit path, with optional
10
+ * global route prefix (`http.controllers.route.prefix`).
11
+ */
12
+ export function buildRoutePath(basePath, route, globalPrefix) {
13
+ let path = '';
14
+ if (route.Path) {
15
+ if (route.Path === '/') {
16
+ path = `/${basePath}`;
17
+ }
18
+ else if (basePath === '/') {
19
+ path = `/${route.Path}`;
20
+ }
21
+ else {
22
+ path = `/${basePath}/${route.Path}`;
23
+ }
24
+ }
25
+ else {
26
+ path = `/${basePath}/${String(route.Method)}`;
27
+ }
28
+ if (globalPrefix) {
29
+ path = `/${globalPrefix}${path}`;
30
+ }
31
+ return path;
32
+ }
33
+ /**
34
+ * Resolves controller-wise + route-wise middleware descriptors into instances.
35
+ */
36
+ export function resolveRouteMiddlewares(descriptor, route, container) {
37
+ return Promise.all(descriptor.Middlewares.concat(route.Middlewares || []).map((m) => {
38
+ return container.resolve(m.Type, m.Options);
39
+ }));
40
+ }
41
+ /**
42
+ * Resolves controller-wise + route-wise policy descriptors into instances.
43
+ *
44
+ * String policy descriptors are configuration keys pointing at a policy type
45
+ * name. A key that does not resolve to a registered BasePolicy type throws
46
+ * {@link RouteRegistrationException} — a silently dropped policy would leave
47
+ * the route unprotected.
48
+ */
49
+ export function resolveRoutePolicies(descriptor, route, container, cfg, log, controllerName, path) {
50
+ return Promise.all(descriptor.Policies.concat(route.Policies || []).map((m) => {
51
+ if (_.isString(m.Type)) {
52
+ const policyType = cfg.get(m.Type);
53
+ if (!policyType || !DI.checkType(BasePolicy, policyType)) {
54
+ throw new RouteRegistrationException(`No policy named ${policyType ?? '<undefined>'} is registered for route ${controllerName}::${String(route.Method)} at path ${path} ( check your configuration at ${m.Type} )`);
55
+ }
56
+ log.trace(`Policy ${policyType} is used in controller ${controllerName}::${String(route.Method)} at path ${path}`);
57
+ return container.resolve(policyType, m.Options);
58
+ }
59
+ log.trace(`Policy ${m.Type.name} is used in controller ${controllerName}::${String(route.Method)} at path ${path}`);
60
+ return container.resolve(m.Type, m.Options);
61
+ }));
62
+ }
63
+ /**
64
+ * Express handler gating a route behind its policies.
65
+ *
66
+ * Executes all policies enabled for the route; if at least ONE policy resolves
67
+ * without error the route is allowed to execute. This allows multiple access
68
+ * paths to a resource, e.g. token access & session.
69
+ */
70
+ export function createPolicyGate(policies, route, controller, log) {
71
+ const routeName = `${controller.constructor.name}:${String(route.Method)} ${controller.BasePath}/${String(route.Path || route.Method)}`;
72
+ return (req, _res, next) => {
73
+ // Only policies enabled for this concrete route participate in the gate.
74
+ // A route whose policies are ALL disabled has no active authorization
75
+ // check, so it is allowed through — same semantics as having no policies
76
+ // at all. Computing this up front is what prevents the request from
77
+ // hanging: `Promise.allSettled([])` resolves to `[]`, which matches
78
+ // neither the fulfilled nor the rejected branch below, so `next` would
79
+ // never be called.
80
+ const enabledPolicies = policies.filter((p) => p.isEnabled(route, controller));
81
+ if (enabledPolicies.length === 0) {
82
+ next();
83
+ return;
84
+ }
85
+ Promise.allSettled(enabledPolicies.map((p) => {
86
+ return p
87
+ .execute(req, route, controller)
88
+ .then(() => {
89
+ log.trace(`Policy succeded for route ${routeName}, policy: ${p.constructor.name}`);
90
+ })
91
+ .catch((err) => {
92
+ log.trace(`Policy failed for route ${routeName} error ${err}, policy: ${p.constructor.name}`);
93
+ throw err;
94
+ });
95
+ }))
96
+ .then((results) => {
97
+ const fullfilled = results.find((r) => r.status === 'fulfilled');
98
+ if (fullfilled) {
99
+ log.trace(`Policy for route ${routeName} succeded, continue execution`);
100
+ next();
101
+ return;
102
+ }
103
+ // Every policy rejected — forward the first failure to the express
104
+ // error handler. Use next(err) directly (not `throw next(...)`,
105
+ // which would reject this .then() with `undefined` as an unhandled
106
+ // rejection while the error was already forwarded).
107
+ const failed = results.find((r) => r.status === 'rejected');
108
+ next(failed ? failed.reason : new UnexpectedServerError('Policy evaluation produced no result'));
109
+ })
110
+ // Guard against unexpected throws in the settle/handler chain so the
111
+ // request can never stall without a response.
112
+ .catch((err) => next(err));
113
+ };
114
+ }
115
+ /**
116
+ * Wraps a middleware onBefore/onAfter action into an express handler that
117
+ * forwards both resolution and rejection to `next`.
118
+ */
119
+ export function wrapMiddlewareAction(source, action, route, controller) {
120
+ const wrapper = (req, res, next) => {
121
+ action(req, res, route, controller)
122
+ .then(() => {
123
+ next();
124
+ })
125
+ .catch((err) => {
126
+ next(err);
127
+ });
128
+ };
129
+ Object.defineProperty(wrapper, 'name', {
130
+ value: source.constructor.name,
131
+ writable: true,
132
+ });
133
+ return wrapper;
134
+ }
135
+ /**
136
+ * Express handler invoking the controller action: extracts route arguments,
137
+ * runs the action inside the request-scoped AsyncLocalStorage context, lets
138
+ * middlewares inspect the produced Response and stores it in
139
+ * `res.locals.response` for the response pipeline. All sync and async errors
140
+ * are forwarded to `next`.
141
+ */
142
+ export function createActionHandler(controller, route, enabledMiddlewares, storage) {
143
+ const actionHandler = async (req, res, next) => {
144
+ try {
145
+ await storage.run(req.storage, async () => {
146
+ const args = (await extractRouteArgs(route, req, res, controller.constructor.name)).concat([req, res, next]);
147
+ try {
148
+ const result = controller[route.Method].call(controller, ...args);
149
+ if (isPromise(result)) {
150
+ result
151
+ .then((r) => {
152
+ if (r instanceof Response) {
153
+ enabledMiddlewares.forEach((x) => x.onResponse(r, route, controller));
154
+ }
155
+ res.locals.response = r;
156
+ next();
157
+ })
158
+ .catch((err) => {
159
+ next(err);
160
+ });
161
+ }
162
+ else {
163
+ if (result instanceof Response) {
164
+ enabledMiddlewares.forEach((x) => x.onResponse(result, route, controller));
165
+ }
166
+ res.locals.response = result;
167
+ next();
168
+ }
169
+ }
170
+ catch (err) {
171
+ next(err);
172
+ }
173
+ });
174
+ }
175
+ catch (err) {
176
+ next(err);
177
+ }
178
+ };
179
+ Object.defineProperty(actionHandler, 'name', {
180
+ value: controller.constructor.name,
181
+ writable: true,
182
+ });
183
+ return actionHandler;
184
+ }
185
+ /**
186
+ * Extracts route argument values for an action call. Route-arg handlers are
187
+ * resolved from DI by parameter type and executed in Priority order
188
+ * (higher first).
189
+ */
190
+ export async function extractRouteArgs(route, req, res, controllerName) {
191
+ const callArgs = new Array(route.Parameters.size);
192
+ const argsCache = new Map();
193
+ let callData = {
194
+ Payload: {},
195
+ };
196
+ // Sort parameters by priority (higher priority first)
197
+ // Get all parameters as array, resolve their handlers to check priority, then sort
198
+ const paramsWithPriority = await Promise.all(Array.from(route.Parameters.values()).map(async (param) => {
199
+ const handler = await tryGetHash(argsCache, param.Type, () => DI.resolve(param.Type));
200
+ return { param, handler, priority: handler?.Priority ?? 0 };
201
+ }));
202
+ // Sort by priority descending (higher priority first)
203
+ const sortedParams = paramsWithPriority.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
204
+ for (const { param, handler: routeArgsHandler } of sortedParams) {
205
+ if (!routeArgsHandler) {
206
+ throw new UnexpectedServerError(`Route parameter not registered for parameter: ${param.Name},
207
+ in method: ${String(route.Method)},
208
+ in controller: ${controllerName}. Check if you have registered it in DI container.`);
209
+ }
210
+ const { Args, CallData } = await routeArgsHandler.extract(callData, callArgs, param, req, res, route);
211
+ callData = CallData;
212
+ callArgs[param.Index] = Args;
213
+ }
214
+ return callArgs;
215
+ }
216
+ //# sourceMappingURL=route-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-builder.js","sourceRoot":"","sources":["../../src/route-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,EAAE,EAAE,EAAc,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,OAAO,EAAuB,QAAQ,EAAyG,UAAU,EAA6C,MAAM,iBAAiB,CAAC;AAC9N,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAS7D;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,KAAa,EAAE,YAAqB;IACnF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACxB,CAAC;aAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,GAAG,IAAI,YAAY,GAAG,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAiC,EAAE,KAAa,EAAE,SAAqB;IAC7G,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAwB,EAAE,EAAE;QACtF,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAiC,EACjC,KAAa,EACb,SAAqB,EACrB,GAAkB,EAClB,GAAQ,EACR,cAAsB,EACtB,IAAY;IAEZ,OAAO,OAAO,CAAC,GAAG,CAChB,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAoB,EAAE,EAAE;QAC5E,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAS,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,0BAA0B,CAClC,mBAAmB,UAAU,IAAI,aAAa,4BAA4B,cAAc,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,kCAAkC,CAAC,CAAC,IAAI,IAAI,CAC9K,CAAC;YACJ,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,UAAU,UAAU,0BAA0B,cAAc,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;YACnH,OAAO,SAAS,CAAC,OAAO,CAAa,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,0BAA0B,cAAc,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACpH,OAAO,SAAS,CAAC,OAAO,CAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAsB,EAAE,KAAa,EAAE,UAAuB,EAAE,GAAQ;IACvG,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAExI,OAAO,CAAC,GAAoB,EAAE,IAAsB,EAAE,IAA0B,EAAE,EAAE;QAClF,yEAAyE;QACzE,sEAAsE;QACtE,yEAAyE;QACzE,oEAAoE;QACpE,oEAAoE;QACpE,uEAAuE;QACvE,mBAAmB;QACnB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/E,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,OAAO,CAAC,UAAU,CAChB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,OAAO,CAAC;iBACL,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC;iBAC/B,IAAI,CAAC,GAAG,EAAE;gBACT,GAAG,CAAC,KAAK,CAAC,6BAA6B,SAAS,aAAa,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,GAAG,CAAC,KAAK,CAAC,2BAA2B,SAAS,UAAU,GAAG,aAAa,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9F,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CACH;aACE,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;YACjE,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,oBAAoB,SAAS,+BAA+B,CAAC,CAAC;gBACxE,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,mEAAmE;YACnE,gEAAgE;YAChE,mEAAmE;YACnE,oDAAoD;YACpD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAsC,CAAC;YACjG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACnG,CAAC,CAAC;YACF,qEAAqE;YACrE,8CAA8C;aAC7C,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,MAA8G,EAC9G,KAAa,EACb,UAAuB;IAEvB,MAAM,OAAO,GAAG,CAAC,GAAoB,EAAE,GAAqB,EAAE,IAA0B,EAAE,EAAE;QAC1F,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC;aAChC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;YAClB,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;QACrC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;QAC9B,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAgC,EAChC,KAAa,EACb,kBAAqC,EACrC,OAAsD;IAEtD,MAAM,aAAa,GAAG,KAAK,EAAE,GAAa,EAAE,GAAqB,EAAE,IAA0B,EAAE,EAAE;QAC/F,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBACxC,MAAM,IAAI,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBAE7G,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;oBAE5E,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;wBACtB,MAAM;6BACH,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;4BACnB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;gCAC1B,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;4BACxE,CAAC;4BACD,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;4BACxB,IAAI,EAAE,CAAC;wBACT,CAAC,CAAC;6BACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;4BACtB,IAAI,CAAC,GAAG,CAAC,CAAC;wBACZ,CAAC,CAAC,CAAC;oBACP,CAAC;yBAAM,CAAC;wBACN,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;4BAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;wBAC7E,CAAC;wBACD,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;wBAC7B,IAAI,EAAE,CAAC;oBACT,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE;QAC3C,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI;QAClC,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,aAAuC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,GAAa,EAAE,GAAqB,EAAE,cAAsB;IAChH,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqC,CAAC;IAE/D,IAAI,QAAQ,GAAG;QACb,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,sDAAsD;IACtD,mFAAmF;IACnF,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC,CACH,CAAC;IAEF,sDAAsD;IACtD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9F,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,YAAY,EAAE,CAAC;QAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAqB,CAAC,iDAAiD,KAAK,CAAC,IAAI;yBACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;6BAChB,cAAc,oDAAoD,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEtG,QAAQ,GAAG,QAAQ,CAAC;QACpB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}