pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 19 kB
Source Map (JSON)
{"version":3,"file":"BlurFilter.mjs","sources":["../../../../src/filters/defaults/blur/BlurFilter.ts"],"sourcesContent":["import { TexturePool } from '../../../rendering/renderers/shared/texture/TexturePool';\nimport { RendererType } from '../../../rendering/renderers/types';\nimport { deprecation, v8_0_0 } from '../../../utils/logging/deprecation';\nimport { Filter } from '../../Filter';\nimport { BlurFilterPass } from './BlurFilterPass';\n\nimport type { RenderSurface } from '../../../rendering/renderers/shared/renderTarget/RenderTargetSystem';\nimport type { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport type { FilterOptions } from '../../Filter';\nimport type { FilterSystem } from '../../FilterSystem';\n\n/**\n * Configuration options for the BlurFilter.\n * Controls how the Gaussian blur effect is applied.\n * @example\n * ```ts\n * // Basic blur with default values\n * const filter = new BlurFilter();\n *\n * // Custom blur configuration\n * const filter = new BlurFilter({\n * strength: 8, // Overall blur strength\n * quality: 4, // Higher quality = better blur\n * kernelSize: 5 // Size of blur kernel\n * });\n *\n * // Different horizontal/vertical blur\n * const filter = new BlurFilter({\n * strengthX: 4, // Horizontal blur only\n * strengthY: 12, // Stronger vertical blur\n * quality: 2 // Lower quality for better performance\n * });\n * ```\n * @remarks\n * - Higher quality values produce better blur but impact performance\n * - KernelSize affects blur precision and performance\n * - Strength values determine blur intensity\n * @see {@link BlurFilter} The filter that uses these options\n * @see {@link FilterOptions} Base filter options\n * @category filters\n * @standard\n */\nexport interface BlurFilterOptions extends FilterOptions\n{\n /**\n * The strength of the blur filter.\n * Applied to both horizontal and vertical blur if strengthX/Y not set.\n * @default 8\n */\n strength?: number;\n\n /**\n * The horizontal strength of the blur.\n * Overrides strength parameter for x-axis.\n * @default 8\n */\n strengthX?: number;\n\n /**\n * The vertical strength of the blur.\n * Overrides strength parameter for y-axis.\n * @default 8\n */\n strengthY?: number;\n\n /**\n * The quality of the blur filter.\n * Higher values mean better quality but slower performance.\n * @default 4\n */\n quality?: number;\n\n /**\n * The kernelSize of the blur filter.\n * Larger values create more precise blur but impact performance.\n * Options: 5, 7, 9, 11, 13, 15.\n * @default 5\n */\n kernelSize?: number;\n}\n\n/**\n * The BlurFilter applies a Gaussian blur to an object.\n * The strength of the blur can be set for the x-axis and y-axis separately.\n * @example\n * ```ts\n * import { BlurFilter } from 'pixi.js';\n *\n * // Create with default settings\n * const filter = new BlurFilter();\n *\n * // Create with custom settings\n * const filter = new BlurFilter({\n * strength: 8, // Overall blur strength\n * quality: 4, // Blur quality (higher = better but slower)\n * kernelSize: 5 // Size of blur kernel matrix\n * });\n *\n * // Apply to a display object\n * sprite.filters = [filter];\n *\n * // Update properties\n * filter.strength = 10; // Set both X and Y blur\n * filter.strengthX = 5; // Set only horizontal blur\n * filter.strengthY = 15; // Set only vertical blur\n * filter.quality = 2; // Adjust quality\n *\n * // Enable edge pixel clamping\n * filter.repeatEdgePixels = true;\n * ```\n * @remarks\n * - Higher quality values produce better blur but impact performance\n * - Strength controls blur intensity independently for X and Y\n * - Can be optimized using quality and kernelSize settings\n * - Supports edge pixel clamping for special effects\n * @see {@link BlurFilterPass} For single-direction blur\n * @see {@link FilterOptions} For base filter options\n * @category filters\n * @standard\n * @noInheritDoc\n */\nexport class BlurFilter extends Filter\n{\n /**\n * Default blur filter options\n * @example\n * ```ts\n * // Set default options for all BlurFilters\n * BlurFilter.defaultOptions = {\n * strength: 10, // Default blur strength\n * quality: 2, // Default blur quality\n * kernelSize: 7 // Default kernel size\n * };\n * // Create a filter with these defaults\n * const filter = new BlurFilter(); // Uses default options\n * ```\n * @remarks\n * - These options are used when creating a new BlurFilter without specific parameters\n * - Can be overridden by passing options to the constructor\n * - Useful for setting global defaults for all blur filters in your application\n * @see {@link BlurFilterOptions} For detailed options\n * @see {@link BlurFilter} The filter that uses these options\n */\n public static defaultOptions: Partial<BlurFilterOptions> = {\n /** The strength of the blur filter. */\n strength: 8,\n /** The quality of the blur filter. */\n quality: 4,\n /** The kernelSize of the blur filter.Options: 5, 7, 9, 11, 13, 15. */\n kernelSize: 5,\n };\n\n /**\n * The horizontal blur filter\n * @advanced\n */\n public blurXFilter: BlurFilterPass;\n /**\n * The vertical blur filter\n * @advanced\n */\n public blurYFilter: BlurFilterPass;\n\n private _repeatEdgePixels = false;\n\n /**\n * @param {filters.BlurFilterOptions} options - The options of the blur filter.\n */\n constructor(options?: BlurFilterOptions);\n /** @deprecated since 8.0.0 */\n constructor(strength?: number, quality?: number, resolution?: number | null, kernelSize?: number);\n constructor(...args: [BlurFilterOptions?] | [number?, number?, number?, number?])\n {\n let options = args[0] ?? {};\n\n // if options is a number)\n if (typeof options === 'number')\n {\n // #if _DEBUG\n // eslint-disable-next-line max-len\n deprecation(v8_0_0, 'BlurFilter constructor params are now options object. See params: { strength, quality, resolution, kernelSize }');\n // #endif\n\n options = { strength: options };\n\n if (args[1] !== undefined)options.quality = args[1];\n if (args[2] !== undefined)options.resolution = args[2] || 'inherit';\n if (args[3] !== undefined)options.kernelSize = args[3];\n }\n\n options = { ...BlurFilterPass.defaultOptions, ...options };\n\n const { strength, strengthX, strengthY, quality, ...rest } = options;\n\n super({\n ...rest,\n compatibleRenderers: RendererType.BOTH,\n resources: {}\n });\n\n this.blurXFilter = new BlurFilterPass({ horizontal: true, ...options });\n this.blurYFilter = new BlurFilterPass({ horizontal: false, ...options });\n\n this.quality = quality;\n this.strengthX = strengthX ?? strength;\n this.strengthY = strengthY ?? strength;\n this.repeatEdgePixels = false;\n }\n\n /**\n * Applies the filter.\n * @param filterManager - The manager.\n * @param input - The input target.\n * @param output - The output target.\n * @param clearMode - How to clear\n * @advanced\n */\n public apply(\n filterManager: FilterSystem,\n input: Texture,\n output: RenderSurface,\n clearMode: boolean\n ): void\n {\n const xStrength = Math.abs(this.blurXFilter.strength);\n const yStrength = Math.abs(this.blurYFilter.strength);\n\n if (xStrength && yStrength)\n {\n const tempTexture = TexturePool.getSameSizeTexture(input);\n\n this.blurXFilter.blendMode = 'normal';\n this.blurXFilter.apply(filterManager, input, tempTexture, true);\n this.blurYFilter.blendMode = this.blendMode;\n this.blurYFilter.apply(filterManager, tempTexture, output, clearMode);\n\n TexturePool.returnTexture(tempTexture);\n }\n else if (yStrength)\n {\n this.blurYFilter.blendMode = this.blendMode;\n this.blurYFilter.apply(filterManager, input, output, clearMode);\n }\n else\n {\n this.blurXFilter.blendMode = this.blendMode;\n this.blurXFilter.apply(filterManager, input, output, clearMode);\n }\n }\n\n protected updatePadding(): void\n {\n if (this._repeatEdgePixels)\n {\n this.padding = 0;\n }\n else\n {\n this.padding = Math.max(Math.abs(this.blurXFilter.blur), Math.abs(this.blurYFilter.blur)) * 2;\n }\n }\n\n /**\n * Sets the strength of both the blurX and blurY properties simultaneously.\n * Controls the overall intensity of the Gaussian blur effect.\n * @example\n * ```ts\n * // Set equal blur strength for both axes\n * filter.strength = 8;\n *\n * // Will throw error if X and Y are different\n * filter.strengthX = 4;\n * filter.strengthY = 8;\n * filter.strength; // Error: BlurFilter's strengthX and strengthY are different\n * ```\n * @default 8\n * @throws {Error} If strengthX and strengthY are different values\n */\n get strength(): number\n {\n if (this.strengthX !== this.strengthY)\n {\n throw new Error('BlurFilter\\'s strengthX and strengthY are different');\n }\n\n return this.strengthX;\n }\n\n set strength(value: number)\n {\n this.blurXFilter.blur = this.blurYFilter.blur = value;\n this.updatePadding();\n }\n\n /**\n * Sets the number of passes for blur. More passes means higher quality blurring.\n * Controls the precision and smoothness of the blur effect at the cost of performance.\n * @example\n * ```ts\n * // High quality blur (slower)\n * filter.quality = 8;\n *\n * // Low quality blur (faster)\n * filter.quality = 2;\n * ```\n * @default 4\n * @remarks Higher values produce better quality but impact performance\n */\n get quality(): number\n {\n return this.blurXFilter.quality;\n }\n\n set quality(value: number)\n {\n this.blurXFilter.quality = this.blurYFilter.quality = value;\n }\n\n /**\n * Sets the strength of horizontal blur.\n * Controls the blur intensity along the x-axis independently.\n * @example\n * ```ts\n * // Apply horizontal-only blur\n * filter.strengthX = 8;\n * filter.strengthY = 0;\n *\n * // Create motion blur effect\n * filter.strengthX = 16;\n * filter.strengthY = 2;\n * ```\n * @default 8\n */\n get strengthX(): number\n {\n return this.blurXFilter.blur;\n }\n\n set strengthX(value: number)\n {\n this.blurXFilter.blur = value;\n this.updatePadding();\n }\n\n /**\n * Sets the strength of the vertical blur.\n * Controls the blur intensity along the y-axis independently.\n * @example\n * ```ts\n * // Apply vertical-only blur\n * filter.strengthX = 0;\n * filter.strengthY = 8;\n *\n * // Create radial blur effect\n * filter.strengthX = 8;\n * filter.strengthY = 8;\n * ```\n * @default 8\n */\n get strengthY(): number\n {\n return this.blurYFilter.blur;\n }\n\n set strengthY(value: number)\n {\n this.blurYFilter.blur = value;\n this.updatePadding();\n }\n\n /**\n * Sets the strength of both the blurX and blurY properties simultaneously\n * @default 2\n * @deprecated since 8.3.0\n * @see BlurFilter.strength\n */\n get blur(): number\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blur is deprecated, please use BlurFilter.strength instead.');\n // #endif\n\n return this.strength;\n }\n\n set blur(value: number)\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blur is deprecated, please use BlurFilter.strength instead.');\n // #endif\n this.strength = value;\n }\n\n /**\n * Sets the strength of the blurX property\n * @default 2\n * @deprecated since 8.3.0\n * @see BlurFilter.strengthX\n */\n get blurX(): number\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blurX is deprecated, please use BlurFilter.strengthX instead.');\n // #endif\n\n return this.strengthX;\n }\n\n set blurX(value: number)\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blurX is deprecated, please use BlurFilter.strengthX instead.');\n // #endif\n this.strengthX = value;\n }\n\n /**\n * Sets the strength of the blurY property\n * @default 2\n * @deprecated since 8.3.0\n * @see BlurFilter.strengthY\n */\n get blurY(): number\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blurY is deprecated, please use BlurFilter.strengthY instead.');\n // #endif\n\n return this.strengthY;\n }\n\n set blurY(value: number)\n {\n // #if _DEBUG\n deprecation('8.3.0', 'BlurFilter.blurY is deprecated, please use BlurFilter.strengthY instead.');\n // #endif\n this.strengthY = value;\n }\n\n /**\n * If set to true the edge of the target will be clamped\n * @default false\n */\n get repeatEdgePixels(): boolean\n {\n return this._repeatEdgePixels;\n }\n\n set repeatEdgePixels(value: boolean)\n {\n this._repeatEdgePixels = value;\n this.updatePadding();\n }\n}\n"],"names":[],"mappings":";;;;;;;AAyHO,MAAM,mBAAmB,MAChC,CAAA;AAAA,EAiDI,eAAe,IACf,EAAA;AACI,IAAA,IAAI,OAAU,GAAA,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC,CAAA;AAG1B,IAAI,IAAA,OAAO,YAAY,QACvB,EAAA;AAGI,MAAA,WAAA,CAAY,QAAQ,iHAAiH,CAAA,CAAA;AAGrI,MAAU,OAAA,GAAA,EAAE,UAAU,OAAQ,EAAA,CAAA;AAE9B,MAAI,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,KAAA,CAAA;AAAU,QAAQ,OAAA,CAAA,OAAA,GAAU,KAAK,CAAC,CAAA,CAAA;AAClD,MAAI,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,KAAA,CAAA;AAAU,QAAQ,OAAA,CAAA,UAAA,GAAa,IAAK,CAAA,CAAC,CAAK,IAAA,SAAA,CAAA;AAC1D,MAAI,IAAA,IAAA,CAAK,CAAC,CAAM,KAAA,KAAA,CAAA;AAAU,QAAQ,OAAA,CAAA,UAAA,GAAa,KAAK,CAAC,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,OAAA,GAAU,EAAE,GAAG,cAAe,CAAA,cAAA,EAAgB,GAAG,OAAQ,EAAA,CAAA;AAEzD,IAAA,MAAM,EAAE,QAAU,EAAA,SAAA,EAAW,WAAW,OAAS,EAAA,GAAG,MAAS,GAAA,OAAA,CAAA;AAE7D,IAAM,KAAA,CAAA;AAAA,MACF,GAAG,IAAA;AAAA,MACH,qBAAqB,YAAa,CAAA,IAAA;AAAA,MAClC,WAAW,EAAC;AAAA,KACf,CAAA,CAAA;AAnCL,IAAA,IAAA,CAAQ,iBAAoB,GAAA,KAAA,CAAA;AAqCxB,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,cAAe,CAAA,EAAE,YAAY,IAAM,EAAA,GAAG,SAAS,CAAA,CAAA;AACtE,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,cAAe,CAAA,EAAE,YAAY,KAAO,EAAA,GAAG,SAAS,CAAA,CAAA;AAEvE,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAA;AACf,IAAA,IAAA,CAAK,YAAY,SAAa,IAAA,QAAA,CAAA;AAC9B,IAAA,IAAA,CAAK,YAAY,SAAa,IAAA,QAAA,CAAA;AAC9B,IAAA,IAAA,CAAK,gBAAmB,GAAA,KAAA,CAAA;AAAA,GAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,KACH,CAAA,aAAA,EACA,KACA,EAAA,MAAA,EACA,SAEJ,EAAA;AACI,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AACpD,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAEpD,IAAA,IAAI,aAAa,SACjB,EAAA;AACI,MAAM,MAAA,WAAA,GAAc,WAAY,CAAA,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAExD,MAAA,IAAA,CAAK,YAAY,SAAY,GAAA,QAAA,CAAA;AAC7B,MAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,aAAe,EAAA,KAAA,EAAO,aAAa,IAAI,CAAA,CAAA;AAC9D,MAAK,IAAA,CAAA,WAAA,CAAY,YAAY,IAAK,CAAA,SAAA,CAAA;AAClC,MAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,aAAe,EAAA,WAAA,EAAa,QAAQ,SAAS,CAAA,CAAA;AAEpE,MAAA,WAAA,CAAY,cAAc,WAAW,CAAA,CAAA;AAAA,eAEhC,SACT,EAAA;AACI,MAAK,IAAA,CAAA,WAAA,CAAY,YAAY,IAAK,CAAA,SAAA,CAAA;AAClC,MAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,aAAe,EAAA,KAAA,EAAO,QAAQ,SAAS,CAAA,CAAA;AAAA,KAGlE,MAAA;AACI,MAAK,IAAA,CAAA,WAAA,CAAY,YAAY,IAAK,CAAA,SAAA,CAAA;AAClC,MAAA,IAAA,CAAK,WAAY,CAAA,KAAA,CAAM,aAAe,EAAA,KAAA,EAAO,QAAQ,SAAS,CAAA,CAAA;AAAA,KAClE;AAAA,GACJ;AAAA,EAEU,aACV,GAAA;AACI,IAAA,IAAI,KAAK,iBACT,EAAA;AACI,MAAA,IAAA,CAAK,OAAU,GAAA,CAAA,CAAA;AAAA,KAGnB,MAAA;AACI,MAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,IAAI,IAAK,CAAA,WAAA,CAAY,IAAI,CAAA,EAAG,KAAK,GAAI,CAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAC,CAAI,GAAA,CAAA,CAAA;AAAA,KAChG;AAAA,GACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,IAAI,QACJ,GAAA;AACI,IAAI,IAAA,IAAA,CAAK,SAAc,KAAA,IAAA,CAAK,SAC5B,EAAA;AACI,MAAM,MAAA,IAAI,MAAM,oDAAqD,CAAA,CAAA;AAAA,KACzE;AAEA,IAAA,OAAO,IAAK,CAAA,SAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,SAAS,KACb,EAAA;AACI,IAAA,IAAA,CAAK,WAAY,CAAA,IAAA,GAAO,IAAK,CAAA,WAAA,CAAY,IAAO,GAAA,KAAA,CAAA;AAChD,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAAA,GACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,OACJ,GAAA;AACI,IAAA,OAAO,KAAK,WAAY,CAAA,OAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,IAAI,QAAQ,KACZ,EAAA;AACI,IAAA,IAAA,CAAK,WAAY,CAAA,OAAA,GAAU,IAAK,CAAA,WAAA,CAAY,OAAU,GAAA,KAAA,CAAA;AAAA,GAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,SACJ,GAAA;AACI,IAAA,OAAO,KAAK,WAAY,CAAA,IAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,IAAI,UAAU,KACd,EAAA;AACI,IAAA,IAAA,CAAK,YAAY,IAAO,GAAA,KAAA,CAAA;AACxB,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAAA,GACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,SACJ,GAAA;AACI,IAAA,OAAO,KAAK,WAAY,CAAA,IAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,IAAI,UAAU,KACd,EAAA;AACI,IAAA,IAAA,CAAK,YAAY,IAAO,GAAA,KAAA,CAAA;AACxB,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAAA,GACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IACJ,GAAA;AAEI,IAAA,WAAA,CAAY,SAAS,wEAAwE,CAAA,CAAA;AAG7F,IAAA,OAAO,IAAK,CAAA,QAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,KAAK,KACT,EAAA;AAEI,IAAA,WAAA,CAAY,SAAS,wEAAwE,CAAA,CAAA;AAE7F,IAAA,IAAA,CAAK,QAAW,GAAA,KAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KACJ,GAAA;AAEI,IAAA,WAAA,CAAY,SAAS,0EAA0E,CAAA,CAAA;AAG/F,IAAA,OAAO,IAAK,CAAA,SAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,MAAM,KACV,EAAA;AAEI,IAAA,WAAA,CAAY,SAAS,0EAA0E,CAAA,CAAA;AAE/F,IAAA,IAAA,CAAK,SAAY,GAAA,KAAA,CAAA;AAAA,GACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KACJ,GAAA;AAEI,IAAA,WAAA,CAAY,SAAS,0EAA0E,CAAA,CAAA;AAG/F,IAAA,OAAO,IAAK,CAAA,SAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,MAAM,KACV,EAAA;AAEI,IAAA,WAAA,CAAY,SAAS,0EAA0E,CAAA,CAAA;AAE/F,IAAA,IAAA,CAAK,SAAY,GAAA,KAAA,CAAA;AAAA,GACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBACJ,GAAA;AACI,IAAA,OAAO,IAAK,CAAA,iBAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,iBAAiB,KACrB,EAAA;AACI,IAAA,IAAA,CAAK,iBAAoB,GAAA,KAAA,CAAA;AACzB,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAAA,GACvB;AACJ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5Ua,UAAA,CAsBK,cAA6C,GAAA;AAAA;AAAA,EAEvD,QAAU,EAAA,CAAA;AAAA;AAAA,EAEV,OAAS,EAAA,CAAA;AAAA;AAAA,EAET,UAAY,EAAA,CAAA;AAChB,CAAA;;;;"}