melonjs 20.12.0 → 20.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +2 -1
  2. package/build/camera/camera2d.d.ts +2 -0
  3. package/build/camera/camera2d.d.ts.map +1 -1
  4. package/build/camera/effects/fade_effect.d.ts.map +1 -1
  5. package/build/geometries/ellipse.d.ts +3 -0
  6. package/build/geometries/ellipse.d.ts.map +1 -1
  7. package/build/geometries/line.d.ts.map +1 -1
  8. package/build/geometries/polygon.d.ts +2 -1
  9. package/build/geometries/polygon.d.ts.map +1 -1
  10. package/build/index.d.ts +13 -2
  11. package/build/index.d.ts.map +1 -1
  12. package/build/index.js +5409 -1500
  13. package/build/index.js.map +4 -4
  14. package/build/input/gamepad.d.ts.map +1 -1
  15. package/build/input/pointerevent.d.ts.map +1 -1
  16. package/build/level/tiled/TMXLayer.d.ts +48 -14
  17. package/build/level/tiled/TMXLayer.d.ts.map +1 -1
  18. package/build/level/tiled/TMXTileMap.d.ts +1 -1
  19. package/build/level/tiled/TMXTileMap.d.ts.map +1 -1
  20. package/build/level/tiled/TMXTileset.d.ts.map +1 -1
  21. package/build/level/tiled/TMXUtils.d.ts.map +1 -1
  22. package/build/level/tiled/renderer/TMXHexagonalRenderer.d.ts.map +1 -1
  23. package/build/level/tiled/renderer/TMXIsometricRenderer.d.ts.map +1 -1
  24. package/build/level/tiled/renderer/TMXObliqueRenderer.d.ts.map +1 -1
  25. package/build/level/tiled/renderer/TMXOrthogonalRenderer.d.ts.map +1 -1
  26. package/build/level/tiled/renderer/TMXRenderer.d.ts +1 -1
  27. package/build/level/tiled/renderer/TMXRenderer.d.ts.map +1 -1
  28. package/build/level/tiled/renderer/TMXStaggeredRenderer.d.ts.map +1 -1
  29. package/build/loader/loader.d.ts +55 -11
  30. package/build/loader/loader.d.ts.map +1 -1
  31. package/build/math/color.d.ts.map +1 -1
  32. package/build/math/math.d.ts +6 -1
  33. package/build/math/math.d.ts.map +1 -1
  34. package/build/math/observableVector2d.d.ts +6 -6
  35. package/build/math/observableVector2d.d.ts.map +1 -1
  36. package/build/math/observableVector3d.d.ts +8 -8
  37. package/build/math/observableVector3d.d.ts.map +1 -1
  38. package/build/particles/emitter.d.ts +15 -3
  39. package/build/particles/emitter.d.ts.map +1 -1
  40. package/build/particles/particle.d.ts +6 -0
  41. package/build/particles/particle.d.ts.map +1 -1
  42. package/build/particles/settings.d.ts +22 -5
  43. package/build/particles/settings.d.ts.map +1 -1
  44. package/build/physics/builtin/body.d.ts +14 -4
  45. package/build/physics/builtin/body.d.ts.map +1 -1
  46. package/build/physics/builtin/raycast.d.ts.map +1 -1
  47. package/build/physics/world.d.ts.map +1 -1
  48. package/build/renderable/container.d.ts +40 -6
  49. package/build/renderable/container.d.ts.map +1 -1
  50. package/build/renderable/frameAnimation.d.ts.map +1 -1
  51. package/build/renderable/renderable.d.ts.map +1 -1
  52. package/build/renderable/sprite.d.ts +4 -2
  53. package/build/renderable/sprite.d.ts.map +1 -1
  54. package/build/renderable/text/bitmaptext.d.ts +12 -3
  55. package/build/renderable/text/bitmaptext.d.ts.map +1 -1
  56. package/build/renderable/text/text.d.ts +147 -4
  57. package/build/renderable/text/text.d.ts.map +1 -1
  58. package/build/renderable/text/textmetrics.d.ts +10 -2
  59. package/build/renderable/text/textmetrics.d.ts.map +1 -1
  60. package/build/renderable/text/textstyle.d.ts.map +1 -1
  61. package/build/renderable/ui/panelpaint.d.ts +5 -1
  62. package/build/renderable/ui/panelpaint.d.ts.map +1 -1
  63. package/build/renderable/ui/progressbar.d.ts +267 -95
  64. package/build/renderable/ui/progressbar.d.ts.map +1 -1
  65. package/build/renderable/ui/uibaseelement.d.ts +436 -50
  66. package/build/renderable/ui/uibaseelement.d.ts.map +1 -1
  67. package/build/renderable/ui/uicheckbox.d.ts +383 -0
  68. package/build/renderable/ui/uicheckbox.d.ts.map +1 -0
  69. package/build/renderable/ui/uifocus.d.ts +6 -0
  70. package/build/renderable/ui/uifocus.d.ts.map +1 -0
  71. package/build/renderable/ui/uilabel.d.ts +31 -0
  72. package/build/renderable/ui/uilabel.d.ts.map +1 -0
  73. package/build/renderable/ui/uipanel.d.ts +589 -116
  74. package/build/renderable/ui/uipanel.d.ts.map +1 -1
  75. package/build/renderable/ui/uiskin.d.ts +25 -0
  76. package/build/renderable/ui/uiskin.d.ts.map +1 -0
  77. package/build/renderable/ui/uislider.d.ts +518 -0
  78. package/build/renderable/ui/uislider.d.ts.map +1 -0
  79. package/build/renderable/ui/uispriteelement.d.ts +161 -85
  80. package/build/renderable/ui/uispriteelement.d.ts.map +1 -1
  81. package/build/renderable/ui/uitextbutton.d.ts +369 -63
  82. package/build/renderable/ui/uitextbutton.d.ts.map +1 -1
  83. package/build/state/stage.d.ts.map +1 -1
  84. package/build/system/pool.d.ts.map +1 -1
  85. package/build/system/save.d.ts +2 -1
  86. package/build/system/save.d.ts.map +1 -1
  87. package/build/tweens/tween.d.ts +5 -2
  88. package/build/tweens/tween.d.ts.map +1 -1
  89. package/build/utils/fetchdata.d.ts.map +1 -1
  90. package/build/video/canvas/canvas_renderer.d.ts +0 -5
  91. package/build/video/canvas/canvas_renderer.d.ts.map +1 -1
  92. package/build/video/renderer.d.ts +20 -4
  93. package/build/video/renderer.d.ts.map +1 -1
  94. package/build/video/renderstate.d.ts +26 -3
  95. package/build/video/renderstate.d.ts.map +1 -1
  96. package/build/video/utils/tessellation.d.ts +11 -0
  97. package/build/video/utils/tessellation.d.ts.map +1 -1
  98. package/build/video/webgl/webgl_renderer.d.ts +3 -6
  99. package/build/video/webgl/webgl_renderer.d.ts.map +1 -1
  100. package/build/video/webgpu/batchers/primitive_batcher.d.ts.map +1 -1
  101. package/build/video/webgpu/webgpu_renderer.d.ts +3 -6
  102. package/build/video/webgpu/webgpu_renderer.d.ts.map +1 -1
  103. package/package.json +1 -1
  104. package/skills/melonjs/SKILL.md +3 -3
  105. package/skills/melonjs-audio/SKILL.md +7 -5
  106. package/skills/melonjs-camera-and-drawing/SKILL.md +41 -1
  107. package/skills/melonjs-effects-and-shaders/SKILL.md +1 -0
  108. package/skills/melonjs-events/SKILL.md +3 -1
  109. package/skills/melonjs-getting-started/SKILL.md +1 -2
  110. package/skills/melonjs-input/SKILL.md +38 -2
  111. package/skills/melonjs-loading-assets/SKILL.md +53 -12
  112. package/skills/melonjs-math/SKILL.md +14 -3
  113. package/skills/melonjs-particles-and-trails/SKILL.md +72 -8
  114. package/skills/melonjs-physics/SKILL.md +53 -4
  115. package/skills/melonjs-plugins/SKILL.md +7 -2
  116. package/skills/melonjs-renderables/SKILL.md +7 -0
  117. package/skills/melonjs-scenes-and-state/SKILL.md +15 -0
  118. package/skills/melonjs-sprites-and-animation/SKILL.md +14 -0
  119. package/skills/melonjs-tilemaps/SKILL.md +96 -2
  120. package/skills/melonjs-ui-and-text/SKILL.md +560 -23
