@metamask-previews/phishing-controller 12.0.2-preview-367cb1da → 12.0.2-preview-cf09c0a

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 (81) hide show
  1. package/dist/PhishingController.cjs +453 -0
  2. package/dist/PhishingController.cjs.map +1 -0
  3. package/dist/{types/PhishingController.d.ts → PhishingController.d.cts} +4 -4
  4. package/dist/PhishingController.d.cts.map +1 -0
  5. package/dist/PhishingController.d.mts +304 -0
  6. package/dist/PhishingController.d.mts.map +1 -0
  7. package/dist/PhishingController.mjs +448 -37
  8. package/dist/PhishingController.mjs.map +1 -1
  9. package/dist/PhishingDetector.cjs +233 -0
  10. package/dist/PhishingDetector.cjs.map +1 -0
  11. package/dist/{types/PhishingDetector.d.ts → PhishingDetector.d.cts} +2 -2
  12. package/dist/PhishingDetector.d.cts.map +1 -0
  13. package/dist/PhishingDetector.d.mts +64 -0
  14. package/dist/PhishingDetector.d.mts.map +1 -0
  15. package/dist/PhishingDetector.mjs +227 -7
  16. package/dist/PhishingDetector.mjs.map +1 -1
  17. package/dist/index.cjs +23 -0
  18. package/dist/index.cjs.map +1 -0
  19. package/dist/index.d.cts +5 -0
  20. package/dist/index.d.cts.map +1 -0
  21. package/dist/index.d.mts +5 -0
  22. package/dist/index.d.mts.map +1 -0
  23. package/dist/index.mjs +3 -41
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/tests/utils.cjs +24 -0
  26. package/dist/tests/utils.cjs.map +1 -0
  27. package/dist/{types/tests/utils.d.ts → tests/utils.d.cts} +1 -1
  28. package/dist/tests/utils.d.cts.map +1 -0
  29. package/dist/tests/utils.d.mts +11 -0
  30. package/dist/tests/utils.d.mts.map +1 -0
  31. package/dist/tests/utils.mjs +18 -14
  32. package/dist/tests/utils.mjs.map +1 -1
  33. package/dist/types.cjs +40 -0
  34. package/dist/types.cjs.map +1 -0
  35. package/dist/{types/types.d.ts → types.d.cts} +1 -1
  36. package/dist/types.d.cts.map +1 -0
  37. package/dist/types.d.mts +50 -0
  38. package/dist/types.d.mts.map +1 -0
  39. package/dist/types.mjs +36 -7
  40. package/dist/types.mjs.map +1 -1
  41. package/dist/utils.cjs +242 -0
  42. package/dist/utils.cjs.map +1 -0
  43. package/dist/{types/utils.d.ts → utils.d.cts} +4 -4
  44. package/dist/utils.d.cts.map +1 -0
  45. package/dist/utils.d.mts +119 -0
  46. package/dist/utils.d.mts.map +1 -0
  47. package/dist/utils.mjs +224 -31
  48. package/dist/utils.mjs.map +1 -1
  49. package/package.json +12 -7
  50. package/dist/PhishingController.js +0 -39
  51. package/dist/PhishingController.js.map +0 -1
  52. package/dist/PhishingDetector.js +0 -9
  53. package/dist/PhishingDetector.js.map +0 -1
  54. package/dist/chunk-5NDIXQG5.js +0 -16
  55. package/dist/chunk-5NDIXQG5.js.map +0 -1
  56. package/dist/chunk-G2RL74NS.mjs +0 -16
  57. package/dist/chunk-G2RL74NS.mjs.map +0 -1
  58. package/dist/chunk-I3U4U3MW.mjs +0 -812
  59. package/dist/chunk-I3U4U3MW.mjs.map +0 -1
  60. package/dist/chunk-XUI43LEZ.mjs +0 -30
  61. package/dist/chunk-XUI43LEZ.mjs.map +0 -1
  62. package/dist/chunk-Z4BLTVTB.js +0 -30
  63. package/dist/chunk-Z4BLTVTB.js.map +0 -1
  64. package/dist/chunk-ZAOBCAQT.js +0 -812
  65. package/dist/chunk-ZAOBCAQT.js.map +0 -1
  66. package/dist/index.js +0 -42
  67. package/dist/index.js.map +0 -1
  68. package/dist/tests/utils.js +0 -16
  69. package/dist/tests/utils.js.map +0 -1
  70. package/dist/tsconfig.build.tsbuildinfo +0 -1
  71. package/dist/types/PhishingController.d.ts.map +0 -1
  72. package/dist/types/PhishingDetector.d.ts.map +0 -1
  73. package/dist/types/index.d.ts +0 -5
  74. package/dist/types/index.d.ts.map +0 -1
  75. package/dist/types/tests/utils.d.ts.map +0 -1
  76. package/dist/types/types.d.ts.map +0 -1
  77. package/dist/types/utils.d.ts.map +0 -1
  78. package/dist/types.js +0 -8
  79. package/dist/types.js.map +0 -1
  80. package/dist/utils.js +0 -33
  81. package/dist/utils.js.map +0 -1
