@smthrs/artifacts 0.0.0-stage → 1.0.0-rc.12

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 (171) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +175 -2
  4. package/dist/cjs/ArtifactBackupLease.d.ts +34 -0
  5. package/dist/cjs/ArtifactBackupLease.d.ts.map +1 -0
  6. package/dist/cjs/ArtifactBackupLease.js +183 -0
  7. package/dist/cjs/ArtifactBackupLease.js.map +7 -0
  8. package/dist/cjs/ArtifactStore.d.ts +129 -0
  9. package/dist/cjs/ArtifactStore.d.ts.map +1 -0
  10. package/dist/cjs/ArtifactStore.js +73 -0
  11. package/dist/cjs/ArtifactStore.js.map +7 -0
  12. package/dist/cjs/ArtifactStoreError.d.ts +82 -0
  13. package/dist/cjs/ArtifactStoreError.d.ts.map +1 -0
  14. package/dist/cjs/ArtifactStoreError.js +72 -0
  15. package/dist/cjs/ArtifactStoreError.js.map +7 -0
  16. package/dist/cjs/ArtifactStoreMetrics.d.ts +70 -0
  17. package/dist/cjs/ArtifactStoreMetrics.d.ts.map +1 -0
  18. package/dist/cjs/ArtifactStoreMetrics.js +51 -0
  19. package/dist/cjs/ArtifactStoreMetrics.js.map +7 -0
  20. package/dist/cjs/ArtifactSweep.d.ts +185 -0
  21. package/dist/cjs/ArtifactSweep.d.ts.map +1 -0
  22. package/dist/cjs/ArtifactSweep.js +171 -0
  23. package/dist/cjs/ArtifactSweep.js.map +7 -0
  24. package/dist/cjs/CombinedArtifacts.d.ts +103 -0
  25. package/dist/cjs/CombinedArtifacts.d.ts.map +1 -0
  26. package/dist/cjs/CombinedArtifacts.js +189 -0
  27. package/dist/cjs/CombinedArtifacts.js.map +7 -0
  28. package/dist/cjs/FileLease.d.ts +117 -0
  29. package/dist/cjs/FileLease.d.ts.map +1 -0
  30. package/dist/cjs/FileLease.js +208 -0
  31. package/dist/cjs/FileLease.js.map +7 -0
  32. package/dist/cjs/FileSystemArtifactStore.d.ts +93 -0
  33. package/dist/cjs/FileSystemArtifactStore.d.ts.map +1 -0
  34. package/dist/cjs/FileSystemArtifactStore.js +276 -0
  35. package/dist/cjs/FileSystemArtifactStore.js.map +7 -0
  36. package/dist/cjs/MemoryArtifactStore.d.ts +25 -0
  37. package/dist/cjs/MemoryArtifactStore.d.ts.map +1 -0
  38. package/dist/cjs/MemoryArtifactStore.js +84 -0
  39. package/dist/cjs/MemoryArtifactStore.js.map +7 -0
  40. package/dist/cjs/NoopArtifactStore.d.ts +17 -0
  41. package/dist/cjs/NoopArtifactStore.d.ts.map +1 -0
  42. package/dist/cjs/NoopArtifactStore.js +46 -0
  43. package/dist/cjs/NoopArtifactStore.js.map +7 -0
  44. package/dist/cjs/RemoteArtifacts.d.ts +237 -0
  45. package/dist/cjs/RemoteArtifacts.d.ts.map +1 -0
  46. package/dist/cjs/RemoteArtifacts.js +405 -0
  47. package/dist/cjs/RemoteArtifacts.js.map +7 -0
  48. package/dist/cjs/index.d.ts +65 -0
  49. package/dist/cjs/index.d.ts.map +1 -0
  50. package/dist/cjs/index.js +47 -0
  51. package/dist/cjs/index.js.map +7 -0
  52. package/dist/cjs/internal/ArtifactLocks.d.ts +30 -0
  53. package/dist/cjs/internal/ArtifactLocks.d.ts.map +1 -0
  54. package/dist/cjs/internal/ArtifactLocks.js +93 -0
  55. package/dist/cjs/internal/ArtifactLocks.js.map +7 -0
  56. package/dist/cjs/internal/ArtifactPath.d.ts +19 -0
  57. package/dist/cjs/internal/ArtifactPath.d.ts.map +1 -0
  58. package/dist/cjs/internal/ArtifactPath.js +74 -0
  59. package/dist/cjs/internal/ArtifactPath.js.map +7 -0
  60. package/dist/cjs/measureBytes.d.ts +18 -0
  61. package/dist/cjs/measureBytes.d.ts.map +1 -0
  62. package/dist/cjs/measureBytes.js +43 -0
  63. package/dist/cjs/measureBytes.js.map +7 -0
  64. package/dist/cjs/package.json +1 -0
  65. package/dist/cjs/snapshotBytes.d.ts +19 -0
  66. package/dist/cjs/snapshotBytes.d.ts.map +1 -0
  67. package/dist/cjs/snapshotBytes.js +41 -0
  68. package/dist/cjs/snapshotBytes.js.map +7 -0
  69. package/dist/cjs/validateDigest.d.ts +22 -0
  70. package/dist/cjs/validateDigest.d.ts.map +1 -0
  71. package/dist/cjs/validateDigest.js +42 -0
  72. package/dist/cjs/validateDigest.js.map +7 -0
  73. package/dist/esm/ArtifactBackupLease.d.ts +34 -0
  74. package/dist/esm/ArtifactBackupLease.d.ts.map +1 -0
  75. package/dist/esm/ArtifactBackupLease.js +126 -0
  76. package/dist/esm/ArtifactBackupLease.js.map +1 -0
  77. package/dist/esm/ArtifactStore.d.ts +129 -0
  78. package/dist/esm/ArtifactStore.d.ts.map +1 -0
  79. package/dist/esm/ArtifactStore.js +83 -0
  80. package/dist/esm/ArtifactStore.js.map +1 -0
  81. package/dist/esm/ArtifactStoreError.d.ts +82 -0
  82. package/dist/esm/ArtifactStoreError.d.ts.map +1 -0
  83. package/dist/esm/ArtifactStoreError.js +77 -0
  84. package/dist/esm/ArtifactStoreError.js.map +1 -0
  85. package/dist/esm/ArtifactStoreMetrics.d.ts +70 -0
  86. package/dist/esm/ArtifactStoreMetrics.d.ts.map +1 -0
  87. package/dist/esm/ArtifactStoreMetrics.js +77 -0
  88. package/dist/esm/ArtifactStoreMetrics.js.map +1 -0
  89. package/dist/esm/ArtifactSweep.d.ts +185 -0
  90. package/dist/esm/ArtifactSweep.d.ts.map +1 -0
  91. package/dist/esm/ArtifactSweep.js +210 -0
  92. package/dist/esm/ArtifactSweep.js.map +1 -0
  93. package/dist/esm/CombinedArtifacts.d.ts +103 -0
  94. package/dist/esm/CombinedArtifacts.d.ts.map +1 -0
  95. package/dist/esm/CombinedArtifacts.js +214 -0
  96. package/dist/esm/CombinedArtifacts.js.map +1 -0
  97. package/dist/esm/FileLease.d.ts +117 -0
  98. package/dist/esm/FileLease.d.ts.map +1 -0
  99. package/dist/esm/FileLease.js +249 -0
  100. package/dist/esm/FileLease.js.map +1 -0
  101. package/dist/esm/FileSystemArtifactStore.d.ts +93 -0
  102. package/dist/esm/FileSystemArtifactStore.d.ts.map +1 -0
  103. package/dist/esm/FileSystemArtifactStore.js +336 -0
  104. package/dist/esm/FileSystemArtifactStore.js.map +1 -0
  105. package/dist/esm/MemoryArtifactStore.d.ts +25 -0
  106. package/dist/esm/MemoryArtifactStore.d.ts.map +1 -0
  107. package/dist/esm/MemoryArtifactStore.js +67 -0
  108. package/dist/esm/MemoryArtifactStore.js.map +1 -0
  109. package/dist/esm/NoopArtifactStore.d.ts +17 -0
  110. package/dist/esm/NoopArtifactStore.d.ts.map +1 -0
  111. package/dist/esm/NoopArtifactStore.js +27 -0
  112. package/dist/esm/NoopArtifactStore.js.map +1 -0
  113. package/dist/esm/RemoteArtifacts.d.ts +237 -0
  114. package/dist/esm/RemoteArtifacts.d.ts.map +1 -0
  115. package/dist/esm/RemoteArtifacts.js +557 -0
  116. package/dist/esm/RemoteArtifacts.js.map +1 -0
  117. package/dist/esm/index.d.ts +65 -0
  118. package/dist/esm/index.d.ts.map +1 -0
  119. package/dist/esm/index.js +65 -0
  120. package/dist/esm/index.js.map +1 -0
  121. package/dist/esm/internal/ArtifactLocks.d.ts +30 -0
  122. package/dist/esm/internal/ArtifactLocks.d.ts.map +1 -0
  123. package/dist/esm/internal/ArtifactLocks.js +86 -0
  124. package/dist/esm/internal/ArtifactLocks.js.map +1 -0
  125. package/dist/esm/internal/ArtifactPath.d.ts +19 -0
  126. package/dist/esm/internal/ArtifactPath.d.ts.map +1 -0
  127. package/dist/esm/internal/ArtifactPath.js +59 -0
  128. package/dist/esm/internal/ArtifactPath.js.map +1 -0
  129. package/dist/esm/measureBytes.d.ts +18 -0
  130. package/dist/esm/measureBytes.d.ts.map +1 -0
  131. package/dist/esm/measureBytes.js +22 -0
  132. package/dist/esm/measureBytes.js.map +1 -0
  133. package/dist/esm/snapshotBytes.d.ts +19 -0
  134. package/dist/esm/snapshotBytes.d.ts.map +1 -0
  135. package/dist/esm/snapshotBytes.js +30 -0
  136. package/dist/esm/snapshotBytes.js.map +1 -0
  137. package/dist/esm/validateDigest.d.ts +22 -0
  138. package/dist/esm/validateDigest.d.ts.map +1 -0
  139. package/dist/esm/validateDigest.js +26 -0
  140. package/dist/esm/validateDigest.js.map +1 -0
  141. package/docs/README.md +202 -0
  142. package/docs/api.md +484 -0
  143. package/docs/concepts/content-addressing.md +174 -0
  144. package/docs/concepts/coordination.md +141 -0
  145. package/docs/concepts/tiers.md +147 -0
  146. package/docs/guides/fence-a-backup.md +123 -0
  147. package/docs/guides/reclaim-disk-space.md +143 -0
  148. package/docs/guides/serve-the-artifact-protocol.md +140 -0
  149. package/docs/guides/share-artifacts-across-machines.md +180 -0
  150. package/docs/guides/test-against-an-artifact-store.md +158 -0
  151. package/docs/installation.md +102 -0
  152. package/docs/quickstart.md +183 -0
  153. package/docs/troubleshooting.md +232 -0
  154. package/package.json +179 -3
  155. package/src/ArtifactBackupLease.ts +223 -0
  156. package/src/ArtifactStore.ts +152 -0
  157. package/src/ArtifactStoreError.ts +96 -0
  158. package/src/ArtifactStoreMetrics.ts +83 -0
  159. package/src/ArtifactSweep.ts +346 -0
  160. package/src/CombinedArtifacts.ts +369 -0
  161. package/src/FileLease.ts +397 -0
  162. package/src/FileSystemArtifactStore.ts +459 -0
  163. package/src/MemoryArtifactStore.ts +83 -0
  164. package/src/NoopArtifactStore.ts +30 -0
  165. package/src/RemoteArtifacts.ts +814 -0
  166. package/src/index.ts +71 -0
  167. package/src/internal/ArtifactLocks.ts +110 -0
  168. package/src/internal/ArtifactPath.ts +72 -0
  169. package/src/measureBytes.ts +28 -0
  170. package/src/snapshotBytes.ts +34 -0
  171. package/src/validateDigest.ts +31 -0