@@ -1,114 +1,190 @@
1
- import type Pointer from "./../../input/pointer.ts";
1
+ import type Camera2d from "../../camera/camera2d.ts";
2
+ import type Renderer from "../../video/renderer.js";
2
3
  import Sprite from "./../sprite.js";
4
+ import type { UIJuiceSettings } from "./uibaseelement.ts";
5
+ import UIBaseElement from "./uibaseelement.ts";
3
6
  /**
4
- * This is a basic sprite based button which you can use in your Game UI.
7
+ * Settings for a {@link UISpriteElement}: the {@link Sprite} settings for its
8
+ * image, plus the bounce shared by every UI element.
5
9
  * @category UI
6
10
  */
7
- export default class UISpriteElement extends Sprite {
11
+ export type UISpriteElementSettings = {
8
12
  /**
9
- * if this UISpriteElement should use screen coordinates or local coordinates
10
- * (Note: any UISpriteElement elements added to a floating parent container should have their floating property to false)
11
- * @see Renderable.floating
12
- * @default true
13
+ * The image: a loader key, an image, or a {@link TextureAtlas} (with
14
+ * `region`). Every other {@link Sprite} setting is accepted too:
15
+ * `region`, `framewidth`, `frameheight`, `anchorPoint`, `tint`...
13
16
  */
14
- floating: boolean;
17
+ image: any;
15
18
  /**
16
- * object can be clicked or not
19
+ * Whether the element starts turned on.
17
20
  * @default true
18
21
  */
19
- isClickable: boolean;
22
+ enabled?: boolean;
23
+ [key: string]: any;
24
+ } & UIJuiceSettings;
25
+ /**
26
+ * An image that takes clicks: use it for an image-only button or a clickable
27
+ * icon, such as a pause or a sound toggle, with no label.
28
+ *
29
+ * It is a {@link UIBaseElement} holding a {@link Sprite}, so it behaves like
30
+ * every other UI element: the same pointer callbacks, `enabled`,
31
+ * `cancelPress()` / `onCancel()`, dragging, the bounce (`hoverScale`,
32
+ * `pressScale`), and keyboard and gamepad focus once `focusable` is set. A
33
+ * press stops here by default, so what is under it does not get it too.
34
+ *
35
+ * The image is {@link UISpriteElement#sprite}: change its region, add and
36
+ * play animations or tint it there. It takes the {@link Sprite} settings, and
37
+ * as a sprite does, `(x, y)` is where its anchor point goes, the centre by
38
+ * default (`anchorPoint` 0.5, 0.5). The element covers the image, so
39
+ * `pos` is its top left corner and `width` / `height` its size.
40
+ *
41
+ * A disabled element (`enabled = false`) is drawn at half opacity.
42
+ * @category UI
43
+ * @example
44
+ * // a sound toggle icon from an atlas, swapping its region on each click
45
+ * import { UISpriteElement, audio } from "melonjs";
46
+ *
47
+ * class SoundIcon extends UISpriteElement {
48
+ * constructor(x, y) {
49
+ * super(x, y, { image: atlas, region: "sound_on", hoverScale: 1.1 });
50
+ * this.muted = false;
51
+ * }
52
+ * onClick() {
53
+ * this.muted = !this.muted;
54
+ * if (this.muted) {
55
+ * audio.muteAll();
56
+ * } else {
57
+ * audio.unmuteAll();
58
+ * }
59
+ * this.sprite.setRegion(atlas.getRegion(this.muted ? "sound_off" : "sound_on"));
60
+ * return false;
61
+ * }
62
+ * }
63
+ *
64
+ * app.world.addChild(new SoundIcon(40, 40));
65
+ * @example
66
+ * // a pause button from a spritesheet: frame 0 at rest, frame 1 under the pointer
67
+ * import { UISpriteElement, state } from "melonjs";
68
+ *
69
+ * class PauseButton extends UISpriteElement {
70
+ * constructor(x, y) {
71
+ * super(x, y, { image: "pause_button", framewidth: 64, frameheight: 64 });
72
+ * this.sprite.addAnimation("idle", [0]);
73
+ * this.sprite.addAnimation("over", [1]);
74
+ * this.sprite.setCurrentAnimation("idle");
75
+ * }
76
+ * onOver() {
77
+ * this.sprite.setCurrentAnimation("over");
78
+ * }
79
+ * onOut() {
80
+ * this.sprite.setCurrentAnimation("idle");
81
+ * }
82
+ * onRelease() {
83
+ * state.pause();
84
+ * return false;
85
+ * }
86
+ * }
87
+ * @example
88
+ * // placed by its top left corner, and reachable with the arrow keys
89
+ * const icon = new UISpriteElement(16, 16, {
90
+ * image: atlas,
91
+ * region: "gear",
92
+ * anchorPoint: { x: 0, y: 0 },
93
+ * });
94
+ * icon.focusable = true;
95
+ */
96
+ export default class UISpriteElement extends UIBaseElement {
97
+ /**
98
+ * The image, drawn to fill the element. Change its region, animations
99
+ * or tint here.
100
+ * @example
101
+ * icon.sprite.setRegion(atlas.getRegion("sound_off"));
102
+ */
103
+ readonly sprite: Sprite;
104
+ /** the sprite's size and anchor the element was last fitted to */
105
+ private readonly _fitted;
20
106
  /**
21
- * Tap and hold threshold timeout in ms
22
- * @default 250
107
+ * @param x - where the image's anchor point goes (its centre by
108
+ * default), in screen pixels
109
+ * @param y - where the image's anchor point goes (its centre by
110
+ * default), in screen pixels
111
+ * @param settings - the {@link Sprite} settings, and the bounce
112
+ * @example
113
+ * // a button image loaded as "button", logging each press
114
+ * class MyButton extends UISpriteElement {
115
+ * constructor(x, y) {
116
+ * super(x, y, { image: "button" });
117
+ * }
118
+ * onClick() {
119
+ * console.log("clicked!");
120
+ * return false;
121
+ * }
122
+ * }
123
+ *
124
+ * app.world.addChild(new MyButton(100, 50));
23
125
  */
24
- holdThreshold: number;
126
+ constructor(x: number, y: number, settings: UISpriteElementSettings);
25
127
  /**
26
- * object can be tap and hold
27
- * @default false
128
+ * Show another region of the texture: a shortcut for
129
+ * `sprite.setRegion(region)`. The element takes the region's size, with
130
+ * the image's anchor point staying where it was, as a sprite's does.
131
+ * @param region - a region from {@link TextureAtlas#getRegion}
132
+ * @returns this element
133
+ * @example
134
+ * icon.setRegion(atlas.getRegion("sound_off"));
28
135
  */
29
- isHoldable: boolean;
136
+ setRegion(region: object): this;
30
137
  /**
31
- * true if the pointer is over the object
32
- * @default false
138
+ * Follow the sprite after its frame, region or anchor changed: the
139
+ * element takes the image's size, and the image's anchor point stays
140
+ * where it was on screen, as a sprite's `pos` does. Runs every update, so
141
+ * a `sprite.setRegion()` or an animation with frames of different sizes
142
+ * is followed too.
143
+ * @ignore
33
144
  */
34
- hover: boolean;
35
- holdTimeout: number;
36
- released: boolean;
145
+ private fitToSprite;
37
146
  /**
38
- * @param x - the x coordinate of the UISpriteElement Object
39
- * @param y - the y coordinate of the UISpriteElement Object
40
- * @param settings - See {@link Sprite}
41
- * @param settings.image - the image to use for the sprite
42
- * @example
43
- * // create a basic GUI Object
44
- * class myButton extends UISpriteElement {
45
- * constructor(x, y) {
46
- * // call the UISpriteElement parent constructor
47
- * super(x, y, {
48
- * image: "button",
49
- * framewidth: 100,
50
- * frameheight: 50
51
- * });
52
- * }
53
- *
54
- * // output something in the console
55
- * // when the object is clicked
56
- * onClick(event) {
57
- * console.log("clicked!");
58
- * // don't propagate the event
59
- * return false;
60
- * }
61
- * });
62
- *
63
- * // add the object at pos (10,10)
64
- * world.addChild(new myButton(10,10));
147
+ * note the sprite's size and anchor the element now fits
148
+ * @ignore
65
149
  */
66
- constructor(x: number, y: number, settings: {
67
- image: any;
68
- [key: string]: any;
69
- });
150
+ private rememberFit;
70
151
  /**
71
- * function called when the object is pressed (to be extended)
72
- * @param _event - the event object
73
- * @returns return false if we need to stop propagating the event
152
+ * update the sprite, its animation included, and follow its frame
153
+ * @param dt - the time since the last update, in milliseconds
154
+ * @returns whether anything changed
155
+ * @ignore
74
156
  */
75
- onClick(_event?: Pointer): boolean;
157
+ update(dt: number): boolean;
76
158
  /**
77
- * function called when the pointer is over the object.
78
- *
79
- * Fires once, on the frame the pointer crosses into the element. To stay
80
- * opaque for as long as the pointer rests on it, an element also wants a
81
- * `"pointermove"` callback registered through
82
- * {@link input.registerPointerEvent} returning `false`, since by then the
83
- * pointer is already inside and this no longer runs.
84
- * @param _event - the event object
85
- * @returns return false if we need to stop propagating the event, so that an
86
- * element covered by this one does not also light up on hover
159
+ * A shortcut for `sprite.addAnimation(...)`: see
160
+ * {@link Sprite#addAnimation}.
161
+ * @param name - the animation name
162
+ * @param index - the frames, by index or region name
163
+ * @param animationspeed - the time between frames, in milliseconds
164
+ * @returns the number of frames added
87
165
  */
88
- onOver(_event?: Pointer): boolean | void;
166
+ addAnimation(name: string, index: number[] | string[] | object[], animationspeed?: number): number;
89
167
  /**
90
- * function called when the pointer is leaving the object area.
91
- *
92
- * Fires when the pointer leaves the element's bounds, and also when it is
93
- * still inside them but something drawn above has consumed the move, since
94
- * the pointer is then over that instead.
95
- *
96
- * Unlike {@link UISpriteElement#onOver} this one cannot consume the event, on
97
- * purpose: an element that suppressed its own leave would stay in its hover
98
- * state after the pointer had gone.
99
- * @param _event - the event object
168
+ * A shortcut for `sprite.setCurrentAnimation(...)`: see
169
+ * {@link Sprite#setCurrentAnimation}.
170
+ * @param name - the animation to play
171
+ * @param resetAnim - what to do at the end, see {@link Sprite#setCurrentAnimation}
172
+ * @param preserve_dt - keep the time already spent on the current frame
173
+ * @returns this element
100
174
  */
101
- onOut(_event?: Pointer): void;
175
+ setCurrentAnimation(name: string, resetAnim?: any, preserve_dt?: boolean): this;
102
176
  /**
103
- * function called when the object is pressed and released (to be extended)
104
- * @param _event - the event object
105
- * @returns return false if we need to stop propagating the event
177
+ * A shortcut for `sprite.isCurrentAnimation(name)`.
178
+ * @param name - the animation name
179
+ * @returns whether it is the one playing
106
180
  */
107
- onRelease(_event?: Pointer): boolean;
181
+ isCurrentAnimation(name: string): boolean;
108
182
  /**
109
- * function called when the object is pressed and held<br>
110
- * to be extended <br>
183
+ * draw the image, at half opacity while disabled
184
+ * @param renderer - the renderer
185
+ * @param viewport - the camera being drawn through
186
+ * @ignore
111
187
  */
112
- onHold(): void;
188
+ draw(renderer: Renderer, viewport?: Camera2d): void;
113
189
  }
114
190
  //# sourceMappingURL=uispriteelement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uispriteelement.d.ts","sourceRoot":"","sources":["../../../src/renderable/ui/uispriteelement.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAC;AAEpD,OAAO,MAAM,MAAM,gBAAgB,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,MAAM;IAClD;;;;;OAKG;IACM,QAAQ,UAAQ;IAEzB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAGf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;gBAEF,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAyC7C;;;;OAIG;IAEH,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAelC;;;;;;;;;;;OAWG;IAEH,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAgBxC;;;;;;;;;;;OAWG;IAEH,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAmB7B;;;;OAIG;IAEH,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAkBpC;;;OAGG;IACH,MAAM,IAAI,IAAI;CAyCd"}
1
+ {"version":3,"file":"uispriteelement.d.ts","sourceRoot":"","sources":["../../../src/renderable/ui/uispriteelement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACrC;;;;OAIG;IACH,KAAK,EAAE,GAAG,CAAC;IACX;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,GAAG,eAAe,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,aAAa;IACzD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD;;;;;;;;;;;;;;;;;;;OAmBG;gBACS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,uBAAuB;IAwBnE;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO/B;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAsBnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;;OAKG;IACM,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAMpC;;;;;;;OAOG;IACH,YAAY,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,EACrC,cAAc,CAAC,EAAE,MAAM,GACrB,MAAM;IAIT;;;;;;;OAOG;IACH,mBAAmB,CAClB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,GAAG,EACf,WAAW,UAAQ,GACjB,IAAI;IAOP;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;OAKG;IACM,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;CAU5D"}