@empire-builder-kit/runtime 1.0.0-beta.9 → 1.0.0-rc.2

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 (218) hide show
  1. package/NOTICE +6 -0
  2. package/package.json +93 -3
  3. package/src/api-contract/artifacts.d.ts +67 -0
  4. package/src/api-contract/artifacts.js +349 -0
  5. package/src/api-contract/artifacts.js.map +1 -0
  6. package/src/api-contract/client.d.ts +79 -0
  7. package/src/api-contract/client.js +561 -0
  8. package/src/api-contract/client.js.map +1 -0
  9. package/src/api-contract/errors.d.ts +7 -0
  10. package/src/api-contract/errors.js +11 -0
  11. package/src/api-contract/errors.js.map +1 -0
  12. package/src/api-contract/index.d.ts +9 -0
  13. package/src/api-contract/index.js +10 -0
  14. package/src/api-contract/index.js.map +1 -0
  15. package/src/api-contract/operation.d.ts +118 -0
  16. package/src/api-contract/operation.js +609 -0
  17. package/src/api-contract/operation.js.map +1 -0
  18. package/src/api-contract/schema.d.ts +81 -0
  19. package/src/api-contract/schema.js +313 -0
  20. package/src/api-contract/schema.js.map +1 -0
  21. package/src/api-contract/server.d.ts +77 -0
  22. package/src/api-contract/server.js +466 -0
  23. package/src/api-contract/server.js.map +1 -0
  24. package/src/async-work/contract.d.ts +17 -0
  25. package/src/async-work/contract.js +105 -0
  26. package/src/async-work/contract.js.map +1 -0
  27. package/src/async-work/idempotency.d.ts +123 -0
  28. package/src/async-work/idempotency.js +167 -0
  29. package/src/async-work/idempotency.js.map +1 -0
  30. package/src/async-work/index.d.ts +8 -0
  31. package/src/async-work/index.js +9 -0
  32. package/src/async-work/index.js.map +1 -0
  33. package/src/async-work/provider.d.ts +90 -0
  34. package/src/async-work/provider.js +155 -0
  35. package/src/async-work/provider.js.map +1 -0
  36. package/src/async-work/recovery.d.ts +103 -0
  37. package/src/async-work/recovery.js +291 -0
  38. package/src/async-work/recovery.js.map +1 -0
  39. package/src/async-work/schedule.d.ts +117 -0
  40. package/src/async-work/schedule.js +279 -0
  41. package/src/async-work/schedule.js.map +1 -0
  42. package/src/async-work/sqs.d.ts +133 -0
  43. package/src/async-work/sqs.js +280 -0
  44. package/src/async-work/sqs.js.map +1 -0
  45. package/src/async-work/webhook.d.ts +60 -0
  46. package/src/async-work/webhook.js +178 -0
  47. package/src/async-work/webhook.js.map +1 -0
  48. package/src/async-work/workflow.d.ts +98 -0
  49. package/src/async-work/workflow.js +225 -0
  50. package/src/async-work/workflow.js.map +1 -0
  51. package/src/auth-backend.d.ts +12 -2
  52. package/src/auth-backend.js +30 -18
  53. package/src/auth-backend.js.map +1 -1
  54. package/src/authorization/admission.d.ts +30 -0
  55. package/src/authorization/admission.js +87 -0
  56. package/src/authorization/admission.js.map +1 -0
  57. package/src/authorization/approval.d.ts +99 -0
  58. package/src/authorization/approval.js +249 -0
  59. package/src/authorization/approval.js.map +1 -0
  60. package/src/authorization/audit.d.ts +35 -0
  61. package/src/authorization/audit.js +35 -0
  62. package/src/authorization/audit.js.map +1 -0
  63. package/src/authorization/delegation.d.ts +149 -0
  64. package/src/authorization/delegation.js +401 -0
  65. package/src/authorization/delegation.js.map +1 -0
  66. package/src/authorization/errors.d.ts +32 -0
  67. package/src/authorization/errors.js +153 -0
  68. package/src/authorization/errors.js.map +1 -0
  69. package/src/authorization/evaluator.d.ts +39 -0
  70. package/src/authorization/evaluator.js +199 -0
  71. package/src/authorization/evaluator.js.map +1 -0
  72. package/src/authorization/index.d.ts +14 -0
  73. package/src/authorization/index.js +15 -0
  74. package/src/authorization/index.js.map +1 -0
  75. package/src/authorization/machine-token.d.ts +87 -0
  76. package/src/authorization/machine-token.js +201 -0
  77. package/src/authorization/machine-token.js.map +1 -0
  78. package/src/authorization/machine.d.ts +32 -0
  79. package/src/authorization/machine.js +41 -0
  80. package/src/authorization/machine.js.map +1 -0
  81. package/src/authorization/model.d.ts +112 -0
  82. package/src/authorization/model.js +112 -0
  83. package/src/authorization/model.js.map +1 -0
  84. package/src/canonical-json.cjs +157 -0
  85. package/src/canonical-json.d.cts +26 -0
  86. package/src/canonical-json.d.ts +18 -0
  87. package/src/canonical-json.js +125 -0
  88. package/src/canonical-json.js.map +1 -0
  89. package/src/configuration/contract.d.ts +107 -0
  90. package/src/configuration/contract.js +461 -0
  91. package/src/configuration/contract.js.map +1 -0
  92. package/src/configuration/index.d.ts +3 -0
  93. package/src/configuration/index.js +4 -0
  94. package/src/configuration/index.js.map +1 -0
  95. package/src/configuration/provider.d.ts +59 -0
  96. package/src/configuration/provider.js +198 -0
  97. package/src/configuration/provider.js.map +1 -0
  98. package/src/configuration/rollout-evaluator.cjs +54 -0
  99. package/src/configuration/rollout-evaluator.d.cts +26 -0
  100. package/src/configuration/rollout-evaluator.d.ts +18 -0
  101. package/src/configuration/rollout-evaluator.js +38 -0
  102. package/src/configuration/rollout-evaluator.js.map +1 -0
  103. package/src/configuration/rollout-key.cjs +38 -0
  104. package/src/configuration/rollout-key.d.cts +14 -0
  105. package/src/configuration/rollout-key.d.ts +10 -0
  106. package/src/configuration/rollout-key.js +26 -0
  107. package/src/configuration/rollout-key.js.map +1 -0
  108. package/src/configuration/rollout.d.ts +60 -0
  109. package/src/configuration/rollout.js +42 -0
  110. package/src/configuration/rollout.js.map +1 -0
  111. package/src/data-lifecycle/contract.d.ts +33 -0
  112. package/src/data-lifecycle/contract.js +118 -0
  113. package/src/data-lifecycle/contract.js.map +1 -0
  114. package/src/data-lifecycle/event.d.ts +28 -0
  115. package/src/data-lifecycle/event.js +76 -0
  116. package/src/data-lifecycle/event.js.map +1 -0
  117. package/src/data-lifecycle/evidence.d.ts +65 -0
  118. package/src/data-lifecycle/evidence.js +162 -0
  119. package/src/data-lifecycle/evidence.js.map +1 -0
  120. package/src/data-lifecycle/holds.d.ts +29 -0
  121. package/src/data-lifecycle/holds.js +124 -0
  122. package/src/data-lifecycle/holds.js.map +1 -0
  123. package/src/data-lifecycle/index.d.ts +8 -0
  124. package/src/data-lifecycle/index.js +9 -0
  125. package/src/data-lifecycle/index.js.map +1 -0
  126. package/src/data-lifecycle/policy.d.ts +16 -0
  127. package/src/data-lifecycle/policy.js +79 -0
  128. package/src/data-lifecycle/policy.js.map +1 -0
  129. package/src/data-lifecycle/restore.d.ts +90 -0
  130. package/src/data-lifecycle/restore.js +336 -0
  131. package/src/data-lifecycle/restore.js.map +1 -0
  132. package/src/data-lifecycle/retention.d.ts +57 -0
  133. package/src/data-lifecycle/retention.js +232 -0
  134. package/src/data-lifecycle/retention.js.map +1 -0
  135. package/src/data-lifecycle/rights.d.ts +171 -0
  136. package/src/data-lifecycle/rights.js +533 -0
  137. package/src/data-lifecycle/rights.js.map +1 -0
  138. package/src/database.d.ts +36 -0
  139. package/src/database.js +119 -0
  140. package/src/database.js.map +1 -0
  141. package/src/deterministic-order.cjs +16 -0
  142. package/src/deterministic-order.d.cts +9 -0
  143. package/src/deterministic-order.d.ts +7 -0
  144. package/src/deterministic-order.js +10 -0
  145. package/src/deterministic-order.js.map +1 -0
  146. package/src/events.d.ts +28 -19
  147. package/src/events.js +171 -66
  148. package/src/events.js.map +1 -1
  149. package/src/index.d.ts +7 -1
  150. package/src/index.js +24 -0
  151. package/src/index.js.map +1 -1
  152. package/src/lambda.d.ts +8 -2
  153. package/src/lambda.js +100 -39
  154. package/src/lambda.js.map +1 -1
  155. package/src/logging.d.ts +95 -36
  156. package/src/logging.js +460 -62
  157. package/src/logging.js.map +1 -1
  158. package/src/observability.d.ts +80 -18
  159. package/src/observability.js +252 -61
  160. package/src/observability.js.map +1 -1
  161. package/src/performance/index.d.ts +1 -0
  162. package/src/performance/index.js +2 -0
  163. package/src/performance/index.js.map +1 -0
  164. package/src/performance/protected-load-endpoint.d.ts +140 -0
  165. package/src/performance/protected-load-endpoint.js +462 -0
  166. package/src/performance/protected-load-endpoint.js.map +1 -0
  167. package/src/rds-global-ca-bundle.d.ts +1 -0
  168. package/src/rds-global-ca-bundle.js +2742 -0
  169. package/src/rds-global-ca-bundle.js.map +1 -0
  170. package/src/reliability/burn.d.ts +39 -0
  171. package/src/reliability/burn.js +102 -0
  172. package/src/reliability/burn.js.map +1 -0
  173. package/src/reliability/contract.d.ts +5 -0
  174. package/src/reliability/contract.js +317 -0
  175. package/src/reliability/contract.js.map +1 -0
  176. package/src/reliability/incident.d.ts +16 -0
  177. package/src/reliability/incident.js +562 -0
  178. package/src/reliability/incident.js.map +1 -0
  179. package/src/reliability/index.d.ts +5 -0
  180. package/src/reliability/index.js +6 -0
  181. package/src/reliability/index.js.map +1 -0
  182. package/src/reliability/model.d.ts +191 -0
  183. package/src/reliability/model.fixtures.d.ts +2 -0
  184. package/src/reliability/model.fixtures.js +57 -0
  185. package/src/reliability/model.fixtures.js.map +1 -0
  186. package/src/reliability/model.js +2 -0
  187. package/src/reliability/model.js.map +1 -0
  188. package/src/reliability/slo.d.ts +9 -0
  189. package/src/reliability/slo.js +74 -0
  190. package/src/reliability/slo.js.map +1 -0
  191. package/src/request-context.d.ts +57 -15
  192. package/src/request-context.js +116 -36
  193. package/src/request-context.js.map +1 -1
  194. package/src/safe-reference.cjs +57 -0
  195. package/src/safe-reference.d.cts +25 -0
  196. package/src/safe-reference.d.ts +11 -0
  197. package/src/safe-reference.js +46 -0
  198. package/src/safe-reference.js.map +1 -0
  199. package/src/secrets/contract.d.ts +99 -0
  200. package/src/secrets/contract.js +238 -0
  201. package/src/secrets/contract.js.map +1 -0
  202. package/src/secrets/index.d.ts +4 -0
  203. package/src/secrets/index.js +5 -0
  204. package/src/secrets/index.js.map +1 -0
  205. package/src/secrets/observability.d.ts +14 -0
  206. package/src/secrets/observability.js +100 -0
  207. package/src/secrets/observability.js.map +1 -0
  208. package/src/secrets/personal.d.ts +48 -0
  209. package/src/secrets/personal.js +332 -0
  210. package/src/secrets/personal.js.map +1 -0
  211. package/src/secrets/resolver.d.ts +125 -0
  212. package/src/secrets/resolver.js +602 -0
  213. package/src/secrets/resolver.js.map +1 -0
  214. package/src/secrets/sensitive-patterns.cjs +84 -0
  215. package/src/secrets/sensitive-patterns.d.cts +62 -0
  216. package/src/secrets/sensitive-patterns.d.ts +40 -0
  217. package/src/secrets/sensitive-patterns.js +60 -0
  218. package/src/secrets/sensitive-patterns.js.map +1 -0
