@fluojs/http 1.1.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +430 -15
- package/README.md +437 -15
- package/dist/access-log-observer.d.ts +77 -0
- package/dist/access-log-observer.d.ts.map +1 -0
- package/dist/access-log-observer.js +171 -0
- package/dist/adapter.d.ts +9 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +15 -1
- package/dist/adapters/binding.d.ts.map +1 -1
- package/dist/adapters/binding.js +18 -16
- package/dist/adapters/dto-binding-plan.d.ts +2 -2
- package/dist/adapters/dto-binding-plan.d.ts.map +1 -1
- package/dist/adapters/dto-binding-plan.js +13 -4
- package/dist/adapters/dto-validation-adapter.d.ts +2 -1
- package/dist/adapters/dto-validation-adapter.d.ts.map +1 -1
- package/dist/adapters/dto-validation-adapter.js +2 -2
- package/dist/byte-range-response.d.ts +71 -0
- package/dist/byte-range-response.d.ts.map +1 -0
- package/dist/byte-range-response.js +347 -0
- package/dist/client-identity.d.ts +8 -4
- package/dist/client-identity.d.ts.map +1 -1
- package/dist/client-identity.js +12 -93
- package/dist/compiled-route-identity.d.ts +17 -0
- package/dist/compiled-route-identity.d.ts.map +1 -0
- package/dist/compiled-route-identity.js +29 -0
- package/dist/connection.d.ts +67 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +480 -0
- package/dist/context/request-context-node-store.d.ts +6 -0
- package/dist/context/request-context-node-store.d.ts.map +1 -1
- package/dist/context/request-context-node-store.js +14 -0
- package/dist/context/request-context.d.ts +5 -5
- package/dist/context/request-context.d.ts.map +1 -1
- package/dist/context/request-context.js +8 -83
- package/dist/context/request-id.d.ts +10 -0
- package/dist/context/request-id.d.ts.map +1 -0
- package/dist/context/request-id.js +27 -0
- package/dist/context/sse.d.ts +13 -0
- package/dist/context/sse.d.ts.map +1 -1
- package/dist/context/sse.js +36 -6
- package/dist/cookie-helpers.d.ts +47 -0
- package/dist/cookie-helpers.d.ts.map +1 -0
- package/dist/cookie-helpers.js +166 -0
- package/dist/decorators.d.ts +52 -19
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +57 -10
- package/dist/dispatch/conditional-request-policy.d.ts +67 -0
- package/dist/dispatch/conditional-request-policy.d.ts.map +1 -0
- package/dist/dispatch/conditional-request-policy.js +297 -0
- package/dist/dispatch/dispatch-content-negotiation.d.ts +8 -0
- package/dist/dispatch/dispatch-content-negotiation.d.ts.map +1 -1
- package/dist/dispatch/dispatch-content-negotiation.js +89 -42
- package/dist/dispatch/dispatch-error-negotiation.d.ts +26 -0
- package/dist/dispatch/dispatch-error-negotiation.d.ts.map +1 -0
- package/dist/dispatch/dispatch-error-negotiation.js +110 -0
- package/dist/dispatch/dispatch-error-policy.d.ts +1 -10
- package/dist/dispatch/dispatch-error-policy.d.ts.map +1 -1
- package/dist/dispatch/dispatch-error-policy.js +1 -33
- package/dist/dispatch/dispatch-error-representation.d.ts +18 -0
- package/dist/dispatch/dispatch-error-representation.d.ts.map +1 -0
- package/dist/dispatch/dispatch-error-representation.js +125 -0
- package/dist/dispatch/dispatch-response-metadata.d.ts +10 -0
- package/dist/dispatch/dispatch-response-metadata.d.ts.map +1 -0
- package/dist/dispatch/dispatch-response-metadata.js +12 -0
- package/dist/dispatch/dispatch-response-policy.d.ts +33 -5
- package/dist/dispatch/dispatch-response-policy.d.ts.map +1 -1
- package/dist/dispatch/dispatch-response-policy.js +149 -18
- package/dist/dispatch/dispatcher.d.ts +5 -1
- package/dist/dispatch/dispatcher.d.ts.map +1 -1
- package/dist/dispatch/dispatcher.js +178 -107
- package/dist/dispatch/fast-path/debug-visibility.d.ts.map +1 -1
- package/dist/dispatch/fast-path/debug-visibility.js +6 -3
- package/dist/dispatch/fast-path/dispatcher-state.d.ts +10 -0
- package/dist/dispatch/fast-path/dispatcher-state.d.ts.map +1 -0
- package/dist/dispatch/fast-path/dispatcher-state.js +52 -0
- package/dist/dispatch/fast-path/eligibility-checker.d.ts.map +1 -1
- package/dist/dispatch/fast-path/eligibility-checker.js +27 -15
- package/dist/dispatch/fast-path/eligibility.d.ts +16 -10
- package/dist/dispatch/fast-path/eligibility.d.ts.map +1 -1
- package/dist/dispatch/fast-path/eligibility.js +10 -4
- package/dist/dispatch/fast-path/fast-path-executor.d.ts +14 -1
- package/dist/dispatch/fast-path/fast-path-executor.d.ts.map +1 -1
- package/dist/dispatch/fast-path/fast-path-executor.js +23 -6
- package/dist/dispatch/request-abort.d.ts +22 -0
- package/dist/dispatch/request-abort.d.ts.map +1 -0
- package/dist/dispatch/request-abort.js +30 -0
- package/dist/dispatch/response-integration.d.ts +55 -0
- package/dist/dispatch/response-integration.d.ts.map +1 -0
- package/dist/dispatch/response-integration.js +57 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +19 -0
- package/dist/guards.d.ts +1 -1
- package/dist/guards.d.ts.map +1 -1
- package/dist/header-helpers.d.ts +59 -0
- package/dist/header-helpers.d.ts.map +1 -0
- package/dist/header-helpers.js +185 -0
- package/dist/index.d.ts +1 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -15
- package/dist/index.portable.d.ts +25 -0
- package/dist/index.portable.d.ts.map +1 -0
- package/dist/index.portable.js +21 -0
- package/dist/internal.d.ts +3 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/mapping.d.ts.map +1 -1
- package/dist/mapping.js +100 -15
- package/dist/middleware/correlation.d.ts +9 -1
- package/dist/middleware/correlation.d.ts.map +1 -1
- package/dist/middleware/correlation.js +25 -14
- package/dist/middleware/cors.d.ts.map +1 -1
- package/dist/middleware/cors.js +7 -8
- package/dist/middleware/middleware.d.ts +3 -3
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/rate-limit.d.ts +13 -2
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +1 -0
- package/dist/static-assets.d.ts +77 -0
- package/dist/static-assets.d.ts.map +1 -0
- package/dist/static-assets.js +270 -0
- package/dist/types.d.ts +225 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +71 -1
- package/package.json +19 -9
|
@@ -1,5 +1,31 @@
|
|
|
1
|
+
import { appendVaryHeader } from '../header-helpers.js';
|
|
2
|
+
import { applyResponseValidators } from './conditional-request-policy.js';
|
|
1
3
|
import { resolveContentNegotiation, selectResponseFormatter } from './dispatch-content-negotiation.js';
|
|
2
4
|
import { writeErrorResponse } from './dispatch-error-policy.js';
|
|
5
|
+
import { applyRouteHeaders } from './dispatch-response-metadata.js';
|
|
6
|
+
import { createByteRangeResponse, isByteRangeByteSource, shouldApplyByteRange } from '../byte-range-response.js';
|
|
7
|
+
import { FRAMEWORK_RESPONSE_VALUE_FINALIZER, FRAMEWORK_RESPONSE_WRITER } from './response-integration.js';
|
|
8
|
+
const BINARY_CONTENT_TYPE = 'application/octet-stream';
|
|
9
|
+
const JSON_CONTENT_TYPE = 'application/json; charset=utf-8';
|
|
10
|
+
const TEXT_CONTENT_TYPE = 'text/plain; charset=utf-8';
|
|
11
|
+
|
|
12
|
+
/** Selected representation metadata shared by success and conditional response writers. */
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolves the representation policy before conditional request evaluation.
|
|
16
|
+
*
|
|
17
|
+
* @param handler Matched route descriptor.
|
|
18
|
+
* @param request Adapter-normalized request.
|
|
19
|
+
* @param contentNegotiation Configured response formatters.
|
|
20
|
+
* @returns Formatter selection and representation variance metadata.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveResponsePolicy(handler, request, contentNegotiation) {
|
|
23
|
+
const formatter = contentNegotiation ? selectResponseFormatter(handler, request, contentNegotiation) : undefined;
|
|
24
|
+
return {
|
|
25
|
+
formatter,
|
|
26
|
+
variesByAccept: formatter !== undefined
|
|
27
|
+
};
|
|
28
|
+
}
|
|
3
29
|
function resolveDefaultSuccessStatus(handler, value) {
|
|
4
30
|
switch (handler.route.method) {
|
|
5
31
|
case 'POST':
|
|
@@ -23,6 +49,20 @@ function isSimpleJsonResponseBody(value) {
|
|
|
23
49
|
}
|
|
24
50
|
return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;
|
|
25
51
|
}
|
|
52
|
+
function readFrameworkResponseWriter(value) {
|
|
53
|
+
if (typeof value !== 'object' || value === null) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const writer = Reflect.get(value, FRAMEWORK_RESPONSE_WRITER);
|
|
57
|
+
return typeof writer === 'function' ? writer : undefined;
|
|
58
|
+
}
|
|
59
|
+
function readFrameworkResponseValueFinalizer(requestContext) {
|
|
60
|
+
const finalizer = requestContext.metadata[FRAMEWORK_RESPONSE_VALUE_FINALIZER];
|
|
61
|
+
if (typeof finalizer !== 'function') {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return context => Reflect.apply(finalizer, undefined, [context]);
|
|
65
|
+
}
|
|
26
66
|
function isResponseBodyForbidden(status) {
|
|
27
67
|
return status === 204 || status === 205 || status === 304;
|
|
28
68
|
}
|
|
@@ -39,6 +79,33 @@ function readHeader(headers, name) {
|
|
|
39
79
|
function isJsonContentType(contentType) {
|
|
40
80
|
return contentType.toLowerCase().includes('application/json') || contentType.toLowerCase().endsWith('+json');
|
|
41
81
|
}
|
|
82
|
+
function applySuccessResponseMetadata(context) {
|
|
83
|
+
const {
|
|
84
|
+
formatter,
|
|
85
|
+
handler,
|
|
86
|
+
response,
|
|
87
|
+
value
|
|
88
|
+
} = context;
|
|
89
|
+
applyRouteHeaders(handler, response);
|
|
90
|
+
if (formatter) {
|
|
91
|
+
response.setHeader('Content-Type', formatter.mediaType);
|
|
92
|
+
}
|
|
93
|
+
if (handler.route.successStatus !== undefined) {
|
|
94
|
+
response.setStatus(handler.route.successStatus);
|
|
95
|
+
} else if (response.statusSet !== true) {
|
|
96
|
+
response.setStatus(resolveDefaultSuccessStatus(handler, value));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function applyImplicitHeadContentType(response, value) {
|
|
100
|
+
if (readHeader(response.headers, 'content-type') !== undefined || value === undefined) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (value instanceof Uint8Array || value instanceof ArrayBuffer) {
|
|
104
|
+
response.setHeader('Content-Type', BINARY_CONTENT_TYPE);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
response.setHeader('Content-Type', typeof value === 'string' ? TEXT_CONTENT_TYPE : JSON_CONTENT_TYPE);
|
|
108
|
+
}
|
|
42
109
|
|
|
43
110
|
/**
|
|
44
111
|
* Write success response.
|
|
@@ -47,10 +114,13 @@ function isJsonContentType(contentType) {
|
|
|
47
114
|
* @param request The request.
|
|
48
115
|
* @param response The response.
|
|
49
116
|
* @param value The value.
|
|
50
|
-
* @param contentNegotiation The
|
|
117
|
+
* @param contentNegotiation The configured response formatters.
|
|
118
|
+
* @param requestContext The active request context passed to custom response writers.
|
|
119
|
+
* @param validators Validators resolved before the route handler executes.
|
|
120
|
+
* @param conditionalOutcome Matched conditional outcome for formatter-managed responses.
|
|
51
121
|
* @returns The write success response result.
|
|
52
122
|
*/
|
|
53
|
-
export function writeSuccessResponse(handler, request, response, value, contentNegotiation) {
|
|
123
|
+
export async function writeSuccessResponse(handler, request, response, value, contentNegotiation, requestContext, validators, conditionalOutcome) {
|
|
54
124
|
if (response.committed) {
|
|
55
125
|
return;
|
|
56
126
|
}
|
|
@@ -59,29 +129,90 @@ export function writeSuccessResponse(handler, request, response, value, contentN
|
|
|
59
129
|
url,
|
|
60
130
|
statusCode = 302
|
|
61
131
|
} = handler.route.redirect;
|
|
132
|
+
applyResponseValidators(response, validators);
|
|
62
133
|
response.redirect(statusCode, url);
|
|
63
134
|
return;
|
|
64
135
|
}
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
136
|
+
const responseValueFinalizer = readFrameworkResponseValueFinalizer(requestContext);
|
|
137
|
+
const responseValue = responseValueFinalizer ? await responseValueFinalizer({
|
|
138
|
+
handler,
|
|
139
|
+
request,
|
|
140
|
+
requestContext,
|
|
141
|
+
response,
|
|
142
|
+
value
|
|
143
|
+
}) : value;
|
|
144
|
+
const writerValue = readFrameworkResponseWriter(responseValue) ? responseValue : isByteRangeByteSource(responseValue) && shouldApplyByteRange(request, validators) ? createByteRangeResponse(responseValue) : undefined;
|
|
145
|
+
const responseWriter = writerValue ? readFrameworkResponseWriter(writerValue) : undefined;
|
|
146
|
+
if (responseWriter) {
|
|
147
|
+
applyResponseValidators(response, validators);
|
|
148
|
+
let successResponseMetadataApplied = false;
|
|
149
|
+
const applyWriterSuccessResponseMetadata = () => {
|
|
150
|
+
if (successResponseMetadataApplied) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
successResponseMetadataApplied = true;
|
|
154
|
+
applySuccessResponseMetadata({
|
|
155
|
+
formatter: undefined,
|
|
156
|
+
handler,
|
|
157
|
+
response,
|
|
158
|
+
value: responseValue
|
|
159
|
+
});
|
|
160
|
+
applyResponseValidators(response, validators);
|
|
161
|
+
};
|
|
162
|
+
return responseWriter({
|
|
163
|
+
applySuccessResponseMetadata: applyWriterSuccessResponseMetadata,
|
|
164
|
+
handler,
|
|
165
|
+
request,
|
|
166
|
+
requestContext,
|
|
167
|
+
response,
|
|
168
|
+
validators,
|
|
169
|
+
value: writerValue
|
|
170
|
+
});
|
|
72
171
|
}
|
|
73
|
-
|
|
74
|
-
|
|
172
|
+
const responsePolicy = resolveResponsePolicy(handler, request, contentNegotiation);
|
|
173
|
+
const {
|
|
174
|
+
formatter
|
|
175
|
+
} = responsePolicy;
|
|
176
|
+
if (conditionalOutcome !== undefined) {
|
|
177
|
+
applyRouteHeaders(handler, response);
|
|
178
|
+
return writeConditionalResponse(response, conditionalOutcome, validators, responsePolicy);
|
|
75
179
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
response
|
|
180
|
+
applySuccessResponseMetadata({
|
|
181
|
+
formatter,
|
|
182
|
+
handler,
|
|
183
|
+
response,
|
|
184
|
+
value: responseValue
|
|
185
|
+
});
|
|
186
|
+
if (responsePolicy.variesByAccept) {
|
|
187
|
+
appendVaryHeader(response, 'Accept');
|
|
80
188
|
}
|
|
81
|
-
|
|
82
|
-
|
|
189
|
+
applyResponseValidators(response, validators);
|
|
190
|
+
if (request.method.toUpperCase() === 'HEAD') {
|
|
191
|
+
applyImplicitHeadContentType(response, responseValue);
|
|
192
|
+
return response.send(undefined);
|
|
83
193
|
}
|
|
84
|
-
|
|
194
|
+
if (!formatter && hasSimpleJsonResponseWriter(response) && canUseSimpleJsonFastPath(response, responseValue)) {
|
|
195
|
+
return response.sendSimpleJson(responseValue);
|
|
196
|
+
}
|
|
197
|
+
const responseBody = formatter ? formatter.format(responseValue) : responseValue;
|
|
85
198
|
return response.send(responseBody);
|
|
86
199
|
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Writes a bodyless conditional response through every supported adapter facade.
|
|
203
|
+
*
|
|
204
|
+
* @param response Mutable adapter-normalized response.
|
|
205
|
+
* @param outcome Selected non-proceed conditional request outcome.
|
|
206
|
+
* @param validators Current representation validators.
|
|
207
|
+
* @param responsePolicy Selected representation metadata.
|
|
208
|
+
* @returns A promise that settles after the adapter accepts the bodyless response.
|
|
209
|
+
*/
|
|
210
|
+
export async function writeConditionalResponse(response, outcome, validators, responsePolicy) {
|
|
211
|
+
applyResponseValidators(response, validators);
|
|
212
|
+
if (responsePolicy.variesByAccept) {
|
|
213
|
+
appendVaryHeader(response, 'Accept');
|
|
214
|
+
}
|
|
215
|
+
response.setStatus(outcome === 'not-modified' ? 304 : 412);
|
|
216
|
+
await response.send(undefined);
|
|
217
|
+
}
|
|
87
218
|
export { resolveContentNegotiation, writeErrorResponse };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Container } from '@fluojs/di';
|
|
2
|
-
import type { Binder, ContentNegotiationOptions, ConverterLike, Dispatcher, DispatcherLogger, FrameworkRequest, FrameworkResponse, HandlerMapping, InterceptorLike, MiddlewareLike, RequestObserverLike } from '../types.js';
|
|
2
|
+
import type { Binder, ConditionalRequestOptions, ContentNegotiationOptions, ConverterLike, Dispatcher, DispatcherLogger, FrameworkRequest, FrameworkResponse, HandlerMapping, HttpErrorRepresentationOptions, InterceptorLike, MiddlewareLike, RequestObserverLike } from '../types.js';
|
|
3
3
|
import { type FastPathStats } from './fast-path/index.js';
|
|
4
4
|
export type { FastPathEligibility, FastPathStats } from './fast-path/index.js';
|
|
5
5
|
export { FAST_PATH_ELIGIBILITY_SYMBOL, FAST_PATH_STATS_SYMBOL } from './fast-path/index.js';
|
|
@@ -13,6 +13,8 @@ export interface CreateDispatcherOptions {
|
|
|
13
13
|
binder?: Binder;
|
|
14
14
|
/** Optional content negotiation configuration. */
|
|
15
15
|
contentNegotiation?: ContentNegotiationOptions;
|
|
16
|
+
/** Optional dispatcher-owned HTTP conditional request policy. */
|
|
17
|
+
conditionalRequest?: ConditionalRequestOptions;
|
|
16
18
|
/** Mapping of routes to their respective handlers. */
|
|
17
19
|
handlerMapping: HandlerMapping;
|
|
18
20
|
/** Global interceptors applied to all matched handlers. */
|
|
@@ -23,6 +25,8 @@ export interface CreateDispatcherOptions {
|
|
|
23
25
|
fastPathDebugHeaders?: boolean;
|
|
24
26
|
/** Optional global error handler. */
|
|
25
27
|
onError?: ErrorHandler;
|
|
28
|
+
/** Optional application-owned HTML representation for HTTP-classified errors. */
|
|
29
|
+
errorRepresentation?: HttpErrorRepresentationOptions;
|
|
26
30
|
/** Request-scope optimization hints supplied by runtime bootstrap. */
|
|
27
31
|
requestScope?: {
|
|
28
32
|
/** Global DTO converters used by the default binder. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/dispatch/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/dispatch/dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,YAAY,CAAC;AAUnE,OAAO,KAAK,EACV,MAAM,EACN,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAKjB,cAAc,EAEd,8BAA8B,EAC9B,eAAe,EAEf,cAAc,EAKd,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAKL,KAAK,aAAa,EAEnB,MAAM,sBAAsB,CAAC;AAK9B,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE5F,gEAAgE;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpK,uDAAuD;AACvD,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;IACjC,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,sDAAsD;IACtD,cAAc,EAAE,cAAc,CAAC;IAC/B,2DAA2D;IAC3D,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qCAAqC;IACrC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,8BAA8B,CAAC;IACrD,sEAAsE;IACtE,YAAY,CAAC,EAAE;QACb,wDAAwD;QACxD,oBAAoB,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;KACjD,CAAC;IACF,qDAAqD;IACrD,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,qDAAqD;IACrD,aAAa,EAAE,SAAS,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgjCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,UAAU,CAiG7E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAE5F;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|