@@ -0,0 +1,304 @@
1
+ import type { ControllerGetStateAction, ControllerStateChangeEvent, RestrictedControllerMessenger } from "@metamask/base-controller";
2
+ import { BaseController } from "@metamask/base-controller";
3
+ import { type PhishingDetectorResult } from "./types.mjs";
4
+ export declare const PHISHING_CONFIG_BASE_URL = "https://phishing-detection.api.cx.metamask.io";
5
+ export declare const METAMASK_STALELIST_FILE = "/v1/stalelist";
6
+ export declare const METAMASK_HOTLIST_DIFF_FILE = "/v1/diffsSince";
7
+ export declare const CLIENT_SIDE_DETECION_BASE_URL = "https://client-side-detection.api.cx.metamask.io";
8
+ export declare const C2_DOMAIN_BLOCKLIST_ENDPOINT = "/v1/request-blocklist";
9
+ export declare const C2_DOMAIN_BLOCKLIST_REFRESH_INTERVAL: number;
10
+ export declare const HOTLIST_REFRESH_INTERVAL: number;
11
+ export declare const STALELIST_REFRESH_INTERVAL: number;
12
+ export declare const METAMASK_STALELIST_URL = "https://phishing-detection.api.cx.metamask.io/v1/stalelist";
13
+ export declare const METAMASK_HOTLIST_DIFF_URL = "https://phishing-detection.api.cx.metamask.io/v1/diffsSince";
14
+ export declare const C2_DOMAIN_BLOCKLIST_URL = "https://client-side-detection.api.cx.metamask.io/v1/request-blocklist";
15
+ /**
16
+ * @type ListTypes
17
+ *
18
+ * Type outlining the types of lists provided by aggregating different source lists
19
+ */
20
+ export type ListTypes = 'fuzzylist' | 'blocklist' | 'allowlist' | 'c2DomainBlocklist';
21
+ /**
22
+ * @type EthPhishingResponse
23
+ *
24
+ * Configuration response from the eth-phishing-detect package
25
+ * consisting of approved and unapproved website origins
26
+ * @property blacklist - List of unapproved origins
27
+ * @property fuzzylist - List of fuzzy-matched unapproved origins
28
+ * @property tolerance - Fuzzy match tolerance level
29
+ * @property version - Version number of this configuration
30
+ * @property whitelist - List of approved origins
31
+ */
32
+ export type EthPhishingResponse = {
33
+ blacklist: string[];
34
+ fuzzylist: string[];
35
+ tolerance: number;
36
+ version: number;
37
+ whitelist: string[];
38
+ };
39
+ /**
40
+ * @type C2DomainBlocklistResponse
41
+ *
42
+ * Response for blocklist update requests
43
+ * @property recentlyAdded - List of c2 domains recently added to the blocklist
44
+ * @property recentlyRemoved - List of c2 domains recently removed from the blocklist
45
+ * @property lastFetchedAt - Timestamp of the last fetch request
46
+ */
47
+ export type C2DomainBlocklistResponse = {
48
+ recentlyAdded: string[];
49
+ recentlyRemoved: string[];
50
+ lastFetchedAt: string;
51
+ };
52
+ /**
53
+ * @type PhishingStalelist
54
+ *
55
+ * type defining expected type of the stalelist.json file.
56
+ * @property eth_phishing_detect_config - Stale list sourced from eth-phishing-detect's config.json.
57
+ * @property tolerance - Fuzzy match tolerance level
58
+ * @property lastUpdated - Timestamp of last update.
59
+ * @property version - Stalelist data structure iteration.
60
+ */
61
+ export type PhishingStalelist = {
62
+ eth_phishing_detect_config: Record<ListTypes, string[]>;
63
+ tolerance: number;
64
+ version: number;
65
+ lastUpdated: number;
66
+ };
67
+ /**
68
+ * @type PhishingListState
69
+ *
70
+ * type defining the persisted list state. This is the persisted state that is updated frequently with `this.maybeUpdateState()`.
71
+ * @property allowlist - List of approved origins (legacy naming "whitelist")
72
+ * @property blocklist - List of unapproved origins (legacy naming "blacklist")
73
+ * @property c2DomainBlocklist - List of hashed hostnames that C2 requests are blocked against.
74
+ * @property fuzzylist - List of fuzzy-matched unapproved origins
75
+ * @property tolerance - Fuzzy match tolerance level
76
+ * @property lastUpdated - Timestamp of last update.
77
+ * @property version - Version of the phishing list state.
78
+ * @property name - Name of the list. Used for attribution.
79
+ */
80
+ export type PhishingListState = {
81
+ allowlist: string[];
82
+ blocklist: string[];
83
+ c2DomainBlocklist: string[];
84
+ fuzzylist: string[];
85
+ tolerance: number;
86
+ version: number;
87
+ lastUpdated: number;
88
+ name: ListNames;
89
+ };
90
+ /**
91
+ * @type HotlistDiff
92
+ *
93
+ * type defining the expected type of the diffs in hotlist.json file.
94
+ * @property url - Url of the diff entry.
95
+ * @property timestamp - Timestamp at which the diff was identified.
96
+ * @property targetList - The list name where the diff was identified.
97
+ * @property isRemoval - Was the diff identified a removal type.
98
+ */
99
+ export type HotlistDiff = {
100
+ url: string;
101
+ timestamp: number;
102
+ targetList: `${ListKeys}.${ListTypes}`;
103
+ isRemoval?: boolean;
104
+ };
105
+ export type DataResultWrapper<T> = {
106
+ data: T;
107
+ };
108
+ /**
109
+ * @type Hotlist
110
+ *
111
+ * Type defining expected hotlist.json file.
112
+ * @property url - Url of the diff entry.
113
+ * @property timestamp - Timestamp at which the diff was identified.
114
+ * @property targetList - The list name where the diff was identified.
115
+ * @property isRemoval - Was the diff identified a removal type.
116
+ */
117
+ export type Hotlist = HotlistDiff[];
118
+ /**
119
+ * Enum containing upstream data provider source list keys.
120
+ * These are the keys denoting lists consumed by the upstream data provider.
121
+ */
122
+ export declare enum ListKeys {
123
+ EthPhishingDetectConfig = "eth_phishing_detect_config"
124
+ }
125
+ /**
126
+ * Enum containing downstream client attribution names.
127
+ */
128
+ export declare enum ListNames {
129
+ MetaMask = "MetaMask"
130
+ }
131
+ /**
132
+ * Maps from list key sourced from upstream data
133
+ * provider to downstream client attribution name.
134
+ */
135
+ export declare const phishingListKeyNameMap: {
136
+ eth_phishing_detect_config: ListNames;
137
+ };
138
+ declare const controllerName = "PhishingController";
139
+ /**
140
+ * @type PhishingControllerState
141
+ *
142
+ * Phishing controller state
143
+ * @property phishing - eth-phishing-detect configuration
144
+ * @property whitelist - array of temporarily-approved origins
145
+ */
146
+ export type PhishingControllerState = {
147
+ phishingLists: PhishingListState[];
148
+ whitelist: string[];
149
+ hotlistLastFetched: number;
150
+ stalelistLastFetched: number;
151
+ c2DomainBlocklistLastFetched: number;
152
+ };
153
+ /**
154
+ * @type PhishingControllerOptions
155
+ *
156
+ * Phishing controller options
157
+ * @property stalelistRefreshInterval - Polling interval used to fetch stale list.
158
+ * @property hotlistRefreshInterval - Polling interval used to fetch hotlist diff list.
159
+ * @property c2DomainBlocklistRefreshInterval - Polling interval used to fetch c2 domain blocklist.
160
+ */
161
+ export type PhishingControllerOptions = {
162
+ stalelistRefreshInterval?: number;
163
+ hotlistRefreshInterval?: number;
164
+ c2DomainBlocklistRefreshInterval?: number;
165
+ messenger: PhishingControllerMessenger;
166
+ state?: Partial<PhishingControllerState>;
167
+ };
168
+ export type MaybeUpdateState = {
169
+ type: `${typeof controllerName}:maybeUpdateState`;
170
+ handler: PhishingController['maybeUpdateState'];
171
+ };
172
+ export type TestOrigin = {
173
+ type: `${typeof controllerName}:testOrigin`;
174
+ handler: PhishingController['test'];
175
+ };
176
+ export type PhishingControllerGetStateAction = ControllerGetStateAction<typeof controllerName, PhishingControllerState>;
177
+ export type PhishingControllerActions = PhishingControllerGetStateAction | MaybeUpdateState | TestOrigin;
178
+ export type PhishingControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, PhishingControllerState>;
179
+ export type PhishingControllerEvents = PhishingControllerStateChangeEvent;
180
+ export type PhishingControllerMessenger = RestrictedControllerMessenger<typeof controllerName, PhishingControllerActions, PhishingControllerEvents, never, never>;
181
+ /**
182
+ * Controller that manages community-maintained lists of approved and unapproved website origins.
183
+ */
184
+ export declare class PhishingController extends BaseController<typeof controllerName, PhishingControllerState, PhishingControllerMessenger> {
185
+ #private;
186
+ /**
187
+ * Construct a Phishing Controller.
188
+ *
189
+ * @param config - Initial options used to configure this controller.
190
+ * @param config.stalelistRefreshInterval - Polling interval used to fetch stale list.
191
+ * @param config.hotlistRefreshInterval - Polling interval used to fetch hotlist diff list.
192
+ * @param config.c2DomainBlocklistRefreshInterval - Polling interval used to fetch c2 domain blocklist.
193
+ * @param config.messenger - The controller restricted messenger.
194
+ * @param config.state - Initial state to set on this controller.
195
+ */
196
+ constructor({ stalelistRefreshInterval, hotlistRefreshInterval, c2DomainBlocklistRefreshInterval, messenger, state, }: PhishingControllerOptions);
197
+ /**
198
+ * Updates this.detector with an instance of PhishingDetector using the current state.
199
+ */
200
+ updatePhishingDetector(): void;
201
+ /**
202
+ * Set the interval at which the stale phishing list will be refetched.
203
+ * Fetching will only occur on the next call to test/bypass.
204
+ * For immediate update to the phishing list, call {@link updateStalelist} directly.
205
+ *
206
+ * @param interval - the new interval, in ms.
207
+ */
208
+ setStalelistRefreshInterval(interval: number): void;
209
+ /**
210
+ * Set the interval at which the hot list will be refetched.
211
+ * Fetching will only occur on the next call to test/bypass.
212
+ * For immediate update to the phishing list, call {@link updateHotlist} directly.
213
+ *
214
+ * @param interval - the new interval, in ms.
215
+ */
216
+ setHotlistRefreshInterval(interval: number): void;
217
+ /**
218
+ * Set the interval at which the C2 domain blocklist will be refetched.
219
+ * Fetching will only occur on the next call to test/bypass.
220
+ * For immediate update to the phishing list, call {@link updateHotlist} directly.
221
+ *
222
+ * @param interval - the new interval, in ms.
223
+ */
224
+ setC2DomainBlocklistRefreshInterval(interval: number): void;
225
+ /**
226
+ * Determine if an update to the stalelist configuration is needed.
227
+ *
228
+ * @returns Whether an update is needed
229
+ */
230
+ isStalelistOutOfDate(): boolean;
231
+ /**
232
+ * Determine if an update to the hotlist configuration is needed.
233
+ *
234
+ * @returns Whether an update is needed
235
+ */
236
+ isHotlistOutOfDate(): boolean;
237
+ /**
238
+ * Determine if an update to the C2 domain blocklist is needed.
239
+ *
240
+ * @returns Whether an update is needed
241
+ */
242
+ isC2DomainBlocklistOutOfDate(): boolean;
243
+ /**
244
+ * Conditionally update the phishing configuration.
245
+ *
246
+ * If the stalelist configuration is out of date, this function will call `updateStalelist`
247
+ * to update the configuration. This will automatically grab the hotlist,
248
+ * so it isn't necessary to continue on to download the hotlist and the c2 domain blocklist.
249
+ *
250
+ */
251
+ maybeUpdateState(): Promise<void>;
252
+ /**
253
+ * Determines if a given origin is unapproved.
254
+ *
255
+ * It is strongly recommended that you call {@link maybeUpdateState} before calling this,
256
+ * to check whether the phishing configuration is up-to-date. It will be updated if necessary
257
+ * by calling {@link updateStalelist} or {@link updateHotlist}.
258
+ *
259
+ * @param origin - Domain origin of a website.
260
+ * @returns Whether the origin is an unapproved origin.
261
+ */
262
+ test(origin: string): PhishingDetectorResult;
263
+ /**
264
+ * Checks if a request URL's domain is blocked against the request blocklist.
265
+ *
266
+ * This method is used to determine if a specific request URL is associated with a malicious
267
+ * command and control (C2) domain. The URL's hostname is hashed and checked against a configured
268
+ * blocklist of known malicious domains.
269
+ *
270
+ * @param origin - The full request URL to be checked.
271
+ * @returns An object indicating whether the URL's domain is blocked and relevant metadata.
272
+ */
273
+ isBlockedRequest(origin: string): PhishingDetectorResult;
274
+ /**
275
+ * Temporarily marks a given origin as approved.
276
+ *
277
+ * @param origin - The origin to mark as approved.
278
+ */
279
+ bypass(origin: string): void;
280
+ /**
281
+ * Update the C2 domain blocklist.
282
+ *
283
+ * If an update is in progress, no additional update will be made. Instead this will wait until
284
+ * the in-progress update has finished.
285
+ */
286
+ updateC2DomainBlocklist(): Promise<void>;
287
+ /**
288
+ * Update the hotlist.
289
+ *
290
+ * If an update is in progress, no additional update will be made. Instead this will wait until
291
+ * the in-progress update has finished.
292
+ */
293
+ updateHotlist(): Promise<void>;
294
+ /**
295
+ * Update the stalelist.
296
+ *
297
+ * If an update is in progress, no additional update will be made. Instead this will wait until
298
+ * the in-progress update has finished.
299
+ */
300
+ updateStalelist(): Promise<void>;
301
+ }
302
+ export default PhishingController;
303
+ export type { PhishingDetectorResult };
304
+ //# sourceMappingURL=PhishingController.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhishingController.d.mts","sourceRoot":"","sources":["../src/PhishingController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,6BAA6B,EAC9B,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAK3D,OAAO,EAEL,KAAK,sBAAsB,EAC5B,oBAAgB;AAQjB,eAAO,MAAM,wBAAwB,kDACY,CAAC;AAClD,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,0BAA0B,mBAAmB,CAAC;AAE3D,eAAO,MAAM,6BAA6B,qDACU,CAAC;AACrD,eAAO,MAAM,4BAA4B,0BAA0B,CAAC;AAEpE,eAAO,MAAM,oCAAoC,QAAU,CAAC;AAC5D,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,0BAA0B,QAAoB,CAAC;AAE5D,eAAO,MAAM,sBAAsB,+DAA0D,CAAC;AAC9F,eAAO,MAAM,yBAAyB,gEAA6D,CAAC;AACpG,eAAO,MAAM,uBAAuB,0EAAoE,CAAC;AAEzG;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,WAAW,GACX,WAAW,GACX,mBAAmB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAG9B,0BAA0B,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAIF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,CAAC;CACT,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAEpC;;;GAGG;AACH,oBAAY,QAAQ;IAClB,uBAAuB,+BAA+B;CACvD;AAED;;GAEG;AACH,oBAAY,SAAS;IACnB,QAAQ,aAAa;CACtB;AAUD;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,QAAA,MAAM,cAAc,uBAAuB,CAAC;AAwB5C;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4BAA4B,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,SAAS,EAAE,2BAA2B,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,GAAG,OAAO,cAAc,mBAAmB,CAAC;IAClD,OAAO,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,GAAG,OAAO,cAAc,aAAa,CAAC;IAC5C,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG,wBAAwB,CACrE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,gCAAgC,GAChC,gBAAgB,GAChB,UAAU,CAAC;AAEf,MAAM,MAAM,kCAAkC,GAAG,0BAA0B,CACzE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,6BAA6B,CACrE,OAAO,cAAc,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,EACL,KAAK,CACN,CAAC;AAEF;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,cAAc,CACpD,OAAO,cAAc,EACrB,uBAAuB,EACvB,2BAA2B,CAC5B;;IAiBC;;;;;;;;;OASG;gBACS,EACV,wBAAqD,EACrD,sBAAiD,EACjD,gCAAuE,EACvE,SAAS,EACT,KAAU,GACX,EAAE,yBAAyB;IAmC5B;;OAEG;IACH,sBAAsB;IAItB;;;;;;OAMG;IACH,2BAA2B,CAAC,QAAQ,EAAE,MAAM;IAI5C;;;;;;OAMG;IACH,yBAAyB,CAAC,QAAQ,EAAE,MAAM;IAI1C;;;;;;OAMG;IACH,mCAAmC,CAAC,QAAQ,EAAE,MAAM;IAIpD;;;;OAIG;IACH,oBAAoB;IAOpB;;;;OAIG;IACH,kBAAkB;IAOlB;;;;OAIG;IACH,4BAA4B;IAO5B;;;;;;;OAOG;IACG,gBAAgB;IAgBtB;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB;IAS5C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB;IASxD;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM;IAYrB;;;;;OAKG;IACG,uBAAuB;IAc7B;;;;;OAKG;IACG,aAAa;IAcnB;;;;;OAKG;IACG,eAAe;CAqMtB;AAED,eAAe,kBAAkB,CAAC;AAElC,YAAY,EAAE,sBAAsB,EAAE,CAAC"}