@@ -0,0 +1,609 @@
1
+ import { ApiContractError } from './errors.js';
2
+ import { API_HTTP_HEADER_VALUE_FORMAT, API_HTTP_HEADER_VALUE_MAX_LENGTH, API_HTTP_HEADER_VALUE_PATTERN, } from './schema.js';
3
+ export const EBK_APP_V1_RESPONSE_PROFILE = 'ebk-app-v1';
4
+ export const API_CONTRACT_SCHEMA_VERSION = 1;
5
+ export const DEFAULT_API_BODY_MAX_BYTES = 256 * 1024;
6
+ const operationIdPattern = /^[a-z][a-z0-9-]*\.[a-z][a-z0-9.-]*$/;
7
+ const slicePattern = /^[a-z][a-z0-9-]{0,62}$/;
8
+ const featurePattern = /^[a-z][a-z0-9-]{0,62}$/;
9
+ const actionPattern = /^[a-z][a-z0-9-]{0,62}:[a-z][a-z0-9-]{0,62}$/;
10
+ const problemCodePattern = /^[a-z][a-z0-9_]{2,63}$/;
11
+ const semanticVersionPattern = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/;
12
+ const routePattern = /^\/(?:[A-Za-z0-9._~-]+|\{[a-z][A-Za-z0-9]*\})(?:\/(?:[A-Za-z0-9._~-]+|\{[a-z][A-Za-z0-9]*\}))*$/;
13
+ const tokenPattern = /^[A-Za-z0-9][A-Za-z0-9._:/@-]{0,255}$/;
14
+ const authenticationModes = new Set([
15
+ 'anonymous',
16
+ 'customer',
17
+ 'internal',
18
+ 'operator',
19
+ 'product-agent',
20
+ ]);
21
+ const httpMethods = new Set([
22
+ 'DELETE',
23
+ 'GET',
24
+ 'PATCH',
25
+ 'POST',
26
+ 'PUT',
27
+ ]);
28
+ const frameworkProblemCodes = new Set([
29
+ 'internal_error',
30
+ 'invalid_request',
31
+ 'method_not_allowed',
32
+ ]);
33
+ const reservedRequestHeaders = new Set([
34
+ 'authorization',
35
+ 'content-length',
36
+ 'content-type',
37
+ 'cookie',
38
+ 'host',
39
+ 'idempotency-key',
40
+ 'if-match',
41
+ 'proxy-authorization',
42
+ 'set-cookie',
43
+ 'traceparent',
44
+ 'tracestate',
45
+ 'x-api-key',
46
+ 'x-causation-id',
47
+ 'x-correlation-id',
48
+ 'x-request-id',
49
+ ]);
50
+ const apiSchemaRuntimeBrand = Symbol.for('@empire-builder-kit/runtime/api-schema-v1');
51
+ function requireExactRecordKeys(value, allowedKeys, label, optionalKeys = []) {
52
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
53
+ throw new ApiContractError('api-contract-invalid', `${label} must be an object.`);
54
+ }
55
+ const prototype = Object.getPrototypeOf(value);
56
+ if (prototype !== null && prototype !== Object.prototype) {
57
+ throw new ApiContractError('api-contract-invalid', `${label} must use a plain or null prototype.`);
58
+ }
59
+ const allowed = new Set(allowedKeys);
60
+ const unexpected = Reflect.ownKeys(value).filter((key) => !allowed.has(key));
61
+ if (unexpected.length > 0) {
62
+ throw new ApiContractError('api-contract-invalid', `${label} contains undeclared fields: ${unexpected
63
+ .map((key) => (typeof key === 'symbol' ? key.toString() : key))
64
+ .sort()
65
+ .join(', ')}.`);
66
+ }
67
+ const invalidDescriptors = Reflect.ownKeys(value).filter((key) => {
68
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
69
+ return (allowed.has(key) &&
70
+ (!(descriptor === null || descriptor === void 0 ? void 0 : descriptor.enumerable) ||
71
+ !Object.prototype.hasOwnProperty.call(descriptor, 'value')));
72
+ });
73
+ if (invalidDescriptors.length > 0) {
74
+ throw new ApiContractError('api-contract-invalid', `${label} fields must be enumerable data properties.`);
75
+ }
76
+ const optional = new Set(optionalKeys);
77
+ const inherited = allowedKeys.filter((key) => !Object.prototype.hasOwnProperty.call(value, key) && key in value);
78
+ if (inherited.length > 0) {
79
+ throw new ApiContractError('api-contract-invalid', `${label} cannot inherit declared fields.`);
80
+ }
81
+ const missing = allowedKeys.filter((key) => !optional.has(key) && !Object.prototype.hasOwnProperty.call(value, key));
82
+ if (missing.length > 0) {
83
+ throw new ApiContractError('api-contract-invalid', `${label} is missing required fields: ${missing.sort().join(', ')}.`);
84
+ }
85
+ }
86
+ function isApiSchema(value) {
87
+ return (Boolean(value) &&
88
+ typeof value === 'object' &&
89
+ typeof value.parse === 'function' &&
90
+ typeof value.parseResponse === 'function' &&
91
+ typeof value.project === 'function' &&
92
+ Boolean(value.jsonSchema) &&
93
+ typeof value.jsonSchema === 'object' &&
94
+ value[apiSchemaRuntimeBrand] === true);
95
+ }
96
+ function objectSchemaProperties(value, label) {
97
+ if (!value)
98
+ return undefined;
99
+ if (value.jsonSchema.type !== 'object' ||
100
+ !value.jsonSchema.properties ||
101
+ value.jsonSchema.additionalProperties !== false) {
102
+ throw new ApiContractError('api-contract-invalid', `${label} must be a closed object schema.`);
103
+ }
104
+ return value.jsonSchema.properties;
105
+ }
106
+ function transportScalarType(value) {
107
+ if (!value || typeof value !== 'object')
108
+ return undefined;
109
+ const type = value.type;
110
+ return ['boolean', 'integer', 'number', 'string'].includes(String(type))
111
+ ? type
112
+ : undefined;
113
+ }
114
+ function transportStringExcludesEmpty(value) {
115
+ return ((Number.isSafeInteger(value['minLength']) &&
116
+ value['minLength'] >= 1) ||
117
+ value['format'] === 'uuid' ||
118
+ (typeof value['const'] === 'string' && value['const'].length > 0) ||
119
+ (Array.isArray(value['enum']) &&
120
+ value['enum'].length > 0 &&
121
+ value['enum'].every((member) => typeof member === 'string' && member.length > 0)));
122
+ }
123
+ function usesCanonicalHeaderStringProfile(value) {
124
+ return (value['format'] === API_HTTP_HEADER_VALUE_FORMAT &&
125
+ value['pattern'] === API_HTTP_HEADER_VALUE_PATTERN &&
126
+ Number.isSafeInteger(value['minLength']) &&
127
+ value['minLength'] >= 1 &&
128
+ Number.isSafeInteger(value['maxLength']) &&
129
+ value['maxLength'] <= API_HTTP_HEADER_VALUE_MAX_LENGTH);
130
+ }
131
+ function validateTransportProperties(properties, label, options) {
132
+ for (const [name, value] of Object.entries(properties !== null && properties !== void 0 ? properties : {})) {
133
+ const record = value && typeof value === 'object'
134
+ ? value
135
+ : undefined;
136
+ const scalar = transportScalarType(record);
137
+ const repeatedScalar = options.arrays &&
138
+ (record === null || record === void 0 ? void 0 : record.type) === 'array' &&
139
+ transportScalarType(record.items) !== undefined;
140
+ if (!scalar && !repeatedScalar) {
141
+ throw new ApiContractError('api-contract-invalid', `${label} property ${name} must use a transport scalar${options.arrays ? ' or an array of transport scalars' : ''}.`);
142
+ }
143
+ if (scalar === 'string' &&
144
+ options.canonicalHeaderStrings &&
145
+ record &&
146
+ !usesCanonicalHeaderStringProfile(record)) {
147
+ throw new ApiContractError('api-contract-invalid', `${label} property ${name} must use the canonical EBK HTTP-header string profile.`);
148
+ }
149
+ if (scalar === 'string' &&
150
+ options.nonEmptyStrings &&
151
+ record &&
152
+ !transportStringExcludesEmpty(record)) {
153
+ throw new ApiContractError('api-contract-invalid', `${label} property ${name} must exclude an empty string.`);
154
+ }
155
+ if (repeatedScalar &&
156
+ options.nonEmptyArrays &&
157
+ (!Number.isSafeInteger(record === null || record === void 0 ? void 0 : record.minItems) ||
158
+ record.minItems < 1)) {
159
+ throw new ApiContractError('api-contract-invalid', `${label} property ${name} must require at least one array item.`);
160
+ }
161
+ }
162
+ }
163
+ function sameStrings(left, right) {
164
+ return [...left].sort().join('\u0000') === [...right].sort().join('\u0000');
165
+ }
166
+ function validateRequestSchemas(definition) {
167
+ var _a, _b, _c, _d, _e, _f, _g;
168
+ const request = definition.request;
169
+ if (!request) {
170
+ if (definition.path.includes('{')) {
171
+ throw new ApiContractError('api-contract-invalid', 'A route with path parameters must declare a path schema.');
172
+ }
173
+ if (definition.pagination) {
174
+ throw new ApiContractError('api-contract-invalid', 'A paginated operation must declare a request query schema.');
175
+ }
176
+ return;
177
+ }
178
+ requireExactRecordKeys(request, ['body', 'headers', 'maxBodyBytes', 'path', 'query'], 'API operation request metadata', ['body', 'headers', 'maxBodyBytes', 'path', 'query']);
179
+ for (const [label, value] of [
180
+ ['Request body', request.body],
181
+ ['Request headers', request.headers],
182
+ ['Request path', request.path],
183
+ ['Request query', request.query],
184
+ ]) {
185
+ if (value !== undefined && !isApiSchema(value)) {
186
+ throw new ApiContractError('api-contract-invalid', `${label} must use an EBK API schema.`);
187
+ }
188
+ }
189
+ const pathProperties = objectSchemaProperties(request.path, 'Request path');
190
+ const queryProperties = objectSchemaProperties(request.query, 'Request query');
191
+ const headerProperties = objectSchemaProperties(request.headers, 'Request headers');
192
+ validateTransportProperties(pathProperties, 'Request path', {
193
+ arrays: false,
194
+ nonEmptyStrings: true,
195
+ });
196
+ validateTransportProperties(queryProperties, 'Request query', {
197
+ arrays: true,
198
+ nonEmptyArrays: true,
199
+ });
200
+ validateTransportProperties(headerProperties, 'Request header', {
201
+ arrays: false,
202
+ canonicalHeaderStrings: true,
203
+ });
204
+ const routeNames = [...definition.path.matchAll(/\{([^}]+)\}/g)].map((match) => { var _a; return (_a = match[1]) !== null && _a !== void 0 ? _a : ''; });
205
+ if (!sameStrings(routeNames, Object.keys(pathProperties !== null && pathProperties !== void 0 ? pathProperties : {})) ||
206
+ !sameStrings(routeNames, (_c = (_b = (_a = definition.request) === null || _a === void 0 ? void 0 : _a.path) === null || _b === void 0 ? void 0 : _b.jsonSchema.required) !== null && _c !== void 0 ? _c : [])) {
207
+ throw new ApiContractError('api-contract-invalid', 'Route parameters must exactly match required request path fields.');
208
+ }
209
+ if (Object.keys(headerProperties !== null && headerProperties !== void 0 ? headerProperties : {}).some((name) => name !== name.toLowerCase() ||
210
+ reservedRequestHeaders.has(name.toLowerCase()) ||
211
+ name.toLowerCase().startsWith('x-amz-'))) {
212
+ throw new ApiContractError('api-contract-invalid', 'Declared request headers must be lowercase and cannot replace framework headers.');
213
+ }
214
+ if (definition.pagination) {
215
+ const cursorQuerySchema = queryProperties === null || queryProperties === void 0 ? void 0 : queryProperties[definition.pagination.cursorQueryParameter];
216
+ const limitQuerySchema = queryProperties === null || queryProperties === void 0 ? void 0 : queryProperties[definition.pagination.limitQueryParameter];
217
+ if (!cursorQuerySchema || !limitQuerySchema) {
218
+ throw new ApiContractError('api-contract-invalid', 'Pagination parameters must exist in the request query schema.');
219
+ }
220
+ const responseProperties = objectSchemaProperties(definition.response.body, 'Paginated response');
221
+ const cursorResponseSchema = responseProperties === null || responseProperties === void 0 ? void 0 : responseProperties[definition.pagination.cursorResponseField];
222
+ if (!cursorResponseSchema) {
223
+ throw new ApiContractError('api-contract-invalid', 'The pagination cursor field must exist in the response schema.');
224
+ }
225
+ if (cursorQuerySchema.type !== 'string' ||
226
+ cursorResponseSchema.type !== 'string' ||
227
+ !Number.isSafeInteger(cursorQuerySchema.maxLength) ||
228
+ cursorQuerySchema.maxLength < 1 ||
229
+ cursorQuerySchema.maxLength > 4096 ||
230
+ JSON.stringify(cursorQuerySchema) !== JSON.stringify(cursorResponseSchema)) {
231
+ throw new ApiContractError('api-contract-invalid', 'Pagination request and response cursors must use the same bounded string schema.');
232
+ }
233
+ if (limitQuerySchema.type !== 'integer' ||
234
+ limitQuerySchema.minimum !== definition.pagination.minimumLimit ||
235
+ limitQuerySchema.maximum !== definition.pagination.maximumLimit) {
236
+ throw new ApiContractError('api-contract-invalid', 'The pagination limit schema must exactly match the declared integer limits.');
237
+ }
238
+ const requestRequired = new Set((_f = (_e = (_d = definition.request) === null || _d === void 0 ? void 0 : _d.query) === null || _e === void 0 ? void 0 : _e.jsonSchema.required) !== null && _f !== void 0 ? _f : []);
239
+ const responseRequired = new Set((_g = definition.response.body.jsonSchema.required) !== null && _g !== void 0 ? _g : []);
240
+ if (requestRequired.has(definition.pagination.cursorQueryParameter) ||
241
+ requestRequired.has(definition.pagination.limitQueryParameter) ||
242
+ responseRequired.has(definition.pagination.cursorResponseField)) {
243
+ throw new ApiContractError('api-contract-invalid', 'Pagination cursors and limits must be optional at the transport boundary.');
244
+ }
245
+ }
246
+ }
247
+ function requireExactVersion(value, label) {
248
+ if (typeof value !== 'string' ||
249
+ value.length > 256 ||
250
+ !semanticVersionPattern.test(value)) {
251
+ throw new ApiContractError('api-contract-invalid', `${label} must be an exact semantic version.`);
252
+ }
253
+ }
254
+ function requireBoundedToken(value, label) {
255
+ if (!tokenPattern.test(value)) {
256
+ throw new ApiContractError('api-contract-invalid', `${label} must be a bounded machine-readable token.`);
257
+ }
258
+ }
259
+ function validateDeprecation(lifecycle) {
260
+ requireExactRecordKeys(lifecycle, (lifecycle === null || lifecycle === void 0 ? void 0 : lifecycle.status) === 'deprecated' ? ['deprecation', 'status'] : ['status'], 'API operation lifecycle metadata');
261
+ if (lifecycle.status === 'active') {
262
+ return;
263
+ }
264
+ if (lifecycle.status !== 'deprecated' ||
265
+ !lifecycle.deprecation ||
266
+ typeof lifecycle.deprecation !== 'object') {
267
+ throw new ApiContractError('api-contract-invalid', 'API operation lifecycle status is invalid.');
268
+ }
269
+ const value = lifecycle.deprecation;
270
+ requireExactRecordKeys(value, [
271
+ 'earliestRemovalDate',
272
+ 'earliestRemovalVersion',
273
+ 'evidence',
274
+ 'firstDeprecatedVersion',
275
+ 'knownConsumers',
276
+ 'migration',
277
+ 'owner',
278
+ 'replacement',
279
+ ], 'API operation deprecation metadata', ['earliestRemovalDate', 'earliestRemovalVersion']);
280
+ if (typeof value.firstDeprecatedVersion !== 'string' ||
281
+ typeof value.evidence !== 'string' ||
282
+ typeof value.migration !== 'string' ||
283
+ typeof value.owner !== 'string' ||
284
+ typeof value.replacement !== 'string' ||
285
+ !Array.isArray(value.knownConsumers) ||
286
+ value.knownConsumers.some((consumer) => typeof consumer !== 'string') ||
287
+ (value.earliestRemovalDate !== undefined &&
288
+ typeof value.earliestRemovalDate !== 'string') ||
289
+ (value.earliestRemovalVersion !== undefined &&
290
+ typeof value.earliestRemovalVersion !== 'string')) {
291
+ throw new ApiContractError('api-contract-invalid', 'API operation deprecation metadata is invalid.');
292
+ }
293
+ requireExactVersion(value.firstDeprecatedVersion, 'First deprecated version');
294
+ if (value.earliestRemovalVersion) {
295
+ requireExactVersion(value.earliestRemovalVersion, 'Earliest removal version');
296
+ }
297
+ if (value.earliestRemovalDate) {
298
+ const parsed = Date.parse(value.earliestRemovalDate);
299
+ if (!Number.isFinite(parsed) ||
300
+ !/^\d{4}-\d{2}-\d{2}$/.test(value.earliestRemovalDate) ||
301
+ new Date(parsed).toISOString().slice(0, 10) !== value.earliestRemovalDate) {
302
+ throw new ApiContractError('api-contract-invalid', 'Earliest removal date must use YYYY-MM-DD.');
303
+ }
304
+ }
305
+ if (!value.earliestRemovalDate && !value.earliestRemovalVersion) {
306
+ throw new ApiContractError('api-contract-invalid', 'A deprecated operation must declare an earliest removal date or version.');
307
+ }
308
+ for (const [label, token] of [
309
+ ['Deprecation evidence', value.evidence],
310
+ ['Deprecation migration', value.migration],
311
+ ['Deprecation owner', value.owner],
312
+ ['Deprecation replacement', value.replacement],
313
+ ...value.knownConsumers.map((consumer) => ['Known consumer', consumer]),
314
+ ]) {
315
+ requireBoundedToken(token, label);
316
+ }
317
+ if (new Set(value.knownConsumers).size !== value.knownConsumers.length) {
318
+ throw new ApiContractError('api-contract-invalid', 'Known consumers must not contain duplicates.');
319
+ }
320
+ }
321
+ function validatePagination(value) {
322
+ if (!value)
323
+ return;
324
+ requireExactRecordKeys(value, [
325
+ 'cursorQueryParameter',
326
+ 'cursorResponseField',
327
+ 'defaultLimit',
328
+ 'expirySeconds',
329
+ 'limitQueryParameter',
330
+ 'maximumLimit',
331
+ 'minimumLimit',
332
+ 'stability',
333
+ ], 'API operation pagination metadata', ['expirySeconds']);
334
+ if (!['eventual', 'snapshot'].includes(value.stability) ||
335
+ value.cursorQueryParameter === value.limitQueryParameter) {
336
+ throw new ApiContractError('api-contract-invalid', 'Pagination parameters and stability are invalid.');
337
+ }
338
+ for (const [label, member] of [
339
+ ['Cursor query parameter', value.cursorQueryParameter],
340
+ ['Cursor response field', value.cursorResponseField],
341
+ ['Limit query parameter', value.limitQueryParameter],
342
+ ]) {
343
+ requireBoundedToken(member, label);
344
+ }
345
+ if (!Number.isSafeInteger(value.minimumLimit) ||
346
+ !Number.isSafeInteger(value.maximumLimit) ||
347
+ !Number.isSafeInteger(value.defaultLimit) ||
348
+ value.minimumLimit < 1 ||
349
+ value.minimumLimit > value.defaultLimit ||
350
+ value.defaultLimit > value.maximumLimit ||
351
+ (value.expirySeconds !== undefined &&
352
+ (!Number.isSafeInteger(value.expirySeconds) || value.expirySeconds < 1))) {
353
+ throw new ApiContractError('api-contract-invalid', 'Pagination limits and expiry must be positive ordered safe integers.');
354
+ }
355
+ }
356
+ function validateIdempotency(value) {
357
+ if (value) {
358
+ requireExactRecordKeys(value, [
359
+ 'concurrentDuplicate',
360
+ 'keyHeader',
361
+ 'maxKeyLength',
362
+ 'mismatch',
363
+ 'replay',
364
+ 'requestFingerprint',
365
+ 'required',
366
+ 'retentionSeconds',
367
+ 'scope',
368
+ ], 'API operation idempotency metadata');
369
+ }
370
+ if (value &&
371
+ ((value.concurrentDuplicate !== 'conflict' &&
372
+ value.concurrentDuplicate !== 'wait') ||
373
+ value.keyHeader !== 'idempotency-key' ||
374
+ value.mismatch !== 'conflict' ||
375
+ typeof value.required !== 'boolean' ||
376
+ value.replay !== 'same-response' ||
377
+ value.requestFingerprint !== 'canonical-json' ||
378
+ value.scope !== 'principal-operation' ||
379
+ !Number.isSafeInteger(value.maxKeyLength) ||
380
+ value.maxKeyLength < 1 ||
381
+ value.maxKeyLength > 512 ||
382
+ !Number.isSafeInteger(value.retentionSeconds) ||
383
+ value.retentionSeconds < 1)) {
384
+ throw new ApiContractError('api-contract-invalid', 'Idempotency key length and retention must be bounded positive integers.');
385
+ }
386
+ }
387
+ function containsAsciiControlOrSpace(value) {
388
+ for (const character of value) {
389
+ const codePoint = character.codePointAt(0);
390
+ if (codePoint !== undefined && (codePoint <= 0x20 || codePoint === 0x7f)) {
391
+ return true;
392
+ }
393
+ }
394
+ return false;
395
+ }
396
+ function isHttpsProblemType(value) {
397
+ if (value !== value.trim() || containsAsciiControlOrSpace(value))
398
+ return false;
399
+ try {
400
+ const url = new URL(value);
401
+ return (url.protocol === 'https:' &&
402
+ url.username === '' &&
403
+ url.password === '' &&
404
+ url.hash === '');
405
+ }
406
+ catch (_a) {
407
+ return false;
408
+ }
409
+ }
410
+ export function defineApiOperation(definition) {
411
+ var _a, _b, _c, _d, _e;
412
+ requireExactRecordKeys(definition, [
413
+ 'authentication',
414
+ 'authorizationActions',
415
+ 'conditionalWrite',
416
+ 'contractVersion',
417
+ 'feature',
418
+ 'idempotency',
419
+ 'lifecycle',
420
+ 'method',
421
+ 'operationId',
422
+ 'pagination',
423
+ 'path',
424
+ 'problems',
425
+ 'request',
426
+ 'response',
427
+ 'responseProfile',
428
+ 'slice',
429
+ 'summary',
430
+ ], 'API operation definition', ['conditionalWrite', 'idempotency', 'pagination', 'request']);
431
+ if (!definition ||
432
+ typeof definition !== 'object' ||
433
+ typeof definition.slice !== 'string' ||
434
+ !slicePattern.test(definition.slice) ||
435
+ typeof definition.operationId !== 'string' ||
436
+ !operationIdPattern.test(definition.operationId) ||
437
+ definition.operationId.length > 256 ||
438
+ !definition.operationId.startsWith(`${definition.slice}.`) ||
439
+ typeof definition.feature !== 'string' ||
440
+ !featurePattern.test(definition.feature) ||
441
+ typeof definition.path !== 'string' ||
442
+ !routePattern.test(definition.path) ||
443
+ definition.path.length > 512 ||
444
+ definition.path
445
+ .split('/')
446
+ .some((segment) => segment === '.' || segment === '..') ||
447
+ typeof definition.summary !== 'string' ||
448
+ definition.summary.trim() === '' ||
449
+ definition.summary !== definition.summary.trim() ||
450
+ /[\r\n]/.test(definition.summary) ||
451
+ definition.summary.length > 256 ||
452
+ !authenticationModes.has(definition.authentication) ||
453
+ !httpMethods.has(definition.method) ||
454
+ definition.responseProfile !== EBK_APP_V1_RESPONSE_PROFILE ||
455
+ !definition.response ||
456
+ !isApiSchema(definition.response.body) ||
457
+ !Number.isSafeInteger(definition.response.status) ||
458
+ definition.response.status < 200 ||
459
+ definition.response.status > 299 ||
460
+ definition.response.status === 204 ||
461
+ definition.response.status === 205) {
462
+ throw new ApiContractError('api-operation-identity-invalid', 'API operation identity, Slice, feature, route, summary, success status, or response profile is invalid.');
463
+ }
464
+ requireExactVersion(definition.contractVersion, 'Operation contract version');
465
+ if (!Array.isArray(definition.authorizationActions) ||
466
+ new Set(definition.authorizationActions).size !==
467
+ definition.authorizationActions.length ||
468
+ definition.authorizationActions.some((action) => !actionPattern.test(action) ||
469
+ !action.startsWith(`${definition.slice}:`)) ||
470
+ (definition.authentication === 'anonymous' &&
471
+ definition.authorizationActions.length > 0) ||
472
+ (definition.authentication !== 'anonymous' &&
473
+ definition.authorizationActions.length === 0)) {
474
+ throw new ApiContractError('api-contract-invalid', 'Authorization actions must be unique Slice action tokens; anonymous operations require none and protected operations require at least one.');
475
+ }
476
+ const maxBodyBytes = (_b = (_a = definition.request) === null || _a === void 0 ? void 0 : _a.maxBodyBytes) !== null && _b !== void 0 ? _b : DEFAULT_API_BODY_MAX_BYTES;
477
+ if (!Number.isSafeInteger(maxBodyBytes) ||
478
+ maxBodyBytes < 1 ||
479
+ maxBodyBytes > DEFAULT_API_BODY_MAX_BYTES) {
480
+ throw new ApiContractError('api-contract-invalid', `Request body bounds must be from 1 through ${DEFAULT_API_BODY_MAX_BYTES} bytes.`);
481
+ }
482
+ if (!((_c = definition.request) === null || _c === void 0 ? void 0 : _c.body) &&
483
+ ((_d = definition.request) === null || _d === void 0 ? void 0 : _d.maxBodyBytes) !== undefined) {
484
+ throw new ApiContractError('api-contract-invalid', 'A body byte limit is valid only when a request body schema exists.');
485
+ }
486
+ if (definition.method === 'GET' && ((_e = definition.request) === null || _e === void 0 ? void 0 : _e.body)) {
487
+ throw new ApiContractError('api-contract-invalid', 'GET operations cannot declare a request body.');
488
+ }
489
+ if (definition.idempotency &&
490
+ !['POST', 'PATCH'].includes(definition.method)) {
491
+ throw new ApiContractError('api-contract-invalid', 'An idempotency contract is valid only for POST or PATCH commands.');
492
+ }
493
+ if (definition.conditionalWrite &&
494
+ (!['DELETE', 'PATCH', 'PUT'].includes(definition.method) ||
495
+ definition.conditionalWrite.kind !== 'etag' ||
496
+ definition.conditionalWrite.requestHeader !== 'if-match' ||
497
+ typeof definition.conditionalWrite.required !== 'boolean' ||
498
+ definition.conditionalWrite.responseHeader !== 'etag')) {
499
+ throw new ApiContractError('api-contract-invalid', 'A conditional-write contract is valid only for DELETE, PATCH, or PUT.');
500
+ }
501
+ if (definition.conditionalWrite) {
502
+ requireExactRecordKeys(definition.conditionalWrite, ['kind', 'requestHeader', 'required', 'responseHeader'], 'API operation conditional-write metadata');
503
+ }
504
+ validateIdempotency(definition.idempotency);
505
+ validatePagination(definition.pagination);
506
+ validateDeprecation(definition.lifecycle);
507
+ validateRequestSchemas(definition);
508
+ if (!Array.isArray(definition.problems)) {
509
+ throw new ApiContractError('api-contract-invalid', 'API operation problems must be an array.');
510
+ }
511
+ const problemCodes = new Set();
512
+ const problemTypes = new Set();
513
+ for (const problem of definition.problems) {
514
+ requireExactRecordKeys(problem, ['code', 'details', 'message', 'retryable', 'status', 'type'], `API operation ${definition.operationId} problem metadata`, ['details']);
515
+ if (!problem ||
516
+ typeof problem !== 'object' ||
517
+ typeof problem.code !== 'string' ||
518
+ !problemCodePattern.test(problem.code) ||
519
+ frameworkProblemCodes.has(problem.code) ||
520
+ typeof problem.type !== 'string' ||
521
+ !isHttpsProblemType(problem.type) ||
522
+ problem.type.length > 256 ||
523
+ typeof problem.message !== 'string' ||
524
+ problem.message.trim() === '' ||
525
+ problem.message !== problem.message.trim() ||
526
+ /[\r\n]/.test(problem.message) ||
527
+ problem.message.length > 256 ||
528
+ typeof problem.retryable !== 'boolean' ||
529
+ !Number.isSafeInteger(problem.status) ||
530
+ problem.status < 400 ||
531
+ problem.status > 599 ||
532
+ (problem.details !== undefined &&
533
+ (!isApiSchema(problem.details) ||
534
+ problem.details.jsonSchema.type !== 'object' ||
535
+ problem.details.jsonSchema.additionalProperties !== false)) ||
536
+ problemCodes.has(problem.code) ||
537
+ problemTypes.has(problem.type)) {
538
+ throw new ApiContractError('api-operation-identity-invalid', `API operation ${definition.operationId} has an invalid or reused problem identity.`);
539
+ }
540
+ problemCodes.add(problem.code);
541
+ problemTypes.add(problem.type);
542
+ }
543
+ requireExactRecordKeys(definition.response, ['body', 'status'], 'API operation response metadata');
544
+ const lifecycle = definition.lifecycle.status === 'deprecated'
545
+ ? Object.freeze({
546
+ deprecation: Object.freeze(Object.assign(Object.assign({}, definition.lifecycle.deprecation), { knownConsumers: Object.freeze([
547
+ ...definition.lifecycle.deprecation.knownConsumers,
548
+ ]) })),
549
+ status: 'deprecated',
550
+ })
551
+ : Object.freeze({ status: 'active' });
552
+ return Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, definition), { authorizationActions: Object.freeze([...definition.authorizationActions]) }), (definition.conditionalWrite
553
+ ? {
554
+ conditionalWrite: Object.freeze(Object.assign({}, definition.conditionalWrite)),
555
+ }
556
+ : {})), (definition.idempotency
557
+ ? { idempotency: Object.freeze(Object.assign({}, definition.idempotency)) }
558
+ : {})), { lifecycle }), (definition.pagination
559
+ ? { pagination: Object.freeze(Object.assign({}, definition.pagination)) }
560
+ : {})), { problems: Object.freeze(definition.problems.map((problem) => Object.freeze(Object.assign({}, problem)))), request: definition.request
561
+ ? Object.freeze(Object.assign(Object.assign({}, definition.request), (definition.request.body ? { maxBodyBytes } : {})))
562
+ : undefined, response: Object.freeze(Object.assign({}, definition.response)) }));
563
+ }
564
+ export function defineApiContract(options) {
565
+ requireExactRecordKeys(options, ['operations', 'schemaVersion', 'slice', 'title', 'version'], 'API contract definition', ['schemaVersion']);
566
+ if (!options ||
567
+ typeof options !== 'object' ||
568
+ typeof options.slice !== 'string' ||
569
+ !slicePattern.test(options.slice) ||
570
+ typeof options.title !== 'string' ||
571
+ options.title.trim() === '' ||
572
+ options.title !== options.title.trim() ||
573
+ /[\r\n]/.test(options.title) ||
574
+ options.title.length > 256 ||
575
+ (options.schemaVersion !== undefined &&
576
+ options.schemaVersion !== API_CONTRACT_SCHEMA_VERSION) ||
577
+ !Array.isArray(options.operations) ||
578
+ options.operations.length === 0) {
579
+ throw new ApiContractError('api-contract-invalid', 'API contract requires a bounded title and normalized Slice.');
580
+ }
581
+ requireExactVersion(options.version, 'API contract version');
582
+ const operations = options.operations.map((operation) => defineApiOperation(operation));
583
+ const identities = new Set();
584
+ const routes = new Set();
585
+ for (const operation of operations) {
586
+ if (operation.slice !== options.slice ||
587
+ operation.contractVersion !== options.version) {
588
+ throw new ApiContractError('api-contract-invalid', 'Every operation must use its containing contract Slice and version.');
589
+ }
590
+ const route = `${operation.method} ${operation.path}`;
591
+ if (identities.has(operation.operationId) || routes.has(route)) {
592
+ throw new ApiContractError('api-operation-identity-invalid', 'API contracts cannot reuse an operation identity or method/route pair.');
593
+ }
594
+ identities.add(operation.operationId);
595
+ routes.add(route);
596
+ }
597
+ return Object.freeze({
598
+ operations: Object.freeze([...operations].sort((left, right) => left.operationId < right.operationId
599
+ ? -1
600
+ : left.operationId > right.operationId
601
+ ? 1
602
+ : 0)),
603
+ schemaVersion: API_CONTRACT_SCHEMA_VERSION,
604
+ slice: options.slice,
605
+ title: options.title.trim(),
606
+ version: options.version,
607
+ });
608
+ }
609
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/api-contract/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,6BAA6B,GAE9B,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,2BAA2B,GAAG,YAAqB,CAAC;AACjE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAU,CAAC;AACtD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,CAAC;AAyHrD,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AACjE,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAChD,MAAM,aAAa,GAAG,6CAA6C,CAAC;AACpE,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AACpD,MAAM,sBAAsB,GAC1B,kDAAkD,CAAC;AACrD,MAAM,YAAY,GAChB,iGAAiG,CAAC;AACpG,MAAM,YAAY,GAAG,uCAAuC,CAAC;AAC7D,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAwB;IACzD,WAAW;IACX,UAAU;IACV,UAAU;IACV,UAAU;IACV,eAAe;CAChB,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAgB;IACzC,QAAQ;IACR,KAAK;IACL,OAAO;IACP,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,gBAAgB;IAChB,iBAAiB;IACjB,oBAAoB;CACrB,CAAC,CAAC;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,QAAQ;IACR,MAAM;IACN,iBAAiB;IACjB,UAAU;IACV,qBAAqB;IACrB,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;CACf,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CACtC,2CAA2C,CAC5C,CAAC;AAEF,SAAS,sBAAsB,CAC7B,KAAc,EACd,WAA8B,EAC9B,KAAa,EACb,eAAkC,EAAE;IAEpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,qBAAqB,CAC9B,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,sCAAsC,CAC/C,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAc,WAAW,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,gCAAgC,UAAU;aAC/C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAC9D,IAAI,EAAE;aACN,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB,CAAC;IACJ,CAAC;IACD,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAChB,CAAC,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,CAAA;gBACtB,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,6CAA6C,CACtD,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,CAC3E,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,kCAAkC,CAC3C,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAC1E,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,gCAAgC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,CACL,OAAO,CAAC,KAAK,CAAC;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAQ,KAA4B,CAAC,KAAK,KAAK,UAAU;QACzD,OAAQ,KAA4B,CAAC,aAAa,KAAK,UAAU;QACjE,OAAQ,KAA4B,CAAC,OAAO,KAAK,UAAU;QAC3D,OAAO,CAAE,KAA4B,CAAC,UAAU,CAAC;QACjD,OAAQ,KAA4B,CAAC,UAAU,KAAK,QAAQ;QAC3D,KAAsC,CAAC,qBAAqB,CAAC,KAAK,IAAI,CACxE,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAqC,EACrC,KAAa;IAEb,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IACE,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;QAClC,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;QAC5B,KAAK,CAAC,UAAU,CAAC,oBAAoB,KAAK,KAAK,EAC/C,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,kCAAkC,CAC3C,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;AACrC,CAAC;AAID,SAAS,mBAAmB,CAC1B,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAE,IAA+B;QAClC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA8B;IAClE,OAAO,CACL,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,KAAK,CAAC,WAAW,CAAY,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM;QAC1B,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACjE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;YACxB,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CACjB,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAC5D,CAAC,CACL,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,KAA8B;IAE9B,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,KAAK,4BAA4B;QAChD,KAAK,CAAC,SAAS,CAAC,KAAK,6BAA6B;QAClD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,CAAC,WAAW,CAAY,IAAI,CAAC;QACnC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,CAAC,WAAW,CAAY,IAAI,gCAAgC,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAClC,UAAyD,EACzD,KAAa,EACb,OAKC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,EAAE,CAAC;QAC7D,MAAM,MAAM,GACV,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAChC,CAAC,CAAE,KAIC;YACJ,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,cAAc,GAClB,OAAO,CAAC,MAAM;YACd,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,MAAK,OAAO;YACxB,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;QAClD,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,aAAa,IAAI,+BACvB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EACzD,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IACE,MAAM,KAAK,QAAQ;YACnB,OAAO,CAAC,sBAAsB;YAC9B,MAAM;YACN,CAAC,gCAAgC,CAAC,MAAM,CAAC,EACzC,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,aAAa,IAAI,yDAAyD,CACnF,CAAC;QACJ,CAAC;QACD,IACE,MAAM,KAAK,QAAQ;YACnB,OAAO,CAAC,eAAe;YACvB,MAAM;YACN,CAAC,4BAA4B,CAAC,MAAM,CAAC,EACrC,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,aAAa,IAAI,gCAAgC,CAC1D,CAAC;QACJ,CAAC;QACD,IACE,cAAc;YACd,OAAO,CAAC,cAAc;YACtB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC;gBACrC,MAAM,CAAC,QAAmB,GAAG,CAAC,CAAC,EAClC,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,aAAa,IAAI,wCAAwC,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,IAAuB,EACvB,KAAwB;IAExB,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkC;;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,sBAAsB,CACpB,OAAO,EACP,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EACpD,gCAAgC,EAChC,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CACrD,CAAC;IACF,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC;QAC9B,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC;QACpC,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC;QAC9B,CAAC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC;KACxB,EAAE,CAAC;QACX,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,8BAA8B,CACvC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,sBAAsB,CAC5C,OAAO,CAAC,KAAK,EACb,eAAe,CAChB,CAAC;IACF,MAAM,gBAAgB,GAAG,sBAAsB,CAC7C,OAAO,CAAC,OAAO,EACf,iBAAiB,CAClB,CAAC;IACF,2BAA2B,CAAC,cAAc,EAAE,cAAc,EAAE;QAC1D,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,2BAA2B,CAAC,eAAe,EAAE,eAAe,EAAE;QAC5D,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IACH,2BAA2B,CAAC,gBAAgB,EAAE,gBAAgB,EAAE;QAC9D,MAAM,EAAE,KAAK;QACb,sBAAsB,EAAE,IAAI;KAC7B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAClE,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAA,EAAA,CAC1B,CAAC;IACF,IACE,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,CAAC,CAAC;QAC3D,CAAC,WAAW,CACV,UAAU,EACV,MAAA,MAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,IAAI,0CAAE,UAAU,CAAC,QAAQ,mCAAI,EAAE,CACpD,EACD,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,IACE,MAAM,CAAC,IAAI,CAAC,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,EAAE,CAAC,CAAC,IAAI,CACtC,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;QAC3B,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC1C,EACD,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,iBAAiB,GAAG,eAAe,aAAf,eAAe,uBAAf,eAAe,CACvC,UAAU,CAAC,UAAU,CAAC,oBAAoB,CAM/B,CAAC;QACd,MAAM,gBAAgB,GAAG,eAAe,aAAf,eAAe,uBAAf,eAAe,CACtC,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAO9B,CAAC;QACd,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,+DAA+D,CAChE,CAAC;QACJ,CAAC;QACD,MAAM,kBAAkB,GAAG,sBAAsB,CAC/C,UAAU,CAAC,QAAQ,CAAC,IAAI,EACxB,oBAAoB,CACrB,CAAC;QACF,MAAM,oBAAoB,GAAG,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAC7C,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAM9B,CAAC;QACd,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,gEAAgE,CACjE,CAAC;QACJ,CAAC;QACD,IACE,iBAAiB,CAAC,IAAI,KAAK,QAAQ;YACnC,oBAAoB,CAAC,IAAI,KAAK,QAAQ;YACtC,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC;YACjD,iBAAiB,CAAC,SAAoB,GAAG,CAAC;YAC1C,iBAAiB,CAAC,SAAoB,GAAG,IAAI;YAC9C,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAC1E,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,kFAAkF,CACnF,CAAC;QACJ,CAAC;QACD,IACE,gBAAgB,CAAC,IAAI,KAAK,SAAS;YACnC,gBAAgB,CAAC,OAAO,KAAK,UAAU,CAAC,UAAU,CAAC,YAAY;YAC/D,gBAAgB,CAAC,OAAO,KAAK,UAAU,CAAC,UAAU,CAAC,YAAY,EAC/D,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,MAAA,MAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,KAAK,0CAAE,UAAU,CAAC,QAAQ,mCAAI,EAAE,CACrD,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,MAAA,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,mCAAI,EAAE,CACnD,CAAC;QACF,IACE,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,oBAAoB,CAAC;YAC/D,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC9D,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAC/D,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,2EAA2E,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,GAAG,GAAG;QAClB,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,qCAAqC,CAC9C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,GAAG,KAAK,4CAA4C,CACrD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAgC;IAC3D,sBAAsB,CACpB,SAAS,EACT,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,MAAK,YAAY,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAC3E,kCAAkC,CACnC,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IACD,IACE,SAAS,CAAC,MAAM,KAAK,YAAY;QACjC,CAAC,SAAS,CAAC,WAAW;QACtB,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,EACzC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC;IACpC,sBAAsB,CACpB,KAAK,EACL;QACE,qBAAqB;QACrB,wBAAwB;QACxB,UAAU;QACV,wBAAwB;QACxB,gBAAgB;QAChB,WAAW;QACX,OAAO;QACP,aAAa;KACd,EACD,oCAAoC,EACpC,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAClD,CAAC;IACF,IACE,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ;QAChD,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QACpC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC;QACrE,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACtC,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ,CAAC;QAChD,CAAC,KAAK,CAAC,sBAAsB,KAAK,SAAS;YACzC,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ,CAAC,EACnD,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,gDAAgD,CACjD,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,KAAK,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACjC,mBAAmB,CACjB,KAAK,CAAC,sBAAsB,EAC5B,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACrD,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxB,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACtD,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,mBAAmB,EACzE,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,4CAA4C,CAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;QAChE,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;QAC3B,CAAC,sBAAsB,EAAE,KAAK,CAAC,QAAQ,CAAC;QACxC,CAAC,uBAAuB,EAAE,KAAK,CAAC,SAAS,CAAC;QAC1C,CAAC,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAAC;QAClC,CAAC,yBAAyB,EAAE,KAAK,CAAC,WAAW,CAAC;QAC9C,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CACzB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,gBAAgB,EAAE,QAAQ,CAAU,CACpD;KACO,EAAE,CAAC;QACX,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QACvE,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,8CAA8C,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,sBAAsB,CACpB,KAAK,EACL;QACE,sBAAsB;QACtB,qBAAqB;QACrB,cAAc;QACd,eAAe;QACf,qBAAqB;QACrB,cAAc;QACd,cAAc;QACd,WAAW;KACZ,EACD,mCAAmC,EACnC,CAAC,eAAe,CAAC,CAClB,CAAC;IACF,IACE,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QACnD,KAAK,CAAC,oBAAoB,KAAK,KAAK,CAAC,mBAAmB,EACxD,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,kDAAkD,CACnD,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI;QAC5B,CAAC,wBAAwB,EAAE,KAAK,CAAC,oBAAoB,CAAC;QACtD,CAAC,uBAAuB,EAAE,KAAK,CAAC,mBAAmB,CAAC;QACpD,CAAC,uBAAuB,EAAE,KAAK,CAAC,mBAAmB,CAAC;KAC5C,EAAE,CAAC;QACX,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,KAAK,CAAC,YAAY,GAAG,CAAC;QACtB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;QACvC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY;QACvC,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS;YAChC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAC1E,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,sEAAsE,CACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyC;IACpE,IAAI,KAAK,EAAE,CAAC;QACV,sBAAsB,CACpB,KAAK,EACL;YACE,qBAAqB;YACrB,WAAW;YACX,cAAc;YACd,UAAU;YACV,QAAQ;YACR,oBAAoB;YACpB,UAAU;YACV,kBAAkB;YAClB,OAAO;SACR,EACD,oCAAoC,CACrC,CAAC;IACJ,CAAC;IACD,IACE,KAAK;QACL,CAAC,CAAC,KAAK,CAAC,mBAAmB,KAAK,UAAU;YACxC,KAAK,CAAC,mBAAmB,KAAK,MAAM,CAAC;YACrC,KAAK,CAAC,SAAS,KAAK,iBAAiB;YACrC,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC7B,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS;YACnC,KAAK,CAAC,MAAM,KAAK,eAAe;YAChC,KAAK,CAAC,kBAAkB,KAAK,gBAAgB;YAC7C,KAAK,CAAC,KAAK,KAAK,qBAAqB;YACrC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;YACzC,KAAK,CAAC,YAAY,GAAG,CAAC;YACtB,KAAK,CAAC,YAAY,GAAG,GAAG;YACxB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC7C,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,yEAAyE,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAChD,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,2BAA2B,CAAC,KAAK,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,CACL,GAAG,CAAC,QAAQ,KAAK,QAAQ;YACzB,GAAG,CAAC,QAAQ,KAAK,EAAE;YACnB,GAAG,CAAC,QAAQ,KAAK,EAAE;YACnB,GAAG,CAAC,IAAI,KAAK,EAAE,CAChB,CAAC;IACJ,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAEhC,UAAsB;;IACtB,sBAAsB,CACpB,UAAU,EACV;QACE,gBAAgB;QAChB,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;QACjB,SAAS;QACT,aAAa;QACb,WAAW;QACX,QAAQ;QACR,aAAa;QACb,YAAY;QACZ,MAAM;QACN,UAAU;QACV,SAAS;QACT,UAAU;QACV,iBAAiB;QACjB,OAAO;QACP,SAAS;KACV,EACD,0BAA0B,EAC1B,CAAC,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAC7D,CAAC;IACF,IACE,CAAC,UAAU;QACX,OAAO,UAAU,KAAK,QAAQ;QAC9B,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ;QACpC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACpC,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ;QAC1C,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAChD,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG;QACnC,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC;QAC1D,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxC,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ;QACnC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG;QAC5B,UAAU,CAAC,IAAI;aACZ,KAAK,CAAC,GAAG,CAAC;aACV,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC;QACzD,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAChC,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE;QAChD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACjC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;QAC/B,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;QACnD,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QACnC,UAAU,CAAC,eAAe,KAAK,2BAA2B;QAC1D,CAAC,UAAU,CAAC,QAAQ;QACpB,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtC,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjD,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG;QAChC,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG;QAChC,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;QAClC,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAClC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,gCAAgC,EAChC,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE,4BAA4B,CAAC,CAAC;IAC9E,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,IAAI;YAC3C,UAAU,CAAC,oBAAoB,CAAC,MAAM;QACxC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAClC,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAC7C;QACD,CAAC,UAAU,CAAC,cAAc,KAAK,WAAW;YACxC,UAAU,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7C,CAAC,UAAU,CAAC,cAAc,KAAK,WAAW;YACxC,UAAU,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,EAC/C,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,4IAA4I,CAC7I,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAChB,MAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,YAAY,mCAAI,0BAA0B,CAAC;IACjE,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC;QACnC,YAAY,GAAG,CAAC;QAChB,YAAY,GAAG,0BAA0B,EACzC,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,8CAA8C,0BAA0B,SAAS,CAClF,CAAC;IACJ,CAAC;IACD,IACE,CAAC,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,IAAI,CAAA;QACzB,CAAA,MAAA,UAAU,CAAC,OAAO,0CAAE,YAAY,MAAK,SAAS,EAC9C,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,KAAI,MAAA,UAAU,CAAC,OAAO,0CAAE,IAAI,CAAA,EAAE,CAAC;QAC5D,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,IACE,UAAU,CAAC,WAAW;QACtB,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAC9C,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,IACE,UAAU,CAAC,gBAAgB;QAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YACtD,UAAU,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM;YAC3C,UAAU,CAAC,gBAAgB,CAAC,aAAa,KAAK,UAAU;YACxD,OAAO,UAAU,CAAC,gBAAgB,CAAC,QAAQ,KAAK,SAAS;YACzD,UAAU,CAAC,gBAAgB,CAAC,cAAc,KAAK,MAAM,CAAC,EACxD,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAChC,sBAAsB,CACpB,UAAU,CAAC,gBAAgB,EAC3B,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,CAAC,EACvD,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5C,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC1C,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC1C,sBAAsB,CACpB,OAAO,EACP,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC7D,iBAAiB,UAAU,CAAC,WAAW,mBAAmB,EAC1D,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,IACE,CAAC,OAAO;YACR,OAAO,OAAO,KAAK,QAAQ;YAC3B,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAChC,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACtC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACvC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAChC,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG;YACzB,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YACnC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;YAC7B,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;YAC1C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;YAC5B,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS;YACtC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YACrC,OAAO,CAAC,MAAM,GAAG,GAAG;YACpB,OAAO,CAAC,MAAM,GAAG,GAAG;YACpB,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;gBAC5B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;oBAC5B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;oBAC5C,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,KAAK,KAAK,CAAC,CAAC;YAC/D,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAC9B,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,gCAAgC,EAChC,iBAAiB,UAAU,CAAC,WAAW,6CAA6C,CACrF,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,sBAAsB,CACpB,UAAU,CAAC,QAAQ,EACnB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClB,iCAAiC,CAClC,CAAC;IACF,MAAM,SAAS,GACb,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,YAAY;QAC1C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACZ,WAAW,EAAE,MAAM,CAAC,MAAM,iCACrB,UAAU,CAAC,SAAS,CAAC,WAAW,KACnC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;oBAC5B,GAAG,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc;iBACnD,CAAC,IACF;YACF,MAAM,EAAE,YAAqB;SAC9B,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,uGACf,UAAU,KACb,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC,KACtE,CAAC,UAAU,CAAC,gBAAgB;QAC7B,CAAC,CAAC;YACE,gBAAgB,EAAE,MAAM,CAAC,MAAM,mBAC1B,UAAU,CAAC,gBAAgB,EAC9B;SACH;QACH,CAAC,CAAC,EAAE,CAAC,GACJ,CAAC,UAAU,CAAC,WAAW;QACxB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,mBAAM,UAAU,CAAC,WAAW,EAAG,EAAE;QAC/D,CAAC,CAAC,EAAE,CAAC,KACP,SAAS,KACN,CAAC,UAAU,CAAC,UAAU;QACvB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,mBAAM,UAAU,CAAC,UAAU,EAAG,EAAE;QAC7D,CAAC,CAAC,EAAE,CAAC,KACP,QAAQ,EAAE,MAAM,CAAC,MAAM,CACrB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,mBAAM,OAAO,EAAG,CAAC,CACpE,EACD,OAAO,EAAE,UAAU,CAAC,OAAO;YACzB,CAAC,CAAC,MAAM,CAAC,MAAM,iCACR,UAAU,CAAC,OAAO,GAClB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACpD;YACJ,CAAC,CAAC,SAAS,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,mBAAM,UAAU,CAAC,QAAQ,EAAG,IAC3B,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAE/B,OAMD;IACC,sBAAsB,CACpB,OAAO,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAC5D,yBAAyB,EACzB,CAAC,eAAe,CAAC,CAClB,CAAC;IACF,IACE,CAAC,OAAO;QACR,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;QACjC,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;QACjC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAC3B,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;QAC1B,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;YAClC,OAAO,CAAC,aAAa,KAAK,2BAA2B,CAAC;QACxD,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACtD,kBAAkB,CAAC,SAAS,CAAC,CAC9B,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IACE,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YACjC,SAAS,CAAC,eAAe,KAAK,OAAO,CAAC,OAAO,EAC7C,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,EACtB,qEAAqE,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,gBAAgB,CACxB,gCAAgC,EAChC,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,CACvB,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;YAClC,CAAC,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;gBACpC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CACR,CACF;QACD,aAAa,EAAE,2BAA2B;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAoE,CAAC;AACxE,CAAC"}