@react-three/postprocessing 2.15.0 → 2.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/EffectComposer.cjs +126 -0
  2. package/dist/EffectComposer.cjs.map +1 -0
  3. package/dist/EffectComposer.js +126 -0
  4. package/dist/EffectComposer.js.map +1 -0
  5. package/dist/Selection.cjs +36 -0
  6. package/dist/Selection.cjs.map +1 -0
  7. package/dist/Selection.js +36 -0
  8. package/dist/Selection.js.map +1 -0
  9. package/dist/effects/ASCII.cjs +105 -0
  10. package/dist/effects/ASCII.cjs.map +1 -0
  11. package/dist/effects/ASCII.js +105 -0
  12. package/dist/effects/ASCII.js.map +1 -0
  13. package/dist/effects/Autofocus.cjs +126 -0
  14. package/dist/effects/Autofocus.cjs.map +1 -0
  15. package/dist/effects/Autofocus.js +109 -0
  16. package/dist/effects/Autofocus.js.map +1 -0
  17. package/dist/effects/Bloom.cjs +9 -0
  18. package/dist/effects/Bloom.cjs.map +1 -0
  19. package/dist/effects/Bloom.js +9 -0
  20. package/dist/effects/Bloom.js.map +1 -0
  21. package/dist/effects/BrightnessContrast.cjs +7 -0
  22. package/dist/effects/BrightnessContrast.cjs.map +1 -0
  23. package/dist/effects/BrightnessContrast.js +7 -0
  24. package/dist/effects/BrightnessContrast.js.map +1 -0
  25. package/dist/effects/ChromaticAberration.cjs +7 -0
  26. package/dist/effects/ChromaticAberration.cjs.map +1 -0
  27. package/dist/effects/ChromaticAberration.js +7 -0
  28. package/dist/effects/ChromaticAberration.js.map +1 -0
  29. package/dist/effects/ColorAverage.cjs +11 -0
  30. package/dist/effects/ColorAverage.cjs.map +1 -0
  31. package/dist/effects/ColorAverage.js +11 -0
  32. package/dist/effects/ColorAverage.js.map +1 -0
  33. package/dist/effects/ColorDepth.cjs +7 -0
  34. package/dist/effects/ColorDepth.cjs.map +1 -0
  35. package/dist/effects/ColorDepth.js +7 -0
  36. package/dist/effects/ColorDepth.js.map +1 -0
  37. package/dist/effects/Depth.cjs +7 -0
  38. package/dist/effects/Depth.cjs.map +1 -0
  39. package/dist/effects/Depth.js +7 -0
  40. package/dist/effects/Depth.js.map +1 -0
  41. package/dist/effects/DepthOfField.cjs +74 -0
  42. package/dist/effects/DepthOfField.cjs.map +1 -0
  43. package/dist/effects/DepthOfField.js +74 -0
  44. package/dist/effects/DepthOfField.js.map +1 -0
  45. package/dist/effects/DotScreen.cjs +7 -0
  46. package/dist/effects/DotScreen.cjs.map +1 -0
  47. package/dist/effects/DotScreen.js +7 -0
  48. package/dist/effects/DotScreen.js.map +1 -0
  49. package/dist/effects/FXAA.cjs +7 -0
  50. package/dist/effects/FXAA.cjs.map +1 -0
  51. package/dist/effects/FXAA.js +7 -0
  52. package/dist/effects/FXAA.js.map +1 -0
  53. package/dist/effects/Glitch.cjs +30 -0
  54. package/dist/effects/Glitch.cjs.map +1 -0
  55. package/dist/effects/Glitch.js +30 -0
  56. package/dist/effects/Glitch.js.map +1 -0
  57. package/dist/effects/GodRays.cjs +15 -0
  58. package/dist/effects/GodRays.cjs.map +1 -0
  59. package/dist/effects/GodRays.js +15 -0
  60. package/dist/effects/GodRays.js.map +1 -0
  61. package/dist/effects/Grid.cjs +18 -0
  62. package/dist/effects/Grid.cjs.map +1 -0
  63. package/dist/effects/Grid.js +18 -0
  64. package/dist/effects/Grid.js.map +1 -0
  65. package/dist/effects/HueSaturation.cjs +7 -0
  66. package/dist/effects/HueSaturation.cjs.map +1 -0
  67. package/dist/effects/HueSaturation.js +7 -0
  68. package/dist/effects/HueSaturation.js.map +1 -0
  69. package/dist/effects/LUT.cjs +20 -0
  70. package/dist/effects/LUT.cjs.map +1 -0
  71. package/dist/effects/LUT.js +20 -0
  72. package/dist/effects/LUT.js.map +1 -0
  73. package/dist/effects/LensFlare.cjs +189 -0
  74. package/dist/effects/LensFlare.cjs.map +1 -0
  75. package/dist/effects/LensFlare.js +172 -0
  76. package/dist/effects/LensFlare.js.map +1 -0
  77. package/dist/effects/N8AO.cjs +59 -0
  78. package/dist/effects/N8AO.cjs.map +1 -0
  79. package/dist/effects/N8AO.js +59 -0
  80. package/dist/effects/N8AO.js.map +1 -0
  81. package/dist/effects/Noise.cjs +7 -0
  82. package/dist/effects/Noise.cjs.map +1 -0
  83. package/dist/effects/Noise.js +7 -0
  84. package/dist/effects/Noise.js.map +1 -0
  85. package/dist/effects/Outline.cjs +93 -0
  86. package/dist/effects/Outline.cjs.map +1 -0
  87. package/dist/effects/Outline.js +93 -0
  88. package/dist/effects/Outline.js.map +1 -0
  89. package/dist/effects/Pixelation.cjs +11 -0
  90. package/dist/effects/Pixelation.cjs.map +1 -0
  91. package/dist/effects/Pixelation.js +11 -0
  92. package/dist/effects/Pixelation.js.map +1 -0
  93. package/dist/effects/SMAA.cjs +7 -0
  94. package/dist/effects/SMAA.cjs.map +1 -0
  95. package/dist/effects/SMAA.js +7 -0
  96. package/dist/effects/SMAA.js.map +1 -0
  97. package/dist/effects/SSAO.cjs +37 -0
  98. package/dist/effects/SSAO.cjs.map +1 -0
  99. package/dist/effects/SSAO.js +37 -0
  100. package/dist/effects/SSAO.js.map +1 -0
  101. package/dist/effects/SSR/index.cjs +33 -0
  102. package/dist/effects/SSR/index.cjs.map +1 -0
  103. package/dist/effects/SSR/index.js +33 -0
  104. package/dist/effects/SSR/index.js.map +1 -0
  105. package/dist/effects/SSR/screen-space-reflections.cjs +1133 -0
  106. package/dist/effects/SSR/screen-space-reflections.cjs.map +1 -0
  107. package/dist/effects/SSR/screen-space-reflections.js +1133 -0
  108. package/dist/effects/SSR/screen-space-reflections.js.map +1 -0
  109. package/dist/effects/ScanlineEffect.cjs +7 -0
  110. package/dist/effects/ScanlineEffect.cjs.map +1 -0
  111. package/dist/effects/ScanlineEffect.js +7 -0
  112. package/dist/effects/ScanlineEffect.js.map +1 -0
  113. package/dist/effects/SelectiveBloom.cjs +87 -0
  114. package/dist/effects/SelectiveBloom.cjs.map +1 -0
  115. package/dist/effects/SelectiveBloom.js +87 -0
  116. package/dist/effects/SelectiveBloom.js.map +1 -0
  117. package/dist/effects/Sepia.cjs +7 -0
  118. package/dist/effects/Sepia.cjs.map +1 -0
  119. package/dist/effects/Sepia.js +7 -0
  120. package/dist/effects/Sepia.js.map +1 -0
  121. package/dist/effects/ShockWave.cjs +7 -0
  122. package/dist/effects/ShockWave.cjs.map +1 -0
  123. package/dist/effects/ShockWave.js +7 -0
  124. package/dist/effects/ShockWave.js.map +1 -0
  125. package/dist/effects/Texture.cjs +18 -0
  126. package/dist/effects/Texture.cjs.map +1 -0
  127. package/dist/effects/Texture.js +18 -0
  128. package/dist/effects/Texture.js.map +1 -0
  129. package/dist/effects/TiltShift.cjs +7 -0
  130. package/dist/effects/TiltShift.cjs.map +1 -0
  131. package/dist/effects/TiltShift.js +7 -0
  132. package/dist/effects/TiltShift.js.map +1 -0
  133. package/dist/effects/TiltShift2.cjs +98 -0
  134. package/dist/effects/TiltShift2.cjs.map +1 -0
  135. package/dist/effects/TiltShift2.js +98 -0
  136. package/dist/effects/TiltShift2.js.map +1 -0
  137. package/dist/effects/ToneMapping.cjs +7 -0
  138. package/dist/effects/ToneMapping.cjs.map +1 -0
  139. package/dist/effects/ToneMapping.js +7 -0
  140. package/dist/effects/ToneMapping.js.map +1 -0
  141. package/dist/effects/Vignette.cjs +7 -0
  142. package/dist/effects/Vignette.cjs.map +1 -0
  143. package/dist/effects/Vignette.js +7 -0
  144. package/dist/effects/Vignette.js.map +1 -0
  145. package/dist/index.cjs +79 -3616
  146. package/dist/index.cjs.map +1 -1
  147. package/dist/index.js +36 -3557
  148. package/dist/index.js.map +1 -1
  149. package/dist/node_modules/n8ao/dist/N8AO.cjs +1439 -0
  150. package/dist/node_modules/n8ao/dist/N8AO.cjs.map +1 -0
  151. package/dist/node_modules/n8ao/dist/N8AO.js +1439 -0
  152. package/dist/node_modules/n8ao/dist/N8AO.js.map +1 -0
  153. package/dist/util.cjs +69 -0
  154. package/dist/util.cjs.map +1 -0
  155. package/dist/util.js +52 -0
  156. package/dist/util.js.map +1 -0
  157. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/Selection.tsx","../src/EffectComposer.tsx","../src/util.tsx","../src/effects/DepthOfField.tsx","../src/effects/Autofocus.tsx","../src/effects/LensFlare.tsx","../src/effects/Bloom.tsx","../src/effects/BrightnessContrast.tsx","../src/effects/ChromaticAberration.tsx","../src/effects/ColorAverage.tsx","../src/effects/ColorDepth.tsx","../src/effects/Depth.tsx","../src/effects/DotScreen.tsx","../src/effects/Glitch.tsx","../src/effects/GodRays.tsx","../src/effects/Grid.tsx","../src/effects/HueSaturation.tsx","../src/effects/Noise.tsx","../src/effects/Outline.tsx","../src/effects/Pixelation.tsx","../src/effects/ScanlineEffect.tsx","../src/effects/SelectiveBloom.tsx","../src/effects/Sepia.tsx","../src/effects/SSAO.tsx","../src/effects/SMAA.tsx","../src/effects/FXAA.tsx","../src/effects/Texture.tsx","../src/effects/ToneMapping.tsx","../src/effects/Vignette.tsx","../src/effects/ShockWave.tsx","../src/effects/LUT.tsx","../src/effects/TiltShift.tsx","../src/effects/TiltShift2.tsx","../src/effects/ASCII.tsx","../src/effects/SSR/screen-space-reflections.js","../src/effects/SSR/index.tsx","../node_modules/n8ao/dist/N8AO.js","../src/effects/N8AO.tsx"],"sourcesContent":["import * as THREE from 'three'\nimport React, { createContext, useState, useContext, useEffect, useRef, useMemo } from 'react'\n\nexport type Api = {\n selected: THREE.Object3D[]\n select: React.Dispatch<React.SetStateAction<THREE.Object3D[]>>\n enabled: boolean\n}\nexport type SelectApi = JSX.IntrinsicElements['group'] & {\n enabled?: boolean\n}\n\nexport const selectionContext = createContext<Api | null>(null)\n\nexport function Selection({ children, enabled = true }: { enabled?: boolean; children: React.ReactNode }) {\n const [selected, select] = useState<THREE.Object3D[]>([])\n const value = useMemo(() => ({ selected, select, enabled }), [selected, select, enabled])\n return <selectionContext.Provider value={value}>{children}</selectionContext.Provider>\n}\n\nexport function Select({ enabled = false, children, ...props }: SelectApi) {\n const group = useRef<THREE.Group>(null!)\n const api = useContext(selectionContext)\n useEffect(() => {\n if (api && enabled) {\n let changed = false\n const current: THREE.Object3D<THREE.Event>[] = []\n group.current.traverse((o) => {\n o.type === 'Mesh' && current.push(o)\n if (api.selected.indexOf(o) === -1) changed = true\n })\n if (changed) {\n api.select((state) => [...state, ...current])\n return () => {\n api.select((state) => state.filter((selected) => !current.includes(selected)))\n }\n }\n }\n }, [enabled, children, api])\n return (\n <group ref={group} {...props}>\n {children}\n </group>\n )\n}\n","import type { TextureDataType } from 'three'\nimport { HalfFloatType } from 'three'\nimport React, {\n forwardRef,\n useMemo,\n useEffect,\n useLayoutEffect,\n createContext,\n useRef,\n useImperativeHandle,\n} from 'react'\nimport { useThree, useFrame, useInstanceHandle } from '@react-three/fiber'\nimport {\n EffectComposer as EffectComposerImpl,\n RenderPass,\n EffectPass,\n NormalPass,\n // @ts-ignore\n DepthDownsamplingPass,\n Effect,\n Pass,\n} from 'postprocessing'\nimport { isWebGL2Available } from 'three-stdlib'\n\nexport const EffectComposerContext = createContext<{\n composer: EffectComposerImpl\n normalPass: NormalPass | null\n downSamplingPass: DepthDownsamplingPass | null\n camera: THREE.Camera\n scene: THREE.Scene\n resolutionScale?: number\n}>(null!)\n\nexport type EffectComposerProps = {\n enabled?: boolean\n children: JSX.Element | JSX.Element[]\n depthBuffer?: boolean\n disableNormalPass?: boolean\n stencilBuffer?: boolean\n autoClear?: boolean\n resolutionScale?: number\n multisampling?: number\n frameBufferType?: TextureDataType\n renderPriority?: number\n camera?: THREE.Camera\n scene?: THREE.Scene\n}\n\nexport const EffectComposer = React.memo(\n forwardRef(\n (\n {\n children,\n camera: _camera,\n scene: _scene,\n resolutionScale,\n enabled = true,\n renderPriority = 1,\n autoClear = true,\n depthBuffer,\n disableNormalPass,\n stencilBuffer,\n multisampling = 8,\n frameBufferType = HalfFloatType,\n }: EffectComposerProps,\n ref\n ) => {\n const { gl, scene: defaultScene, camera: defaultCamera, size } = useThree()\n const scene = _scene || defaultScene\n const camera = _camera || defaultCamera\n\n const [composer, normalPass, downSamplingPass] = useMemo(() => {\n const webGL2Available = isWebGL2Available()\n // Initialize composer\n const effectComposer = new EffectComposerImpl(gl, {\n depthBuffer,\n stencilBuffer,\n multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,\n frameBufferType,\n })\n\n // Add render pass\n effectComposer.addPass(new RenderPass(scene, camera))\n\n // Create normal pass\n let downSamplingPass = null\n let normalPass = null\n if (!disableNormalPass) {\n normalPass = new NormalPass(scene, camera)\n normalPass.enabled = false\n effectComposer.addPass(normalPass)\n if (resolutionScale !== undefined && webGL2Available) {\n downSamplingPass = new DepthDownsamplingPass({ normalBuffer: normalPass.texture, resolutionScale })\n downSamplingPass.enabled = false\n effectComposer.addPass(downSamplingPass)\n }\n }\n\n return [effectComposer, normalPass, downSamplingPass]\n }, [\n camera,\n gl,\n depthBuffer,\n stencilBuffer,\n multisampling,\n frameBufferType,\n scene,\n disableNormalPass,\n resolutionScale,\n ])\n\n useEffect(() => composer?.setSize(size.width, size.height), [composer, size])\n useFrame(\n (_, delta) => {\n if (enabled) {\n const currentAutoClear = gl.autoClear\n gl.autoClear = autoClear\n if (stencilBuffer && !autoClear) gl.clearStencil()\n composer.render(delta)\n gl.autoClear = currentAutoClear\n }\n },\n enabled ? renderPriority : 0\n )\n\n const group = useRef(null)\n const instance = useInstanceHandle(group)\n useLayoutEffect(() => {\n const passes: Pass[] = []\n\n if (group.current && instance.current && composer) {\n const children = instance.current.objects as unknown[]\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n\n if (child instanceof Effect) {\n const effects: Effect[] = []\n while (children[i] instanceof Effect) effects.push(children[i++] as Effect)\n i--\n\n const pass = new EffectPass(camera, ...effects)\n passes.push(pass)\n } else if (child instanceof Pass) {\n passes.push(child)\n }\n }\n\n for (const pass of passes) composer?.addPass(pass)\n\n if (normalPass) normalPass.enabled = true\n if (downSamplingPass) downSamplingPass.enabled = true\n }\n\n return () => {\n for (const pass of passes) composer?.removePass(pass)\n if (normalPass) normalPass.enabled = false\n if (downSamplingPass) downSamplingPass.enabled = false\n }\n }, [composer, children, camera, normalPass, downSamplingPass, instance])\n\n // Memoize state, otherwise it would trigger all consumers on every render\n const state = useMemo(\n () => ({ composer, normalPass, downSamplingPass, resolutionScale, camera, scene }),\n [composer, normalPass, downSamplingPass, resolutionScale, camera, scene]\n )\n\n // Expose the composer\n useImperativeHandle(ref, () => composer, [composer])\n\n return (\n <EffectComposerContext.Provider value={state}>\n <group ref={group}>{children}</group>\n </EffectComposerContext.Provider>\n )\n }\n )\n)\n","import React, { MutableRefObject } from 'react'\nimport { Vector2 } from 'three'\nimport * as THREE from 'three'\nimport { type ReactThreeFiber, extend, useThree } from '@react-three/fiber'\nimport type { Effect, BlendFunction } from 'postprocessing'\n\nexport const resolveRef = <T,>(ref: T | React.MutableRefObject<T>) =>\n typeof ref === 'object' && ref != null && 'current' in ref ? ref.current : ref\n\nexport type EffectConstructor = new (...args: any[]) => Effect\n\nexport type EffectProps<T extends EffectConstructor> = ReactThreeFiber.Node<\n T extends Function ? T['prototype'] : InstanceType<T>,\n T\n> &\n ConstructorParameters<T>[0] & {\n blendFunction?: BlendFunction\n opacity?: number\n }\n\nlet i = 0\nconst components = new WeakMap<EffectConstructor, React.ExoticComponent<any> | string>()\n\nexport const wrapEffect = <T extends EffectConstructor>(effect: T, defaults?: EffectProps<T>) =>\n /* @__PURE__ */ React.forwardRef<T, EffectProps<T>>(function Effect(\n { blendFunction = defaults?.blendFunction, opacity = defaults?.opacity, ...props },\n ref\n ) {\n let Component = components.get(effect)\n if (!Component) {\n const key = `@react-three/postprocessing/${effect.name}-${i++}`\n extend({ [key]: effect })\n components.set(effect, (Component = key))\n }\n\n const camera = useThree((state) => state.camera)\n const args = React.useMemo(\n () => [...((defaults?.args ?? []) as any[]), ...((props.args ?? [{ ...defaults, ...props }]) as any[])],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(props)]\n )\n\n return (\n <Component\n camera={camera}\n blendMode-blendFunction={blendFunction}\n blendMode-opacity-value={opacity}\n {...props}\n ref={ref}\n args={args}\n />\n )\n })\n\nexport const useVector2 = (props: Record<string, unknown>, key: string): THREE.Vector2 => {\n const value = props[key] as ReactThreeFiber.Vector2 | undefined\n return React.useMemo(() => {\n if (typeof value === 'number') return new THREE.Vector2(value, value)\n else if (value) return new THREE.Vector2(...(value as THREE.Vector2Tuple))\n else return new THREE.Vector2()\n }, [value])\n}\n","import { DepthOfFieldEffect, MaskFunction } from 'postprocessing'\nimport { Ref, forwardRef, useMemo, useLayoutEffect, useContext } from 'react'\nimport { ReactThreeFiber, useThree } from '@react-three/fiber'\nimport { type DepthPackingStrategies, type Texture, Vector3 } from 'three'\nimport { EffectComposerContext } from '../EffectComposer'\n\ntype DOFProps = ConstructorParameters<typeof DepthOfFieldEffect>[1] &\n Partial<{\n target: ReactThreeFiber.Vector3\n depthTexture: {\n texture: Texture\n packing: number\n }\n blur: number\n }>\n\nexport const DepthOfField = forwardRef(function DepthOfField(\n { target, depthTexture, ...props }: DOFProps,\n ref: Ref<DepthOfFieldEffect>\n) {\n const invalidate = useThree((state) => state.invalidate)\n const { camera } = useContext(EffectComposerContext)\n const effect = useMemo(() => {\n const effect = new DepthOfFieldEffect(camera, props)\n // Temporary fix that restores DOF 6.21.3 behavior, everything since then lets shapes leak through the blur\n const maskMaterial = (effect as any).maskPass.getFullscreenMaterial()\n maskMaterial.maskFunction = MaskFunction.MULTIPLY_RGB_SET_ALPHA\n return effect\n }, [camera, props])\n useLayoutEffect(() => {\n if (target && typeof target !== 'number') {\n const vec: Vector3 =\n target instanceof Vector3\n ? new Vector3().set(target.x, target.y, target.z)\n : new Vector3().set(target[0], target[1], target[2])\n effect.target = vec\n }\n if (depthTexture) effect.setDepthTexture(depthTexture.texture, depthTexture.packing as DepthPackingStrategies)\n invalidate()\n }, [target, depthTexture, effect])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import * as THREE from 'three'\nimport React, {\n useRef,\n useContext,\n useState,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n RefObject,\n useMemo,\n} from 'react'\nimport { useThree, useFrame, createPortal, Vector3 } from '@react-three/fiber'\nimport { CopyPass, DepthPickingPass, DepthOfFieldEffect } from 'postprocessing'\nimport { easing } from 'maath'\n\nimport { DepthOfField } from './DepthOfField'\nimport { EffectComposerContext } from '../EffectComposer'\n\nexport type AutofocusProps = React.ComponentProps<typeof DepthOfField> & {\n target?: Vector3\n /** should the target follow the pointer */\n mouse?: boolean\n /** size of the debug green point */\n debug?: number\n /** manual update */\n manual?: boolean\n /** approximate time to reach the target */\n smoothTime?: number\n}\n\nexport type AutofocusApi = {\n dofRef: RefObject<DepthOfFieldEffect>\n hitpoint: THREE.Vector3\n update: (delta: number, updateTarget: boolean) => void\n}\n\nexport const Autofocus = forwardRef<AutofocusApi, AutofocusProps>(\n (\n { target = undefined, mouse: followMouse = false, debug = undefined, manual = false, smoothTime = 0.25, ...props },\n fref\n ) => {\n const dofRef = useRef<DepthOfFieldEffect>(null)\n const hitpointRef = useRef<THREE.Mesh>(null)\n const targetRef = useRef<THREE.Mesh>(null)\n\n const scene = useThree(({ scene }) => scene)\n const pointer = useThree(({ pointer }) => pointer)\n const { composer, camera } = useContext(EffectComposerContext)\n\n // see: https://codesandbox.io/s/depthpickingpass-x130hg\n const [depthPickingPass] = useState(() => new DepthPickingPass())\n const [copyPass] = useState(() => new CopyPass())\n useEffect(() => {\n composer.addPass(depthPickingPass)\n composer.addPass(copyPass)\n return () => {\n composer.removePass(depthPickingPass)\n composer.removePass(copyPass)\n }\n }, [composer, depthPickingPass, copyPass])\n\n useEffect(() => {\n return () => {\n depthPickingPass.dispose()\n copyPass.dispose()\n }\n }, [depthPickingPass, copyPass])\n\n const [hitpoint] = useState(() => new THREE.Vector3(0, 0, 0))\n\n const [ndc] = useState(() => new THREE.Vector3(0, 0, 0))\n const getHit = useCallback(\n async (x: number, y: number) => {\n ndc.x = x\n ndc.y = y\n ndc.z = await depthPickingPass.readDepth(ndc)\n ndc.z = ndc.z * 2.0 - 1.0\n const hit = 1 - ndc.z > 0.0000001 // it is missed if ndc.z is close to 1\n return hit ? ndc.unproject(camera) : false\n },\n [ndc, depthPickingPass, camera]\n )\n\n const update = useCallback(\n async (delta: number, updateTarget = true) => {\n // Update hitpoint\n if (target) {\n hitpoint.set(...(target as [number, number, number]))\n } else {\n const { x, y } = followMouse ? pointer : { x: 0, y: 0 }\n const hit = await getHit(x, y)\n if (hit) hitpoint.copy(hit)\n }\n\n // Update target\n if (updateTarget && dofRef.current?.target) {\n if (smoothTime > 0 && delta > 0) {\n easing.damp3(dofRef.current.target, hitpoint, smoothTime, delta)\n } else {\n dofRef.current.target.copy(hitpoint)\n }\n }\n },\n [target, hitpoint, followMouse, getHit, smoothTime, pointer]\n )\n\n useFrame(async (_, delta) => {\n if (!manual) {\n update(delta)\n }\n if (hitpointRef.current) {\n hitpointRef.current.position.copy(hitpoint)\n }\n if (targetRef.current && dofRef.current?.target) {\n targetRef.current.position.copy(dofRef.current.target)\n }\n })\n\n // Ref API\n const api = useMemo<AutofocusApi>(\n () => ({\n dofRef,\n hitpoint,\n update,\n }),\n [hitpoint, update]\n )\n useImperativeHandle(fref, () => api, [api])\n\n return (\n <>\n {debug\n ? createPortal(\n <>\n <mesh ref={hitpointRef}>\n <sphereGeometry args={[debug, 16, 16]} />\n <meshBasicMaterial color=\"#00ff00\" opacity={1} transparent depthWrite={false} />\n </mesh>\n <mesh ref={targetRef}>\n <sphereGeometry args={[debug / 2, 16, 16]} />\n <meshBasicMaterial color=\"#00ff00\" opacity={0.5} transparent depthWrite={false} />\n </mesh>\n </>,\n scene\n )\n : null}\n\n <DepthOfField ref={dofRef} {...props} target={hitpoint} />\n </>\n )\n }\n)\n","// Created by Anderson Mancini 2023\n// React Three Fiber Ultimate LensFlare\n// To be used Effect together with react-three/postprocessing\n\nimport * as THREE from 'three'\nimport { useMemo, useEffect, forwardRef, useState, useContext } from 'react'\nimport { useFrame, useThree } from '@react-three/fiber'\nimport { BlendFunction, Effect } from 'postprocessing'\nimport { easing } from 'maath'\n\nimport { EffectComposerContext } from '../EffectComposer'\n\nconst LensFlareShader = {\n fragmentShader: /* glsl */ `\n\n uniform float iTime;\n uniform vec2 lensPosition;\n uniform vec2 iResolution;\n uniform vec3 colorGain;\n uniform float starPoints;\n uniform float glareSize;\n uniform float flareSize;\n uniform float flareSpeed;\n uniform float flareShape;\n uniform float haloScale;\n uniform float opacity;\n uniform bool animated;\n uniform bool anamorphic;\n uniform bool enabled;\n uniform bool secondaryGhosts;\n uniform bool starBurst;\n uniform float ghostScale;\n uniform bool aditionalStreaks;\n uniform sampler2D lensDirtTexture;\n vec2 vxtC;\n\n float rndf(float n){return fract(sin(n) * 43758.5453123);}float niz(float p){float fl = floor(p);float fc = fract(p);return mix(rndf(fl),rndf(fl + 1.0), fc);}\n vec3 hsv2rgb(vec3 c){vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);}\n float satU(float x){return clamp(x, 0.,1.);}vec2 rtU(vec2 naz, float rtn){return vec2(cos(rtn) * naz.x + sin(rtn) * naz.y,cos(rtn) * naz.y - sin(rtn) * naz.x);}\n vec3 drwF(vec2 p, float intensity, float rnd, float speed, int id){float flhos = (1. / 32.) * float(id) * 0.1;float lingrad = distance(vec2(0.), p);float expg = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));vec3 qzTg = hsv2rgb(vec3( fract( (expg * 8.) + speed * flareSpeed + flhos), pow(1.-abs(expg*2.-1.), 0.45), 20.0 * expg * intensity));float internalStarPoints;if(anamorphic){internalStarPoints = 1.0;} else{internalStarPoints = starPoints;}float ams = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));float kJhg = pow(1.-satU(ams), ( anamorphic ? 100. : 12.));kJhg += satU(expg-0.9) * 3.;kJhg = pow(kJhg * expg, 8. + (1.-intensity) * 5.);if(flareSpeed > 0.0){return vec3(kJhg) * qzTg;} else{return vec3(kJhg) * flareSize * 15.;}}\n float ams2(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z);}vec3 satU(vec3 x){return clamp(x, vec3(0.0), vec3(1.0));}\n float glR(vec2 naz, vec2 pos, float zsi){vec2 mni;if(animated){mni = rtU(naz-pos, iTime * 0.1);} else{mni = naz-pos;}float ang = atan(mni.y, mni.x) * (anamorphic ? 1.0 : starPoints);float ams2 = length(mni);ams2 = pow(ams2, .9);float f0 = 1.0/(length(naz-pos)*(1.0/zsi*16.0)+.2);return f0+f0*(sin((ang))*.2 +.3);}\n float sdHex(vec2 p){p = abs(p);vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);return dot(step(q.xy,q.yx), 1.0-q.yx);}float fpow(float x, float k){return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;}\n vec3 rHx(vec2 naz, vec2 p, float s, vec3 col){naz -= p;if (abs(naz.x) < 0.2*s && abs(naz.y) < 0.2*s){return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(naz/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(naz*20.0/s)));}return vec3(0);}\n vec3 mLs(vec2 naz, vec2 pos){vec2 mni = naz-pos;vec2 zxMp = naz*(length(naz));float ang = atan(mni.x,mni.y);float f0 = .3/(length(naz-pos)*16.0+1.0);f0 = f0*(sin(niz(sin(ang*3.9-(animated ? iTime : 0.0) * 0.3) * starPoints))*.2 );float f1 = max(0.01-pow(length(naz+1.2*pos),1.9),.0)*7.0;float f2 = max(.9/(10.0+32.0*pow(length(zxMp+0.99*pos),2.0)),.0)*0.35;float f22 = max(.9/(11.0+32.0*pow(length(zxMp+0.85*pos),2.0)),.0)*0.23;float f23 = max(.9/(12.0+32.0*pow(length(zxMp+0.95*pos),2.0)),.0)*0.6;vec2 ztX = mix(naz,zxMp, 0.1);float f4 = max(0.01-pow(length(ztX+0.4*pos),2.9),.0)*4.02;float f42 = max(0.0-pow(length(ztX+0.45*pos),2.9),.0)*4.1;float f43 = max(0.01-pow(length(ztX+0.5*pos),2.9),.0)*4.6;ztX = mix(naz,zxMp,-.4);float f5 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;float f52 = max(0.01-pow(length(ztX+0.2*pos),5.5),.0)*2.0;float f53 = max(0.01-pow(length(ztX+0.1*pos),5.5),.0)*2.0;ztX = mix(naz,zxMp, 2.1);float f6 = max(0.01-pow(length(ztX-0.3*pos),1.61),.0)*3.159;float f62 = max(0.01-pow(length(ztX-0.325*pos),1.614),.0)*3.14;float f63 = max(0.01-pow(length(ztX-0.389*pos),1.623),.0)*3.12;vec3 c = vec3(glR(naz,pos, glareSize));vec2 prot;if(animated){prot = rtU(naz - pos, (iTime * 0.1));} else if(anamorphic){prot = rtU(naz - pos, 1.570796);} else {prot = naz - pos;}c += drwF(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, iTime, 1);c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;c = c*1.3 * vec3(length(zxMp)+.09);c+=vec3(f0);return c;}\n vec3 cc(vec3 clr, float fct,float fct2){float w = clr.x+clr.y+clr.z;return mix(clr,vec3(w)*fct,w*fct2);}float rnd(vec2 p){float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));return f;}float rnd(float w){float f = fract(sin(w)*1000.);return f;}\n float rShp(vec2 p, int N){float f;float a=atan(p.x,p.y)+.2;float b=6.28319/float(N);f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);return f;}\n vec3 drC(vec2 p, float zsi, float dCy, vec3 clr, vec3 clr2, float ams2, vec2 esom){float l = length(p + esom*(ams2*2.))+zsi/2.;float l2 = length(p + esom*(ams2*4.))+zsi/3.;float c = max(0.01-pow(length(p + esom*ams2), zsi*ghostScale), 0.0)*10.;float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;float c2 = max(0.09/pow(length(p-esom*ams2/.5)*1., .95), 0.0)/20.;float s = max(0.02-pow(rShp(p*5. + esom*ams2*5. + dCy, 6) , 1.), 0.0)*1.5;clr = cos(vec3(0.44, .24, .2)*8. + ams2*4.)*0.5+.5;vec3 f = c*clr;f += c1*clr;f += c2*clr;f += s*clr;return f-0.01;}\n vec4 geLC(float x){return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),1.0);}\n float diTN(vec2 p){vec2 f = fract(p);f = (f * f) * (3.0 - (2.0 * f));float n = dot(floor(p), vec2(1.0, 157.0));vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);} \n float fbm(vec2 p){const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);float f = 0.0;f += 0.5000*diTN(p); p = m*p*2.02;f += 0.2500*diTN(p); p = m*p*2.03;f += 0.1250*diTN(p); p = m*p*2.01;f += 0.0625*diTN(p);return f/0.9375;} \n vec4 geLS(vec2 p){vec2 pp = (p - vec2(0.5)) * 2.0;float a = atan(pp.y, pp.x);vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;return vec4(vec3(c * 1.0), d);}\n vec4 geLD(vec2 p){p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),smoothstep(0.4, 0.0, length(p - vec2(0.75)))),smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);}\n vec4 txL(sampler2D tex, vec2 xtC){if(((xtC.x < 0.) || (xtC.y < 0.)) || ((xtC.x > 1.) || (xtC.y > 1.))){return vec4(0.0);}else{return texture(tex, xtC); }}\n vec4 txD(sampler2D tex, vec2 xtC, vec2 dir, vec3 ditn) {return vec4(txL(tex, (xtC + (dir * ditn.r))).r,txL(tex, (xtC + (dir * ditn.g))).g,txL(tex, (xtC + (dir * ditn.b))).b,1.0);}\n vec4 strB(){vec2 aspXtc = vec2(1.0) - (((vxtC - vec2(0.5)) * vec2(1.0)) + vec2(0.5)); vec2 xtC = vec2(1.0) - vxtC; vec2 ghvc = (vec2(0.5) - xtC) * 0.3 - lensPosition; vec2 ghNm = normalize(ghvc * vec2(1.0)) * vec2(1.0);vec2 haloVec = normalize(ghvc) * 0.6;vec2 hlNm = ghNm * 0.6;vec2 texelSize = vec2(1.0) / vec2(iResolution.xy);vec3 ditn = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);vec4 c = vec4(0.0);for (int i = 0; i < 8; i++) {vec2 offset = xtC + (ghvc * float(i));c += txD(lensDirtTexture, offset, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);}vec2 uyTrz = xtC + hlNm; return (c * geLC((length(vec2(0.5) - aspXtc) / length(vec2(haloScale))))) +(txD(lensDirtTexture, uyTrz, ghNm, ditn) * pow(max(0.0, 1.0 - (length(vec2(0.5) - uyTrz) / length(vec2(0.5)))), 10.0));} \n void mainImage(vec4 v,vec2 r,out vec4 i){vec2 g=r-.5;g.y*=iResolution.y/iResolution.x;vec2 l=lensPosition*.5;l.y*=iResolution.y/iResolution.x;vec3 f=mLs(g,l)*20.*colorGain/256.;if(aditionalStreaks){vec3 o=vec3(.9,.2,.1),p=vec3(.3,.1,.9);for(float n=0.;n<10.;n++)f+=drC(g,pow(rnd(n*2e3)*2.8,.1)+1.41,0.,o+n,p+n,rnd(n*20.)*3.+.2-.5,lensPosition);}if(secondaryGhosts){vec3 n=vec3(0);n+=rHx(g,-lensPosition*.25,ghostScale*1.4,vec3(.25,.35,0));n+=rHx(g,lensPosition*.25,ghostScale*.5,vec3(1,.5,.5));n+=rHx(g,lensPosition*.1,ghostScale*1.6,vec3(1));n+=rHx(g,lensPosition*1.8,ghostScale*2.,vec3(0,.5,.75));n+=rHx(g,lensPosition*1.25,ghostScale*.8,vec3(1,1,.5));n+=rHx(g,-lensPosition*1.25,ghostScale*5.,vec3(.5,.5,.25));n+=fpow(1.-abs(distance(lensPosition*.8,g)-.7),.985)*colorGain/2100.;f+=n;}if(starBurst){vxtC=g+.5;vec4 n=geLD(g);float o=1.-clamp(0.5,0.,.5)*2.;n+=mix(n,pow(n*2.,vec4(2))*.5,o);float s=(g.x+g.y)*(1./6.);vec2 d=mat2(cos(s),-sin(s),sin(s),cos(s))*vxtC;n+=geLS(d)*2.;f+=clamp(n.xyz*strB().xyz,.01,1.);}i=enabled?vec4(mix(f,vec3(0),opacity)+v.xyz,v.w):vec4(v);}\n`,\n}\n\nexport class LensFlareEffect extends Effect {\n constructor({\n blendFunction = BlendFunction.NORMAL,\n enabled = true,\n glareSize = 0.2,\n lensPosition = [0.01, 0.01],\n iResolution = [0, 0],\n starPoints = 6,\n flareSize = 0.01,\n flareSpeed = 0.01,\n flareShape = 0.01,\n animated = true,\n anamorphic = false,\n colorGain = new THREE.Color(20, 20, 20),\n lensDirtTexture = null as THREE.Texture | null,\n haloScale = 0.5,\n secondaryGhosts = true,\n aditionalStreaks = true,\n ghostScale = 0.0,\n opacity = 1.0,\n starBurst = false,\n } = {}) {\n super('LensFlareEffect', LensFlareShader.fragmentShader, {\n blendFunction,\n uniforms: new Map<string, THREE.Uniform>([\n ['enabled', new THREE.Uniform(enabled)],\n ['glareSize', new THREE.Uniform(glareSize)],\n ['lensPosition', new THREE.Uniform(lensPosition)],\n ['iTime', new THREE.Uniform(0)],\n ['iResolution', new THREE.Uniform(iResolution)],\n ['starPoints', new THREE.Uniform(starPoints)],\n ['flareSize', new THREE.Uniform(flareSize)],\n ['flareSpeed', new THREE.Uniform(flareSpeed)],\n ['flareShape', new THREE.Uniform(flareShape)],\n ['animated', new THREE.Uniform(animated)],\n ['anamorphic', new THREE.Uniform(anamorphic)],\n ['colorGain', new THREE.Uniform(colorGain)],\n ['lensDirtTexture', new THREE.Uniform(lensDirtTexture)],\n ['haloScale', new THREE.Uniform(haloScale)],\n ['secondaryGhosts', new THREE.Uniform(secondaryGhosts)],\n ['aditionalStreaks', new THREE.Uniform(aditionalStreaks)],\n ['ghostScale', new THREE.Uniform(ghostScale)],\n ['starBurst', new THREE.Uniform(starBurst)],\n ['opacity', new THREE.Uniform(opacity)],\n ]),\n })\n }\n\n update(_renderer: any, _inputBuffer: any, deltaTime: number) {\n const iTime = this.uniforms.get('iTime')\n if (iTime) {\n iTime.value += deltaTime\n }\n }\n}\n\ntype LensFlareProps = ConstructorParameters<typeof LensFlareEffect>[0] & {\n position?: THREE.Vector3\n followMouse?: boolean\n smoothTime?: number\n}\n\nexport const LensFlare = forwardRef<LensFlareEffect, LensFlareProps>(\n ({ position = new THREE.Vector3(-25, 6, -60), followMouse = false, smoothTime = 0.07, ...props }, ref) => {\n const viewport = useThree(({ viewport }) => viewport)\n const raycaster = useThree(({ raycaster }) => raycaster)\n const pointer = useThree(({ pointer }) => pointer)\n const { scene, camera } = useContext(EffectComposerContext)\n\n const [projectedPosition] = useState(() => new THREE.Vector3())\n const [mouse2d] = useState(() => new THREE.Vector2())\n\n const effect = useMemo(() => new LensFlareEffect(props), [props])\n\n useFrame((_, delta) => {\n const uLensPosition = effect.uniforms.get('lensPosition')\n const uOpacity = effect.uniforms.get('opacity')\n if (!uLensPosition || !uOpacity) return\n\n let target = 1\n\n if (followMouse) {\n uLensPosition.value.x = pointer.x\n uLensPosition.value.y = pointer.y\n target = 0\n } else {\n projectedPosition.copy(position).project(camera)\n if (projectedPosition.z > 1) return\n\n uLensPosition.value.x = projectedPosition.x\n uLensPosition.value.y = projectedPosition.y\n\n mouse2d.set(projectedPosition.x, projectedPosition.y)\n raycaster.setFromCamera(mouse2d, camera)\n const intersects = raycaster.intersectObjects(scene.children, true)\n const { object } = intersects[0]\n if (object) {\n if (object.userData?.lensflare === 'no-occlusion') {\n target = 0\n } else if (object instanceof THREE.Mesh) {\n if (object.material.uniforms?._transmission?.value > 0.2) {\n //Check for MeshTransmissionMaterial\n target = 0.2\n } else if (object.material._transmission && object.material._transmission > 0.2) {\n //Check for MeshPhysicalMaterial with transmission setting\n target = 0.2\n } else if (object.material.transparent) {\n // Check for OtherMaterials with transparent parameter\n target = object.material.opacity\n }\n }\n }\n }\n\n easing.damp(uOpacity, 'value', target, smoothTime, delta)\n })\n\n useEffect(() => {\n const iResolution = effect.uniforms.get('iResolution')\n if (iResolution) {\n iResolution.value.x = viewport.width\n iResolution.value.y = viewport.height\n }\n }, [effect, viewport])\n\n return <primitive ref={ref} object={effect} dispose={null} />\n }\n)\n","import { BloomEffect, BlendFunction } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Bloom = wrapEffect(BloomEffect, {\n blendFunction: BlendFunction.ADD,\n})\n","import { BrightnessContrastEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const BrightnessContrast = wrapEffect(BrightnessContrastEffect)\n","import { ChromaticAberrationEffect } from 'postprocessing'\nimport { type EffectProps, wrapEffect } from '../util'\n\nexport type ChromaticAberrationProps = EffectProps<typeof ChromaticAberrationEffect>\nexport const ChromaticAberration = wrapEffect(ChromaticAberrationEffect)\n","import { ColorAverageEffect, BlendFunction } from 'postprocessing'\nimport React, { Ref, forwardRef, useMemo } from 'react'\n\nexport type ColorAverageProps = Partial<{\n blendFunction: BlendFunction\n}>\n\nexport const ColorAverage = forwardRef<ColorAverageEffect, ColorAverageProps>(function ColorAverage(\n { blendFunction = BlendFunction.NORMAL }: ColorAverageProps,\n ref: Ref<ColorAverageEffect>\n) {\n /** Because ColorAverage blendFunction is not an object but a number, we have to define a custom prop \"blendFunction\" */\n const effect = useMemo(() => new ColorAverageEffect(blendFunction), [blendFunction])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { ColorDepthEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const ColorDepth = wrapEffect(ColorDepthEffect)\n","import { DepthEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Depth = wrapEffect(DepthEffect)\n","import { DotScreenEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const DotScreen = wrapEffect(DotScreenEffect)\n","import { Vector2 } from 'three'\nimport { GlitchEffect, GlitchMode } from 'postprocessing'\nimport { Ref, forwardRef, useMemo, useLayoutEffect, useEffect } from 'react'\nimport { ReactThreeFiber, useThree } from '@react-three/fiber'\nimport { useVector2 } from '../util'\n\nexport type GlitchProps = ConstructorParameters<typeof GlitchEffect>[0] &\n Partial<{\n mode: GlitchMode\n active: boolean\n delay: ReactThreeFiber.Vector2\n duration: ReactThreeFiber.Vector2\n chromaticAberrationOffset: ReactThreeFiber.Vector2\n strength: ReactThreeFiber.Vector2\n }>\n\nexport const Glitch = forwardRef<GlitchEffect, GlitchProps>(function Glitch(\n { active = true, ...props }: GlitchProps,\n ref: Ref<GlitchEffect>\n) {\n const invalidate = useThree((state) => state.invalidate)\n const delay = useVector2(props, 'delay')\n const duration = useVector2(props, 'duration')\n const strength = useVector2(props, 'strength')\n const chromaticAberrationOffset = useVector2(props, 'chromaticAberrationOffset')\n const effect = useMemo(\n () => new GlitchEffect({ ...props, delay, duration, strength, chromaticAberrationOffset }),\n [delay, duration, props, strength, chromaticAberrationOffset]\n )\n useLayoutEffect(() => {\n effect.mode = active ? props.mode || GlitchMode.SPORADIC : GlitchMode.DISABLED\n invalidate()\n }, [active, effect, invalidate, props.mode])\n useEffect(() => {\n return () => {\n effect.dispose()\n }\n }, [effect])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { GodRaysEffect } from 'postprocessing'\nimport React, { Ref, forwardRef, useMemo, useContext, useLayoutEffect } from 'react'\nimport { Mesh, Points } from 'three'\nimport { EffectComposerContext } from '../EffectComposer'\nimport { resolveRef } from '../util'\n\ntype GodRaysProps = ConstructorParameters<typeof GodRaysEffect>[2] & {\n sun: Mesh | Points | React.MutableRefObject<Mesh | Points>\n}\n\nexport const GodRays = forwardRef(function GodRays(props: GodRaysProps, ref: Ref<GodRaysEffect>) {\n const { camera } = useContext(EffectComposerContext)\n const effect = useMemo(() => new GodRaysEffect(camera, resolveRef(props.sun), props), [camera, props])\n // @ts-ignore v6.30.2 https://github.com/pmndrs/postprocessing/pull/470/commits/091ef6f9516ca02efa7576305afbecf1ce8323ae\n useLayoutEffect(() => void (effect.lightSource = resolveRef(props.sun)), [effect, props.sun])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import React, { Ref, forwardRef, useMemo, useLayoutEffect } from 'react'\nimport { GridEffect } from 'postprocessing'\nimport { useThree } from '@react-three/fiber'\n\ntype GridProps = ConstructorParameters<typeof GridEffect>[0] &\n Partial<{\n size: {\n width: number\n height: number\n }\n }>\n\nexport const Grid = forwardRef(function Grid({ size, ...props }: GridProps, ref: Ref<GridEffect>) {\n const invalidate = useThree((state) => state.invalidate)\n const effect = useMemo(() => new GridEffect(props), [props])\n useLayoutEffect(() => {\n if (size) effect.setSize(size.width, size.height)\n invalidate()\n }, [effect, size])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { HueSaturationEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const HueSaturation = wrapEffect(HueSaturationEffect)\n","import { NoiseEffect, BlendFunction } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Noise = wrapEffect(NoiseEffect, { blendFunction: BlendFunction.COLOR_DODGE })\n","import { OutlineEffect } from 'postprocessing'\nimport { Ref, MutableRefObject, forwardRef, useMemo, useEffect, useContext, useRef } from 'react'\nimport { Object3D } from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { EffectComposerContext } from '../EffectComposer'\nimport { selectionContext } from '../Selection'\nimport { resolveRef } from '../util'\n\ntype ObjectRef = MutableRefObject<Object3D>\n\nexport type OutlineProps = ConstructorParameters<typeof OutlineEffect>[2] &\n Partial<{\n selection: Object3D | Object3D[] | ObjectRef | ObjectRef[]\n selectionLayer: number\n }>\n\nexport const Outline = forwardRef(function Outline(\n {\n selection = [],\n selectionLayer = 10,\n blendFunction,\n patternTexture,\n edgeStrength,\n pulseSpeed,\n visibleEdgeColor,\n hiddenEdgeColor,\n width,\n height,\n kernelSize,\n blur,\n xRay,\n ...props\n }: OutlineProps,\n forwardRef: Ref<OutlineEffect>\n) {\n const invalidate = useThree((state) => state.invalidate)\n const { scene, camera } = useContext(EffectComposerContext)\n\n const effect = useMemo(\n () =>\n new OutlineEffect(scene, camera, {\n blendFunction,\n patternTexture,\n edgeStrength,\n pulseSpeed,\n visibleEdgeColor,\n hiddenEdgeColor,\n width,\n height,\n kernelSize,\n blur,\n xRay,\n ...props,\n }),\n [\n blendFunction,\n blur,\n camera,\n edgeStrength,\n height,\n hiddenEdgeColor,\n kernelSize,\n patternTexture,\n pulseSpeed,\n scene,\n visibleEdgeColor,\n width,\n xRay,\n ]\n )\n\n const api = useContext(selectionContext)\n\n useEffect(() => {\n // Do not allow array selection if declarative selection is active\n // TODO: array selection should probably be deprecated altogether\n if (!api && selection) {\n effect.selection.set(\n Array.isArray(selection) ? (selection as Object3D[]).map(resolveRef) : [resolveRef(selection) as Object3D]\n )\n invalidate()\n return () => {\n effect.selection.clear()\n invalidate()\n }\n }\n }, [effect, selection, api, invalidate])\n\n useEffect(() => {\n effect.selectionLayer = selectionLayer\n invalidate()\n }, [effect, invalidate, selectionLayer])\n\n const ref = useRef<OutlineEffect>()\n useEffect(() => {\n if (api && api.enabled) {\n if (api.selected?.length) {\n effect.selection.set(api.selected)\n invalidate()\n return () => {\n effect.selection.clear()\n invalidate()\n }\n }\n }\n }, [api, effect.selection, invalidate])\n\n return <primitive ref={forwardRef} object={effect} />\n})\n","import { forwardRef, useMemo, Ref } from 'react'\nimport { PixelationEffect } from 'postprocessing'\n\nexport type PixelationProps = {\n granularity?: number\n}\n\nexport const Pixelation = forwardRef<PixelationEffect, PixelationProps>(function Pixelation(\n { granularity = 5 }: PixelationProps,\n ref: Ref<PixelationEffect>\n) {\n /** Because GlitchEffect granularity is not an object but a number, we have to define a custom prop \"granularity\" */\n const effect = useMemo(() => new PixelationEffect(granularity), [granularity])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { ScanlineEffect, BlendFunction } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Scanline = wrapEffect(ScanlineEffect, { blendFunction: BlendFunction.OVERLAY, density: 1.25 })\n","import { SelectiveBloomEffect, BlendFunction } from 'postprocessing'\nimport type { BloomEffectOptions } from 'postprocessing'\nimport React, { Ref, MutableRefObject, forwardRef, useMemo, useEffect, useContext, useRef } from 'react'\nimport { Object3D } from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { EffectComposerContext } from '../EffectComposer'\nimport { selectionContext } from '../Selection'\nimport { resolveRef } from '../util'\n\ntype ObjectRef = MutableRefObject<Object3D>\n\nexport type SelectiveBloomProps = BloomEffectOptions &\n Partial<{\n lights: Object3D[] | ObjectRef[]\n selection: Object3D | Object3D[] | ObjectRef | ObjectRef[]\n selectionLayer: number\n }>\n\nconst addLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.enable(effect.selection.layer)\nconst removeLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.disable(effect.selection.layer)\n\nexport const SelectiveBloom = forwardRef(function SelectiveBloom(\n {\n selection = [],\n selectionLayer = 10,\n lights = [],\n luminanceThreshold,\n luminanceSmoothing,\n intensity,\n width,\n height,\n kernelSize,\n mipmapBlur,\n\n ...props\n }: SelectiveBloomProps,\n forwardRef: Ref<SelectiveBloomEffect>\n) {\n if (lights.length === 0) {\n console.warn('SelectiveBloom requires lights to work.')\n }\n\n const invalidate = useThree((state) => state.invalidate)\n const { scene, camera } = useContext(EffectComposerContext)\n const effect = useMemo(\n () =>\n new SelectiveBloomEffect(scene, camera, {\n blendFunction: BlendFunction.ADD,\n luminanceThreshold,\n luminanceSmoothing,\n intensity,\n width,\n height,\n kernelSize,\n mipmapBlur,\n ...props,\n }),\n [scene, camera, luminanceThreshold, luminanceSmoothing, intensity, width, height, kernelSize, mipmapBlur, props]\n )\n\n const api = useContext(selectionContext)\n\n useEffect(() => {\n // Do not allow array selection if declarative selection is active\n // TODO: array selection should probably be deprecated altogether\n if (!api && selection) {\n effect.selection.set(\n Array.isArray(selection) ? (selection as Object3D[]).map(resolveRef) : [resolveRef(selection) as Object3D]\n )\n invalidate()\n return () => {\n effect.selection.clear()\n invalidate()\n }\n }\n }, [effect, selection, api, invalidate])\n\n useEffect(() => {\n effect.selection.layer = selectionLayer\n invalidate()\n }, [effect, invalidate, selectionLayer])\n\n useEffect(() => {\n if (lights && lights.length > 0) {\n lights.forEach((light) => addLight(resolveRef(light), effect))\n invalidate()\n return () => {\n lights.forEach((light) => removeLight(resolveRef(light), effect))\n invalidate()\n }\n }\n }, [effect, invalidate, lights, selectionLayer])\n\n useEffect(() => {\n if (api && api.enabled) {\n if (api.selected?.length) {\n effect.selection.set(api.selected)\n invalidate()\n return () => {\n effect.selection.clear()\n invalidate()\n }\n }\n }\n }, [api, effect.selection, invalidate])\n\n return <primitive ref={forwardRef} object={effect} dispose={null} />\n})\n","import { SepiaEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Sepia = wrapEffect(SepiaEffect)\n","import { Ref, forwardRef, useContext, useMemo } from 'react'\nimport { SSAOEffect, BlendFunction } from 'postprocessing'\nimport { EffectComposerContext } from '../EffectComposer'\n\n// first two args are camera and texture\ntype SSAOProps = ConstructorParameters<typeof SSAOEffect>[2]\n\nexport const SSAO = forwardRef<SSAOEffect, SSAOProps>(function SSAO(props: SSAOProps, ref: Ref<SSAOEffect>) {\n const { camera, normalPass, downSamplingPass, resolutionScale } = useContext(EffectComposerContext)\n const effect = useMemo<SSAOEffect | {}>(() => {\n if (normalPass === null && downSamplingPass === null) {\n console.error('Please enable the NormalPass in the EffectComposer in order to use SSAO.')\n return {}\n }\n return new SSAOEffect(camera, normalPass && !downSamplingPass ? (normalPass as any).texture : null, {\n blendFunction: BlendFunction.MULTIPLY,\n samples: 30,\n rings: 4,\n distanceThreshold: 1.0,\n distanceFalloff: 0.0,\n rangeThreshold: 0.5,\n rangeFalloff: 0.1,\n luminanceInfluence: 0.9,\n radius: 20,\n bias: 0.5,\n intensity: 1.0,\n color: undefined,\n // @ts-ignore\n normalDepthBuffer: downSamplingPass ? downSamplingPass.texture : null,\n resolutionScale: resolutionScale ?? 1,\n depthAwareUpsampling: true,\n ...props,\n })\n }, [camera, normalPass, props])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { SMAAEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const SMAA = wrapEffect(SMAAEffect)\n","import { FXAAEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const FXAA = wrapEffect(FXAAEffect)\n","import { TextureEffect } from 'postprocessing'\nimport { Ref, forwardRef, useMemo, useLayoutEffect } from 'react'\nimport { useLoader } from '@react-three/fiber'\nimport { TextureLoader, sRGBEncoding, RepeatWrapping } from 'three'\n\ntype TextureProps = ConstructorParameters<typeof TextureEffect>[0] & {\n textureSrc: string\n}\n\nexport const Texture = forwardRef<TextureEffect, TextureProps>(function Texture(\n { textureSrc, texture, ...props }: TextureProps,\n ref: Ref<TextureEffect>\n) {\n const t = useLoader(TextureLoader, textureSrc)\n useLayoutEffect(() => {\n t.encoding = sRGBEncoding\n t.wrapS = t.wrapT = RepeatWrapping\n }, [t])\n const effect = useMemo(() => new TextureEffect({ ...props, texture: t || texture }), [props, t, texture])\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { ToneMappingEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const ToneMapping = wrapEffect(ToneMappingEffect)\n","import { VignetteEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const Vignette = wrapEffect(VignetteEffect)\n","import { ShockWaveEffect } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const ShockWave = wrapEffect(ShockWaveEffect)\n","import { useThree } from '@react-three/fiber'\nimport { LUT3DEffect, BlendFunction } from 'postprocessing'\nimport React, { forwardRef, Ref, useLayoutEffect, useMemo } from 'react'\nimport type { Texture } from 'three'\n\nexport type LUTProps = {\n lut: Texture\n blendFunction?: BlendFunction\n tetrahedralInterpolation?: boolean\n}\n\nexport const LUT = forwardRef(function LUT(\n { lut, tetrahedralInterpolation, ...props }: LUTProps,\n ref: Ref<LUT3DEffect>\n) {\n const effect = useMemo(() => new LUT3DEffect(lut, props), [lut, props])\n const invalidate = useThree((state) => state.invalidate)\n\n useLayoutEffect(() => {\n if (tetrahedralInterpolation) effect.tetrahedralInterpolation = tetrahedralInterpolation\n if (lut) effect.lut = lut\n invalidate()\n }, [effect, invalidate, lut, tetrahedralInterpolation])\n\n return <primitive ref={ref} object={effect} dispose={null} />\n})\n","import { TiltShiftEffect, BlendFunction } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nexport const TiltShift = wrapEffect(TiltShiftEffect, { blendFunction: BlendFunction.ADD })\n","import { Uniform } from 'three'\nimport { BlendFunction, Effect, EffectAttribute } from 'postprocessing'\nimport { wrapEffect } from '../util'\n\nconst TiltShiftShader = {\n fragmentShader: `\n\n // original shader by Evan Wallace\n\n #define MAX_ITERATIONS 100\n\n uniform float blur;\n uniform float taper;\n uniform vec2 start;\n uniform vec2 end;\n uniform vec2 direction;\n uniform int samples;\n\n float random(vec3 scale, float seed) {\n /* use the fragment position for a different seed per-pixel */\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n }\n\n void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {\n vec4 color = vec4(0.0);\n float total = 0.0;\n vec2 startPixel = vec2(start.x * resolution.x, start.y * resolution.y);\n vec2 endPixel = vec2(end.x * resolution.x, end.y * resolution.y);\n float f_samples = float(samples);\n float half_samples = f_samples / 2.0;\n\n // use screen diagonal to normalize blur radii\n float maxScreenDistance = distance(vec2(0.0), resolution); // diagonal distance\n float gradientRadius = taper * (maxScreenDistance);\n float blurRadius = blur * (maxScreenDistance / 16.0);\n\n /* randomize the lookup values to hide the fixed number of samples */\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n vec2 normal = normalize(vec2(startPixel.y - endPixel.y, endPixel.x - startPixel.x));\n float radius = smoothstep(0.0, 1.0, abs(dot(uv * resolution - startPixel, normal)) / gradientRadius) * blurRadius;\n\n #pragma unroll_loop_start\n for (int i = 0; i <= MAX_ITERATIONS; i++) {\n if (i >= samples) { break; } // return early if over sample count\n float f_i = float(i);\n float s_i = -half_samples + f_i;\n float percent = (s_i + offset - 0.5) / half_samples;\n float weight = 1.0 - abs(percent);\n vec4 sample_i = texture2D(inputBuffer, uv + normalize(direction) / resolution * percent * radius);\n /* switch to pre-multiplied alpha to correctly blur transparent images */\n sample_i.rgb *= sample_i.a;\n color += sample_i * weight;\n total += weight;\n }\n #pragma unroll_loop_end\n\n outputColor = color / total;\n\n /* switch back from pre-multiplied alpha */\n outputColor.rgb /= outputColor.a + 0.00001;\n }\n `,\n}\n\nexport class TiltShiftEffect extends Effect {\n constructor({\n blendFunction = BlendFunction.NORMAL,\n blur = 0.15, // [0, 1], can go beyond 1 for extra\n taper = 0.5, // [0, 1], can go beyond 1 for extra\n start = [0.5, 0.0], // [0,1] percentage x,y of screenspace\n end = [0.5, 1.0], // [0,1] percentage x,y of screenspace\n samples = 10.0, // number of blur samples\n direction = [1, 1], // direction of blur\n } = {}) {\n super('TiltShiftEffect', TiltShiftShader.fragmentShader, {\n blendFunction,\n attributes: EffectAttribute.CONVOLUTION,\n uniforms: new Map<string, Uniform<number | number[]>>([\n ['blur', new Uniform(blur)],\n ['taper', new Uniform(taper)],\n ['start', new Uniform(start)],\n ['end', new Uniform(end)],\n ['samples', new Uniform(samples)],\n ['direction', new Uniform(direction)],\n ]),\n })\n }\n}\n\nexport const TiltShift2 = wrapEffect(TiltShiftEffect, { blendFunction: BlendFunction.NORMAL })\n","// From: https://github.com/emilwidlund/ASCII\n// https://twitter.com/emilwidlund/status/1652386482420609024\n\nimport { forwardRef, useMemo } from 'react'\nimport { CanvasTexture, Color, NearestFilter, RepeatWrapping, Texture, Uniform } from 'three'\nimport { Effect } from 'postprocessing'\n\nconst fragment = `\nuniform sampler2D uCharacters;\nuniform float uCharactersCount;\nuniform float uCellSize;\nuniform bool uInvert;\nuniform vec3 uColor;\n\nconst vec2 SIZE = vec2(16.);\n\nvec3 greyscale(vec3 color, float strength) {\n float g = dot(color, vec3(0.299, 0.587, 0.114));\n return mix(color, vec3(g), strength);\n}\n\nvec3 greyscale(vec3 color) {\n return greyscale(color, 1.0);\n}\n\nvoid mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {\n vec2 cell = resolution / uCellSize;\n vec2 grid = 1.0 / cell;\n vec2 pixelizedUV = grid * (0.5 + floor(uv / grid));\n vec4 pixelized = texture2D(inputBuffer, pixelizedUV);\n float greyscaled = greyscale(pixelized.rgb).r;\n\n if (uInvert) {\n greyscaled = 1.0 - greyscaled;\n }\n\n float characterIndex = floor((uCharactersCount - 1.0) * greyscaled);\n vec2 characterPosition = vec2(mod(characterIndex, SIZE.x), floor(characterIndex / SIZE.y));\n vec2 offset = vec2(characterPosition.x, -characterPosition.y) / SIZE;\n vec2 charUV = mod(uv * (cell / SIZE), 1.0 / SIZE) - vec2(0., 1.0 / SIZE) + offset;\n vec4 asciiCharacter = texture2D(uCharacters, charUV);\n\n asciiCharacter.rgb = uColor * asciiCharacter.r;\n asciiCharacter.a = pixelized.a;\n outputColor = asciiCharacter;\n}\n`\n\ninterface IASCIIEffectProps {\n characters?: string\n fontSize?: number\n cellSize?: number\n color?: string\n invert?: boolean\n}\n\nclass ASCIIEffect extends Effect {\n constructor({\n characters = ` .:,'-^=*+?!|0#X%WM@`,\n fontSize = 54,\n cellSize = 16,\n color = '#ffffff',\n invert = false,\n }: IASCIIEffectProps = {}) {\n const uniforms = new Map<string, Uniform>([\n ['uCharacters', new Uniform(new Texture())],\n ['uCellSize', new Uniform(cellSize)],\n ['uCharactersCount', new Uniform(characters.length)],\n ['uColor', new Uniform(new Color(color))],\n ['uInvert', new Uniform(invert)],\n ])\n\n super('ASCIIEffect', fragment, { uniforms })\n\n const charactersTextureUniform = this.uniforms.get('uCharacters')\n\n if (charactersTextureUniform) {\n charactersTextureUniform.value = this.createCharactersTexture(characters, fontSize)\n }\n }\n\n /** Draws the characters on a Canvas and returns a texture */\n public createCharactersTexture(characters: string, fontSize: number): THREE.Texture {\n const canvas = document.createElement('canvas')\n const SIZE = 1024\n const MAX_PER_ROW = 16\n const CELL = SIZE / MAX_PER_ROW\n\n canvas.width = canvas.height = SIZE\n const texture = new CanvasTexture(canvas, undefined, RepeatWrapping, RepeatWrapping, NearestFilter, NearestFilter)\n const context = canvas.getContext('2d')\n\n if (!context) {\n throw new Error('Context not available')\n }\n\n context.clearRect(0, 0, SIZE, SIZE)\n context.font = `${fontSize}px arial`\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n context.fillStyle = '#fff'\n\n for (let i = 0; i < characters.length; i++) {\n const char = characters[i]\n const x = i % MAX_PER_ROW\n const y = Math.floor(i / MAX_PER_ROW)\n context.fillText(char, x * CELL + CELL / 2, y * CELL + CELL / 2)\n }\n\n texture.needsUpdate = true\n return texture\n }\n}\n\nexport const ASCII = forwardRef<ASCIIEffect, IASCIIEffectProps>(\n ({ characters = ` .:,'-^=*+?!|0#X%WM@`, fontSize = 54, cellSize = 16, color = '#ffffff', invert = false }, fref) => {\n const effect = useMemo(\n () => new ASCIIEffect({ characters, fontSize, cellSize, color, invert }),\n [characters, fontSize, cellSize, color, invert]\n )\n return <primitive ref={fref} object={effect} />\n }\n)\n","import { Pass, RenderPass, DepthPass, Effect, Selection } from 'postprocessing'\nimport {\n REVISION,\n ShaderMaterial,\n Uniform,\n Vector2,\n Matrix3,\n TangentSpaceNormalMap,\n GLSL3,\n Matrix4,\n Vector3,\n WebGLRenderTarget,\n LinearFilter,\n HalfFloatType,\n WebGLMultipleRenderTargets,\n ShaderChunk,\n Color,\n Quaternion,\n VideoTexture,\n DataTexture,\n RGBAFormat,\n FloatType,\n NearestFilter,\n FramebufferTexture,\n WebGLCubeRenderTarget,\n CubeCamera,\n PMREMGenerator,\n Texture,\n} from 'three'\n\nvar boxBlur =\n '#define GLSLIFY 1\\nuniform float blur;uniform float blurSharpness;uniform int blurKernel;vec3 denoise(vec3 center,sampler2D tex,vec2 uv,vec2 invTexSize,float blur,float blurSharpness,int blurKernel){vec3 color;float total;vec3 col;float weight;for(int x=-blurKernel;x<=blurKernel;x++){for(int y=-blurKernel;y<=blurKernel;y++){col=textureLod(tex,uv+vec2(x,y)*invTexSize,0.).rgb;weight=1.0-abs(dot(col-center,vec3(0.25)));weight=pow(weight,blurSharpness);color+=col*weight;total+=weight;}}return color/total;}'\n\nvar finalSSRShader =\n '#define GLSLIFY 1\\n#define MODE_DEFAULT 0\\n#define MODE_REFLECTIONS 1\\n#define MODE_RAW_REFLECTION 2\\n#define MODE_BLURRED_REFLECTIONS 3\\n#define MODE_INPUT 4\\n#define MODE_BLUR_MIX 5\\n#define FLOAT_EPSILON 0.00001\\nuniform sampler2D inputTexture;uniform sampler2D reflectionsTexture;uniform float samples;\\n#include <boxBlur>\\nvoid mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){vec4 reflectionsTexel=texture2D(reflectionsTexture,vUv);ivec2 size=textureSize(reflectionsTexture,0);vec2 invTexSize=1./vec2(size.x,size.y);vec3 reflectionClr=reflectionsTexel.xyz;if(blur>FLOAT_EPSILON){vec3 blurredReflectionsColor=denoise(reflectionsTexel.rgb,reflectionsTexture,vUv,invTexSize,blur,blurSharpness,blurKernel);reflectionClr=mix(reflectionClr,blurredReflectionsColor.rgb,blur);}\\n#if RENDER_MODE == MODE_DEFAULT\\noutputColor=vec4(inputColor.rgb+reflectionClr,1.0);\\n#endif\\n#if RENDER_MODE == MODE_REFLECTIONS\\noutputColor=vec4(reflectionClr,1.0);\\n#endif\\n#if RENDER_MODE == MODE_RAW_REFLECTION\\noutputColor=vec4(reflectionsTexel.xyz,1.0);\\n#endif\\n#if RENDER_MODE == MODE_BLURRED_REFLECTIONS\\noutputColor=vec4(blurredReflectionsTexel.xyz,1.0);\\n#endif\\n#if RENDER_MODE == MODE_INPUT\\noutputColor=vec4(inputColor.xyz,1.0);\\n#endif\\n#if RENDER_MODE == MODE_BLUR_MIX\\noutputColor=vec4(vec3(blur),1.0);\\n#endif\\n}'\n\nvar helperFunctions =\n '#define GLSLIFY 1\\nvec3 getViewPosition(const float depth){float clipW=_projectionMatrix[2][3]*depth+_projectionMatrix[3][3];vec4 clipPosition=vec4((vec3(vUv,depth)-0.5)*2.0,1.0);clipPosition*=clipW;return(_inverseProjectionMatrix*clipPosition).xyz;}float getViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn perspectiveDepthToViewZ(depth,cameraNear,cameraFar);\\n#else\\nreturn orthographicDepthToViewZ(depth,cameraNear,cameraFar);\\n#endif\\n}vec3 screenSpaceToWorldSpace(const vec2 uv,const float depth){vec4 ndc=vec4((uv.x-0.5)*2.0,(uv.y-0.5)*2.0,(depth-0.5)*2.0,1.0);vec4 clip=_inverseProjectionMatrix*ndc;vec4 view=cameraMatrixWorld*(clip/clip.w);return view.xyz;}\\n#define Scale (vec3(0.8, 0.8, 0.8))\\n#define K (19.19)\\nvec3 hash(vec3 a){a=fract(a*Scale);a+=dot(a,a.yxz+K);return fract((a.xxy+a.yxx)*a.zyx);}float fresnel_dielectric_cos(float cosi,float eta){float c=abs(cosi);float g=eta*eta-1.0+c*c;float result;if(g>0.0){g=sqrt(g);float A=(g-c)/(g+c);float B=(c*(g+c)-1.0)/(c*(g-c)+1.0);result=0.5*A*A*(1.0+B*B);}else{result=1.0;}return result;}float fresnel_dielectric(vec3 Incoming,vec3 Normal,float eta){float cosine=dot(Incoming,Normal);return min(1.0,5.0*fresnel_dielectric_cos(cosine,eta));}'\n\nvar trCompose =\n '#define GLSLIFY 1\\n#define INV_EULER 0.36787944117144233\\nalpha=velocityDisocclusion<FLOAT_EPSILON ?(alpha+0.0075): 0.0;alpha=clamp(alpha,0.0,1.0);bool needsBlur=!didReproject||velocityDisocclusion>0.5;\\n#ifdef boxBlur\\nif(needsBlur)inputColor=boxBlurredColor;\\n#endif\\nif(alpha==1.0){outputColor=accumulatedColor;}else{float m=mix(alpha,1.0,blend);if(needsBlur)m=0.0;outputColor=accumulatedColor*m+inputColor*(1.0-m);}'\n\n// WebGL2: will render normals to RGB channel of \"gNormal\" buffer, roughness to A channel of \"gNormal\" buffer, depth to RGBA channel of \"gDepth\" buffer\n// and velocity to \"gVelocity\" buffer\n\nclass MRTMaterial extends ShaderMaterial {\n constructor() {\n super({\n type: 'MRTMaterial',\n defines: {\n USE_UV: '',\n TEMPORAL_RESOLVE: '',\n },\n uniforms: {\n opacity: new Uniform(1),\n normalMap: new Uniform(null),\n normalScale: new Uniform(new Vector2(1, 1)),\n uvTransform: new Uniform(new Matrix3()),\n roughness: new Uniform(1),\n roughnessMap: new Uniform(null),\n },\n vertexShader:\n /* glsl */\n `\n #ifdef USE_MRT\n varying vec2 vHighPrecisionZW;\n #endif\n #define NORMAL\n #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n varying vec3 vViewPosition;\n #endif\n #include <common>\n #include <uv_pars_vertex>\n #include <displacementmap_pars_vertex>\n #include <normal_pars_vertex>\n #include <morphtarget_pars_vertex>\n #include <skinning_pars_vertex>\n #include <logdepthbuf_pars_vertex>\n #include <clipping_planes_pars_vertex>\n #ifdef USE_UV\n ${REVISION.replace(/\\D+/g, '') >= 151 ? 'uniform mat3 uvTransform;' : ''}\n #endif\n void main() {\n #include <uv_vertex>\n #include <beginnormal_vertex>\n #include <morphnormal_vertex>\n #include <skinbase_vertex>\n #include <skinnormal_vertex>\n #include <defaultnormal_vertex>\n #include <normal_vertex>\n #include <begin_vertex>\n #include <morphtarget_vertex>\n #include <skinning_vertex>\n #include <displacementmap_vertex>\n #include <project_vertex>\n #include <logdepthbuf_vertex>\n #include <clipping_planes_vertex>\n #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n vViewPosition = - mvPosition.xyz;\n #endif\n #ifdef USE_MRT\n vHighPrecisionZW = gl_Position.zw;\n #endif\n #ifdef USE_UV\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n #endif\n }\n `,\n fragmentShader:\n /* glsl */\n `\n #define NORMAL\n #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n varying vec3 vViewPosition;\n #endif\n #include <packing>\n #include <uv_pars_fragment>\n #include <normal_pars_fragment>\n #include <bumpmap_pars_fragment>\n #include <normalmap_pars_fragment>\n #include <logdepthbuf_pars_fragment>\n #include <clipping_planes_pars_fragment>\n #include <roughnessmap_pars_fragment>\n\n #ifdef USE_MRT\n layout(location = 0) out vec4 gNormal;\n layout(location = 1) out vec4 gDepth;\n\n varying vec2 vHighPrecisionZW;\n #endif\n uniform float roughness;\n void main() {\n #include <clipping_planes_fragment>\n #include <logdepthbuf_fragment>\n #include <normal_fragment_begin>\n #include <normal_fragment_maps>\n\n float roughnessFactor = roughness;\n\n if(roughness > 10.0e9){\n roughnessFactor = 1.;\n }else{\n #ifdef useRoughnessMap\n vec4 texelRoughness = texture2D( roughnessMap, vUv );\n // reads channel G, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n roughnessFactor *= texelRoughness.g;\n #endif\n }\n\n vec3 normalColor = packNormalToRGB( normal );\n #ifdef USE_MRT\n float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n vec4 depthColor = packDepthToRGBA( fragCoordZ );\n gNormal = vec4( normalColor, roughnessFactor );\n gDepth = depthColor;\n #else\n gl_FragColor = vec4(normalColor, roughnessFactor);\n #endif\n }\n `,\n toneMapped: false,\n })\n this.normalMapType = TangentSpaceNormalMap\n this.normalScale = new Vector2(1, 1)\n Object.defineProperty(this, 'glslVersion', {\n get() {\n return 'USE_MRT' in this.defines ? GLSL3 : null\n },\n\n set(_) {},\n })\n }\n}\n\nvar vertexShader$1 =\n '#define GLSLIFY 1\\nvarying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}'\n\nvar fragmentShader =\n '#define GLSLIFY 1\\nvarying vec2 vUv;uniform sampler2D inputTexture;uniform sampler2D accumulatedTexture;uniform sampler2D normalTexture;uniform sampler2D depthTexture;uniform sampler2D envMap;uniform mat4 _projectionMatrix;uniform mat4 _inverseProjectionMatrix;uniform mat4 cameraMatrixWorld;uniform float cameraNear;uniform float cameraFar;uniform float rayDistance;uniform float intensity;uniform float maxDepthDifference;uniform float roughnessFade;uniform float maxRoughness;uniform float fade;uniform float thickness;uniform float ior;uniform float samples;uniform float jitter;uniform float jitterRoughness;\\n#define INVALID_RAY_COORDS vec2(-1.0);\\n#define EARLY_OUT_COLOR vec4(0.0, 0.0, 0.0, 1.0)\\n#define FLOAT_EPSILON 0.00001\\nfloat nearMinusFar;float nearMulFar;float farMinusNear;\\n#include <packing>\\n#include <helperFunctions>\\nvec2 RayMarch(vec3 dir,inout vec3 hitPos,inout float rayHitDepthDifference);vec2 BinarySearch(in vec3 dir,inout vec3 hitPos,inout float rayHitDepthDifference);float fastGetViewZ(const in float depth);vec3 getIBLRadiance(const in vec3 viewDir,const in vec3 normal,const in float roughness);void main(){vec4 depthTexel=textureLod(depthTexture,vUv,0.0);if(dot(depthTexel.rgb,depthTexel.rgb)<FLOAT_EPSILON){gl_FragColor=EARLY_OUT_COLOR;return;}float unpackedDepth=unpackRGBAToDepth(depthTexel);vec4 normalTexel=textureLod(normalTexture,vUv,0.0);float roughness=normalTexel.a;float specular=1.0-roughness;nearMinusFar=cameraNear-cameraFar;nearMulFar=cameraNear*cameraFar;farMinusNear=cameraFar-cameraNear;normalTexel.rgb=unpackRGBToNormal(normalTexel.rgb);float depth=fastGetViewZ(unpackedDepth);vec3 viewPos=getViewPosition(depth);vec3 viewDir=normalize(viewPos);vec3 viewNormal=normalTexel.xyz;vec3 worldPos=screenSpaceToWorldSpace(vUv,unpackedDepth);vec3 jitt=vec3(0.0);if(jitterRoughness!=0.0||jitter!=0.0){vec3 randomJitter=hash(50.0*samples*worldPos)-0.5;float spread=((2.0-specular)+roughness*jitterRoughness);float jitterMix=jitter*0.25+jitterRoughness*roughness;if(jitterMix>1.0)jitterMix=1.0;jitt=mix(vec3(0.0),randomJitter*spread,jitterMix);}viewNormal+=jitt;float fresnelFactor=fresnel_dielectric(viewDir,viewNormal,ior);vec3 iblRadiance=getIBLRadiance(-viewDir,viewNormal,0.)*fresnelFactor;float lastFrameAlpha=textureLod(accumulatedTexture,vUv,0.0).a;if(roughness>maxRoughness||(roughness>1.0-FLOAT_EPSILON&&roughnessFade>1.0-FLOAT_EPSILON)){gl_FragColor=vec4(iblRadiance,lastFrameAlpha);return;}vec3 reflected=reflect(viewDir,viewNormal);vec3 rayDir=reflected*-viewPos.z;vec3 hitPos=viewPos;float rayHitDepthDifference;vec2 coords=RayMarch(rayDir,hitPos,rayHitDepthDifference);if(coords.x==-1.0){gl_FragColor=vec4(iblRadiance,lastFrameAlpha);return;}vec4 SSRTexel=textureLod(inputTexture,coords.xy,0.0);vec4 SSRTexelReflected=textureLod(accumulatedTexture,coords.xy,0.0);vec3 SSR=SSRTexel.rgb+SSRTexelReflected.rgb;float roughnessFactor=mix(specular,1.0,max(0.0,1.0-roughnessFade));vec2 coordsNDC=(coords.xy*2.0-1.0);float screenFade=0.1;float maxDimension=min(1.0,max(abs(coordsNDC.x),abs(coordsNDC.y)));float reflectionIntensity=1.0-(max(0.0,maxDimension-screenFade)/(1.0-screenFade));reflectionIntensity=max(0.,reflectionIntensity);vec3 finalSSR=mix(iblRadiance,SSR,reflectionIntensity)*roughnessFactor;if(fade!=0.0){vec3 hitWorldPos=screenSpaceToWorldSpace(coords,rayHitDepthDifference);float reflectionDistance=distance(hitWorldPos,worldPos)+1.0;float opacity=1.0/(reflectionDistance*fade*0.1);if(opacity>1.0)opacity=1.0;finalSSR*=opacity;}finalSSR*=fresnelFactor*intensity;finalSSR=min(vec3(1.0),finalSSR);float alpha=hitPos.z==1.0 ? 1.0 : SSRTexelReflected.a;alpha=min(lastFrameAlpha,alpha);gl_FragColor=vec4(finalSSR,alpha);}vec2 RayMarch(vec3 dir,inout vec3 hitPos,inout float rayHitDepthDifference){dir=normalize(dir);dir*=rayDistance/float(steps);float depth;vec4 projectedCoord;vec4 lastProjectedCoord;float unpackedDepth;vec4 depthTexel;for(int i=0;i<steps;i++){hitPos+=dir;projectedCoord=_projectionMatrix*vec4(hitPos,1.0);projectedCoord.xy/=projectedCoord.w;projectedCoord.xy=projectedCoord.xy*0.5+0.5;\\n#ifndef missedRays\\nif(projectedCoord.x<0.0||projectedCoord.x>1.0||projectedCoord.y<0.0||projectedCoord.y>1.0){return INVALID_RAY_COORDS;}\\n#endif\\ndepthTexel=textureLod(depthTexture,projectedCoord.xy,0.0);unpackedDepth=unpackRGBAToDepth(depthTexel);depth=fastGetViewZ(unpackedDepth);rayHitDepthDifference=depth-hitPos.z;if(rayHitDepthDifference>=0.0&&rayHitDepthDifference<thickness){\\n#if refineSteps == 0\\nif(dot(depthTexel.rgb,depthTexel.rgb)<FLOAT_EPSILON)return INVALID_RAY_COORDS;\\n#else\\nreturn BinarySearch(dir,hitPos,rayHitDepthDifference);\\n#endif\\n}\\n#ifndef missedRays\\nif(hitPos.z>0.0){return INVALID_RAY_COORDS;}\\n#endif\\nlastProjectedCoord=projectedCoord;}hitPos.z=1.0;\\n#ifndef missedRays\\nreturn INVALID_RAY_COORDS;\\n#endif\\nrayHitDepthDifference=unpackedDepth;return projectedCoord.xy;}vec2 BinarySearch(in vec3 dir,inout vec3 hitPos,inout float rayHitDepthDifference){float depth;vec4 projectedCoord;vec2 lastMinProjectedCoordXY;float unpackedDepth;vec4 depthTexel;for(int i=0;i<refineSteps;i++){projectedCoord=_projectionMatrix*vec4(hitPos,1.0);projectedCoord.xy/=projectedCoord.w;projectedCoord.xy=projectedCoord.xy*0.5+0.5;depthTexel=textureLod(depthTexture,projectedCoord.xy,0.0);unpackedDepth=unpackRGBAToDepth(depthTexel);depth=fastGetViewZ(unpackedDepth);rayHitDepthDifference=depth-hitPos.z;dir*=0.5;if(rayHitDepthDifference>0.0){hitPos-=dir;}else{hitPos+=dir;}}if(dot(depthTexel.rgb,depthTexel.rgb)<FLOAT_EPSILON)return INVALID_RAY_COORDS;if(abs(rayHitDepthDifference)>maxDepthDifference)return INVALID_RAY_COORDS;projectedCoord=_projectionMatrix*vec4(hitPos,1.0);projectedCoord.xy/=projectedCoord.w;projectedCoord.xy=projectedCoord.xy*0.5+0.5;rayHitDepthDifference=unpackedDepth;return projectedCoord.xy;}float fastGetViewZ(const in float depth){\\n#ifdef PERSPECTIVE_CAMERA\\nreturn nearMulFar/(farMinusNear*depth-cameraFar);\\n#else\\nreturn depth*nearMinusFar-cameraNear;\\n#endif\\n}\\n#include <common>\\n#include <cube_uv_reflection_fragment>\\nvec3 getIBLRadiance(const in vec3 viewDir,const in vec3 normal,const in float roughness){\\n#if defined(ENVMAP_TYPE_CUBE_UV)\\nvec3 reflectVec=reflect(-viewDir,normal);reflectVec=normalize(mix(reflectVec,normal,roughness*roughness));reflectVec=inverseTransformDirection(reflectVec,viewMatrix);vec4 envMapColor=textureCubeUV(envMap,reflectVec,roughness);return envMapColor.rgb*intensity;\\n#else\\nreturn vec3(0.0);\\n#endif\\n}'\n\nclass ReflectionsMaterial extends ShaderMaterial {\n constructor() {\n super({\n type: 'ReflectionsMaterial',\n uniforms: {\n inputTexture: new Uniform(null),\n accumulatedTexture: new Uniform(null),\n normalTexture: new Uniform(null),\n depthTexture: new Uniform(null),\n _projectionMatrix: new Uniform(new Matrix4()),\n _inverseProjectionMatrix: new Uniform(new Matrix4()),\n cameraMatrixWorld: new Uniform(new Matrix4()),\n cameraNear: new Uniform(0),\n cameraFar: new Uniform(0),\n rayDistance: new Uniform(0),\n intensity: new Uniform(0),\n roughnessFade: new Uniform(0),\n fade: new Uniform(0),\n thickness: new Uniform(0),\n ior: new Uniform(0),\n maxDepthDifference: new Uniform(0),\n jitter: new Uniform(0),\n jitterRoughness: new Uniform(0),\n maxRoughness: new Uniform(0),\n samples: new Uniform(0),\n envMap: new Uniform(null),\n envMapPosition: new Uniform(new Vector3()),\n envMapSize: new Uniform(new Vector3()),\n viewMatrix: new Uniform(new Matrix4()),\n },\n defines: {\n steps: 20,\n refineSteps: 5,\n CUBEUV_TEXEL_WIDTH: 0,\n CUBEUV_TEXEL_HEIGHT: 0,\n CUBEUV_MAX_MIP: 0,\n vWorldPosition: 'worldPos',\n },\n fragmentShader: fragmentShader.replace('#include <helperFunctions>', helperFunctions),\n vertexShader: vertexShader$1,\n toneMapped: false,\n depthWrite: false,\n depthTest: false,\n })\n }\n}\n\nconst getVisibleChildren = (object) => {\n const queue = [object]\n const objects = []\n\n while (queue.length !== 0) {\n const mesh = queue.shift()\n if (mesh.material) objects.push(mesh)\n\n for (const c of mesh.children) {\n if (c.visible) queue.push(c)\n }\n }\n\n return objects\n}\nconst generateCubeUVSize = (parameters) => {\n const imageHeight = parameters.envMapCubeUVHeight\n if (imageHeight === null) return null\n const maxMip = Math.log2(imageHeight) - 2\n const texelHeight = 1.0 / imageHeight\n const texelWidth = 1.0 / (3 * Math.max(Math.pow(2, maxMip), 7 * 16))\n return {\n texelWidth,\n texelHeight,\n maxMip,\n }\n}\nconst setupEnvMap = (reflectionsMaterial, envMap, envMapCubeUVHeight) => {\n reflectionsMaterial.uniforms.envMap.value = envMap\n const envMapCubeUVSize = generateCubeUVSize({\n envMapCubeUVHeight,\n })\n reflectionsMaterial.defines.ENVMAP_TYPE_CUBE_UV = ''\n reflectionsMaterial.defines.CUBEUV_TEXEL_WIDTH = envMapCubeUVSize.texelWidth\n reflectionsMaterial.defines.CUBEUV_TEXEL_HEIGHT = envMapCubeUVSize.texelHeight\n reflectionsMaterial.defines.CUBEUV_MAX_MIP = envMapCubeUVSize.maxMip + '.0'\n reflectionsMaterial.needsUpdate = true\n}\n\nconst isWebGL2Available = () => {\n try {\n const canvas = document.createElement('canvas')\n return !!(window.WebGL2RenderingContext && canvas.getContext('webgl2'))\n } catch (e) {\n return false\n }\n}\n\nclass ReflectionsPass extends Pass {\n constructor(ssrEffect, options = {}) {\n super('ReflectionsPass')\n this.ssrEffect = void 0\n this.cachedMaterials = new WeakMap()\n this.USE_MRT = false\n this.webgl1DepthPass = null\n this.visibleMeshes = []\n this.ssrEffect = ssrEffect\n this._scene = ssrEffect._scene\n this._camera = ssrEffect._camera\n this.fullscreenMaterial = new ReflectionsMaterial()\n if (ssrEffect._camera.isPerspectiveCamera) this.fullscreenMaterial.defines.PERSPECTIVE_CAMERA = ''\n const width = options.width || typeof window !== 'undefined' ? window.innerWidth : 2000\n const height = options.height || typeof window !== 'undefined' ? window.innerHeight : 1000\n this.renderTarget = new WebGLRenderTarget(width, height, {\n minFilter: LinearFilter,\n magFilter: LinearFilter,\n type: HalfFloatType,\n depthBuffer: false,\n })\n this.renderPass = new RenderPass(this._scene, this._camera)\n this.USE_MRT = isWebGL2Available()\n\n if (this.USE_MRT) {\n // buffers: normal, depth (2), roughness will be written to the alpha channel of the normal buffer\n this.gBuffersRenderTarget = new WebGLMultipleRenderTargets(width, height, 2, {\n minFilter: LinearFilter,\n magFilter: LinearFilter,\n })\n this.normalTexture = this.gBuffersRenderTarget.texture[0]\n this.depthTexture = this.gBuffersRenderTarget.texture[1]\n } else {\n // depth pass\n this.webgl1DepthPass = new DepthPass(this._scene, this._camera)\n this.webgl1DepthPass.renderTarget.minFilter = LinearFilter\n this.webgl1DepthPass.renderTarget.magFilter = LinearFilter\n this.webgl1DepthPass.renderTarget.texture.minFilter = LinearFilter\n this.webgl1DepthPass.renderTarget.texture.magFilter = LinearFilter\n this.webgl1DepthPass.setSize(\n typeof window !== 'undefined' ? window.innerWidth : 2000,\n typeof window !== 'undefined' ? window.innerHeight : 1000\n ) // render normals (in the rgb channel) and roughness (in the alpha channel) in gBuffersRenderTarget\n\n this.gBuffersRenderTarget = new WebGLRenderTarget(width, height, {\n minFilter: LinearFilter,\n magFilter: LinearFilter,\n })\n this.normalTexture = this.gBuffersRenderTarget.texture\n this.depthTexture = this.webgl1DepthPass.texture\n } // set up uniforms\n\n this.fullscreenMaterial.uniforms.normalTexture.value = this.normalTexture\n this.fullscreenMaterial.uniforms.depthTexture.value = this.depthTexture\n this.fullscreenMaterial.uniforms.accumulatedTexture.value = this.ssrEffect.temporalResolvePass.accumulatedTexture\n this.fullscreenMaterial.uniforms.cameraMatrixWorld.value = this._camera.matrixWorld\n this.fullscreenMaterial.uniforms._projectionMatrix.value = this._camera.projectionMatrix\n this.fullscreenMaterial.uniforms._inverseProjectionMatrix.value = this._camera.projectionMatrixInverse\n }\n\n setSize(width, height) {\n this.renderTarget.setSize(width * this.ssrEffect.resolutionScale, height * this.ssrEffect.resolutionScale)\n this.gBuffersRenderTarget.setSize(width * this.ssrEffect.resolutionScale, height * this.ssrEffect.resolutionScale)\n this.fullscreenMaterial.uniforms.accumulatedTexture.value = this.ssrEffect.temporalResolvePass.accumulatedTexture\n this.fullscreenMaterial.needsUpdate = true\n }\n\n dispose() {\n this.renderTarget.dispose()\n this.gBuffersRenderTarget.dispose()\n this.renderPass.dispose()\n if (!this.USE_MRT) this.webgl1DepthPass.dispose()\n this.fullscreenMaterial.dispose()\n this.normalTexture = null\n this.depthTexture = null\n this.velocityTexture = null\n }\n\n keepMaterialMapUpdated(mrtMaterial, originalMaterial, prop, define) {\n if (this.ssrEffect[define]) {\n if (originalMaterial[prop] !== mrtMaterial[prop]) {\n mrtMaterial[prop] = originalMaterial[prop]\n mrtMaterial.uniforms[prop].value = originalMaterial[prop]\n\n if (originalMaterial[prop]) {\n mrtMaterial.defines[define] = ''\n } else {\n delete mrtMaterial.defines[define]\n }\n\n mrtMaterial.needsUpdate = true\n }\n } else if (mrtMaterial[prop] !== undefined) {\n mrtMaterial[prop] = undefined\n mrtMaterial.uniforms[prop].value = undefined\n delete mrtMaterial.defines[define]\n mrtMaterial.needsUpdate = true\n }\n }\n\n setMRTMaterialInScene() {\n this.visibleMeshes = getVisibleChildren(this._scene)\n\n for (const c of this.visibleMeshes) {\n if (c.material) {\n const originalMaterial = c.material\n let [cachedOriginalMaterial, mrtMaterial] = this.cachedMaterials.get(c) || []\n\n if (originalMaterial !== cachedOriginalMaterial) {\n if (mrtMaterial) mrtMaterial.dispose()\n mrtMaterial = new MRTMaterial()\n if (this.USE_MRT) mrtMaterial.defines.USE_MRT = ''\n mrtMaterial.normalScale = originalMaterial.normalScale\n mrtMaterial.uniforms.normalScale.value = originalMaterial.normalScale\n const map =\n originalMaterial.map ||\n originalMaterial.normalMap ||\n originalMaterial.roughnessMap ||\n originalMaterial.metalnessMap\n if (map) mrtMaterial.uniforms.uvTransform.value = map.matrix\n this.cachedMaterials.set(c, [originalMaterial, mrtMaterial])\n } // update the child's MRT material\n\n this.keepMaterialMapUpdated(mrtMaterial, originalMaterial, 'normalMap', 'useNormalMap')\n this.keepMaterialMapUpdated(mrtMaterial, originalMaterial, 'roughnessMap', 'useRoughnessMap')\n mrtMaterial.uniforms.roughness.value =\n this.ssrEffect.selection.size === 0 || this.ssrEffect.selection.has(c)\n ? originalMaterial.roughness || 0\n : 10e10\n c.material = mrtMaterial\n }\n }\n }\n\n unsetMRTMaterialInScene() {\n for (const c of this.visibleMeshes) {\n var _c$material\n\n if (((_c$material = c.material) == null ? void 0 : _c$material.type) === 'MRTMaterial') {\n c.visible = true // set material back to the original one\n\n const [originalMaterial] = this.cachedMaterials.get(c)\n c.material = originalMaterial\n }\n }\n }\n\n render(renderer, inputBuffer) {\n this.setMRTMaterialInScene()\n renderer.setRenderTarget(this.gBuffersRenderTarget)\n this.renderPass.render(renderer, this.gBuffersRenderTarget)\n this.unsetMRTMaterialInScene() // render depth and velocity in seperate passes\n\n if (!this.USE_MRT) this.webgl1DepthPass.renderPass.render(renderer, this.webgl1DepthPass.renderTarget)\n this.fullscreenMaterial.uniforms.inputTexture.value = inputBuffer.texture\n this.fullscreenMaterial.uniforms.samples.value = this.ssrEffect.temporalResolvePass.samples\n this.fullscreenMaterial.uniforms.cameraNear.value = this._camera.near\n this.fullscreenMaterial.uniforms.cameraFar.value = this._camera.far\n this.fullscreenMaterial.uniforms.viewMatrix.value.copy(this._camera.matrixWorldInverse)\n renderer.setRenderTarget(this.renderTarget)\n renderer.render(this.scene, this.camera)\n }\n}\n\n/**\n * Options of the SSR effect\n * @typedef {Object} SSROptions\n * @property {Number} [intensity] intensity of the reflections\n * @property {Number} [exponent] exponent by which reflections will be potentiated when composing the current frame's reflections and the accumulated reflections into a final reflection; higher values will make reflections clearer by highlighting darker spots less\n * @property {Number} [distance] maximum distance a reflection ray can travel to find what it reflects\n * @property {Number} [fade] how much reflections will fade out by distance\n * @property {Number} [roughnessFade] how intense reflections should be on rough spots; a higher value will make reflections fade out quicker on rough spots\n * @property {Number} [thickness] maximum depth difference between a ray and the particular depth at its screen position before refining with binary search; higher values will result in better performance\n * @property {Number} [ior] Index of Refraction, used for calculating fresnel; reflections tend to be more intense the steeper the angle between them and the viewer is, the ior parameter sets how much the intensity varies\n * @property {Number} [maxRoughness] maximum roughness a texel can have to have reflections calculated for it\n * @property {Number} [maxDepthDifference] maximum depth difference between a ray and the particular depth at its screen position after refining with binary search; higher values will result in better performance\n * @property {Number} [blend] a value between 0 and 1 to set how much the last frame's reflections should be blended in; higher values will result in less noisy reflections when moving the camera but a more smeary look\n * @property {boolean} [correction] how much pixels should be corrected when doing temporal resolving; higher values will result in less smearing but more noise\n * @property {boolean} [correctionRadius] how many surrounding pixels will be used for neighborhood clamping; a higher value can reduce noise when moving the camera but will result in less performance\n * @property {Number} [blur] how much the blurred reflections should be mixed with the raw reflections\n * @property {Number} [blurKernel] kernel size of the Box Blur Filter; higher kernel sizes will result in blurrier reflections with more artifacts\n * @property {Number} [blurSharpness] exponent of the Box Blur filter; higher values will result in more sharpness\n * @property {Number} [jitter] how intense jittering should be\n * @property {Number} [jitterRoughness] how intense jittering should be in relation to a material's roughness\n * @property {Number} [steps] number of steps a reflection ray can maximally do to find an object it intersected (and thus reflects)\n * @property {Number} [refineSteps] once we had our ray intersect something, we need to find the exact point in space it intersected and thus it reflects; this can be done through binary search with the given number of maximum steps\n * @property {boolean} [missedRays] if there should still be reflections for rays for which a reflecting point couldn't be found; enabling this will result in stretched looking reflections which can look good or bad depending on the angle\n * @property {boolean} [useNormalMap] if roughness maps should be taken account of when calculating reflections\n * @property {boolean} [useRoughnessMap] if normal maps should be taken account of when calculating reflections\n * @property {Number} [resolutionScale] resolution of the SSR effect, a resolution of 0.5 means the effect will be rendered at half resolution\n * @property {Number} [velocityResolutionScale] resolution of the velocity buffer, a resolution of 0.5 means velocity will be rendered at half resolution\n */\n\n/**\n * The options of the SSR effect\n * @type {SSROptions}\n */\nconst defaultSSROptions = {\n intensity: 1,\n exponent: 1,\n distance: 10,\n fade: 0,\n roughnessFade: 1,\n thickness: 10,\n ior: 1.45,\n maxRoughness: 1,\n maxDepthDifference: 10,\n blend: 0.9,\n correction: 1,\n correctionRadius: 1,\n blur: 0.5,\n blurKernel: 1,\n blurSharpness: 10,\n jitter: 0,\n jitterRoughness: 0,\n steps: 20,\n refineSteps: 5,\n missedRays: true,\n useNormalMap: true,\n useRoughnessMap: true,\n resolutionScale: 1,\n velocityResolutionScale: 1,\n}\n\nvar vertexShader =\n '#define GLSLIFY 1\\nvarying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}'\n\nvar temporalResolve =\n '#define GLSLIFY 1\\nuniform sampler2D inputTexture;uniform sampler2D accumulatedTexture;uniform sampler2D velocityTexture;uniform sampler2D lastVelocityTexture;uniform float blend;uniform float correction;uniform float exponent;uniform float samples;uniform vec2 invTexSize;uniform mat4 curInverseProjectionMatrix;uniform mat4 curCameraMatrixWorld;uniform mat4 prevInverseProjectionMatrix;uniform mat4 prevCameraMatrixWorld;varying vec2 vUv;\\n#define MAX_NEIGHBOR_DEPTH_DIFFERENCE 0.001\\n#define FLOAT_EPSILON 0.00001\\n#define FLOAT_ONE_MINUS_EPSILON 0.99999\\nvec3 transformexponent;vec3 undoColorTransformExponent;vec3 transformColor(vec3 color){if(exponent==1.0)return color;return pow(abs(color),transformexponent);}vec3 undoColorTransform(vec3 color){if(exponent==1.0)return color;return max(pow(abs(color),undoColorTransformExponent),vec3(0.0));}void main(){if(exponent!=1.0){transformexponent=vec3(1.0/exponent);undoColorTransformExponent=vec3(exponent);}vec4 inputTexel=textureLod(inputTexture,vUv,0.0);vec4 accumulatedTexel;vec3 inputColor=transformColor(inputTexel.rgb);vec3 accumulatedColor;float alpha=inputTexel.a;float velocityDisocclusion;bool didReproject=false;\\n#ifdef boxBlur\\nvec3 boxBlurredColor=inputTexel.rgb;\\n#endif\\nvec4 velocity=textureLod(velocityTexture,vUv,0.0);bool isMoving=alpha<1.0||dot(velocity.xy,velocity.xy)>0.0;if(isMoving){vec3 minNeighborColor=inputColor;vec3 maxNeighborColor=inputColor;vec3 col;vec2 neighborUv;vec2 reprojectedUv=vUv-velocity.xy;vec4 lastVelocity=textureLod(lastVelocityTexture,reprojectedUv,0.0);float depth=velocity.b;float closestDepth=depth;float lastClosestDepth=lastVelocity.b;float neighborDepth;float lastNeighborDepth;for(int x=-correctionRadius;x<=correctionRadius;x++){for(int y=-correctionRadius;y<=correctionRadius;y++){if(x!=0||y!=0){neighborUv=vUv+vec2(x,y)*invTexSize;vec4 neigborVelocity=textureLod(velocityTexture,neighborUv,0.0);neighborDepth=neigborVelocity.b;col=textureLod(inputTexture,neighborUv,0.0).xyz;int absX=abs(x);int absY=abs(y);\\n#ifdef dilation\\nif(absX==1&&absY==1){if(neighborDepth>closestDepth){velocity=neigborVelocity;closestDepth=neighborDepth;}vec4 lastNeighborVelocity=textureLod(velocityTexture,vUv+vec2(x,y)*invTexSize,0.0);lastNeighborDepth=lastNeighborVelocity.b;if(neighborDepth>closestDepth){lastVelocity=lastNeighborVelocity;lastClosestDepth=lastNeighborDepth;}}\\n#endif\\nif(abs(depth-neighborDepth)<MAX_NEIGHBOR_DEPTH_DIFFERENCE){\\n#ifdef boxBlur\\nif(absX<=2&&absY<=2)boxBlurredColor+=col;\\n#endif\\ncol=transformColor(col);minNeighborColor=min(col,minNeighborColor);maxNeighborColor=max(col,maxNeighborColor);}}}}float velocityLength=length(lastVelocity.xy-velocity.xy);velocityDisocclusion=(velocityLength-0.000005)*10.0;velocityDisocclusion*=velocityDisocclusion;reprojectedUv=vUv-velocity.xy;\\n#ifdef boxBlur\\nfloat pxRadius=correctionRadius>5 ? 121.0 : pow(float(correctionRadius*2+1),2.0);boxBlurredColor/=pxRadius;boxBlurredColor=transformColor(boxBlurredColor);\\n#endif\\nif(reprojectedUv.x>=0.0&&reprojectedUv.x<=1.0&&reprojectedUv.y>=0.0&&reprojectedUv.y<=1.0){accumulatedTexel=textureLod(accumulatedTexture,reprojectedUv,0.0);accumulatedColor=transformColor(accumulatedTexel.rgb);vec3 clampedColor=clamp(accumulatedColor,minNeighborColor,maxNeighborColor);accumulatedColor=mix(accumulatedColor,clampedColor,correction);didReproject=true;}else{\\n#ifdef boxBlur\\naccumulatedColor=boxBlurredColor;\\n#else\\naccumulatedColor=inputColor;\\n#endif\\n}if(velocity.r>FLOAT_ONE_MINUS_EPSILON&&velocity.g>FLOAT_ONE_MINUS_EPSILON){alpha=0.0;velocityDisocclusion=1.0;}}else{accumulatedColor=transformColor(textureLod(accumulatedTexture,vUv,0.0).rgb);}vec3 outputColor=inputColor;\\n#include <custom_compose_shader>\\ngl_FragColor=vec4(undoColorTransform(outputColor),alpha);}'\n\nclass TemporalResolveMaterial extends ShaderMaterial {\n constructor(customComposeShader) {\n const fragmentShader = temporalResolve.replace('#include <custom_compose_shader>', customComposeShader)\n super({\n type: 'TemporalResolveMaterial',\n uniforms: {\n inputTexture: new Uniform(null),\n accumulatedTexture: new Uniform(null),\n velocityTexture: new Uniform(null),\n lastVelocityTexture: new Uniform(null),\n samples: new Uniform(1),\n blend: new Uniform(0.5),\n correction: new Uniform(1),\n exponent: new Uniform(1),\n invTexSize: new Uniform(new Vector2()),\n },\n defines: {\n correctionRadius: 1,\n },\n vertexShader,\n fragmentShader,\n })\n }\n}\n\n// this shader is from: https://github.com/gkjohnson/threejs-sandbox\n// a second set of bone information from the previou frame\n\nconst prev_skinning_pars_vertex =\n /* glsl */\n `\n #ifdef USE_SKINNING\n #ifdef BONE_TEXTURE\n uniform sampler2D prevBoneTexture;\n mat4 getPrevBoneMatrix( const in float i ) {\n float j = i * 4.0;\n float x = mod( j, float( boneTextureSize ) );\n float y = floor( j / float( boneTextureSize ) );\n float dx = 1.0 / float( boneTextureSize );\n float dy = 1.0 / float( boneTextureSize );\n y = dy * ( y + 0.5 );\n vec4 v1 = texture2D( prevBoneTexture, vec2( dx * ( x + 0.5 ), y ) );\n vec4 v2 = texture2D( prevBoneTexture, vec2( dx * ( x + 1.5 ), y ) );\n vec4 v3 = texture2D( prevBoneTexture, vec2( dx * ( x + 2.5 ), y ) );\n vec4 v4 = texture2D( prevBoneTexture, vec2( dx * ( x + 3.5 ), y ) );\n mat4 bone = mat4( v1, v2, v3, v4 );\n return bone;\n }\n #else\n uniform mat4 prevBoneMatrices[ MAX_BONES ];\n mat4 getPrevBoneMatrix( const in float i ) {\n mat4 bone = prevBoneMatrices[ int(i) ];\n return bone;\n }\n #endif\n #endif\n` // Returns the body of the vertex shader for the velocity buffer and\n// outputs the position of the current and last frame positions\n\nconst velocity_vertex =\n /* glsl */\n `\n vec3 transformed;\n\n // Get the normal\n ${ShaderChunk.skinbase_vertex}\n ${ShaderChunk.beginnormal_vertex}\n ${ShaderChunk.skinnormal_vertex}\n ${ShaderChunk.defaultnormal_vertex}\n\n // Get the current vertex position\n transformed = vec3( position );\n ${ShaderChunk.skinning_vertex}\n newPosition = velocityMatrix * vec4( transformed, 1.0 );\n\n // Get the previous vertex position\n transformed = vec3( position );\n ${ShaderChunk.skinbase_vertex.replace(/mat4 /g, '').replace(/getBoneMatrix/g, 'getPrevBoneMatrix')}\n ${ShaderChunk.skinning_vertex.replace(/vec4 /g, '')}\n prevPosition = prevVelocityMatrix * vec4( transformed, 1.0 );\n\n gl_Position = newPosition;\n`\nclass VelocityMaterial extends ShaderMaterial {\n constructor() {\n super({\n uniforms: {\n prevVelocityMatrix: {\n value: new Matrix4(),\n },\n velocityMatrix: {\n value: new Matrix4(),\n },\n prevBoneTexture: {\n value: null,\n },\n interpolateGeometry: {\n value: 0,\n },\n intensity: {\n value: 1,\n },\n boneTexture: {\n value: null,\n },\n alphaTest: {\n value: 0.0,\n },\n map: {\n value: null,\n },\n alphaMap: {\n value: null,\n },\n opacity: {\n value: 1.0,\n },\n },\n vertexShader:\n /* glsl */\n `\n #define MAX_BONES 1024\n\n ${ShaderChunk.skinning_pars_vertex}\n ${prev_skinning_pars_vertex}\n\n uniform mat4 velocityMatrix;\n uniform mat4 prevVelocityMatrix;\n uniform float interpolateGeometry;\n varying vec4 prevPosition;\n varying vec4 newPosition;\n varying vec2 vHighPrecisionZW;\n\n void main() {\n\n ${velocity_vertex}\n\n vHighPrecisionZW = gl_Position.zw;\n\n }`,\n fragmentShader:\n /* glsl */\n `\n uniform float intensity;\n varying vec4 prevPosition;\n varying vec4 newPosition;\n varying vec2 vHighPrecisionZW;\n\n void main() {\n #ifdef FULL_MOVEMENT\n gl_FragColor = vec4( 1., 1., 1. - gl_FragCoord.z, 0. );\n return;\n #endif\n\n vec2 pos0 = (prevPosition.xy / prevPosition.w) * 0.5 + 0.5;\n vec2 pos1 = (newPosition.xy / newPosition.w) * 0.5 + 0.5;\n\n vec2 vel = pos1 - pos0;\n\n float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\n gl_FragColor = vec4( vel, 1. - fragCoordZ, 0. );\n\n }`,\n })\n this.isVelocityMaterial = true\n }\n}\n\nconst backgroundColor = new Color(0)\nconst updateProperties = ['visible', 'wireframe', 'side']\nclass VelocityPass extends Pass {\n constructor(scene, camera) {\n var _window, _window2\n\n super('VelocityPass')\n this.cachedMaterials = new WeakMap()\n this.lastCameraTransform = {\n position: new Vector3(),\n quaternion: new Quaternion(),\n }\n this.visibleMeshes = []\n this.renderedMeshesThisFrame = 0\n this.renderedMeshesLastFrame = 0\n this._scene = scene\n this._camera = camera\n this.renderTarget = new WebGLRenderTarget(\n ((_window = window) == null ? void 0 : _window.innerWidth) || 1000,\n ((_window2 = window) == null ? void 0 : _window2.innerHeight) || 1000,\n {\n type: HalfFloatType,\n }\n )\n }\n\n setVelocityMaterialInScene() {\n this.renderedMeshesThisFrame = 0\n this.visibleMeshes = getVisibleChildren(this._scene)\n\n for (const c of this.visibleMeshes) {\n var _c$skeleton2\n\n const originalMaterial = c.material\n let [cachedOriginalMaterial, velocityMaterial] = this.cachedMaterials.get(c) || []\n\n if (originalMaterial !== cachedOriginalMaterial) {\n var _c$skeleton\n\n velocityMaterial = new VelocityMaterial()\n velocityMaterial.lastMatrixWorld = new Matrix4()\n c.material = velocityMaterial\n if ((_c$skeleton = c.skeleton) != null && _c$skeleton.boneTexture) this.saveBoneTexture(c)\n this.cachedMaterials.set(c, [originalMaterial, velocityMaterial])\n }\n\n velocityMaterial.uniforms.velocityMatrix.value.multiplyMatrices(this._camera.projectionMatrix, c.modelViewMatrix)\n\n if (c.userData.needsUpdatedReflections || originalMaterial.map instanceof VideoTexture) {\n if (!('FULL_MOVEMENT' in velocityMaterial.defines)) velocityMaterial.needsUpdate = true\n velocityMaterial.defines.FULL_MOVEMENT = ''\n } else {\n if ('FULL_MOVEMENT' in velocityMaterial.defines) {\n delete velocityMaterial.defines.FULL_MOVEMENT\n velocityMaterial.needsUpdate = true\n }\n }\n\n c.visible =\n this.cameraMovedThisFrame ||\n !c.matrixWorld.equals(velocityMaterial.lastMatrixWorld) ||\n c.skeleton ||\n 'FULL_MOVEMENT' in velocityMaterial.defines\n c.material = velocityMaterial\n if (!c.visible) continue\n this.renderedMeshesThisFrame++\n\n for (const prop of updateProperties) velocityMaterial[prop] = originalMaterial[prop]\n\n if ((_c$skeleton2 = c.skeleton) != null && _c$skeleton2.boneTexture) {\n velocityMaterial.defines.USE_SKINNING = ''\n velocityMaterial.defines.BONE_TEXTURE = ''\n velocityMaterial.uniforms.boneTexture.value = c.skeleton.boneTexture\n }\n }\n }\n\n saveBoneTexture(object) {\n let boneTexture = object.material.uniforms.prevBoneTexture.value\n\n if (boneTexture && boneTexture.image.width === object.skeleton.boneTexture.width) {\n boneTexture = object.material.uniforms.prevBoneTexture.value\n boneTexture.image.data.set(object.skeleton.boneTexture.image.data)\n } else {\n var _boneTexture\n ;(_boneTexture = boneTexture) == null ? void 0 : _boneTexture.dispose()\n const boneMatrices = object.skeleton.boneTexture.image.data.slice()\n const size = object.skeleton.boneTexture.image.width\n boneTexture = new DataTexture(boneMatrices, size, size, RGBAFormat, FloatType)\n object.material.uniforms.prevBoneTexture.value = boneTexture\n boneTexture.needsUpdate = true\n }\n }\n\n unsetVelocityMaterialInScene() {\n for (const c of this.visibleMeshes) {\n if (c.material.isVelocityMaterial) {\n var _c$skeleton3\n\n c.visible = true\n c.material.lastMatrixWorld.copy(c.matrixWorld)\n c.material.uniforms.prevVelocityMatrix.value.multiplyMatrices(this._camera.projectionMatrix, c.modelViewMatrix)\n if ((_c$skeleton3 = c.skeleton) != null && _c$skeleton3.boneTexture) this.saveBoneTexture(c)\n c.material = this.cachedMaterials.get(c)[0]\n }\n }\n }\n\n setSize(width, height) {\n this.renderTarget.setSize(width, height)\n }\n\n renderVelocity(renderer) {\n renderer.setRenderTarget(this.renderTarget)\n\n if (this.renderedMeshesThisFrame > 0) {\n const { background } = this._scene\n this._scene.background = backgroundColor\n renderer.render(this._scene, this._camera)\n this._scene.background = background\n } else {\n renderer.clearColor()\n }\n }\n\n checkCameraMoved() {\n const moveDist = this.lastCameraTransform.position.distanceToSquared(this._camera.position)\n const rotateDist = 8 * (1 - this.lastCameraTransform.quaternion.dot(this._camera.quaternion))\n\n if (moveDist > 0.000001 || rotateDist > 0.000001) {\n this.lastCameraTransform.position.copy(this._camera.position)\n this.lastCameraTransform.quaternion.copy(this._camera.quaternion)\n return true\n }\n\n return false\n }\n\n render(renderer) {\n this.cameraMovedThisFrame = this.checkCameraMoved()\n this.setVelocityMaterialInScene()\n if (this.renderedMeshesThisFrame > 0 || this.renderedMeshesLastFrame > 0) this.renderVelocity(renderer)\n this.unsetVelocityMaterialInScene()\n this.renderedMeshesLastFrame = this.renderedMeshesThisFrame\n }\n}\n\nconst zeroVec2 = new Vector2() // the following variables can be accessed by the custom compose shader:\n// \"inputTexel\", \"accumulatedTexel\", \"inputColor\", \"accumulatedColor\", \"alpha\", \"velocityDisocclusion\", \"didReproject\", \"boxBlurredColor\" (if using box blur)\n// the custom compose shader will write the final color to the variable \"outputColor\"\n\nclass TemporalResolvePass extends Pass {\n constructor(scene, camera, customComposeShader, options = {}) {\n super('TemporalResolvePass')\n this.velocityPass = null\n this.velocityResolutionScale = 1\n this.samples = 1\n this.lastCameraTransform = {\n position: new Vector3(),\n quaternion: new Quaternion(),\n }\n this._scene = scene\n this._camera = camera\n this.renderTarget = new WebGLRenderTarget(1, 1, {\n minFilter: LinearFilter,\n magFilter: LinearFilter,\n type: HalfFloatType,\n depthBuffer: false,\n })\n this.velocityPass = new VelocityPass(scene, camera)\n this.fullscreenMaterial = new TemporalResolveMaterial(customComposeShader)\n this.fullscreenMaterial.defines.correctionRadius = options.correctionRadius || 1\n if (options.dilation) this.fullscreenMaterial.defines.dilation = ''\n if (options.boxBlur) this.fullscreenMaterial.defines.boxBlur = ''\n this.setupFramebuffers(1, 1)\n this.checkCanUseSharedVelocityTexture()\n }\n\n dispose() {\n if (this._scene.userData.velocityTexture === this.velocityPass.renderTarget.texture) {\n delete this._scene.userData.velocityTexture\n delete this._scene.userData.lastVelocityTexture\n }\n\n this.renderTarget.dispose()\n this.accumulatedTexture.dispose()\n this.fullscreenMaterial.dispose()\n this.velocityPass.dispose()\n }\n\n setSize(width, height) {\n this.renderTarget.setSize(width, height)\n this.velocityPass.setSize(width * this.velocityResolutionScale, height * this.velocityResolutionScale)\n this.velocityPass.renderTarget.texture.minFilter = this.velocityResolutionScale === 1 ? NearestFilter : LinearFilter\n this.velocityPass.renderTarget.texture.magFilter = this.velocityResolutionScale === 1 ? NearestFilter : LinearFilter\n this.velocityPass.renderTarget.texture.needsUpdate = true\n this.fullscreenMaterial.uniforms.invTexSize.value.set(1 / width, 1 / height)\n this.setupFramebuffers(width, height)\n }\n\n setupFramebuffers(width, height) {\n if (this.accumulatedTexture) this.accumulatedTexture.dispose()\n if (this.lastVelocityTexture) this.lastVelocityTexture.dispose()\n this.accumulatedTexture = new FramebufferTexture(width, height, RGBAFormat)\n this.accumulatedTexture.minFilter = LinearFilter\n this.accumulatedTexture.magFilter = LinearFilter\n this.accumulatedTexture.type = HalfFloatType\n this.lastVelocityTexture = new FramebufferTexture(\n width * this.velocityResolutionScale,\n height * this.velocityResolutionScale,\n RGBAFormat\n )\n this.lastVelocityTexture.minFilter = this.velocityResolutionScale === 1 ? NearestFilter : LinearFilter\n this.lastVelocityTexture.magFilter = this.velocityResolutionScale === 1 ? NearestFilter : LinearFilter\n this.lastVelocityTexture.type = HalfFloatType\n this.fullscreenMaterial.uniforms.accumulatedTexture.value = this.accumulatedTexture\n this.fullscreenMaterial.uniforms.lastVelocityTexture.value = this.lastVelocityTexture\n this.fullscreenMaterial.needsUpdate = true\n }\n\n checkCanUseSharedVelocityTexture() {\n const canUseSharedVelocityTexture =\n this._scene.userData.velocityTexture &&\n this.velocityPass.renderTarget.texture !== this._scene.userData.velocityTexture\n\n if (canUseSharedVelocityTexture) {\n // let's use the shared one instead\n if (this.velocityPass.renderTarget.texture === this.fullscreenMaterial.uniforms.velocityTexture.value) {\n this.fullscreenMaterial.uniforms.lastVelocityTexture.value = this._scene.userData.lastVelocityTexture\n this.fullscreenMaterial.uniforms.velocityTexture.value = this._scene.userData.velocityTexture\n this.fullscreenMaterial.needsUpdate = true\n }\n } else {\n // let's stop using the shared one (if used) and mark ours as the shared one instead\n if (this.velocityPass.renderTarget.texture !== this.fullscreenMaterial.uniforms.velocityTexture.value) {\n this.fullscreenMaterial.uniforms.velocityTexture.value = this.velocityPass.renderTarget.texture\n this.fullscreenMaterial.uniforms.lastVelocityTexture.value = this.lastVelocityTexture\n this.fullscreenMaterial.needsUpdate = true\n\n if (!this._scene.userData.velocityTexture) {\n this._scene.userData.velocityTexture = this.velocityPass.renderTarget.texture\n this._scene.userData.lastVelocityTexture = this.lastVelocityTexture\n }\n }\n }\n\n return this.velocityPass.renderTarget.texture !== this.fullscreenMaterial.uniforms.velocityTexture.value\n }\n\n checkNeedsResample() {\n const moveDist = this.lastCameraTransform.position.distanceToSquared(this._camera.position)\n const rotateDist = 8 * (1 - this.lastCameraTransform.quaternion.dot(this._camera.quaternion))\n\n if (moveDist > 0.000001 || rotateDist > 0.000001) {\n this.samples = 1\n this.lastCameraTransform.position.copy(this._camera.position)\n this.lastCameraTransform.quaternion.copy(this._camera.quaternion)\n }\n }\n\n render(renderer) {\n this.samples++\n this.checkNeedsResample()\n this.fullscreenMaterial.uniforms.samples.value = this.samples // const isUsingSharedVelocityTexture = this.checkCanUseSharedVelocityTexture()\n // if (!isUsingSharedVelocityTexture) this.velocityPass.render(renderer)\n\n renderer.setRenderTarget(this.renderTarget)\n renderer.render(this.scene, this.camera) // save the render target's texture for use in next frame\n\n renderer.copyFramebufferToTexture(zeroVec2, this.accumulatedTexture)\n renderer.setRenderTarget(this.velocityPass.renderTarget)\n renderer.copyFramebufferToTexture(zeroVec2, this.lastVelocityTexture)\n }\n}\n\n// source: https://observablehq.com/@jrus/halton\nconst halton = function halton(index, base) {\n let fraction = 1\n let result = 0\n\n while (index > 0) {\n fraction /= base\n result += fraction * (index % base)\n index = ~~(index / base) // floor division\n }\n\n return result\n} // generates Halton tuples in the range [-0.5:0.5]\n\nconst generateHalton23Points = (count) => {\n const data = []\n let i = 1\n const end = i + count\n\n for (; i < end; i++) {\n data.push([halton(i, 2) - 0.5, halton(i, 3) - 0.5])\n }\n\n return data\n}\n\n/* eslint-disable camelcase */\n\nfunction escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // $& means the whole matched string\n} // credits for the box-projecting shader code go to codercat (https://codercat.tk)\n\nconst worldposReplace =\n /* glsl */\n `\n#if defined( USE_ENVMAP ) || defined( ) || defined ( USE_SHADOWMAP )\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\n #ifdef BOX_PROJECTED_ENV_MAP\n vWorldPosition = worldPosition.xyz;\n #endif\n#endif\n`\nconst boxProjectDefinitions =\n /* glsl */\n `\n#ifdef BOX_PROJECTED_ENV_MAP\n uniform vec3 envMapSize;\n uniform vec3 envMapPosition;\n varying vec3 vWorldPosition;\n\n vec3 parallaxCorrectNormal( vec3 v, vec3 cubeSize, vec3 cubePos ) {\n vec3 nDir = normalize( v );\n\n vec3 rbmax = ( .5 * cubeSize + cubePos - vWorldPosition ) / nDir;\n vec3 rbmin = ( -.5 * cubeSize + cubePos - vWorldPosition ) / nDir;\n\n vec3 rbminmax;\n\n rbminmax.x = ( nDir.x > 0. ) ? rbmax.x : rbmin.x;\n rbminmax.y = ( nDir.y > 0. ) ? rbmax.y : rbmin.y;\n rbminmax.z = ( nDir.z > 0. ) ? rbmax.z : rbmin.z;\n\n float correction = min( min( rbminmax.x, rbminmax.y ), rbminmax.z );\n vec3 boxIntersection = vWorldPosition + nDir * correction;\n\n return boxIntersection - cubePos;\n }\n#endif\n` // will be inserted after \"vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\"\n\nconst getIBLIrradiance_patch =\n /* glsl */\n `\n#ifdef BOX_PROJECTED_ENV_MAP\n worldNormal = parallaxCorrectNormal( worldNormal, envMapSize, envMapPosition );\n#endif\n` // will be inserted after \"reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\"\n\nconst getIBLRadiance_patch =\n /* glsl */\n `\n#ifdef BOX_PROJECTED_ENV_MAP\n reflectVec = parallaxCorrectNormal( reflectVec, envMapSize, envMapPosition );\n#endif\n`\nfunction useBoxProjectedEnvMap(shader, envMapPosition, envMapSize) {\n // defines\n shader.defines.BOX_PROJECTED_ENV_MAP = '' // uniforms\n\n shader.uniforms.envMapPosition = {\n value: envMapPosition,\n }\n shader.uniforms.envMapSize = {\n value: envMapSize,\n }\n const line1 = new RegExp(\n escapeRegExp('vec3 worldNormal = inverseTransformDirection ( normal , viewMatrix ) ;').replaceAll(' ', '\\\\s*'),\n 'g'\n )\n const line2 = new RegExp(\n escapeRegExp('reflectVec = inverseTransformDirection ( reflectVec , viewMatrix ) ;').replaceAll(' ', '\\\\s*'),\n 'g'\n ) // vertex shader\n\n shader.vertexShader =\n 'varying vec3 vWorldPosition;\\n' + shader.vertexShader.replace('#include <worldpos_vertex>', worldposReplace) // fragment shader\n\n shader.fragmentShader =\n boxProjectDefinitions +\n '\\n' +\n shader.fragmentShader\n .replace('#include <envmap_physical_pars_fragment>', ShaderChunk.envmap_physical_pars_fragment)\n .replace(\n line1,\n `vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n ${getIBLIrradiance_patch}`\n )\n .replace(\n line2,\n `reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n ${getIBLRadiance_patch}`\n )\n}\n\nconst finalFragmentShader = finalSSRShader\n .replace('#include <helperFunctions>', helperFunctions)\n .replace('#include <boxBlur>', boxBlur) // all the properties for which we don't have to resample\n\nconst noResetSamplesProperties = ['blur', 'blurSharpness', 'blurKernel']\nconst defaultCubeRenderTarget = new WebGLCubeRenderTarget(1)\nlet pmremGenerator\nclass SSREffect extends Effect {\n /**\n * @param {THREE.Scene} scene The scene of the SSR effect\n * @param {THREE.Camera} camera The camera with which SSR is being rendered\n * @param {SSROptions} [options] The optional options for the SSR effect\n */\n constructor(scene, camera, options = defaultSSROptions) {\n super('SSREffect', finalFragmentShader, {\n type: 'FinalSSRMaterial',\n uniforms: new Map([\n ['reflectionsTexture', new Uniform(null)],\n ['blur', new Uniform(0)],\n ['blurSharpness', new Uniform(0)],\n ['blurKernel', new Uniform(0)],\n ]),\n defines: new Map([['RENDER_MODE', '0']]),\n })\n this.haltonSequence = generateHalton23Points(1024)\n this.haltonIndex = 0\n this.selection = new Selection()\n this.lastSize = void 0\n this.cubeCamera = new CubeCamera(0.001, 1000, defaultCubeRenderTarget)\n this.usingBoxProjectedEnvMap = false\n this._scene = scene\n this._camera = camera\n const trOptions = {\n boxBlur: true,\n dilation: true,\n }\n options = { ...defaultSSROptions, ...options, ...trOptions } // set up passes\n // temporal resolve pass\n\n this.temporalResolvePass = new TemporalResolvePass(scene, camera, trCompose, options)\n this.uniforms.get('reflectionsTexture').value = this.temporalResolvePass.renderTarget.texture // reflections pass\n\n this.reflectionsPass = new ReflectionsPass(this, options)\n this.temporalResolvePass.fullscreenMaterial.uniforms.inputTexture.value = this.reflectionsPass.renderTarget.texture\n this.lastSize = {\n width: options.width,\n height: options.height,\n resolutionScale: options.resolutionScale,\n velocityResolutionScale: options.velocityResolutionScale,\n }\n this.setSize(options.width, options.height)\n this.makeOptionsReactive(options)\n }\n\n makeOptionsReactive(options) {\n let needsUpdate = false\n const reflectionPassFullscreenMaterialUniforms = this.reflectionsPass.fullscreenMaterial.uniforms\n const reflectionPassFullscreenMaterialUniformsKeys = Object.keys(reflectionPassFullscreenMaterialUniforms)\n\n for (const key of Object.keys(options)) {\n Object.defineProperty(this, key, {\n get() {\n return options[key]\n },\n\n set(value) {\n if (options[key] === value && needsUpdate) return\n options[key] = value\n\n if (!noResetSamplesProperties.includes(key)) {\n this.setSize(this.lastSize.width, this.lastSize.height, true)\n }\n\n switch (key) {\n case 'resolutionScale':\n this.setSize(this.lastSize.width, this.lastSize.height)\n break\n\n case 'velocityResolutionScale':\n this.temporalResolvePass.velocityResolutionScale = value\n this.setSize(this.lastSize.width, this.lastSize.height, true)\n break\n\n case 'blur':\n this.uniforms.get('blur').value = value\n break\n\n case 'blurSharpness':\n this.uniforms.get('blurSharpness').value = value\n break\n\n case 'blurKernel':\n this.uniforms.get('blurKernel').value = value\n break\n // defines\n\n case 'steps':\n this.reflectionsPass.fullscreenMaterial.defines.steps = parseInt(value)\n this.reflectionsPass.fullscreenMaterial.needsUpdate = needsUpdate\n break\n\n case 'refineSteps':\n this.reflectionsPass.fullscreenMaterial.defines.refineSteps = parseInt(value)\n this.reflectionsPass.fullscreenMaterial.needsUpdate = needsUpdate\n break\n\n case 'missedRays':\n if (value) {\n this.reflectionsPass.fullscreenMaterial.defines.missedRays = ''\n } else {\n delete this.reflectionsPass.fullscreenMaterial.defines.missedRays\n }\n\n this.reflectionsPass.fullscreenMaterial.needsUpdate = needsUpdate\n break\n\n case 'correctionRadius':\n this.temporalResolvePass.fullscreenMaterial.defines.correctionRadius = Math.round(value)\n this.temporalResolvePass.fullscreenMaterial.needsUpdate = needsUpdate\n break\n\n case 'blend':\n this.temporalResolvePass.fullscreenMaterial.uniforms.blend.value = value\n break\n\n case 'correction':\n this.temporalResolvePass.fullscreenMaterial.uniforms.correction.value = value\n break\n\n case 'exponent':\n this.temporalResolvePass.fullscreenMaterial.uniforms.exponent.value = value\n break\n\n case 'distance':\n reflectionPassFullscreenMaterialUniforms.rayDistance.value = value\n // must be a uniform\n\n default:\n if (reflectionPassFullscreenMaterialUniformsKeys.includes(key)) {\n reflectionPassFullscreenMaterialUniforms[key].value = value\n }\n }\n },\n }) // apply all uniforms and defines\n\n this[key] = options[key]\n }\n\n needsUpdate = true\n }\n\n setSize(width, height, force = false) {\n if (\n !force &&\n width === this.lastSize.width &&\n height === this.lastSize.height &&\n this.resolutionScale === this.lastSize.resolutionScale &&\n this.velocityResolutionScale === this.lastSize.velocityResolutionScale\n )\n return\n this.temporalResolvePass.setSize(width, height)\n this.reflectionsPass.setSize(width, height)\n this.lastSize = {\n width,\n height,\n resolutionScale: this.resolutionScale,\n velocityResolutionScale: this.velocityResolutionScale,\n }\n }\n\n generateBoxProjectedEnvMapFallback(renderer, position = new Vector3(), size = new Vector3(), envMapSize = 512) {\n this.cubeCamera.renderTarget.dispose()\n this.cubeCamera.renderTarget = new WebGLCubeRenderTarget(envMapSize)\n this.cubeCamera.position.copy(position)\n this.cubeCamera.updateMatrixWorld()\n this.cubeCamera.update(renderer, this._scene)\n\n if (!pmremGenerator) {\n pmremGenerator = new PMREMGenerator(renderer)\n pmremGenerator.compileCubemapShader()\n }\n\n const envMap = pmremGenerator.fromCubemap(this.cubeCamera.renderTarget.texture).texture\n envMap.minFilter = LinearFilter\n envMap.magFilter = LinearFilter\n const reflectionsMaterial = this.reflectionsPass.fullscreenMaterial\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useBoxProjectedEnvMap(reflectionsMaterial, position, size)\n reflectionsMaterial.fragmentShader = reflectionsMaterial.fragmentShader\n .replace('vec3 worldPos', 'worldPos')\n .replace('varying vec3 vWorldPosition;', 'vec3 worldPos;')\n reflectionsMaterial.uniforms.envMapPosition.value.copy(position)\n reflectionsMaterial.uniforms.envMapSize.value.copy(size)\n setupEnvMap(reflectionsMaterial, envMap, envMapSize)\n this.usingBoxProjectedEnvMap = true\n return envMap\n }\n\n setIBLRadiance(iblRadiance, renderer) {\n this._scene.traverse((c) => {\n if (c.material) {\n var _renderer$properties$\n\n const uniforms =\n (_renderer$properties$ = renderer.properties.get(c.material)) == null\n ? void 0\n : _renderer$properties$.uniforms\n\n if (uniforms && 'disableIBLRadiance' in uniforms) {\n uniforms.disableIBLRadiance.value = iblRadiance\n }\n }\n })\n }\n\n deleteBoxProjectedEnvMapFallback() {\n const reflectionsMaterial = this.reflectionsPass.fullscreenMaterial\n reflectionsMaterial.uniforms.envMap.value = null\n reflectionsMaterial.fragmentShader = reflectionsMaterial.fragmentShader.replace('worldPos = ', 'vec3 worldPos = ')\n delete reflectionsMaterial.defines.BOX_PROJECTED_ENV_MAP\n reflectionsMaterial.needsUpdate = true\n this.usingBoxProjectedEnvMap = false\n }\n\n dispose() {\n super.dispose()\n this.reflectionsPass.dispose()\n this.temporalResolvePass.dispose()\n }\n\n update(renderer, inputBuffer) {\n if (!this.usingBoxProjectedEnvMap && this._scene.environment) {\n const reflectionsMaterial = this.reflectionsPass.fullscreenMaterial\n let envMap = null // not sure if there is a cleaner way to find the internal texture of a CubeTexture (when used as scene environment)\n\n this._scene.traverse((c) => {\n if (!envMap && c.material && !c.material.envMap) {\n const properties = renderer.properties.get(c.material)\n if ('envMap' in properties && properties.envMap instanceof Texture) envMap = properties.envMap\n }\n })\n\n if (envMap) {\n const envMapCubeUVHeight = this._scene.environment.image.height\n setupEnvMap(reflectionsMaterial, envMap, envMapCubeUVHeight)\n }\n }\n\n this.haltonIndex = (this.haltonIndex + 1) % this.haltonSequence.length\n const [x, y] = this.haltonSequence[this.haltonIndex]\n const { width, height } = this.lastSize\n this.temporalResolvePass.velocityPass.render(renderer) // jittering the view offset each frame reduces aliasing for the reflection\n\n if (this._camera.setViewOffset) this._camera.setViewOffset(width, height, x, y, width, height) // render reflections of current frame\n\n this.reflectionsPass.render(renderer, inputBuffer) // compose reflection of last and current frame into one reflection\n\n this.temporalResolvePass.render(renderer)\n\n this._camera.clearViewOffset()\n }\n\n static patchDirectEnvIntensity(envMapIntensity = 0) {\n if (envMapIntensity === 0) {\n ShaderChunk.envmap_physical_pars_fragment = ShaderChunk.envmap_physical_pars_fragment.replace(\n 'vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {',\n 'vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) { return vec3(0.0);'\n )\n } else {\n ShaderChunk.envmap_physical_pars_fragment = ShaderChunk.envmap_physical_pars_fragment.replace(\n 'vec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );',\n 'vec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness ) * ' + envMapIntensity.toFixed(5) + ';'\n )\n }\n }\n}\n\nexport { SSREffect, defaultSSROptions }\n","import React, { Ref, forwardRef, useLayoutEffect, useEffect, useContext, useMemo } from 'react'\n/* @ts-ignore */\nimport { SSREffect } from './screen-space-reflections'\nimport { EffectComposerContext } from '../../EffectComposer'\nimport { selectionContext } from '../../Selection'\nimport { useThree } from '@react-three/fiber'\n\n// first two args are camera and texture\ntype SSRProps = {\n /** whether you want to use Temporal Resolving to re-use reflections from the last frames; this will reduce noise tremendously but may result in \"smearing\" */\n temporalResolve?: boolean\n /** a value between 0 and 1 to set how much the last frame's reflections should be blended in; higher values will result in less noisy reflections when moving the camera but a more smeary look */\n temporalResolveMix?: number\n /** a value between 0 and 1 to set how much the reprojected reflection should be corrected; higher values will reduce smearing but will result in less flickering at reflection edges */\n temporalResolveCorrectionMix?: number\n /** the maximum number of samples for reflections; settings it to 0 means unlimited samples; setting it to a value like 6 can help make camera movements less disruptive when calculating reflections */\n maxSamples?: number\n /** whether to blur the reflections and blend these blurred reflections with the raw ones depending on the blurMix value */\n ENABLE_BLUR?: boolean\n /** how much the blurred reflections should be mixed with the raw reflections */\n blurMix?: number\n /** the sharpness of the Bilateral Filter used to blur reflections */\n blurSharpness?: number\n /** the kernel size of the Bilateral Blur Filter; higher kernel sizes will result in blurrier reflections with more artifacts */\n blurKernelSize?: number\n /** how much the reflection ray should travel in each of its iteration; higher values will give deeper reflections but with more artifacts */\n rayStep?: number\n /** the intensity of the reflections */\n intensity?: number\n /** the maximum roughness a texel can have to have reflections calculated for it */\n maxRoughness?: number\n /** whether jittering is enabled; jittering will randomly jitter the reflections resulting in a more noisy but overall more realistic look, enabling jittering can be expensive depending on the view angle */\n ENABLE_JITTERING?: boolean\n /** how intense jittering should be */\n jitter?: number\n /** how much the jittered rays should be spread; higher values will give a rougher look regarding the reflections but are more expensive to compute with */\n jitterSpread?: number\n /** how intense jittering should be in relation to a material's roughness */\n jitterRough?: number\n /** the number of steps a reflection ray can maximally do to find an object it intersected (and thus reflects) */\n MAX_STEPS?: number\n /** once we had our ray intersect something, we need to find the exact point in space it intersected and thus it reflects; this can be done through binary search with the given number of maximum steps */\n NUM_BINARY_SEARCH_STEPS?: number\n /** the maximum depth difference between a ray and the particular depth at its screen position after refining with binary search; lower values will result in better performance */\n maxDepthDifference?: number\n /** the maximum depth for which reflections will be calculated */\n maxDepth?: number\n /** the maximum depth difference between a ray and the particular depth at its screen position before refining with binary search; lower values will result in better performance */\n thickness?: number\n /** Index of Refraction, used for calculating fresnel; reflections tend to be more intense the steeper the angle between them and the viewer is, the ior parameter set how much the intensity varies */\n ior?: number\n /** if there should still be reflections for rays for which a reflecting point couldn't be found; enabling this will result in stretched looking reflections which can look good or bad depending on the angle */\n STRETCH_MISSED_RAYS?: boolean\n /** WebGL2 only - whether to use multiple render targets when rendering the G-buffers (normals, depth and roughness); using them can improve performance as they will render all information to multiple buffers for each fragment in one run; this setting can't be changed during run-time */\n USE_MRT?: boolean\n /** if roughness maps should be taken account of when calculating reflections */\n USE_ROUGHNESSMAP?: boolean\n /** if normal maps should be taken account of when calculating reflections */\n USE_NORMALMAP?: boolean\n}\n\nexport const SSR = forwardRef<SSREffect, SSRProps>(function SSR(\n { ENABLE_BLUR = true, USE_MRT = true, ...props }: SSRProps,\n\n ref: Ref<SSREffect>\n) {\n const { invalidate } = useThree()\n const { scene, camera } = useContext(EffectComposerContext)\n const effect = useMemo(\n () => new SSREffect(scene, camera, { ENABLE_BLUR, USE_MRT, ...props }),\n [scene, camera, ENABLE_BLUR, USE_MRT, props]\n )\n\n const api = useContext(selectionContext)\n useEffect(() => {\n if (api && api.enabled) {\n if (api.selected?.length) {\n effect.selection.set(api.selected)\n invalidate()\n return () => {\n effect.selection.clear()\n invalidate()\n }\n }\n }\n }, [api])\n\n return <primitive ref={ref} object={effect} {...props} />\n})\n","import {Color as $5Whe3$Color, WebGLRenderTarget as $5Whe3$WebGLRenderTarget, LinearFilter as $5Whe3$LinearFilter, NearestFilter as $5Whe3$NearestFilter, DepthTexture as $5Whe3$DepthTexture, UnsignedIntType as $5Whe3$UnsignedIntType, DepthFormat as $5Whe3$DepthFormat, DataTexture as $5Whe3$DataTexture, NoColorSpace as $5Whe3$NoColorSpace, RepeatWrapping as $5Whe3$RepeatWrapping, Vector2 as $5Whe3$Vector2, WebGLMultipleRenderTargets as $5Whe3$WebGLMultipleRenderTargets, RedFormat as $5Whe3$RedFormat, FloatType as $5Whe3$FloatType, RGBAFormat as $5Whe3$RGBAFormat, HalfFloatType as $5Whe3$HalfFloatType, ShaderMaterial as $5Whe3$ShaderMaterial, Vector3 as $5Whe3$Vector3, BufferGeometry as $5Whe3$BufferGeometry, BufferAttribute as $5Whe3$BufferAttribute, Sphere as $5Whe3$Sphere, OrthographicCamera as $5Whe3$OrthographicCamera, Mesh as $5Whe3$Mesh, Matrix4 as $5Whe3$Matrix4} from \"three\";\nimport {Pass as $5Whe3$Pass} from \"three/examples/jsm/postprocessing/Pass.js\";\nimport {Pass as $5Whe3$Pass1} from \"postprocessing\";\n\n\n\n\nconst $e4ca8dcb0218f846$var$_geometry = new $5Whe3$BufferGeometry();\n$e4ca8dcb0218f846$var$_geometry.setAttribute(\"position\", new $5Whe3$BufferAttribute(new Float32Array([\n -1,\n -1,\n 3,\n -1,\n -1,\n 3\n]), 2));\n$e4ca8dcb0218f846$var$_geometry.setAttribute(\"uv\", new $5Whe3$BufferAttribute(new Float32Array([\n 0,\n 0,\n 2,\n 0,\n 0,\n 2\n]), 2));\n// Recent three.js versions break setDrawRange or itemSize <3 position\n$e4ca8dcb0218f846$var$_geometry.boundingSphere = new $5Whe3$Sphere();\n$e4ca8dcb0218f846$var$_geometry.computeBoundingSphere = function() {};\nconst $e4ca8dcb0218f846$var$_camera = new $5Whe3$OrthographicCamera();\nclass $e4ca8dcb0218f846$export$dcd670d73db751f5 {\n constructor(material){\n this._mesh = new $5Whe3$Mesh($e4ca8dcb0218f846$var$_geometry, material);\n this._mesh.frustumCulled = false;\n }\n render(renderer) {\n renderer.render(this._mesh, $e4ca8dcb0218f846$var$_camera);\n }\n get material() {\n return this._mesh.material;\n }\n set material(value) {\n this._mesh.material = value;\n }\n dispose() {\n this._mesh.material.dispose();\n this._mesh.geometry.dispose();\n }\n}\n\n\n\nconst $1ed45968c1160c3c$export$c9b263b9a17dffd7 = {\n uniforms: {\n \"sceneDiffuse\": {\n value: null\n },\n \"sceneDepth\": {\n value: null\n },\n \"sceneNormal\": {\n value: null\n },\n \"projMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"projViewMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"projectionMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"cameraPos\": {\n value: new $5Whe3$Vector3()\n },\n \"resolution\": {\n value: new $5Whe3$Vector2()\n },\n \"time\": {\n value: 0.0\n },\n \"samples\": {\n value: []\n },\n \"samplesR\": {\n value: []\n },\n \"bluenoise\": {\n value: null\n },\n \"distanceFalloff\": {\n value: 1.0\n },\n \"radius\": {\n value: 5.0\n },\n \"near\": {\n value: 0.1\n },\n \"far\": {\n value: 1000.0\n },\n \"logDepth\": {\n value: false\n },\n \"ortho\": {\n value: false\n },\n \"screenSpaceRadius\": {\n value: false\n }\n },\n vertexShader: /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n}`,\n fragmentShader: /* glsl */ `\n #define SAMPLES 16\n #define FSAMPLES 16.0\nuniform sampler2D sceneDiffuse;\nuniform highp sampler2D sceneNormal;\nuniform highp sampler2D sceneDepth;\nuniform mat4 projectionMatrixInv;\nuniform mat4 viewMatrixInv;\nuniform mat4 projMat;\nuniform mat4 viewMat;\nuniform mat4 projViewMat;\nuniform vec3 cameraPos;\nuniform vec2 resolution;\nuniform float time;\nuniform vec3[SAMPLES] samples;\nuniform float[SAMPLES] samplesR;\nuniform float radius;\nuniform float distanceFalloff;\nuniform float near;\nuniform float far;\nuniform bool logDepth;\nuniform bool ortho;\nuniform bool screenSpaceRadius;\nuniform sampler2D bluenoise;\n varying vec2 vUv;\n highp float linearize_depth(highp float d, highp float zNear,highp float zFar)\n {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n highp float linearize_depth_ortho(highp float d, highp float nearZ, highp float farZ) {\n return nearZ + (farZ - nearZ) * d;\n }\n highp float linearize_depth_log(highp float d, highp float nearZ,highp float farZ) {\n float depth = pow(2.0, d * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n return ortho ? linearize_depth_ortho(\n linDepth,\n nearZ,\n farZ\n ) :linearize_depth(linDepth, nearZ, farZ);\n }\n\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n #ifdef LOGDEPTH\n return getWorldPosLog(vec3(coord, depth));\n #endif\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n\n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n\n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n\n vec3 ce = getWorldPos(c0, vUv).xyz;\n\n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n\n return normalize(cross(dpdx, dpdy));\n}\n\nvoid main() {\n vec4 diffuse = texture2D(sceneDiffuse, vUv);\n float depth = texture2D(sceneDepth, vUv).x;\n if (depth == 1.0) {\n gl_FragColor = vec4(vec3(1.0), 1.0);\n return;\n }\n vec3 worldPos = getWorldPos(depth, vUv);\n // vec3 normal = texture2D(sceneNormal, vUv).rgb;//computeNormal(worldPos, vUv);\n #ifdef HALFRES\n vec3 normal = texture2D(sceneNormal, vUv).rgb;\n #else\n vec3 normal = computeNormal(worldPos, vUv);\n #endif\n vec4 noise = texture2D(bluenoise, gl_FragCoord.xy / 128.0);\n vec3 randomVec = normalize(noise.rgb * 2.0 - 1.0);\n vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\n vec3 bitangent = cross(normal, tangent);\n mat3 tbn = mat3(tangent, bitangent, normal);\n float occluded = 0.0;\n float totalWeight = 0.0;\n /* float radiusScreen = distance(\n worldPos,\n getWorldPos(depth, vUv + \n vec2(48.0, 0.0) / resolution)\n );/*vUv.x < 0.5 ? radius : min(distance(\n worldPos,\n getWorldPos(depth, vUv + \n vec2(100.0, 0.0) / resolution)\n ), radius);\n float distanceFalloffScreen = radiusScreen * 0.2;*/\n float radiusToUse = screenSpaceRadius ? distance(\n worldPos,\n getWorldPos(depth, vUv +\n vec2(radius, 0.0) / resolution)\n ) : radius;\n float distanceFalloffToUse =screenSpaceRadius ?\n radiusToUse * distanceFalloff\n : distanceFalloff;\n float bias = (0.1 / near) * fwidth(distance(worldPos, cameraPos)) / radiusToUse;\n for(float i = 0.0; i < FSAMPLES; i++) {\n vec3 sampleDirection = \n tbn * \n samples[int(i)];\n ;\n float moveAmt = samplesR[int(mod(i + noise.a * FSAMPLES, FSAMPLES))];\n vec3 samplePos = worldPos + radiusToUse * moveAmt * sampleDirection;\n vec4 offset = projMat * vec4(samplePos, 1.0);\n offset.xyz /= offset.w;\n offset.xyz = offset.xyz * 0.5 + 0.5;\n float sampleDepth = textureLod(sceneDepth, offset.xy, 0.0).x;\n /*float distSample = logDepth ? linearize_depth_log(sampleDepth, near, far) \n (ortho ? linearize_depth_ortho(sampleDepth, near, far) : linearize_depth(sampleDepth, near, far));*/\n #ifdef LOGDEPTH\n float distSample = linearize_depth_log(sampleDepth, near, far);\n #else\n float distSample = ortho ? linearize_depth_ortho(sampleDepth, near, far) : linearize_depth(sampleDepth, near, far);\n #endif\n float distWorld = ortho ? linearize_depth_ortho(offset.z, near, far) : linearize_depth(offset.z, near, far);\n float rangeCheck = smoothstep(0.0, 1.0, distanceFalloffToUse / (abs(distSample - distWorld)));\n vec2 diff = gl_FragCoord.xy - ( offset.xy * resolution);\n float weight = dot(sampleDirection, normal);\n occluded += rangeCheck * weight * \n (distSample + bias\n < distWorld ? 1.0 : 0.0) * (\n (dot(\n diff,\n diff\n \n ) < 1.0 || (sampleDepth == depth) || (\n offset.x < 0.0 || offset.x > 1.0 || offset.y < 0.0 || offset.y > 1.0\n ) ? 0.0 : 1.0)\n );\n totalWeight += weight;\n }\n float occ = clamp(1.0 - occluded / totalWeight, 0.0, 1.0);\n gl_FragColor = vec4(0.5 + 0.5 * normal, occ);\n}`\n};\n\n\n\nconst $12b21d24d1192a04$export$a815acccbd2c9a49 = {\n uniforms: {\n \"sceneDiffuse\": {\n value: null\n },\n \"sceneDepth\": {\n value: null\n },\n \"tDiffuse\": {\n value: null\n },\n \"projMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"projectionMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"cameraPos\": {\n value: new $5Whe3$Vector3()\n },\n \"resolution\": {\n value: new $5Whe3$Vector2()\n },\n \"color\": {\n value: new $5Whe3$Vector3(0, 0, 0)\n },\n \"blueNoise\": {\n value: null\n },\n \"downsampledDepth\": {\n value: null\n },\n \"time\": {\n value: 0.0\n },\n \"intensity\": {\n value: 10.0\n },\n \"renderMode\": {\n value: 0.0\n },\n \"gammaCorrection\": {\n value: false\n },\n \"logDepth\": {\n value: false\n },\n \"ortho\": {\n value: false\n },\n \"near\": {\n value: 0.1\n },\n \"far\": {\n value: 1000.0\n },\n \"screenSpaceRadius\": {\n value: false\n },\n \"radius\": {\n value: 0.0\n },\n \"distanceFalloff\": {\n value: 1.0\n },\n \"fog\": {\n value: false\n },\n \"fogExp\": {\n value: false\n },\n \"fogDensity\": {\n value: 0.0\n },\n \"fogNear\": {\n value: Infinity\n },\n \"fogFar\": {\n value: Infinity\n },\n \"colorMultiply\": {\n value: true\n }\n },\n vertexShader: /* glsl */ `\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = vec4(position, 1);\n\t\t}`,\n fragmentShader: /* glsl */ `\n\t\tuniform sampler2D sceneDiffuse;\n uniform highp sampler2D sceneDepth;\n uniform highp sampler2D downsampledDepth;\n uniform sampler2D tDiffuse;\n uniform sampler2D blueNoise;\n uniform vec2 resolution;\n uniform vec3 color;\n uniform mat4 projectionMatrixInv;\n uniform mat4 viewMatrixInv;\n uniform float intensity;\n uniform float renderMode;\n uniform float near;\n uniform float far;\n uniform bool gammaCorrection;\n uniform bool logDepth;\n uniform bool ortho;\n uniform bool screenSpaceRadius;\n uniform bool fog;\n uniform bool fogExp;\n uniform bool colorMultiply;\n uniform float fogDensity;\n uniform float fogNear;\n uniform float fogFar;\n uniform float radius;\n uniform float distanceFalloff;\n uniform vec3 cameraPos;\n varying vec2 vUv;\n highp float linearize_depth(highp float d, highp float zNear,highp float zFar)\n {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n highp float linearize_depth_ortho(highp float d, highp float nearZ, highp float farZ) {\n return nearZ + (farZ - nearZ) * d;\n }\n highp float linearize_depth_log(highp float d, highp float nearZ,highp float farZ) {\n float depth = pow(2.0, d * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n return ortho ? linearize_depth_ortho(\n linDepth,\n nearZ,\n farZ\n ) :linearize_depth(linDepth, nearZ, farZ);\n }\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n // if (logDepth) {\n #ifdef LOGDEPTH\n return getWorldPosLog(vec3(coord, depth));\n #endif\n // }\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n \n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n \n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n \n vec3 ce = getWorldPos(c0, vUv).xyz;\n \n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n \n return normalize(cross(dpdx, dpdy));\n }\n\n #include <common>\n #include <dithering_pars_fragment>\n void main() {\n //vec4 texel = texture2D(tDiffuse, vUv);//vec3(0.0);\n vec4 sceneTexel = texture2D(sceneDiffuse, vUv);\n float depth = texture2D(\n sceneDepth,\n vUv\n ).x;\n #ifdef HALFRES \n vec4 texel;\n if (depth == 1.0) {\n texel = vec4(0.0, 0.0, 0.0, 1.0);\n } else {\n vec3 worldPos = getWorldPos(depth, vUv);\n vec3 normal = computeNormal(getWorldPos(depth, vUv), vUv);\n // vec4 texel = texture2D(tDiffuse, vUv);\n // Find closest depth;\n float totalWeight = 0.0;\n float radiusToUse = screenSpaceRadius ? distance(\n worldPos,\n getWorldPos(depth, vUv +\n vec2(radius, 0.0) / resolution)\n ) : radius;\n float distanceFalloffToUse =screenSpaceRadius ?\n radiusToUse * distanceFalloff\n : distanceFalloff;\n for(float x = -1.0; x <= 1.0; x++) {\n for(float y = -1.0; y <= 1.0; y++) {\n vec2 offset = vec2(x, y);\n ivec2 p = ivec2(\n (vUv * resolution * 0.5) + offset\n );\n vec2 pUv = vec2(p) / (resolution * 0.5);\n float sampleDepth = texelFetch(downsampledDepth,p, 0).x;\n vec4 sampleInfo = texelFetch(tDiffuse, p, 0);\n vec3 normalSample = sampleInfo.xyz * 2.0 - 1.0;\n vec3 worldPosSample = getWorldPos(sampleDepth, pUv);\n float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));\n float rangeCheck = exp(-1.0 * tangentPlaneDist * (1.0 / distanceFalloffToUse)) * max(dot(normal, normalSample), 0.0);\n float weight = rangeCheck;\n totalWeight += weight;\n texel += sampleInfo * weight;\n }\n }\n if (totalWeight == 0.0) {\n texel = texture2D(tDiffuse, vUv);\n } else {\n texel /= totalWeight;\n }\n }\n #else\n vec4 texel = texture2D(tDiffuse, vUv);\n #endif\n\n \n float finalAo = pow(texel.a, intensity);\n float fogFactor;\n float fogDepth = distance(\n cameraPos,\n getWorldPos(depth, vUv)\n );\n if (fog) {\n if (fogExp) {\n fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n } else {\n fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n }\n }\n finalAo = mix(finalAo, 1.0, fogFactor);\n vec3 aoApplied = color * mix(vec3(1.0), sceneTexel.rgb, float(colorMultiply));\n if (renderMode == 0.0) {\n gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);\n } else if (renderMode == 1.0) {\n gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);\n } else if (renderMode == 2.0) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (renderMode == 3.0) {\n if (vUv.x < 0.5) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {\n gl_FragColor = vec4(1.0);\n } else {\n gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);\n }\n } else if (renderMode == 4.0) {\n if (vUv.x < 0.5) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {\n gl_FragColor = vec4(1.0);\n } else {\n gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);\n }\n }\n #include <dithering_fragment>\n if (gammaCorrection) {\n gl_FragColor = LinearTosRGB(gl_FragColor);\n }\n }\n `\n};\n\n\n\nconst $e52378cd0f5a973d$export$57856b59f317262e = {\n uniforms: {\n \"sceneDiffuse\": {\n value: null\n },\n \"sceneDepth\": {\n value: null\n },\n \"tDiffuse\": {\n value: null\n },\n \"projMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMat\": {\n value: new $5Whe3$Matrix4()\n },\n \"projectionMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"viewMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"cameraPos\": {\n value: new $5Whe3$Vector3()\n },\n \"resolution\": {\n value: new $5Whe3$Vector2()\n },\n \"time\": {\n value: 0.0\n },\n \"r\": {\n value: 5.0\n },\n \"blueNoise\": {\n value: null\n },\n \"radius\": {\n value: 12.0\n },\n \"worldRadius\": {\n value: 5.0\n },\n \"index\": {\n value: 0.0\n },\n \"poissonDisk\": {\n value: []\n },\n \"distanceFalloff\": {\n value: 1.0\n },\n \"near\": {\n value: 0.1\n },\n \"far\": {\n value: 1000.0\n },\n \"logDepth\": {\n value: false\n },\n \"screenSpaceRadius\": {\n value: false\n }\n },\n vertexShader: /* glsl */ `\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = vec4(position, 1.0);\n\t\t}`,\n fragmentShader: /* glsl */ `\n\t\tuniform sampler2D sceneDiffuse;\n uniform highp sampler2D sceneDepth;\n uniform sampler2D tDiffuse;\n uniform sampler2D blueNoise;\n uniform mat4 projectionMatrixInv;\n uniform mat4 viewMatrixInv;\n uniform vec2 resolution;\n uniform float r;\n uniform float radius;\n uniform float worldRadius;\n uniform float index;\n uniform float near;\n uniform float far;\n uniform float distanceFalloff;\n uniform bool logDepth;\n uniform bool screenSpaceRadius;\n varying vec2 vUv;\n\n highp float linearize_depth(highp float d, highp float zNear,highp float zFar)\n {\n highp float z_n = 2.0 * d - 1.0;\n return 2.0 * zNear * zFar / (zFar + zNear - z_n * (zFar - zNear));\n }\n highp float linearize_depth_log(highp float d, highp float nearZ,highp float farZ) {\n float depth = pow(2.0, d * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n return linearize_depth(linDepth, nearZ, farZ);\n }\n highp float linearize_depth_ortho(highp float d, highp float nearZ, highp float farZ) {\n return nearZ + (farZ - nearZ) * d;\n }\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n #ifdef LOGDEPTH\n return getWorldPosLog(vec3(coord, depth));\n #endif\n \n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n #include <common>\n #define NUM_SAMPLES 16\n uniform vec2 poissonDisk[NUM_SAMPLES];\n void main() {\n const float pi = 3.14159;\n vec2 texelSize = vec2(1.0 / resolution.x, 1.0 / resolution.y);\n vec2 uv = vUv;\n vec4 data = texture2D(tDiffuse, vUv);\n float occlusion = data.a;\n float baseOcc = data.a;\n vec3 normal = data.rgb * 2.0 - 1.0;\n float count = 1.0;\n float d = texture2D(sceneDepth, vUv).x;\n if (d == 1.0) {\n gl_FragColor = data;\n return;\n }\n vec3 worldPos = getWorldPos(d, vUv);\n float size = radius;\n float angle;\n if (index == 0.0) {\n angle = texture2D(blueNoise, gl_FragCoord.xy / 128.0).x * PI2;\n } else if (index == 1.0) {\n angle = texture2D(blueNoise, gl_FragCoord.xy / 128.0).y * PI2;\n } else if (index == 2.0) {\n angle = texture2D(blueNoise, gl_FragCoord.xy / 128.0).z * PI2;\n } else {\n angle = texture2D(blueNoise, gl_FragCoord.xy / 128.0).w * PI2;\n }\n\n mat2 rotationMatrix = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n float radiusToUse = screenSpaceRadius ? distance(\n worldPos,\n getWorldPos(d, vUv +\n vec2(worldRadius, 0.0) / resolution)\n ) : worldRadius;\n float distanceFalloffToUse =screenSpaceRadius ?\n radiusToUse * distanceFalloff\n : distanceFalloff;\n\n\n for(int i = 0; i < NUM_SAMPLES; i++) {\n vec2 offset = (rotationMatrix * poissonDisk[i]) * texelSize * size;\n vec4 dataSample = texture2D(tDiffuse, uv + offset);\n float occSample = dataSample.a;\n vec3 normalSample = dataSample.rgb * 2.0 - 1.0;\n float dSample = texture2D(sceneDepth, uv + offset).x;\n vec3 worldPosSample = getWorldPos(dSample, uv + offset);\n float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));\n float rangeCheck = dSample == 1.0 ? 0.0 :exp(-1.0 * tangentPlaneDist * (1.0 / distanceFalloffToUse)) * max(dot(normal, normalSample), 0.0) * (1.0 - abs(occSample - baseOcc));\n occlusion += occSample * rangeCheck;\n count += rangeCheck;\n }\n occlusion /= count;\n gl_FragColor = vec4(0.5 + 0.5 * normal, occlusion);\n }\n `\n};\n\n\n\nconst $26aca173e0984d99$export$1efdf491687cd442 = {\n uniforms: {\n \"sceneDepth\": {\n value: null\n },\n \"resolution\": {\n value: new $5Whe3$Vector2()\n },\n \"near\": {\n value: 0.1\n },\n \"far\": {\n value: 1000.0\n },\n \"viewMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"projectionMatrixInv\": {\n value: new $5Whe3$Matrix4()\n },\n \"logDepth\": {\n value: false\n }\n },\n vertexShader: /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n }`,\n fragmentShader: /* glsl */ `\n uniform highp sampler2D sceneDepth;\n uniform vec2 resolution;\n uniform float near;\n uniform float far;\n uniform bool logDepth;\n uniform mat4 viewMatrixInv;\n uniform mat4 projectionMatrixInv;\n varying vec2 vUv;\n layout(location = 1) out vec4 gNormal;\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n if (logDepth) {\n return getWorldPosLog(vec3(coord, depth));\n }\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n \n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n \n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n \n vec3 ce = getWorldPos(c0, vUv).xyz;\n \n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n \n return normalize(cross(dpdx, dpdy));\n }\n void main() {\n vec2 uv = vUv - vec2(0.5) / resolution;\n vec2 pixelSize = vec2(1.0) / resolution;\n vec2[] uvSamples = vec2[4](\n uv,\n uv + vec2(pixelSize.x, 0.0),\n uv + vec2(0.0, pixelSize.y),\n uv + pixelSize\n );\n float depth00 = texture2D(sceneDepth, uvSamples[0]).r;\n float depth10 = texture2D(sceneDepth, uvSamples[1]).r;\n float depth01 = texture2D(sceneDepth, uvSamples[2]).r;\n float depth11 = texture2D(sceneDepth, uvSamples[3]).r;\n float minDepth = min(min(depth00, depth10), min(depth01, depth11));\n float maxDepth = max(max(depth00, depth10), max(depth01, depth11));\n float targetDepth = minDepth;\n // Checkerboard pattern to avoid artifacts\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 2.0) > 0.5) { \n targetDepth = maxDepth;\n }\n int chosenIndex = 0;\n float[] samples = float[4](depth00, depth10, depth01, depth11);\n for(int i = 0; i < 4; ++i) {\n if (samples[i] == targetDepth) {\n chosenIndex = i;\n break;\n }\n }\n gl_FragColor = vec4(samples[chosenIndex], 0.0, 0.0, 1.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[chosenIndex], uvSamples[chosenIndex]), uvSamples[chosenIndex]\n ), 0.0);\n /* float[] samples = float[4](depth00, depth10, depth01, depth11);\n float c = 0.25 * (depth00 + depth10 + depth01 + depth11);\n float[] distances = float[4](depth00, depth10, depth01, depth11);\n float maxDistance = max(max(distances[0], distances[1]), max(distances[2], distances[3]));\n\n int remaining[3];\n int rejected[3];\n int i, j, k;\n\n for(i = 0, j = 0, k = 0; i < 4; ++i) {\n if (distances[i] < maxDistance) {\n remaining[j++] = i;\n } else {\n rejected[k++] = i;\n }\n }\n for(;j < 3;++j) {\n remaining[j] = rejected[--k];\n }\n vec3 s = vec3(\n samples[remaining[0]],\n samples[remaining[1]],\n samples[remaining[2]]\n );\n c = (s.x + s.y + s.z) / 3.0;\n\n distances[0] = abs(c - s.x);\n distances[1] = abs(c - s.y);\n distances[2] = abs(c - s.z);\n\n float minDistance = min(min(distances[0], distances[1]), distances[2]);\n\n for(i = 0; i < 3; ++i) {\n if (distances[i] == minDistance) {\n break;\n }\n }*/\n /* gl_FragColor = vec4(samples[remaining[i]], 0.0, 0.0, 0.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[remaining[i]], uvSamples[remaining[i]]), uvSamples[remaining[i]]\n ), 0.0);*/\n }`\n};\n\n\n\n\n\n\n\n\n\nvar $06269ad78f3c5fdf$export$2e2bcd8739ae039 = `5L7pP4UXrOIr/VZ1G3f6p89FIWU7lqc7J3DPxKjJUXODJoHQzf/aNVM+ABlvhXeBGN7iC0WkmTjEaAqOItBfBdaK5KSGV1ET5SOKl3x9JOX5w2sAl6+6KjDhVUHgbqq7DZ5EeYzbdSNxtrQLW/KkPJoOTG4u5CBUZkCKHniY9l7DUgjuz708zG1HIC8qfohi1vPjPH9Lq47ksjRrjwXD4MlVCjdAqYFGodQ8tRmHkOfq4wVRIAHvoavPHvN1lpk3X4Y1yzAPGe8S9KBs3crc4GwlU1dEOXiWol/mgQqxkNqB1xd04+0Bmpwj0GcCc4NUi+c731FUxjvaexCkCJ0qhrJJ++htWqetNC4NewClu8aFRSwrqiJEGe+qtTg4CYCHaF1wJI0sy/ZBQAI0qAMyBvVjWZlv2pdkCaro9eWDLK5I4mbb8E4d7hZr9dDJiTJm6Bmb5S+2F7yal/JPdeLUfwq7jmVLaQfhv4tWMJAt7V4sG9LuAv2oPJgSj1nnlBvPibfHM2TrlWHwGCLGxW/5Jm2TotaDL+pHDM5pn1r0UuTZ24N8S5k68bLHW9tfD+2k4zGev23ExJb4YTRKWrj82N5LjJ26lj1BkGZ0CsXLGGELoPaYQomjTqPxYqhfwOwDliNGVqux9ffuybqOKgsbB51B1GbZfG8vHDBE2JQGib1mnCmWOWAMJcHN0cKeDHYTflbDTVXajtr68mwfRje6WueQ/6yWqmZMLWNH7P27zGFhMFqaqfg11Q88g/9UA/FROe9yfq0yOO0pnNAxvepFy2BpEbcgG+mCyjCC01JWlOZlIPdf1TtlyOt7L94ToYGCukoFt4OqwOrofamjECpSgKLLmrRM+sNRAw12eaqk8KtdFk7pn2IcDQiPXCh16t1a+psi+w9towHTKPyQM0StKr61b2BnN1HU+aezFNBLfHTiXwhGTbdxLLmrsAGIVSiNAeCGE8GlB0iOv2v78kP0CTmAPUEqnHYRSDlP+L6m/rYjEK6Q85GRDJi2W20/7NLPpSOaMR++IFvpkcwRuc59j8hh9tYlc1xjdt2jmp9KJczB7U9P43inuxLOv11P5/HYH5d6gLB0CsbGC8APjh+EcCP0zFWqlaACZweLhVfv3yiyd8R3bdVg8sRKsxPvhDaPpiFp9+MN+0Ua0bsPr+lhxfZhMhlevkLbR4ZvcSRP6ApQLy3+eMh9ehCB3z5DVAaN3P6J8pi5Qa88ZQsOuCTWyH6q8yMfBw8y8nm6jaOxJhPH6Hf0I4jmALUBsWKH4gWBnyijHh7z3/1HhQzFLRDRrIQwUtu11yk7U0gDw/FatOIZOJaBx3UqbUxSZ6dboFPm5pAyyXC2wYdSWlpZx/D2C6hDO2sJM4HT9IKWWmDkZIO2si/6BKHruXIEDpfAtz3xDlIdKnnlqnkfCyy6vNOPyuoWsSWBeiN0mcfIrnOtp2j7bxjOkr25skfS/lwOC692cEp7TKSlymbsyzoWg/0AN66SvQYo6BqpNwPpTaUu25zMWlwVUdfu1EEdc0O06TI0JmHk4f6GZQbfOs//OdgtGPO6uLoadJycR8Z80rkd88QoNmimZd8vcpQKScCFkxH1RMTkPlN3K7CL/NSMOiXEvxrn9VyUPFee63uRflgaPMSsafvqMgzTt3T1RaHNLLFatQbD0Vha4YXZ/6Ake7onM65nC9cyLkteYkDfHoJtef7wCrWXTK0+vH38VUBcFJP0+uUXpkiK0gDXNA39HL/qdVcaOA16kd2gzq8aHpNSaKtgMLJC6fdLLS/I/4lUWV2+djY9Rc3QuJOUrlHFQERtXN4xJaAHZERCUQZ9ND2pEtZg8dsnilcnqmqYn3c1sRyK0ziKpHNytEyi2gmzxEFchvT1uBWxZUikkAlWuyqvvhteSG9kFhTLNM97s3X1iS2UbE6cvApgbmeJ/KqtP0NNT3bZiG9TURInCZtVsNZzYus6On0wcdMlVfqo8XLhT5ojaOk4DtCyeoQkBt1mf5luFNaLFjI/1cnPefyCQwcq5ia/4pN4NB+xE/3SEPsliJypS964SI6o5fDVa0IERR8DoeQ+1iyRLU1qGYexB61ph4pkG1rf3c2YD6By1pFCmww9B0r2VjFeaubkIdgWx4RKLQRPLENdGo8ezI5mkNtdCws19aP1uHhenD+HKa8GDeLulb2fiMRhU2xJzzz9e4yOMPvEnGEfbCiQ17nUDpcFDWthr68mhZ4WiHUkRpaVWJNExuULcGkuyVLsQj59pf6OHFR7tofhy9FMrWPCEvX1d5sCVJt8yBFiB6NoOuwMy4wlso9I2G4E5/5B2c6vIZUUY9fFujT3hpkdTuVhbhBwLCtnlIjBpN4cq+waZ0wXSrmebcl+dcrb7sPh9jKxFINkScDTBgjSUfLkC3huJJs/M4M8AOFxbbSIVpBUarYFmLpGsv+V6TJnWNTwI41tubwo7QSI1VOdRKT/Pp8U3oK2ciDbeuWnAGAANvQjGfcewdAdo6H83XzqlK/4yudtFHJSv9Y+qJskwnVToH1I0+tJ3vsLBXtlvMzLIxUj/8LcqZnrNHfVRgabFNXW0qpUvDgxnP3f54KooR3NI+2Q/VHAYFigMkQE5dLH6C6fGs/TKeE6E2jOhZQcP9/rrJjJKcLYdn5cw6XLCUe9F7quk5Yhac+nYL5HOXvp6Q/5qbiQHkuebanX77YSNx34YaWYpcEHuY1u/lEVTCQ7taPaw3oNcn/qJhMzGPZUs3XAq48wj/hCIO2d5aFdfXnS0yg57/jxzDJBwkdOgeVnyyh19Iz1UqiysT4J1eeKwUuWEYln23ydtP7g3R1BnvnxqFPAnOMgOIop2dkXPfUh/9ZKV3ZQbZNactPD4ql5Qg9CxSBnIwzlj/tseQKWRstwNbf17neGwDFFWdm/8f+nDWt/WlKV3MUiAm3ci6xXMDSL5ubPXBg/gKEE7TsZVGUcrIbdXILcMngvGs7unvlPJh6oadeBDqiAviIZ/iyiUMdQZAuf/YBAY0VP1hcgInuWoKbx31AOjyTN2OOHrlthB3ny9JKHOAc8BMvqopikPldcwIQoFxTccKKIeI815GcwaKDLsMbCsxegrzXl8E0bpic/xffU9y1DCgeKZoF2PIY77RIn6kSRdBiGd8NtNwT74dyeFBMkYraPkudN26x9NPuBt4iCOAnBFaNSKVgKiZQruw22kM1fgBKG7cPYAxdHJ8M4V/jzBn2jEJg+jk/jjV4oMmMNOpKB5oVpVh7tK529Z+5vKZ0NSY2A4YdcT0x4BdkoNEDrpsTmekSTjvx9ZBiTHrm9M/n/hGmgpjz4WEjttRfAEy5DYH5vCK/9GuVPa4hoApFaNlrFD/n2PpKOw24iKujKhVIz41p1E0HwsCd/c17OA0H0RjZi1V/rjJLexUzpmXTMIMuzaOBbU4dxvQMgyvxJvR6DyF3BaHkaqT4P3FRYlm+zh8EEGgmkNqD1WRUubDW62VqLoH8UEelIpL7C8CguWWGGCAIDPma9bnh+7IJSt0Cn6ACER2mYk8dLsrN70RUVLiE0ig+08yPY9IOtuqHf/KYsT84BwhMcVq7t8q1WVjpJGNyXdtIPIjhAzabtrX03Itn29QO3TCixE9WpkHIOdAoGvqCrw1D3x9g9Px8u0yZZuulZuGy0veSY34KDSlhsO1zx2ZMrpDBzCHPB4niwApk6NevIvmBxU3+4yaewDvgEQDJ6Of5iRxjAIpp9UO8EzNY4blj4qh8SCSZTqbe/lShE6tNU9Y5IoWHeJxPcHF9KwYQD7lFcIpcscHrcfkHJfL2lL1zczKywEF7BwkjXEirgBcvNWayatqdTVT5oLbzTmED3EOYBSXFyb2VIYk3t0dOZWJdG1nP+W7Qfyeb8MSIyUGKEA57ptPxrPHKYGZPHsuBqQuVSrn0i8KJX+rlzAqo8AawchsJ26FckxTf5+joTcw+2y8c8bushpRYEbgrdr64ltEYPV2AbVgKXV3XACoD1gbs01CExbJALkuItjfYN3+6I8kbiTYmdzBLaNC+xu9z/eXcRQV1Lo8cJoSsKyWJPuTncu5vcmfMUAWmuwhjymK1rhYR8pQMXNQg9X+5ha5fEnap+LhUL1d5SURZz9rGdOWLhrMcMKSaU3LhOQ/6a6qSCwgzQxCW2gFs53fpvfWxhH+xDHdKRV6w29nQ6rNqd9by+zm1OpzYyJwvFyOkrVXQUwt4HaapnweCa7Tj2Mp/tT4YcY3Q/tk1czgkzlV5mpDrdp1spOYB8ionAwxujjdhj5y9qEHu0uc36PAKAYsKLaEoiwPnob0pdluPWdv4sNSlG8GWViI+x/Z4DkW/kSs2iE3ADFjg4TCvgCbX3v0Hz0KZkerrpzEIukAusidDs2g/w0zgmLnZXvVr5kkpwQTLZ0L6uaTHl0LVikIuNIVPmL3fOQJqIdfzymUN0zucIrDintBn6ICl/inj5zteISv5hEMGMqtHc2ghcFJvmH3ZhIZi34vqqTFCb9pltTYz582Y3dwYaHb9khdfve1YryzEwEKbI8qm62qv+NyllC+WxLLAJjz0ZaEF2aTn35qeFmkbP6LDYcbwqWxA0WKsteB7vy8bRHE4r8LhubWDc0pbe90XckSDDAkRej0TQlmWsWwaz18Tx2phykVvwuIRzf4kt9srT8N7gsMjMs0NLAAldabFf2tiMoaaxHcZSX51WPc1BrwApMxih227qTZkcgtkdK1h314XvZKUKh/XysWYnk1ST4kiBI1B9OlfTjB3WHzTAReFLofsGtikwpIXzQBc/gOjz2Thlj36WN0sxyf4RmAFtrYt64fwm+ThjbhlmUTZzebLl4yAkAqzJSfjPBZS2H/IvkkTUdVh0qdB6EuiHEjEil5lk9BTPzxmoW4Jx543hiyy4ASdYA2DNoprsR9iwGFwFG3F2vIROy4L5CZrl230+k733JwboSNBKngsaFPtqo+q3mFFSjC1k0kIAFmKihaYSwaSF7konmYHZWmchuaq15TpneA2ADSRvA07I7US0lTOOfKrgxhzRl0uJihcEZhhYWxObjvNTJ/5sR4Aa5wOQhGClGLb746cJhQ2E6Jie1hbGgWxUH7YSKETptrTeR/xfcMNk2WM12S0XElC9klR8O7jLYekEOZdscP0ypSdoCVZAoK+2ju2PHE869Q9rxCs9DVQco4BriiPbCjN/8tBjsah4IuboR5QbmbyDpcdXVxGMxvWKIjocBuKbjb+B4HvkunbG0wX0IFCjQKoNMFIKcJSJXtkP3EO+J16uh4img0LQlBAOYwBLupu5r1NALMo0g3xkd9b4f7KoCBWHeyk24FmYUCy/PGLv0xErOTyORp8TJ5nnc2k1dOVBTJok7iHye9dwxwRVP3c7eAS8pMmJYHGpzIHz6ii2WJm8HMTPAZdA4q+ugj3PNCL/N45kyglqvQV4f/+ryDDG5RPy5HVoV9FVuJcq2dxF9Y0heVoipV6q1LyfAeuMzbsUV+rsSBmCSV+1CdKlxy0T0Y6Om0X6701URm2Ml6DIQgJ/3KO6kwcMYRrmKsY7TfxWhSXZll+1PfyRXe9HS0t1IKTQMZL7ZqQ8D/o+en57Y9XAQ9C+kZYykNr0xOMxEwu2+Cppm69mQyTm3H7QX6kHvXF201r+KVAf354qypJC5OHSeBU47bM1bTaVmdVEWQ+9CcvvHdu8Ue5UndHM+EeukmR82voQpetZ7WJjyXs+tPS60nk09gymuORoHNtbm0VuvyigiEvOsyHiRBW7V6FyTCppLPEHvesan91SlEh1/QEunq+qgREFXByDwNKcAH5s8/RFg8hP4wcPmFqX0xXGSKY087bqRLsBZe52jThx0XLkhKQUWPvI18WQQS3g2Ra1pzQ1oNFKdfJJjyaH5tJH6w0/upJobwB8KZ5cIs9LnVGxfBaHXBfvLkNpab7dpU6TdcbBIc+A4bqXE/Xt8/xsGQOdoXra4Us5nDAM6v2BNBQaGMmgMfQQV+ikTteSHvyl8wUxULiYRIEKaiDxpBJnyf9OoqQdZVJ8ahqOvuwqq5mnDUAUzUr/Lvs1wLu2F+r4eZMfJPL4gV5mKLkITmozRnTvA7VABaxZmFRtkhvU5iH9RQ1z26ku7aABokvptx7RKZBVL6dveLKOzg0NC7HAxcg5kE1wuyJiEQLOpO0ma3AtWD2Q2Wmn2oPZeDYAwVyEpxuwDy7ivmdUDSL95ol3h2JByTMovOCgxZ1q4E5nwwa7+4WtDAse6bDdr27XgAi5Px3IWbyZ/vRiECKwOMeJSuIl8A4Ds0emI3SgKVVWVO5uyiEUET+ucEq0casA+DQyhzRc8j+Plo0pxKynB/t0uXod1FVV4fX1sC4kDfwFaUDGQ4p9HYgaMqIWX3OF/S8+vcR0JS0bDapWKJwAIIQiRUzvh5YwtzkjccbbrT9Ky/qt5X7MAGA0lzh43mDF9EB6lCGuO/aFCMhdOqNryvd73KdJNy3mxtT8AqgmG4xq7eE1jKu6rV0g8UGyMatzyIMjiOCf4lIJFzAfwDbIfC72TJ/TK+cGsLR8blpjlEILjD8Mxr7IffhbFhgo12CzXRQ2O8JqBJ70+t12385tSmFC8Or+U8svOaoGoojT1/EmjRMT7x2iTUZ7Ny02VGeMZTtGy029tGN1/9k7x3mFu63lYnaWjfJT1m1zpWO3HSXpGkFqVd/m3kDMv4X9rmLOpwEeu8r6TI6C2zUG+MT6v90OU3y5hKqLhpyFLGtkZhDmUg/W1JGSmA8N1TapR4Kny+P6+DuMadZ9+xBbv06nfOjMwkoTsjG0zFmNbvlxEjw+Pl5QYK+V8Qyb+nknZ0Nb/Ofi9+V0eoNtTrtD1/0wzUGGG5u2D/J1ouO/PjXFJVx6LurVnPOyFVbZx7s3ZSjSq+7YN3wzTbFbUvP8GBh7cKieJt56SIowQ2I577+UEXrxUKMFO+XaLLCALuiJWB2vUdpsT+kQ+adoeTfwOulXhd/KZ7ygjj6PhvGT1xzfT7hTwd6dzSB4xV70CesHC0dsg2VyujlMGBKjg5snbrHHX/LNj3SsoLGSX+bZNTDDCNTXh+dCVPlj4K8+hJ/kVddrbtZw26Hx5qYiv3oNNg5blHRSPtmojhZmBQAz8sLC9nAuWNSz1dIofFtlryEKklbdkhBCcx5dhj7pinXDNlCeatCeTCEjYCpZ3HRf5QzUcRR1Tdb3gwtYtpPdgMxmWfJGoZSu1EsCJbIhS16Ed97+8br4Ar1mB1GcnZVx/HPtJl4CgbHXrrDPwlE4od8deRQYLt9IlsvCqgesMmLAVxB+igH7WGTcY/e3lLHJ4rkBgh2p1QpUBRb/cSQsJCbosFDkalbJigimldVK7TIHKSq2w8mezku9hgw8fXJxGdXoL1ggma52kXzjP78l0d0zMwtTVlt0FqnRyGLPGEjmICzgSp7XPFlUr7AeMclQ4opqwBFInziM5F8oJJ8qeuckGOnAcZZOLl1+ZhGF17pfIuujipwFJL7ChIIB2vlo0IQZGTJPNa2YjNcGUw+a/gWYLkCp+bOGIYhWr08UIE709ZEHlUoEbumzgpJv1D0+hWYNEpj+laoZIK5weO2DFwLL6UBYNrXTm9YvvxeN9U9oKsB3zKBwzFFwDgid5ESMhy68xBnVa55sCZd+l5AnzT8etYjIwF/BGwEx1jjzFv32bk6EeJulESARh8RZ48o7rKw67UZpudPa15SDnL8AL8xMV2SC0D1P53p190zhCFkMmEiir2olwxcJppl/kLm6/0QSUQLNaxi1AC3Pg1CTosX2YQr73PjEIxIlg4mJ62vP7ZyoHE55B0SX9YrrrCPtNsrJEwtn6KOSt7nLT3n3DLJTPbLulcqQ1kETP6Huts29oP+JLEqRGWgnrqMD+mhCl1XCZifjgQ39AeudE8pyu2DqnYU3PyPbJhStq1HbP+VxgseWL+hQ+4w1okADlA9WqoaRuoS7IY77Cm40cJiE6FLomUMltT+xO3Upcv5dzSh9F57hodSBnMHukcH1kd9tqlpprBQ/Ij9E+wMQXrZG5PlzwYJ6jmRdnQtRj64wC/7vsDaaMFteBOUDR4ebRrNZJHhwlNEK9Bz3k7jqOV5KJpL74p2sQnd7vLE374Jz+G7H3RUbX17SobYOe9wKkL/Ja/zeiKExOBmPo0X29bURQMxJkN4ddbrHnOkn6+M1zTZHo0efsB23WSSsByfmye2ZuTEZ12J3Y8ffT6Fcv8XVfA/k+p+xJGreKHJRVUIBqfEIlRt987/QXkssXuvLkECSpVEBs+gE1meB6Xn1RWISG6sV3+KOVjiE9wGdRHS8rmTERRnk0mDNU/+kOQYN/6jdeq0IHeh9c6xlSNICo9OcX1MmAiEuvGay43xCZgxHeZqD7etZMigoJI5V2q7xDcXcPort7AEjLwWlEf4ouzy2iPa3lxpcJWdIcHjhLZf1zg/Kv3/yN1voOmCLrI1Fe0MuFbB0TFSUt+t4Wqe2Mj1o2KS0TFQPGRlFm26IvVP9OXKIQkjfueRtMPoqLfVgDhplKvWWJA673+52FgEEgm+HwEgzOjaTuBz639XtCTwaQL/DrCeRdXun0VU3HDmNmTkc6YrNR6tTVWnbqHwykSBswchFLnvouR0KRhDhZiTYYYNWdvXzY+61Jz5IBcTJavGXr9BcHdk/3tqaLbwCbfpwjxCFSUs1xfFcRzRfMAl+QYuCpsYGz9H01poc1LyzhXwmODmUSg/xFq/RosgYikz4Om/ni9QCcr28ZPISaKrY7O+CspM/s+sHtnA9o9WgFWhcBX2LDN2/AL5uB6UxL/RaBp7EI+JHGz6MeLfvSNJnBgI9THFdUwmg1AXb9pvd7ccLqRdmcHLRT1I2VuEAghBduBm7pHNrZIjb2UVrijpZPlGL68hr+SDlC31mdis0BjP4aZFEOcw+uB17y5u7WOnho60Vcy7gRr7BZ9z5zY1uIwo+tW1YKpuQpdR0Vi7AxKmaIa4jXTjUh7MRlNM0W/Ut/CSD7atFd4soMsX7QbcrUZZaWuN0KOVCL9E09UcJlX+esWK56mre/s6UO9ks0owQ+foaVopkuKG+HZYbE1L1e0VwY2J53aCpwC77HqtpyNtoIlBVzOPtFvzBpDV9TjiP3CcTTGqLKh+m7urHvtHSB/+cGuRk4SsTma9sPCVJ19UPvaAv5WB8u57lNeUewwKpXmmKm5XZV91+FqCCT6nVrrrOgXfYmGFlVjqsSn3/yufkGIdtmdD0yVBcYFR3hDx43e3E4iuiEtP3Me9gcsBqveQdKojKR//qD2nEDY0IktMgFvH+SqVWi9mAorym92NEGbY8MeDjp553MiTXCRSASPt+Ga5q7pB9vwFQCTpaoevx0yEfrq9rMs3eU6wclBMJ9Ve8m6QuLYZ58J41YG3jW/khW92h6M/vbFIUPuopZ6VVtpciesU74Ef7ic8iSymDohGeUn4ubT0vRsXmbsjaJaYhL8f+8I5EiD5l680MJbxX/4GYrOg4iPQqpKp0qddSu/HKtznHeVyxgTwhfEORMCwnaqetVSzvidaWN9P+fXtGXfEP9cTdwx2gKVfDdICq7hecgRhIs0qlCt6+5pGlCc6kWoplHa/KjP+FJdXBU/IDoKMxRjFhSYkggIkhvRKiN/b2ud8URPF+lB87AGAwyMjr/Wju2Uj5IrppXZWjI3d14BdKE2fhALyQPmHqqA+AXd2LwvRHcBq4mhOQ4oNRWH7wpzc6Pggfcbv9kqhLxrJKEaJqA6Rxi+TDNOJstd5DoRVCDjmVspCVyHJsFEWPg9+NA8l1e4X2PDvOd5MPZAGw6LRhWqeZoSQcPf9/dGJYAyzCmttlRnx0BfrKQ/G9i5DVJft9fuJwMi3OD/0Dv1bRoxcXAyZ0wMJ6rwk9RjRTF4ZK8JviCCNuVt/BqQYiphOzWCpnbwOZt6qXuiAabQWrS4mNXQ7cEErXR/yJcbdFp5nWE1bPBjD0fmG3ovMxmOq5blpcOs0DtNQpci1t+9DKERWAO53IVV/S4yhMklvIp0j0FIQgwjdUptqmoMYGVWSI5YkTKLHZdXRDv9zs+HdFZt1QVcdlGOgATro3fg6ticCrDQKUJC7bYX50wdvetilEwVenHhlr85HMLRLTD6nDXWId4ORLwwe5IXiOhpuZTVTv+xdkTxJofqeCRM/jcZqQlU0gFVTlYlfwMi6HKR2YG4fQ8TOtgR+yV+BMZb6L5OwDc/28/xdfD7GXFaVA2ZSObiIxBwT2Zev637EuvpM6rxcogdM4FJFa0ZhF7nrqtNsqWg5M7hZMORpjd4szf/wS+Ahs1shY54Ct5J1dOBO4sdEtSnRc0P9PhgyOCt6aQW98R22DpAcNTDe72AHK40vutKTPfpokghRPuGvz0dulBPKfC3O4KVDCyWrJGO7Ikdu06A0keKlVfi0tGcpO0NhzXEh75NHyMysAMV19fq7//sPC0For1k2uFEvq8lwrMAfmP7afR69U2RqaILHe7glpc8HmVf87Qb2ohsw+Di9U+ePdHLecS66MhB/0OwdcXR5WBcWTZLGq/kiAaT+bzkjR8GIpWdv6pfIgQ+Q0xdiKvo+gNB7/Nf9knNJGxnh7LeZEFtMn517tNc74PPS0M4K3I6HHZqNPA+VZcBc/g5a2ARyqKrJ4Z3krsuA+VOJJz2KJpBMgCCWFln3u7k6/q3DETAubKG/pt3ObaNT0NI0Qug90L2ip5dHnZJUjPTvK5E96aX/4mRU2u8n8kh6MKbY7ANBro3huF06U+JvfyELQP25oIaj+n0ITQ4KT9rXZD4EtBIOj95fYNldDN3io/VMIvWNj9P/b95WEMq8UAVfG2XG0N6fSYdnBEC7sUEbatbDICH9qA8TTuW9kEt9DlFOZFP7bdfYLa/khSY8W5K/AkIIAPXtMvyVKyESjKx9nfragssxC0jFMVY94d8lOAwRocdS/l/P43cBGa3IqDa0ihGPcmwS8O8Vj16Uy55rOrnN0shhRJZdW8I7F0Q0KeHc35GFo4aJOFc25gNafBu1V/VO0qS4Qkb6wjRrnlepUWjtYyaDABZceValuOMtoDdeIITWKOJiwGPpB12lQgwkmXh9M86podb0D117mNQ8ElluFvbaS8RTKQ6lyj88dUwoJU/ofOeubhoXWBF8eNumkVJu+As3ED/AvLlrV91UowIWI2m8HBG+a3k247ZKAGYsOcWe7fTWqL8eqwM5ZFuoXbeugPKuMOAtOsN+4dSwkhrSAlfGNTzFwEmCNWtzpa9CgPbYNcmoHtO8pj8qMvlGET6nrkJoQ2lp5MEUV1E2A4ZH70JUlCLXvqTIpZlzyxdr5p/GZiD1/BuFOGbyfFzhuxaC/l3lC2jjt6GNRBa06AqqPlYtdA7kiidYa5Qi0/XpXiMDyMXNOj3kmJEaXufW0GO8+DF8OoMULX1vvjCePKNis4AmxQKLCF+cjf/wyilCJvuiyLVPSdsuRTPZ0AhpdDF/1uFmDwG7iP3qYwNsKzqd3sYdnMolCOuQOIHWy1eQpWhuV+jmSeAC5zCc0/KsOIXkZPdiw8vtB33jEBpezpGDBP4JLY2wH1J7Fzp8y8RICqVd25mDT2tDb/L1mh4fv9TOfDH5dTeATqu+diOZi+/sIt18hiTovPsVQVaqXLPRx/4R/uH/86tBMcF+WBkThKLfblcVCIECc8DgNRVX97KdrsCeIK+CvJZMfwrftcDZDZyp7G8HeKl7bPYnTKX88dXAwAyz66O2chkPDHy/2K2XcT/61XnlAKgPwtI8yP9Vu45yh55KHhJu93mL4nfo8szp/IyDjmFHtSMqqoWsj8WaVhbjXgzZxcqZcyOe7pUK6aXF/Y32LnBOt0WN28UmHRiOpL525C63I2JQPX8vvOU0fz2ij74OeJ1Apgu3JRObfdo9xGDpp7cv3TdULEfNS6Gu3EJu7drBsBsogUqUc6wAUW3ux0/1hLVI/JEKJrAGm8g72C2aJSsGAsKFW4CBvBXVlNIKa5r7HvT1BeGYBfxTR1vhNlFFNN8WQYwr39yT/13XzRGiF2IsfE8HcN0+lN1zN/OnzekVBKkFY11GgrK5CLxrE/2HCEMwQb9yOuP2rTXiZzTEETp/ismFGcTWmbM9G1Sn2D/x3G74uWYZY4rgKB2Zo2bTKS6QnM5x1Yee66Y1L7K44AyiY5K2MH5wrTwxMFh+S8LzNQ25z6sunWZyiRwFIIvSnioltUXNiOr+XMZ6O9h9HcHxZJkfF0tUm6QkU7iJ2ozXARitiL86aqVsMOpmvdIBROhUoanPtCjgft8up3hAaKpw9Qs9MzYtBA2ijHXotzarkV3zKEK0dFFQUwT74NgCmGGuSCEDmFCezXPC9BhyGhmzNa6rQeQQz+r9CmGUZjIQEPsHwe86oCOQhWaHERsv5ia9rZvJ//7UXO7B329YUkLLAiqpLRsVV5XpcfdawlJqi/BVcCqO6dr9YJTFFRMVGhfUbB9YWNvYPY6RyaydAFYq1YIBQxuNAGfYWLMAHtt2XRHoOKCLz+qf5HCVBDOPOktQ3SdJBfxUkaiD585bmTzMwU3oeXUHZ55EC99Kz9kk4ZXMIENwVVpqW2JmGIcUiutIMj2KkpjE2QD+dIZUCxcX57kH7hiuUPnKCTdaw4KN95XPeFRvMcvo5L8LexWqvaJPECzwXCs/4XPAlSMpWUzBBjK3pEnkbueMkMJQrYcnXf7PjbAoJra1VLX4YuscQLpaeYWbT+h24hCFrfcHjxxx6WTSe4AGY/KHRZCQKqTuFWt0D8RmGWmvXSdg1ptIefYPshuIVZT7CV4Ny67fvjJugy0TNYHqoCO45CB88kxrvIsih19DqjD0UqiJsTFPcGW3P/ULOG3nb8CjpgVTIoa5nO9ZYEX4uEHu8hLXrJPjV1lTQ5xTdZVagg+Wj8V0EE4yPsTc345KM6lVXqLiHtm+G6edC4GVEiPgd98g+twSYm18gCsPnjqlLcFm9e72CLJbYD+ocIZOxuVjrX6IKh9fh7WqdIZ66x9PWkDGOVVGkx7jM76Ywe16DX9ng205kg5eq+R2q2MguTJxYv/wWHliD9mOYpzZKNXYC3Wr4iBGkm54hBwkPzFhiX/VBHdVH/KJ1ZIMOHxIN6arKdxrm6EBsgwDt0mPe0MX1HRUMq8ctcmysU6xX0bzM1J07kAvq33jw1q0Pq2cyMWme8F7aVkfhzZEFdyi8fVBQav0YZqvAjZ83WKH726rBx5Bn7GHFthR6H4lFsltu+jWmsAibJ3kpWMG/QbncU7n9skIBL0MuXXtj9sJg+4Dl0XhKJ1LcrMydaIgyrgZgScP4k8YQvcsBmD26X1iYXKLzMYfZn2IfRjznsrJ1e5cnl/3a5xiNoI6n1x1U36FWckJbyx+hiSZg0QqAqeeSvzFYMlZ2REnO/a6yoQhu7PdHMYEPFIvfyGeyCU8e7rpju4DrlOhszj9rOIpNsvCkuD+TLyf5J7D/wsPkBpscFVI1q7oUSU9bN30vH5AqnO7bsf+9rGhtVjOJQ32H9hHSAzR2ape4L0Cz4WxaySm4jvuGXwkFp5NMMLrgZ8LdA+5uLuyxO5SMOmJNDBcbbLefv7z6LyxBwltnfQLd7qqpG1MmNcoLUcx73BkNF/xpdS0cKd6G646ntChXSeTZJJTFYGw39T7fqXDPKoG2cF7/ZcTvME42gXLVjTqzAER1Rt5m7GYsh0X0+XgOeW9MJqE5j/rpGzY6vUu6ACcCTzDMdZHiWELpDnvgE1hmztLcSYz0MtNyUBLqvylUJJnJu79Sku9NMHCTkgqozTnhMFfduV2NLCSYvAI5HUvQp1h/M02vKFD6eosIkGTg6mujUo1W8hy5Knf/erkBQC9LzNqPAYCgR+hczgevta88NNqSlBZryq9QNeUK7RpbvHjoNhUKAAeNYH55LeTW36KyFaXdAkBvyNP9xmRuBokPi2OhqDby6IZ61mwfzG+GmACkS+G80A4WGON5izgJWeeDK91jzusfOi0RmEsVJXwbVUr8u/J2LCQaMnHhi+wJTEPN9tS2b6W4GRGCNmtjAMgPsP357nOeD3H2tcDAPu5xQBKMHf/j4ZhXlkvvy3YmBJsjsd4pSOlfPZCnw5JvzxEXM5JIc+E2mU4CgB0mdJnH4NEsCHYNeVRDXFNuyZUE4nuvaJf1h+11AWLdAZ72D9XNRcxfb2+XHZN/SN48U7yl+sNZhg5gn/PD8wkBtnRj1zBUPIWnoMP6yGUEEzuT+VaX3x2jEIZAZsr3rs9wCfY1Ss0EdIFFzBbyruUup4EPanbSYew5tf16/ZWVup5iykttuqL4xoC/jdZWsAZeSfDSd3fP9kbyAFYXkf0Q2lmxaTkKRZrCo9XCoiUG4yP1URJ5G7+HSOhhJp0Anz0N07QZtyFUye6rcgiOFbtyoO1lkuV0iQ602MTyFK9xLqNHtNy4cJaTO6hjtiwNynVc34ZA6H7k8ai6S6eF6jIG0xJx+JfP97lzuCZr8vU5SIzImaNpiQhyvDbz23//PJcOk7hD4iIvJzfIgOGIR6ZPEJpWHZQoacbF+omeHw8aWHaNOfaIyGeG4lEryMfhtNmWh4RAIpn8dLs7ZE2eTVDwK++xDoSUgh47WDmKlZ/k6OosEUoQjk7Q+Kp7OxwgMFShAv6z4pTW8loVj2+qXLQ0T3hmIue8qHy1o/HXjm089m71t6mrrUyDftqMYtmfvQXKDlZ+K1HR/FkqPSqcjGlcPPIwbMw3wIFKBdVMJ4pFLt+oOIkWZMw8pkoYZ3byw4LmAF+7BdicGXFcb5PWtDw5XNNVc6eB9dv0rAEpgr5J+bLr010bpfGw+IkRoxDbkDFmQdEQUSElP5bViLo1ur/23KN0jEwl+rGC6AUMKxHcv+T9F1Ktpn8jSSrKxJnVkK8UD/tH5DN6nXB8mjUdFU539e9ywLtLYCwmHYVEVqnFmdubduaSd1ivIo4pTsX+mJcOAkrR1D60RIoocCBIdwJhCBM1rOE2XSlPo0U+khALvw+zfxYzwzd4roWlLJkZheFRR8QB8v4USwmAcDswUZ2P/7v7Xa51Fs7orYebYyww4YW5869Y/c6Kq2eTR9HLSjYuChTkXaDygoo8nz/yJ0KzfX8oowaNAwz8HvQdlLU9V9hjqYMURyYvPzZ60G0itmUdZwB+sY6rUkMAZZtWStbDFmnk/dQorhwr3121XQWffrK3as0g29ASwxbsZ3dZAq/96b7/XWckbjmo8+jwdE680DzoEUUivnBgowMuBQxHXoGyp+w/cSGY88rWtmwoyNNIvChs/QsZRnbdV7y8x7t2RkliJV/j8e6qfctrTsMV22zoqgQuTSNFh7U7p/Q49L0kygXNnEYXCBDgi5BeNWxu7VjULcUHI+lGj+OTCEATzWrDmaynq3wT9IAejtvh3esCu6sEu9JOsXxMDpqxm4Tzl+pt2Wa5Bq3TM5TKH4N7KLir8FGIPA569+uJ1VEL3fW8Jyigz/nEUjAVYrdCWq2MnS4hQVgcvXq9aF7Xke/k++rAtIQqckPNwjKrV2t7HCOrA1ps88Y5Rw1Zp+9itnB71j8tNiQc7mV1kUCQXkoi5fOsq1uC6hUPUL7Z69NAM6lg0c/aeiifHoi35v+pVBh7CDM1XfvYpiK5JIbIQFHafmnhHfRTnMagKcjdE7zzgtxkTPKVrObTySTT51g9bB5ro/dzn/sB24fNM2LGJuRQsmC49PLi1jTRfZaLpo8Txxxczij5Pl2vur+S1wQW3W5qyVcIUySZHtFDQHv+EYDoZG1T1J7D91vEIV8dHzUBzW1UyuxRbP+M/CM/vsas6RzmS5traXnQ0Jzv9hYXxKHcs15TQCP744XsLjzFjILYURXFnhM+nnV0iO6nwls9TR4tlz1J9/NvE8FGg5mgpZA4htS05AK0NnU2gxuqf2vjCyWlm3ypKvaX4vxh8Um1MHGB2NTeAFhbDyGm+5w2zqJAWxVlj6dVePb5yR+aMhuz05YubCQJ0BOtoYQ6PoDoW5fCwCtXj5SHvCgL/3B5z2mcXWaRTf8/GsFAfX/ntdWZWFc2xg8MJeenwZ4dZUToce43If4zVb1ex3BMAWGhgkPwR5EgktZhW3Yi+nsnZTUr9FYI160YhAraB0zMV+ouHz6hYm25/ETDM0MTmcypoGgZISSkfwYAQaHGY45yZ91K4A4Mm4fnbMk8GTc4orypT3NLBqAxYdcY/qCH82PpIkmVOEHi1NoYaUymuImLLcib5pmd2MHTB3JR+4rLdRc3gtQ9zeFdciciRiWviu3HkqaLSxJeI2rgc7OKQslItumACQow89elXmi4P3gTZeCauvMH5nF4VrBcLjjwGD+KlKqe/RWIEgT2wGqAgSuL6b+RTTPnQZzxZ5y5HQJkEEKJp5NfoB8hJBM8qn6xbOFtyzBjVBrwSS1zCJR3lEc9ODQ5Wu/xct9/2Q6qLHnmNx6XwZus/i8rEd6UsVxGtoDrm+Br0L5oUojlwdcqyVV4PIMsR60JhZwJtgX7izQWj+GOeF9DA8Wexdmv6DWjgR8LEBp9YuPAM8tJDu3uCumNqHnF2ATYX/tuVO55OgQuiUhmDmJbF9jJyifBRtxOVI9DCNLUY71IXZYTuiYcnILQ/XHuVJ8aHDStL0N+3eYNvXwHi2vEiTPnBqzsC4TsPnFVnYY042j5i7C11AVdBZ1pGSa52jM9dIL119rry0mgGxFzI8xPs+7bmMfYKh37A4HtA081olG1m9S4Zch2hoNCGVvVhd6UL7C2d5hKIBHoB+Uxarq/4aQXhh7IWjSj+ca7Vhqb4+ZwY3nHXh2S9JH4XZxQojbe/eINxYlozTYtT2rpU/xbj+W2hXjFQ+z+dQ8wh9751MP0UpjutQdxz3/FJYAEG5BF400JXWCBs7KrCRf/l+F+d9EuwVk6thOPDB+HNS9iWlLmDgXvY6K0vgiyoeA3An+jWufdAG1suUMBuJT+/w0FNJZbObUT8c5q5WtQxASQF6E+/u8UwVBs1eo8jTamCrcdhZJlADJbqn3crcDHQlBQNGq7btcGKiJXW6q0cn3F0xzf+k1JJS2testB3rx15ZPTDXm8QV5XE2qxBOdM2n6t5YbxyNOmEdsHx+hMp+y9pWkcgw1NikeXuafJvzcjaNwE1Ad6gG79S68aO7jWpKgBETYLmV4ONHhBk7Be8tjf2WVvWMDQvQdOnk448yeMv1tQKU1xev0L171e/qxkMZbmkfKnd29XRCK2hgNNJhwt1qiYWZGKz7Di6K3fGDT7DO2YQ7WU33svE/WKGbWQEvzUV2w+VNYDocI4yxQ6i3i4zU2TjmjCwu5Pk+Ja9HSwLpEoUswq3tFJ1jimthgMXd7KjSl6Qd0K+vxWT8G4/+xITHsWDGSfQTSdFQth5uVVfa8wrkDZHTGVgpJys2ik+3I0dSf6TNo6A/sVptyY/kx1hdAWKPI6t/xj6s+fPMU3hg1vkEB0RRHq/tCy3KUUhzU/d0JKxTyjvUms5iy1GbOFco0NA4t83SK9sBmtLWm4kOLLflyxqgQYP08iyXwYXzKnlQ6VTipuaspSJ9g5H5Lu3eLMnPKbhcwuEg0VZ80ppJWjUnhS3rL35erzysp+fJhxsUs86m28/UwW+IgrS5Y0zWaxlFJ8xML5wk8sg1ragF+eNajyI0Y4mwStxt1RZH2BjaAhvu+SnNNIK88thEgZEsoHv+ii+OMmXJL7dnAiINVDz3tCnqDgpQX9OguNGgZj3axcjq1UgxDw785yNIpqNiLgv57399jVmJ0/RStNswaFIs6FtnkilFZldxj6m562jL4p5g3Y9XCiXRJX6nq2PGJFifFR7EyPG4jDMnBM4t+O8ZpEp3th7TCxEw+ZG4afHl4sNFaqxyLh6+979tt0Aq9BrqI+CS2U7HJoKiGmyVU1lFa3/0O5mNC1bzRgNMy+GXyifLwJP7FwUSUmxmVRpn+gnXWoIuswPutsiciurvN6lsMG7yqEc2Y5ZI3jrPgPq0xEKPZpF7teJa0TQn8BQL4Th+hjv2ByfwKookyXEmj0d1KMcsmfKaeKK3cZZubiYqmSCrnGpYTwgPk5itKucVtjViuswQsDR6TuyGSIHYvlz7wkLg1Rr0K9kV1o8RgABlhbLrN74cVWJW6TnfXN0q12JFMpUbEa8t1+j440FA+17o8qa8PQ9igkctVROVIfB3jU5vtGm5pYYHYSDvU2TEc15pIz19ka1q6c/7WXfF8+POkApdOw7nn7Kqz6V4tru7NXgnA/u0g6+fPRT3hp/QrDQwMsjwNCZxdWrR6pgCBDJNc7/KAlwC0UZ4yWQs0KsuwbbOgcTxQPK54wiXr7s+221hzZ8RVxfoRUKM3e4lpxHC83JllxlrV760tl06f7/65qhE1jhMfivAUXIXfRMe3uY/G2TpWYzDrw5Cm5cS062Bx9lhHq9gtJp8xZwAtSdSuW/Kd7+orEAiswA76N8ezmVGYgNaYlQ/xk930LAWAtKVBC4U6R08L45IohB1kFia7XJs0TcaT2zBZoLFuOGu4iJaoAnfjL3uS6gnRH7G7A+aT6ETlmkYUfgrBuaSLLDJfhPJe01PfN0oqBTeQURasl3N8BZiQSgdr0aDv3hPTiog4NSyfAUyy98WP7dnTDWQTY+Qwzgk1uxwRqHl5MpC/84Cuw1TXfRlgJrwPop10kCHjmffnFdxCe2J3R3J5j+3H/sZn3IUu3Suy+I+dAOMWvzwExNR3RRPVelZAhtarKlXPWNjPRIVP4JsAFSRXs3o/fSYAPaV/zP8q6DltH47/rYhCLdy/LrpOsbaLf09eACcClJosNefetNElkSFSuCgeY7oTAAl+8Y2zOXJb/bgEDpoDXfQqc6lnlBr/WsmVznkBS1M7ufiqpxvKXjwvR4WxLbh5NbMNy8LsnX4UiuAi8XonbSUcVZKQOWBYUecSOMj6jMG8gHu7WNreBHY90lV7FocDprSrSbexkAtMW9KlXcnrOyLnZdodGYdxz8aw71HztIqLhRdCOB6NyzHPoS2hDy6wLk0I5Jr2t+U0A+A7EsgSn/Ih03A5CspHnVF4MOic+Lck3m61Um+GHDEe4DrHBhmgtDlRQl1XJ/V/VumCHtUDDcZCkgjVMBOmVOGYW0Rcdi1ahdjhBcFlfjA+5cRjBop1aNDvdrf7CxkLVgxiCxhRctW8wczM8+kVmIrGtkaHGlr8y2D098HXE23r7fnJFUU68zyeyM265igNOGPzFG0dIgUDWN6S3ZcfMERJdWVvpGhVEHXNLeWqHiTcF3wOt0FbJY4XHEpmkoG9MQPJJ4ueQ01+MB+SR0rCSGzlE8zod19q75LlLWgzogpnJoD4gPxUYcX+Gpc5Ly4nk+Zm8LDXcNR7SNVxLh6NAcx8ekjb/AC7ADlRnfuHaHJaBodZr7RBX9FLTvocY6kY8bavdAkQicE9bbwGLkZu6whTCJ56lOvM39ijehpTOFqR3V53nQx4hfOvwRPU2y2w7UU8yiRbcyaX6jGJ9CRvl9ybV1tebTp5MMuMnwLcx/lven0w9T0atJuiUE2WtYGiVMaP3EchABl5AsyaCpu/BKAWDFvU2vaCL2/fJBKCKLjxG6xzT4Mh4wHhH3/EqsGSoQAHu2wbHmXHj2LvoW19GXDa2oyeKRwGG1PU+S7mE/S+UmjHiDF1oqJ0R5QsdjAZYN1MzpNX5YDqWYfhfdjAXyFQaVyGKkp1oEGTR8MK6jaGfRDFd41u2Ex8ac8jKPYu3pXsk8gu+m9tr1RVzTTuDsACW4S1h32yFHX7qpXSmA0QVEcR8W9j2Juu0pcYqTmdis88VgT3gq7iYue5Hx/3K6hFQa9rZrNSDcjaSQlNn4LSqs20bypnKqpzvnnxjMdz5StbzvoAJKgVZa4DLCVoJW765/KyTF4s4YztmAT1c0pTmKJHTpa106FegDo8p2zD6uOnwpYi0vJlRMDe9wPT6964UfAf6lq3qWypUOx9q6BbKEYt7K3gWMXDNN6wAm1fNnSOnZ4JkbPq7jLQrl0wL1V7QwO/sXneKGfTgUL28I5iPVG9dA2gS7Ki005JUR7Vmw4gX4TJvy1WS74cIXD08LCF5obqcZwamuoZ+FPMJEck0TLHjyH1baPr55/Cy0ptDfRJ7d89pbP48tLMHG5dO11Z8xSSpPGQSgXDWmpsNsmm+MvxJjMCi7OFDHxxpmTtjgnOCq+c7Fi1DybfhAntviKccz+sj+OPKPYOKeYYPLvq6MpUx/chSvBccg9dfbeqetQNCs3eiCFZTU1mrDido/mib64STMgsa+IKLk9PyxGGbVSQB9GsHto6f5prAFIbRDSItDedz3t5+Nn69FFS0nEfmkF7hKBmNVce5xv65USKGBoHYxJyutSGnRIq7vMDsAMvirOEJOzNi5Kt7fypuSU2c2Npo6UH5jMOkePH0TwgpammO3Fb2FX6f11309z/mqRmQ949HHRj/wMzKNx95M9pwKf+UQkMEwisL3YVotvHhCv4y00Ui0Ql8dR7tGqFcSdYtmoAOuAodkBNs4PZSjAAF7S/szwLddFMdCyB/dWPgFUiUE+WmUUCjYrKfJLQfNNpQ4NKaF57w7Kp/isZVwQPUJyjJavN3fQNKU+F74jVBJYQEcEdw0Niinyea0l9PJ1/AcTm/LI91RZjDvLI81pnat7RKU2P4/TnIAa3hIEfeg4iGQ+wTDlURK6YjNpN5s5VkQW9w7sDYKU4XmjyZsCQLxztqd4SDQvLyuPDhURAJXKfR1c7tq3mRu4usFHPqz7HgS0X7kNxiWWR3fb3uVwbgKpmgLYkwKrXKt09COw4MjhxeZlDXKy7nNLHXAIKPtferWQnZLboonQXK81x+BB3oUidBehK1swSXxVbscj/LsfONu/xYEXYPM3aMqIYd+2hAnFvDHbdrJLhGEd3sG5PyxqhzejhQJo9wauFK3xmPYqxB99J8zYU9/yzrEZNzzbvPoR9vUlE3Ha4zspVDzHHffPZMJ1VLZkKqGCf8ZqupqMt6T+NRPfmPm2xeDgvzMrRJEL4/zzlu7Z35smvzbgeC25VP2CUrZkRxEi15A0769ojdO1d7C9OG+swj1ROMM3NgKdeBADoRMeJkRZcZ1FbQu6C0BS9NNSaoxtFzYT4lX7+PQ7BKa84yrN+ujVVef+SgnEie1G0N+eOtbZF/UU+wkeerWjloYqFiqo0vBnmxh+TwNMo9I/8lfU2XTCT0K4OoWE08ipyNHjxHvfhY6qa3x4HzdQ8+jkiO5+j91YkihS5memfpFREHP/2veN5XcRue2zCVuAub8V6vDlOvyP+PBm+owyRhMmng5wwGGIXsOkQekXrXpE/6dFjkHwwoFoj5bIFiqp+4wHpSWRbv2xGrRpd2c87FzMP6Hfj/3LWIBqFiNOAxBw+AAP1XqUBszdZhzOSQrQS4Ein4fyV7MaGsB0VsMF4bPb4lx/foTGQRJv45LpoxDd84xCawHaX7jpXUrOdkFxx2oUvY2xqpgIvcVufwd+zAnaaVTnEyDXD7S/o/xrrk4mgTjXhcjj5Rzrbr23NmuZQvpdNzny5MCR9bwvIRIqzOZZLsstZSCDYa56JTvzxgBs20dYTtTUbe21uljlWqGfSh2bYAzOpf6UguK30ZxNXgLHs6Y6urtxFA5iLYvlue5mDONW0MOtQjhqr8fRbCkYneiDkvzHkQVT4F9v9vxh2SIGPBH8bZb8ugo/BSgXojeSdNXbBAIDsB6DUNSXnwlu/bFLaCqSbvu4+YLplwO1JbtrMf9ZUfsxerAZjB7E/zl3qwgK27FswemUmSM4i37YAVhQSocuV8AcDI/CSeCDNPavESshDQ8A/lVIrAJAMdP/rHXouiNU8RL/TIvfQiuZEb6dkIKMGGOW5kT8vO8pivWnT4v7qmwuJo52AS1r/RyQ2g/7c9ZJgmMIzf0GvJJRfMNu1utRNuLWHOm9JIMcJK3qiDtVpGCDP45W1oTTMUnMC91kYhP0GHjhCW8V38xhjHgFFBfuWMsmSQ9MvNqKXiqtUhDAkIy0PW7YSKaKUv6zctAiIk+Jt17kG6LpNVOeMvJnlVBaJSkKe0HTJJUMvf8R2zna35/yh2wNlWLzIP3BJR5aRNxkV94ICOlycI1/JYRZtzvWMNoIpQrdNvyBuBydhSwhRwPo079Xk/XQZpbhzN/KK4NbdJQV0JIMP+Y5UBIM3TTYlFGYVjcvA5yVozkimco91Fx/eo+ydgAx1gMezTh+bYxCtXPYkMoPdtaElRusxlmdSV9zgF4Np+iylun3LVxCycAFxGCFsmARf6y4I6zXY0tx81aQyalr3/ih+ZjxGNWdhItgNLdEZ/BOIJpPoAveh2bKbEFxU/M0+4xqDo3Ox8MnNn8Lmv15NJigSvJV+y2W/ZogEXNiv0/nuFzZGr0pKujOShzcdkEVlMw8mNZXZCbtM9V+mfawtLxCTvo+enFWhJcFv8LVTFycDjPGBXRQKNN+z68HJtYdpH++g5WdhQpCO+DE7Qdu6TmZgtetrpU2ZlgpslOx+4hb3aXaqbdc92LCh51er8vm1GQ9uWD9+fAPRV50ixhgc5zi2Jsg1xQVxzlaELRWJ5biyF+eCwNV0oFnTbBHr3Glm9qlGVOpoOsQC8hlNG88fxeAekkCGnHFn6i5WzyO7ShDYbZ2KM4eqndyy01v+6TFhmkxgc0dndt7EzRCcEfBxSaWZwcev6MDZcuvSZQ9CNSd4Tx25TY6UAbrhikuP1vNFfPdZhCG1pe6vx4D6Ez3zIb0zDa42FPpxWvIpEeXb7YTcfZOahSpSYaWLH/vq0F3U1KO7ZxliZpoMBBYJs91IE0bOkrPNQ/USYY0qKCO3CU+AFbOYxzKWBkIglrX34377BZ18MKQCv1KWfIHEeguSpvrNH5RQOD4LeiH2gdx1MOAKphlL41F4RpxaU4dy8xERFgqoyICQq9XmQ8WJSokwqvhQM0fLtsvyCO2PAkJ3BZg5IqoR5q/GdTLgOWPFR53Nqw9Ma5vBzZcQ4+iZgetmKg5ZIn+/7Jbi+VlViXuD9CaAUtdEmnwWTS7wZWuskVvc/SDaaKV+Jz6HrZTHo3UrAu0IZDBkXWmL+mTTjdTb1A+MdhKkY/hvFNwXj1FzUngsN58u/kTdJ3Xi0hy7efR6faAOi4SKGaiOty8lxDFkiD9wq2GW1EZEsoWGw/WzxXhWDzYY8CC7WuLFHc+x19jhH+FiLXwDIARRtnkJPF2BUPZ9+grZ3tjqAWhhN3h74w5pooRQUNATy05A9HDLnILGSCtfESoSilqtqAIQ/TV2t3KhOc+teDf5t+DqZDdB8Ob9YXyklrSO73pR0QAxPvQj57c6FIR5dOciqeHZ2LRABMROo8Jk8V6JFewCL8TCd/A5MSbXLky1cW7mXobqgeEXdFDoEydKo5oCuyn+2JYI/7pIGFAzErlHZ5hOaiT17HC3zp2HpJwsIAb4/oIoZ8x8ak43Yp83Ermq55Dg8HxKGHXbXs47sh0PzQELTGFsf5eO3lYAuJjMneoYWk8W/3tW2WLntEKBZEW4hOFgo8K58Rj0vk5KLyezu1d8SO/JcuxpOJqFUM2sxBmbQ/9qqwb90R0WulpR/Ju84bQ5/fTh7po/pbBb7AQaYNdK3fatD3K4TLHAaa66MQzp/+ZGyCjzo5OXRzJ8UHyg/YpNHvvlOpwQIOjakpLHwGV4WsLDPjEIqG23ily3LL0dlkYQxj3Xx0ApCo35zYGoGOtIclYS83MnI5TwVdQ+Hg453WFQN694DaqhGaL/dm0KncXYqXLi5polgT4DOrzD4oSVhrkh8GW2PaXjOFDCLPcn4RQj8dRGIJuV81LxMPZ0UL6zpkaebhbFBxcRJe38UiTbUPDjFWk2jBqzrBvXcKmgdDcmRyJhIpuq+3DQY464AlY42z2EM0yIK0I6b+VgpanMfpdWo7OxKY8RM5tSJv340/qD8SxrYsybMuUkF8fHj7HcvxEPC5YYrH4LW1YKg6QaeFZLvPbrHZHvi4OXLKkN8cGQO8019OKqcv6QnBlj01e7qS5evoGm53rv+VmDxxCXDiOrDg+IaPeMPrn8TJ1oReXYI3yb+4HQbikxP5TQXHk4YXPUv95+KmkxGsRgTwP71YiMpqNXp0loHZeXRp9i3euKrVtxMM0e6XAoACwNtcc6sOuhZVb1htBLudzahrDFt5GkdlwHjZl5y0LbvSHwII+qYeDwRKTTzyXaInHIM+8rc5TrjUlPRVwB5LKFpQnV8e7vLv7T7V/iJTW9h9TnRtNCSGcofBWYm5P7wZcAq3AFamEW/GMbo27ldz0plt5HI53ddWkn9IuCZY+Iy0MATUh3YenRTbVgdLYtu893SuN6EL4e9V4NhlzUjI8nOS6B99ecyC1Ot8sDahQpWHbmt2YvWGyL3S9tEVLKYs+LnghBmmSl2uPWfqPobPwBHNLW21LUjfZb7jfLMTsMp3icGO1npK/rCsUgdBVKVg0Ys+/WKuTmVJoC8Oe5h3PK1TQhbpZ2ytP9nlutQPtLAEt+CVT90DfVkn7lHLOX8AfS6HLzfHeAhu1alnl19RHKV1LI0G7RPzYgVaSpX7th9f06uo2WpxjL86i/2uzK2qj/ClHbGDyQr3F9/axmq4kJ7zZFVXVVwfiFr5bhUGVZeQJHKFAcsnqPKsb8vHyB9SpFpT9U1U7D4aS9vYgqajxhC+hOkolJV2dKAxysCkWBo3SPiPUrSQYZxOWwWCoQzbV0oeaDEcgUtqI3nq9TSmpQ688/+wb26P2CHLY1H7q5lypXSrnwnnztq/jN1o9lyvLmLyGguV0VJnDCREkiUNrZqGG06MsyA+Phd9CuFoM5M1Pyk7S6TJaHdTw0ni3n5ysAup0kyxr65lFc81NcH8xSmpp+iOEtQZrH/y01k1rGMRJAGFhi+nDecpUlnrh+qBOCMZCcSCovOPJrxjZnZJDMLdpMVu+tBSVS1nKxsYjY9Dtq1/++riVfLUVhzofIcIgQQPOqHioELxU3EpCcZMoL9laa5YlOZAMEp5apx7CphrkL+fyKbBAf8ctwVd93FTo7F5Oc/alNsCgK6lHruPROtN2RybiLqx8P5LTUZXU+Aoyz08zYHasR3U8hPDKj+6arWXR9yWdJoMn45prCSURKKy3+JHgvs2Ot6v6GbEtdCumgCttv2VNoU3KOqUwqNIWHqYm4eMijTM9VWB7umEyp7UPOI8fduHJY0W9xSCZdvc2xMjo3Zdu2o/WZKDMOSh9UmLvo45IBppD2dG++HJu8kbfFdlwuIxk2KHhgHQeNKcHhFkYGRzL2VJVMOAb0Co64wvds5CaYl9ZmBm4zuGDeaO2eI1XM4+rD/HmZyRF62SabgAe8TF43VuMutigJJMfbW2UK0azGLFbOfujnHD+GGBYmSmOQbUCOY99HYvswBQA6r9hrc2jtsUUxLVjxnZ4JnIrTwIVdWCTPtpJpvlA7m01/4tbUMyz9mv1jdN1jkiHQCJXXKg8bJ+aqW6rbwbn5yDSHBTcFXIegrhHGAjJOZI1pyP83Z3vMYTAJoo8V9IwyS+U6OVg78+IhSYHDYjRs8FrF8smHQ9h4qAYxp49rRP2d5uxLAuP72GvZaYvfeLOkMrcg0PkPuq7NsXhMFmiZa6PKBH1l+oKHI5DBLdZCvCwTPdXqmnz8gLzVRb/ixLTSdit2nrzt0x+5rDeZT+ac31NKNskQs6noKlQccyD3UxzfVZFmcbpmrfPsZD0Ve34xpKWk/E9Khn4A5yVPVq+dwnv0EyYecPqXGU7R8suTW0A6NJWweLI3iSGDlQXzMYsSWkSMhFTfyA2vTDt/3wXk+mVU6bRNkZvNnyVHYiA4tmnNwdh/RVsk/EgSerfTIf5VBmuAc2IKSeL5Nbrg3acgFj80mI8SWsc3dNAGCBLLMP89gH5UnLTKq78d9SxQH/g7DVnBh/qnBdw5CDrw/uMzcdXSxWqGIFcnQZt/1aOHxUg88MN2w+FPx/V75gy2wzEVe6G51PQIR2tZsxbv62HhgjwtlzrVREw/yzlaAiuXC26cnpvQzWXp2mOgihyPCWqq38nEadX2T7f1Y5zGxEGBaT//IcL/BsquAJX5EDbX8X1p8nLWR2yyjFRvqC/jssoCJBCDJOsZvoBfXqQSEKhNARH1YfueeKBslAwLi24/wAO1BHptlf1kQFNsOPlDvlYednrEp3a4SAz/G7LIVEsZBu0EKWZu/euB/XKdkGonP6t6lgEcCOw8mceuzvEVzyoPnMyzrqoNQXJb9C8ZCXSiedKiCgNwfNkpVlHbUgE2Rb9WFScOeEad+T+jT8XlSc8rcvkIuhAv/gxRu2eb2GonLTyokjcGF1EBpCJbhy2H3lhL0rdZIw1okA5pBg2oRfQceXTPzhuNKorTEF7t1UIgDqIo7/loxyTgbtKu29o9K9KujvCqUGyPY7upcfiZLNBVKh5uXAAZjQjhlhBp0ukmO4Avxu4xAVhCtnsOIA/tAm94U3HEuSr3wq+ZLo8pyoC9EB/q3pOzQRyCTkozmJwo1Ln/2xEbtNnS2S0NUIS3yz3/mBIdxONHxqP9FW+uoGI1F415lI1nZwK0SoPA0+flaokBGEoXgZnO4GOExU7VOjdPns59ekmDxqNhEHeAF5i5N/3W2NC1XGFjTpqLrnCECiwVkOTrLtp2ehUIaejOG6+1336YQSKMSsL4zhUjw6SQKryVRz5Ldn3R5/r8AOi02RJkQXPdvPsl/FMg96E/cJmIFLmEDzr1Gkh9G3zisG4pqM/MV6XIz+CtDUh6hmJB97VzN8jaPSS90vgDjvnaNlKky2/zIhE9ObugwrftI+Oi2a4VVaB/Mwn3VmaWjsU9NOf2usbcN/GLQMjvfeU/YvyEERPKw1leXZWWk1HXzY3P9MUq6MZq1hkEgFzds51mv8mnp1i4pQprPwY0TId1szXwe5TG+R5mMD76nGPQr7/EhQWksjsgGs7Zy5QYvMcGV5tcXJR+6hlHFIAc/M6XjkKYtwm673Bi+K1tNO9i1YBePTur4I+gMsOK7f7980mcJXhgdWdhNzUN2JvFsvXq3zZRG2V30sJtJYxj0aUv1u4/ppVHi1iHnTY3gDHsrQS8YwMX5XwZ2gcFYYe2wd7ZO9swr0gb8zf/fXx8QWKPXcK1UdJk3760B/TMlpWLCbhkqVoSTsOqzgkmFmFteCCTGhNyvFhw1RrTIWzRxq8Tj5FirvKvtkp2GAVhnZ7vnr71pyI0rKwQbVxKZuqM7GAvn2mRBj5p8djlHUsh/r/eBECptpbbjP5nFyuN4mvQLZCaxeTkDUzd/kNGLIzBFv1CElQO+xmf7Dzt1f7GM1Bh+wLDCJZlhcVDXbtPuGssdEie3lZNiWcXMTjZtWAT5MCmpq6JCRuFSHZYGKcSFZ9kOYJfEqLIcWdzpTA+Hmu+ktgSUwXVSwkaa/aHdZXh7IOyrudCBalCZpgXGRNbhN2XpEY60DXXO1Ci5ayZSoxtG0WRCC50+XtgWz7qgX5MRA5S+jzXCYy7O7Nn0ljVxiBxQNCZKZMTqi6mPfy2LZx76uyRUXHjnpJJEimflHDUxyX7fFg7iJvSrsZMH6Uv2xbfQNx5eCbx3oKycUrBY22KPmgfg/w07CDVsw6tb5VxPg5/X38cQtXI47U7MAGGjO28II12T+PjaXHlstPtkUQNn0DKkCYis+kVAkA1wyAJgYKLGnKD3nlVCarYqCkNIZbiVwO2Ydjl7N6iOtvvbAfuq7VKZLo0jEdw1YdsRaHcuJQulgb51JyELzYBkP1hd03IDcZfPg5XmNvYQSOINsCSn3BuLtkCPZRalK7+S97zxvJHiJCZJM9XP785NZ8B8fqDe/Ot0BS3PH1ptErwxBtpgfOj4d/41nrSjJQf9bV1kfdBHJxYbHILxOsWkZvoP/Z4Sl0Yx3bDjTF96xf96+6uIoQ351Ce6DeTwTnkPr20YwATlnhskWIddUohklNITCq/07zkiEc3B58uiBG6d9YAc4h/7s44FN2RG1UuZWeojrOZIhElvDP4KqHcOYbqqS95o7ilQH5ONJfy+aYiB+sPpn35HfHG3duLpNvBjXc+Klf4IKrFHjeVty02xPTNnbdL4gtkqPqMLhSgR/fDXzxJbSScqewiF1wdVoJ/fGL/nGWZfVlDHOQKD+/i/mqwXqvNqxtZeRHwoe/bodk66B9soOnZp36gdzVMRRQsQiBFf+HXjRcrRf9FsGghw3+qoN0JeeMvDJrkSBPsESDai/uVOzn2Ohge+UVdi050fdWpsjP0D/QuTdYs6QyI9xnhU8WT2+KBKzoZ7Bq8fOdKPeLulUhJjT34/EOnUloqus8+pzqNh/UdUOhgTlrbkuTfsaIYDm87u/GNIl3N53uaU8bgaBjpz0jdu1f59K4KFDtwUUeEUoeYx6DEkWKHdi7dtHhQF44lbysk7PqERrsuAQu2D5tDMl7kFoGdI8r/s8rMytJzYBU40wqeFvTl0ZVLdOB6Ya9E/f8VPbGx5MdpYqYMLMyB0QxVdnoJ+tgAQVWfH+jtOHD3PsjuT8dOTSrupuvHWRHQoGI1Qj1Hc6k+Mg84FAZ/gzl3SEzuGWZKFwuo2D3EiG95D2Z1szTqAuFRmT1nEh20tkC4ysmXx6JtN0taK1iRR62s2uNW5rSAvMEJ8yotr3UhJe22brlQn8Gvcq1I0aODaHJucQKVe6SXyfcDWODMw8xf+2C7Zx5a4Qlh7pJs550DictL4OxcDXKvVmLgVWRwb3moxv4kcxzm89EERJXCl7X/BziBkGQWOHPGF+6K5NFJYOFVv4+NyFq+OPMaSWZKoydplufY+CYyL63T8MCMmwqLTmAE8h0prhi174wnx7DHZWYuRJSYZ63uz97AGOzyI3aebclnud77znbZetbWUripe+AadLQeZPtWsF+FNiaXCy/98km137lWewyc7Gamai1Hd3Ls+KMMVh0R3NKTQ08TIClDfMKwUGKy/7YZlJHU3uW60X0r74Afh02v5MJgVOYkjmors6GAaDU7yKHydfkXYd6nEjYc76xws1LDLWCNNKBtUHNyLseOyNDgmHiJ41lXvq638RzDGis8WIniOb/pbTs+HsQVGPi6mxG+CU+oflMR6/qx3pVP+GPgqa0U0lo8MVmI1cBgSnPGgrh+J+m9TVg8nivua0EQP7xai44ruC5gsAVOp9bLsDXfHQujo6IpBmpfbbU8PDavZpTuJtmflVQuOImnRQ5kKoQz2NBFjdiHH3cF9QLgDP5vz/W5trCy22Uk+TCjXjdbCCHB3rJhKYTwiyQUf8xu6yTKtIwrbw4tzFgXDODmWYEnnpDupk3b4AP3qz4AZ2En5wi6aZV287AgCF4vH8TlWLni1E5Hd93vLxSYLBWSuj3eXGFtWyWpBkIeKu+YsBh19VeakA8OePM0ILu6dYYl9DNIK3kU1ybH+A5xYhFI/EqSX3vtNs6V5eQgxYLvu0hYFjiG+n8JzqLQVROiVa8XNQDYJtDAetPFSuEtGI3B8rnbbrNo9TJn/z3lRYq0ecBIe7a03vLESwhKOm1bGTk2kPMv/Sh9wyCOmIore7JhSFT9HIjonBfi+gcdDLfFt7dpShJmW1gkcXmitWwm1cC480CraHm/or2MHphB9Q1bmt/SBXFqXJdcv5GTt3IS2fRgqThhInCjRkh7Dk1iS2vMBLSGtRPppb4FEu762JehUMQxxLQre365CKoJGvJwVde91XQ+bDp5ZsMu/QHmLgITmwGXSpQFQlQBajqquxlwIOe2cyfezaSHIoRNLcwjW+epnmAtmmWA9KU29v/cA2iuWbj9ZV7HR4anhHkjbxnzKPHnIZ7Mm5wAf2o/3xUhnfH++quS20TdhalHgNhusidPKWyKWV8ZjFLgb1fX2r7ifLyUtxuKHHIfCWXQJ/DKeU61vxmPT34MTi2Q9r7/sK1CYuHVqMBsgtfenn31bUzCoyPN89KiO5wHveqnk3uyHnJSUBVTQQ3NyRPmeRKTQvWEBZ4QWcSgMyZF0RQgvUXRcp6KflF056fwahSioP622TdcTVYi4cAwSZLWDvfjoKFLMowPQpzn6ogXHc93fFA5NZmnwslSuesOyNI1EE3RM8kzat6thkmpOiGmm69Yn8yNuxz1YuuPWekoybkee106T9WTPXo44ea9E5QH2Ig6FZn716DBa2FyXHG1B+YfnmhbEpANlOi61BoGO4+G3WMJDokJXj9GhNsFqdaLjA1pkhLP+/mGCZoYsxNI+A+sMvWyoj+PMWeR8koRz+r9pNVEWT70WhiAkNTrojdr0sBLwxIM7D4zT+cVy96ZE+ABi9CqkM9VK7iOfkJVp7AqCqQ9EZ9emn8rB8zfoQZUBrVd6YS2AqiTFt0nJ8HfPGmnBWf3Xi5CgyWoLAmHJp/AfTdHB0+Ns5DlhL6UJ+O/6xys+CWVKtL9S8fVHkpwZZMJn6jVtiUTtXjywmiVXw9a6f/G7Qd4tZtcoS3aytxXYA9aGGmEeBobjiammhUaMDicH3nlOkDvvz19NqWOvHC2SMv7OQHtDIykYerPuoLz6SQNOBtw6oX2Sj3ZLITBDcWNx9CuZYYVaE+vleXnATrwn+PnuQ34jL52tp85aIOk684SUlQ8uyO2t+eIOHndZ3oxD+BcMAba/JVxRYUAUZoEw3D80WWOz0/ul+fYbhFnffx3PgOy2LLiu82D5FMSpi+Pd4EkIFTgfv7p/0vnX1wp0VpNzyXs/5S/4z0RFS21vIF67k1ERTfFuhLM/8fdbKognohMqTNF/+oqvXXLuJB7IHeDdn1X2eParLBEpz8y9CAN2g5VdE7EimekAOhkw+tTzqeEsgyQL4iVDnWrP/RcBd6CDm16/5t+I1SAxCn9wo8knzmpg8DYP8V/vHw8Stu7cliAt+G/VR4XPNZXWF2rZBeQO75os2jFJrbtkfhN9BzHT4HGgXTjyTy8NGsiQdeOw12GjYKCyxP+34kRHZqYsn0pFvVubB0+/emKRgiGXNRWQwMSvAB1xvTprD0Zyt08BjP/4W9HGNfNBcA0Qb9qF5hdQ4dDqpKAFLoIW2gFEVKOganw3M9/4WP9ckP0/g6kaJDRurtxNgT+PjvWYEWlFa80wKYCkd/0ZChV94njjGyg0t98Pz3AL2AFAhvRRiJwdfRcQqqhWkv/o6X45d5w1YLJOye3v7rgta7Ya0jAl/an42ng5Wz4S5we7n2+1W94JnpoGyV8WW2HYjKLkKmp4hBKlNtb5y4W1MrsG/wfq2N5Xrz2kqhdPQL/YoxgCQd6Y2KNkADVu7TxugQRWVuNL0BUj3JRFyWNeCmB74Wsz54OPnbq0GFFxzSkoiJ3Rtq8yEJMKvOMMalFKH7YFHKjb2nwrKVfuUUuRtTfJDiBuaEHHoX+MUrM2bBaAsSdnY5PjqcMBn/wwojQxzt2MoOCC3OEArr09ghhsj2M0mue5ntQcmcC1R/sK3zfShGJuazS+mJUeKxk5u36CYj8+SJCq8ZEv7bNf1+BywGeDQoTDGq6Yh1xW3Suwo2O/ykazTPK/TdVOICyiwK8MuQpK+FX3mqSPzxfLwFJ/iYDjs0WgW2kqXYgm+gkNToB5+jYH83Xlt0cbtEmkkBaVGlHz61rVuWzrK1yjn5nYHKvKCrBPPRth3AKDQQB83fdrbgIeIfB3iHya5NPpEyxbzmtN5Dnk7GqrQ4uu4h3QSoHU+74zs31cWqIx4SZ2bwWLvIxUtR6gufZhNZoMcmSB5z1O9TKvHMORD+VmuiqzsyJKA1OaApB+b9x6u9FTvUkalgl0r7raV+wRqimc2D7B1z/OiSagdd5UME2igLGUcgPlMSX1VsKQp/9yDiYei87KTBA2NPCUmgaLwVdvQFFFxWp2vGCY/KCUvxt3FOu6xIgwS4Vybvbj6feUCkrQPpO/wPHJPhAobSj/aa5YrUvjHMcQkDZwfc9mvghrk/PIPvcJa5InhVBfjh3Xr9vIvA4ac+m+pywS/EqkSX55xgiyj0TB1EE0NT3W2CPFdVD88P72SpdFzHS/6XsmbGtM8JE/m8eojzd4PM1bNADliZ+XG/9hbcKg6PftVKyKKt/8Bz4lGsHyT0VKj2vDGp/qDGBajSHrqzmpEjW5LXsb5kTV6HgbMcnPW2dzQju9N1sI/gPVlgGmk0bHKOX2Ws1q4aPizhcM/XiJ5EZNUK6bZNUeFaUJVTvGxglRUY7vdnoVOe0Raho3huh1XDeTlHpk/2gBjjhUQXe8FN5A4zcRqkNtKpSVq0xyw9j3yQlQxq/Lnqklpz8lXmzHkz8sX9HJjHwyn8UAjblvN0ZFIk4liejx0lVACoKvpsT9+pQoLY4weMHRzcuVC60DUFkaqLfclS4UJti5WK4FE3dYcc0OilX50uscLJomlR6pXriD6ELNNBWOSMt50CJjPkyt3Zn/xj1dlPVP1t6XExK+b3jMoULLPOrEGvjELfAMM1qcuBb0AijkIuFca8f8xapUlkvLjmmJW7RK94r8HaPzvmHHSqX9MXdivNI4A+JHy0VCe79UZZJvzMGzpnsj+Q6k3EItDBiA12fTMlSbEOMAWCdQq9TtyUiAaAqJozMzryEg0k+yVHqCc/DyJcCE2V4WXIhEnsOc5c8f4ChWfUaONhPPWogpDs/lyVCvp3m0NSfrAJKNiVy5aNC9gZ6c9BqwYgj/cDO3kdam6gCjhR+akALFYmt4ixHkWxKhDTGs5K+CwRiKJnvxP9dbxRPCBHbiVa8gsd2GuiNHZD98MNwXMdMC0MubVodd7dnyk3UQFfCIIL1osPxY0ZJ6DvZXwtZ2I0th6aqlTMULVo+lhSIU/5qO63lTSa3MgPRJEOi0AJ8/UlZuvgqLw9dyEDQoHTKWOsq+6fzoAyvIpv14fLaY+braPd6NkSaq0RClMenK1QLH87NZriUaeuCo6SZ7/CfUt2K6VOt0AjIK2jR0vorf6R8+TVzxZb+QdLimH9pU5tQc73xW93QRPMGy/gCK+R+YzmV4fHK52GWBEBL05EEoTY6OYG1WWji66dWnVTg0uPNw839p/yjLxkCfdTaH+v6hVUCd6HlROj6W8Mil6AYGC7NI2+qkZvJh/dAw/iQspXQNwwWHr6slLIp0hBHYTDh/J7Ba7ZR6cp3iU4bSXdmzhTahYDev4yKiIHyN64EANhI5OHYv1G4KXfIOvQizYWchPhzQg5eVGNMxsqrvWVxjtIbkKuHzE+IcA2NZ83GKz0D8z5zmgRnoJGKigseP9TmMS7BgAqtqyixA/SLc1KEUWrhXOQ6kA5ZQRazp3wwSa404cppBnfsS8EsEpbr/gXyW36cZ9pt1RhzyxGxDUmnZeBz/Uf1AP+gyLIg9x04u1fThm2w/H1ZXGvVqsO1VqutV5gUhFkdkwoCjzz3F3FUr1v0njGYT2mSZYvoF/fSd1W11c5VIhkEO06US5wYRmHVPYXmZnbK5YHQ8pkIDJ0yqssqFK34CuHE8RWb+Dr4omk779QOOcYomAMYQ9ILt2KUk2uNlahW/IjGtenuGLxb/t3aFoVz4oNwMZ7iyp4td8mdzgJAfnCcYtklubGAUB9k6bGC5DSkf5VFarnGEBWz600VGR8QywZ+jIYFZbtKT2QdDOYP6k7D8qVgEZByGmRedZRWaQDTggLyNgDD6pQwEeSs82+hTxWypqwU3zuAWqfwil+mytzVnKztyvMFJyJwPFaPr4Z3mTjyxCR2Jv674JVGGMUSWb0l+GtcYtd+NBGChwr8mB2hlyccget9liJhQEb0XgXfgVRlHlbO+jlZ9CcAew0Nw+tRcWgNnz/GL9Kur7RohRhaYZBBmQA6JhvzkazHRcdZDn0zDkfBmYP1PfQjP3d6qqx6gE7vrb3lBKEfK3Y/nCe4COdpr23oZCoIpssGXmqE8CGpO2bEwkSN6uqeqR4UtWR+xsgOzNeR49PTLJpFEAkXha5YaecJ8t/KR+eG7/HKV23zPZAMvHDC1rdxQ0l+6wlIgZbUybjBe6yusL7isRuuYYwg4+8+4lia2ox8RCdvmXlt00ZshBnAIfLkSwIqUzCcsD/d1ZG6Az728L4FCIqBKpbA6bzkJ87lYQpbaHpwPpqu3S0UqNDCwgg3q9MEn02X16E4xibz/rLx7NMDtHcwMOt9r1dVU6Hws9TvJVH7THrnSFESgN5eBy53Nq2Fdb8mySTxz5CitvVE+ZjHaYS3hq9Bax+uS7TxMIT4qJE7HGdsHM1/9uPNBylhP04Lck39JMe8v2dPOSJzyQoy8m/8Fc6h+X+5/mBVA9jAsG4vmx/KdUW+NXxgRt//SS2Ib7aGILsjOz+ZZQu/NMeuAsP1pFRTN90rqIVULbJ20ZJlrjoZD1VxHEoDFFGVWCVOT3jGK+vFD06gc3yDUSnZ7ZHjGmw4ZiAglY2nm78aUpXxI4BfUHqL6YQKFDCazUIryLi53RczlaTh0ry7WN4WpWK9sPJ0J49fu6RGUMYZd3+NrRvEdOrS5n+EJOTkr4lNzo8vawcYnR/n1Dq0rCHu5o2BGBEHABJbsFLi/mlWFO1MjpvUu6UPJjXlXse6MtBROT/mQfyegWGmFRQ7Q/O+rJp471+tQF10+bvkExfBoTQrewd5UwhAUODpyeW+aK6vx2AroUo2bGBZ/ZjcsJFfMYEMsm47LdQSq7T7peI2Ex+4/9oIAJGfhidbXA9UYPNhxigFTg83CETNYfYVkoambj3vv4MZNtE/wrIfTguBNqkQk9ebLPTmY2U4UCzbYqPKO5vjaZXeVksobDAJzhVjoU7p9TdFmNMyLyCQJryBSOcm0hFk/pcwcV15KZ/+IIqeQGPkTbiY1haWSnuQYBeyW5uSPHGtYw28cQS/v3rToNAUGVBSQ6zpBt4CHvaOfEJhuDJYZCcxvPeOStdCzaoSQn9nDe8wDc1MXrJ0+9N9TAKcS6u8ANLCLY4UfHLGf884/LFIn4OLOlRcNl7FS1IJgu1/vLm4INkgHt5ISp2vC3MFJHz1zJnopnKS1AgJtCmhJRZDaW6wis8CJ0KAJW0Yy0+kWI3lJ9N8yqJht68FMNVgkgaAGi5LuKmkZWm+ztKvf9gT8hJrXZkM/QdHI6wy9BqVeWa7g7ZM1YLbUv37YSnLmGsCrl/UVi/tG+fZbzY4bGye0zH08VQpGmyd/v++fS9EtasmbkQEIYnmLZLxO+tNHp3myIGwYBZVXjlWvrCiQcsP/Fu9l0HWmLBu3gvuJ4phtJsXXllJdM8iZIQR8Z6zEMs+cqVL7+TYhxDd0c0l4sbyIEw6N+V0v3ZbUlidyekdcz/aIomGdZtmdI+1QUrrHw7eDXT+G3zbTZMXxpEgJc4zY5bH5az8eHzwoo8QUleUKpVRrsErGmSF6GPJ2OltKYL6/C4zx4rHdcfsrQTcWBmrBWMMiFiU4NGtpYeACqYafRyu8j8x7ltp3nxVbsPO0MSoaR8tv61/q+YCqHX3h4vy4HzjCYEl+4ZDtj2+mawuj4J0rBpcDw+spzuCQ2khFbks09lPGxK8HYJl0Y/lNLUxGLZ+2h6+EFSaD22bYzF7dk/EhCWh6u/v1HUVKC/r/Wl6JHtd1V68J9zdOTgbvJuQug4r4vUV3JJolQQ5tecHKqcNoYjOIs6BZTlfB+yHGfGdxTKsGxbU/4taKuH8Qpd/M7fIG5zebrpiDHV97T4jiUNt7K64/u1e/+erXV34aOjfddcKNO76EzIf1pfD+KivBsRlzlsjj17aDPq/lnKHQCLsD+3TK021HNzhZyuwpLRKS3KE0XH/0TqUOr3VqLMcsSZM6349QJDznPG+sUqeS6wwMWp28TAoDKdmjzW6f+2au71HsOzLIeWencRa5JapKkVTYpvwMIC8u2L+/hYGJmk0588rq6Nnqe041NMzU6lj1K5KmSj0ZRiVpzu2FSTl4PBYHAuhe5dtwnRQwvvNqIELVxKMFWedxxB7UO4zpYRe2x0zH4X6pI2m4g6YdCs08vR9B7omy/goQUYbUZA+wJamq7/c0FhkNm74Mp05NSCK1Dcy1+9qp82p8XVkUB4+SsVRJ/Tqtn8v2esmemr7zjCfjLicMb05JqNoL6zzz0KaYkXeStBrF9+T7EbZTo2Fa/wS5NhJvRoZc8QUfS46HX8HIZ8A6LK8zKtROnakAnEEFoonVlvYR71xYuBAXbjtxfu/bteN8WkArB3//qp+3btpi2SIMyK6rX03iCLnzOd2OrPnD6xqgVT35e6NUMpN7EJSz0DRRzyze1J+Dx3cfx0M577W84qifD51mZG8VNbBf+5PxmGGrGOmkO+Q41YnCkx51D+X3CXsNAjaz/XfcPJUXJ00vaQyfYDtmFq4kU1ZHdnep48T4IskzPsYT9or3rd/ubiYLqeBqjnGbuNWb9ZdPDxkeBmJwYTjsTU+VugQmtz5+C3QBX0piVh3d7BK+Hk4mO3q8qJVQXeIqs4hKuRvBfIwwUyKg9W1x8dv+EwESuk2Bgs1+Zc3wzx4eGasynWs3V360wH3fKXZFTckeHZdgtzTqcQPC2hCHhSXyFMyljvrneLE+c+b/YQ0XcDBam1oAPzvKmmcgER6AqnyC32Ic4HMP4FQN2rh4Y2ntrawByV+9oq/Z8hdwQEPYRYiELBCnuGGXDQbl3ZLuUo0vfKU/AuMwYfNXmNM2vkn/GRrpc5WDP+MEL80tbJDZfDNBRfpfcvVpf75u0LrkIIjnU4adaolZWzB2yjIVwNrF7zF//n4N5xHeaGc7Vh1EYRdc0h2l23qFvLBNQ5kHbmX8Yta2Vj4DU6eBN3XyJBvJf9iL4x+hw1hx/7Ej5U8EZr/Qhgoni5r9PxBfU3fdvXICGW9DzST7GV141bvyMDXblFG5PizNjJUVAWNSxIAStz6+eDAbkYeAKTj6DIR6ysFvZAloBLCgSdMFd3ol/WXDQh3BbBtLqO9hp08BfumZjLpTJGRAIHzDizXZfhbgqejNSS27BIXQLV0muwzgXGqYt9McSvtLWo1Fos3k6Nu2qGyFftqQyDz0/bmgvtZyiFce/SLYnjt2Q9BnlmUVBWOtbDPvUgOSizvJDhdiSkbLLP96MJ7dKO3eUK2nZnpb4s4b2XGF4T6gC4qo9TDv9z2SY4Rffb/RjPs76P0YiWADpPB/nQjC2tDRlxt4sdNCIjmMsLgU+cr8cpyaMSYI9maP4HHww2jTPkGKvF6H6+DFAF+jAZKT9oi23gpZ2zavE0xXPkF7a2FTNJ3bwxvsJV+o0fXZAkmouYq6B2+6ccHhnUIeL10QtZaPoZPJB7/Xry/2Nv+JJFmQ/p2NSiO5bYGA8ej1vh5QlWhaX3JMs5gMBnyyIfXIMf4im0WEUnCPAJzq9q04Tmxzy7nGKKEf31kAp6IFk95aj0AogL7iljLVJlOXNvV7BwZn4dKfuZweSEZBqy+Mvual0TVDHiwHuIuXbvaw+OkU7aeAfck0Hc6H0jgt9g6Rxb6dAuaiKEN1cUYtD88y0b9Arq1q6ML9B20/FunTnZNF+IHgsg641FfllDFpQ+dqrIPKQ8IkLx/2ppx0ivQSrehNaf5dwtBjnPHroRGzG/RWOdiW0COPzepxIqcsWjhfmBXSUD7YCvPm/qTGcSnhcriFKew6a5s0AgK03I1gEifX6y90cJBY9REbQ7yW/XB+zAXN1XZQVEs7r+0ajtx8KvVBKJksKj5YFGdhEennMbwgCJJIMdt/pJD6FIcNVegt2LiQS70DAJeiNNG86dQVNYNZmYEfo8oa002xKLh1+rHlBX40iY8Wlv7FqswQFktpyLn5oSdo1jBRz8V3aRIOmhSnrs2wxGwGBEVEXvRm8RZVvSQ0xlKMVWs9Y7nnmJ9jEVuDL08D2ES3plzvCNP3FpKQeSknFeVBXv5T1Yk0/X5vdj1J1LYa6Ffxxrv90ObLHARkCI+tz6+0i5cZTinvgIYLMVnV/OL+m4RCsTy/+9VQPsYv6X2qSSlVdQ3KM1SOntMNUBpb4C0MsDh10xHQ0cbJK0gsR6X93ru63BDYbRZmPISt1casVwVVE7+u3l55XJGJ0Ev6S+2zpNqOAH66RuzpVskXE6X8x6wHOfp5PAI/7YG3Zozh1U27IXGEEKIm13Rt/nTE3pKWA7i1NFdVQKQ0CNdqEsBkjiuM41dd5rIbR4DMnoDva07v1esxYBGU4JWJUJQyejYbI9p7pqjrpHZUNlz2exX1lTAks+WxY6CExoPlSlNNv6AIsE0VdPmHOj4m0a8bigDelTpIL1WoePLhblmhRlkPDKiZvkzz6eG8vLeJjCGJL1+VFa4QREBVyuhcpZm1ygJm9kuQ+8v4yEMw0VO+TKee6sMFRVc/kS4IirJupnw48LoR2aRk+GuDBZ25xnKFxdSYqZqvWlEcemsbzl7wvQg5z2xKxEUsquyGziyzd/X+XFl/ct9KRLzyyb6ComIL8Wam9x6LPNZXvhO0QQZmQ8T2MFjmRJ42WyRzfyLGkJKft94uO0Yy6Fflo3AoIEon3XBygpi3Je932ToU5EKoikvqkeLFACpsBN5dseemiMdHxOJKrVJDdTS0qCcTzPCyz506oyENFdelskwdghmUnWyXK2WeJX2CBXudNUBON/i8kMdtJm52REvmGqVmxe5aricuTCGLbgZtYvigT++E7xltEh/ZgUoMP+d8vaPU/HdhZaUjsgQ8OoqZeezvNR2JFm2on+IliVyYQ/58LmZ2stgKoBbs4SllwiTpNRw7ecL2WR8bbg05aTN00C8aGWtReWSsYsirJ0K0I97flI2gJRRN717wESryWahXUAFZAdyD08j9SIZQm+wq5GkoUkK5cQ3wk1x01x4fKLPgPIj6D6lZiylqvWGtl6KxCfoSQXlNZIHeDsrIRqhINxdrCinM0iMMkveNxhqrEzhnBn8F6nXVY5zUDLzOXpp338I2HycFa2pueObEof3HQgFEMnHS3/CDKwJAyYl3HyA4X5vXUE8MMa79gYELseTf0IEUJRsfSa873vl6n29lFq+GCqF1I+mB5PSyLFvgHv6hG5Hd14PAHTKhY+xzCgOwwRZxygPwNET0UiO9ynH0p3j7GAFEs+VSjl4ArhHJbySohRLfm6B7FxxYJLJxJlQr5UdD+5Vs0nM6CehSZZNYw4FzcpYoL6nS+wGGSNKLVLXgbgvzAbT4B1J4GMS16IKMlo5S/dzM/NM4NI+a1Fuk4qwaewoHqGp78vgp+SkuhLyAVhI2Or50Id4LlHwRon9o7JT3D2pibchFvFi2VTEx6cLX/qorW2YGSSmnu9+M8teW9DIRH1TfabuDIuLk16NFz3kNr5QLPGAd0JzN2IYFA140yqfi9LfBcZI3aUK/Gt2bfMMk8eqttN8c92OmUYKUaHbB9C9cpEwaOYs49MztuGtI0VMqDDHN8HiRP55BpRIJtIWbSyi0/LOC94XhzqGVyuzaVaBfg0f++sV8wy7ytxlQYA9w1ejE0XaCkpM9zbOrymf4OrEaIyQX84Z9e6wQ1czIvOihnSaq/fcFdkxJcMzE2kWcARwWT1U80dW6B+v6HdclWMyMWLYr49iKWrhm7o1yumJKxVGiv1Rx3Tw61jrh+vuNjikpFRxa0F9G7ZWs57nuhaIeT8ZRjYzuyq4WZBEXs4CyfvmZxGcS4/G2aWon2O/UkjqrfdbBUF0yavSPdNJacaaZxFQNejGDPK7SCF82XxiahbNpwFs/t07gbCJkDUvvKjqaYv1SNJBa21RKsOuGJNKO/F6HTjc1Q5t8lqLL4e83gWTT4aubYGtE+D4e9zdPPo2R3dvG7bDrCQosp62YhTaV3B/kEQGqtzvu59fbgA6lFyGe7urhYr3TWCBFYBmrEpB78fWnXUEd1z0LSzMcWL6vuh4CJYR0tg1jX4H0wkw9mkbM07MXopLJ2Rt7/aL3Hl3MjO8h/1lqNlK74QTbgkurmgd23XflEcMhjO52Y/Wsz+CqwkBCDN8SUcd0hvJ6srikURdDKw75ZZMyms8NdzvzfsXreeCzpVaPKbkgWo0BlD+qWqaXziVa7YTSezNkCD1UBphMwE3IFwG3+Oja0AILbwR+VMjirrIkRPt+DMtp+OKLpkiE15AVv3jn19brZGZkhhAsuT2sTiWSjLvxJkMICAGdQY6CcJ1bmQsycrXCCxoxrME8B5k7aYQkl31h4kmnvmUA1Uo5bGEJkzebQNuMeVIRwKr7shM3Y3iowzuO8Jm833ALhjeDbR9i+ajGdiv5nuQcBDW0PZ0CB/GHvnmE702e3iEmWKin/StmkbfvsVh9mXnjLzZCRfht3g5Fu6OpDSsq1DSVUie4hNThGTSTWkOhTKbARv54Bxp1m/BqW0CfvfUJMQYci+HzQBrAw7lHJI8klNzq1wbwtxf0zzTFIpYQcsU3ddDWDMuciKmN+BHJ47B6FkgX4uR5QSWzLqgN2wQK1aLp2hgMJGqMII4rLK56VcDk89QQhw6cy8PCM19olNpuDwdrQFvP+77wiyyKx8Z4MVJNxV5vJWOwvF+aDouZMW5HNno5d960qcPPO89qYm6Zh6UO7MyFx272aWYtu/0+UZ6eThOP3s/uMGRarrYNGVN2bkl0VbM7ZArP2AnCQLuPoIbkry4nTS/RsIdFmPg98zeYI4R0RY41FQsBym1OXnJcHtmKPjfEXuujVQGfCPrCZsaT+vFbMFWIvUy7OxquIvdi2DVp3+q3E3NGG06d/cz77wgHGWrfcy5LJIzCMZHkk6m2QnZCXYVXwMsVhJI9nJcgG/CrU5lgDb/DlVEsXG06BHIuqVfnTyLdAQZYmJlEEk43pdgF69V12XC+sB9W5Tfm3jPwiHn/VmGszkYx+Er49CLbyk3hDBSKuzDj+nzCo77ZO40EIP4ZROdSwWlf5S8wfYcAzjNdj/aZ8uknw3tur126RfCzMA+cUo5mPaZL9cVp33X0mRTUIS2vgtwDRgsSSX5xcJUWR8gZbdeqyqQEEAeDu3+BMlrgYP2SH/le2u1yfVFn5JX9VQ04X9mmABR/KOd3rAYqR+OQwLWao9MXVS1y+0OKo0FlXuirKuPaY1BQbY3Vo05Gf/+N+u4rDcFBQqiCrYhgRAEjvVW9eNCaOsukcJWEaDuo/pWCYGJLadm4ssTCPvVVEJNBfVXAcTIxH4EFtWFMJUy5of50QNXNZBl+oRuFIkdbt04DeU6j2A3vzzP+IkMahLD6zBVJv+xRBIc5fODvnJMmJRMI8kcyMFqxpeWZAHxC68tGFNyl6yyGN95SwNYXwDSIQCPlL9bzjZaWNWvs5puiP2lbEBlDw5vCHtVmb/sD8QBgOhRassChwM5o5g4lhlD4u86wmdmVmhmEXnCyLeQJ0rRtqYIWRhg72ieDnqmPvOkDTWtKR38TeJwrK/7IRYfbNspygrU6yV9YtJyw3I3uEkDgbPrpcNUpISYvzv3beFg3ZN+swedqf3IVKkcdiAezu/KpHGHPyvX9oT6qzTS342/DenW9ctM197UfFl4rk21KxSma1KnLIWlGGasMF4+G3dxTnqBscul4CqNda6Qy8ita7HCzKlYa86yljm+HQA2B5ArJoZy4LNxeT9izFuQhEoEhUTNJQj2pCc/O44h8GpQX6XgpaAvAQJLVNq0yXGFbzb3O54XQ6sm557+lT3A+VWPyCJn1MLbsssHIdFhJcMtBFQYi0bS+exQ4Rq74xNE2CIRSzi3nj5TNy2AoO0gdyBC0/2iH67UB581jmM92OHqgD4EzAzyxDauPnlIdZu0nWwB4dtxWN+meq/faIuQpK2hoRP/ULwIJ9r3xyxtXxfFwJ3YquXldSEnxoPiYD85u0OAHvKOG6+3eBraUiOgvdfp1EjiroeSLLFutuPPV9XqhAReYPaRy87OAkV5tzSqvyfufCvOMTtkpxApWsJ9n+cNM2uBWu4lj1oDjGasCfCt6cfgCzh6UbZanbL/qCgf/iHjKYaavIiRLJrU2BuzdsP97XHkXLYbbfsHVTlXSohKOXOJ+3LiR6ix9UFLo9qieejYk+P4e5wC64jGQLSxJzYt3cErx1Rtc2+xlJaEBynLN4hLl/qOrgBM7a+yswC0Mh2OieA4SR6MfM9WK/FOWbVyoUBIUAKOhhIZp2LOgukk0/DInn7sF7dRP6Nw77MaAcYg6k0gdjQN9/1wtGVSBm+6LwkI+xfcK9l+JiWepXul+/EEdV7XXp/9lUsW4RQmIkda9H38FJj3EYJTrG4hEU9YWtNd2lKI1683cXFVzSMkh+2nuu9K0JUBoAnrYkKVZpAKF9G7y5n/KMZrP2xPuUFSOaruqriffSEX9Euj/k5dgewEyQCFTif83LhkIjt5qJ1LyI4ynIznWl1SoAdecEp+I5WmKBB2fr5yw33NX94q6HIP0jW3Np2E0r1f7fUjqdxV+iCRULU+yAwPXFvTL7HqfFLj+wCfIbOg+nsW03rGTf1haLvAZA/nC52pSDnC4f0qOiA6WtK20BldZUaA6GO3m5ZOCGyemGK4a12hM3BXnbladA/yTRV+pH7IiT/9WOijGGNXzV+K4wmdmRjU3It+QwUCRat2mGkEHhOcQY06pWeQqBGjHkWcceX8/drkk+tYysHMXVk8hLhLGjUVgivK1Ra4K+RtUcZO5fkVkWQ4W8fyo2tafhGEDSsflUH7yj8wsATBE9YpskR+r7Ac8xqdxtEAfRioGXSprjbLI2DAZZz9HAYR7rUHzvh/UPpFvrLbd/hFf7sF3RimWNpiGsQRZ11RqfZkck9IJu/FPU2DYr/HWUdskJHuLufXCvDbKn0F9sM31Hn3zIuAMTUc+tQsO9ll6jnNnW9Ulo7d32jEQMqJIrWQL5+Se0a8lKRp+XhYp4IfyUaTRC58vFEjKupeFEpU4EOp1AjeALc7vZV0ovza8QSl3ru6xFpY0/ckElMOChkhLWSDHLCKaFK/qC/SIfT50GJZnkCr5SgXZRddXq8Gc6XNjIzSdCF+9YlUFKMiri/sn1Gp/dEMhARah97GidLqitLNBlF+H8XoQmdrM3GXBSCN6izNn2ON0OzpCxOuM917OZCw2ZC0DSvNuTOFCGGYf1TYgUbgK2KKc4zm/25dz3GhVpFqs6x4yhZBbiy/6FD1vXW/aIcDiSUoIhwrUtxuGGZijb47Jz8JfUTblzx4eNPbXeYpygkQo1xXonjeouTuJvAH/zH+FK50zOLAtbN9AO6xjfX09CsjKitMVlHWmmQybLoBHBPkC5IbAZxvs3cH1VAcy2X90WL6y/0SXNsGeLBdr1OWVuYg+/wUNiR7QnP2ec7jNrZZOosT6Olwn02Dh6zSwKoDnMFLfk7lBO0p9mWjex7gEFXNfxFO19qmaoISUZEgdTuy7sHgrD/36o3XeFdzLFoFnOJa4yaENBXdTSmVZacz+5IGdVkEgjQt/TxuhNGHGtQuzNDfM4iNZ28Ly9S9WkUGMNAfDRLr4ipZkJxUA6HnlOi4Yb04/Ze8rB+HEXpDGC5Jpr4fN62LQh8o6kxknE1P5/rNmz43jehFlRUvCyNi3Y5St7lC7a2ogCt3Za6M7AshQdbVV2+R2DuuiLEJz0MLhnn/1/F2Z2U3h560PrnhR0Gc/5GW5DwO/DGrR/4PvL046BKjUp1lfrtKfE4osRTS9/oB0GrNW3cYgvhU8ld61sHhKOf4P94t4n7h9zdRXDaFv4ORPHokkY+NA9QA49RmsGMfJLu1/RXuluq0J4fsUUBoa9dL9T0yDJXvGtuoln8aYrNzoapa7E8cR73/wX6KwBPpwCUUlxsBtOj0rnca7zu5FqJC5W0U8Yt529SAI0S6nmWnS8zguQLRzf/gRLaqSQ6E9T6Q84u1cs56dzBMv2eBG+zAKw2V0x1NJX1gC8M2MYZpScdXEKPG1442UFWTEUlkM9OjbR4FurtJNV4IqEu1htlgltESO0SeZMHZ1JM7bNtYegevwPSCmW+S8uEGj7FTSSV0HbDg1rOnt4Ws8DxqN2T/HOXNd5NGboZ8VTSD6g6rLWcoWOwsyeG08GPG6KHPiLRunEdTPNmY74ObRGT1VCHP7nmBYmjnH+kqK6rDyrEoNjdqc8uG8yZrHWBXU9weqD5rpQ6S/annq7P/GiYepA2ZDdJA/GbdxpHYatPgkXt5sop564gVHZamW6cq/cdADaLCXWt1WgK7y11WaQR90YOen8BECQ56pmJbLvzzfWBhUUJP+dAEEK4o4wZv2+IBAFEdNkNF3mKntsLE5PDLA/IEiV0rziyORzLJsoxRMCQV/HlpCkXsaizcHT/vxU9iadf2hOkKehGum3973fFs7uRlqxz/oDerFL0617PqG+VYIxjeRb2IRLZJGH8vp8ITzF7U7HUg8Crs3WpVY5r8wxn8tzGvUUwY5csVu15Vmm1xcs0UL/lUCkrOXdLtlaa4pHLeQgpd/vu1ZzjMOcgzfQaIwiZK+fMZjRLAHUf83TSCOkovb3xPkD0jElmb4TBqFrwn8G4KWr+RM58qhCnlVimQ390m8YLz+fNHbBRDs7GJgHSK+v5Z9cwZq4glnR2eTjnqTy8Wo7BEg24CL/RT1AKzOIE7muo8oegzn8R6qab08LzTcbb0ippsScfjQoJhsr4jKG2pMVczpCYqptZcGD5rxTHFbL3+NDnEUptRMyARhF2FMiM7pgaB/IpAna1AHa5EPt7oBdzMGg7kOdSOpxrPXbdP3l/+QCfCLMpCsxFd3VAxA/IPVvK8JaenCYCadhyZ6rJeGxTUh11+OOAjrXIJxb/EbIy8rv6h7hywPp9ZhPCcgt9BN808JhGIaKwtL85jO5nipQyAF690xJ9A2DMuCx55TSG88fN6rqBMYDI+I+DtFmoAqJB27B/xxN9xMLnQwLcLCHOx4GIFCq3/6i7gwJePjoG/HKNb0XjhuEQmYFzTgtt/uIo1bBX4C+y1jrb+R0mRj+RyaDkRus8W4WW73qbcjpjIh2tGUY6KJyhEaKiK+LHG5euQeYZO4zXoKbZOWiJTvJNNVrWugpXkIIIE4zK/g4JKATQjtaC1qbJ6khaJHxOTS2goU5zGyjmaPKvVPrBh27E7E2iZ/6omwpBARV/9EKeU1m4Msz8Q7y3MzEF0C8VIIqAxB+Fk8qG970lhV/ZIX6CsxiHqybemqil3Qv/cWKm96fPoMJWSA1dcF03dSwSyNMdvKKBCYVYLuqr2pISKPaNRJJw2R43RNE6avh/TNA1tGJ/ilW/e4LbOvIh7cS2OsbjyXcD6WS0DYaDa+og0lSxehZQiDSt2fVdtF+DO7/cEUAM3uju47Fl17rUPkRPaheA+6/jpSYK5Nh6rSwO8Pbi1y4/L0L5SStva0NcscpH0pw/3Y9+Eqw1SDVvRn2r2d8vRC6YhQywdhKWraKGBMILqjiU2l5d3jb1tnQIwi95QiTJW7MAjJD4Plr9FGRGlM4NQyAiG8wSAKUbRCpmxE+zk9YhXjiC/Rbt983pV0VzovJW+90dH65IOb2VS+Wk+MpsRgZ86uEuxeGPyB++07HlAwqFjq0sm5Lvom/rcHSaLduJrDdabujYJRWbbY2QZptvGwTHAiaqsAafE9NQa2oq6hV8+E2YRbdEcrirxyx9JVWpti7CsFfA/egMevH0MR40/X1jQzMYbw6mr01MI833RiE3EuU79cpspC8tuN6QxFB7ExHF8yrFQ4vRniEkTgKc8kT2tC2HgNJJ+l/FwYXky6qbHj1cMtBGVOw3SFMHn5l5odYVrLqhL6R4DujKq/CEsEj742QjUogvrSb9DOh1Mm5Z7n6MI+YHii3bWp2abi25FJIiX3GM/137MQVr4wwQ5IQETnYx0CoXX1nLeqLjQ2VlOulhy58iVxN5d0Q2TEV6MPr+wA6lluGEC5890db42elDUvTbbMcjHGrT7WA4eEhNLqVT35NhLruSPkwg1UCAUz94Dj23i6dqS1MPh40Oyi0W+wfoWYXIw+siweU3qKdQM/IWLUwDjgMQuiK+CTyRgR/Cg+XmfazCLiF1JChK7C2x+ROCl4t2WjYngGRxBWRQqqrNqx1EesLx8Z8GOimBJK3Ip3O0TWp1z6fhibUBvCtBpCBH7Wz0MrsYEtW/6gd/rLbB2IcMxOrxgW5u+/ZBOjd+9Zg9SRf7ln5tqXgM7wZE2rj4u7BOezWvuyca2TpJkQOR8U/bR+LRjmN6RAS7MCfYSPtJWSbZYnQL8vGmJb39SyiYiER2Via1nlShjJEe3JgCwTOTiIQJ5h+NQeEs7qWkpIDJiQHb7VwcR7T1gLGhKAqUT5DPO5zvGPny/DOh+Lo+Xhxf5wTkF5p5yY0vM1gw2UZQ2nhCedQ+PBxACaAeuBYTyBs9aNWvYATPBLUtXJ3H/+rMIUQ3Xz5MJKdV6OhLEEK73rb9hfjPlA0gKO4j120U6VHh4AJvL3WqjaY/KCbwpCzUCADZmnJdpD4p4U5ry6/YuhcWXcVV4dFm5J8qADBWw9jPITjUtkf0lhIJkzhXLTcXQBZaaunvCCxyWh6ifYzNTTCGJcUD6DyfGam2zj4qdBy7DwBaL2S2IxicF7F2ubPDvx0+DEQVydAIF4Utn+/niyxDQpGlaaG5eRQcfYEHaZeHBOfZ8x6KnSsZnB8YZbLVBcEF3Mv/87cj4r/BYDYAaUWrrm/rWPImSVpvPlB3xQvVG305B+bCj4kIW4ZWzFnX7/nApDibPZxncAV04laDsD872g54z55DZylkUKHXF7Y5iFwsc0HDovYpJ1P+XIAb4pKZnw/e2BrTZn6jCeAAvAt6Z8EdXqS/KoRwK37xhZL7w17n2PYpqnoCtRAvnU/CocUq+el+PFEwM2GkhLBAJXvVbqxBMfPWlA8XMNY1+dfsV9Uy0C+WgSzcXw/ylN23DlELK9DPZ1nzFCvyDWygh1ABv0LXhuVuDEraYOrX0J/NpbYoxjl/mfncXN1DorfumMjOo/dWEk/OvdZ8w/66CtISpGM2htGRpT929qEz+kRM+2XpAqcSS9GOrLWVVUVIm3Ez/yIqAWm019Td/ytbE6eeYJaY+mJpelcp0h+4Y1hmcF9J6cZQEJi7foY8n1psVTCzE0QYMX+ScYxKxb/bU9eproUaSNTxHeNhomtba4y/CfLAZYXndn5ndeIjFIsRWRpwX3HwrIsKxRgd52tRs/iun5uy44w8u2wZgayiPbOTWGXUn/BDqak5EZebXbdQHyE0yEhUO5HcDnE6xlAuZFDSKLDTTZz9bWcfe1wy8KhSOwh15cBRibt+faUQgl7/5na6Nl5d1o7iUWTjOhjQa4z2Pha1PNGSn0hZFeICMKGtHJ6EGQbB+HF6+M2e8YSQjJ2cnG2SVpdzXlnkzxYqwXv0s0WM8nggSh7Viq5joXNiF3RJ0A9637p1HFJd2I7GrQ4ZTOWRi8jcZaL/25Pox9feMT7VDPV6TT++0Ri3a1aLS8IABZh2dWfxnBmXDWPdvrxmBiF3eePVqd2ZM5bI9YAN23/3qVLElDeD61xvgRdjkXkl2tqif3zsX1gGp9mzEm6suh1kWL75XC2kXlrCreiNi2pfI+iWVFJDXPd3MBNp7VSAZRp1jpt3ug1pQEM470lZXwotpDljklvGxuNeKwTuKNJw0EK74nc0d851QXL9P4pxZdM7pkmbA7IU2S2Xa/AJRP2VOz3Kyp9oW6FgoQi4noNkoHeNnprbQod8n+dQSSbMzNRZIuL/riHaxoOHkaGYwROCZwqcbK1tUnU2Qt1J+3UTvklj6wOD/d8lrZG7ucjZiCyHxK5XVtzq9lDJ4N1FvARCTUfnLeOLc5bmrtGvb8mmsr0lDDyR5607k41wzglZH1fExfmsXrEjiNLSzSKGb7FVusl07/BgeCclDsQkds2G654GVeUpX7UHaqQBEmJsIyvfxvz85+WyRaoYuQfSH9WpJLeUoXpUt7+Crnl1Jqz+eARyCmzL59OUUBwBuoQAl5VddIrfG6xvDA/RZBOV5AfwjOrJ2xRo4N42rCSFCcnOY7xfewl6tVLetiM2tGLqRLc9k/owyHriX1A9BnluzfDc5xdEUKyuwzWPG+tZGNDV0WLl1JyHPflzcBpj92G0AR0lGaMSZuKui5/LUMn69X9wPKc6FVkNEHEjHjQKPQjuFCokjN+N/6DlMscpE48IhHIa0Ghrc36GwGEiPRymXWKD/di92yfjZjDM3fdHBdwSxJRSBVKHSwh6Ey1/zWZRZ4kk+KMS8HuroIw1UPa+PDVpsSIKvmqZnZisbfHFWNW/dl9n5+wM4VIzhmrETz3k9WU3s+z84SHh2f7dGT/G5WvoisBYAgwm+pqFS0A8xyhy4PiKfgS+6TgnQD5hDEerpzgFSaMcw3yvDZ0+xfL0yznf0uY8N6APiqHdoJZOWqTPnTIbeBLc5dvFdh+mvD+sDtl8BAWzYR7QkSgnx30Ru7TH5a/g4byacurCNvG0lTgpkj9w42uqBp1zMsKr2riOCQwfCRKkuSX9CGADOYGqCHh1JUsk6RwvI9OvM9fCJoL7Sap8NUQ7mAvdB2ougA01NdqxVo8NeGta0R9C7QybiN4uAtDxw2zLTG9+0we68JkqZrj9tJilUV/f4wOLc83GfstXOVF2bAJ6zf56YworQQEDj6QnC+lqyMkGAr0QuAikm0jqS7fy9bYSBz5hekPILc94b8aUau3Kt69QI1kFEmcb19aFQA4bSegA9/hFi61RDIVQ7iOBqViYdGaK8d3zH5qWIjed0hR9e6o4zELdXWhOVOcPCmZIYYXvgUsAyGUoCszsCiTdwOaPEL2kRnYh0mNSZGb6/kr8XfbyUdbEZ7mDBYy0yTDxhkrpIoJmVutN6FHk/E4cTEolaGnv7x+QxQIKZus8IEygpdtBDxj+lC5M6HaJ313pLDYbjpCA+oYl11ISRJ/fB2oIdDBHFLefQmF1uHk7vtSmIyI7Q9HG0qxu8QRWecP8ipKR1o4bGrAhR2KcGEDE6k8r2F7N9lNUZCswXi/EXaOlPb9fdsaw1Sspku1xrmyADIImEs//XiPqI3Jl8BlrsHf1mAVCBmlqE7usMbDEpilt45ia5CXzVqlIZ95Fesu48LEATS3dyXVEjwQAqVbFBttbLfXvX4LhaGKv6P3XBsKWvqEFfq1rPYdohHtQH03ehlVMpZ/BRCBFV6dffGCrIa7OngRAbORd6wsIcR/gQSxhfrfHFmb9Ws3Pk/SikwIvAIYljNbXbvIpKTROSiPcmBDp4hxLkrjR+MfBFZLV5I4usLY6WYmjhT2kzW9XAxxLYCELLIf6lg6p/GFgpoRTm+yQ6PYtmKVvdTHyBxv28y3vTiy+reYBZqmC7x0TDasiMCcA+TxdKgDY4s61MpZyI1+RUzeMfx1qh9MBXg1tI/HSKpcUj7+qTrwp35J3ezefo6UZiEWMPBtx0/tJyaej7NUmUHVRBJfB1q0bsw4yHfui2ZOPNh/6R2/I0j09t9QGeRxpuJzB6DNbaPTOmER6WTXYEGXq7DhzkvCP247uSz6r7MfaasDs419fVF4RAt4XoxkFRmk3sjrhpNSeuDoG5RpjE4pI3rH/ESPaF6RIIJBiAbVU/ct/nKrDmBQPBYlNob0WmW07GhOvvz0m/BXTsPB8qA8Iesm6PsDuOLEEm5+jbniDFyXfndwIXHgWBB1GCyGV52MU+5iXguncQS8T+WyxaPDqCCXMjwPJxGObdF8mBkG2+SpqaBQkeN+1IL8Cbb72d3ySQUR/uO+N9v36KAiKVEPx8EERU0vfKi53JWN50+LSYqgHmF0UrnnHCNpcwfX8ezokGL4sK/rgFZlXnIqg6a8EJh7DfMOwMgTwRjjZ+TrXsj7SA6EaMRroFgxXRIOGDPYZgkadllrCosfuVZqNQwAY1cDJzuD4ocR7PgZYXbCA3g9Jd1PRx7PyRTNad56qFMVIv/9AYYd32opL/KQOuEa2LIoyMUHWsHVeJEgDnTAizkdfigKSmZVUDrztoGXA+B+9B+MYT2q5BETXJUKRLiEw3upTpXnlh7hkEk8/0D3rV1lUxxSlnDzLfFArxdnXRhBNu085RxiTwTISjItGPuj0MQknBfLTi9AeLTT9QUKRG7bxHm7P2Kei6fVAeNBP31q/OVsTuBJZfKaxLodsCxObxFdyJNLV2tAt+2SCAO5/VWcDOd7Or0wzbVGwbXJr73+/PYn3VfNQ4CSxdqgXNPWDqh9ZFVRQbSeb+bFmOpdkO7C70y6dTSHVuHlIY33/KV1QHDJ226atG4ltS4fk0ZNDrmPZ2Lps6qyMYO+Wkmsyw/ECuxfXcZ0zM7vmLjkk/LsX/XG0vaL3KZb2C51I5TVf8fBJmMxHHzKvaXDwSTGiya0f8ZZ3olqbqcd2cjXM0jicXlX0cJsaB81POyuItwEiYZwsHn4gymrnlD0mfAro2YoSC7KxDdL1DQVO+0a7fN1fLkv8ElaXx46Z8EGJ/W6akIr6uEuiFIQB9fHujgNzIzAgaDEYVITJJO5XQkyimdgaTBvra1hUbw4jb8imqVpd7G9dSoQVNPatqBlbm7NLsdI/einfpw6HdFlo9bpLb/wBxf2BGK/YWhn6LhzEvBuRuBZJTDv7HV9WfnA2SyT3HV/F6f+23aOYC8rxO7QQ1FI4/0m/OAHdCwYedzx6F6TIlSh668B+Id3ZxNP3V+Z82Tt/AHYSzDsxyYC8mxyk+Za4Q6u8y70AKpUm1NPP2WMeSHfqCc5mUcG67RR+sJWZg7P5iG4FPnFmWKv1nwwk+fM0IIA5p7xmHnj1zbj89sN0hc81tzI6enBjIyPd6P5GXzsmp9IRHKS506SAEK7IxfjQLxkNK1x+M8YAYLrD1qWXqo03kTvXgYllmtbguZX1FQGpXYjbZzgqSLxcXTKqQ/GhYqBJzZtvPaYGODBTozt0Rw6/vP+hTUJGOAYcEWWr5Mqy4792lLWmElkf2k2HiF5268DSkEL2oQl+VXl2NXgbfa8xxQoI7lpuNkURcA/pNz/go3LD+w41q4eQy20ecjCwekr0XfODump0XPUm2vvNfk4P/tAVA2PLhl21zoFOrSKjd6D1AiMtz/f41uWlBWCDDY4tDRMhyGsls4GW7P8b0/dGx6VTgC6oCCWxMyJyOgl5RPaFDE/EzGGGL9XUm5X9L3crn0DvEELm/Vx6HwlGWtnfZK7dA8/zJkr9b7PBgLeFlmXyfUBxZHF8kxgW5tcxvkEz0roS70jNLvk3QNCTUIwCHnqk5NRDEaewDCzjTR5lKzNzx1RHHJNiZZJ0lXrAsSM03iKPyYNdJfMwUAvRlKP49yIx7XS9cvseBWVvGNAc2I0PmR6Xc9KjqauqjgG/Q8i16OIPtQ2Ll3qDkunTNq2O65AEFG5qycHaB2/159N4n67iMEpyNowNdkq/ZlDxsX4dRKNvBUJaYqhID70qa2Rgq8+AzqTaJhuYrqrDDO1n/0rWggrBcFsYwo7ujJZblKGamFf+3B5MTAXNUOKn5PW91Gx56gtqTqz1dYMML1dFR/KZUZom7Wky7v9EfKnYbBseAvDuBFBFFCuXnhvWc/JS4ipUIe59Ls/kL+W5lteo1xt5bkJYfug17vGw6cqrOjTG4nQXZ+RbEDCMTf5JZ4DBcuVv+tGPyucc3B6R9NMF/lc4ubulrqcBPhRUjGBILbQ+4uBJ9eUHMAj2ijfMskRMLcV5FdgqIWhiEvxNVlZSRrzTzySfBUjZHCJQtbgDZ8nRWLwk6rQKWD5aSHuJh0vBgvlNTP+a4P7p59l0FYBPtoNpiFl/dOo05KHesQCueTxj7IB6io9sqTWxTu2PK2C3ACiXWNyxs52441hxg3eco87pSRV1NUvQeac35o3tgUpXtmtl2yHh3QO1mQ55wSqIri3PtVxJ57l0nOuyav/0ixzLEq3QlLZmLb8Y2JVlrdQMjhpcC1j0DS+VHrYIB4JgyXacVu9PCRoC5Y2+p8qfeJA3OFreaabxWxz5omyn/l55+ufQkO5e9iODCdLWl2crwLrUpaMCi8EUcVXGb3Z8oBCUdwuuohn1sivwQp1O+DaRFYXIbHQibdPfq4dU8WeiYJ4WKMlNEuQr/BRIGwOrAIM3Ppjmzvh27Lyx6xK14sUHgNy2ggNG57CBbXznFP/0NVrUQef5mMdso3AJ33SJxInqYebzcZ2pEVYHYczXE/+mcptBHb4ANtGohwQabL1xmFHav/wFH/al8TKjzGnYiFLEifJHL7OJD0x/rtzWuCrDToEWPBNtRKXFZqz/kBH6gsxzy/TUzP6R+C/A456FbGm8soK/uYyafgNmX0re6fgXeehUvtDCXdAUJElJt7AMv+VMdIrrOK7TAaHo6E8Khx1rq48yOqMqtC08so9cQh/AV760CiEtSm6PBL7JKCZBV4m7t8Gbbc4TQRawpuwTFyS/vt1JBnAQUBDPdEddlJlVAfbGy+OKkohOw9BB/JY9rDZQK1o/kpfl82umHijUnj0gVqhJCsrzUxYl+ygkRPDEPZqUIo/+AtsGplmBSxL8bUE1iBc8lCtShF2iqMC1DdHIH1DcucbSNtxOF9LY4IMng4T9eTYzDr+gnOPVxWBYMambJUexTzxyvFOneFg3r4FBEHqG3QZRgnKISYUQKv9B23A8vhFRe8uNZpBtiMtXqOQlVEbO/HzkRbqVaGj4s2XRVlhO+ewkvEaTp4pNLXG1OVF6ncxf3Fq94KmGuG29LLsFI1fuX35J0TsRNGo+TCioyTrXLVEjPztNVQL1/q5tGSrMPhfJEaQxHcrnqhVVqN1gfF+JK9Pgcud/lGa+Ig7eKQpJuUN+PYhBYQ/b6ahi4nLNe5+d8rQlfK/gl3OQ3WDGWuUMOt1YlBKoX+99JWlZr6tTAVgDF0NSHs5fqbU0euO7cXKnvVB3taBFHP6/KKZCBfGqzNo6DgZgiAELh1EYOni64dmOWUuwAQCKu+L8tnTFLlL6uKkaNtO8YGlOBVU9mQFYx4aGPgGEI/HTycxYXBClfKbmSErtcsuhalOh73FnzRz/thPjvRJcRwPtZmCHs1nYjivLMWWGprl4fRUOlrCDiwNU+9TZuaVsuCxj/4DzKfcla139igH7Z+0uskWkEq/c0mrsRLlVpl8ln0G77hwK9rLKc+RLeI6KLKy3Um5C6Of3qiKNoY/7ad3EFvdP4VICsuTMTii/bee9efmKAiym0A+l3hS7SofuEJ46In7BEO+Kf597wnd6s5mL1d5zNRBdOEmfNKyPdUuCW3u/SfFQes7nYlfV/B1DOE9p/pmgK+bx+eZdZUMu44uBGlaPvej5wxU9aumiyt/uCCZ4PyO0OYfFAMMqTaYcI8GxYeHO/3tDJsJisLleLpS/gvPLbEksIm3R4OCJ21S4P//uyzQ4EJZyYmWZjtknKJbz0vFEi0zDWnZHl4kvpMSPlVI8cEAG5r0JoNN59joEsMhUcPZ1YtIDYX9cnR711x6SQEnBGgTz6d3b1iebIdotlgqE03w87xlD0+qEykcVizaOB3Z+ocaMGWybZTIdpR4niV9mDm65EzKK8VQq59iMlABk54A7zAlMdkYNmaRuWJN+bLJ7RqEZf8vrpM0+3cwD0NctuwJJA13JIJVFlPStNIXzAW4pp1OnTx3rMZQfF+o4p92WDkF2tx1MUdC14Er9l1RlYsEYnOubj2IotL4tkgKwnE219ZsjXb8PJFkzakaWhRBJAkgbR6myiYFsJgC/lellsN9g1ML0j4HX4rwIzHbq20FDkBdfqN9SUnIbJf0QQr+QxHx4f0kRekXaqKZYUXYMbRKa6OObLPOaKGft7xFAgT2pHuSw7kdfloER91zsJPWQJbkAzyDFkkgUg80kW7n7n+WBN3CMXA3lU6QR23Ipx/98577h2OGkpcp5YiTX/TikBkcza+iwBGNBi/j+GwW8tGbKxpiSNEQqUDdqfscbVMQ+OSYGoeQKSLwREfUGDjR/emc+ZAJsy3sraTZkpHFZAI69dwO1dvsOw/Q+O/2lgghmEsk6NKzmfI+OYuOG2UoagP9Le/y9UABk4VHk54+6fW891qe1yVDT2KUc5hNeePBaQwVb5BQYPt/+2xEpqsHC4GY37hXyRSGvfwYa7DGUDbMKd8vud28h67mpOl7fe4uFRe/HOKf3TFs+9RX+QpL0+C2b4R/8VfkUQOABt4tcaDV34nU/UFXBUDvPYMYe0F24AZPIWphY9bLwt+tWvmuWwhvAgPN1rxvo3hpXvQNSPsVKgFUKENrmSCjWPYCUoQfJFpepI6oqpsVwJt6IlBFGO4soABNOS2KtnF9P7E9sSLK1WWOdGvYNhxKO5/D5ACMSM3oLy6XvjzPe57hP26DKKsIbhLZqcz8tJOcm1zlVKV87cVqDh5iOgGkNIKp7JU8eBp4VRPvv6peu3DR+ROhro3GOnpo6Cdltkq395hUi+pDXzwcONA2YjC4BKvX3JGZi77wJboSzwwPelRCe5297Gau3hHdjkNfDMaoCdfo4BX1IthlFNEHUm2nTsuiPe/rOux7FSlxIwT09NqnvyBmWQYcleqlPEreuoCZRFvXL07v84AxlxNdJM/atDmCjpmzumIoYOf4uVqV/8ZnSwV78WW0S0R7AwI0EDq4B6IaI6AUBwPrNLY0eeSw24zQ6qVAgBGW5aK79Mg+Skj4XxdPl8axMl4x6nwmnAfEBIju1ssp4yr/gdi9kl+ScGW3r5NVqJ1fXRkW9O0A6JBottvWGypQioSH2C46bepNpt5dXRK28XY0hseEnW9fDBaUMHziavWy8Q7jttulrsjOd5WunqGz20rPiwX/3fdKuQgv0g4CDqGBMamo9htCyKqN0qTOxWP5MmZG0lur+eIMwtcrfYqJujT19J3dps8mrCySt1MRdmlNIykG8cIMszw/nMlRV1DmpxNn2zf3gflXm1sXSH00EqrICj29dnyNSbIteQOqjPLqBf2QDDVVCAgcCz7vER9m5X4XkTIeB4ppqaFa2UHE05QSkAhs7FkyPf40UFGlKG8GnrdKq0ZLUk9m5jleTBwhdDsYP8HCDKRE6LS48qLHD4pvSl3XFvmH8KBEmyeyNwwJzAJQd8MqhmKsdandB6Ec1bHOw8agmVGP/vvY2C60X8AnR2r2HhdkUbclW9+ozjmxmipA1AJIZnqxg4aa1Le0RHfU2vkpf68y/rFMYgCXue7eNqxoS0NkOw9a9/WcDFJOh0Grb8zYjPgaSDENIFMCM0H5OlIqq2r2FKGkaQSMzVm87r9L7fysa4xxVMD0h7CIExLBVbCe1/r/WavK3yPhHVe3XBjyVTDOqI4/90N/Cm5KnqxFrVYOHbwMIXa3GwNwVME+38OpXvNwD6l+jN8BDCRDEjGDFC+WObTdm+5/tfm0QeEfVUYFtA7gTobiCnl8rywroMyBHNClofz+W7OhssrGuos+fRhh8kBA+Ni0fYdhKK+qCZaY0LUDpn17UUKCX6dOZccCYzSsD2iSQP74pFnhlkOzACsapdT20zbjF6ZqLgELUPT8IglaX38zP6zfdyBF+NjNf247XNtmIz4QCO5iRy/GcS8jjaWMfTxI3EbUvzrprtgRQDOz/eMnyVQVbbFiTMZfhfQLeu+j6iY0Qs/QYGFdHefwzAYuVpPhVZK/tXsy6DAioLlmNDzAu1eQ5ihCnobO+MOZtSD0+uTpiOAvPwGWf52xDUHj4zbdFtZULPV4c1TmWflDGMkg/Ia6kPHprHErwFTGoBg+1D6oX8lSPdz5srAF0RbktUTmq44+USAYYowZQOVbM3BWMc603Oy9SQD3buNTgzJ7yaMBbo/pjkzVrpW5xYH0Ra11ykiz32vo4nBg9Zvm92KHWhJm7uQJV5DMPA1JHBWBMcjz/uZupwXqjoTffeHZ17N3waXUaR7cZDs94ewlhsbQrmI7/A4zJDUZj0qKiVQhn3f3AneEhDwl6GUdCBdKY14q9n6ay58twW2PRXXPJ6UE6TUs6oqH/0xgDpP3bx/mfcCUy5oo91agCPtpTfowGZ0tyw5mIOsUqvdURDhjuWLX/WIqaPlYx3zmJ3ahTcxtC5xQgKWrQskF57LaOvwYN0lzIwz/joNYkiZwLyB7Joi0CsWWRC6SapEN5TClIisNQtNPmfwKaKYb+Hguo76RtcQMXdRZWjEJNHq8KZKeg/uWWDOW6aygLP9JDrNNW7JfWDyHPR8GL+29zBAD5FY1WZXsmYfdKU1VTLLzAHERJJGTpwKZH5k0uZrDYM8zG9WX+RVDM8bsmN8cI2wKz0Td8GEq9T4DvY6FuhMsqPGHC1tkLdxuwBYP0Lu2RvjXaxodrZhKfkkIwGcfm+lFS4WMFPCz3FwWwuvNLNqv7c85xnk3aXWl49yCW0YTzTqwyKuKWSIFJum5G8BBjvxx2yDOZMh18M2WhRGX5VA0p3eAilBsGa54P+iEat2c0lLnTrXg7fzDLJrjO/213hRmT/92zHwHShntUiR+9KUWKWRcx9OrMWfefEo/p2FR7dbNWoP/P/se7JJUfBzJixcPvTzMvSTQrccDAmpwoLnh6pnsAF37U9Cakvwb0EZzywhYhfUyAZ4oAu4R1X55yrbJifKRbLIC6NaYqZxbpzV9ec4/SFSjJKEvmVGa9tHfUJayAvrPPbVHNaxlbdJOOn7f43GTTdGGufXu/daAhuYtol2y5rFVUxlDpyKCfYRz3fOyJZEjhxizetlF5kpK8kUuEpKNWnSG9VEdmcn7Tu0/U9Pho+IZiTincXepD9zQXGusmr6j19TKRCe4dmbGmRl1cDDNABYeOKT51fHc6+d1Q9T2n1UMmkd+aiSUgNIrogqtnInezaEs7HmtmpjKttWg7ulLhPvEEnGE5TqPY3iCItPzYojGET4V755b+cNmqdG6OBTlbYjDs4AAp+ho1Iq8R/eWa0/FOyB4K5JLQ/WqwpaNPuaoufHcJMEld4peiw/7uIRZ9U4otV2lACBY2PfSUUu7vJ/iZUtvPoJmd8K/BmbnNo2iumTtQxEeARnjsHdzf1JrE1L6NGFsI7t81c5GCgmWILKM5pWDA5HO53I6aju6916JkUl1YcYyk9Hwwf/waKzGbNaeXD2d1jBd+rriDyPgR5p32kxAb41vjMM5QjUrVztISMmbVDBnx2qArnLJ6ECRGZcfK4U6LCAMxRtE+Y32MobWIYqbeJLCsaF4pCXyZjPABVmN36NRAavX8RXO80JuF2m/Snmg2NL0dSW67EVH9I4fcFSjpL73r6ohLh/V+uK3786Tpz4u9p1byZEEFVjn4eK4wBNeQ7DGhdbFbRTt6/9b55EBMfJGakrqZ4U+Fgnh2uIpidUcG+iBjHE5HMRX2ZKkKLyYQElkw/Kbj2w8OvDaxd8rzWoSUnwkiP9DB4L1FBdrrf9anTqNfPehHTBlyG9cgcQLrR8tQEZN9zuxs8BV1Zf+cIk9kSStcCODphQCbZP7NYhgTuqPh967gyo6DhJVEeM/gq2arEo3NkVtX7D7mzM4zzsjwEazeZbygY6xwP5F5NLqPJ0Hxncni2XMn/GdHQmTbQF1zee4LOhZaDlBzMZLsKXcJ3sJsBmPODcSW/FKYiVgzz7wLdz0C3bFpTwedWpIZzG+H0kpS6hOFF5yNj/xUGHEQK75qxYUFuXq2vFITPVf7aaAWUF+eBV5VbBqFcUccHNaTmGaDdRTdXTurKJ8ATxX0DHWz2qNhGP4nrYJRCKI12hvvahdfR6RlR+zca42mjybVuHEEGrU2KvnHy9+mmlQDH4jYHZKC6knkne5Q28ldgrISAF0p2u8YVTy2bGLZqUkIV6zWDXi0DuZMiQhOJwUgZQNnrjzpboxif7CaCAFdxHukA5fPTubF6aLOTWCnS/EP8ZSOIyNGpkn86BVLEgxNoCo5XDdJHdnSB0Zy+5O4NQSsoKdZzikwg0eSvXAE6j6WW27irlXjNHHxiuOY/LaFsSgXv62JfK2/O09r1DMjpxv32Y457Wd8wFBf9V6i6CdLP2Z9qNFsxcP88S7N6b5FAkZAkO78T3f4mpUVnXed/QQC1AAudBr+gg118i202+jHf4m1tBvD2iwt/8PqoAWQSajReU2kDJ91lZ9cqfgKVbzge5mUlKDSh7aeClFOoVz9UEdTQyNyjj+u7JaX9DWyqtt6955fcvBJF1aKEjjPQjYV4+FQr9Fnd8NqWavBRL91OUcILzXVselzvLQtPmmvtdhkUNi8G+O+b/qcVyHvls9lJjRGbe0YWtuq9zXA02yIjtBjoQd1vY0EmEFvb3u3xiPt9Wix6NZ7ljWQVbw229SAPrh/hsIECHTLmxKxWD3/K6TUieQeqJIfpcIoOQcgmvHDyyRUevzKImeikRzg+ly1+qSicz7hh/DCm/39Fyk6M86XNkhcEgJKANNt1matUHBPuMmqkqR0Irsee0uIofjg8efSzC4Ml6OzAV1PuydANODV+SaVqKrg8qTvT2ROpiQHqoOAq3EdFRo1QW+1ak/AYmGEVA4cF99A82GRm5mLHhLHqOSqBVNF5d+tjFko2morW+bAtWqE3Mhi2uYPJEeL+puWOoJaLV9uHtQIj2GvjqEnPiF3gSNk2kq1rb+v31DDwcalu1nsmfE1n7J39uQgliDyyoBoudkZrUtnIUrDsC6iGs/DA1YU+EpC8VYQ4iw91D0O8kJIRK0Zo3YzUzYnm6vxq+9EDAP5SWf+Eyupwlhcyq7rgfu0UcsS/cyy18bZBvpooyg1q0GNkTJ+MwtXBtDoaChHEqMdF/a7GjUgboSb8jHDJrfqRhQ/bbI62r8nHoOa6UgOaJLxxg1EhXpXmkd3Rch7uNxgpPzxP/mBdrGsygnoth1z7Q/YLYJb7LwpuGREdhP+ef4imi3CBmJrq9pWR8/s43S4uxqNYHUv9ha9RBACBhuz+S4xTQTZaCKSoDHnxC8CxGhiHczvJUTlt4rrWQpu9+AvsrR2wMvwqpTTd2ETTsO/P3JJiLBUvcs0TXCPCRY2h9Nx8ZqMz8XSEqa9ByDLoNM8PxxK/62v/Wkztb9dlxfHsl4u4UjIZo5lD7knNDevOZvFRYHhwFE22lXrX+Sffrt3y9R1DKaG/GlAPLQQX/Hetzpmce0TT69U3cFZSUWj1hcJa25OoCXx3O5jXSizjPu68eF6JRu4ly0GPmihJAcdY54LAu+PeTtHdGWaRfb6RVp9zxwP+2PoTSQm+qFhD5LkhsYuT1IwWLIAUjU9P0z7IOUj2QP4sYABt2vX5hJCVUnjOBPVGQTmwyR8LSRc2WvhlmD4DMitovW8AmruHvsuxxMnY/ybXB0f6jgvY+7tMu0sJN5r4DBEBXa37SH5PepbiAlY5L6+09qF9dbg57qZdXr+Lkj+9ODwIdoY9Ogs9QXAMPBK9sNLNDM1mFaODMVpqeBBx3+/X8BkyPofOmxl+kYJsG1PP50FDBXj0A4uVUwSXOnyDvjHd5pupMiy5DyOMVDjPDi22YVTeKKPxtGz5/wLm/x/DzHO4PBKlriUyR2fdazZ8MZwZO2yzm40RwLqezNhsNT7aqhOqWBMfTbYcyVtVzrROKLQ/cw8h9MBYgLQZ5m7RtajLhjAmwWRubbOysVY9+MbTxulvSqQymjxTj0/yGmowXOk8LorLHbyciHZbi5Wipq5e028xOnXPq0SO1Ei/BmXFCr+iw4toQwld1d5KXZJaq1eDPduqLEuVRpKA9CzB7KJsTTpdrYpMaOsIFM7Wgr9Oh/caoRAohQN6A6HSrmbUuxffYlS4ymc4W40QYfauuqpQ/JTXe2l3gW1vBU3Q0CQWi+YnGMAlM7QCe806vIrrgQmejgYb3z21bFn0KNZj8qMbtk0fubcrDYYwmBhjZezZtAK7N3MQKKCODWwtmN/WYEGctudKJzRB3xrBGIXPbh2oyOsQ4psvw2packPl36ulG2AlW5rvS3xsDrZG0jPgcLNOBZVquBKudvtx5EyYnivmLREWPn30cbkfL4RsfTwuJVSFZZJFh6UkofGq/bkz/WqbPwyDk8xppCVNz7JQstijvxEWrb40THMQJebLnzyY2q2jx2SLecaR7/0b676f5ddR3aDQqQxzS6YlPvFcYbw+8vic5SAk75H9CSsEorQCVlJSk7DU5HBRkzDnV2QtTJe9fsfqy1sQNBXqUXzv+3HDVDSjlHNPKEmNGm5+zlEP/Pa0mLR8hxOG5PeuHfsO4YAaC+btxGwKVWC9Se7tv8fBJBx1n+Kox6GyPB1SVukkNQkjh9dl8s6dR8uwRo6Ep3zrpyoDHwNvpGU0zV5/27gpveUjCyrt2ZF4TOPsS/WygLkfE2dbNXsNDXjU0kggbh+REnbrOGVNbeYAoc4ZX0aRdyTYOFzlRKaGo4MoHLkMH9FMwYlY+jItBYVbIzsByLIUmu7xM7N3q4VtOAzdBtYpwYx/5yTIIJ9yh2VZWg/uPZimDRgASUeaIeF/TU+n3NBLOkQvsf4CKuJi9s4FqpE2p0HLaw6yIcFU8mcl8Jx6XPWv+eL9Uv+Eyr1QVYQfaJcVwJ6kjFn9GSZ3uvbIxaZMwi7x+nNLp60sgdzogotqc5oVT+LDsygUDk+S361me7L2BWYFkcDER/Rx+J0tgDZ6wwKRu7kFtxCpqtt19WgsF6LzpqmDlLORvOsY68JnuZgBdo7ozFmFR6uGXxbySNeCvPKl92vkVsYEYjZ70nSsNQz9WiIy0pcd4Cjnd16gHVj3X+IIr+ZH/gTnYy0JQvVtpoQKA3yqTH8ZK5WAWFLSXjNeHCwtYmaan6uJoOWW3ktmR0n9j0uxSEniCHfobcaa4adhh6U65iKCHer9DsvpoFJxkj5jhGLhPSjJ+hLddzatV/1Ocn1CE5uZoZAMtgkhUYN5zk9+VUjJxOTjDsX8kQFan+fCSw0rK8IhXNp3dynfHXSYCNq076Pn60lpsgbLC41pl75UNjAtdkXJ0OFBP9SOFxYd/qxoACmCf2c4BNjgll3P8P77ikGQPLbKe6Bprf5RR7SLTcoLj+WEriYD+XvlnCQ6gwN09MIkc6PH+xS8JfJD7iyBoSsLx/L/1AzaxG7e0eIP2dxroERhpC6jg8arrg7XQBksDHIJZIPRhy16WjWaucMUOLtxrgBU9rezETjoCtMnBYdaOAagkVHdueRkp+p0+SRoZ4ejQaCwhOiYRYYJC7NsV73oO8dwYLioC3qILoo9B/eMud5uERJdTB+L3gaZcXObntZ43fegezhpmSwHyw4dM10xfsXF1MY5XAR1XmGR9Qz8Yrc2BSBiUUf1wSye1tGQLKtmsheBI0zWEKzJu8/tdWQ84lcWgnXo9INPwDU5XiJi0OyBQbwRH1ahR14L10g9kAYWlDK/0N3VzcgYYursjTtw/2wSHmfTGJsx5NOXmMmVliBLLHGu6G0jFBLZtUkH7EzFzorhlKhKRrLqXXlXpO8crQ3CHEcZLu9XzwCc9SvkPe94gxwonijdizLHtGfLLKLF1cdtXMFa7Mf4P/JQHiBZIRXBzCKoqPaIuvh7X4/SQdEJnxbsIECUF90ZnrLUpBjTXiX4XAc3Mse7eTXKyZp8Q3Sf1S3esZyDQl+BBER4PmbGOeQ+K1112FbEeyqQZg56WiQ0jRCUmP+Kew9A1ZxSjutLVOfkpuBwoSkP4RGNoe7WrmyTXKI6nk1Tnz0oe2Vm3PjBDf8Gwhe+fwAYSAjlPra1TtCj1uu1GcdIAm6ViQn9Srqf1ym9fPIxInLxt48mCIl6DSTi4ZJ+XkJrz2dXWQqhpSF4nNWapdIjJH+p1Opedufkw0xHlr4vORb9BCJ3W8vAPdZSqI7VxbNaaOfqhI/8w7L9horVKv7MLnEr2l2XgUM6+i5Ix58xgRlYVxa+ltEdaupD5yktPEOlldMIatEHTM9j7h7hxVvQPEbtQP6BmDdVaPz2u/o7+Aiy4lsXGE+Km2ss6828uqY4y28croxcwQBaemP2+4hEA88WmmXnQTmIMFje/i5qVzP/dynhApy5GEB55hU7+jPdveexxyrULupZB1hjyqISvKscuKXOXZUnp8dPLlTkOIlOhMu9t4Vx5PLPIDK0SdUiZ95AlS0+/1macnq6hXYYejgXigt9NePxN2PY9CC0HftH0q8httvBeLZ48ootbmSIZgK7/Wm1zqq/lUDZBL6CYC5KDyLg/WfRKIQMNyN2X432uLr/f/9AoV132hvDNWvIbdgJKmzFwnqjd8+MjwrCINW480Y/0ve7EpvtXHg4WzJv5MuILg89gjdMk86QRO9Q/YKdmb+HV6eMqRTq/oudO/E6zvH3NzGgHNz/zI4Clc1kXUMDTrnDpBI2KbWe//7iI6d1A8nhX4F+4tGki7hfsA4VOK83fdLmcdAGqQRjtItVXa3J7vhE+x0h3K+fVJpM2FZDdY7gVF9ME1rtQmyQOE+F7b6vQAUregqMnIegpxtIKRhyTvfx+DFWZLf+VUZHUO+CicH8sE+9LpldACFUpG+WMfE56X+8xIB5l+Eu4ij2kBUNYythq4o1kyIEuD1kt9XQ97gS9+waaIHokWae6jm/Y8Govgmk31Z2M0SBZAIeudbA/y6RkBys3zsWVHoPxD73jIs92cougppJ3Uxf/pQcoOw/qt20epdVJgHhT5/Rg5mNf+bvQ4LJnwSxs7VE9Qc/myZF4IFBUAom49bMTIghVW6RJ2gfXkP6ovc0THTEpxZWx4zTkARVTfH75vftaIkZptS+h3ERciwL+zFBfxojqrdRqqdkYWAVmXpf+ueckOfXPrN5b9eEwl8OJWgoXwyPM73RDn5ix09+qYTUbhIRquBAIHnO03H3q5TFdSXzP+sPDF+FV61ALiJwLttts7/NF2qhFJI57p4sixeZfoEtm0Dg5wGwPCH6tc6aqO8oe5R+IkDR8TuyFEN2w2kBdTxxvejaSoap3bQlCW4svakUIjVrpe7zCbbcGL0xSe/T3hysCfb20Xj0oFitmmY1Q+1QAbHJj3MfeeZfxuvYYoF7mLnb9sF2SPQEFrRwt08qapY0ODw4ReEM3TamVg4j3BvgKWWLIeWrMXPSM+I3hBzjUn6TbqMNWIPDWj5FBYrWBwXYB71BOpmX+5iYomjHoQ7LUcQ867QRS3qZXYnBbLy/FO2tEGfzE/rGyNxED2nvMySIIs4Fx3fZIsIZn/tCkocG9krZ5TWha4eDI3zmyCQeBMYsXlRDNsMfjEEBFh6/Qhq12c9IUp606kEY5bwbG/QnU+IAyJhlftn2f8iRL5A7v4R9oAJGU2GYjNHqZUGg2z6az4YMtQyXcV9X9WBRlaYnfVIRsmuVGDhDBIoG6C8AkCK6LdXd0NgeShgVCNpx7iacd6L5r4rVi1Gco6rCBwBfwyIJs4Fhnq8IZrURn9zhkJ2FenUPijnbIom4cDNJT3zqMfvySGt4ko2KqwoGDH25QLfuWMbcuRhuQwYKgCX9VgClxETR6DM5DNjTv7F3ysG0kI8NKZ5AZDzjJnJD4VVPwVR/fNKHpzgM8QQGSapVEbQCuiSw0xjHphp0eDxZeames1Mp9WwQ2puhmhj5ql1Lv0eYJEpN8RFa01yfNY0KZkTpYzcO/Ckhbb36k9esVXSMPl1G/K7/sR9Mcqvz7tEmdFwGaO02c6azfLxlRg6byx5y5aqHXBgH+N8X+0pGSjHsaENs0tEcJU4XtLrRLBJGIFVEe3TvIYkvc3siaU1d3xi9t7TPq1L/+hMRqojqmp8jBLyo7KEuYZeOKHFM3mUkV+XkyhiFhmwxtLgSsGMbh8fE6hCR2rTOIinlmsF74yj7IpViQkLbyCbrvDt5/yX6I7Y1abrFs7QBI3D9QnlxlwbgZHvFTKeaFKcI3NvUQFQURMimQ5M+eF6vwSlYff+7/cWpYmvPrIh9BVONzVYOe2tQdAWWT5fJSYL5Upt0L6Dl/pZObBEdo+FPC4b2+iU09eJ6vb/kc2/uq9CvCUV9KB+C/CPAJdOu7vq8wf/Yxy8081PEnm7VGsIzzoFYnDvfYTUyPhdXV2yICWljxWqkyEe4e1n+SZCRACDyiLTdzj5Dq5ThMdA+CNJhV09iM2iW1Pgf2XiLDkIpNo8ugDtNdVTMEBsO+uHzrqEI+EwMOFr2gevD8TkmyjvrYH9Bw6rkARUFwc7DRpOCIaACn2Edjv7bmiS3MFeVgdj1y0Rv+v1DYqY6EwHst3CNlpq6XBW7Q/fu+F1R20aHUR5Z1LIZ7wvY0E/w99bKzAyUjG7671ZUYF6F5+Ynv4Cm0twLZ+GTrBp8VL/LMeq8XYgzYldrklMglyWJS7iWBhdA5GraO3m3rO2AorN4N62bHcpIhG8kbvIkybnRVTEWt5a5f7iIYJN61OO1gLp+lMKa9CuaUR/y9eoF3/jHgqh6iPSadglFYQ/GTsLkzIXMTFtBelXwJHtvmQtoXItuOsLGvL2IK/M295YD8SaNfSND8zTfgUXGYQRyrzsPYC1cxWOto+YkW9R3EinZBFUy/5HWXF6WeqLcPADGeJH3U642mjV9hMqA/GY+7DcN2bpls25VizlGv+FyH0qhDmmd0gUS8y90rDX+Xk6y6McJ6S7gM/DYcoTHv/2NeKg4rjMw8TqrlL9LBcLKWQxtuJxVX7ObKDCs6fNlfUj6iRrGPFdJD+ziFknCJKgixZ5RJQEQZi2MefRmUYi5crYu3Oh50a5Jf+upvNzFAo7KhxO8WRvoqnLO0wvvdcPsaVUOIcvfZoUierdTyFyoxwnJI91KCBroEodybtBGshuLseewOL8RJP+H2Oqsca/SYdeeRtivXY+FFQeTQ33eeX3DdtS0+wgHXVCCQk/CkG/az4aY+ExO9eyJRmpeKAXose57USPZEoRKo6m3uIY0rsGhjw0xAS7X1DuBTFVuo29v3dChgu70cPjpl5/xQmrPdA36PXNZRWOszr9FtTYYxG7dHUooremnYo1QnUGWsN/xygLq9TDGLLhVH/pc4pD+15uGiALFzU4PINmfD25G8LAsJea1dQlpC1s7rkYJUQqIwFNDY4Eh0dawLn8fCol/rhUCEbEHM1dJlCBpXxKfm7zt/ZpsbXgy68nEkEoLjs9rk0E9GFFZoYLZv/4qZR7nl7qBbeALu0FWvdWoNb4hCvlkME+i5nbMafn9uVxxXlpXBlOxHA7IKvKJLMXQanWkuK9A+2VI1JSDoY06+R0/g5TPJIHfO3roljfhM9ncx6Qrk66xY1H0+2UgF+oQgm28A27u9+T4rGo0sT6suA8Jdwthg1T9gojZro33dFb5pubkZ5ZHchLzsKkibaR3DHxf769V4iImNuKKrpgMMK8vcvF4YgFx9Asca63MVyNPtp5+zXPASns3bwdmsxnn1S54GTdkB4DwX4L7JXMnQGqIaS+mPgWxbIZbFcDNIrMilEIEGFczfvcACtmReTyzqnpITyfsh5QK4RKX9ZWtvUy4bWXjsLYbNV7MrrZsT82c9cmf4f8I0sSYqVIlcUYgI782imxBuEKs3OWcogWDmwlr9TGLtVSSTlyzHUW4PU9f7Wv06gLioBSoAf5esTj3FD9kKtTKQZfTKEIOcCYWcfIk4IkcfoFGKSLqsHhBpBOTfEJ6dxkBJXCSlknDrb8XJYO4/96XFd4ThAg4/Heg3u5p1kP3QG2yMuUrty2cFQaT3cWMABIB2diEu/1KfFFSKbfjTp8aUhb99C/ZA5m7h8JWsGwT5Ml9Uhw6CmNHyRA15TyVwIsOH0I1tFeVqQaoqT7wGjyqrJ9bI+WtpjMv5CAGQfj+k2aPOJZ/zLvxAtkd/Bzh9BZPEwVE0I0DI82uWK72P5+mHKig5zbXYrQE5bSNA9/gHvSND2qLV3hLPnoJp5q/NeZX7mhb2aWf7qkF8iM4HEHQ6YiYA+E+kPmfMGabHq62QBi8sSJ3yb68iTcA4YT6f+gJb6G3adGkY9eeu7XQZiQEi2fXRSKUOj/zLkyh4R3hOAX6xhT1yCvCHT2Jb9tAzSMxe0RFbM3g6b/VHgP8nyZkt45j1ZYBTwOpQIaFU7nU5focNbiclNOds9b6I+FOnBXwyAf1ViJPMKBBofmR8wg+77g5o3CiYUzQ+KdNxUo14XQc58/GKrIq3XSIefM9azql5sX7KlTsU8DGT1HlHIYnd10cJYsAEHoN0mLKcHTySHsjTFesKWsmK+siZFXhlavE6F44mweXOrX6FBoELRrvIrsst4OH+O47VaML4CK/cNrjlTodfRr3u2XZsHCcw9kXLGX/15sm10DYmP3G3387x7LDyVoplrs0pzIvfcy41eb2Ob/wM6tQNLxQKnfSbL0eyYL+RWR09qeHT/lWpCFvcISYlmdF/jMaIWDyxE/LA1tguYOSiQtSqHfgqHr1n/k5nFhnUBnU1J1eys/8qySmWwIplgfD3uNcFHlg6trf2B11Om/f7E9onO53sWHhas4nNuhBJsUn2OjOnOAFZi2dcAvexHytVxIdybjHcEdXUcp0jkab19hwZ0RddTUGjtyulBmpbfGD+4d+oynTEjmMlYS/pfoCyhEk9XbgbBf7wtFs5qleFrCmB0NrUYZLxmw+2wFqYEUy2hYP3ZxY8uhRZeFXZfhOD58zGBx7lo4yMjiBc0zvOGqVQm8d4tk1CRpyGJOGJWVU4EpHPxqgMP6hV7f0IxJugziIEJHavrZauRXe0/THYEOKpl/a4jm/fah+oAzHRBqwetjJBSjNp5LaZ3ZUNQElZJBDOF1e4muumSHF6da394Cvppq45QN1B2wYBfbx4Y9fnq5b+heTNTCmP9XhMQGniDhmdhGzfPUY5YPvTUhEcaaA2ucNDUO/xvaUVhXDIodrM/05R31bnFkjUjn34N7Aiuagl9VB9SjYsu83Ws9eoevaZVwZMC4uiZko2GtNzZCyMHRq6GKhvEGBiM1gLyvMZk3eR2dGcn19YX72JnDBY6RWncG7lGAg0YZR9lyoCyQ13gtnyBi05gPlO9yOeIYGqQrhgRpR+pAvx4czdaBMpVI7SgZMAhMSsdPUEQ9stTtwSabBmrln0uHsOMhDvi0bNRUWUmqnu3eiLgzk2XKGyTaHCe59vZZcmDkk8aOO6pTw5H+DWALBPMcCOmfIz4cF9E5zesXbQkQNDFk7vlnAcetbpid+Ce9MnTb3Clhv0lL7lyusJYCpLpalVXmQ67YNR+IIDh9vW7XeWnU3FFfdnO0yqCON1josSLVMTTaH/T3Q7Y+gOUofDwwXaGyGRB+4GRC2kk7zANlgd7PmE5kXda4IpmTbP2OqUJ/O9EXW4aslQR5PtYy3tNMamtk4Lwzb6WIFll7MVBneG5vPfEGslblvK4unzLLIvceI6WxhiZNc/nr10k9nn8ikKPz5jmA9oC+lWIE8QR4XYTcO6WZ7VMORykmWLBbTE1NQc8/TBpYSaYjlsyOK50EEwZC6/hyMiltFDU/OcVfSs/4s0Rk68qJkU5mIFxzQcySQSzLKmqQzkbb2ZlC8MLMP8Tt/ui2UK3r3IoyOWjDNfAV+2/iYAbaU/gcEuC9PqZbBCpHpobrsMSJpIpAbdk+lZArMaQfdQP2kY9Krk6TsjNb/ad7Ghc/HTlJyxRISEoijGyuLhUJB5Ch35PrR1oibmRE3vvhC5cWj/AFFMlliT5ELHoj9ieMLEG0BOkVRUXKuv2bfaF8AdXORnzTtMfXYqB8UVY5TvybX4Mkg9YXaiDDrp7KV8wVHpmx3MIlmRkznG4Q7DbYNTZBEi2yxQfQW37NrAOyCP8AXP/EHi/BLLFg/ip1tleZLojlnpdzKgSmJyi4IRDWNifCtFxTRjzh2z9DNa3KUZLZnixrksQWHwp2gRkmuu7HYPHYIQrdjih0WnNb7CL7hFDLjbfGaVLQh5Fu7SHtZTqDYzgY4QnM/x2PC8v6+qmCAMbOvWxZOIxjgpUF1ud2/e41K1bJAXPTZ0ctJLsigJDqNH6fNsXGGXNx7cwJPgP6INK3Qxc3ylfv0L1e9m37k+CqkJJTN6MvvQuae8WjO1l0JvBh6yHIrZgf/Bt/DNS1QULgHfUCLdwH6GVXxn8JChzrTEJL4dTZGD6nCwPWD+eeU/jxNc/wph/HYngIZcSTOnA7ZoHemc7pUYXx0Nr45Sbce9CyAvFnCzoIYbXxoDXYVwt/7sf509VEfvoLzjbFrRKr4vntb5dgeDiwRX6neO0yQZsOSoVjVvOOSAuP4PT+ezKgOTL5CMeBFh5fTyCTneXHNexLrs1pBpLHH3kmt/Gi6938ByjJyGR1wM7/rvRQQoS1drQjQ0vefqIJKlavxUAyi0PuILAyGGfaeCzz00DKjY1cowpRuwwf7rYPEZOByjttnqj6EUZ84F5gZp+4HJmTpMjNq0q/lyKFhwHKG0wkVp5h+gESx82VKGR+mbao8YOh23JnEy+eNJ45yos7d1gFc6GC67dt+OzE5TpAYicEpe2YtuuIHNt0hQpdLBdS8eqx9D9RSrya3h16jYIp9Ogfv58USTrQa6bOJgC6Fuw3VSohoUOQpQ/XY+PVKw2eV8Q1N6yxzymT6QIiLizm3kcA+jtFVJVj/IlTTGr7Tj6P8fQmh0ag3AJfRbLs8nmEQ1QHGUtaUv9djTgKNG5hVLyiujHLL77tNlHcYLwqquU6Z2V+WMoDwfBiMDqK39/tNhs7dXQhQTHYkold5VgNmV+WJr8ETyoKTHTS8g1RZL+KCbZw1LZoGTgR6eNleq+XGRggG9pbw1+WcW0jzJpvQle+pDWTA3yPaJogeuohg7EijR/48Se6kjwNpGStelAHWNOtzrfgmNxtH9r1eSRWLz79nRNF5th43Vy+rZ9FcwK7PlfJojQmk6yDIgDVpS2IJtFflHkl2pdrA/ZK4Grks9dfURGUNk54HimplKaYEZX5dE2M9W/60vxTLBE6XeIZ01h4YiHBHGMX+eAHZAHpSk2dFZUbQL/ylbq8VdzyOCnwzB532xAsz2XqmJFNJCZ6YuvEpyZtLa07GuhPki8MeZUI63KN4jC30SSX7/bWpsMyfpqrzmMI+cCYlmRUB0Mu4kG/untuIlFzWG2JnuSThOvNB87WuxDF4K9MPLtApA2nPV+2yMqZtQu/5eBgMzg8/6FBhddJz3kV0onK4Jbo71w6dhI4czF3ksh7/wVe0vAH8B/pVGb1v7xscPIhg6KL+hvTtq6g1+kCPpBURUhkj6yrfPgZ3/Xtc22MaQJp0ouI8smF0IW7P8ZfkCNRlxyoz5rOlXJ2YoBYf+hZJACLpIW6Ecg7s2fptIWtvuAgGvGV7dSNLkYv17ghjkJQx6tLucnApd6V56PAKNj/7Yyi6MOC9uwvXC4HnQSolMT49c6/5ZRIfWauOyw+arQBxET3gqjgZPldHDuhPDdYxffuJ1ityuwa75OUwVzCfQ3DhhKAfuieBFYqqN1i5usxjNFwKad4V39gjt2wLjcS1yX59qz0LCyVW9KbSYU9A28hy5DC7hdtdQxRU9PX4vfg8R4KZzpT7OhJe4Rwnuob88KsYJT3Xdb5uQj/iI2b9k+IAL2RazReg2nxwi3ia771jH8mWcStAs1NJu+cMgx6oarFqLe8b1HSRxQ7za0WtQhVKdhOSo+l5MyUbO7l4rtMf8vOidRDYSBoESyiDirZR/lirb7mNwOHR9B00U3KDHjR+/6/p0FjHCVpWNOzJcWfIRQkZ6XmbdXoGNbYi+/6K31kVQSpEiFHlf0XTAzQKDh03BJv6aoldSXInQfAEINY34mN7TGvaILI1iq1F8qQD9LdUyM1y1GkmIcoViAyaqPmTF6srtanuyTM4L1D0wyuj0tEVAfuycGdwEON4fnsCqlt5T6S1obgnUutprS4s5WpzQgzd4U9TRXJErli2+o2bS7A/uISBZhgh/679K/zLda6gWtuZwAvTGNdCbAN9uwZti3Hk9kKWrIq/zDHz00+fSYLcc5sgjgY5sWd/F9nGirgGojICMTxUzGmVVyjsC+0iZ7i++UKuLA2KCekIgylXj+DAZVKUFgBgXYW5+1bwyASMUltB5MhCcaMuivyyhZw3MJ7OjjmJyH+sH7zwWOwFaztw+KQpl6ETunGZ4wgXDkkep9RDpXHKdERy5R1KfOfi61l4kXklOVi+UvIPbGuKxTqSuKxjgg5aUU0X3V/EKdOugbYyeYKlYTyfe6Py6u2Z+A0k4k2giHiUVqkoC8MKxTXxmChSs68WryAMhUxyo84ORdwTONcLdmrVJbnyH+ugmyyx9iKEPADsMijuo2U3uJDa7Wnfr9gcycQq006VxIwrhk0FV/BDjqzquNOsEJXdrimGw0G+JVU4/5BNk+lE5kSCYz9cOOfNBtbtPUoVHnu1jfPwwGlaTc7GUxPcDFnEgwaHh5znVnSwPAAdXz5o6vI34Epz0NKfx11wmUjfW8nTAn60/CwPV4XjHM2yzXbq/EA9hUimpPyH+gMWQc8fiEpaTtk7l1iADxvDO8EMdlaQ0nXdXnhCuCrsoC+Uvlb9IaXpTbhDyzTzYYUPRsJ1khYU6+UMPk1YHn7mE5V3/F28Yia/wrwDdF+R6TmVzsqudzix7NyUGk46wXs0WaHIURcZDicGiV7SEhoVNTU0zgBoaSd49LNnCcmSgWRMUa0JKdpcVnfovdDcIyEcqOXD4VeP1baW1O5XKi8DuZzNuEL/drafxlkHz2RIla0Jp8ILNn7S3fdeg9UhAx9q0+SKtkZq2KsJrdjjyAjr3GfTjVIDAz98414NxYOtS7EWs2ZaFK7+4WBYoC5Hkeq4b/TVXen2W5sxGUXGVbea0PfIOieEzqtacY9iZH8JBwrLvaO9mQx8S8Xs1qoQA5mRuhLUFIcDGMj1wJK/K+vclB5Bl071Plrpq5+L4WJ77f/haemR3QBDVN+DYo/NMMFkqokI7b1nRwuzDmI5dEx4XMlGANd6UtZZVQ12+CHjwiLfAM9yPWaei6wRjGbxBRZUWxyt/lA3BanlqVbrdSdMBG5p3j4Pa9sSfYjUr77zB9h2qpnC6V8u1+XFmGBTP3y97KCCHykGfB6mbCNng2OYcDfFxSp12MaqtqOwry+xB9gUkHlnfW9DENAGqcYOxFOWwZHAJEeIuPuyLr3pc8euQGkJA6K1rmHJDoeAl370hmHY+Wk02WBNr6bOj8owlbEPXZobBQ/xU4JVN9l2GH0nnIedokXyCvBiq+jOf90wECFhhyXgaKiOos+J5t5i72+cySCooSeyr88ULT2mwUuMCLDw9Pty72PByiEtatpiqNeZF8Kladg4jD+8iY+w8ru/PveAVmrABMft/YevFyzmyB1LNidUz8yrnolKmitwK2bPJrQzSfyMg7RCZtnj801QmxB2Hh1RdODJ04NYCR84mkyeVmLrySQsPfWBiZawIPusj3W803YTrCIFZh55a7RhYSAh5uolGsv0TMC+pfZ8CJFMfhrjIkPX4iPlpoVij0m+1EDPaObMhssohxiQLjAb8un88eH/6Z8SnJxoDDY9JjIkM28xe9G9BMqE8CdRizNqXF+yzFoq+i0JXmGCunk6mGwVz7dw0Aht2yZLXL1jgrrUpP84ikBVljLiJmABWcOUt5aq4e2FLPP4IYwNw6/6kBGhUw92jqGvzzSz2IXFoSGkFThCZ6Hdi95k3hbTR+UyOtNXxKf3qOHtoG1+tO5u2H6XvCe4OZ0IsSdV2C22f4X0XRjnoLI9dkAJcmaPzyLbgrWgj/dizWHsrNz5PzGCCZ7zywhZMyk6RrEJ5ucZ5k4Fosm8+U94ZyJFHYaHthMhJSLgoHd9plpggxNFeaBMx2BdSg8d0qM1P9s3xHTr7n+uvFsfU5qJafAkyfAi/gC+OLxCw0uMl/XJ+id3bpdG4VxQwyKvZaxCWrPaRHIy9KcdR43jv9jfykGUTzB9KjyF1G0SkyMHMeY5wgAmcEp9B8ffD92GR4FQExXAD/Rm70xyf9mrg0HowJ+Y5o1trz3gJx6Em+pGPt0PvCVSXsmyA7BLMqIiL8iKyvmFzR0O7FJPoUD5dZJ1eKn4tDUJJ4Umb72XTHqR1qs8KsHPpu1Bas2jM6FoTMyoX5aScTz2RVJH0xso6SkxxuMBg3uUblz4fj83SnK1GADX8ZJtrY6l5lrbF1/ZuSi1BShVAdFnfBB3Sh1SW4KQz2mL+Y4svWwspzeGp4W6pTFKdMDjOxHzkJHkAfLjLjqf+T1Axa9og+Cl7gRTi70bSWjsQM9F19HqH1IdJOoerLMQTLpuVpFU//G6/hsxG6sFsnzMJ7n73SbIizBrcriqJQot6sKe+uP1gONUVuBIPlDJA49atkvafSdkS4NR+zciAFrwoHjdIsVSJKqDxAVrM15uFJb4cUI1Z5j3Wgo4gLqLZDMdNtYKJ1P7oBTGSBKZGTqguAYXj9FtcQ4sSbuwAvEKj0iSHfGzNYpAzMhIVEl+O5tVLe4s/3uEd9Gsrl6bogS5HKQwX3XK8Vnj7lf+5qIQiTSzRnfkEpdxxgU0LAZG7OSxjiHkVD2gFaZ1GjKhIedce7dFUwac8qA8Ut250wwH7O4rKHFECWEhhPfyyNNFFWeFrcIjCB9QkpXuz0U80DXFirexggv6bCvxlzrpYL2A02HykHogeIIum14ATyzZnKSfKNZqYUHkFr6qN2/mPO1WK01C9CpwXcl3fLEficn+qMiFNH5a/JFJBAF2ZZWJ5EP8mGzPCF9CDlr0z0YHruP+6bAUG47CNw5yDdR0WDTjq/DqDE8W+/fc6iTB4r9945YbHjR76ZqoOFAkp3KnRniRLdWK5iKvLCCH/Jf9vzHnX4LfdHlAiEucOADd6aaTJnMDTB0DnLoW9pvA/TvJPoH2GYOwUyBgDkGv7VLqRPzjz9nIWylnnWqIlm7L9YRAuucHIleKaTQCeUrXP0Wnyp2nmBxzeDiVOPsap6l6MYLHO4xg8HBAK3J1dgvBpIjcYDKZexJV5mf8c0hpw5ODKTwdkKCeeTezcPXh/9nI/FlRcIYy8sH3nKCQ0EEucVi+uinLNXGTmZXSuB5jYC2k1R6X8FYDLSs7G3qg+Wa30/SZZVsN+vbIWPDRqs9HMz/V2eXRrxClGwzMRZTnpwuqrD1GTjLUluOf9uPygJGxe+/EB6Ak5UCCsCWe2GLD5iZX8ywqGyaP9CGKOOsQ504tSVjAMPPpKo7Ex8LT3xYdh4QReijfasLvMKd8/bu689y+WY+S8IO9LXV7KYzmOOycnb7imsjeiBPCZgNd2Hd2fLIQOaLorPkKjFZcGRaNO6lp+pBPTMvw9QIbYuQZBlhu48VmV3i/3Y0m71BChUWR3cdNSS4D96YC5J0Y7ZFqMHBW6G9p9pf1EMvsoq2dzX2wSvNYXqdP47zyePLrk+nreb97cBNao7U34lHDXeFQ+HqT8XvcE26g42SyQZmHFRlH2UZ0kohpcgm7Li2wAo0IHMre/0XfRV0HtarB6og11KC3Z7/RUcqKzEPA7ZEJQgZNgBZE02MFT702HN67p516Nvqkm0Gjx83wQdQMeqxlml8LDK0V5SdTdnatEK7C+bhiQ3CLRBupVuTeGYhJY/BbrqiE1SY1vdXZ2SFuvNbcrI6ErGJV8/qH1acDEtu58Cm9IYXlR4R//8FS+sjKjiIPcuzVQ+9bV25MODrRYTzxFJYbLhp2Um/HKOncgLdKHj7tOrMZfxR6CrV1qRAGh+vD5dMMDkqvh3RtFI8M/B+95gOm4879zLjARkfVycAOqjJdoBfgWjWNsJnafTkmc7B3nIQv/Doeol9zaGW/DlpeEHHLSCVAFpPcoRFbXqIB0NIfCnsKcK8GmaNVe1S1WmDjR9kV2WjYdDpu3d+gX3edjZ363f9jQEbUhFXtuRXOQv+gmYCubqBrqUoagUdP7xj0HIFEZg93/KZ2CrZfN9t0A6WcpUJBI5WLyoLnqf11jJxzi7XP7icTGifXh8HPdPwOvmb7A1BFcfY2H1yrgpQ9LL1WPc8f4dqfuE91BNq8DtcEql3/06rGk4gsNyWI77GnH9IKwUsAFlrpUmA3zzUPojorig8/2Cbd3TjsCKM9wxliCLyKPngKsM1KFkqM6bMFtyxYYrU2eewcxYM6RkLIzuCbt2tjjkrWkSVoIS5lGaeH9ACsgsCD8uBJTg2FG+jOXwTTSCvGIWOiSPmrIKKcqEISVvUcMWhHEeUKjXTMdtBmPl8s4WipwTYa2j7rmaa0RNf7IXAOT77NGep/q0h0KdWRo5UPERTufgAqHgtum1dZEPq6OH8ILA+nokd8MXPhCko+zgkNqNlrLQew5ugiVBI+TSaF0+Nh/0lIpsCoBQWlDacVD+Vx3x3aSXTbkp6URafBo7r4W0YMJYL0MnwFM5mzSBvH459mHAZ0yzT09dEXgjVW9/ggg2LxRO6yGo5FTpGQS5EwMSjG3crtd3U4X4CO+KX5W46TC5B/X/DpEipFhWLaE6rpYO0r44KwsS9Ge9H2dfFY3QNvXA1sWHN6WR25HgQ091u/FmxcmTXpvXerH0b5xRi1MwmGmrK4ZAT1TapoD8+smzXuW4xfFWkVDOL7zk9xNtB53A3+dJrIzc5OTB601UXSFtQkX3hWaSnhB0fIWaxp9w7vGQDYtDAeTTDigrLMhVNfLUpJcIxhrMjO0Amicb+Ubauev6gApJbByzVQRTWq047GGRSYgxukHnlk5+xWTYTi31cQQCJ9ILZRJ3tV05M1AIgNeeDW2H8IBJqkzSl9nnKSajGYOD7eMyjHHWbG4SEV8CvAH8Iew6SodPSlX4spOyb4O8XdYQ2bne98jMMolgBIbc8j1VfPhmdPcqVcmf5qMjZcC2VzGSMF9s4863hYPVGq86Huy5cmg6zBz+qDU3yje9vmEr3yJ6kZhF5z8UdlkJdjq/581O9VuCR2B3lyEAfQoUZot9HdVILawreyRxAy11JlpE3UoO/fi5/5omkUs0A7Gvb5+bsteFVIW+9l+qR2dINow47smAidv0bLLEr/yqKcUanjvixyzAQCM5CVzq0r7rDR9M7wjLxBq9eBWRVmyK9TfSJqXHjL8T3l8phqzWGZrkRC5oiPO6C5Wf59fFDP+ituUaiEqytebX0Feyu7U5Leql5gBMTdDPsmK7KUOyA5TuWxjGc7dN7kJKEYpro0VWRhjMArMIGbutu6vN2OSHb6nvd508S4Q34uCRKu96bSAD7YHASNVhzXv8N8jroYf5Y7E9s4wTpkvo3BZkkWqpF0M1vka3jjUC/JuZvw9V8avX+D9bciICl12vr/bQJxDe+TN9MQwDJwOe5HRWZKtCtH/1/2brHVDE381FF3JIILjZf20UTFL4MLwmZtFv3M88Bv1x6hEyoaAlZ5p5QEWzlw8bJBt8orARhiododtduYtJBSF7octT9JzbeKdozaif0LBWL/u9RjbeVNLZ8UV44Ye6Sz56Vn8QlwftWL01WoPryii3ZZ930Zx6Ins/HGvGQmHAD+2qvuKQAs8Y6ublb+Dvhp3Y2NNMjsuzOvb6m4YtkPzbhlctKadex8tBQuo0zhmSxfDIZm5VnEDdG2vZ6kcykYFxgAz3wrkVyXQnwxyQIeYMIHQYT+257jBWD0yJIiC3PqmohMzTC/65XVgSsowG2kgnlR7pYY18nBQ8aVfJ64D79rH2pymM4xMU1Zk/OS14XiDcldhO0c0RhQxiPSY72XYxpiaKVYmzOcEvI1PzQa7+LVZ6pBIwn8ffWvhqa38b3IskTs4RBkYs9i+i9/AqdAQg2IOeWv2fuo5tEcFyefI9nATJXQchbBEQO2Cj3kaBe2X+81o97B22kYSwjOkgZybf53qZFQ6p/N0dL/VnuL1cYTGi8k6rMpkKGx4j+Mc/fcHUVNXTKhyO10FkvHiN+qSbJGepJ/aLXoLZ8RET0Bshv/4hAQgzeS7yl0n74cedqdnmAeHmQ2CyXvMM0MWpEvA2ezZIKU+WvUSaGpTt1kvMloerqnqxHLfT01Yh2n3iD29EWnrQsyjedi1I5SUgvQKBM9G+oAai15cO1con2QFz3UK7w7ZgzM+vPmbk2QqR87fzlbdTSAhrLXzqVfLnWBA/4+5aC+0BRMZ6iX9lH3QXtKU9D01K3HprdilL456y5lsl38VQaMbz9hk0LgquziMY01Znz2WE4ClHG9cF/e7stVmn89oNFUE9NZ1RAc97KzDEWHLoKwlCG6L20/2Gj7/M6PDhsvhY+FMzYRg+v/0jo2gPT0UTCfaLBDRVvKQgUSYPMG1dr6ox7ohepBUS0msHq/V7A6Y9WfKDgSLatqTzwhOXnuXAoFc1LsdlV/Nv7XHqg5TAohZGa1mOn44SyY1fyPMCxL1QmxvhBC7mxDyj9DUnBpbjdAzrBW0mUzZ51brDVW3f0A8oKL6FYBf0mwK6YxDMJogq94OPgpZyKHKBYvJXMfs6u0pYnEn/jPeTVQMK6uY9Egww5setjqwdQmwi1ea0/uoNw7QKPorCWZohFt4VB+HUy/ObjCDdxryIg/y0wXGMwFyftSyf0v/ESOVaUNOHg1aA0SQ0KOwx/oqBneMvSoxZc7SqvQaHcx3ZLg7I0FQgQ9799KuVGTfGNgWvzIMnHqMNnCyCLJMNoNQK9XA4Wkq+6tVuCUREehKj+szE6KlaSwgAPfb6JeGqIyBrjJK/wNw2yPaYB9wHia3A56M5r4OplAvdVjO1vrsc4I8LAy1zqqpo0yM1hfixHeLNDG6ufXaX/4mWxYpqL3hBHpPbnox49P3jj/wGgdZFaJe1JTer036xd0Xak5qCI6SV86xqAdAChv6sj7ESw0SU7w0leCi/08lfYfucRQHdzjO3JkA7lvHw0ouMCSCweP+ms5HlStT1HLlgQ/pkLQ0HiDkuoPtTY6fDW0UPlH3ebKJKJsiIlEwAnWQ1ExfQhfs1IRdbEO6sgyC7u2YqSye9WFoH3s0+d4P2X78UPcUsRitbiSflMds3+5ixk47wEAbwHOouv3l0AUb9zZIP32hh+8n3fJx3LXT4wqErJXRmufydvyJuKW5IkA+rD7B5y3hJGUFrf+je8x2WEZ93MMZZjKF3R4hY4E82J7y0z9znWEXqtnGce0dejOBkrf6CbP1VCh4ixhRvmOXO9yA0A2XQqeWYNfk1eUkRWlybRDBiE5SOOtjudxOpqC6Hv0XRqdL58/dsrEItVoppvb13l9MrZRKzOe/vtw9JP9aAkOa7ra6MbT/3YE4LlEJ5ticKWKe+rOGibg+N20Vx6Vg7J3byZG9+hIpULnZWH4Tq3LmlMA+oUfgAbbzPl3twbDuQozSElI95KSsXaBWevUxIWPQdY+4eolMlTtLwn+51SP6BWFEiioYy+r2Rza4OqKJPMbx7t0CZCtpMKxYQ5JCowbAH7J4Y3Eh3C04j1H/2a7qH3cVo01mg0KjVVR59qENmLLCnQ4LNMS3i2XshEK7QAIvi4D+egZPpMUywog3s+tqRiaGXIEMFp3rd3TuvLXVT9tpJGxjgQLGMKXmGL1MVjoN97by2NaOn0JoIbOQqeBIHTVbBYNON5DD3XP+rStPIfVbuHd+90TJpGh8BlfV0dLneK2wDMnndVGVvQLhvaQxu6sL3XsvtxmQzeFWUSHLeAlmTc9yNQKkXtOJWS9faewS8yotiXdJQ6EI1vpVOHgh46gljSllVDRx9qlH7i2QFU/dKpaQEbpAFUBI/eSUGbpgT2ORGcUGXXDWjQJQo+nCkQVnIMRUCP367os5Iw4Rb3LDvOi+/mwcBozzUa4WkjVcSIURKO3RTFCiY9j3O6C5MBS6Y0WbBooC0nOzhKxL8xMIIaM/tnyEzIdlABrz3f9XlCiQ0hh+C7/bNp14eUvnjcHWjBOSw8E7BjzeXkRQkpIuZSOriwZ8PiOLZxCkXFOQ4hbXa4Tu69lccJ9Hd0F1lxkg5QnAhhfx5WdcTkBH3SibBUMCLPb/cYypz6s4GGDMV5smYibldp//j9gbCEhqanpxLsoexOMik4SOt879z21iz+8V3wgG8CicQsmxcsqCc5QUqOZhnpO4qAFgzHF+noxN835P4xf5EsOcPvYWwtzK3WEYVGy5tuvxE5WZB246SGIDgeC4sMge0B4p70Tse4b6NjlPHW+90GmqnySqY83r0ilaew46qmwi4RzmOcPehbn4YPCoISjQ44RURV++dfU53vcKhkSj6cWuh75tdSSUNMysFwoP+lN2gGTwxOfrha9wWxDPpimhEBVrt6dcBIvdoUbCLTDQDZuUOVVhZP4sATqq8z7Ai0STnGxzKmAHG+3I+/tvrDN/OOTHwR6W5aWSRj+M5wmS5hfdvimlus2z4pE6RV+l6scSEX3XjFUVgbSuuufln4qZfmgBxNvIZmkPtMh4WHAtuqRVdgDOLksqdhjqc9jrNVpRsYL4L5fXaKhNXYNJfTorxbaoSpoqj6ZEp05xsc4y4Qryx7BRs3iYvuHRbCUsiCPmmGdUPXDn6H7woEjiz1YeriH6NPF5au5aVrtcw0DvEgLLKMuVq6QvzE1mu+x9AFhhIEE3jVvzGWs7x+IBGJ2hfG8Kb57q5sDsPmddrc0s2doavGt3j59SpKkbETAVxcSwwHbpAEsYTNPM1KhVl7EPpQp+gNotyPx7hI11xG47CrYE7+4xlCFpaDwvf9FWescjE9qNrcgCXvSeme0GAOo6QjsttWQcRguwWZb6OG1VPN2xZcfyUeEGLHhPkrziDDf4SHNaCcXXJ9CtFdyRMVueZNWqaoSKhpFI91MMLSXju3pGbSzJlM8FPf/oxZbRADvlZZCyb8fbb4mQVBZZ3GWV4hj4PCrLA1qQvEqs9XLsRnoal9WaSQhWRzLJmCurnGGRc6wxyAAejp0pAR70k0M8R+ziXphTbSz5jU2xp2cFe1EhegrqPqjFAtYWbYwsm9X969oYf76RSVpD5DfI8iDfFILBkfvnZaZtHikQ2tfNY1T0QOYafZ+dfiQjWZxqrDxXDWbc/jYZSbOzpgJ0HvC9wodOgTk5d5d9dmNrnM0LH8bvtI4zgktUZdf/DkYM10EF8yMhbFqvpMTi+TaLBUNd9aLSzSGAqu41xsKxsEYHFPhxozYZMPCafc4U5t8Ja7k34czb9pTsN2JFnwl8AmZSpI39KzBoEcD8fz0CAcio2KlaDIhPF8V0HkEbwc2c0mkpBazhOMI1d4cxnKG15nlJ+haP4D9g/H1z7jIEHS7enL9st+r19iJpqLFuJiKD2NT7LXyBzaAcFxIJ/fo4roeZSvHUyfgqUjSVcPiszEAuk4Fgqjxih+ln6TZW8b5sbDIvrB1Ul++c1B63XbFgHdVJTaRPzIXeh5f5u+QYvfa7pHyQV0ZUIv4SnfFMvTC0g0/fdaaBd9rcpxu/CBpbobKZgCIyVRDZGdPlZs8UGyu7+Hxb64E/k0YIIyG0d7ZSIcU1dOwyAQt25Ow5B4W/oUhgU+Gf+qB/Eqf+V11+GylEkiyGag2sSabnAwgaqTr549u7USX8FH6EnKLv1g9jl2zIU7C6GM3aeDn8kP+9aBM0Agrl165RV4/UHaXPnrBjs3YOHlrMK9jziNkwwt6+rC5FPPvSm2uVuOQouD4+Rk/8X2VoT+8bijB9PNpfsOsNhiSOVgntu7dzfzJItraFExs2ylPt0vanTgZJP3SIxPvZsgaDSBNmxIh0KPLS+EZkJ1Xy0gY8WVOZDbYF9v0GJta6+GUy7ek8lisYumJ1nyw90NF5n7L6H1aFMYqA/WI2COJA7pWaf9Ugf5pniETIJNyNXtonwZOLeCG380p2a2m5Fs4WDJIbVCtkJ77ah+h3HMvJJ0fzW8OXfnZDuzbWB935lP5zr2+vOc7CL44LjNt8p2deJJKd+d8n1mwKwxWxUjkxJRVlpIqwq1a+Sfeu1oNGDaOXyS/LVoiWAi4/RFFK77j8sVBWyTeqc13DCYWKdEbHTgEcIdtBewm3fvU99V8J4gYLJijdis2O/D+3FBz8kG/SwAXwjzKgO1TmXuA3syLPxxfnEUxttkUPpzQJgAzcN6o79tpHr3QWX3TVy4USKZJPX/G7/sFv7TB2RKaM9LvG8518UTl/oNK6/mqMpSOqsv0xRVzNjumgamqz/e3LG3e1lkrW5SquqlrDJIrN90AProjO2hsva2vAv1ZNPbHVfvH6K8KnMmDbXcZImS+YAXafdXLVILS/Q0MSKuRaLPQABT6AsH1SpBlkiSLXyhT/gT5IbfD6Z1Jx0n7l33o2uGW4lgd8BRn8WUeEHBHEn2SCXVQwlREQtvN7iSC2y8qSngF4ytc3vgOucrGccauebyUn9sdKmkhMom+XHRGLg4yr7NW/ZAq8UDCTjimw0unj204NYoihtZTNdXwgmCpqzA6Y4a3S/braI7FEXELgpjVSnB+dqkyFq3Tny2G8lAz1OtN0TZdE3wgbqL8XtsE5Ut1NayTqmPNmEhJVC0f6ZfMop0HP5VawTxA+lq1XoeRAoIGH0ojuV+9O13sh2V2zoxj5jVyNGuZDtqZVlEeSIRI05PVi7nZfKw+EuT5YTkdX/qnx/AmQXABJR8mEbt5A8Oab2RqMdG+P0zvDI0gODnGDSO2w4ZOrD1zi5LnYaIljibbOMhpDWcwsd6Ry5eUmiLQ24OpaErO6a3/sYLybm9xOJLqfn7DNg/5SKBxEfKNyyUYP4KtkSMQI5Xo7dHcIhqH4l3CRK/gB7WtFU6bj0mReNJIitL8grYbUyZpqDuMDT5s5WQsWjOEmRSbMiH7HIkEIPvRu0WxMnRCJKjGFWdlKGqK96T7jlsEHCjsPjk/9VEQ4W5qB2tRAFGJ5YGgbmyYxqxGxduvkNdd3IZKcIbvtEtH4X7aHeyV4Dcn4wkEzUNRRhISM51Av5I1mwi2lj3DP8d6K9iFzNVDCSb+eb9pBu+SEqYrvFC8WKSi8OcZDj50KV871120hgz6n6OZy1KOh8OzKNuCKFt9mVlUfJKzD9gcuL53q+oTHGGIKFz4+4/zLC13N3l3y4Fn9dzM02uGyBGoJXmF3jrwW9OguOsh1FVykE1suM6kC/e005VRngkgcn29tixbfGSx7k8JzTId+5wTXE1HgKXCtGlwA7L6FxS+RUGGP2az1Em91D7THACjjqlVdoDOltQ7Yb4S8n4kG/m/CvtFfQB0e/e/JMgICLGKds6v5THENB7WYOdJ0P5s3GQzdbeXjUAG5Y2WCUBs5LZ6xDZzv1L7jfUHqBbmnHW7U4g+UTYB/tW7B0Ya0JAbpzWFSoVQH6CbY6q9fM8ccelwWdxeWdjZm+TcmBAHpje+emw8T5mUgl7Omvks7D2xk04/HjynzVyBN2dI3dBgxTkB1keL9tMN0WgyjY0ddKI8pigHP9lOa8hb7F2bZIa/FqS6JJPPHnlyPbVl+weIG7j4ocmWH/OkvaT4qtcbnafk2ocwOkjSqUob66ehit1UDMwKXreD2R92MZugTHNe/PWAZesANg9eBbm2p+4kqK52j8MW3AhqaffDN+kK195DUM4FLVYm8BQhOF+OWoM5tTD8LImCNRenutbU6qRxpaMDXCBU37/K3Y7eobcg/IaZaBuw44FteI67Hdgufk5VqCDjlK7jDBUtVq07hpPI9ymWW/m3nNLQlusNGDSBNYXOUBDRWNnHira/1eo9GEwVgpXn2tG1PUUxT15p/fbfGXCvpsj0QlzwErC0ge/Oqlsh7E0QhpqDAcvlBJOiXDD/bv01SkM269rmghWHJPUbmpq4trj7H6cCMXMIwWgOLaTXR0w3tamzJpReC8FXDNwkxSCbmg/ag17JdPyptz7mR3k6KvXor6tFCfEv85TW7CDWLEap1AC12Ym+LK9/CxdKPnXz9Qz4xNXGn3sG1wAfthifQfjDyiCnLo2uhuMzI9yKxH4PUTt52mReMLmnHFrrLpDYcPC+cU7ge55guYhGv/ANB92YzoXrI+Hs6gdXnnfE8GGhfydGwvKBKCtpDecGnu41Mz28j9/LTVtSV9WZEoxANMgPGo4BDbY2p69ixYGQWATdyg9TRDAK7f/Lrlubat60yuVZ9wcwqZ7NBP71mX6NEgdvfK1EgMnkZzsDQl/wWDHdAoOYCo4pKwY5I/V26cKTO4aMYcV/YDdgglOtas2KtIXBJAcgotsV4YfF+CDN4T5WdX808VdXh3/UXLrAdcMDF3QIXj1HyUHIOkXBH7DXICbJt9eNiowRXiuB0d1J/FqjPFe2IlNdXnwFwpRusB5PLSv0Lk/AdI1gQmao8wwLmnoh/L9riMbMMsWAOI+5B71d+lGTKlxx4hQn4ixRfedyZUUsRcpGrgAS1XqCKzggl0/LFuyQpe9BsgvZGkEHQ4ELkl6bcLtiHZ+7uFxmRjnV7v8PP1Whug1igIT3OTMnmb/dGJPuGKY5fRdvWoatxfNU3ABi+fY7eHiPqC0gQDpAC19twVfWBtBur+ST+y7fzmSE5Q0C3mcp8/31XIdqm7sEZJHtFnXBgaTyG+fWRGAY70K10IBvKH2TE6IMzm1k92/Cn2payTupKTtojgP3uaWIgFVgV0lD0WGR0PanqiKtrBFwqznvb/rz2PgpSjWd2BESLQpxY+6tmKXZnjvY9xfR12CQ8o/aKz1t+XxCSzy0uE5f/kaFUCrwxjL8gT7SEUJshp//5/yvPFJHgJlgsvXp+gRQCSzz+vS6rl3BhMsbj/HzwJYz8GsWppOQDGVswlOHEaFE/qhImhDrt2DUfNxtt21GW7KwJRn9/mtYIjlnnwgESPEpwoLyTru3SsVGzRxnZG6x+BiseUs57lTdb3H8KG7UPeH1SSjy9wZHELnar9x5cOtOR7lOvyjWm4Ab18Q+qoMxxLCFit0V8SmOu7AU8XGY3eSXb6Ly+kaQmDkRlOstgmcj+rD34KNz7LTvLL0O1Z9J/nCjp+1flOFgtbd7Yg0t5eNrPuppxYxJfSpnJRNL4S3YTffnV+x+zVsuioseET/On2wNi/TnL2rAQIKswi7Er3Sv48D/+PLsa2WJOSk6DqcCLmusILDiz0FwKEhMewrxtNyM2IAE0/6hiopIQoUgC6U8CLirhWbfVibSnCGZlF5uywIcaUlcEaYP/evokbi1NSquO62XNnWR4+fB3M1N7LaI5pwdHYOKEjg9OaSiTtEDypKGOVxZhdQS0jEvZ46foNS4SBpwZfPn60p6pQldNUmimhWeU5LUnEpZYjPJU6hmAsh4AKaLFfJANrZ9ou428yoEIFuiY9UgOYkqtSUocWxyijxK+NTtuDdbh7NJcyLIl6CUBWQjZiL34Bk0Qe3vmT9tpIKus3r5CvEdEu5Va2Wxm8CQJT9bESzuFBeH0QIRybKFAUVqNa9tCXukd1jwLXYKWsuMuFda8R1UjVG2cvAZ+R3lBV+nLksL4Ti6lubX3hKFcSyFsG5rK9pJt5nlSGIkBLP/HFqLL/KX0S96NdOo4CS+GYPBk+lBZxz6Yie12vvUj8l4t1ik/5PmvbLOTPCcaoPeZ7APUQIKIcxcNUDin3R1okbeAUGwt7Ja3G0ntQokBhlajisyXeqbfPLrTTKpTauclKp+DGdyBsbzFHEYtIqZnlLe5wjluF/UID6EgwWPGj0FVKM59Jom3+0Y1QTb+IKqHZv/0FIEEuVItlJHSixdza2w0UN80Hyc/eUGv6SBybC/EEs9cOcLBR1eeQXXe7p7hfIhtxxBrGhk9n7jom/4LXF125WzPmMCUiNyE8iO7sVSmRf/iSNFBveZWGPeCirfJ8a43fk5jCfA3NPEJyMAamu3Q5im0DKo8aonWXtye9iE8vraixlVTAGSXFMjP3+XiOE9jrnXTDzARnt7+9gvHctQpaAI0za6N7bq9R1lb55jILwmx4Ih4OA0K1/Xx7B9jytPFBRhEO8xqXLhxotsIRjnGRvnkMK/KJ1YhE9T2mNmclLYgMSn+7dzik8BzoHt+EcXstV8yNpTspqsnS96ATq3A66NbF449w9JqViBt4gWi7yVzt3kR4XSJ8iEB5anMqG+EsSyrMQVv0sMeEysGx+yYs6G2xPJw3zqTq4RzDQXPhYra/VMlt7E8zzl4D7L3HS3kkWf4ZkmFmnjcENPQdkmohl6p/gqkOg+8McyzNxxb5Fl19DsSr3MTuSMqhSKDn95ibzYCEdrZXJiKaqu7BFBuju+jSObOPchog2IsE/u/3U/UK2mntvSnD0qNkPYoRTskBnLJ3NJamL0V4sEbryX8NMr7MKMJ0+h2+xMKY4KERpvUrd0c6ABXWHqLdY1QTugC/5dhdoLy3+KwgG5FnL0MZw6qvOvHkKQRoQrcKLuwUld15s05QxurH67A9eAr02a/vUWNBIgP6vOa69ZZuZKElWttIerRDGIAkZ54fw7HBctSZtfspPxaliwbOEH/Laxot3ZQonzvXknSVodzZHA1Jw7BcNRsYvl+KJ0Y6pMRPpIbaN/QSuHtnjUoej+vlVhq5021xMUPKxCK/D8rSRbOmduHG85/JrIimgo5wXWP83lLvRaxwCxeTGVt44fTUqsfUARmQcS3f5DbHR9SZ4nJYIEvcCjIqLezJ3I6S7xBop57j3ZyMQX0Xxr5mc6IUmrlOXM9fJG5iDZQQ9rWsGZ0Y26GzTAEsD6pjPuDa1XAT1MRpxyZ8zN53sl1YEV0E0EHvZqcnBnqMTXRh6zC9PwDXEk3OHs2zLLIjBhY5+7lDxp1X0qcm8XtWorat33mUx+kEDDgaDUdpclQq/ZM6mMYoF433nKbCKDxCozugSPVaRjNPosMDy8FujvIJSb763XuBGBIYLS9x+HZhYiUa9xod0xKV9aRt7yczWWlLgfK8qn4fULHMBSP48m/wTWfDBdTH8uDAKt5WM033+2bCpxDhmZtE+d7XP65yBTOf9/EWaCG+Gs9/5kVbWS0JlfoDH6Si2tVCzCRGfV0XZAUWfXOMJ5F9dkMagbwaeqVqqbVONDQGg8zID5MUV7IkazdAz4JLOXsn1RuZnoZNIGV2Na15+dRKYUAmXFmkWBJpPMBwT8N4bd8VZwBnhm3WzH9S0sbpoP0sgf2OmPvQ6smMyfkVK+OLjXYubmtioAhdwDb5/pLRg3PGwfHEz6v9OOe4AK8iw2cma49tV44In8Rc9jGcqSQlFXPdlC8366ke4U/ITFy0/SQBl1vWvGk40KycwWGaLf8cCtEi/4X2W8961i6lYnpfNQhGcQyC8s2oIOW+Pw545Thq3ZBEyNC8YDr/pzCEmBI8U3A4IiQJoHiD9kUMNd8wfzysC2Kqc4OGeWYsJxmDev4Jn4HV+vqpgN6xxSEMABhRMdTteHiJAgnQEX9BR2V1sNqh5EcMvQNYYa5+bblQn7Rli1UFCtQkP6ECmGkxmPNkg2CGS2mmf0/WEuTZSyPMtbbrnftPgleOmJ3jSm0m1EU9fQHQo1NZti+KczpJ8mSYIVtXzXh4rNJcL3Fm7Bbftpjmj5UnuDpPk8HvqKOj2DGJyk4R0Md1x7umiH0DTOXaLwO0EI94k7n6R8nfqiwekgUQZ1rRek0HViM5YN0JLWp4f4NRE8ErcGNSHZd58+9Kx8lmkc9ogfQmX0rX1kB8QQzNbH+eVDee0jOQNUgQcew3y+0QbifXrtLHXDIxsqsej41Kz7vfcQRE1zUnY2phYNILK8a657zyHNMzPiRhxs28s1JX2kiCMEloubOXnc8BzU+n7LM9wztf63eFWN/eWHXVivSdCWg5DfWsk2CF8aFJrOP277QEPdkWlOlewCVEkLjyd5wUn9ZzaKOJKnDQDLfliiRLTKlU8TOeQj8jOU8FfpM9tayJTDpxw6sVlZuJRAILfxn+QAGIB/W1FGDjuuVu62hFDBdvzVSfge95Ebf9pclp0GrpV3S+gwBWn5J7aGiim/fRyIN7YVVXJsnAnVeq90vDdAV0XearTqjT2Ck/AMkBW6T/ls/6VUVnFWs01wxkahKR0tRwyLRKgHefm3RWie/pTVQpUMZw+/7ozQSW+7vuZd8lsvT1iX5rwlpiaFnOnDbHsr1As6vLETd5HVbcBCGbJHcS7ax9Byd50jdYyagUtjAaHYX8ryyuR/bDkw1o4j8+hXMfbzy+CVmgrfRDyl4dn+5LxrqRAXLoDKpQREAHqdLSsVSJh1s8KnZ/SsUVq27cq+O6LMSBmhT4X3E750rmWwCsoCre6bT//oFWYALjp2SbcxnULBaTvnYDHtfEbO1m/3c9nJk8ZO5KHQTV88ivTWN/S2EXwmisTPdcupMrvI8e48QZdkZu9WHyKron7MKhGFJw6Z0KZ3tleVrvvJo89siUwByPY+Hs4gkKPBQbLQOaedcv/xeM+Ih8rl1eHEC/C65xWVciToVqSGp9HfbhVzFSrO6kBnv7mJwnRLvMEwqiNankVdJJMw4icU3lKyw/ecNSWIUddqlbThYMiq8nHjRRufs+28cq0OI9zhpvxFvFgSZE/eAYvm0x+9lZO+EH9NkBngaqU1NMYhdombNuy3awUN9p0mJQ//e9L65YbShgoc+ZUlNy+c6F6gDEHXV0JrzevPIZFAe2RyRa2dNqzLvihAAMCszYueqszzXRkSyobx5+LTLK2V3lfg3wbS9DzP3QW7VHdHbjZcttQRvtjrGveJnNn2DE2ZDIbvkCrT0H8RzbGDdmIq4P1ey+hoY/W6NuZKOz4dv4HUNznxdKV1Wf3MvqUv35r2jTKvpPWBUWNm5fytX/QJwp6qkIOsSx7Y67BSCbCDVLM8/VcMG+T0j+INrgL9sfT1ICtACH8BI0G6ViUZPVzzCmQHW2oVIwZjAoFl6+meO/pD8teO1E+1y03mCpYfW9S8qhtH2GhlFlebPf4NbezVv9xbXKWz0xezRNQWqUqtYRTUbuzK7KTvjG4rQHfzBpVmK4wDLnSIwdSzTSk1fPNeY0WOpPZTLlvQ59xwgfFrb326vT2hS1JAZ9E6sujFtKTiJ7bxI6o4cBhDaX+adXREThhR+MwA4TqD7rga/o9iY7d6TVRe14CS2S3iSQsD0R6ApnhG/2Wa0A0AY2NtWTjmabdKU+KgIRDP9RQYVjXiF1qC+xyNVG03I9vpmEpY/G/zC4nLOKgXAZ/uTikHI9Afbkhfgfgo9arWbix5eH7WUo9RQygDzwCnVSjbXc7MihEufVj6WGbK963pw8VjY3RS8IH1cy2yZbIcKLO5CgAUcXJfF2+McnDLKtXxyZaf7SPA6KJq+zF2NHyfoeTOwHhGqNcnHVr1hT73pcoyXyfvCYBnG1Bp/aR9t8hoI7CXM3UZOisWGA1SHZ2jf7k9GlRnp3mF/c1AV+JjvUsnZrsybEOQJg/dn/9eJkyykQHjbF56zgcPX6DdMG03WKUMlYz+uOZ+5DZy9E9MZOZ9GMoLFdrIPPQQLjv+GlCMpoyHPXkzIODjHAID2PrnaRpqWVHh0rnieDILKq+Emrd5RnjgE9pDUXWTmHaKuqqYlcgEz4zbi46dbWrAAFBjsQq1rLHIiPJEcwFLCOY4JNlXRXQJqCUKXk2d1RSBGzDP6HDSpo863BhVRFFF6uIpjQV7j5ebFe3UkkO/+coIo2BTAcgBqOtQ134s9a4QJvofuqBYMGOBMsWZ+sn/2AOxDx6SfAnDFGw==`;\n\n\nconst $87431ee93b037844$var$bluenoiseBits = Uint8Array.from(atob((0, $06269ad78f3c5fdf$export$2e2bcd8739ae039)), (c)=>c.charCodeAt(0));\n/**\n * \n * @param {*} timerQuery \n * @param {THREE.WebGLRenderer} gl \n * @param {N8AOPass} pass \n */ function $87431ee93b037844$var$checkTimerQuery(timerQuery, gl, pass) {\n const available = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT_AVAILABLE);\n if (available) {\n const elapsedTimeInNs = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT);\n const elapsedTimeInMs = elapsedTimeInNs / 1000000;\n pass.lastTime = elapsedTimeInMs;\n } else // If the result is not available yet, check again after a delay\n setTimeout(()=>{\n $87431ee93b037844$var$checkTimerQuery(timerQuery, gl, pass);\n }, 1);\n}\nclass $87431ee93b037844$export$2489f9981ab0fa82 extends (0, $5Whe3$Pass1) {\n /**\n * \n * @param {THREE.Scene} scene\n * @param {THREE.Camera} camera \n * @param {number} width \n * @param {number} height\n * \n * @property {THREE.Scene} scene\n * @property {THREE.Camera} camera\n * @property {number} width\n * @property {number} height\n */ constructor(scene, camera, width = 512, height = 512){\n super();\n this.width = width;\n this.height = height;\n this.clear = true;\n this.camera = camera;\n this.scene = scene;\n /**\n * @type {Proxy & {\n * aoSamples: number,\n * aoRadius: number,\n * denoiseSamples: number,\n * denoiseRadius: number,\n * distanceFalloff: number,\n * intensity: number,\n * denoiseIterations: number,\n * renderMode: 0 | 1 | 2 | 3 | 4,\n * color: THREE.Color,\n * gammaCorrection: boolean,\n * logarithmicDepthBuffer: boolean\n * screenSpaceRadius: boolean,\n * halfRes: boolean,\n * depthAwareUpsampling: boolean\n * colorMultiply: boolean\n * }\n */ this.autosetGamma = true;\n this.configuration = new Proxy({\n aoSamples: 16,\n aoRadius: 5.0,\n denoiseSamples: 8,\n denoiseRadius: 12,\n distanceFalloff: 1.0,\n intensity: 5,\n denoiseIterations: 2.0,\n renderMode: 0,\n color: new $5Whe3$Color(0, 0, 0),\n gammaCorrection: true,\n logarithmicDepthBuffer: false,\n screenSpaceRadius: false,\n halfRes: false,\n depthAwareUpsampling: true,\n colorMultiply: true\n }, {\n set: (target, propName, value)=>{\n const oldProp = target[propName];\n target[propName] = value;\n if (propName === \"aoSamples\" && oldProp !== value) this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n if (propName === \"denoiseSamples\" && oldProp !== value) this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n if (propName === \"halfRes\" && oldProp !== value) {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureHalfResTargets();\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n this.setSize(this.width, this.height);\n }\n if (propName === \"depthAwareUpsampling\" && oldProp !== value) this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n if (propName === \"gammaCorrection\") this.autosetGamma = false;\n return true;\n }\n });\n /** @type {THREE.Vector3[]} */ this.samples = [];\n /** @type {number[]} */ this.samplesR = [];\n /** @type {THREE.Vector2[]} */ this.samplesDenoise = [];\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n this.configureSampleDependentPasses();\n this.configureHalfResTargets();\n // this.effectCompisterQuad = new FullScreenTriangle(new THREE.ShaderMaterial(EffectCompositer));\n this.copyQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial({\n uniforms: {\n tDiffuse: {\n value: null\n }\n },\n depthWrite: false,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n gl_FragColor = texture2D(tDiffuse, vUv);\n }\n `\n }));\n this.writeTargetInternal = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$LinearFilter,\n depthBuffer: false\n });\n this.readTargetInternal = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$LinearFilter,\n depthBuffer: false\n });\n this.outputTargetInternal = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$LinearFilter,\n depthBuffer: false\n });\n /** @type {THREE.DataTexture} */ this.bluenoise = new $5Whe3$DataTexture($87431ee93b037844$var$bluenoiseBits, 128, 128);\n this.bluenoise.colorSpace = $5Whe3$NoColorSpace;\n this.bluenoise.wrapS = $5Whe3$RepeatWrapping;\n this.bluenoise.wrapT = $5Whe3$RepeatWrapping;\n this.bluenoise.minFilter = $5Whe3$NearestFilter;\n this.bluenoise.magFilter = $5Whe3$NearestFilter;\n this.bluenoise.needsUpdate = true;\n this.lastTime = 0;\n this.needsDepthTexture = true;\n this.needsSwap = true;\n this._r = new $5Whe3$Vector2();\n this._c = new $5Whe3$Color();\n }\n configureHalfResTargets() {\n if (this.configuration.halfRes) {\n this.depthDownsampleTarget = /*new THREE.WebGLRenderTarget(this.width / 2, this.height / 2, {\n minFilter: THREE.NearestFilter,\n magFilter: THREE.NearestFilter,\n depthBuffer: false,\n format: THREE.RedFormat,\n type: THREE.FloatType\n });*/ new $5Whe3$WebGLMultipleRenderTargets(this.width / 2, this.height / 2, 2);\n this.depthDownsampleTarget.texture[0].format = $5Whe3$RedFormat;\n this.depthDownsampleTarget.texture[0].type = $5Whe3$FloatType;\n this.depthDownsampleTarget.texture[0].minFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[0].magFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[0].depthBuffer = false;\n this.depthDownsampleTarget.texture[1].format = $5Whe3$RGBAFormat;\n this.depthDownsampleTarget.texture[1].type = $5Whe3$HalfFloatType;\n this.depthDownsampleTarget.texture[1].minFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[1].magFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[1].depthBuffer = false;\n this.depthDownsampleQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial((0, $26aca173e0984d99$export$1efdf491687cd442)));\n } else {\n if (this.depthDownsampleTarget) {\n this.depthDownsampleTarget.dispose();\n this.depthDownsampleTarget = null;\n }\n if (this.depthDownsampleQuad) {\n this.depthDownsampleQuad.dispose();\n this.depthDownsampleQuad = null;\n }\n }\n }\n configureSampleDependentPasses() {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n }\n configureAOPass(logarithmicDepthBuffer = false) {\n this.samples = this.generateHemisphereSamples(this.configuration.aoSamples);\n this.samplesR = this.generateHemisphereSamplesR(this.configuration.aoSamples);\n const e = {\n ...(0, $1ed45968c1160c3c$export$c9b263b9a17dffd7)\n };\n e.fragmentShader = e.fragmentShader.replace(\"16\", this.configuration.aoSamples).replace(\"16.0\", this.configuration.aoSamples + \".0\");\n if (logarithmicDepthBuffer) e.fragmentShader = \"#define LOGDEPTH\\n\" + e.fragmentShader;\n if (this.configuration.halfRes) e.fragmentShader = \"#define HALFRES\\n\" + e.fragmentShader;\n if (this.effectShaderQuad) {\n this.effectShaderQuad.material.dispose();\n this.effectShaderQuad.material = new $5Whe3$ShaderMaterial(e);\n } else this.effectShaderQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(e));\n }\n configureDenoisePass(logarithmicDepthBuffer = false) {\n this.samplesDenoise = this.generateDenoiseSamples(this.configuration.denoiseSamples, 11);\n const p = {\n ...(0, $e52378cd0f5a973d$export$57856b59f317262e)\n };\n p.fragmentShader = p.fragmentShader.replace(\"16\", this.configuration.denoiseSamples);\n if (logarithmicDepthBuffer) p.fragmentShader = \"#define LOGDEPTH\\n\" + p.fragmentShader;\n if (this.poissonBlurQuad) {\n this.poissonBlurQuad.material.dispose();\n this.poissonBlurQuad.material = new $5Whe3$ShaderMaterial(p);\n } else this.poissonBlurQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(p));\n }\n configureEffectCompositer(logarithmicDepthBuffer = false) {\n const e = {\n ...(0, $12b21d24d1192a04$export$a815acccbd2c9a49)\n };\n if (logarithmicDepthBuffer) e.fragmentShader = \"#define LOGDEPTH\\n\" + e.fragmentShader;\n if (this.configuration.halfRes && this.configuration.depthAwareUpsampling) e.fragmentShader = \"#define HALFRES\\n\" + e.fragmentShader;\n if (this.effectCompositerQuad) {\n this.effectCompositerQuad.material.dispose();\n this.effectCompositerQuad.material = new $5Whe3$ShaderMaterial(e);\n } else this.effectCompositerQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(e));\n }\n /**\n * \n * @param {Number} n \n * @returns {THREE.Vector3[]}\n */ generateHemisphereSamples(n) {\n const points = [];\n for(let k = 0; k < n; k++){\n const theta = 2.399963 * k;\n const r = Math.sqrt(k + 0.5) / Math.sqrt(n);\n const x = r * Math.cos(theta);\n const y = r * Math.sin(theta);\n // Project to hemisphere\n const z = Math.sqrt(1 - (x * x + y * y));\n points.push(new $5Whe3$Vector3(x, y, z));\n }\n return points;\n }\n /**\n * \n * @param {number} n \n * @returns {number[]}\n */ generateHemisphereSamplesR(n) {\n let samplesR = [];\n for(let i = 0; i < n; i++)samplesR.push((i + 1) / n);\n return samplesR;\n }\n /**\n * \n * @param {number} numSamples \n * @param {number} numRings \n * @returns {THREE.Vector2[]}\n */ generateDenoiseSamples(numSamples, numRings) {\n const angleStep = 2 * Math.PI * numRings / numSamples;\n const invNumSamples = 1.0 / numSamples;\n const radiusStep = invNumSamples;\n const samples = [];\n let radius = invNumSamples;\n let angle = 0;\n for(let i = 0; i < numSamples; i++){\n samples.push(new $5Whe3$Vector2(Math.cos(angle), Math.sin(angle)).multiplyScalar(Math.pow(radius, 0.75)));\n radius += radiusStep;\n angle += angleStep;\n }\n return samples;\n }\n setSize(width, height) {\n this.width = width;\n this.height = height;\n const c = this.configuration.halfRes ? 0.5 : 1;\n this.writeTargetInternal.setSize(width * c, height * c);\n this.readTargetInternal.setSize(width * c, height * c);\n if (this.configuration.halfRes) this.depthDownsampleTarget.setSize(width * c, height * c);\n this.outputTargetInternal.setSize(width, height);\n }\n setDepthTexture(depthTexture) {\n this.depthTexture = depthTexture;\n }\n render(renderer, inputBuffer, outputBuffer) {\n const xrEnabled = renderer.xr.enabled;\n renderer.xr.enabled = false;\n // Copy inputBuffer to outputBuffer\n //renderer.setRenderTarget(outputBuffer);\n // this.copyQuad.material.uniforms.tDiffuse.value = inputBuffer.texture;\n // this.copyQuad.render(renderer);\n if (renderer.capabilities.logarithmicDepthBuffer !== this.configuration.logarithmicDepthBuffer) {\n this.configuration.logarithmicDepthBuffer = renderer.capabilities.logarithmicDepthBuffer;\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n }\n if (inputBuffer.texture.type !== this.outputTargetInternal.texture.type) {\n this.outputTargetInternal.texture.type = inputBuffer.texture.type;\n this.outputTargetInternal.texture.needsUpdate = true;\n }\n let gl;\n let ext;\n let timerQuery;\n if (this.debugMode) {\n gl = renderer.getContext();\n ext = gl.getExtension(\"EXT_disjoint_timer_query_webgl2\");\n if (ext === null) {\n console.error(\"EXT_disjoint_timer_query_webgl2 not available, disabling debug mode.\");\n this.debugMode = false;\n }\n }\n if (this.debugMode) {\n timerQuery = gl.createQuery();\n gl.beginQuery(ext.TIME_ELAPSED_EXT, timerQuery);\n }\n this.camera.updateMatrixWorld();\n this._r.set(this.width, this.height);\n let trueRadius = this.configuration.aoRadius;\n if (this.configuration.halfRes && this.configuration.screenSpaceRadius) trueRadius *= 0.5;\n if (this.configuration.halfRes) {\n renderer.setRenderTarget(this.depthDownsampleTarget);\n this.depthDownsampleQuad.material.uniforms.sceneDepth.value = this.depthTexture;\n this.depthDownsampleQuad.material.uniforms.resolution.value = this._r;\n this.depthDownsampleQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.depthDownsampleQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.depthDownsampleQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.depthDownsampleQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.depthDownsampleQuad.material.uniforms[\"logDepth\"].value = this.configuration.logarithmicDepthBuffer;\n this.depthDownsampleQuad.render(renderer);\n }\n this.effectShaderQuad.material.uniforms[\"sceneDiffuse\"].value = inputBuffer.texture;\n this.effectShaderQuad.material.uniforms[\"sceneDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;\n this.effectShaderQuad.material.uniforms[\"sceneNormal\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[1] : null;\n this.effectShaderQuad.material.uniforms[\"projMat\"].value = this.camera.projectionMatrix;\n this.effectShaderQuad.material.uniforms[\"viewMat\"].value = this.camera.matrixWorldInverse;\n this.effectShaderQuad.material.uniforms[\"projViewMat\"].value = this.camera.projectionMatrix.clone().multiply(this.camera.matrixWorldInverse.clone());\n this.effectShaderQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.effectShaderQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.effectShaderQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.effectShaderQuad.material.uniforms[\"resolution\"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(0.5).floor() : this._r;\n this.effectShaderQuad.material.uniforms[\"time\"].value = performance.now() / 1000;\n this.effectShaderQuad.material.uniforms[\"samples\"].value = this.samples;\n this.effectShaderQuad.material.uniforms[\"samplesR\"].value = this.samplesR;\n this.effectShaderQuad.material.uniforms[\"bluenoise\"].value = this.bluenoise;\n this.effectShaderQuad.material.uniforms[\"radius\"].value = trueRadius;\n this.effectShaderQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.effectShaderQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.effectShaderQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.effectShaderQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.effectShaderQuad.material.uniforms[\"ortho\"].value = this.camera.isOrthographicCamera;\n this.effectShaderQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n // Start the AO\n renderer.setRenderTarget(this.writeTargetInternal);\n this.effectShaderQuad.render(renderer);\n // End the AO\n // Start the blur\n for(let i = 0; i < this.configuration.denoiseIterations; i++){\n [this.writeTargetInternal, this.readTargetInternal] = [\n this.readTargetInternal,\n this.writeTargetInternal\n ];\n this.poissonBlurQuad.material.uniforms[\"tDiffuse\"].value = this.readTargetInternal.texture;\n this.poissonBlurQuad.material.uniforms[\"sceneDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;\n this.poissonBlurQuad.material.uniforms[\"projMat\"].value = this.camera.projectionMatrix;\n this.poissonBlurQuad.material.uniforms[\"viewMat\"].value = this.camera.matrixWorldInverse;\n this.poissonBlurQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.poissonBlurQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.poissonBlurQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.poissonBlurQuad.material.uniforms[\"resolution\"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(0.5).floor() : this._r;\n this.poissonBlurQuad.material.uniforms[\"time\"].value = performance.now() / 1000;\n this.poissonBlurQuad.material.uniforms[\"blueNoise\"].value = this.bluenoise;\n this.poissonBlurQuad.material.uniforms[\"radius\"].value = this.configuration.denoiseRadius * (this.configuration.halfRes ? 0.5 : 1);\n this.poissonBlurQuad.material.uniforms[\"worldRadius\"].value = trueRadius;\n this.poissonBlurQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.poissonBlurQuad.material.uniforms[\"index\"].value = i;\n this.poissonBlurQuad.material.uniforms[\"poissonDisk\"].value = this.samplesDenoise;\n this.poissonBlurQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.poissonBlurQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.poissonBlurQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.poissonBlurQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n renderer.setRenderTarget(this.writeTargetInternal);\n this.poissonBlurQuad.render(renderer);\n }\n // Now, we have the blurred AO in writeTargetInternal\n // End the blur\n // Start the composition\n this.effectCompositerQuad.material.uniforms[\"sceneDiffuse\"].value = inputBuffer.texture;\n this.effectCompositerQuad.material.uniforms[\"sceneDepth\"].value = this.depthTexture;\n this.effectCompositerQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.effectCompositerQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.effectCompositerQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.effectCompositerQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.effectCompositerQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.effectCompositerQuad.material.uniforms[\"ortho\"].value = this.camera.isOrthographicCamera;\n this.effectCompositerQuad.material.uniforms[\"downsampledDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;\n this.effectCompositerQuad.material.uniforms[\"resolution\"].value = this._r;\n this.effectCompositerQuad.material.uniforms[\"blueNoise\"].value = this.bluenoise;\n this.effectCompositerQuad.material.uniforms[\"intensity\"].value = this.configuration.intensity;\n this.effectCompositerQuad.material.uniforms[\"renderMode\"].value = this.configuration.renderMode;\n this.effectCompositerQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n this.effectCompositerQuad.material.uniforms[\"radius\"].value = trueRadius;\n this.effectCompositerQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.effectCompositerQuad.material.uniforms[\"gammaCorrection\"].value = this.autosetGamma ? this.renderToScreen : this.configuration.gammaCorrection;\n this.effectCompositerQuad.material.uniforms[\"tDiffuse\"].value = this.writeTargetInternal.texture;\n this.effectCompositerQuad.material.uniforms[\"color\"].value = this._c.copy(this.configuration.color).convertSRGBToLinear();\n this.effectCompositerQuad.material.uniforms[\"colorMultiply\"].value = this.configuration.colorMultiply;\n this.effectCompositerQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.effectCompositerQuad.material.uniforms[\"fog\"].value = !!this.scene.fog;\n if (this.scene.fog) {\n if (this.scene.fog.isFog) {\n this.effectCompositerQuad.material.uniforms[\"fogExp\"].value = false;\n this.effectCompositerQuad.material.uniforms[\"fogNear\"].value = this.scene.fog.near;\n this.effectCompositerQuad.material.uniforms[\"fogFar\"].value = this.scene.fog.far;\n } else if (this.scene.fog.isFogExp2) {\n this.effectCompositerQuad.material.uniforms[\"fogExp\"].value = true;\n this.effectCompositerQuad.material.uniforms[\"fogDensity\"].value = this.scene.fog.density;\n } else console.error(`Unsupported fog type ${this.scene.fog.constructor.name} in SSAOPass.`);\n }\n renderer.setRenderTarget(/* this.renderToScreen ? null :\n outputBuffer*/ this.outputTargetInternal);\n this.effectCompositerQuad.render(renderer);\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);\n this.copyQuad.material.uniforms[\"tDiffuse\"].value = this.outputTargetInternal.texture;\n this.copyQuad.render(renderer);\n if (this.debugMode) {\n gl.endQuery(ext.TIME_ELAPSED_EXT);\n $87431ee93b037844$var$checkTimerQuery(timerQuery, gl, this);\n }\n renderer.xr.enabled = xrEnabled;\n }\n /**\n * Enables the debug mode of the AO, meaning the lastTime value will be updated.\n */ enableDebugMode() {\n this.debugMode = true;\n }\n /**\n * Disables the debug mode of the AO, meaning the lastTime value will not be updated.\n */ disableDebugMode() {\n this.debugMode = false;\n }\n /**\n * Sets the display mode of the AO\n * @param {\"Combined\" | \"AO\" | \"No AO\" | \"Split\" | \"Split AO\"} mode - The display mode. \n */ setDisplayMode(mode) {\n this.configuration.renderMode = [\n \"Combined\",\n \"AO\",\n \"No AO\",\n \"Split\",\n \"Split AO\"\n ].indexOf(mode);\n }\n /**\n * \n * @param {\"Performance\" | \"Low\" | \"Medium\" | \"High\" | \"Ultra\"} mode \n */ setQualityMode(mode) {\n if (mode === \"Performance\") {\n this.configuration.aoSamples = 8;\n this.configuration.denoiseSamples = 4;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"Low\") {\n this.configuration.aoSamples = 16;\n this.configuration.denoiseSamples = 4;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"Medium\") {\n this.configuration.aoSamples = 16;\n this.configuration.denoiseSamples = 8;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"High\") {\n this.configuration.aoSamples = 64;\n this.configuration.denoiseSamples = 8;\n this.configuration.denoiseRadius = 6;\n } else if (mode === \"Ultra\") {\n this.configuration.aoSamples = 64;\n this.configuration.denoiseSamples = 16;\n this.configuration.denoiseRadius = 6;\n }\n }\n}\n\n\n\nconst $05f6997e4b65da14$var$bluenoiseBits = Uint8Array.from(atob((0, $06269ad78f3c5fdf$export$2e2bcd8739ae039)), (c)=>c.charCodeAt(0));\n/**\n * \n * @param {*} timerQuery \n * @param {THREE.WebGLRenderer} gl \n * @param {N8AOPass} pass \n */ function $05f6997e4b65da14$var$checkTimerQuery(timerQuery, gl, pass) {\n const available = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT_AVAILABLE);\n if (available) {\n const elapsedTimeInNs = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT);\n const elapsedTimeInMs = elapsedTimeInNs / 1000000;\n pass.lastTime = elapsedTimeInMs;\n } else // If the result is not available yet, check again after a delay\n setTimeout(()=>{\n $05f6997e4b65da14$var$checkTimerQuery(timerQuery, gl, pass);\n }, 1);\n}\nclass $05f6997e4b65da14$export$2d57db20b5eb5e0a extends (0, $5Whe3$Pass) {\n /**\n * \n * @param {THREE.Scene} scene\n * @param {THREE.Camera} camera \n * @param {number} width \n * @param {number} height\n * \n * @property {THREE.Scene} scene\n * @property {THREE.Camera} camera\n * @property {number} width\n * @property {number} height\n */ constructor(scene, camera, width = 512, height = 512){\n super();\n this.width = width;\n this.height = height;\n this.clear = true;\n this.camera = camera;\n this.scene = scene;\n /**\n * @type {Proxy & {\n * aoSamples: number,\n * aoRadius: number,\n * denoiseSamples: number,\n * denoiseRadius: number,\n * distanceFalloff: number,\n * intensity: number,\n * denoiseIterations: number,\n * renderMode: 0 | 1 | 2 | 3 | 4,\n * color: THREE.Color,\n * gammaCorrection: boolean,\n * logarithmicDepthBuffer: boolean\n * screenSpaceRadius: boolean,\n * halfRes: boolean,\n * depthAwareUpsampling: boolean,\n * autoRenderBeauty: boolean\n * colorMultiply: boolean\n * }\n */ this.configuration = new Proxy({\n aoSamples: 16,\n aoRadius: 5.0,\n denoiseSamples: 8,\n denoiseRadius: 12,\n distanceFalloff: 1.0,\n intensity: 5,\n denoiseIterations: 2.0,\n renderMode: 0,\n color: new $5Whe3$Color(0, 0, 0),\n gammaCorrection: true,\n logarithmicDepthBuffer: false,\n screenSpaceRadius: false,\n halfRes: false,\n depthAwareUpsampling: true,\n autoRenderBeauty: true,\n colorMultiply: true\n }, {\n set: (target, propName, value)=>{\n const oldProp = target[propName];\n target[propName] = value;\n if (propName === \"aoSamples\" && oldProp !== value) this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n if (propName === \"denoiseSamples\" && oldProp !== value) this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n if (propName === \"halfRes\" && oldProp !== value) {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureHalfResTargets();\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n this.setSize(this.width, this.height);\n }\n if (propName === \"depthAwareUpsampling\" && oldProp !== value) this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n return true;\n }\n });\n /** @type {THREE.Vector3[]} */ this.samples = [];\n /** @type {number[]} */ this.samplesR = [];\n /** @type {THREE.Vector2[]} */ this.samplesDenoise = [];\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n this.configureSampleDependentPasses();\n this.configureHalfResTargets();\n this.beautyRenderTarget = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$NearestFilter\n });\n this.beautyRenderTarget.depthTexture = new $5Whe3$DepthTexture(this.width, this.height, $5Whe3$UnsignedIntType);\n this.beautyRenderTarget.depthTexture.format = $5Whe3$DepthFormat;\n this.writeTargetInternal = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$LinearFilter,\n depthBuffer: false\n });\n this.readTargetInternal = new $5Whe3$WebGLRenderTarget(this.width, this.height, {\n minFilter: $5Whe3$LinearFilter,\n magFilter: $5Whe3$LinearFilter,\n depthBuffer: false\n });\n /** @type {THREE.DataTexture} */ this.bluenoise = new $5Whe3$DataTexture($05f6997e4b65da14$var$bluenoiseBits, 128, 128);\n this.bluenoise.colorSpace = $5Whe3$NoColorSpace;\n this.bluenoise.wrapS = $5Whe3$RepeatWrapping;\n this.bluenoise.wrapT = $5Whe3$RepeatWrapping;\n this.bluenoise.minFilter = $5Whe3$NearestFilter;\n this.bluenoise.magFilter = $5Whe3$NearestFilter;\n this.bluenoise.needsUpdate = true;\n this.lastTime = 0;\n this._r = new $5Whe3$Vector2();\n this._c = new $5Whe3$Color();\n }\n configureHalfResTargets() {\n if (this.configuration.halfRes) {\n this.depthDownsampleTarget = /*new THREE.WebGLRenderTarget(this.width / 2, this.height / 2, {\n minFilter: THREE.NearestFilter,\n magFilter: THREE.NearestFilter,\n depthBuffer: false,\n format: THREE.RedFormat,\n type: THREE.FloatType\n });*/ new $5Whe3$WebGLMultipleRenderTargets(this.width / 2, this.height / 2, 2);\n this.depthDownsampleTarget.texture[0].format = $5Whe3$RedFormat;\n this.depthDownsampleTarget.texture[0].type = $5Whe3$FloatType;\n this.depthDownsampleTarget.texture[0].minFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[0].magFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[0].depthBuffer = false;\n this.depthDownsampleTarget.texture[1].format = $5Whe3$RGBAFormat;\n this.depthDownsampleTarget.texture[1].type = $5Whe3$HalfFloatType;\n this.depthDownsampleTarget.texture[1].minFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[1].magFilter = $5Whe3$NearestFilter;\n this.depthDownsampleTarget.texture[1].depthBuffer = false;\n this.depthDownsampleQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial((0, $26aca173e0984d99$export$1efdf491687cd442)));\n } else {\n if (this.depthDownsampleTarget) {\n this.depthDownsampleTarget.dispose();\n this.depthDownsampleTarget = null;\n }\n if (this.depthDownsampleQuad) {\n this.depthDownsampleQuad.dispose();\n this.depthDownsampleQuad = null;\n }\n }\n }\n configureSampleDependentPasses() {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n }\n configureAOPass(logarithmicDepthBuffer = false) {\n this.samples = this.generateHemisphereSamples(this.configuration.aoSamples);\n this.samplesR = this.generateHemisphereSamplesR(this.configuration.aoSamples);\n const e = {\n ...(0, $1ed45968c1160c3c$export$c9b263b9a17dffd7)\n };\n e.fragmentShader = e.fragmentShader.replace(\"16\", this.configuration.aoSamples).replace(\"16.0\", this.configuration.aoSamples + \".0\");\n if (logarithmicDepthBuffer) e.fragmentShader = \"#define LOGDEPTH\\n\" + e.fragmentShader;\n if (this.configuration.halfRes) e.fragmentShader = \"#define HALFRES\\n\" + e.fragmentShader;\n if (this.effectShaderQuad) {\n this.effectShaderQuad.material.dispose();\n this.effectShaderQuad.material = new $5Whe3$ShaderMaterial(e);\n } else this.effectShaderQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(e));\n }\n configureDenoisePass(logarithmicDepthBuffer = false) {\n this.samplesDenoise = this.generateDenoiseSamples(this.configuration.denoiseSamples, 11);\n const p = {\n ...(0, $e52378cd0f5a973d$export$57856b59f317262e)\n };\n p.fragmentShader = p.fragmentShader.replace(\"16\", this.configuration.denoiseSamples);\n if (logarithmicDepthBuffer) p.fragmentShader = \"#define LOGDEPTH\\n\" + p.fragmentShader;\n if (this.poissonBlurQuad) {\n this.poissonBlurQuad.material.dispose();\n this.poissonBlurQuad.material = new $5Whe3$ShaderMaterial(p);\n } else this.poissonBlurQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(p));\n }\n configureEffectCompositer(logarithmicDepthBuffer = false) {\n const e = {\n ...(0, $12b21d24d1192a04$export$a815acccbd2c9a49)\n };\n if (logarithmicDepthBuffer) e.fragmentShader = \"#define LOGDEPTH\\n\" + e.fragmentShader;\n if (this.configuration.halfRes && this.configuration.depthAwareUpsampling) e.fragmentShader = \"#define HALFRES\\n\" + e.fragmentShader;\n if (this.effectCompositerQuad) {\n this.effectCompositerQuad.material.dispose();\n this.effectCompositerQuad.material = new $5Whe3$ShaderMaterial(e);\n } else this.effectCompositerQuad = new (0, $e4ca8dcb0218f846$export$dcd670d73db751f5)(new $5Whe3$ShaderMaterial(e));\n }\n /**\n * \n * @param {Number} n \n * @returns {THREE.Vector3[]}\n */ generateHemisphereSamples(n) {\n const points = [];\n for(let k = 0; k < n; k++){\n const theta = 2.399963 * k;\n const r = Math.sqrt(k + 0.5) / Math.sqrt(n);\n const x = r * Math.cos(theta);\n const y = r * Math.sin(theta);\n // Project to hemisphere\n const z = Math.sqrt(1 - (x * x + y * y));\n points.push(new $5Whe3$Vector3(x, y, z));\n }\n return points;\n }\n /**\n * \n * @param {number} n \n * @returns {number[]}\n */ generateHemisphereSamplesR(n) {\n let samplesR = [];\n for(let i = 0; i < n; i++)samplesR.push((i + 1) / n);\n return samplesR;\n }\n /**\n * \n * @param {number} numSamples \n * @param {number} numRings \n * @returns {THREE.Vector2[]}\n */ generateDenoiseSamples(numSamples, numRings) {\n const angleStep = 2 * Math.PI * numRings / numSamples;\n const invNumSamples = 1.0 / numSamples;\n const radiusStep = invNumSamples;\n const samples = [];\n let radius = invNumSamples;\n let angle = 0;\n for(let i = 0; i < numSamples; i++){\n samples.push(new $5Whe3$Vector2(Math.cos(angle), Math.sin(angle)).multiplyScalar(Math.pow(radius, 0.75)));\n radius += radiusStep;\n angle += angleStep;\n }\n return samples;\n }\n setSize(width, height) {\n this.width = width;\n this.height = height;\n const c = this.configuration.halfRes ? 0.5 : 1;\n this.beautyRenderTarget.setSize(width, height);\n this.writeTargetInternal.setSize(width * c, height * c);\n this.readTargetInternal.setSize(width * c, height * c);\n if (this.configuration.halfRes) this.depthDownsampleTarget.setSize(width * c, height * c);\n }\n render(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {\n if (renderer.capabilities.logarithmicDepthBuffer !== this.configuration.logarithmicDepthBuffer) {\n this.configuration.logarithmicDepthBuffer = renderer.capabilities.logarithmicDepthBuffer;\n this.configureAOPass(this.configuration.logarithmicDepthBuffer);\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);\n }\n let gl;\n let ext;\n let timerQuery;\n if (this.debugMode) {\n gl = renderer.getContext();\n ext = gl.getExtension(\"EXT_disjoint_timer_query_webgl2\");\n if (ext === null) {\n console.error(\"EXT_disjoint_timer_query_webgl2 not available, disabling debug mode.\");\n this.debugMode = false;\n }\n }\n if (this.configuration.autoRenderBeauty) {\n renderer.setRenderTarget(this.beautyRenderTarget);\n renderer.render(this.scene, this.camera);\n }\n if (this.debugMode) {\n timerQuery = gl.createQuery();\n gl.beginQuery(ext.TIME_ELAPSED_EXT, timerQuery);\n }\n const xrEnabled = renderer.xr.enabled;\n renderer.xr.enabled = false;\n this.camera.updateMatrixWorld();\n this._r.set(this.width, this.height);\n let trueRadius = this.configuration.aoRadius;\n if (this.configuration.halfRes && this.configuration.screenSpaceRadius) trueRadius *= 0.5;\n if (this.configuration.halfRes) {\n renderer.setRenderTarget(this.depthDownsampleTarget);\n this.depthDownsampleQuad.material.uniforms.sceneDepth.value = this.beautyRenderTarget.depthTexture;\n this.depthDownsampleQuad.material.uniforms.resolution.value = this._r;\n this.depthDownsampleQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.depthDownsampleQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.depthDownsampleQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.depthDownsampleQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.depthDownsampleQuad.material.uniforms[\"logDepth\"].value = this.configuration.logarithmicDepthBuffer;\n this.depthDownsampleQuad.render(renderer);\n }\n this.effectShaderQuad.material.uniforms[\"sceneDiffuse\"].value = this.beautyRenderTarget.texture;\n this.effectShaderQuad.material.uniforms[\"sceneDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.beautyRenderTarget.depthTexture;\n this.effectShaderQuad.material.uniforms[\"sceneNormal\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[1] : null;\n this.effectShaderQuad.material.uniforms[\"projMat\"].value = this.camera.projectionMatrix;\n this.effectShaderQuad.material.uniforms[\"viewMat\"].value = this.camera.matrixWorldInverse;\n this.effectShaderQuad.material.uniforms[\"projViewMat\"].value = this.camera.projectionMatrix.clone().multiply(this.camera.matrixWorldInverse.clone());\n this.effectShaderQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.effectShaderQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.effectShaderQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.effectShaderQuad.material.uniforms[\"resolution\"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(0.5).floor() : this._r;\n this.effectShaderQuad.material.uniforms[\"time\"].value = performance.now() / 1000;\n this.effectShaderQuad.material.uniforms[\"samples\"].value = this.samples;\n this.effectShaderQuad.material.uniforms[\"samplesR\"].value = this.samplesR;\n this.effectShaderQuad.material.uniforms[\"bluenoise\"].value = this.bluenoise;\n this.effectShaderQuad.material.uniforms[\"radius\"].value = trueRadius;\n this.effectShaderQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.effectShaderQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.effectShaderQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.effectShaderQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.effectShaderQuad.material.uniforms[\"ortho\"].value = this.camera.isOrthographicCamera;\n this.effectShaderQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n // Start the AO\n renderer.setRenderTarget(this.writeTargetInternal);\n this.effectShaderQuad.render(renderer);\n // End the AO\n // Start the blur\n for(let i = 0; i < this.configuration.denoiseIterations; i++){\n [this.writeTargetInternal, this.readTargetInternal] = [\n this.readTargetInternal,\n this.writeTargetInternal\n ];\n this.poissonBlurQuad.material.uniforms[\"tDiffuse\"].value = this.readTargetInternal.texture;\n this.poissonBlurQuad.material.uniforms[\"sceneDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.beautyRenderTarget.depthTexture;\n this.poissonBlurQuad.material.uniforms[\"projMat\"].value = this.camera.projectionMatrix;\n this.poissonBlurQuad.material.uniforms[\"viewMat\"].value = this.camera.matrixWorldInverse;\n this.poissonBlurQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.poissonBlurQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.poissonBlurQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.poissonBlurQuad.material.uniforms[\"resolution\"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(0.5).floor() : this._r;\n this.poissonBlurQuad.material.uniforms[\"time\"].value = performance.now() / 1000;\n this.poissonBlurQuad.material.uniforms[\"blueNoise\"].value = this.bluenoise;\n this.poissonBlurQuad.material.uniforms[\"radius\"].value = this.configuration.denoiseRadius * (this.configuration.halfRes ? 0.5 : 1);\n this.poissonBlurQuad.material.uniforms[\"worldRadius\"].value = trueRadius;\n this.poissonBlurQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.poissonBlurQuad.material.uniforms[\"index\"].value = i;\n this.poissonBlurQuad.material.uniforms[\"poissonDisk\"].value = this.samplesDenoise;\n this.poissonBlurQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.poissonBlurQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.poissonBlurQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.poissonBlurQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n renderer.setRenderTarget(this.writeTargetInternal);\n this.poissonBlurQuad.render(renderer);\n }\n // Now, we have the blurred AO in writeTargetInternal\n // End the blur\n // Start the composition\n this.effectCompositerQuad.material.uniforms[\"sceneDiffuse\"].value = this.beautyRenderTarget.texture;\n this.effectCompositerQuad.material.uniforms[\"sceneDepth\"].value = this.beautyRenderTarget.depthTexture;\n this.effectCompositerQuad.material.uniforms[\"near\"].value = this.camera.near;\n this.effectCompositerQuad.material.uniforms[\"far\"].value = this.camera.far;\n this.effectCompositerQuad.material.uniforms[\"projectionMatrixInv\"].value = this.camera.projectionMatrixInverse;\n this.effectCompositerQuad.material.uniforms[\"viewMatrixInv\"].value = this.camera.matrixWorld;\n this.effectCompositerQuad.material.uniforms[\"logDepth\"].value = renderer.capabilities.logarithmicDepthBuffer;\n this.effectCompositerQuad.material.uniforms[\"ortho\"].value = this.camera.isOrthographicCamera;\n this.effectCompositerQuad.material.uniforms[\"downsampledDepth\"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.beautyRenderTarget.depthTexture;\n this.effectCompositerQuad.material.uniforms[\"resolution\"].value = this._r;\n this.effectCompositerQuad.material.uniforms[\"blueNoise\"].value = this.bluenoise;\n this.effectCompositerQuad.material.uniforms[\"intensity\"].value = this.configuration.intensity;\n this.effectCompositerQuad.material.uniforms[\"renderMode\"].value = this.configuration.renderMode;\n this.effectCompositerQuad.material.uniforms[\"screenSpaceRadius\"].value = this.configuration.screenSpaceRadius;\n this.effectCompositerQuad.material.uniforms[\"radius\"].value = trueRadius;\n this.effectCompositerQuad.material.uniforms[\"distanceFalloff\"].value = this.configuration.distanceFalloff;\n this.effectCompositerQuad.material.uniforms[\"gammaCorrection\"].value = this.configuration.gammaCorrection;\n this.effectCompositerQuad.material.uniforms[\"tDiffuse\"].value = this.writeTargetInternal.texture;\n this.effectCompositerQuad.material.uniforms[\"color\"].value = this._c.copy(this.configuration.color).convertSRGBToLinear();\n this.effectCompositerQuad.material.uniforms[\"colorMultiply\"].value = this.configuration.colorMultiply;\n this.effectCompositerQuad.material.uniforms[\"cameraPos\"].value = this.camera.getWorldPosition(new $5Whe3$Vector3());\n this.effectCompositerQuad.material.uniforms[\"fog\"].value = !!this.scene.fog;\n if (this.scene.fog) {\n if (this.scene.fog.isFog) {\n this.effectCompositerQuad.material.uniforms[\"fogExp\"].value = false;\n this.effectCompositerQuad.material.uniforms[\"fogNear\"].value = this.scene.fog.near;\n this.effectCompositerQuad.material.uniforms[\"fogFar\"].value = this.scene.fog.far;\n } else if (this.scene.fog.isFogExp2) {\n this.effectCompositerQuad.material.uniforms[\"fogExp\"].value = true;\n this.effectCompositerQuad.material.uniforms[\"fogDensity\"].value = this.scene.fog.density;\n } else console.error(`Unsupported fog type ${this.scene.fog.constructor.name} in SSAOPass.`);\n }\n renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer);\n this.effectCompositerQuad.render(renderer);\n if (this.debugMode) {\n gl.endQuery(ext.TIME_ELAPSED_EXT);\n $05f6997e4b65da14$var$checkTimerQuery(timerQuery, gl, this);\n }\n renderer.xr.enabled = xrEnabled;\n }\n /**\n * Enables the debug mode of the AO, meaning the lastTime value will be updated.\n */ enableDebugMode() {\n this.debugMode = true;\n }\n /**\n * Disables the debug mode of the AO, meaning the lastTime value will not be updated.\n */ disableDebugMode() {\n this.debugMode = false;\n }\n /**\n * Sets the display mode of the AO\n * @param {\"Combined\" | \"AO\" | \"No AO\" | \"Split\" | \"Split AO\"} mode - The display mode. \n */ setDisplayMode(mode) {\n this.configuration.renderMode = [\n \"Combined\",\n \"AO\",\n \"No AO\",\n \"Split\",\n \"Split AO\"\n ].indexOf(mode);\n }\n /**\n * \n * @param {\"Performance\" | \"Low\" | \"Medium\" | \"High\" | \"Ultra\"} mode \n */ setQualityMode(mode) {\n if (mode === \"Performance\") {\n this.configuration.aoSamples = 8;\n this.configuration.denoiseSamples = 4;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"Low\") {\n this.configuration.aoSamples = 16;\n this.configuration.denoiseSamples = 4;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"Medium\") {\n this.configuration.aoSamples = 16;\n this.configuration.denoiseSamples = 8;\n this.configuration.denoiseRadius = 12;\n } else if (mode === \"High\") {\n this.configuration.aoSamples = 64;\n this.configuration.denoiseSamples = 8;\n this.configuration.denoiseRadius = 6;\n } else if (mode === \"Ultra\") {\n this.configuration.aoSamples = 64;\n this.configuration.denoiseSamples = 16;\n this.configuration.denoiseRadius = 6;\n }\n }\n}\n\n\nexport {$05f6997e4b65da14$export$2d57db20b5eb5e0a as N8AOPass, $87431ee93b037844$export$2489f9981ab0fa82 as N8AOPostPass};\n//# sourceMappingURL=N8AO.js.map\n","// From https://github.com/N8python/n8ao\n// https://twitter.com/N8Programs/status/1660996748485984261\n\nimport { Ref, forwardRef, useLayoutEffect, useMemo } from 'react'\n/* @ts-ignore */\nimport { N8AOPostPass } from 'n8ao'\nimport { useThree, ReactThreeFiber, applyProps } from '@react-three/fiber'\n\ntype N8AOProps = {\n aoRadius?: number\n distanceFalloff?: number\n intensity?: number\n quality?: 'performance' | 'low' | 'medium' | 'high' | 'ultra'\n aoSamples?: number\n denoiseSamples?: number\n denoiseRadius?: number\n color?: ReactThreeFiber.Color\n halfRes?: boolean\n depthAwareUpsampling?: boolean\n screenSpaceRadius?: boolean\n renderMode?: 0 | 1 | 2 | 3 | 4\n}\n\nexport const N8AO = forwardRef<N8AOPostPass, N8AOProps>(\n (\n {\n halfRes,\n screenSpaceRadius,\n quality,\n depthAwareUpsampling = true,\n aoRadius = 5,\n aoSamples = 16,\n denoiseSamples = 4,\n denoiseRadius = 12,\n distanceFalloff = 1,\n intensity = 1,\n color,\n renderMode = 0,\n },\n ref: Ref<N8AOPostPass>\n ) => {\n const { camera, scene } = useThree()\n const effect = useMemo(() => new N8AOPostPass(scene, camera), [])\n useLayoutEffect(() => {\n applyProps(effect.configuration, {\n color,\n aoRadius,\n distanceFalloff,\n intensity,\n aoSamples,\n denoiseSamples,\n denoiseRadius,\n screenSpaceRadius,\n renderMode,\n halfRes,\n depthAwareUpsampling,\n })\n }, [\n screenSpaceRadius,\n color,\n aoRadius,\n distanceFalloff,\n intensity,\n aoSamples,\n denoiseSamples,\n denoiseRadius,\n renderMode,\n halfRes,\n depthAwareUpsampling,\n ])\n useLayoutEffect(() => {\n if (quality) effect.setQualityMode(quality.charAt(0).toUpperCase() + quality.slice(1))\n }, [quality])\n return <primitive ref={ref} object={effect} />\n }\n)\n"],"names":["createContext","useState","useMemo","jsx","useRef","useContext","useEffect","forwardRef","HalfFloatType","useThree","isWebGL2Available","EffectComposerImpl","RenderPass","downSamplingPass","normalPass","NormalPass","DepthDownsamplingPass","useFrame","useInstanceHandle","useLayoutEffect","children","i","Effect","EffectPass","Pass","useImperativeHandle","extend","THREE","DepthOfField","effect","DepthOfFieldEffect","MaskFunction","Vector3","scene","pointer","DepthPickingPass","CopyPass","useCallback","easing","jsxs","Fragment","createPortal","BlendFunction","viewport","raycaster","BloomEffect","BrightnessContrastEffect","ChromaticAberrationEffect","ColorAverage","ColorAverageEffect","ColorDepthEffect","DepthEffect","DotScreenEffect","Glitch","GlitchEffect","GlitchMode","GodRays","GodRaysEffect","Grid","GridEffect","HueSaturationEffect","NoiseEffect","Outline","OutlineEffect","Pixelation","PixelationEffect","ScanlineEffect","SelectiveBloom","SelectiveBloomEffect","SepiaEffect","SSAO","SSAOEffect","SMAAEffect","FXAAEffect","Texture","useLoader","TextureLoader","sRGBEncoding","RepeatWrapping","TextureEffect","ToneMappingEffect","VignetteEffect","ShockWaveEffect","LUT","LUT3DEffect","TiltShiftEffect","EffectAttribute","Uniform","Color","CanvasTexture","NearestFilter","ShaderMaterial","Vector2","Matrix3","REVISION","TangentSpaceNormalMap","GLSL3","Matrix4","WebGLRenderTarget","LinearFilter","WebGLMultipleRenderTargets","DepthPass","fragmentShader","ShaderChunk","Quaternion","VideoTexture","DataTexture","RGBAFormat","FloatType","FramebufferTexture","halton","WebGLCubeRenderTarget","Selection","CubeCamera","PMREMGenerator","SSR","$5Whe3$BufferGeometry","$5Whe3$BufferAttribute","$5Whe3$Sphere","$5Whe3$OrthographicCamera","$5Whe3$Mesh","$5Whe3$Matrix4","$5Whe3$Vector3","$5Whe3$Vector2","$5Whe3$Pass1","$5Whe3$Color","$5Whe3$ShaderMaterial","$5Whe3$WebGLRenderTarget","$5Whe3$LinearFilter","$5Whe3$DataTexture","$5Whe3$NoColorSpace","$5Whe3$RepeatWrapping","$5Whe3$NearestFilter","$5Whe3$WebGLMultipleRenderTargets","$5Whe3$RedFormat","$5Whe3$FloatType","$5Whe3$RGBAFormat","$5Whe3$HalfFloatType","N8AOPostPass","applyProps"],"mappings":"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","x_google_ignoreList":[36]}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}