@rb-games/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +488 -0
- package/dist/devtools/DraggableController.d.ts +10 -0
- package/dist/devtools/DraggableController.d.ts.map +1 -0
- package/dist/devtools/ResizableController.d.ts +19 -0
- package/dist/devtools/ResizableController.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +7 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +884 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/devtools/overlayPlugin.d.ts +3 -0
- package/dist/devtools/overlayPlugin.d.ts.map +1 -0
- package/dist/devtools/spinePropertiesPlugin.d.ts +3 -0
- package/dist/devtools/spinePropertiesPlugin.d.ts.map +1 -0
- package/dist/devtools/spriteTextPropertiesPlugin.d.ts +3 -0
- package/dist/devtools/spriteTextPropertiesPlugin.d.ts.map +1 -0
- package/dist/devtools/treePlugin.d.ts +7 -0
- package/dist/devtools/treePlugin.d.ts.map +1 -0
- package/dist/engine/PixiEngine.d.ts +404 -0
- package/dist/engine/PixiEngine.d.ts.map +1 -0
- package/dist/engine/index.d.ts +2 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +1818 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/filters/ChromaKeyFilter.d.ts +64 -0
- package/dist/filters/ChromaKeyFilter.d.ts.map +1 -0
- package/dist/filters/index.d.ts +2 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +248 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/helpers/AssetHelper.d.ts +117 -0
- package/dist/helpers/AssetHelper.d.ts.map +1 -0
- package/dist/helpers/SVGAssetHelper.d.ts +397 -0
- package/dist/helpers/SVGAssetHelper.d.ts.map +1 -0
- package/dist/helpers/SVGLoader.d.ts +46 -0
- package/dist/helpers/SVGLoader.d.ts.map +1 -0
- package/dist/helpers/SVGParser.d.ts +121 -0
- package/dist/helpers/SVGParser.d.ts.map +1 -0
- package/dist/helpers/eventBridge.d.ts +150 -0
- package/dist/helpers/eventBridge.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +8 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +702 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/mergeUtils.d.ts +21 -0
- package/dist/helpers/mergeUtils.d.ts.map +1 -0
- package/dist/helpers/resolvePublicPath.d.ts +6 -0
- package/dist/helpers/resolvePublicPath.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +527 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/sharedI18n.d.ts +11 -0
- package/dist/i18n/sharedI18n.d.ts.map +1 -0
- package/dist/layout/Align.d.ts +126 -0
- package/dist/layout/Align.d.ts.map +1 -0
- package/dist/layout/Bounds.d.ts +120 -0
- package/dist/layout/Bounds.d.ts.map +1 -0
- package/dist/layout/Distribute.d.ts +103 -0
- package/dist/layout/Distribute.d.ts.map +1 -0
- package/dist/layout/Flow.d.ts +213 -0
- package/dist/layout/Flow.d.ts.map +1 -0
- package/dist/layout/PositionUtils.d.ts +57 -0
- package/dist/layout/PositionUtils.d.ts.map +1 -0
- package/dist/layout/index.d.ts +6 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +673 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/particle/Emitter.d.ts +290 -0
- package/dist/particle/Emitter.d.ts.map +1 -0
- package/dist/particle/EmitterConfig.d.ts +228 -0
- package/dist/particle/EmitterConfig.d.ts.map +1 -0
- package/dist/particle/LinkedListContainer.d.ts +7 -0
- package/dist/particle/LinkedListContainer.d.ts.map +1 -0
- package/dist/particle/Particle.d.ts +63 -0
- package/dist/particle/Particle.d.ts.map +1 -0
- package/dist/particle/ParticleUtils.d.ts +97 -0
- package/dist/particle/ParticleUtils.d.ts.map +1 -0
- package/dist/particle/PropertyList.d.ts +40 -0
- package/dist/particle/PropertyList.d.ts.map +1 -0
- package/dist/particle/PropertyNode.d.ts +74 -0
- package/dist/particle/PropertyNode.d.ts.map +1 -0
- package/dist/particle/SpineEmitter.d.ts +55 -0
- package/dist/particle/SpineEmitter.d.ts.map +1 -0
- package/dist/particle/SpineParticle.d.ts +74 -0
- package/dist/particle/SpineParticle.d.ts.map +1 -0
- package/dist/particle/behaviors/AccelerationMovement.d.ts +62 -0
- package/dist/particle/behaviors/AccelerationMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/Alpha.d.ts +60 -0
- package/dist/particle/behaviors/Alpha.d.ts.map +1 -0
- package/dist/particle/behaviors/AnimatedTexture.d.ts +111 -0
- package/dist/particle/behaviors/AnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/Behaviors.d.ts +71 -0
- package/dist/particle/behaviors/Behaviors.d.ts.map +1 -0
- package/dist/particle/behaviors/BlendMode.d.ts +31 -0
- package/dist/particle/behaviors/BlendMode.d.ts.map +1 -0
- package/dist/particle/behaviors/BurstSpawn.d.ts +43 -0
- package/dist/particle/behaviors/BurstSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/Color.d.ts +60 -0
- package/dist/particle/behaviors/Color.d.ts.map +1 -0
- package/dist/particle/behaviors/MultiStateAnimatedTexture.d.ts +99 -0
- package/dist/particle/behaviors/MultiStateAnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/OrderedTexture.d.ts +33 -0
- package/dist/particle/behaviors/OrderedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/PathMovement.d.ts +68 -0
- package/dist/particle/behaviors/PathMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/PointSpawn.d.ts +21 -0
- package/dist/particle/behaviors/PointSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/RandomColor.d.ts +17 -0
- package/dist/particle/behaviors/RandomColor.d.ts.map +1 -0
- package/dist/particle/behaviors/RandomTexture.d.ts +32 -0
- package/dist/particle/behaviors/RandomTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/Rotation.d.ts +114 -0
- package/dist/particle/behaviors/Rotation.d.ts.map +1 -0
- package/dist/particle/behaviors/Scale.d.ts +74 -0
- package/dist/particle/behaviors/Scale.d.ts.map +1 -0
- package/dist/particle/behaviors/ShapeSpawn.d.ts +58 -0
- package/dist/particle/behaviors/ShapeSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/SingleTexture.d.ts +32 -0
- package/dist/particle/behaviors/SingleTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/SpeedMovement.d.ts +76 -0
- package/dist/particle/behaviors/SpeedMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/SpineTexture.d.ts +173 -0
- package/dist/particle/behaviors/SpineTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/ZindexBehavior.d.ts +16 -0
- package/dist/particle/behaviors/ZindexBehavior.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/Types.d.ts +104 -0
- package/dist/particle/behaviors/editor/Types.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/AccelerationMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/AccelerationMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Alpha.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Alpha.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/AnimatedTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/AnimatedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/BlendMode.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/BlendMode.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/BurstSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/BurstSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Color.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Color.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/OrderedTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/OrderedTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/PathMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/PathMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/PointSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/PointSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/RandomTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/RandomTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Rotation.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Rotation.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/Scale.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/Scale.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/ShapeSpawn.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/ShapeSpawn.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/SingleTexture.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/SingleTexture.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/SpeedMovement.d.ts +2 -0
- package/dist/particle/behaviors/editor/behaviors/SpeedMovement.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/behaviors/index.d.ts +15 -0
- package/dist/particle/behaviors/editor/behaviors/index.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/index.d.ts +5 -0
- package/dist/particle/behaviors/editor/index.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/PolygonalChain.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/PolygonalChain.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/Rectangle.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/Rectangle.d.ts.map +1 -0
- package/dist/particle/behaviors/editor/shapes/Torus.d.ts +2 -0
- package/dist/particle/behaviors/editor/shapes/Torus.d.ts.map +1 -0
- package/dist/particle/behaviors/index.d.ts +25 -0
- package/dist/particle/behaviors/index.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/PolygonalChain.d.ts +57 -0
- package/dist/particle/behaviors/shapes/PolygonalChain.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/Rectangle.d.ts +59 -0
- package/dist/particle/behaviors/shapes/Rectangle.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/SpawnShape.d.ts +32 -0
- package/dist/particle/behaviors/shapes/SpawnShape.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/Torus.d.ts +71 -0
- package/dist/particle/behaviors/shapes/Torus.d.ts.map +1 -0
- package/dist/particle/behaviors/shapes/index.d.ts +5 -0
- package/dist/particle/behaviors/shapes/index.d.ts.map +1 -0
- package/dist/particle/index.d.ts +11 -0
- package/dist/particle/index.d.ts.map +1 -0
- package/dist/particle/index.js +2845 -0
- package/dist/particle/index.js.map +1 -0
- package/dist/plugins/Plugin.types.d.ts +80 -0
- package/dist/plugins/Plugin.types.d.ts.map +1 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.d.ts +187 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.d.ts.map +1 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.types.d.ts +134 -0
- package/dist/plugins/device/DeviceOptimizerPlugin.types.d.ts.map +1 -0
- package/dist/plugins/device/index.d.ts +3 -0
- package/dist/plugins/device/index.d.ts.map +1 -0
- package/dist/plugins/display/DisplayPlugin.d.ts +208 -0
- package/dist/plugins/display/DisplayPlugin.d.ts.map +1 -0
- package/dist/plugins/display/DisplayPlugin.types.d.ts +174 -0
- package/dist/plugins/display/DisplayPlugin.types.d.ts.map +1 -0
- package/dist/plugins/display/displayViewport.d.ts +10 -0
- package/dist/plugins/display/displayViewport.d.ts.map +1 -0
- package/dist/plugins/display/index.d.ts +4 -0
- package/dist/plugins/display/index.d.ts.map +1 -0
- package/dist/plugins/eventbus/EventBusPlugin.d.ts +21 -0
- package/dist/plugins/eventbus/EventBusPlugin.d.ts.map +1 -0
- package/dist/plugins/eventbus/EventBusPlugin.types.d.ts +24 -0
- package/dist/plugins/eventbus/EventBusPlugin.types.d.ts.map +1 -0
- package/dist/plugins/eventbus/index.d.ts +3 -0
- package/dist/plugins/eventbus/index.d.ts.map +1 -0
- package/dist/plugins/gsap/GsapPlugin.d.ts +307 -0
- package/dist/plugins/gsap/GsapPlugin.d.ts.map +1 -0
- package/dist/plugins/gsap/index.d.ts +2 -0
- package/dist/plugins/gsap/index.d.ts.map +1 -0
- package/dist/plugins/index.d.ts +13 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +12806 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/input/InputPlugin.const.d.ts +80 -0
- package/dist/plugins/input/InputPlugin.const.d.ts.map +1 -0
- package/dist/plugins/input/InputPlugin.d.ts +141 -0
- package/dist/plugins/input/InputPlugin.d.ts.map +1 -0
- package/dist/plugins/input/InputPlugin.types.d.ts +41 -0
- package/dist/plugins/input/InputPlugin.types.d.ts.map +1 -0
- package/dist/plugins/input/KeyboardManager.d.ts +139 -0
- package/dist/plugins/input/KeyboardManager.d.ts.map +1 -0
- package/dist/plugins/input/KeyboardManager.types.d.ts +27 -0
- package/dist/plugins/input/KeyboardManager.types.d.ts.map +1 -0
- package/dist/plugins/input/index.d.ts +4 -0
- package/dist/plugins/input/index.d.ts.map +1 -0
- package/dist/plugins/language/I18NextPlugin.d.ts +30 -0
- package/dist/plugins/language/I18NextPlugin.d.ts.map +1 -0
- package/dist/plugins/language/I18NextPlugin.types.d.ts +29 -0
- package/dist/plugins/language/I18NextPlugin.types.d.ts.map +1 -0
- package/dist/plugins/language/index.d.ts +3 -0
- package/dist/plugins/language/index.d.ts.map +1 -0
- package/dist/plugins/resource/ResourcePlugin.d.ts +189 -0
- package/dist/plugins/resource/ResourcePlugin.d.ts.map +1 -0
- package/dist/plugins/resource/ResourcePlugin.types.d.ts +153 -0
- package/dist/plugins/resource/ResourcePlugin.types.d.ts.map +1 -0
- package/dist/plugins/resource/index.d.ts +3 -0
- package/dist/plugins/resource/index.d.ts.map +1 -0
- package/dist/plugins/scene/Scene.d.ts +203 -0
- package/dist/plugins/scene/Scene.d.ts.map +1 -0
- package/dist/plugins/scene/ScenePlugin.d.ts +162 -0
- package/dist/plugins/scene/ScenePlugin.d.ts.map +1 -0
- package/dist/plugins/scene/ScenePlugin.types.d.ts +35 -0
- package/dist/plugins/scene/ScenePlugin.types.d.ts.map +1 -0
- package/dist/plugins/scene/index.d.ts +4 -0
- package/dist/plugins/scene/index.d.ts.map +1 -0
- package/dist/plugins/sentry/SentryPlugin.d.ts +66 -0
- package/dist/plugins/sentry/SentryPlugin.d.ts.map +1 -0
- package/dist/plugins/sentry/SentryPlugin.types.d.ts +8 -0
- package/dist/plugins/sentry/SentryPlugin.types.d.ts.map +1 -0
- package/dist/plugins/sentry/index.d.ts +3 -0
- package/dist/plugins/sentry/index.d.ts.map +1 -0
- package/dist/plugins/service/ServiceAdapter.d.ts +88 -0
- package/dist/plugins/service/ServiceAdapter.d.ts.map +1 -0
- package/dist/plugins/service/ServiceEventHelper.d.ts +6 -0
- package/dist/plugins/service/ServiceEventHelper.d.ts.map +1 -0
- package/dist/plugins/service/ServicePlugin.d.ts +135 -0
- package/dist/plugins/service/ServicePlugin.d.ts.map +1 -0
- package/dist/plugins/service/ServicePlugin.types.d.ts +14 -0
- package/dist/plugins/service/ServicePlugin.types.d.ts.map +1 -0
- package/dist/plugins/service/adapters/DevAuthAdapter.d.ts +56 -0
- package/dist/plugins/service/adapters/DevAuthAdapter.d.ts.map +1 -0
- package/dist/plugins/service/adapters/RGSAdapter.d.ts +82 -0
- package/dist/plugins/service/adapters/RGSAdapter.d.ts.map +1 -0
- package/dist/plugins/service/adapters/index.d.ts +7 -0
- package/dist/plugins/service/adapters/index.d.ts.map +1 -0
- package/dist/plugins/service/adapters/resolvePublicIp.d.ts +10 -0
- package/dist/plugins/service/adapters/resolvePublicIp.d.ts.map +1 -0
- package/dist/plugins/service/index.d.ts +10 -0
- package/dist/plugins/service/index.d.ts.map +1 -0
- package/dist/plugins/service/types/api.types.d.ts +299 -0
- package/dist/plugins/service/types/api.types.d.ts.map +1 -0
- package/dist/plugins/service/types/index.d.ts +6 -0
- package/dist/plugins/service/types/index.d.ts.map +1 -0
- package/dist/plugins/skin/ISkin.d.ts +62 -0
- package/dist/plugins/skin/ISkin.d.ts.map +1 -0
- package/dist/plugins/skin/Skin.d.ts +155 -0
- package/dist/plugins/skin/Skin.d.ts.map +1 -0
- package/dist/plugins/skin/SkinPlugin.d.ts +285 -0
- package/dist/plugins/skin/SkinPlugin.d.ts.map +1 -0
- package/dist/plugins/skin/SkinPlugin.types.d.ts +56 -0
- package/dist/plugins/skin/SkinPlugin.types.d.ts.map +1 -0
- package/dist/plugins/skin/index.d.ts +5 -0
- package/dist/plugins/skin/index.d.ts.map +1 -0
- package/dist/plugins/sound/SoundPlugin.d.ts +319 -0
- package/dist/plugins/sound/SoundPlugin.d.ts.map +1 -0
- package/dist/plugins/sound/SoundPlugin.types.d.ts +102 -0
- package/dist/plugins/sound/SoundPlugin.types.d.ts.map +1 -0
- package/dist/plugins/sound/SoundTestGUI.d.ts +42 -0
- package/dist/plugins/sound/SoundTestGUI.d.ts.map +1 -0
- package/dist/plugins/sound/index.d.ts +4 -0
- package/dist/plugins/sound/index.d.ts.map +1 -0
- package/dist/state-machine/ConfigBuilder.d.ts +239 -0
- package/dist/state-machine/ConfigBuilder.d.ts.map +1 -0
- package/dist/state-machine/StateMachine.d.ts +251 -0
- package/dist/state-machine/StateMachine.d.ts.map +1 -0
- package/dist/state-machine/guards.d.ts +151 -0
- package/dist/state-machine/guards.d.ts.map +1 -0
- package/dist/state-machine/index.d.ts +5 -0
- package/dist/state-machine/index.d.ts.map +1 -0
- package/dist/state-machine/index.js +954 -0
- package/dist/state-machine/index.js.map +1 -0
- package/dist/state-machine/types.d.ts +65 -0
- package/dist/state-machine/types.d.ts.map +1 -0
- package/dist/store/DataStore.d.ts +167 -0
- package/dist/store/DataStore.d.ts.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +197 -0
- package/dist/store/index.js.map +1 -0
- package/dist/ui/behaviors/ButtonBehavior.d.ts +245 -0
- package/dist/ui/behaviors/ButtonBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/InputBehavior.d.ts +169 -0
- package/dist/ui/behaviors/InputBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/ScrollbarBehavior.d.ts +371 -0
- package/dist/ui/behaviors/ScrollbarBehavior.d.ts.map +1 -0
- package/dist/ui/behaviors/index.d.ts +4 -0
- package/dist/ui/behaviors/index.d.ts.map +1 -0
- package/dist/ui/components/ButtonComp.d.ts +138 -0
- package/dist/ui/components/ButtonComp.d.ts.map +1 -0
- package/dist/ui/components/Comp.utils.d.ts +390 -0
- package/dist/ui/components/Comp.utils.d.ts.map +1 -0
- package/dist/ui/components/Component.types.d.ts +41 -0
- package/dist/ui/components/Component.types.d.ts.map +1 -0
- package/dist/ui/components/InputComp.d.ts +43 -0
- package/dist/ui/components/InputComp.d.ts.map +1 -0
- package/dist/ui/components/LabelBox.d.ts +49 -0
- package/dist/ui/components/LabelBox.d.ts.map +1 -0
- package/dist/ui/components/ListTableComp.d.ts +106 -0
- package/dist/ui/components/ListTableComp.d.ts.map +1 -0
- package/dist/ui/components/Skinable.d.ts +261 -0
- package/dist/ui/components/Skinable.d.ts.map +1 -0
- package/dist/ui/components/SliderComp.d.ts +60 -0
- package/dist/ui/components/SliderComp.d.ts.map +1 -0
- package/dist/ui/components/SpriteTextBBCode.d.ts +16 -0
- package/dist/ui/components/SpriteTextBBCode.d.ts.map +1 -0
- package/dist/ui/components/StepperComp.d.ts +89 -0
- package/dist/ui/components/StepperComp.d.ts.map +1 -0
- package/dist/ui/components/index.d.ts +12 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteText.d.ts +114 -0
- package/dist/ui/components/spriteText/SpriteText.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteText.types.d.ts +109 -0
- package/dist/ui/components/spriteText/SpriteText.types.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextAlignment.d.ts +25 -0
- package/dist/ui/components/spriteText/SpriteTextAlignment.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextBezier.d.ts +20 -0
- package/dist/ui/components/spriteText/SpriteTextBezier.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextCurve.d.ts +4 -0
- package/dist/ui/components/spriteText/SpriteTextCurve.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextKerning.d.ts +7 -0
- package/dist/ui/components/spriteText/SpriteTextKerning.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextTexture.d.ts +16 -0
- package/dist/ui/components/spriteText/SpriteTextTexture.d.ts.map +1 -0
- package/dist/ui/components/spriteText/SpriteTextWrap.d.ts +19 -0
- package/dist/ui/components/spriteText/SpriteTextWrap.d.ts.map +1 -0
- package/dist/ui/components/spriteText/index.d.ts +3 -0
- package/dist/ui/components/spriteText/index.d.ts.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +4778 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/ArrayUtils.d.ts +24 -0
- package/dist/utils/ArrayUtils.d.ts.map +1 -0
- package/dist/utils/ColorUtils.d.ts +34 -0
- package/dist/utils/ColorUtils.d.ts.map +1 -0
- package/dist/utils/DataInjector.d.ts +67 -0
- package/dist/utils/DataInjector.d.ts.map +1 -0
- package/dist/utils/Logger.d.ts +332 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/NumberFormatter.d.ts +126 -0
- package/dist/utils/NumberFormatter.d.ts.map +1 -0
- package/dist/utils/ObjectUtils.d.ts +64 -0
- package/dist/utils/ObjectUtils.d.ts.map +1 -0
- package/dist/utils/PixiUtils.d.ts +118 -0
- package/dist/utils/PixiUtils.d.ts.map +1 -0
- package/dist/utils/Throttle.d.ts +103 -0
- package/dist/utils/Throttle.d.ts.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +899 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +126 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/mergeLocalesPlugin.d.ts +22 -0
- package/dist/vite/mergeLocalesPlugin.d.ts.map +1 -0
- package/package.json +143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../devtools/DraggableController.ts","../../devtools/ResizableController.ts","../../devtools/treePlugin.ts","../../devtools/overlayPlugin.ts","../../devtools/spriteTextPropertiesPlugin.ts","../../devtools/spinePropertiesPlugin.ts","../../devtools/index.ts","../../utils/Logger.ts","../../plugins/Plugin.types.ts","../../engine/PixiEngine.ts"],"names":["_a","SECTION","logger","PixiApplication"],"mappings":";;;;;;;AAYA,IAAM,UAAA,uBAAiB,OAAA,EAA8B;AACrD,IAAM,kBAAA,uBAAyB,OAAA,EAA2B;AAC1D,IAAM,eAAA,uBAAsB,OAAA,EAA2B;AAEvD,SAAS,YAAsC,CAAA,EAA0B;AACvE,EAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,EAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,EAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AAEd,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA;AAExC,EAAA,UAAA,CAAW,IAAI,IAAA,EAAM;AAAA,IACnB,OAAA,EAAS,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,IAC3B,OAAA,EAAS,QAAA,CAAS,CAAA,GAAI,IAAA,CAAK;AAAA,GAC5B,CAAA;AAED,EAAA,CAAA,CAAE,eAAA,EAAgB;AACpB;AAEA,SAAS,WAAqC,CAAA,EAA0B;AACtE,EAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA;AAExC,EAAA,IAAA,CAAK,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,KAAA,CAAM,OAAA;AAC5B,EAAA,IAAA,CAAK,CAAA,GAAI,QAAA,CAAS,CAAA,GAAI,KAAA,CAAM,OAAA;AAC9B;AAEA,SAAS,SAAA,GAAoC;AAC3C,EAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,EAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,EAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,EAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AACxB;AAEO,SAAS,WAAW,SAAA,EAAqC;AAC9D,EAAA,kBAAA,CAAmB,GAAA,CAAI,SAAA,EAAW,SAAA,CAAU,SAAmB,CAAA;AAC/D,EAAA,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,SAAA,CAAU,MAAgB,CAAA;AAEzD,EAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AACtB,EAAA,SAAA,CAAU,MAAA,GAAS,MAAA;AAEnB,EAAA,SAAA,CAAU,EAAA,CAAG,aAAA,EAAe,WAAA,EAAa,SAAS,CAAA;AAClD,EAAA,SAAA,CAAU,EAAA,CAAG,mBAAA,EAAqB,UAAA,EAAY,SAAS,CAAA;AACvD,EAAA,SAAA,CAAU,EAAA,CAAG,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA;AAC9C,EAAA,SAAA,CAAU,EAAA,CAAG,kBAAA,EAAoB,SAAA,EAAW,SAAS,CAAA;AACvD;AAEO,SAAS,YAAY,SAAA,EAAqC;AAC/D,EAAA,SAAA,CAAU,GAAA,CAAI,aAAA,EAAe,WAAA,EAAa,SAAS,CAAA;AACnD,EAAA,SAAA,CAAU,GAAA,CAAI,mBAAA,EAAqB,UAAA,EAAY,SAAS,CAAA;AACxD,EAAA,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA;AAC/C,EAAA,SAAA,CAAU,GAAA,CAAI,kBAAA,EAAoB,SAAA,EAAW,SAAS,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,GAAA,CAAI,SAAS,CAAA;AACrD,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,SAAA,CAAU,SAAA,GAAY,YAAA;AAAA,EACxB;AAEA,EAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AACpD,EAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,IAAA,SAAA,CAAU,MAAA,GAAS,cAAA;AAAA,EACrB;AAEA,EAAA,SAAA,CAAU,UAAA,GAAa,KAAA;AACvB,EAAA,UAAA,CAAW,OAAO,SAAS,CAAA;AAC3B,EAAA,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACnC,EAAA,eAAA,CAAgB,OAAO,SAAS,CAAA;AAClC;AAMO,SAAS,WAAW,SAAA,EAAwC;AACjE,EAAA,OAAO,UAAU,UAAA,KAAe,IAAA;AAClC;;;ACvEA,IAAM,YAAA,uBAAmB,OAAA,EAAgC;AACzD,IAAM,WAAA,GAAc,EAAA;AAEpB,IAAM,OAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,aAAA;AAAA,EACJ,CAAA,EAAG,WAAA;AAAA,EACH,EAAA,EAAI,aAAA;AAAA,EACJ,CAAA,EAAG,WAAA;AAAA,EACH,EAAA,EAAI,aAAA;AAAA,EACJ,CAAA,EAAG,WAAA;AAAA,EACH,EAAA,EAAI,aAAA;AAAA,EACJ,CAAA,EAAG;AACL,CAAA;AAEA,SAAS,iBAAiB,SAAA,EAAgD;AA1C1E,EAAA,IAAAA,GAAAA,EAAA,EAAA;AA2CE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAA,CAAA,CAAYA,MAAA,SAAA,CAAkB,SAAA,KAAlB,gBAAAA,GAAAA,CAA6B,QAAA,MAAA,CAC5C,EAAA,GAAA,UAAA,CAAmB,YAAA,KAAnB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAiC,QAAA,CAAA;AACpC,IAAA,IAAI,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAU,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAGtC,IAAA,OAAO,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,EACxC;AACF;AAEA,SAAS,uBAAuB,MAAA,EAA2C;AAvD3E,EAAA,IAAAA,GAAAA;AAwDE,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,SAAA,GAAY,yBAAA;AAChB,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAWpB,EAAA,CAAAA,GAAAA,GAAA,MAAA,CAAO,aAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,IAAsB,WAAA,CAAY,GAAA,CAAA;AAElC,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAA,GAAkC;AACzC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMpB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,GAAA,EAAqC;AAC5D,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,QAAQ,MAAA,GAAS,GAAA;AACrB,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU;AAAA;AAAA,WAAA,EAET,WAAW,CAAA;AAAA,YAAA,EACV,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EAIX,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAMxB,EAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,IAAA,GAAA,CAAI,MAAM,UAAA,GAAa,SAAA;AAAA,EACzB,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACvC,IAAA,GAAA,CAAI,MAAM,UAAA,GAAa,SAAA;AAAA,EACzB,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,WAA+B,MAAA,EAA0C;AACpG,EAAA,MAAM,gBAAA,GAAmB,uBAAuB,MAAM,CAAA;AACtD,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAEnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoC;AACxD,EAAA,MAAM,SAAA,GAA8B,CAAC,IAAA,EAAM,GAAA,EAAK,MAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAG,CAAA;AAE/E,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACzB,IAAA,MAAM,MAAA,GAAS,gBAAgB,GAAG,CAAA;AAClC,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAM,CAAA;AACvB,IAAA,gBAAA,CAAiB,YAAY,MAAM,CAAA;AAEnC,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,SAAA,EAAW,KAAK,CAAC,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,gBAAA;AAAA,IACX,OAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACf;AACF;AAEA,SAAS,sBAAA,CAAuB,WAA+B,MAAA,EAAiC;AA5IhG,EAAA,IAAAA,GAAAA,EAAA,EAAA;AA6IE,EAAA,MAAM,UAAU,SAAA,CAAU,eAAA;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,MAAA,GAAS,UAAU,SAAA,EAAU;AACnC,EAAA,MAAM,UAAA,GAAa,OAAO,qBAAA,EAAsB;AAGhD,EAAA,MAAM,QAAA,GAAA,CAAA,CAAYA,MAAA,UAAA,CAAmB,YAAA,KAAnB,gBAAAA,GAAAA,CAAiC,QAAA,MAAA,CAChD,EAAA,GAAA,SAAA,CAAkB,SAAA,KAAlB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA6B,QAAA,CAAA;AAEhC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,GAAS,UAAA,CAAW,QAAQ,QAAA,CAAS,KAAA;AACrC,IAAA,MAAA,GAAS,UAAA,CAAW,SAAS,QAAA,CAAS,MAAA;AAAA,EACxC;AAEA,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,GAAI,MAAA;AACrB,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,GAAI,MAAA;AACrB,EAAA,MAAM,CAAA,GAAI,OAAO,KAAA,GAAQ,MAAA;AACzB,EAAA,MAAM,CAAA,GAAI,OAAO,MAAA,GAAS,MAAA;AAG1B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAChC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAC/B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACjC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAGlC,EAAA,MAAM,eAAA,GAAoE;AAAA,IACxE,EAAA,EAAI,EAAE,CAAA,EAAM,CAAA,EAAK;AAAA,IACjB,GAAG,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAK;AAAA,IACxB,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAK;AAAA,IACrB,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,EAAE;AAAA,IAC5B,IAAI,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAAA,IACzB,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAE;AAAA,IAC5B,EAAA,EAAI,EAAE,CAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAE;AAAA,IACrB,GAAG,EAAE,CAAA,EAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA;AAAE,GAC1B;AAEA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACvC,IAAA,MAAM,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG,GAAI,gBAAgB,GAAG,CAAA;AAC5C,IAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AACzB,IAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAAA,EAC1B,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,WAA+B,MAAA,EAAiC;AACvF,EAAA,MAAM,UAAU,SAAA,CAAU,eAAA;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,CAAC,SAAA,CAAU,WAAA,IAAe,CAAC,UAAU,eAAA,EAAiB;AAC1D,IAAA,sBAAA,CAAuB,WAAW,MAAM,CAAA;AACxC,IAAA,OAAA,CAAQ,WAAA,GAAc,sBAAsB,MAAM,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,OAAA,CAAQ,WAAA,GAAc,sBAAsB,MAAM,CAAA;AACpD;AAEA,SAAS,eAAe,OAAA,EAA8B;AACpD,EAAA,IAAI,OAAA,CAAQ,gBAAgB,IAAA,EAAM;AAChC,IAAA,oBAAA,CAAqB,QAAQ,WAAW,CAAA;AACxC,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAAA,EACxB;AACF;AAEA,SAAS,aAAA,CAAc,SAAA,EAA+B,MAAA,EAAwB,CAAA,EAAuB;AACnG,EAAA,IAAI,CAAC,UAAU,WAAA,EAAa;AAE5B,EAAA,SAAA,CAAU,UAAA,GAAa,IAAA;AAEvB,EAAA,MAAM,MAAA,GAAS,UAAU,cAAA,EAAe;AAExC,EAAA,YAAA,CAAa,IAAI,SAAA,EAAW;AAAA,IAC1B,MAAA;AAAA,IACA,QAAQ,CAAA,CAAE,OAAA;AAAA,IACV,QAAQ,CAAA,CAAE,OAAA;AAAA,IACV,WAAA,EAAa,UAAU,KAAA,CAAM,CAAA;AAAA,IAC7B,WAAA,EAAa,UAAU,KAAA,CAAM,CAAA;AAAA,IAC7B,WAAW,SAAA,CAAU,CAAA;AAAA,IACrB,WAAW,SAAA,CAAU,CAAA;AAAA,IACrB,aAAa,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA;AAAO,GAC3D,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAA4B;AAC1C,IAAA,YAAA,CAAa,WAAW,SAAS,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,WAAA,CAAY,SAAS,CAAA;AACrB,IAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAClD,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC/C,EAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,IAAI,CAAA;AAC7C;AAEA,SAAS,YAAA,CAAa,WAA+B,CAAA,EAAuB;AAC1E,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,SAAA,CAAU,UAAA,EAAY;AAErC,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,KAAA,CAAM,MAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,KAAA,CAAM,MAAA;AAE7B,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,KAAA;AACpC,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,MAAA;AACrC,EAAA,MAAM,UAAA,GAAa,YAAY,KAAA,CAAM,WAAA;AACrC,EAAA,MAAM,WAAA,GAAc,aAAa,KAAA,CAAM,WAAA;AAEvC,EAAA,IAAI,YAAY,KAAA,CAAM,WAAA;AACtB,EAAA,IAAI,YAAY,KAAA,CAAM,WAAA;AACtB,EAAA,IAAI,OAAO,KAAA,CAAM,SAAA;AACjB,EAAA,IAAI,OAAO,KAAA,CAAM,SAAA;AAEjB,EAAA,QAAQ,MAAM,MAAA;AAAQ,IACpB,KAAK,GAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA;AAAA,IACF,KAAK,GAAA;AACH,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,SAAA,GAAA,CAAa,aAAa,EAAA,IAAM,SAAA;AAChC,MAAA,SAAA,GAAA,CAAa,cAAc,EAAA,IAAM,UAAA;AACjC,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA,IAAA,GAAO,MAAM,SAAA,GAAY,EAAA;AACzB,MAAA;AAAA;AAIJ,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,SAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AACpB,IAAA,SAAA,CAAU,CAAA,GAAI,IAAA;AAAA,EAChB;AACA,EAAA,IAAI,YAAY,GAAA,EAAK;AACnB,IAAA,SAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AACpB,IAAA,SAAA,CAAU,CAAA,GAAI,IAAA;AAAA,EAChB;AACF;AAEA,SAAS,YAAY,SAAA,EAAqC;AACxD,EAAA,SAAA,CAAU,UAAA,GAAa,KAAA;AACvB,EAAA,YAAA,CAAa,OAAO,SAAS,CAAA;AAC/B;AAEO,SAAS,aAAa,SAAA,EAAqC;AAChE,EAAA,IAAI,UAAU,eAAA,EAAiB;AAE/B,EAAA,MAAM,MAAA,GAAS,iBAAiB,SAAS,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAK,wCAAwC,CAAA;AACrD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,MAAM,CAAA;AACrD,EAAA,SAAA,CAAU,eAAA,GAAkB,OAAA;AAE5B,EAAA,sBAAA,CAAuB,WAAW,MAAM,CAAA;AACxC,EAAA,eAAA,CAAgB,WAAW,MAAM,CAAA;AACnC;AAEO,SAAS,cAAc,SAAA,EAAqC;AACjE,EAAA,MAAM,UAAU,SAAA,CAAU,eAAA;AAC1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,cAAA,CAAe,OAAO,CAAA;AACtB,IAAA,OAAA,CAAQ,UAAU,MAAA,EAAO;AACzB,IAAA,SAAA,CAAU,eAAA,GAAkB,MAAA;AAAA,EAC9B;AACA,EAAA,SAAA,CAAU,UAAA,GAAa,KAAA;AACvB,EAAA,YAAA,CAAa,OAAO,SAAS,CAAA;AAC/B;AAMO,SAAS,WAAW,SAAA,EAAwC;AACjE,EAAA,OAAO,UAAU,UAAA,KAAe,IAAA;AAClC;;;ACjVO,IAAM,mBAAA,GAAqC;AAAA,EAChD,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,kBAAA,CAAmB,MAA8B,QAAA,EAAwB;AAEvE,IAAA,QAAA,CAAS,QAAS,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,KAAK,WAAA,IAAe;AAAA,KAC5B,CAAA;AAGD,IAAA,QAAA,CAAS,QAAS,IAAA,CAAK;AAAA,MACrB,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EAAO,KAAK,WAAA,IAAe;AAAA,KAC5B,CAAA;AAGD,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,WAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,WAAI,CAAA;AAExC,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA,IAAU,MAAM,GAAA,GAAM,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAAA,EACA,aAAA,CAAc,SAAA,EAAmC,UAAA,EAAoB,OAAA,EAAmB;AACtF,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,SAAA,CAAU,WAAA,GAAc,OAAA;AACxB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,SAAS,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,SAAS,CAAA;AAAA,MACvB;AAAA,IACF,CAAA,MAAA,IAAW,eAAe,QAAA,EAAU;AAClC,MAAA,SAAA,CAAU,WAAA,GAAc,OAAA;AACxB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,SAAS,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;ACjDA,IAAM,oBAAA,GAAqD;AAAA,EACzD,eAAA,EAAiB,2BAAA;AAAA,EACjB,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,iBAAA,GAAkD;AAAA,EACtD,eAAA,EAAiB,2BAAA;AAAA,EACjB,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,sBAAA,GAA2C;AAAA,EACtD,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,mBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,iBAAiB,IAAA,EAAwB;AACvC,IAAA,MAAM,CAAA,GAAI,IAAA;AAGV,IAAA,IAAI,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AACtB,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,wBAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AACtB,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,wBAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,IAAI,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,WAAA,CAAA,EAAc;AACzC,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,wBAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,OAAO,oBAAA;AAAA,EACT,CAAA;AAAA,EACA,cAAc,IAAA,EAAwB;AACpC,IAAA,MAAM,CAAA,GAAI,IAAA;AAGV,IAAA,IAAI,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,WAAA,CAAA,EAAc;AACzC,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,yBAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAGA,IAAA,OAAO,iBAAA;AAAA,EACT;AACF,CAAA;;;AChEA,IAAM,OAAA,GAAU,YAAA;AAyBhB,IAAM,eAAA,GAA4B;AAAA,EAChC,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EACA,0BAAA;AAAA,EACA,sBAAA;AAAA,EACA,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,0BAAA;AAAA,EACA,sBAAA;AAAA,EACA,2BAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,iCAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,aAAa,SAAA,EAA+B;AAEnD,EAAA,MAAM,IAAA,GAAO,UAAU,WAAA,CAAY,IAAA;AACnC,EAAA,IAAI,IAAA,KAAS,cAAc,OAAO,IAAA;AAGlC,EAAA,MAAM,CAAA,GAAI,SAAA;AACV,EAAA,MAAM,MAAA,GAAS,EAAE,KAAA,KAAU,MAAA,IACzB,EAAE,KAAA,KAAU,MAAA,IACZ,EAAE,OAAA,KAAY,MAAA;AAEhB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAA,CAAQ,GAAA,CAAI,iDAAiD,IAAI,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,0BAAA,GAAkD;AAAA,EAC7D,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,SAAS,SAAA,EAA+B;AACtC,IAAA,OAAO,aAAa,SAAS,CAAA;AAAA,EAC/B,CAAA;AAAA,EAEA,SAAS,IAAA,EAAuB;AAC9B,IAAA,OAAO,eAAA,CAAgB,SAAS,IAAI,CAAA;AAAA,EACtC,CAAA;AAAA,EAEA,WAAA,CAAY,SAAA,EAAsB,IAAA,EAAc,KAAA,EAAkB;AAChE,IAAA,MAAM,UAAA,GAAa,SAAA;AACnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAE/C,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,MAAA;AACH,QAAA,UAAA,CAAW,IAAA,GAAO,KAAA;AAClB,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,UAAA,CAAW,IAAA,GAAO,KAAA;AAClB,QAAA;AAAA,MACF,KAAK,MAAA;AAEH,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,UAAA,UAAA,CAAW,OAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,GAAA,EAAK,EAAE,GAAG,EAAE,CAAA;AAAA,QACvD,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,IAAA,GAAO,KAAA;AAAA,QACpB;AACA,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,UAAA,CAAW,QAAA,GAAW,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,UAAA,CAAW,eAAA,GAAkB,KAAA;AAC7B,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,UAAA,CAAW,aAAA,GAAgB,KAAA;AAC3B,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,UAAA,CAAW,SAAA,GAAY,KAAA;AACvB,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,UAAA,CAAW,aAAA,GAAgB,KAAA;AAC3B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,UAAA,CAAW,UAAA,GAAa,KAAA;AACxB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,UAAA,CAAW,QAAA,GAAW,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,UAAA,CAAW,aAAA,GAAgB,KAAA;AAC3B,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,UAAA,CAAW,SAAA,GAAY,KAAA;AACvB,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,UAAA,CAAW,cAAA,GAAiB,KAAA;AAC5B,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,UAAA,CAAW,cAAA,GAAiB,KAAA;AAC5B,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,UAAA,CAAW,YAAA,GAAe,KAAA;AAC1B,QAAA;AAAA,MACF,KAAK,sBAAA;AACH,QAAA,UAAA,CAAW,oBAAA,GAAuB,KAAA;AAClC,QAAA;AAAA,MACF,KAAK,sBAAA;AACH,QAAA,UAAA,CAAW,oBAAA,GAAuB,KAAA;AAClC,QAAA;AAAA;AACJ,EACF,CAAA;AAAA,EAEA,cAAc,SAAA,EAAyC;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,SAAA;AAEnB,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,iBAAA;AAAA,UACN,OAAO,UAAA,CAAW,IAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,MAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,sBAAA;AAAA,UACN,OAAO,UAAA,CAAW,SAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,0BAAA;AAAA,UACN,OAAO,UAAA,CAAW,aAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,gBAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,iBAAA;AAAA,UACN,OAAO,UAAA,CAAW,IAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,MAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,kBAAA;AAAA,UACN,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,UACjC,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,OAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,iBAAA;AAAA;AAAA,UAEN,OAAO,UAAA,CAAW,IAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,MAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,qBAAA;AAAA,UACN,OAAO,UAAA,CAAW,QAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,4BAAA;AAAA,UACN,OAAO,UAAA,CAAW,eAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,SAAS,EAAE,OAAA,EAAS,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAAE;AAClD,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,0BAAA;AAAA,UACN,OAAO,UAAA,CAAW,aAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,SAAS,EAAE,OAAA,EAAS,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAAE;AAClD,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,sBAAA;AAAA,UACN,OAAO,UAAA,CAAW,SAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,SAAS,EAAE,OAAA,EAAS,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAAE;AAClD,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,0BAAA;AAAA,UACN,OAAO,UAAA,CAAW,aAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,gBAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,uBAAA;AAAA,UACN,OAAO,UAAA,CAAW,UAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,aAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,qBAAA;AAAA,UACN,OAAO,UAAA,CAAW,QAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,0BAAA;AAAA,UACN,OAAO,UAAA,CAAW,aAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,sBAAA;AAAA,UACN,OAAO,UAAA,CAAW,SAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,OAAO,UAAA,CAAW,cAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,kBAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,OAAO,UAAA,CAAW,cAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,yBAAA;AAAA,UACN,OAAO,UAAA,CAAW,YAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,eAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,iCAAA;AAAA,UACN,OAAO,UAAA,CAAW,oBAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,iCAAA;AAAA,UACN,OAAO,UAAA,CAAW,oBAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,CAAC,CAAA;AAChE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF,CAAA;;;AClVA,IAAMC,QAAAA,GAAU,OAAA;AAkBhB,IAAM,UAAA,GAAuB;AAAA,EAC3B,wBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,QAAQ,SAAA,EAA+B;AA5BhD,EAAA,IAAAD,GAAAA,EAAA,EAAA;AA6BE,EAAA,MAAM,IAAA,GAAO,UAAU,WAAA,CAAY,IAAA;AACnC,EAAA,IAAI,IAAA,KAAS,SAAS,OAAO,IAAA;AAG7B,EAAA,MAAM,CAAA,GAAI,SAAA;AACV,EAAA,OAAO,CAAA,CAAE,QAAA,KAAa,MAAA,IACf,CAAA,CAAE,UAAU,MAAA,IAAA,CAAA,CACZ,EAAA,GAAA,CAAAA,GAAAA,GAAA,CAAA,CAAE,QAAA,KAAF,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAY,IAAA,KAAZ,mBAAkB,UAAA,MAAe,MAAA;AAC1C;AAEA,SAAS,kBAAkB,KAAA,EAA4B;AACrD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA,CAAS,IAAA,CAAK,WAAW,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,aAAa,KAAA,EAA4B;AAChD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB,KAAA,EAA0B;AAvDvD,EAAA,IAAAA,GAAAA;AAwDE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAClC,IAAA,OAAA,CAAA,CAAOA,GAAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,SAAA,KAAP,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAkB,IAAA,KAAQ,QAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAA,EAA0B;AAhElD,EAAA,IAAAA,GAAAA;AAiEE,EAAA,IAAI;AACF,IAAA,OAAA,CAAA,CAAOA,MAAA,KAAA,CAAM,QAAA,CAAS,IAAA,KAAf,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAqB,IAAA,KAAQ,SAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEO,IAAM,qBAAA,GAA6C;AAAA,EACxD,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,iBAAA;AAAA,IACN,IAAA,EAAM,kBAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,SAAS,SAAA,EAA+B;AACtC,IAAA,OAAO,QAAQ,SAAS,CAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,SAAS,IAAA,EAAuB;AAC9B,IAAA,OAAO,UAAA,CAAW,SAAS,IAAI,CAAA;AAAA,EACjC,CAAA;AAAA,EAEA,WAAA,CAAY,SAAA,EAAsB,IAAA,EAAc,KAAA,EAAkB;AAChE,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAE1C,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,aAAA;AACH,QAAA,IAAI;AACF,UAAC,KAAA,CAAM,QAAA,CAAiB,aAAA,CAAc,KAAK,CAAA;AAC3C,UAAC,KAAA,CAAM,SAAiB,mBAAA,EAAoB;AAAA,QAC9C,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,CAAC,CAAA;AAAA,QACvD;AACA,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,IAAI;AACF,UAAA,IAAI,KAAA,IAAS,UAAU,QAAA,EAAU;AAC/B,YAAA,KAAA,CAAM,KAAA,CAAM,YAAA,CAAa,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA;AAAA,UACzC,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,KAAA,CAAM,iBAAA,CAAkB,CAAA,EAAG,GAAG,CAAA;AAAA,UACtC;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAC,CAAA;AAAA,QAC5D;AACA,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,KAAA,CAAM,UAAA,GAAa,KAAA;AACnB,QAAA;AAAA;AACJ,EACF,CAAA;AAAA,EAEA,cAAc,SAAA,EAAyC;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,SAAA;AACd,MAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,aAAa,KAAK,CAAA;AAChC,MAAA,MAAM,WAAA,GAAc,oBAAoB,KAAK,CAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,eAAe,KAAK,CAAA;AAExC,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,wBAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,KAAA,EAAO;AAAA,YACL,OAAA,EAASC,QAAAA;AAAA,YACT,KAAA,EAAO,mBAAA;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,EAAE,QAAA,EAAU,IAAA;AAAK;AAC5B,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,qBAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,KAAA,EAAO;AAAA,YACL,OAAA,EAASA,QAAAA;AAAA,YACT,KAAA,EAAO,gBAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,SAAS,EAAE,OAAA,EAAS,CAAC,QAAA,EAAU,GAAG,UAAU,CAAA;AAAE;AAChD,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,mBAAA;AAAA,UACN,KAAA,EAAO,WAAA;AAAA,UACP,KAAA,EAAO;AAAA,YACL,OAAA,EAASA,QAAAA;AAAA,YACT,KAAA,EAAO,MAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA;AAAM;AAC5B,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,kBAAA;AAAA,UACN,OAAO,KAAA,CAAM,UAAA;AAAA,UACb,KAAA,EAAO;AAAA,YACL,OAAA,EAASA,QAAAA;AAAA,YACT,KAAA,EAAO,aAAA;AAAA,YACP,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,CAAC,CAAA;AAC3D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF,CAAA;;;ACzJA,IAAM,KAAA,GAAQ,UAAA;AAlBd,IAAA,EAAA;AAoBA,KAAA,CAAM,iBAAA,GAAoB;AAAA,EACxB,GAAG,KAAA,CAAM,iBAAA;AAAA,EACT,UAAA,EAAY;AAAA,IACV,GAAA,CAAA,CAAI,EAAA,GAAA,KAAA,CAAM,iBAAA,KAAN,IAAA,GAAA,MAAA,GAAA,EAAA,CAAyB,eAAc,EAAC;AAAA,IAC5C,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA;AAEJ,CAAA;;;AC+GO,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAClB,OAAe,QAAA;AAAA,EACP,MAAA;AAAA;AAAA,EAGS,cAAA,GAAiB;AAAA,IAChC,KAAA,EAAO,SAAA;AAAA,IACP,GAAA,EAAK,UAAA;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAAA;AAAA,EAGiB,aAAA,GAAgB;AAAA,IAC/B,SAAA,EAAW,aAAA;AAAA,IACX,OAAA,EAAS,gCAAA;AAAA,IACT,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,+BAAA;AAAA,IACP,IAAA,EAAM,kCAAA;AAAA,IACN,IAAA,EAAM,sCAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EAEiB,WAAA,GAAc;AAAA,IAC7B,CAAC,gBAAiB,OAAA;AAAA,IAClB,CAAC,eAAgB,MAAA;AAAA,IACjB,CAAC,eAAgB,MAAA;AAAA,IACjB,CAAC,gBAAiB,OAAA;AAAA,IAClB,CAAC,gBAAiB;AAAA,GACpB;AAAA,EAEiB,WAAA,GAAc;AAAA,IAC7B,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe,GAAA;AAAA,IACtC,CAAC,CAAA,cAAgB,IAAA,CAAK,cAAA,CAAe,MAAA;AAAA,IACrC,CAAC,CAAA,cAAgB,IAAA,CAAK,cAAA,CAAe,IAAA;AAAA,IACrC,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe,KAAA;AAAA,IACtC,CAAC,CAAA,eAAiB,IAAA,CAAK,cAAA,CAAe;AAAA,GACxC;AAAA,EAEiB,kBAAA,GAAqB;AAAA,IACpC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc,KAAA;AAAA,IACrC,CAAC,CAAA,cAAgB,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,IACpC,CAAC,CAAA,cAAgB,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,IACpC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc,KAAA;AAAA,IACrC,CAAC,CAAA,eAAiB,IAAA,CAAK,aAAA,CAAc;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAc;AApMxB,IAAA,IAAAD,GAAAA;AAsMI,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA;AAAA,MACP,OAAA,EAAS,IAAA;AAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA;AAAA,MACf,UAAA,EAAY;AAAA;AAAA,KACd;AAEA,IAAA,IAAA,CAAKA,GAAAA,GAAA,MAAA,CAAA,IAAA,CAA4C,GAAA,KAA5C,IAAA,GAAA,MAAA,GAAAA,IAAiD,GAAA,EAAK;AACzD,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,WAAA,GAAsB;AAClC,IAAA,IAAI,CAAC,QAAO,QAAA,EAAU;AACpB,MAAA,OAAA,CAAO,QAAA,GAAW,IAAI,OAAA,EAAO;AAAA,IAC/B;AACA,IAAA,OAAO,OAAA,CAAO,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,MAAA,EAAqC;AACpD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,OAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,OAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,KAAA,EAAuB;AACrC,IAAA,IAAA,CAAK,OAAO,KAAA,GAAQ,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,GAAqB;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAElE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,KAAA,GAAQ,IAAA,CAAK,OAAO,KAAA,EAAO;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACnC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAW,WAAA;AAEpC,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACvC,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,eAAe,OAAA,EAA8D;AACnF,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AAEzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAA;AAAA,QACT,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,aAAa,CAAC,CAAA;AAAA,MACvB,cAAA,EAAgB,aAAa,CAAC;AAAA,KAChC;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,OAAe,QAAA,EAA2C;AAC9E,IAAA,IAAI,EAAC,qCAAU,MAAA,CAAA,EAAQ;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY;AAChC,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,OAAO,KAAA,CAAM,SAAS,OAAO,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,MAAA,OAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAiB,OAAA,EAA0B;AApWrD,IAAA,IAAAA,GAAAA,EAAA,EAAA;AAqWI,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAE3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAA,CAAA,CAAQA,GAAAA,GAAA,MAAA,CAAO,QAAA,KAAP,IAAA,GAAA,MAAA,GAAAA,GAAAA,CAAiB,MAAA,MAAA,CAAU,EAAA,GAAA,MAAA,CAAO,QAAA,KAAP,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,MAAA,CAAM,CAAA;AAE7E,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA,CAAK,eAAe,OAAO,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAO,QAAQ,CAAA;AAClE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,OAAO,QAAQ,CAAA;AACzE,IAAA,MAAM,UAAU,cAAA,IAAkB,cAAA;AAElC,IAAA,OAAO,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,CAAC,OAAA,GAAU,OAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAE1E,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,WAAA,GAAc,EAAA;AAGlB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AACzD,IAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,WAAA,GAAc,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAC,CAAA,EAAA,CAAA;AACjC,MAAA,cAAA,GAAiB,aAAa,CAAC,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,SAAA,GAAY,IAAI,GAAG,CAAA,EAAA,CAAA;AAAA,IACrB;AAGA,IAAA,QAAA,GAAW,CAAA,CAAA,EAAI,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA,EAAA,CAAA;AAGtC,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACzC,MAAA,MAAM,YAAA,GAAe,KAAK,cAAA,CAAe,IAAA;AACzC,MAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,CAAe,IAAA;AAC3C,MAAA,MAAM,YAAA,GAAe,KAAK,cAAA,CAAe,KAAA;AAEzC,MAAA,SAAA,GAAY,GAAG,cAAc,CAAA,EAAG,SAAS,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AACrE,MAAA,QAAA,GAAW,GAAG,UAAU,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAE/D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,GAAc,GAAG,YAAY,CAAA,EAAG,WAAW,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAAA,MACzE;AAEA,MAAA,cAAA,GAAiB,GAAG,YAAY,CAAA,EAAG,cAAc,CAAA,EAAG,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,QAAA,GAAW,WAAA,GAAc,cAAA;AAG9D,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,KAAA,CAAM,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACvC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,CAAA;AAAA,MACL,KAAK,CAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,GAAG,IAAI,CAAA;AACrC,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CAAW,KAAA,EAAiB,OAAA,EAAA,GAAoB,IAAA,EAAmB;AAEzE,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,sBAAsB,CAAA;AACzD,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,cAAA,GAAiB,OAAA;AAErB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,GAAU,aAAa,CAAC,CAAA;AACxB,MAAA,cAAA,GAAiB,aAAa,CAAC,CAAA;AAAA,IACjC;AAGA,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,MAAA,IAAU,QAAQ,GAAA,GAAM,IAAA;AACxB,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAA,IAAU,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AAC5C,IAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAG9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,IAAU,QAAQ,OAAA,GAAU,IAAA;AAC5B,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAAA,IAC5C;AAGA,IAAA,MAAA,IAAU,IAAA,GAAO,cAAA;AACjB,IAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAG1C,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC5C,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,CAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,CAAA;AAAA,MACL,KAAK,CAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAG,UAAA,EAAY,GAAG,IAAI,CAAA;AAC1C,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBO,oBAAoB,OAAA,EAAgC;AACzD,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAAA,EACxC;AACF,CAAA;AAoCO,IAAM,gBAAN,MAAoB;AAAA,EACjB,MAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CAAYE,SAAgB,OAAA,EAAiB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAASA,OAAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,IAAA,CAAK,YAAoB,IAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3D;AACF,CAAA;AAGO,IAAM,MAAA,GAAS,OAAO,WAAA,EAAY;AAGzC,IAAM,cAAA,uBAAqB,GAAA,EAA2B;AAqB/C,SAAS,UAAU,OAAA,EAAgC;AACxD,EAAA,IAAI,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAC1C,IAAA,cAAA,CAAe,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;;;ACjoBO,IAAM,YAAA,GAAe;AAAA,EAC1B,aAAA,EAAe,OAAO,eAAe,CAAA;AAAA,EACrC,OAAA,EAAS,OAAO,SAAS,CAAA;AAAA,EACzB,QAAA,EAAU,OAAO,UAAU,CAAA;AAAA,EAC3B,QAAA,EAAU,OAAO,UAAU;AAC7B,CAAA;ACJA,IAAM,WAAY,UAAA,CAAmB,iBAAA;AACrC,IAAI,qCAAU,UAAA,EAAY;AACxB,EAAA,QAAA,CAAS,UAAA,GAAa,SAAS,UAAA,CAAW,MAAA;AAAA,IACxC,CAAC,CAAA,KAAQ;AAVb,MAAA,IAAAF,GAAAA;AAUgB,MAAA,OAAA,CAAA,CAAAA,GAAAA,GAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,SAAA,KAAH,IAAA,GAAA,MAAA,GAAAA,IAAc,IAAA,MAAS,sBAAA;AAAA,IAAA;AAAA,GACrC;AACF;AAoFO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BtB,YAAsB,MAAA,EAA+B;AAA/B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACpB,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,qCAAA,EAAuC,MAAM,CAAA;AAG1E,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIG,WAAA,EAAgB;AAEpC,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,qCAAqC,CAAA;AAAA,EACpE;AAAA,EAhCQ,QAAA;AAAA,EACA,OAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,aAAA,GAAyB,KAAA;AAAA,EACzB,YAAA,uBAA6C,GAAA,EAAI;AAAA,EACjD,YAAA,uBAAgC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuDrC,eAAe,MAAA,EAA+B;AACnD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACjC,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAI,CAAA,wBAAA,CAA0B,CAAA;AACvF,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAA,CAAO,KAAA,GAAA,YAAA;AACP,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,YAAA,kBAA4B;AAEzD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACpC,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,YAAA,CAAc,CAAA;AAGlE,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBO,cAAc,IAAA,EAAuB;AAC1C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,MAAa,eAAe,WAAA,EAAsC;AAChE,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,OAAO,YAAY,KAAA,CAAM,CAAC,SAAS,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAA;AAEA,IAAA,IAAI,cAAa,EAAG;AAClB,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,QAAA,IAAI,cAAa,EAAG;AAClB,UAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,GAAG,EAAE,CAAA;AAAA,IACP,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,MAAA,EAAqC;AAElE,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,KAAA,YAAA,mBAA8B;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAGnE,MAAA,MAAA,CAAO,KAAA,GAAA,cAAA;AACP,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,cAAA,oBAA8B;AAG3D,MAAA,MAAM,MAAA,CAAO,WAAW,IAAI,CAAA;AAG5B,MAAA,MAAA,CAAO,KAAA,GAAA,aAAA;AACP,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,aAAA,mBAA6B;AAE1D,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAAA,IAClF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAA,GAAA,OAAA;AACP,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,OAAA,aAAuB;AACpD,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,gCAAgC,MAAA,CAAO,IAAI,MAAM,KAAK,CAAA;AACpF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,GAAiC;AAC7C,IAAA,MAAM,OAAA,GAAU,KAAK,yCAAA,EAA0C;AAE/D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC1E,UAAA,MAAM,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,QAC3B;AAGA,QAAA,MAAA,CAAO,KAAA,GAAA,OAAA;AACP,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,OAAA,aAAuB;AACpD,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAEjC,QAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,MACtE,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,GAAA,OAAA;AACP,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,IAAA,EAAA,OAAA,aAAuB;AACpD,QAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,8BAA8B,MAAA,CAAO,IAAI,MAAM,KAAK,CAAA;AAClF,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,GAAmC;AAE/C,IAAA,MAAM,aAAA,GAAgB,KAAK,yCAAA,EAA0C;AACrE,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,CAAA,aAAA,EAAgB,aAAA,CAAc,MAAM,CAAA,QAAA,CAAU,CAAA;AAG3E,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,MAAM,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,IACpC;AAEA,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,mCAAmC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,yCAAA,GAA4D;AAClE,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAChD,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,MAAM,sBAAgC,EAAC;AAEvC,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAA+B;AAC9C,MAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAE/B,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,QAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,CAAA,yCAAA,EAA4C,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACtF,QAAA;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,GAAA,CAAI,OAAO,IAAI,CAAA;AAGzB,MAAA,IAAI,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,EAAG;AACzD,QAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,OAAA,KAAY;AACvC,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,UACnB,CAAA,MAAO;AACL,YAAA,mBAAA,CAAoB,IAAA;AAAA,cAClB,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,YAAA,EAAe,OAAO,CAAA,yBAAA;AAAA,aAC9C;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,SAAA,CAAU,MAAA,CAAO,OAAO,IAAI,CAAA;AAC5B,MAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IACtB,CAAA;AAGA,IAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,QAAA,IAAY,GAAA,KAAQ,CAAA,CAAE,QAAA,IAAY,GAAA,CAAI,CAAA;AAGzF,IAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAA,CAAQ,MAAM,CAAC,CAAA;AAGpD,IAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAClC,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,6CAAA;AAAA,QACA,GAAG,mBAAA,CAAoB,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,UAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,QACjD,EAAA;AAAA,QACA,sBAAA;AAAA,QACA,uEAAA;AAAA,QACA,yDAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AAEX,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,YAAY,CAAA;AAC1C,MAAA,MAAM,IAAI,MAAM,CAAA,uDAAA,CAAyD,CAAA;AAAA,IAC3E;AAEA,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA;AAAA,MACtB,8BAAA;AAAA,MACA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,QAAQ,CAAA,CAAA,CAAG;AAAA,KACzD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwCA,MAAa,UAAA,GAA4B;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,IAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA;AAErC,IAAA,MAAM,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACvB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA,MACX,YAAA,EAAc,KAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,KAAA;AAAA,MACb,GAAG,IAAA,CAAK;AAAA,KACT,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,OAAO,QAAA,EAAU;AAChD,MAAA,CAAE,IAAA,CAAK,OAAO,QAAA,IAAY,IAAA,CAAK,OAAO,QAAA,EAA0B,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,IAClG,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,IAChD;AAEA,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,gCAAgC,CAAA;AAG7D,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAG7B,IAAA,MAAM,KAAK,eAAA,EAAgB;AAG3B,IAAA,MAAA,CAAO,WAAW,MAAM;AACtB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA;AAWA,IAAA,IAAA,CAAK,QAAA,EAAS;AAEd,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,iCAAiC,CAAA;AAE9D,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAGrB,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAE7B,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,wBAAwB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,QAAA,CAAS,QAAiB,OAAA,EAAwB;AAExD,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAK/B,IAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,CAAO,UAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO,WAAA;AAKjC,IAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,EAAW;AACtC,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,IAAI,MAAM,CAAA,OAAA,EAAU,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAE9F,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,CAAO,YAAA,CAAa,QAAQ,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAExG,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACxE,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B,MAAA,SAAA,CAAU,YAAY,CAAA,CAAE,IAAA,CAAK,uBAAuB,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,EAAW;AAEtC,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA,EAAG;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA,CAAE,IAAI,CAAA;AAC7C,UAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,QAC/E,SAAS,KAAA,EAAO;AACd,UAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,UAAU,MAAA,CAAO,IAAI,0BAA0B,KAAK,CAAA;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BO,UAAkC,IAAA,EAA6B;AACpE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBO,eAAuC,IAAA,EAAiB;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAa,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,oBAAA,CAAsB,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCO,UAAA,GAA6B;AAClC,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,QAAA,IAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,SAAA,EAAyB;AAE7C,IAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,EAAW;AAGtC,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAGjD,QAAA,SAAA,CAAU,YAAY,CAAA,CAAE,KAAA,CAAM,CAAA,gCAAA,EAAmC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC9E,QAAA;AAAA,MACF;AAAA,IACF;AAKA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0CO,SAAS,SAAA,EAAyB;AAEvC,IAAA,IAAA,CAAK,cAAc,SAAS,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,IAAW,OAAA,GAA2B;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAW,QAAA,GAAyB;AAClC,IAAA,OAAO,QAAA,CAAS,MAAM,QAAA,GAAW,SAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,gBAAA,GAAmB;AAC5B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,IAAoB,GAAG,CAAC,CAAA;AAAA,EACjD;AACF","file":"index.js","sourcesContent":["import type { Container, FederatedPointerEvent } from 'pixi.js';\n\nexport interface DraggableContainer extends Container {\n __draggable?: boolean;\n __dragging?: boolean;\n}\n\ninterface DragState {\n offsetX: number;\n offsetY: number;\n}\n\nconst dragStates = new WeakMap<Container, DragState>();\nconst originalEventModes = new WeakMap<Container, string>();\nconst originalCursors = new WeakMap<Container, string>();\n\nfunction onDragStart(this: DraggableContainer, e: FederatedPointerEvent) {\n if (!this.__draggable) return;\n\n this.__dragging = true;\n this.cursor = 'grabbing';\n\n const parent = this.parent;\n if (!parent) return;\n\n const localPos = parent.toLocal(e.global);\n\n dragStates.set(this, {\n offsetX: localPos.x - this.x,\n offsetY: localPos.y - this.y,\n });\n\n e.stopPropagation();\n}\n\nfunction onDragMove(this: DraggableContainer, e: FederatedPointerEvent) {\n if (!this.__dragging) return;\n\n const state = dragStates.get(this);\n if (!state) return;\n\n const parent = this.parent;\n if (!parent) return;\n\n const localPos = parent.toLocal(e.global);\n\n this.x = localPos.x - state.offsetX;\n this.y = localPos.y - state.offsetY;\n}\n\nfunction onDragEnd(this: DraggableContainer) {\n if (!this.__dragging) return;\n\n this.__dragging = false;\n this.cursor = 'grab';\n dragStates.delete(this);\n}\n\nexport function enableDrag(container: DraggableContainer): void {\n originalEventModes.set(container, container.eventMode as string);\n originalCursors.set(container, container.cursor as string);\n\n container.eventMode = 'static';\n container.cursor = 'grab';\n\n container.on('pointerdown', onDragStart, container);\n container.on('globalpointermove', onDragMove, container);\n container.on('pointerup', onDragEnd, container);\n container.on('pointerupoutside', onDragEnd, container);\n}\n\nexport function disableDrag(container: DraggableContainer): void {\n container.off('pointerdown', onDragStart, container);\n container.off('globalpointermove', onDragMove, container);\n container.off('pointerup', onDragEnd, container);\n container.off('pointerupoutside', onDragEnd, container);\n\n const originalMode = originalEventModes.get(container);\n if (originalMode !== undefined) {\n container.eventMode = originalMode as Container['eventMode'];\n }\n\n const originalCursor = originalCursors.get(container);\n if (originalCursor !== undefined) {\n container.cursor = originalCursor;\n }\n\n container.__dragging = false;\n dragStates.delete(container);\n originalEventModes.delete(container);\n originalCursors.delete(container);\n}\n\nexport function isDraggable(container: DraggableContainer): boolean {\n return container.__draggable === true;\n}\n\nexport function isDragging(container: DraggableContainer): boolean {\n return container.__dragging === true;\n}\n","import type { Container } from 'pixi.js';\n\nexport interface ResizableContainer extends Container {\n __resizable?: boolean;\n __resizing?: boolean;\n __resizeOverlay?: ResizeOverlay;\n}\n\ntype HandlePosition = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\ninterface ResizeState {\n handle: HandlePosition;\n startX: number;\n startY: number;\n startScaleX: number;\n startScaleY: number;\n startPosX: number;\n startPosY: number;\n startBounds: { width: number; height: number };\n}\n\ninterface ResizeOverlay {\n container: HTMLDivElement;\n handles: Map<HandlePosition, HTMLDivElement>;\n border: HTMLDivElement;\n animationId: number | null;\n}\n\nconst resizeStates = new WeakMap<Container, ResizeState>();\nconst HANDLE_SIZE = 10;\n\nconst cursors: Record<HandlePosition, string> = {\n nw: 'nwse-resize',\n n: 'ns-resize',\n ne: 'nesw-resize',\n e: 'ew-resize',\n se: 'nwse-resize',\n s: 'ns-resize',\n sw: 'nesw-resize',\n w: 'ew-resize',\n};\n\nfunction getCanvasElement(container: Container): HTMLCanvasElement | null {\n try {\n const renderer = (container as any).__pixiApp?.renderer ??\n (globalThis as any).__PIXI_APP__?.renderer;\n if (renderer?.canvas) return renderer.canvas;\n\n // Fallback: find canvas in DOM\n return document.querySelector('canvas');\n } catch {\n return document.querySelector('canvas');\n }\n}\n\nfunction createOverlayContainer(canvas: HTMLCanvasElement): HTMLDivElement {\n const div = document.createElement('div');\n div.className = '__pixi_resize_overlay__';\n div.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 10000;\n `;\n\n // Insert after canvas\n canvas.parentElement?.appendChild(div);\n\n return div;\n}\n\nfunction createBorderDiv(): HTMLDivElement {\n const div = document.createElement('div');\n div.style.cssText = `\n position: absolute;\n border: 2px dashed #00aaff;\n pointer-events: none;\n box-sizing: border-box;\n `;\n return div;\n}\n\nfunction createHandleDiv(pos: HandlePosition): HTMLDivElement {\n const div = document.createElement('div');\n div.dataset.handle = pos;\n div.style.cssText = `\n position: absolute;\n width: ${HANDLE_SIZE}px;\n height: ${HANDLE_SIZE}px;\n background: #00aaff;\n border: 1px solid white;\n border-radius: 2px;\n cursor: ${cursors[pos]};\n pointer-events: auto;\n transform: translate(-50%, -50%);\n transition: background 0.1s;\n `;\n\n div.addEventListener('mouseenter', () => {\n div.style.background = '#ff6600';\n });\n\n div.addEventListener('mouseleave', () => {\n div.style.background = '#00aaff';\n });\n\n return div;\n}\n\nfunction createResizeOverlay(container: ResizableContainer, canvas: HTMLCanvasElement): ResizeOverlay {\n const overlayContainer = createOverlayContainer(canvas);\n const border = createBorderDiv();\n overlayContainer.appendChild(border);\n\n const handles = new Map<HandlePosition, HTMLDivElement>();\n const positions: HandlePosition[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n positions.forEach((pos) => {\n const handle = createHandleDiv(pos);\n handles.set(pos, handle);\n overlayContainer.appendChild(handle);\n\n handle.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n e.stopPropagation();\n onResizeStart(container, pos, e);\n });\n });\n\n return {\n container: overlayContainer,\n handles,\n border,\n animationId: null,\n };\n}\n\nfunction updateOverlayPositions(container: ResizableContainer, canvas: HTMLCanvasElement): void {\n const overlay = container.__resizeOverlay;\n if (!overlay) return;\n\n const bounds = container.getBounds();\n const canvasRect = canvas.getBoundingClientRect();\n\n // Calculate position relative to canvas\n const renderer = (globalThis as any).__PIXI_APP__?.renderer ??\n (container as any).__pixiApp?.renderer;\n\n let scaleX = 1;\n let scaleY = 1;\n\n if (renderer) {\n scaleX = canvasRect.width / renderer.width;\n scaleY = canvasRect.height / renderer.height;\n }\n\n const x = bounds.x * scaleX;\n const y = bounds.y * scaleY;\n const w = bounds.width * scaleX;\n const h = bounds.height * scaleY;\n\n // Update border\n overlay.border.style.left = `${x}px`;\n overlay.border.style.top = `${y}px`;\n overlay.border.style.width = `${w}px`;\n overlay.border.style.height = `${h}px`;\n\n // Update handles\n const handlePositions: Record<HandlePosition, { x: number; y: number }> = {\n nw: { x: x, y: y },\n n: { x: x + w / 2, y: y },\n ne: { x: x + w, y: y },\n e: { x: x + w, y: y + h / 2 },\n se: { x: x + w, y: y + h },\n s: { x: x + w / 2, y: y + h },\n sw: { x: x, y: y + h },\n w: { x: x, y: y + h / 2 },\n };\n\n overlay.handles.forEach((handle, pos) => {\n const { x: hx, y: hy } = handlePositions[pos];\n handle.style.left = `${hx}px`;\n handle.style.top = `${hy}px`;\n });\n}\n\nfunction startUpdateLoop(container: ResizableContainer, canvas: HTMLCanvasElement): void {\n const overlay = container.__resizeOverlay;\n if (!overlay) return;\n\n const update = () => {\n if (!container.__resizable || !container.__resizeOverlay) return;\n updateOverlayPositions(container, canvas);\n overlay.animationId = requestAnimationFrame(update);\n };\n\n overlay.animationId = requestAnimationFrame(update);\n}\n\nfunction stopUpdateLoop(overlay: ResizeOverlay): void {\n if (overlay.animationId !== null) {\n cancelAnimationFrame(overlay.animationId);\n overlay.animationId = null;\n }\n}\n\nfunction onResizeStart(container: ResizableContainer, handle: HandlePosition, e: PointerEvent): void {\n if (!container.__resizable) return;\n\n container.__resizing = true;\n\n const bounds = container.getLocalBounds();\n\n resizeStates.set(container, {\n handle,\n startX: e.clientX,\n startY: e.clientY,\n startScaleX: container.scale.x,\n startScaleY: container.scale.y,\n startPosX: container.x,\n startPosY: container.y,\n startBounds: { width: bounds.width, height: bounds.height },\n });\n\n const onMove = (moveEvent: PointerEvent) => {\n onResizeMove(container, moveEvent);\n };\n\n const onUp = () => {\n onResizeEnd(container);\n document.removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerup', onUp);\n };\n\n document.addEventListener('pointermove', onMove);\n document.addEventListener('pointerup', onUp);\n}\n\nfunction onResizeMove(container: ResizableContainer, e: PointerEvent): void {\n const state = resizeStates.get(container);\n if (!state || !container.__resizing) return;\n\n const dx = e.clientX - state.startX;\n const dy = e.clientY - state.startY;\n\n const baseWidth = state.startBounds.width;\n const baseHeight = state.startBounds.height;\n const startWidth = baseWidth * state.startScaleX;\n const startHeight = baseHeight * state.startScaleY;\n\n let newScaleX = state.startScaleX;\n let newScaleY = state.startScaleY;\n let newX = state.startPosX;\n let newY = state.startPosY;\n\n switch (state.handle) {\n case 'e':\n newScaleX = (startWidth + dx) / baseWidth;\n break;\n case 'w':\n newScaleX = (startWidth - dx) / baseWidth;\n newX = state.startPosX + dx;\n break;\n case 's':\n newScaleY = (startHeight + dy) / baseHeight;\n break;\n case 'n':\n newScaleY = (startHeight - dy) / baseHeight;\n newY = state.startPosY + dy;\n break;\n case 'se':\n newScaleX = (startWidth + dx) / baseWidth;\n newScaleY = (startHeight + dy) / baseHeight;\n break;\n case 'sw':\n newScaleX = (startWidth - dx) / baseWidth;\n newScaleY = (startHeight + dy) / baseHeight;\n newX = state.startPosX + dx;\n break;\n case 'ne':\n newScaleX = (startWidth + dx) / baseWidth;\n newScaleY = (startHeight - dy) / baseHeight;\n newY = state.startPosY + dy;\n break;\n case 'nw':\n newScaleX = (startWidth - dx) / baseWidth;\n newScaleY = (startHeight - dy) / baseHeight;\n newX = state.startPosX + dx;\n newY = state.startPosY + dy;\n break;\n }\n\n // Minimum scale limit\n if (newScaleX > 0.1) {\n container.scale.x = newScaleX;\n container.x = newX;\n }\n if (newScaleY > 0.1) {\n container.scale.y = newScaleY;\n container.y = newY;\n }\n}\n\nfunction onResizeEnd(container: ResizableContainer): void {\n container.__resizing = false;\n resizeStates.delete(container);\n}\n\nexport function enableResize(container: ResizableContainer): void {\n if (container.__resizeOverlay) return;\n\n const canvas = getCanvasElement(container);\n if (!canvas) {\n console.warn('[ResizableController] Canvas not found');\n return;\n }\n\n const overlay = createResizeOverlay(container, canvas);\n container.__resizeOverlay = overlay;\n\n updateOverlayPositions(container, canvas);\n startUpdateLoop(container, canvas);\n}\n\nexport function disableResize(container: ResizableContainer): void {\n const overlay = container.__resizeOverlay;\n if (overlay) {\n stopUpdateLoop(overlay);\n overlay.container.remove();\n container.__resizeOverlay = undefined;\n }\n container.__resizing = false;\n resizeStates.delete(container);\n}\n\nexport function isResizable(container: ResizableContainer): boolean {\n return container.__resizable === true;\n}\n\nexport function isResizing(container: ResizableContainer): boolean {\n return container.__resizing === true;\n}\n","import type { Container } from 'pixi.js';\nimport type { PixiMetadata, TreeExtension } from '@pixi/devtools';\nimport { enableDrag, disableDrag, type DraggableContainer } from './DraggableController';\nimport { enableResize, disableResize, type ResizableContainer } from './ResizableController';\n\nexport interface TransformableContainer extends DraggableContainer, ResizableContainer { }\n\nexport const draggableTreePlugin: TreeExtension = {\n extension: {\n name: 'draggable-tree',\n type: 'sceneTree',\n },\n updateNodeMetadata(node: TransformableContainer, metadata: PixiMetadata) {\n // Drag toggle button\n metadata.buttons!.push({\n name: 'drag',\n icon: '✋',\n type: 'toggle',\n value: node.__draggable ?? false,\n });\n\n // Resize toggle button\n metadata.buttons!.push({\n name: 'resize',\n icon: '⤡',\n type: 'toggle',\n value: node.__resizable ?? false,\n });\n\n // Suffix indicators\n const suffixes: string[] = [];\n if (node.__draggable) suffixes.push('🔀');\n if (node.__resizable) suffixes.push('📐');\n\n if (suffixes.length > 0) {\n metadata.suffix = (metadata.suffix ?? '') + ' ' + suffixes.join('');\n }\n\n return metadata;\n },\n onButtonPress(container: TransformableContainer, buttonName: string, pressed?: boolean) {\n if (buttonName === 'drag') {\n container.__draggable = pressed;\n if (pressed) {\n enableDrag(container);\n } else {\n disableDrag(container);\n }\n } else if (buttonName === 'resize') {\n container.__resizable = pressed;\n if (pressed) {\n enableResize(container);\n } else {\n disableResize(container);\n }\n }\n },\n};\n","import type { Container } from 'pixi.js';\nimport type { OverlayExtension } from '@pixi/devtools';\nimport { isDragging, type DraggableContainer } from './DraggableController';\nimport { isResizing, type ResizableContainer } from './ResizableController';\n\ntype TransformableNode = DraggableContainer & ResizableContainer;\n\n// Default DevTools styles (from pixijs/devtools overlayExtension.ts)\nconst defaultSelectedStyle: Partial<CSSStyleDeclaration> = {\n backgroundColor: 'hsla(340, 70%, 44%, 0.35)',\n border: '1px solid hsla(0, 0%, 100%, 0.5)',\n};\n\nconst defaultHoverStyle: Partial<CSSStyleDeclaration> = {\n backgroundColor: 'hsla(192, 84%, 40%, 0.40)',\n border: '1px solid hsla(0, 0%, 100%, 0.5)',\n};\n\nexport const draggableOverlayPlugin: OverlayExtension = {\n extension: {\n name: 'draggable-overlay',\n type: 'overlay',\n },\n getSelectedStyle(node: Container | null) {\n const n = node as TransformableNode | null;\n\n // Dragging state - orange dashed\n if (n && isDragging(n)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.3)',\n border: '2px dashed orange',\n };\n }\n\n // Resizing state - orange dashed\n if (n && isResizing(n)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.3)',\n border: '2px dashed orange',\n };\n }\n\n // Draggable/Resizable enabled - orange solid\n if (n && (n.__draggable || n.__resizable)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.2)',\n border: '2px solid orange',\n };\n }\n\n // Default - return standard DevTools style\n return defaultSelectedStyle;\n },\n getHoverStyle(node: Container | null) {\n const n = node as TransformableNode | null;\n\n // Draggable/Resizable enabled - light orange\n if (n && (n.__draggable || n.__resizable)) {\n return {\n backgroundColor: 'rgba(255, 165, 0, 0.15)',\n border: '1px dashed orange',\n };\n }\n\n // Default - return standard DevTools style\n return defaultHoverStyle;\n },\n};","import type { Container } from 'pixi.js';\nimport type { PropertiesExtension, PropertiesEntry } from '@pixi/devtools';\n\nconst SECTION = 'SpriteText';\n\ninterface SpriteTextLike {\n text: string;\n plainText: string;\n font: string;\n fonts: string[];\n bbcodeEnabled: boolean;\n tint: number;\n fontSize: number;\n pivotHorizontal: string;\n pivotVertical: string;\n lineAlign: string;\n letterSpacing: number;\n spaceWidth: number;\n wordWrap: boolean;\n wordWrapWidth: number;\n breakWord: boolean;\n allowLineBreak: boolean;\n kerningEnabled: boolean;\n curveEnabled: boolean;\n curveControlXPercent: number;\n curveControlYPercent: number;\n}\n\nconst spriteTextProps: string[] = [\n 'spriteText.text',\n 'spriteText.font',\n 'spriteText.tint',\n 'spriteText.fontSize',\n 'spriteText.pivotHorizontal',\n 'spriteText.pivotVertical',\n 'spriteText.lineAlign',\n 'spriteText.letterSpacing',\n 'spriteText.spaceWidth',\n 'spriteText.wordWrap',\n 'spriteText.wordWrapWidth',\n 'spriteText.breakWord',\n 'spriteText.allowLineBreak',\n 'spriteText.kerningEnabled',\n 'spriteText.curveEnabled',\n 'spriteText.curveControlXPercent',\n 'spriteText.curveControlYPercent',\n];\n\nfunction isSpriteText(container: Container): boolean {\n // Check by constructor name or duck typing\n const name = container.constructor.name;\n if (name === 'SpriteText') return true;\n\n // Duck typing fallback\n const c = container as any;\n const isDuck = c._text !== undefined &&\n c._font !== undefined &&\n c._glyphs !== undefined;\n\n if (isDuck) {\n console.log('[SpriteText Plugin] Detected via duck typing:', name);\n }\n\n return isDuck;\n}\n\nexport const spriteTextPropertiesPlugin: PropertiesExtension = {\n extension: {\n type: 'sceneProperties' as any,\n name: 'spritetext-properties',\n priority: 10,\n },\n\n testNode(container: Container): boolean {\n return isSpriteText(container);\n },\n\n testProp(prop: string): boolean {\n return spriteTextProps.includes(prop);\n },\n\n setProperty(container: Container, prop: string, value: any): void {\n const spriteText = container as unknown as SpriteTextLike;\n const propName = prop.replace('spriteText.', '');\n\n switch (propName) {\n case 'text':\n spriteText.text = value;\n break;\n case 'font':\n spriteText.font = value;\n break;\n case 'tint':\n // DevTools sends color as number or hex string\n if (typeof value === 'string') {\n // Convert hex string (#ffffff) to number\n spriteText.tint = parseInt(value.replace('#', ''), 16);\n } else {\n spriteText.tint = value;\n }\n break;\n case 'fontSize':\n spriteText.fontSize = value;\n break;\n case 'pivotHorizontal':\n spriteText.pivotHorizontal = value;\n break;\n case 'pivotVertical':\n spriteText.pivotVertical = value;\n break;\n case 'lineAlign':\n spriteText.lineAlign = value;\n break;\n case 'letterSpacing':\n spriteText.letterSpacing = value;\n break;\n case 'spaceWidth':\n spriteText.spaceWidth = value;\n break;\n case 'wordWrap':\n spriteText.wordWrap = value;\n break;\n case 'wordWrapWidth':\n spriteText.wordWrapWidth = value;\n break;\n case 'breakWord':\n spriteText.breakWord = value;\n break;\n case 'allowLineBreak':\n spriteText.allowLineBreak = value;\n break;\n case 'kerningEnabled':\n spriteText.kerningEnabled = value;\n break;\n case 'curveEnabled':\n spriteText.curveEnabled = value;\n break;\n case 'curveControlXPercent':\n spriteText.curveControlXPercent = value;\n break;\n case 'curveControlYPercent':\n spriteText.curveControlYPercent = value;\n break;\n }\n },\n\n getProperties(container: Container): PropertiesEntry[] {\n try {\n const spriteText = container as unknown as SpriteTextLike;\n\n return [\n {\n prop: 'spriteText.text',\n value: spriteText.text,\n entry: {\n section: SECTION,\n label: 'Text',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.plainText',\n value: spriteText.plainText,\n entry: {\n section: SECTION,\n label: 'Plain Text',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.bbcodeEnabled',\n value: spriteText.bbcodeEnabled,\n entry: {\n section: SECTION,\n label: 'BBCode Enabled',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.font',\n value: spriteText.font,\n entry: {\n section: SECTION,\n label: 'Font',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.fonts',\n value: spriteText.fonts.join(', '),\n entry: {\n section: SECTION,\n label: 'Fonts',\n type: 'text',\n },\n },\n {\n prop: 'spriteText.tint',\n // DevTools color picker expects number\n value: spriteText.tint,\n entry: {\n section: SECTION,\n label: 'Tint',\n type: 'color',\n },\n },\n {\n prop: 'spriteText.fontSize',\n value: spriteText.fontSize,\n entry: {\n section: SECTION,\n label: 'Font Size',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.pivotHorizontal',\n value: spriteText.pivotHorizontal,\n entry: {\n section: SECTION,\n label: 'Pivot H',\n type: 'select',\n options: { options: ['left', 'center', 'right'] },\n },\n },\n {\n prop: 'spriteText.pivotVertical',\n value: spriteText.pivotVertical,\n entry: {\n section: SECTION,\n label: 'Pivot V',\n type: 'select',\n options: { options: ['top', 'middle', 'bottom'] },\n },\n },\n {\n prop: 'spriteText.lineAlign',\n value: spriteText.lineAlign,\n entry: {\n section: SECTION,\n label: 'Line Align',\n type: 'select',\n options: { options: ['left', 'center', 'right'] },\n },\n },\n {\n prop: 'spriteText.letterSpacing',\n value: spriteText.letterSpacing,\n entry: {\n section: SECTION,\n label: 'Letter Spacing',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.spaceWidth',\n value: spriteText.spaceWidth,\n entry: {\n section: SECTION,\n label: 'Space Width',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.wordWrap',\n value: spriteText.wordWrap,\n entry: {\n section: SECTION,\n label: 'Word Wrap',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.wordWrapWidth',\n value: spriteText.wordWrapWidth,\n entry: {\n section: SECTION,\n label: 'Wrap Width',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.breakWord',\n value: spriteText.breakWord,\n entry: {\n section: SECTION,\n label: 'Break Word',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.allowLineBreak',\n value: spriteText.allowLineBreak,\n entry: {\n section: SECTION,\n label: 'Allow Line Break',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.kerningEnabled',\n value: spriteText.kerningEnabled,\n entry: {\n section: SECTION,\n label: 'Kerning',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.curveEnabled',\n value: spriteText.curveEnabled,\n entry: {\n section: SECTION,\n label: 'Curve Enabled',\n type: 'boolean',\n },\n },\n {\n prop: 'spriteText.curveControlXPercent',\n value: spriteText.curveControlXPercent,\n entry: {\n section: SECTION,\n label: 'Curve X %',\n type: 'number',\n },\n },\n {\n prop: 'spriteText.curveControlYPercent',\n value: spriteText.curveControlYPercent,\n entry: {\n section: SECTION,\n label: 'Curve Y %',\n type: 'number',\n },\n },\n ];\n } catch (e) {\n console.error('[SpriteText Plugin] Error getting properties:', e);\n return [];\n }\n },\n};\n","import type { Container } from 'pixi.js';\nimport type { PropertiesExtension, PropertiesEntry } from '@pixi/devtools';\n\nconst SECTION = 'Spine';\n\ninterface SpineLike {\n skeleton: {\n data: {\n animations: Array<{ name: string }>;\n skins: Array<{ name: string }>;\n };\n skin: { name: string } | null;\n };\n state: {\n tracks: Array<{ animation?: { name: string } } | null>;\n setAnimation: (trackIndex: number, animationName: string, loop: boolean) => void;\n setEmptyAnimation: (trackIndex: number, mixDuration: number) => void;\n };\n autoUpdate: boolean;\n}\n\nconst spineProps: string[] = [\n 'spine.currentAnimation',\n 'spine.currentSkin',\n 'spine.autoUpdate',\n 'spine.playAnimation',\n];\n\nfunction isSpine(container: Container): boolean {\n const name = container.constructor.name;\n if (name === 'Spine') return true;\n\n // Duck typing fallback\n const c = container as any;\n return c.skeleton !== undefined &&\n c.state !== undefined &&\n c.skeleton?.data?.animations !== undefined;\n}\n\nfunction getAnimationNames(spine: SpineLike): string[] {\n try {\n return spine.skeleton.data.animations.map(a => a.name);\n } catch {\n return [];\n }\n}\n\nfunction getSkinNames(spine: SpineLike): string[] {\n try {\n return spine.skeleton.data.skins.map(s => s.name);\n } catch {\n return [];\n }\n}\n\nfunction getCurrentAnimation(spine: SpineLike): string {\n try {\n const track = spine.state.tracks[0];\n return track?.animation?.name ?? '(none)';\n } catch {\n return '(none)';\n }\n}\n\nfunction getCurrentSkin(spine: SpineLike): string {\n try {\n return spine.skeleton.skin?.name ?? 'default';\n } catch {\n return 'default';\n }\n}\n\nexport const spinePropertiesPlugin: PropertiesExtension = {\n extension: {\n type: 'sceneProperties' as any,\n name: 'spine-properties',\n priority: 10,\n },\n\n testNode(container: Container): boolean {\n return isSpine(container);\n },\n\n testProp(prop: string): boolean {\n return spineProps.includes(prop);\n },\n\n setProperty(container: Container, prop: string, value: any): void {\n const spine = container as unknown as SpineLike;\n const propName = prop.replace('spine.', '');\n\n switch (propName) {\n case 'currentSkin':\n try {\n (spine.skeleton as any).setSkinByName(value);\n (spine.skeleton as any).setSlotsToSetupPose();\n } catch (e) {\n console.error('[Spine Plugin] Error setting skin:', e);\n }\n break;\n case 'playAnimation':\n try {\n if (value && value !== '(none)') {\n spine.state.setAnimation(0, value, true);\n } else {\n spine.state.setEmptyAnimation(0, 0.2);\n }\n } catch (e) {\n console.error('[Spine Plugin] Error playing animation:', e);\n }\n break;\n case 'autoUpdate':\n spine.autoUpdate = value;\n break;\n }\n },\n\n getProperties(container: Container): PropertiesEntry[] {\n try {\n const spine = container as unknown as SpineLike;\n const animations = getAnimationNames(spine);\n const skins = getSkinNames(spine);\n const currentAnim = getCurrentAnimation(spine);\n const currentSkin = getCurrentSkin(spine);\n\n return [\n {\n prop: 'spine.currentAnimation',\n value: currentAnim,\n entry: {\n section: SECTION,\n label: 'Current Animation',\n type: 'text',\n options: { disabled: true },\n },\n },\n {\n prop: 'spine.playAnimation',\n value: currentAnim,\n entry: {\n section: SECTION,\n label: 'Play Animation',\n type: 'select',\n options: { options: ['(none)', ...animations] },\n },\n },\n {\n prop: 'spine.currentSkin',\n value: currentSkin,\n entry: {\n section: SECTION,\n label: 'Skin',\n type: 'select',\n options: { options: skins },\n },\n },\n {\n prop: 'spine.autoUpdate',\n value: spine.autoUpdate,\n entry: {\n section: SECTION,\n label: 'Auto Update',\n type: 'boolean',\n },\n },\n ];\n } catch (e) {\n console.error('[Spine Plugin] Error getting properties:', e);\n return [];\n }\n },\n};\n","import { draggableTreePlugin } from './treePlugin';\nimport { draggableOverlayPlugin } from './overlayPlugin';\nimport { spriteTextPropertiesPlugin } from './spriteTextPropertiesPlugin';\nimport { spinePropertiesPlugin } from './spinePropertiesPlugin';\n\nexport * from './treePlugin';\nexport * from './overlayPlugin';\nexport * from './DraggableController';\nexport * from './ResizableController';\nexport * from './spriteTextPropertiesPlugin';\nexport * from './spinePropertiesPlugin';\n\ninterface Devtools {\n __PIXI_DEVTOOLS__: {\n extensions: any[];\n };\n}\n\nconst gThis = globalThis as unknown as Devtools;\n\ngThis.__PIXI_DEVTOOLS__ = {\n ...gThis.__PIXI_DEVTOOLS__,\n extensions: [\n ...(gThis.__PIXI_DEVTOOLS__?.extensions ?? []),\n draggableTreePlugin,\n draggableOverlayPlugin,\n spriteTextPropertiesPlugin,\n spinePropertiesPlugin,\n ],\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * Log levels for filtering log output.\n *\n * Lower numeric values have higher priority.\n * Setting a log level will show that level and all higher priority levels.\n *\n * @example\n * ```typescript\n * // Set to INFO level\n * logger.setLevel(LogLevel.INFO);\n * // Will show: ERROR, WARN, INFO\n * // Will hide: DEBUG, TRACE\n * ```\n *\n * @public\n */\nexport enum LogLevel {\n /** Critical errors (always shown) */\n ERROR = 0,\n /** Warnings (shown at WARN level and above) */\n WARN = 1,\n /** Informational messages (shown at INFO level and above) */\n INFO = 2,\n /** Debug messages (shown at DEBUG level and above) */\n DEBUG = 3,\n /** Trace messages (most verbose, shown only at TRACE level) */\n TRACE = 4,\n}\n\nexport type LoggerFilterMatcher = string | RegExp;\n\nexport interface LoggerFilterConfig {\n contexts?: LoggerFilterMatcher[];\n messages?: LoggerFilterMatcher[];\n mode?: 'include' | 'exclude';\n}\n\n/**\n * Configuration options for the Logger.\n *\n * @public\n */\nexport interface LoggerConfig {\n /** Minimum log level to display */\n level: LogLevel;\n /** Whether logging is enabled */\n enabled: boolean;\n /** Whether to show timestamps in logs */\n showTimestamp: boolean;\n /** Whether to show colors in logs */\n showColors: boolean;\n filter?: LoggerFilterConfig;\n}\n\n/**\n * Singleton logger for centralized logging.\n *\n * Logger provides a unified logging system with:\n * - Multiple log levels (ERROR, WARN, INFO, DEBUG, TRACE)\n * - Colored output (browser and terminal)\n * - Timestamps\n * - Context-based sub-loggers\n * - Environment detection (browser vs Node.js)\n *\n * ## Features\n *\n * - **Singleton Pattern**: Single instance across the application\n * - **Log Levels**: Filter logs by severity\n * - **Colored Output**: CSS colors in browser, ANSI colors in terminal\n * - **Context Loggers**: Create sub-loggers with context prefixes\n * - **Timestamps**: Optional ISO timestamp display\n * - **Environment Aware**: Automatically detects browser vs Node.js\n *\n * ## Log Levels\n *\n * - **ERROR** (0): Critical errors\n * - **WARN** (1): Warnings\n * - **INFO** (2): Informational messages (default)\n * - **DEBUG** (3): Debug information\n * - **TRACE** (4): Detailed trace information\n *\n * @example\n * Basic usage:\n * ```typescript\n * import { logger, LogLevel } from '@rb-games/core/utils';\n *\n * // Configure logger\n * logger.configure({\n * level: LogLevel.DEBUG,\n * showTimestamp: true,\n * showColors: true\n * });\n *\n * // Log messages\n * logger.error('Critical error occurred');\n * logger.warn('This is a warning');\n * logger.info('Application started');\n * logger.debug('Debug information', { data: 'value' });\n * logger.trace('Detailed trace');\n * ```\n *\n * @example\n * Context loggers (used in plugins):\n * ```typescript\n * class MyPlugin {\n * private logger = logger.createContextLogger('MyPlugin');\n *\n * initialize() {\n * this.logger.info('Plugin initialized');\n * // Output: [2024-01-01T12:00:00.000Z] [INFO] [MyPlugin] Plugin initialized\n * }\n *\n * doSomething() {\n * this.logger.debug('Doing something', { value: 42 });\n * // Output: [2024-01-01T12:00:00.000Z] [DEBUG] [MyPlugin] Doing something { value: 42 }\n * }\n * }\n * ```\n *\n * @example\n * Production configuration:\n * ```typescript\n * // In production, only show errors and warnings\n * if (process.env.NODE_ENV === 'production') {\n * logger.setLevel(LogLevel.WARN);\n * } else {\n * logger.setLevel(LogLevel.DEBUG);\n * }\n * ```\n *\n * @example\n * Disable logging:\n * ```typescript\n * logger.setEnabled(false);\n * ```\n *\n * @category Utils\n * @public\n */\nexport class Logger {\n private static instance: Logger;\n private config: LoggerConfig;\n\n // Terminal colors (for Node.js environment)\n private readonly terminalColors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n green: '\\x1b[32m',\n gray: '\\x1b[90m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n white: '\\x1b[37m',\n };\n\n // Browser console colors (using CSS)\n private readonly browserColors = {\n timestamp: 'color: gray',\n context: 'color: cyan; font-weight: bold',\n message: 'color: white',\n error: 'color: red; font-weight: bold',\n warn: 'color: orange; font-weight: bold',\n info: 'color: dodgerblue; font-weight: bold',\n debug: 'color: green',\n trace: 'color: gray',\n };\n\n private readonly levelLabels = {\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.TRACE]: 'TRACE',\n };\n\n private readonly levelColors = {\n [LogLevel.ERROR]: this.terminalColors.red,\n [LogLevel.WARN]: this.terminalColors.yellow,\n [LogLevel.INFO]: this.terminalColors.blue,\n [LogLevel.DEBUG]: this.terminalColors.green,\n [LogLevel.TRACE]: this.terminalColors.gray,\n };\n\n private readonly levelBrowserColors = {\n [LogLevel.ERROR]: this.browserColors.error,\n [LogLevel.WARN]: this.browserColors.warn,\n [LogLevel.INFO]: this.browserColors.info,\n [LogLevel.DEBUG]: this.browserColors.debug,\n [LogLevel.TRACE]: this.browserColors.trace,\n };\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Default configuration\n this.config = {\n level: LogLevel.DEBUG, // Default log level\n enabled: true, // Logging enabled by default\n showTimestamp: false, // Show timestamps by default\n showColors: true, // Show colors by default\n };\n\n if ((import.meta as { env?: { DEV?: boolean } }).env?.DEV) {\n console.warn(\n '[Logger] For better debugging experience, add Logger.ts to DevTools ignore list:\\n' +\n 'DevTools → Settings (F1) → Ignore List → Add pattern: /Logger\\\\.ts$',\n );\n }\n }\n\n /**\n * Get the singleton instance of the Logger\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n /**\n * Configure the logger\n * @param config Configuration options\n */\n public configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Enable or disable logging\n * @param enabled Whether logging is enabled\n */\n public setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n }\n\n /**\n * Set the log level\n * @param level The log level to set\n */\n public setLevel(level: LogLevel): void {\n this.config.level = level;\n }\n\n /**\n * Get the current log level\n */\n public getLevel(): LogLevel {\n return this.config.level;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.log(LogLevel.ERROR, message, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.log(LogLevel.WARN, message, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.log(LogLevel.INFO, message, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.log(LogLevel.DEBUG, message, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.log(LogLevel.TRACE, message, ...args);\n }\n\n /**\n * Log a message with a specific log level\n * @param level The log level\n * @param message The message to log\n * @param args Additional arguments to log\n */\n private log(level: LogLevel, message: string, ...args: any[]): void {\n // Only log if enabled and the log level is sufficient\n if (!this.config.enabled || level > this.config.level) {\n return;\n }\n\n if (!this.shouldLogMessage(message)) {\n return;\n }\n\n // Check if we're in a browser environment\n const isBrowser = typeof window !== 'undefined';\n\n if (isBrowser && this.config.showColors) {\n this.logBrowser(level, message, ...args);\n } else {\n this.logTerminal(level, message, ...args);\n }\n }\n\n private extractContext(message: string): { context: string; messageContent: string } {\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n\n if (!contextMatch) {\n return {\n context: '',\n messageContent: message,\n };\n }\n\n return {\n context: contextMatch[1],\n messageContent: contextMatch[2],\n };\n }\n\n private matchesFilter(value: string, matchers?: LoggerFilterMatcher[]): boolean {\n if (!matchers?.length) {\n return false;\n }\n\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n\n matcher.lastIndex = 0;\n return matcher.test(value);\n });\n }\n\n private shouldLogMessage(message: string): boolean {\n const filter = this.config.filter;\n\n if (!filter) {\n return true;\n }\n\n const hasFilters = Boolean(filter.contexts?.length || filter.messages?.length);\n\n if (!hasFilters) {\n return true;\n }\n\n const { context, messageContent } = this.extractContext(message);\n const contextMatches = this.matchesFilter(context, filter.contexts);\n const messageMatches = this.matchesFilter(messageContent, filter.messages);\n const matches = contextMatches || messageMatches;\n\n return filter.mode === 'exclude' ? !matches : matches;\n }\n\n /**\n * Log a message in terminal/node environment\n */\n private logTerminal(level: LogLevel, message: string, ...args: any[]): void {\n // Prepare log prefix\n let timestamp = '';\n let levelStr = '';\n let contextPart = '';\n\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let messageContent = message;\n\n if (contextMatch) {\n contextPart = `[${contextMatch[1]}] `;\n messageContent = contextMatch[2];\n }\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n timestamp = `[${now}] `;\n }\n\n // Add log level\n levelStr = `[${this.levelLabels[level]}] `;\n\n // Format with colors if enabled\n if (this.config.showColors) {\n const levelColor = this.levelColors[level];\n const contextColor = this.terminalColors.cyan;\n const timestampColor = this.terminalColors.gray;\n const messageColor = this.terminalColors.white;\n\n timestamp = `${timestampColor}${timestamp}${this.terminalColors.reset}`;\n levelStr = `${levelColor}${levelStr}${this.terminalColors.reset}`;\n\n if (contextPart) {\n contextPart = `${contextColor}${contextPart}${this.terminalColors.reset}`;\n }\n\n messageContent = `${messageColor}${messageContent}${this.terminalColors.reset}`;\n }\n\n const formattedMessage = timestamp + levelStr + contextPart + messageContent;\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(formattedMessage, ...args);\n break;\n case LogLevel.WARN:\n console.warn(formattedMessage, ...args);\n break;\n case LogLevel.INFO:\n console.info(formattedMessage, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(formattedMessage, ...args);\n break;\n }\n }\n\n /**\n * Log a message in browser environment with CSS styling\n */\n private logBrowser(level: LogLevel, message: string, ...args: any[]): void {\n // Extract context if present\n const contextMatch = message.match(/^\\[([^\\]]+)\\]\\s(.*)$/);\n let context = '';\n let messageContent = message;\n\n if (contextMatch) {\n context = contextMatch[1];\n messageContent = contextMatch[2];\n }\n\n // Create CSS styled format string\n let format = '';\n const formatArgs: string[] = [];\n\n // Add timestamp if enabled\n if (this.config.showTimestamp) {\n const now = new Date().toISOString();\n format += '%c[' + now + '] ';\n formatArgs.push(this.browserColors.timestamp);\n }\n\n // Add log level with style\n format += '%c[' + this.levelLabels[level] + '] ';\n formatArgs.push(this.levelBrowserColors[level]);\n\n // Add context if present\n if (context) {\n format += '%c[' + context + '] ';\n formatArgs.push(this.browserColors.context);\n }\n\n // Add the actual message\n format += '%c' + messageContent;\n formatArgs.push(this.browserColors.message);\n\n // Log with console methods based on level\n switch (level) {\n case LogLevel.ERROR:\n console.error(format, ...formatArgs, ...args);\n break;\n case LogLevel.WARN:\n console.warn(format, ...formatArgs, ...args);\n break;\n case LogLevel.INFO:\n console.info(format, ...formatArgs, ...args);\n break;\n case LogLevel.DEBUG:\n case LogLevel.TRACE:\n default:\n console.log(format, ...formatArgs, ...args);\n break;\n }\n }\n\n /**\n * Creates a context-specific logger.\n *\n * Context loggers automatically prefix all log messages with a context tag.\n * Commonly used in plugins and classes to identify log sources.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns ContextLogger instance\n *\n * @example\n * ```typescript\n * class DisplayPlugin {\n * private logger = logger.createContextLogger('DisplayPlugin');\n *\n * initialize() {\n * this.logger.info('Initializing display');\n * // Output: [INFO] [DisplayPlugin] Initializing display\n * }\n * }\n * ```\n */\n public createContextLogger(context: string): ContextLogger {\n return new ContextLogger(this, context);\n }\n}\n\n/**\n * Context-specific logger that prefixes all messages.\n *\n * ContextLogger wraps the main Logger and automatically adds a context prefix\n * to all log messages. This makes it easy to identify which component or plugin\n * generated a log message.\n *\n * ## Usage\n *\n * Create context loggers using `logger.createContextLogger(context)`.\n * All log methods (error, warn, info, debug, trace) are available.\n *\n * @example\n * ```typescript\n * class ResourcePlugin {\n * private logger = logger.createContextLogger('ResourcePlugin');\n *\n * async loadAssets() {\n * this.logger.info('Loading assets...');\n * // Output: [INFO] [ResourcePlugin] Loading assets...\n *\n * try {\n * await this.load();\n * this.logger.info('Assets loaded successfully');\n * } catch (error) {\n * this.logger.error('Failed to load assets', error);\n * }\n * }\n * }\n * ```\n *\n * @category Utils\n * @public\n */\nexport class ContextLogger {\n private logger: Logger;\n private context: string;\n\n constructor(logger: Logger, context: string) {\n this.logger = logger;\n this.context = context;\n }\n\n /**\n * Log an error message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public error(message: string, ...args: any[]): void {\n this.logger.error(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a warning message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public warn(message: string, ...args: any[]): void {\n this.logger.warn(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log an info message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public info(message: string, ...args: any[]): void {\n this.logger.info(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a debug message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public debug(message: string, ...args: any[]): void {\n this.logger.debug(`[${this.context}] ${message}`, ...args);\n }\n\n /**\n * Log a trace message\n * @param message The message to log\n * @param args Additional arguments to log\n */\n public trace(message: string, ...args: any[]): void {\n this.logger.trace(`[${this.context}] ${message}`, ...args);\n }\n}\n\n// Export a default instance for convenience\nexport const logger = Logger.getInstance();\n\n// Cached context loggers for inline usage\nconst contextLoggers = new Map<string, ContextLogger>();\n\n/**\n * Get or create a cached context logger.\n * Same context string always returns the same instance.\n *\n * Preferred over class property pattern for easier tree-shaking\n * and production stripping.\n *\n * @param context - Context name (e.g., 'MyPlugin', 'SceneManager')\n * @returns Cached ContextLogger instance\n *\n * @example\n * ```typescript\n * import { getLogger } from '@rb-games/core/utils';\n *\n * // No class property needed - use inline\n * getLogger('MyClass').info('message');\n * getLogger('MyClass').debug('data', { x: 1 });\n * ```\n */\nexport function getLogger(context: string): ContextLogger {\n let cached = contextLoggers.get(context);\n if (!cached) {\n cached = new ContextLogger(logger, context);\n contextLoggers.set(context, cached);\n }\n return cached;\n}\n","import type { PixiEngine } from '../engine/PixiEngine';\n\n/**\n * Internal symbols for engine-only hook access\n * These symbols prevent external code from calling lifecycle hooks\n */\nexport const ENGINE_HOOKS = {\n onEngineReady: Symbol('onEngineReady'),\n onPause: Symbol('onPause'),\n onResume: Symbol('onResume'),\n onResize: Symbol('onResize'),\n} as const;\n\n/**\n * Plugin lifecycle states\n */\nexport enum PluginState {\n REGISTERED = 'registered',\n INITIALIZING = 'initializing',\n INITIALIZED = 'initialized',\n READY = 'ready',\n ERROR = 'error',\n}\n\n/**\n * Plugin interface\n */\nexport interface EnginePlugin {\n /**\n * Plugin name. Must be unique.\n */\n name: string;\n\n /**\n * Plugin priority. Lower values represent higher priority.\n */\n priority: number;\n\n /**\n * Current plugin state\n */\n state?: PluginState;\n\n /**\n * Plugin dependencies - other plugins that must be ready before this one\n */\n dependencies?: string[];\n\n /**\n * Method that will be executed when the plugin is first loaded.\n * @param engine PixiEngine instance\n * @returns Promise that resolves when plugin is fully initialized\n */\n initialize(engine: PixiEngine): Promise<void> | void;\n\n /**\n * Called after initialization to mark plugin as ready\n * This is where you can access other plugins safely\n * @param engine PixiEngine instance\n * @returns Promise that resolves when plugin is ready\n */\n onReady?(engine: PixiEngine): Promise<void> | void;\n\n /**\n * Method that will be executed when the plugin is cleaned up.\n */\n cleanup?(): void;\n\n /**\n * Called on every frame update.\n * @param delta Frame duration (ms)\n * @returns Boolean value\n */\n onUpdate?(delta: number): boolean;\n\n /**\n * Index signature to allow symbol-based properties for internal engine hooks\n * @internal - These are accessed via ENGINE_HOOKS symbols by PixiEngine only\n */\n [key: symbol]: any;\n}\n\n/**\n * Common configuration parameters for all plugins\n */\nexport interface PluginConfig {\n priority?: number;\n enabled?: boolean;\n name?: string;\n dependencies?: string[];\n}\n","import '@pixi/layout';\n\n// This part will be removed on production\n// -------------------------------------------------------------------\nimport '@pixi/layout/devtools';\nimport '../devtools';\n\nconst devtools = (globalThis as any).__PIXI_DEVTOOLS__;\nif (devtools?.extensions) {\n devtools.extensions = devtools.extensions.filter(\n (e: any) => e?.extension?.name !== 'layout-scene-overlay'\n );\n}\n// -------------------------------------------------------------------\n\n\nimport { Application as PixiApplication, ApplicationOptions, Container, Renderer } from 'pixi.js';\nimport { getLogger } from '../utils/Logger';\nimport { EnginePlugin, PluginState, ENGINE_HOOKS } from '../plugins/Plugin.types';\nimport { isMobile } from 'pixi.js';\n\n\nexport type PlatformType = 'mobile' | 'desktop';\n\n/**\n * Configuration interface for the PixiEngine.\n * Extends PixiJS ApplicationOptions to provide additional engine-specific settings.\n *\n * @public\n */\nexport interface EngineConfig extends ApplicationOptions {\n appendTo?: HTMLElement;\n}\n\n/**\n * Core game engine built on top of PixiJS with a plugin-based architecture.\n *\n * PixiEngine provides a robust foundation for building casino games by managing:\n * - PixiJS application lifecycle\n * - Plugin registration and initialization with dependency resolution\n * - Data storage and retrieval\n * - Automatic window resizing\n * - Frame update loop integration\n *\n * ## Architecture\n *\n * The engine follows a plugin-based architecture where functionality is added through\n * plugins that implement the {@link EnginePlugin} interface. Plugins can:\n * - Depend on other plugins (dependency resolution)\n * - Have initialization priorities\n * - Hook into lifecycle events (initialize, ready, update, resize)\n *\n * ## Plugin Lifecycle\n *\n * 1. **REGISTERED** - Plugin is registered but not initialized\n * 2. **INITIALIZING** - Plugin's initialize() method is being called\n * 3. **INITIALIZED** - Plugin initialization complete\n * 4. **READY** - Plugin's onReady() called, fully operational\n * 5. **ERROR** - Plugin failed to initialize\n *\n * ## Usage Example\n *\n * ```typescript\n * // Create engine instance\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true\n * });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n * engine.registerPlugin(new GameStatePlugin());\n *\n * // Initialize engine (initializes all plugins)\n * await engine.initialize();\n *\n * // Access plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n *\n * // Store/retrieve data\n * engine.setData('playerScore', 1000);\n * const score = engine.getData<number>('playerScore');\n *\n * // Update loop (typically called by GSAP ticker)\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @category Engine\n * @public\n */\nexport class PixiEngine {\n private _pixiApp: PixiApplication;\n private plugins: Map<string, EnginePlugin> = new Map();\n private isInitialized: boolean = false;\n private pluginStates: Map<string, PluginState> = new Map();\n private readyPlugins: Set<string> = new Set();\n\n /**\n * Creates a new PixiEngine instance.\n *\n * The constructor creates the underlying PixiJS application but does not initialize it.\n * Call {@link initialize} after registering all plugins to start the engine.\n *\n * @param config - Engine configuration options extending PixiJS ApplicationOptions\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({\n * width: 1920,\n * height: 1080,\n * backgroundColor: 0x1a1a1a,\n * antialias: true,\n * resolution: window.devicePixelRatio\n * });\n * ```\n */\n constructor(protected config: Partial<EngineConfig>) {\n getLogger('PixiEngine').info('PixiEngine initializing with config', config);\n\n // Create Pixi Application\n this._pixiApp = new PixiApplication();\n\n getLogger('PixiEngine').info('PixiEngine initialized successfully');\n }\n\n /**\n * Registers a plugin with the engine.\n *\n * Plugins must be registered before calling {@link initialize}. If the engine is already\n * initialized, the plugin will be initialized immediately upon registration.\n *\n * The plugin's state is set to {@link PluginState.REGISTERED} and it will be initialized\n * during the engine's initialization phase based on its priority and dependencies.\n *\n * @param plugin - The plugin instance to register\n * @returns `true` if the plugin was successfully registered, `false` if a plugin with the same name already exists\n *\n * @example\n * ```typescript\n * const scenePlugin = new ScenePlugin();\n * const success = engine.registerPlugin(scenePlugin);\n *\n * if (!success) {\n * console.warn('Plugin already registered');\n * }\n * ```\n *\n * @see {@link EnginePlugin} for plugin interface details\n * @see {@link getPlugin} to retrieve registered plugins\n */\n public registerPlugin(plugin: EnginePlugin): boolean {\n if (this.plugins.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Plugin with name \"${plugin.name}\" is already registered.`);\n return false;\n }\n\n // Set initial state\n plugin.state = PluginState.REGISTERED;\n this.pluginStates.set(plugin.name, PluginState.REGISTERED);\n\n this.plugins.set(plugin.name, plugin);\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" registered`);\n\n // If the engine is already initialized, initialize the plugin immediately\n if (this.isInitialized) {\n this.initializePlugin(plugin);\n }\n\n return true;\n }\n\n /**\n * Checks if a plugin has completed initialization and is ready to use.\n *\n * A plugin is considered ready when it has successfully completed both its\n * `initialize()` and `onReady()` lifecycle methods.\n *\n * @param name - The name of the plugin to check\n * @returns `true` if the plugin is in the {@link PluginState.READY} state, `false` otherwise\n *\n * @example\n * ```typescript\n * if (engine.isPluginReady('ScenePlugin')) {\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * }\n * ```\n */\n public isPluginReady(name: string): boolean {\n return this.readyPlugins.has(name);\n }\n\n /**\n * Waits asynchronously for specific plugins to reach the ready state.\n *\n * This method is useful when you need to ensure certain plugins are fully initialized\n * before proceeding with game logic. It polls every 10ms until all specified plugins\n * are ready.\n *\n * @param pluginNames - Array of plugin names to wait for\n * @returns A promise that resolves when all specified plugins are ready\n *\n * @example\n * ```typescript\n * // Wait for multiple plugins before starting the game\n * await engine.waitForPlugins(['ScenePlugin', 'AudioPlugin', 'GameStatePlugin']);\n *\n * // Now safe to use these plugins\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n * scenePlugin?.loadScene('MainMenu');\n * ```\n *\n * @remarks\n * If any of the specified plugins are not registered, this method will wait indefinitely.\n * Ensure all required plugins are registered before calling this method.\n */\n public async waitForPlugins(pluginNames: string[]): Promise<void> {\n const checkPlugins = () => {\n return pluginNames.every((name) => this.isPluginReady(name));\n };\n\n if (checkPlugins()) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const checkInterval = setInterval(() => {\n if (checkPlugins()) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 10); // Check every 10ms\n });\n }\n\n /**\n * Initialize a single plugin with dependency checking\n */\n private async initializePlugin(plugin: EnginePlugin): Promise<void> {\n // Skip if already processed\n if (this.pluginStates.get(plugin.name) !== PluginState.REGISTERED) {\n return;\n }\n\n try {\n getLogger('PixiEngine').debug(`Initializing plugin: ${plugin.name}`);\n\n // Set state to initializing\n plugin.state = PluginState.INITIALIZING;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZING);\n\n // Initialize the plugin\n await plugin.initialize(this);\n\n // Set state to initialized\n plugin.state = PluginState.INITIALIZED;\n this.pluginStates.set(plugin.name, PluginState.INITIALIZED);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" initialized successfully`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to initialize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n\n /**\n * Call onReady for all plugins after initialization is complete\n */\n private async finalizePlugins(): Promise<void> {\n const plugins = this.getPluginsSortedByPriorityAndDependencies();\n\n for (const plugin of plugins) {\n try {\n if (plugin.onReady) {\n getLogger('PixiEngine').debug(`Calling onReady for plugin: ${plugin.name}`);\n await plugin.onReady(this);\n }\n\n // Mark as ready\n plugin.state = PluginState.READY;\n this.pluginStates.set(plugin.name, PluginState.READY);\n this.readyPlugins.add(plugin.name);\n\n getLogger('PixiEngine').debug(`Plugin \"${plugin.name}\" is now ready`);\n } catch (error) {\n plugin.state = PluginState.ERROR;\n this.pluginStates.set(plugin.name, PluginState.ERROR);\n getLogger('PixiEngine').error(`Failed to finalize plugin \"${plugin.name}\":`, error);\n throw error;\n }\n }\n }\n\n /**\n * Initializes all plugins.\n */\n private async initializePlugins(): Promise<void> {\n // Initialize plugins in order based on their priority\n const sortedPlugins = this.getPluginsSortedByPriorityAndDependencies();\n getLogger('PixiEngine').info(`Initializing ${sortedPlugins.length} plugins`);\n\n // Initialize plugins sequentially based on dependencies\n for (const plugin of sortedPlugins) {\n await this.initializePlugin(plugin);\n }\n\n getLogger('PixiEngine').info('All plugins initialized and ready');\n }\n\n /**\n * Get plugins sorted by priority and dependency order\n */\n private getPluginsSortedByPriorityAndDependencies(): EnginePlugin[] {\n const plugins = Array.from(this.plugins.values());\n const resolved: EnginePlugin[] = [];\n const resolving = new Set<string>();\n const missingDependencies: string[] = [];\n\n const resolve = (plugin: EnginePlugin): void => {\n if (resolved.includes(plugin)) return;\n\n if (resolving.has(plugin.name)) {\n getLogger('PixiEngine').warn(`Circular dependency detected for plugin: ${plugin.name}`);\n return;\n }\n\n resolving.add(plugin.name);\n\n // Resolve dependencies first\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n plugin.dependencies.forEach((depName) => {\n const depPlugin = this.plugins.get(depName);\n if (depPlugin) {\n resolve(depPlugin);\n } else {\n missingDependencies.push(\n `Plugin \"${plugin.name}\" requires \"${depName}\" but it's not registered`,\n );\n }\n });\n }\n\n resolving.delete(plugin.name);\n resolved.push(plugin);\n };\n\n // Sort by priority first (higher priority = lower number)\n const sortedByPriority = plugins.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n // Resolve dependencies\n sortedByPriority.forEach((plugin) => resolve(plugin));\n\n // Handle missing dependencies\n if (missingDependencies.length > 0) {\n const errorMessage = [\n '❌ Plugin dependency validation failed:',\n ...missingDependencies.map((msg) => ` • ${msg}`),\n '',\n '💡 Solutions:',\n ' • Register missing plugins before calling engine.initialize()',\n ' • Remove dependencies from plugin configuration',\n ' • Make dependencies optional in plugin code',\n ].join('\\n');\n\n getLogger('PixiEngine').error(errorMessage);\n throw new Error(`Missing plugin dependencies. Check console for details.`);\n }\n\n getLogger('PixiEngine').debug(\n 'Plugin initialization order:',\n resolved.map((p) => `${p.name}(priority:${p.priority})`),\n );\n\n return resolved;\n }\n\n /**\n * Initializes the engine and all registered plugins.\n *\n * This method performs the complete engine startup sequence:\n * 1. Initializes the PixiJS application with the provided configuration\n * 2. Appends the canvas to the document body\n * 3. Initializes all plugins in dependency order (respecting priorities)\n * 4. Calls `onReady()` on all plugins after initialization\n * 5. Sets up window resize event handling\n *\n * Plugins are initialized in order based on:\n * - Dependencies (plugins wait for their dependencies)\n * - Priority (lower numbers = higher priority)\n *\n * @returns A promise that resolves when the engine and all plugins are fully initialized\n * @throws {Error} If plugin dependencies are missing or circular dependencies are detected\n *\n * @example\n * ```typescript\n * const engine = new PixiEngine({ width: 1920, height: 1080 });\n *\n * // Register plugins\n * engine.registerPlugin(new ScenePlugin());\n * engine.registerPlugin(new AudioPlugin());\n *\n * // Initialize everything\n * await engine.initialize();\n *\n * // Engine is now ready to use\n * console.log('Engine initialized successfully');\n * ```\n *\n * @remarks\n * - This method should only be called once\n * - All plugins should be registered before calling this method\n * - The canvas will be automatically appended to `document.body`\n * - Window resize events are automatically handled\n */\n public async initialize(): Promise<void> {\n const width = this.config.width ?? 1920;\n const height = this.config.height ?? 1080;\n\n await this._pixiApp.init({\n width,\n height,\n antialias: true,\n autoStart: false,\n sharedTicker: false,\n useBackBuffer: true,\n autoDensity: false,\n ...this.config,\n });\n\n if (this.config.resizeTo || this.config.appendTo) {\n ((this.config.resizeTo || this.config.appendTo) as HTMLElement).appendChild(this._pixiApp.canvas);\n } else {\n document.body.appendChild(this._pixiApp.canvas);\n }\n\n getLogger('PixiEngine').info('Starting engine initialization');\n\n // Initialize all plugins (async)\n await this.initializePlugins();\n\n // Call onReady for all plugins after initialization\n await this.finalizePlugins();\n\n // Register window resize event handler\n window.onresize = () => {\n this.onResize();\n }\n\n // const resizeObserver = new ResizeObserver((entries) => {\n // for (const entry of entries) {\n // const { width, height } = entry.contentRect;\n // this.onResize(width, height);\n // }\n // });\n // resizeObserver.observe((this.config.resizeTo || this.config.appendTo || window.document.body) as Element);\n\n // Initialize the resize handling to set initial size\n this.onResize();\n\n getLogger('PixiEngine').info('Engine initialization completed');\n\n this.isInitialized = true;\n\n // Call onEngineReady hook for all plugins\n await this.notifyEngineReady();\n\n getLogger('PixiEngine').info('PixiEngine initialized');\n }\n\n /**\n * Handles window resize events and notifies plugins.\n *\n * This method is automatically called when the window is resized and during\n * engine initialization. It updates the renderer size and notifies all plugins\n * about the resize event in priority order.\n *\n * If a plugin's `onResize` method returns `true`, it indicates that the plugin\n * has handled the resize and propagation stops. Otherwise, the engine will\n * resize the renderer to match the window dimensions.\n *\n * @remarks\n * This is a private method called automatically by the engine.\n * Plugins can implement `onResize(width, height)` to handle custom resize logic.\n */\n private onResize(_width?: number, _height?: number): void {\n // Update renderer size\n const renderer = this._pixiApp.renderer as Renderer;\n\n // this._pixiApp.canvas.style.display = \"none\";\n\n // Simple responsive approach\n const width = _width ?? window.innerWidth;\n const height = _height ?? window.innerHeight;\n\n // this._pixiApp.canvas.style.display = \"block\";\n\n // Notify plugins about resize and control propagation\n const sortedPlugins = this.getPlugins();\n let handled = false;\n\n getLogger('PixiEngine').info(`Window resized: ${width}x${height}, dpr: ${renderer.resolution}`);\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onResize] && plugin[ENGINE_HOOKS.onResize](width, height, this.devicePixelRatio)) {\n // Plugin reported it has handled the resize, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Resize handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n // If no plugin handles the resize, the engine will handle it itself\n if (!handled) {\n renderer.resize(width, height);\n getLogger('PixiEngine').info(`Resized renderer to ${width}x${height}`);\n }\n }\n\n /**\n * Notifies all plugins that the engine is fully ready\n * This is called after all plugins are initialized and ready\n */\n private async notifyEngineReady(): Promise<void> {\n const sortedPlugins = this.getPlugins();\n\n for (const plugin of sortedPlugins) {\n if (plugin[ENGINE_HOOKS.onEngineReady]) {\n try {\n await plugin[ENGINE_HOOKS.onEngineReady](this);\n getLogger('PixiEngine').debug(`Plugin ${plugin.name} onEngineReady completed`);\n } catch (error) {\n getLogger('PixiEngine').error(`Plugin ${plugin.name} onEngineReady failed:`, error);\n }\n }\n }\n }\n\n /**\n * Retrieves a registered plugin by name with type safety.\n *\n * This method allows you to access registered plugins with proper TypeScript typing.\n * Returns `undefined` if the plugin is not found.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance if found, `undefined` otherwise\n *\n * @example\n * ```typescript\n * // Get plugin with type safety\n * const scenePlugin = engine.getPlugin<ScenePlugin>('ScenePlugin');\n *\n * if (scenePlugin) {\n * scenePlugin.loadScene('MainMenu');\n * } else {\n * console.warn('ScenePlugin not found');\n * }\n * ```\n *\n * @see {@link getPluginThrow} for a version that throws an error if plugin is not found\n */\n public getPlugin<T extends EnginePlugin>(name: string): T | undefined {\n return this.plugins.get(name) as T | undefined;\n }\n\n /**\n * Retrieves a registered plugin by name, throwing an error if not found.\n *\n * This is a convenience method for cases where you expect the plugin to exist\n * and want to avoid null checks.\n *\n * @typeParam T - The plugin type extending {@link EnginePlugin}\n * @param name - The unique name of the plugin to retrieve\n * @returns The plugin instance\n * @throws {Error} If the plugin is not registered\n *\n * @example\n * ```typescript\n * // Get plugin or throw error\n * const scenePlugin = engine.getPluginThrow<ScenePlugin>('ScenePlugin');\n * scenePlugin.loadScene('MainMenu'); // No null check needed\n * ```\n *\n * @see {@link getPlugin} for a version that returns undefined instead of throwing\n */\n public getPluginThrow<T extends EnginePlugin>(name: string): T {\n const plugin = this.getPlugin<T>(name);\n if (!plugin) {\n throw new Error(`Plugin with name \"${name}\" is not registered.`);\n }\n return plugin;\n }\n\n\n\n /**\n * Gets all registered plugins sorted by priority.\n *\n * Returns an array of all plugins currently registered with the engine,\n * sorted by priority in descending order (highest priority first).\n *\n * @returns Array of all registered plugins sorted by priority\n *\n * @example\n * ```typescript\n * // List all registered plugins\n * const plugins = engine.getPlugins();\n * plugins.forEach(plugin => {\n * console.log(`Plugin: ${plugin.name}, Priority: ${plugin.priority}, State: ${plugin.state}`);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Find plugins by type\n * const plugins = engine.getPlugins();\n * const scenePlugins = plugins.filter(p => p.name.includes('Scene'));\n * ```\n *\n * @remarks\n * Plugins with undefined priority are treated as having priority 0.\n * Lower priority numbers mean higher priority (e.g., priority 1 comes before priority 10).\n */\n public getPlugins(): EnginePlugin[] {\n return Array.from(this.plugins.values()).sort((a, b) => (b.priority || 0) - (a.priority || 0));\n }\n\n /**\n * Updates the plugins\n * @param deltaTime Frame duration\n */\n private updatePlugins(deltaTime: number): void {\n // Call plugins in order of their priority\n const sortedPlugins = this.getPlugins();\n\n let handled = false;\n for (const plugin of sortedPlugins) {\n if (plugin.onUpdate && plugin.onUpdate(deltaTime)) {\n // Plugin reported it has handled the update, stop propagation\n handled = true;\n getLogger('PixiEngine').debug(`Update cycle handled by plugin: ${plugin.name}`);\n break;\n }\n }\n\n if (!handled) {\n // If no plugin handled the update, default behavior could be placed here\n // Currently there is no need for special handling\n }\n }\n\n /**\n * Main update loop called every frame.\n *\n * This method should be called from your game's main loop (typically GSAP ticker)\n * to update all plugins. Plugins are updated in priority order, and update\n * propagation stops if a plugin returns `true` from its `onUpdate` method.\n *\n * @param deltaTime - Time elapsed since the last frame in seconds\n *\n * @example\n * ```typescript\n * // Integrate with GSAP ticker\n * import { gsap } from 'gsap';\n *\n * gsap.ticker.add((time, deltaTime) => {\n * engine.onUpdate(deltaTime);\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Manual update loop\n * let lastTime = performance.now();\n *\n * function gameLoop() {\n * const currentTime = performance.now();\n * const deltaTime = (currentTime - lastTime) / 1000;\n * lastTime = currentTime;\n *\n * engine.onUpdate(deltaTime);\n * requestAnimationFrame(gameLoop);\n * }\n *\n * gameLoop();\n * ```\n *\n * @remarks\n * The deltaTime is typically provided in seconds by GSAP ticker.\n * Plugins with higher priority (lower priority number) are updated first.\n */\n public onUpdate(deltaTime: number): void {\n // Update the plugins with the given delta time\n this.updatePlugins(deltaTime);\n }\n\n /**\n * Gets the underlying PixiJS Application instance.\n *\n * Provides direct access to the PixiJS application for advanced use cases\n * such as accessing the renderer, ticker, or other PixiJS-specific features.\n *\n * @returns The PixiJS Application instance\n *\n * @example\n * ```typescript\n * // Access the renderer\n * const renderer = engine.pixiApp.renderer;\n * console.log('Renderer type:', renderer.type);\n *\n * // Access the ticker\n * engine.pixiApp.ticker.add((delta) => {\n * console.log('Ticker delta:', delta);\n * });\n * ```\n *\n * @remarks\n * Use this getter sparingly. Most functionality should be accessed through\n * plugins or the engine's public API.\n */\n public get pixiApp(): PixiApplication {\n return this._pixiApp;\n }\n\n public get platform(): PlatformType {\n return isMobile.any ? 'mobile' : 'desktop';\n }\n\n /**\n * Gets the device pixel ratio, capped at 2 for performance reasons.\n * \n * @returns The device pixel ratio, capped at 2\n */\n public get devicePixelRatio() {\n return Math.min(window.devicePixelRatio ?? 1, 2);\n }\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Filter } from 'pixi.js';
|
|
2
|
+
/**
|
|
3
|
+
* Chroma key algorithm modes.
|
|
4
|
+
* - `rgb`: Simple RGB Euclidean distance (legacy)
|
|
5
|
+
* - `hsv`: Hue-based keying with saturation threshold
|
|
6
|
+
* - `ycbcr`: YCbCr color space (TV/video standard)
|
|
7
|
+
* - `colorDiff`: YCbCr + Color Difference hybrid (best quality, default)
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ChromaKeyMode {
|
|
10
|
+
RGB = 0,
|
|
11
|
+
HSV = 1,
|
|
12
|
+
YCbCr = 2,
|
|
13
|
+
ColorDiff = 3
|
|
14
|
+
}
|
|
15
|
+
export interface ChromaKeyFilterOptions {
|
|
16
|
+
/** The color to make transparent. Default: 0x000000 (black) */
|
|
17
|
+
keyColor?: number;
|
|
18
|
+
/** How similar colors need to be to the key color to be removed (0-1). Default: 0.4 */
|
|
19
|
+
similarity?: number;
|
|
20
|
+
/** Smoothness of the edge transition (0-1). Default: 0.1 */
|
|
21
|
+
smoothness?: number;
|
|
22
|
+
/** Keying algorithm mode. Default: ChromaKeyMode.ColorDiff */
|
|
23
|
+
mode?: ChromaKeyMode;
|
|
24
|
+
/** Minimum saturation threshold to protect gray/white/black colors (0-1). Default: 0.1 */
|
|
25
|
+
minSaturation?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ChromaKeyFilter - Makes a specific color transparent in a texture/video.
|
|
29
|
+
* Useful for green screen effects or removing black backgrounds from video sprites.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* // Remove black background
|
|
34
|
+
* const filter = new ChromaKeyFilter({ keyColor: 0x000000 });
|
|
35
|
+
* sprite.filters = [filter];
|
|
36
|
+
*
|
|
37
|
+
* // Remove green screen
|
|
38
|
+
* const greenFilter = new ChromaKeyFilter({
|
|
39
|
+
* keyColor: 0x00ff00,
|
|
40
|
+
* similarity: 0.2,
|
|
41
|
+
* smoothness: 0.1
|
|
42
|
+
* });
|
|
43
|
+
* videoSprite.filters = [greenFilter];
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare class ChromaKeyFilter extends Filter {
|
|
47
|
+
constructor(options?: ChromaKeyFilterOptions);
|
|
48
|
+
/** The color to make transparent (hex value) */
|
|
49
|
+
get keyColor(): number;
|
|
50
|
+
set keyColor(value: number);
|
|
51
|
+
/** How similar colors need to be to the key color to be removed (0-1) */
|
|
52
|
+
get similarity(): number;
|
|
53
|
+
set similarity(value: number);
|
|
54
|
+
/** Smoothness of the edge transition (0-1) */
|
|
55
|
+
get smoothness(): number;
|
|
56
|
+
set smoothness(value: number);
|
|
57
|
+
/** Keying algorithm mode */
|
|
58
|
+
get mode(): ChromaKeyMode;
|
|
59
|
+
set mode(value: ChromaKeyMode);
|
|
60
|
+
/** Minimum saturation threshold to protect gray/white/black colors (0-1) */
|
|
61
|
+
get minSaturation(): number;
|
|
62
|
+
set minSaturation(value: number);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=ChromaKeyFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChromaKeyFilter.d.ts","sourceRoot":"","sources":["../../filters/ChromaKeyFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,SAAS,CAAC;AAE5C;;;;;;GAMG;AACH,oBAAY,aAAa;IACvB,GAAG,IAAI;IACP,GAAG,IAAI;IACP,KAAK,IAAI;IACT,SAAS,IAAI;CACd;AAwKD,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAgB,SAAQ,MAAM;gBAC7B,OAAO,GAAE,sBAA2B;IA+BhD,gDAAgD;IAChD,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAOzB;IAED,yEAAyE;IACzE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,EAE3B;IAED,8CAA8C;IAC9C,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,EAE3B;IAED,4BAA4B;IAC5B,IAAI,IAAI,IAAI,aAAa,CAExB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,aAAa,EAE5B;IAED,4EAA4E;IAC5E,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,EAE9B;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../filters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,aAAa,EACb,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { Filter, GlProgram } from 'pixi.js';
|
|
2
|
+
|
|
3
|
+
// filters/ChromaKeyFilter.ts
|
|
4
|
+
var ChromaKeyMode = /* @__PURE__ */ ((ChromaKeyMode2) => {
|
|
5
|
+
ChromaKeyMode2[ChromaKeyMode2["RGB"] = 0] = "RGB";
|
|
6
|
+
ChromaKeyMode2[ChromaKeyMode2["HSV"] = 1] = "HSV";
|
|
7
|
+
ChromaKeyMode2[ChromaKeyMode2["YCbCr"] = 2] = "YCbCr";
|
|
8
|
+
ChromaKeyMode2[ChromaKeyMode2["ColorDiff"] = 3] = "ColorDiff";
|
|
9
|
+
return ChromaKeyMode2;
|
|
10
|
+
})(ChromaKeyMode || {});
|
|
11
|
+
var vertex = `
|
|
12
|
+
in vec2 aPosition;
|
|
13
|
+
out vec2 vTextureCoord;
|
|
14
|
+
|
|
15
|
+
uniform vec4 uInputSize;
|
|
16
|
+
uniform vec4 uOutputFrame;
|
|
17
|
+
uniform vec4 uOutputTexture;
|
|
18
|
+
|
|
19
|
+
vec4 filterVertexPosition(void)
|
|
20
|
+
{
|
|
21
|
+
vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;
|
|
22
|
+
position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;
|
|
23
|
+
position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;
|
|
24
|
+
return vec4(position, 0.0, 1.0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
vec2 filterTextureCoord(void)
|
|
28
|
+
{
|
|
29
|
+
return aPosition * (uOutputFrame.zw * uInputSize.zw);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
void main(void)
|
|
33
|
+
{
|
|
34
|
+
gl_Position = filterVertexPosition();
|
|
35
|
+
vTextureCoord = filterTextureCoord();
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
var fragment = `
|
|
39
|
+
in vec2 vTextureCoord;
|
|
40
|
+
|
|
41
|
+
uniform sampler2D uTexture;
|
|
42
|
+
uniform vec3 uKeyColor;
|
|
43
|
+
uniform float uSimilarity;
|
|
44
|
+
uniform float uSmoothness;
|
|
45
|
+
uniform int uMode;
|
|
46
|
+
uniform float uMinSaturation;
|
|
47
|
+
|
|
48
|
+
out vec4 finalColor;
|
|
49
|
+
|
|
50
|
+
// Convert RGB to HSV
|
|
51
|
+
vec3 rgb2hsv(vec3 c) {
|
|
52
|
+
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
|
53
|
+
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
|
54
|
+
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
|
55
|
+
float d = q.x - min(q.w, q.y);
|
|
56
|
+
float e = 1.0e-10;
|
|
57
|
+
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Convert RGB to YCbCr
|
|
61
|
+
vec3 rgb2ycbcr(vec3 c) {
|
|
62
|
+
float y = 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;
|
|
63
|
+
float cb = 0.564 * (c.b - y);
|
|
64
|
+
float cr = 0.713 * (c.r - y);
|
|
65
|
+
return vec3(y, cb, cr);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// RGB mode: Simple Euclidean distance
|
|
69
|
+
float calcAlphaRGB(vec3 color, vec3 keyColor, float similarity, float smoothness) {
|
|
70
|
+
float dist = distance(color, keyColor);
|
|
71
|
+
return smoothstep(similarity, similarity + smoothness, dist);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// HSV mode: Hue-based keying with saturation threshold
|
|
75
|
+
float calcAlphaHSV(vec3 color, vec3 keyColor, float similarity, float smoothness, float minSat) {
|
|
76
|
+
vec3 hsv = rgb2hsv(color);
|
|
77
|
+
vec3 keyHsv = rgb2hsv(keyColor);
|
|
78
|
+
|
|
79
|
+
// Protect low saturation colors (grays)
|
|
80
|
+
if (hsv.y < minSat) return 1.0;
|
|
81
|
+
|
|
82
|
+
// Circular hue distance
|
|
83
|
+
float hueDist = abs(hsv.x - keyHsv.x);
|
|
84
|
+
hueDist = min(hueDist, 1.0 - hueDist);
|
|
85
|
+
|
|
86
|
+
// Also consider saturation difference
|
|
87
|
+
float satDist = abs(hsv.y - keyHsv.y) * 0.5;
|
|
88
|
+
float dist = hueDist + satDist;
|
|
89
|
+
|
|
90
|
+
return smoothstep(similarity * 0.5, (similarity + smoothness) * 0.5, dist);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// YCbCr mode: Chrominance-based keying
|
|
94
|
+
float calcAlphaYCbCr(vec3 color, vec3 keyColor, float similarity, float smoothness) {
|
|
95
|
+
vec3 ycbcr = rgb2ycbcr(color);
|
|
96
|
+
vec3 keyYcbcr = rgb2ycbcr(keyColor);
|
|
97
|
+
|
|
98
|
+
// Only compare chrominance (Cb, Cr), ignore luminance
|
|
99
|
+
float dist = distance(ycbcr.yz, keyYcbcr.yz);
|
|
100
|
+
return smoothstep(similarity * 0.5, (similarity + smoothness) * 0.5, dist);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ColorDiff mode: YCbCr + Color Difference hybrid (best quality)
|
|
104
|
+
float calcAlphaColorDiff(vec3 color, vec3 keyColor, float similarity, float smoothness, float minSat) {
|
|
105
|
+
vec3 hsv = rgb2hsv(color);
|
|
106
|
+
|
|
107
|
+
// Protect low saturation colors (grays, whites, blacks)
|
|
108
|
+
if (hsv.y < minSat) return 1.0;
|
|
109
|
+
|
|
110
|
+
vec3 ycbcr = rgb2ycbcr(color);
|
|
111
|
+
vec3 keyYcbcr = rgb2ycbcr(keyColor);
|
|
112
|
+
|
|
113
|
+
// Chrominance distance
|
|
114
|
+
float chromaDist = distance(ycbcr.yz, keyYcbcr.yz);
|
|
115
|
+
|
|
116
|
+
// Color difference: for green key, green should dominate
|
|
117
|
+
// For other keys, the dominant channel should match
|
|
118
|
+
float maxRB = max(color.r, color.b);
|
|
119
|
+
float maxRG = max(color.r, color.g);
|
|
120
|
+
float maxGB = max(color.g, color.b);
|
|
121
|
+
|
|
122
|
+
float keyMaxRB = max(keyColor.r, keyColor.b);
|
|
123
|
+
float keyMaxRG = max(keyColor.r, keyColor.g);
|
|
124
|
+
float keyMaxGB = max(keyColor.g, keyColor.b);
|
|
125
|
+
|
|
126
|
+
// Calculate color difference based on key color's dominant channel
|
|
127
|
+
float colorDiff;
|
|
128
|
+
if (keyColor.g > keyColor.r && keyColor.g > keyColor.b) {
|
|
129
|
+
// Green key: green - max(red, blue)
|
|
130
|
+
float keyDiff = keyColor.g - keyMaxRB;
|
|
131
|
+
float pixelDiff = color.g - maxRB;
|
|
132
|
+
colorDiff = abs(pixelDiff - keyDiff);
|
|
133
|
+
} else if (keyColor.b > keyColor.r && keyColor.b > keyColor.g) {
|
|
134
|
+
// Blue key: blue - max(red, green)
|
|
135
|
+
float keyDiff = keyColor.b - keyMaxRG;
|
|
136
|
+
float pixelDiff = color.b - maxRG;
|
|
137
|
+
colorDiff = abs(pixelDiff - keyDiff);
|
|
138
|
+
} else {
|
|
139
|
+
// Red key: red - max(green, blue)
|
|
140
|
+
float keyDiff = keyColor.r - keyMaxGB;
|
|
141
|
+
float pixelDiff = color.r - maxGB;
|
|
142
|
+
colorDiff = abs(pixelDiff - keyDiff);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Combine chrominance distance and color difference
|
|
146
|
+
float combinedDist = chromaDist * 0.7 + colorDiff * 0.3;
|
|
147
|
+
|
|
148
|
+
return smoothstep(similarity * 0.4, (similarity + smoothness) * 0.4, combinedDist);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
void main(void)
|
|
152
|
+
{
|
|
153
|
+
vec4 color = texture(uTexture, vTextureCoord);
|
|
154
|
+
|
|
155
|
+
float alpha;
|
|
156
|
+
|
|
157
|
+
if (uMode == 0) {
|
|
158
|
+
// RGB mode
|
|
159
|
+
alpha = calcAlphaRGB(color.rgb, uKeyColor, uSimilarity, uSmoothness);
|
|
160
|
+
} else if (uMode == 1) {
|
|
161
|
+
// HSV mode
|
|
162
|
+
alpha = calcAlphaHSV(color.rgb, uKeyColor, uSimilarity, uSmoothness, uMinSaturation);
|
|
163
|
+
} else if (uMode == 2) {
|
|
164
|
+
// YCbCr mode
|
|
165
|
+
alpha = calcAlphaYCbCr(color.rgb, uKeyColor, uSimilarity, uSmoothness);
|
|
166
|
+
} else {
|
|
167
|
+
// ColorDiff mode (default)
|
|
168
|
+
alpha = calcAlphaColorDiff(color.rgb, uKeyColor, uSimilarity, uSmoothness, uMinSaturation);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Apply the calculated alpha
|
|
172
|
+
finalColor = vec4(color.rgb * alpha, color.a * alpha);
|
|
173
|
+
}
|
|
174
|
+
`;
|
|
175
|
+
var ChromaKeyFilter = class extends Filter {
|
|
176
|
+
constructor(options = {}) {
|
|
177
|
+
const {
|
|
178
|
+
keyColor = 0,
|
|
179
|
+
similarity = 0.4,
|
|
180
|
+
smoothness = 0.1,
|
|
181
|
+
mode = 3 /* ColorDiff */,
|
|
182
|
+
minSaturation = 0.1
|
|
183
|
+
} = options;
|
|
184
|
+
const r = (keyColor >> 16 & 255) / 255;
|
|
185
|
+
const g = (keyColor >> 8 & 255) / 255;
|
|
186
|
+
const b = (keyColor & 255) / 255;
|
|
187
|
+
super({
|
|
188
|
+
glProgram: new GlProgram({
|
|
189
|
+
fragment,
|
|
190
|
+
vertex
|
|
191
|
+
}),
|
|
192
|
+
resources: {
|
|
193
|
+
chromaKeyUniforms: {
|
|
194
|
+
uKeyColor: { value: [r, g, b], type: "vec3<f32>" },
|
|
195
|
+
uSimilarity: { value: similarity, type: "f32" },
|
|
196
|
+
uSmoothness: { value: smoothness, type: "f32" },
|
|
197
|
+
uMode: { value: mode, type: "i32" },
|
|
198
|
+
uMinSaturation: { value: minSaturation, type: "f32" }
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/** The color to make transparent (hex value) */
|
|
204
|
+
get keyColor() {
|
|
205
|
+
const rgb = this.resources.chromaKeyUniforms.uniforms.uKeyColor;
|
|
206
|
+
return rgb[0] * 255 << 16 | rgb[1] * 255 << 8 | rgb[2] * 255;
|
|
207
|
+
}
|
|
208
|
+
set keyColor(value) {
|
|
209
|
+
const r = (value >> 16 & 255) / 255;
|
|
210
|
+
const g = (value >> 8 & 255) / 255;
|
|
211
|
+
const b = (value & 255) / 255;
|
|
212
|
+
this.resources.chromaKeyUniforms.uniforms.uKeyColor[0] = r;
|
|
213
|
+
this.resources.chromaKeyUniforms.uniforms.uKeyColor[1] = g;
|
|
214
|
+
this.resources.chromaKeyUniforms.uniforms.uKeyColor[2] = b;
|
|
215
|
+
}
|
|
216
|
+
/** How similar colors need to be to the key color to be removed (0-1) */
|
|
217
|
+
get similarity() {
|
|
218
|
+
return this.resources.chromaKeyUniforms.uniforms.uSimilarity;
|
|
219
|
+
}
|
|
220
|
+
set similarity(value) {
|
|
221
|
+
this.resources.chromaKeyUniforms.uniforms.uSimilarity = value;
|
|
222
|
+
}
|
|
223
|
+
/** Smoothness of the edge transition (0-1) */
|
|
224
|
+
get smoothness() {
|
|
225
|
+
return this.resources.chromaKeyUniforms.uniforms.uSmoothness;
|
|
226
|
+
}
|
|
227
|
+
set smoothness(value) {
|
|
228
|
+
this.resources.chromaKeyUniforms.uniforms.uSmoothness = value;
|
|
229
|
+
}
|
|
230
|
+
/** Keying algorithm mode */
|
|
231
|
+
get mode() {
|
|
232
|
+
return this.resources.chromaKeyUniforms.uniforms.uMode;
|
|
233
|
+
}
|
|
234
|
+
set mode(value) {
|
|
235
|
+
this.resources.chromaKeyUniforms.uniforms.uMode = value;
|
|
236
|
+
}
|
|
237
|
+
/** Minimum saturation threshold to protect gray/white/black colors (0-1) */
|
|
238
|
+
get minSaturation() {
|
|
239
|
+
return this.resources.chromaKeyUniforms.uniforms.uMinSaturation;
|
|
240
|
+
}
|
|
241
|
+
set minSaturation(value) {
|
|
242
|
+
this.resources.chromaKeyUniforms.uniforms.uMinSaturation = value;
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export { ChromaKeyFilter, ChromaKeyMode };
|
|
247
|
+
//# sourceMappingURL=index.js.map
|
|
248
|
+
//# sourceMappingURL=index.js.map
|