@@ -0,0 +1,237 @@
1
+ /**
2
+ * The shared artifact tier: an {@link ArtifactStore.Service} spoken over HTTP.
3
+ *
4
+ * The wire protocol mirrors Bazel's dumb-HTTP remote cache, class
5
+ * `HttpCacheClient` in `com.google.devtools.build.lib.remote.http`, which
6
+ * documents it as: "CAS (Content Addressable Storage) blobs are stored under
7
+ * the path `/cas/base16-key`", uploaded with `PUT`, downloaded with `GET`. We add
8
+ * `HEAD /cas/{digest}` for a single existence probe and
9
+ * `POST /cas/findMissing` for the batched one, because Bazel's HTTP client has
10
+ * no `findMissingDigests` at all — it answers "everything is missing" and
11
+ * re-uploads — and a batched probe is the whole reason
12
+ * `MissingDigestsFinder` exists in the gRPC client.
13
+ *
14
+ * Transport is Effect's own `HttpClient` tag. There is no lower transport in
15
+ * this repository, and there does not need to be one: the kernel already
16
+ * decorates that tag with `net:get`/`net:post` capability checks, so a remote
17
+ * artifact fetch is permission-checked like every other egress.
18
+ *
19
+ * ## Chunked uploads
20
+ *
21
+ * With `chunkBytes` set, a blob past that size travels as a sequence of
22
+ * `PUT /cas/{digest}` requests carrying `Content-Range: bytes {a}-{b}/{total}`,
23
+ * preceded by a `HEAD /cas/{digest}` existence probe and a
24
+ * `Content-Range: bytes *\/{total}` probe with an empty body. This is the
25
+ * resumable-upload shape HTTP already has: the range probe asks what prefix
26
+ * the tier holds and `308` means "keep going", with a `Range: bytes=0-{last}`
27
+ * header on the probe or on a chunk answer moving the offset.
28
+ *
29
+ * Only a `308` continues the sequence, and the completing chunk's `2xx` is
30
+ * confirmed with `HEAD` before `put` reports the digest as published. A `2xx`
31
+ * anywhere else, to the empty probe or to a chunk the tier is still owed bytes
32
+ * after, reads as a tier that ignored `Content-Range` and stored the body it
33
+ * was handed, which is what plain WebDAV `PUT` does. That tier, the one that
34
+ * answers `400`, `411`, or `416`, and the one whose `HEAD` will not confirm
35
+ * the stored length all get the same treatment: one whole-blob `PUT`, which
36
+ * overwrites the partial body the sequence left behind. So the blob always
37
+ * lands whole, and the cost of turning the dial on against a server that
38
+ * never learned about it is round trips, never a digest published over bytes
39
+ * the server does not hold.
40
+ *
41
+ * This repository's own hosted and self-hosted cache services are such
42
+ * servers: neither implements the resumable sequence, and both refuse a
43
+ * ranged `PUT` with `400`, RFC 9110 section 14.5's answer from a resource
44
+ * that does not support partial `PUT`. Against them `chunkBytes` costs the
45
+ * probe round trip and the blob travels whole, and both cap one request body
46
+ * at 16 MiB, so a blob past that cap is refused with `413` in either mode.
47
+ *
48
+ * The endpoint and its credentials arrive as **layer construction options**.
49
+ * They are capabilities, never step inputs: they are not hashed into a step
50
+ * key, journaled, or returned in a recorded result. Invalid endpoint errors are
51
+ * sanitized before they cross the boundary.
52
+ *
53
+ * @since 1.0.0-rc.0
54
+ */
55
+ import * as Duration from "effect/Duration";
56
+ import * as Effect from "effect/Effect";
57
+ import * as HttpClient from "effect/http/HttpClient";
58
+ import * as Layer from "effect/Layer";
59
+ import * as Schema from "effect/Schema";
60
+ import * as ArtifactStore from "./ArtifactStore.ts";
61
+ /**
62
+ * How eagerly a composition materializes shared blobs into its local store.
63
+ *
64
+ * @category models
65
+ * @since 1.0.0-rc.0
66
+ */
67
+ export declare const DownloadPolicy: Schema.Literals<readonly ["all", "toplevel", "minimal"]>;
68
+ /**
69
+ * How eagerly a composition materializes remote blobs.
70
+ *
71
+ * @category models
72
+ * @since 1.0.0-rc.0
73
+ */
74
+ export type DownloadPolicy = typeof DownloadPolicy.Type;
75
+ /**
76
+ * Every download policy, in materialization order.
77
+ *
78
+ * @category models
79
+ * @since 1.0.0-rc.0
80
+ */
81
+ export declare const downloadPolicies: ReadonlyArray<DownloadPolicy>;
82
+ /**
83
+ * A remote artifact tier, which is an ordinary store that also states how
84
+ * eagerly a composition reading through it should materialize blobs locally.
85
+ *
86
+ * @category models
87
+ * @since 1.0.0-rc.0
88
+ */
89
+ export interface Service extends ArtifactStore.Service {
90
+ readonly downloadPolicy: DownloadPolicy;
91
+ }
92
+ /**
93
+ * Reads the download policy a store declares, or `undefined` for a store that
94
+ * declares none — every local store, and any foreign implementation.
95
+ *
96
+ * @category getters
97
+ * @since 1.0.0-rc.0
98
+ */
99
+ export declare const downloadPolicyOf: (store: ArtifactStore.Service) => DownloadPolicy | undefined;
100
+ /**
101
+ * How to reach the shared artifact tier.
102
+ *
103
+ * @category models
104
+ * @since 1.0.0-rc.0
105
+ * @slop
106
+ */
107
+ export interface Options {
108
+ /**
109
+ * The cache root, e.g. `https://cache.example.com`. `/cas/{digest}` and
110
+ * `/cas/findMissing` are resolved beneath it. A trailing slash is ignored.
111
+ *
112
+ * Four shapes are refused at construction as `invalid_configuration`, before
113
+ * any request leaves and therefore before `headers` can reach a wire: a value
114
+ * that is not a string, one no `URL` parser accepts, a scheme other than
115
+ * `https:` (plain `http:` is accepted only for the literal loopback hosts
116
+ * `localhost`, `127.0.0.1`, and `[::1]`), and an endpoint carrying
117
+ * userinfo, a query, or a fragment. The
118
+ * last rule keeps a credential out of a place nothing here would redact: an
119
+ * endpoint is interpolated into every request path and into span attributes.
120
+ *
121
+ * The refusal message names only the violated rule and never echoes the
122
+ * endpoint, so a rejected `https://user:secret@host` cannot leak its
123
+ * credential into a log line or a durable error.
124
+ */
125
+ readonly endpoint: string;
126
+ /**
127
+ * Headers sent with every request — an `Authorization` bearer token, a
128
+ * tenant header, whatever the deployment's gateway wants. This is the
129
+ * credential seam, and it is deliberately construction-time: a credential
130
+ * that arrived as a step input would be hashed into a step key and persisted
131
+ * everywhere the journal goes.
132
+ *
133
+ * The protocol wins every collision. These headers are applied to a request
134
+ * first. Configured `content-type`, `content-length`, and `content-range`
135
+ * are removed, then computed only where the protocol needs them. Whole-blob
136
+ * uploads, including fallbacks, never carry `content-range`.
137
+ * All configured header names are redacted in HTTP spans, in addition to
138
+ * the host's existing redaction rules.
139
+ *
140
+ * A name that is not an HTTP token, or a value longer than 16 KiB or
141
+ * carrying a control character (CR and LF included), is refused at
142
+ * construction as `invalid_configuration`.
143
+ */
144
+ readonly headers?: Record<string, string> | undefined;
145
+ /**
146
+ * The deadline on a single download, from the request leaving to the last
147
+ * body byte arriving. A shared tier that stops answering must fail the read
148
+ * rather than park it forever. `CombinedArtifacts.get` propagates a remote
149
+ * `ArtifactStoreError`, including a download timeout. Only opportunistic
150
+ * uploads from `CombinedArtifacts.put` ignore remote failures;
151
+ * `ArtifactSync.hydrate` separately turns a failure into replay rejection.
152
+ * Defaults to 60 seconds, Bazel's `--remote_timeout`
153
+ * default for the same REST protocol (its `RemoteOptions`: "For the REST
154
+ * cache, this is both the connect and the read timeout").
155
+ */
156
+ readonly downloadTimeout?: Duration.Input | undefined;
157
+ /**
158
+ * Deadline for an upload, including every resume probe and chunk. Defaults
159
+ * to 60 seconds.
160
+ */
161
+ readonly uploadTimeout?: Duration.Input | undefined;
162
+ /**
163
+ * Deadline for an existence probe or one `findMissing` batch, including its
164
+ * response body. Defaults to 60 seconds.
165
+ */
166
+ readonly requestTimeout?: Duration.Input | undefined;
167
+ /**
168
+ * The largest download this client will buffer, in bytes. The body is read
169
+ * incrementally and abandoned the moment it exceeds the bound — and refused
170
+ * outright when `Content-Length` already declares the excess — so a
171
+ * mis-serving or hostile cache cannot make this process buffer and hash an
172
+ * arbitrarily large body before the digest check refuses it. Defaults to
173
+ * 256 MiB.
174
+ */
175
+ readonly maxDownloadBytes?: number | undefined;
176
+ /**
177
+ * Largest `findMissing` response body accepted. Defaults to the protocol's
178
+ * 256 KiB request/response bound and may only lower that bound.
179
+ */
180
+ readonly maxFindMissingResponseBytes?: number | undefined;
181
+ /**
182
+ * Above this many bytes an upload travels as a sequence of `Content-Range`
183
+ * `PUT`s instead of one whole-blob body, and a transfer that died partway
184
+ * resumes from the prefix the tier kept rather than starting over. See
185
+ * {@link module:RemoteArtifacts | the chunked upload protocol} below.
186
+ *
187
+ * Absent by default: every upload is one whole-blob `PUT`, which is what
188
+ * Bazel's dumb-HTTP client does and what every deployment already serving
189
+ * this protocol expects. Set it when a proxy caps request bodies, or when
190
+ * artifacts are large enough that losing a transfer is expensive.
191
+ *
192
+ * The repository's own hosted and self-hosted cache services answer the
193
+ * ranged probe with `400`, so against them this dial degrades to one
194
+ * whole-blob `PUT`, and their 16 MiB body cap refuses a larger blob with
195
+ * `413` in either mode.
196
+ */
197
+ readonly chunkBytes?: number | undefined;
198
+ /**
199
+ * How eagerly a composition reading through this tier materializes blobs
200
+ * into its local store. This is Bazel's `--remote_download_{all,toplevel,
201
+ * minimal}` dial (`RemoteOutputChecker`), and it lives here because the
202
+ * shared tier is the thing being conserved.
203
+ *
204
+ * - `all` (the default) prefetches every referenced blob when a replay is
205
+ * admitted, so the replay reads local bytes.
206
+ * - `toplevel` prefetches nothing and materializes a blob into the local
207
+ * store on the first read that actually needs it.
208
+ * - `minimal` prefetches nothing and materializes nothing: a read is served
209
+ * straight from the shared tier and the local store never grows.
210
+ *
211
+ * `CombinedArtifacts.get` honors the last two; `@smthrs/engine-store`'s
212
+ * `ArtifactSync.hydrate` honors the first.
213
+ */
214
+ readonly downloadPolicy?: DownloadPolicy | undefined;
215
+ }
216
+ /**
217
+ * Builds a remote artifact store over Effect's `HttpClient`.
218
+ *
219
+ * @category constructors
220
+ * @since 1.0.0-rc.0
221
+ * @slop
222
+ */
223
+ export declare const make: (options: Options) => Effect.Effect<Service, ArtifactStore.ArtifactStoreError, HttpClient.HttpClient>;
224
+ /**
225
+ * Provides a remote artifact store as the `ArtifactStore` tag.
226
+ *
227
+ * Composing this *alone* makes every artifact read and write a network round
228
+ * trip. The intended production shape is
229
+ * {@link CombinedArtifacts.layer | CombinedArtifacts}, with this as its remote
230
+ * tier.
231
+ *
232
+ * @category layers
233
+ * @since 1.0.0-rc.0
234
+ * @slop
235
+ */
236
+ export declare const layer: (options: Options) => Layer.Layer<ArtifactStore.ArtifactStore, ArtifactStore.ArtifactStoreError, HttpClient.HttpClient>;
237
+ //# sourceMappingURL=RemoteArtifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteArtifacts.d.ts","sourceRoot":"","sources":["../../src/RemoteArtifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AAGpD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,0DAA2D,CAAA;AAEtF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,cAAc,CAAiD,CAAA;AAE5G;;;;;;GAMG;AACH,MAAM,WAAW,OAAQ,SAAQ,aAAa,CAAC,OAAO;IACpD,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;CACxC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,aAAa,CAAC,OAAO,KAAG,cAAc,GAAG,SAGhF,CAAA;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACtB;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IACrD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACrD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACnD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACpD;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9C;;;OAGG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;CACrD;AA4FD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,OAAO,KACf,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,kBAAkB,EAAE,UAAU,CAAC,UAAU,CAid7E,CAAA;AAEJ;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,GAChB,SAAS,OAAO,KACf,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,kBAAkB,EAAE,UAAU,CAAC,UAAU,CACzC,CAAA"}