@tresjs/post-processing 3.1.0 → 3.1.1

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 (53) hide show
  1. package/dist/tres-post-processing.d.ts +1226 -2
  2. package/dist/tres-post-processing.js +2432 -3380
  3. package/package.json +15 -15
  4. package/dist/core/pmndrs/ASCIIPmndrs.vue.d.ts +0 -40
  5. package/dist/core/pmndrs/BarrelBlurPmndrs.vue.d.ts +0 -26
  6. package/dist/core/pmndrs/BloomPmndrs.vue.d.ts +0 -61
  7. package/dist/core/pmndrs/BrightnessContrastPmndrs.vue.d.ts +0 -20
  8. package/dist/core/pmndrs/ChromaticAberrationPmndrs.vue.d.ts +0 -27
  9. package/dist/core/pmndrs/ColorAveragePmndrs.vue.d.ts +0 -16
  10. package/dist/core/pmndrs/ColorDepthPmndrs.vue.d.ts +0 -20
  11. package/dist/core/pmndrs/DepthOfFieldPmndrs.vue.d.ts +0 -35
  12. package/dist/core/pmndrs/DepthPickingPassPmndrs.vue.d.ts +0 -18
  13. package/dist/core/pmndrs/DotScreenPmndrs.vue.d.ts +0 -22
  14. package/dist/core/pmndrs/EffectComposerPmndrs.vue.d.ts +0 -36
  15. package/dist/core/pmndrs/FXAAPmndrs.vue.d.ts +0 -32
  16. package/dist/core/pmndrs/FishEyePmndrs.vue.d.ts +0 -30
  17. package/dist/core/pmndrs/GlitchPmndrs.vue.d.ts +0 -51
  18. package/dist/core/pmndrs/GodRaysPmndrs.vue.d.ts +0 -65
  19. package/dist/core/pmndrs/GridPmndrs.vue.d.ts +0 -20
  20. package/dist/core/pmndrs/HueSaturationPmndrs.vue.d.ts +0 -22
  21. package/dist/core/pmndrs/KuwaharaPmndrs.vue.d.ts +0 -27
  22. package/dist/core/pmndrs/LensDistortionPmndrs.vue.d.ts +0 -25
  23. package/dist/core/pmndrs/LinocutPmndrs.vue.d.ts +0 -15
  24. package/dist/core/pmndrs/NoisePmndrs.vue.d.ts +0 -15
  25. package/dist/core/pmndrs/OutlinePmndrs.vue.d.ts +0 -43
  26. package/dist/core/pmndrs/PixelationPmndrs.vue.d.ts +0 -12
  27. package/dist/core/pmndrs/SMAAPmndrs.vue.d.ts +0 -42
  28. package/dist/core/pmndrs/ScanlinePmndrs.vue.d.ts +0 -24
  29. package/dist/core/pmndrs/SepiaPmndrs.vue.d.ts +0 -16
  30. package/dist/core/pmndrs/ShockWavePmndrs.vue.d.ts +0 -29
  31. package/dist/core/pmndrs/TexturePmndrs.vue.d.ts +0 -21
  32. package/dist/core/pmndrs/TiltShiftPmndrs.vue.d.ts +0 -49
  33. package/dist/core/pmndrs/ToneMappingPmndrs.vue.d.ts +0 -36
  34. package/dist/core/pmndrs/VignettePmndrs.vue.d.ts +0 -15
  35. package/dist/core/pmndrs/composables/useEffectPmndrs.d.ts +0 -11
  36. package/dist/core/pmndrs/custom/barrel-blur/index.d.ts +0 -36
  37. package/dist/core/pmndrs/custom/fish-eye/index.d.ts +0 -44
  38. package/dist/core/pmndrs/custom/kuwahara/index.d.ts +0 -31
  39. package/dist/core/pmndrs/custom/linocut/index.d.ts +0 -27
  40. package/dist/core/pmndrs/index.d.ts +0 -33
  41. package/dist/core/three/EffectComposer.vue.d.ts +0 -20
  42. package/dist/core/three/Glitch.vue.d.ts +0 -15
  43. package/dist/core/three/Halftone.vue.d.ts +0 -23
  44. package/dist/core/three/Output.vue.d.ts +0 -5
  45. package/dist/core/three/Pixelation.vue.d.ts +0 -10
  46. package/dist/core/three/SMAA.vue.d.ts +0 -9
  47. package/dist/core/three/UnrealBloom.vue.d.ts +0 -14
  48. package/dist/core/three/composables/useEffect.d.ts +0 -10
  49. package/dist/core/three/index.d.ts +0 -9
  50. package/dist/index.d.ts +0 -2
  51. package/dist/tres-post-processing.umd.cjs +0 -1231
  52. package/dist/util/object.d.ts +0 -55
  53. package/dist/util/prop.d.ts +0 -40
@@ -1,1231 +0,0 @@
1
- /**
2
- * name: @tresjs/post-processing
3
- * version: v3.1.0
4
- * (c) 2025
5
- * description: Post-processing library for TresJS
6
- * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
- */
8
- (function(d,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("vue"),require("postprocessing"),require("@tresjs/core"),require("three"),require("@vueuse/core")):typeof define=="function"&&define.amd?define(["exports","vue","postprocessing","@tresjs/core","three","@vueuse/core"],s):(d=typeof globalThis<"u"?globalThis:d||self,s(d["tres-post-processing"]={},d.Vue,d.Postprocessing,d.TresjsCore,d.Three,d.VueUseCore))})(this,(function(d,s,c,v,i,H){"use strict";class V{static isWebGL2Available(){try{const t=document.createElement("canvas");return!!(window.WebGL2RenderingContext&&t.getContext("webgl2"))}catch{return!1}}static isColorSpaceAvailable(t){try{const e=document.createElement("canvas"),a=window.WebGL2RenderingContext&&e.getContext("webgl2");return a.drawingBufferColorSpace=t,a.drawingBufferColorSpace===t}catch{return!1}}static getWebGL2ErrorMessage(){return this._getErrorMessage(2)}static _getErrorMessage(t){const e={1:"WebGL",2:"WebGL 2"},a={1:window.WebGLRenderingContext,2:window.WebGL2RenderingContext};let o='Your $0 does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" style="color:#000">$1</a>';const n=document.createElement("div");return n.id="webglmessage",n.style.fontFamily="monospace",n.style.fontSize="13px",n.style.fontWeight="normal",n.style.textAlign="center",n.style.background="#fff",n.style.color="#000",n.style.padding="1.5em",n.style.width="400px",n.style.margin="5em auto 0",a[t]?o=o.replace("$0","graphics card"):o=o.replace("$0","browser"),o=o.replace("$1",e[t]),n.innerHTML=o,n}}const P=Symbol("effectComposerPmndrs"),$=s.defineComponent({__name:"EffectComposerPmndrs",props:{enabled:{type:Boolean,default:!0},depthBuffer:{type:Boolean,default:void 0},disableNormalPass:{type:Boolean,default:!1},stencilBuffer:{type:Boolean,default:void 0},resolutionScale:{},autoClear:{type:Boolean,default:!0},multisampling:{default:0},frameBufferType:{default:i.HalfFloatType}},emits:["render"],setup(r,{expose:t,emit:e}){const a=r,o=e,{scene:n,camera:l,renderer:u,sizes:f}=v.useTresContext(),h=s.shallowRef(null);let p=null,w=null;s.provide(P,h),t({composer:h});const A=()=>{h.value&&(w=new c.NormalPass(n.value,l.activeCamera.value),w.enabled=!1,h.value.addPass(w),a.resolutionScale!==void 0&&V.isWebGL2Available()&&(p=new c.DepthDownsamplingPass({normalBuffer:w.texture,resolutionScale:a.resolutionScale}),p.enabled=!1,h.value.addPass(p)))},D=s.computed(()=>{const x=new c.EffectComposer,S={depthBuffer:a.depthBuffer!==void 0?a.depthBuffer:x.inputBuffer.depthBuffer,stencilBuffer:a.stencilBuffer!==void 0?a.stencilBuffer:x.inputBuffer.stencilBuffer,multisampling:V.isWebGL2Available()?a.multisampling!==void 0?a.multisampling:x.multisampling:0,frameBufferType:a.frameBufferType!==void 0?a.frameBufferType:i.HalfFloatType};return x.dispose(),S}),b=()=>{!u.instance&&!n.value&&!l.activeCamera.value||(h.value?.dispose(),h.value=new c.EffectComposer(u.instance,D.value),h.value.addPass(new c.RenderPass(n.value,l.activeCamera.value)),a.disableNormalPass||A())};return s.watch([n,l.activeCamera,()=>a.disableNormalPass],()=>{!f.width.value||!f.height.value||b()}),s.watch(()=>[f.width.value,f.height.value],([x,S])=>{!x&&!S||(h.value?h.value.setSize(x,S):b())},{immediate:!0}),u.replaceRenderFunction(x=>{if(a.enabled&&u.instance&&h.value&&f.width.value&&f.height.value){const S=u.instance.autoClear;u.instance.autoClear=a.autoClear,a.stencilBuffer&&!a.autoClear&&u.instance.clearStencil(),h.value.render(),o("render",h.value),u.instance.autoClear=S,x()}}),s.onUnmounted(()=>{h.value?.dispose()}),(x,S)=>s.renderSlot(x.$slots,"default")}}),m=(r,t,e)=>{const a=s.inject(P),o=s.shallowRef(null),n=s.shallowRef(null),{scene:l,camera:u,invalidate:f}=v.useTres();s.watch(t,()=>f());const h=()=>{o.value&&a?.value?.removePass(o.value),n.value?.dispose(),o.value?.dispose()},p=A=>{!u.value||!a?.value||!l.value||(n.value=r(),o.value=new c.EffectPass(u.value,n.value),a.value.addPass(o.value,A))};e&&s.watch(()=>e.map(A=>t[A]),()=>{if(!a?.value)return;const A=a.value?.passes.findIndex(D=>D===o.value);~A&&(h(),p(A))}),s.watchEffect(()=>{!u.value||!n?.value||(n.value.mainCamera=u.value)});const w=s.watchEffect(()=>{!u.value||!a?.value||!l.value||(s.nextTick(()=>w()),!n.value&&p())});return s.onUnmounted(()=>{h()}),{pass:o,effect:n}},I=/([^[.\]])+/g,ee=(r,t)=>t?(Array.isArray(t)?t:t.match(I))?.reduce((a,o)=>a&&a[o],r):void 0,X=(r,t,e)=>{const a=Array.isArray(t)?t:t.match(I);a&&a.reduce((o,n,l)=>(o[n]===void 0&&(o[n]={}),l===a.length-1&&(o[n]=e),o[n]),r)},te=(r,t)=>{const e={...r};return t.forEach(a=>delete e[a]),e},E=(r,t,e,a,o={})=>s.watch(r,n=>{if(t.value)if(n===void 0){const l=a();X(t.value,e,ee(l,e)),l.dispose?.()}else X(t.value,e,r())},o),g=(r,t,e)=>r.map(([a,o])=>E(a,t,o,e)),N=(r,t,e)=>Object.keys(r).map(a=>E(()=>r[a],t,a,e)),oe=s.defineComponent({__name:"BloomPmndrs",props:{blendFunction:{},intensity:{},kernelSize:{},luminanceThreshold:{},luminanceSmoothing:{},mipmapBlur:{type:Boolean,default:void 0}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.BloomEffect(e),e,["mipmapBlur"]);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.intensity,"intensity"],[()=>e.kernelSize,"kernelSize"],[()=>e.luminanceSmoothing,"luminanceMaterial.smoothing"],[()=>e.luminanceThreshold,"luminanceMaterial.threshold"]],o,()=>new c.BloomEffect),()=>{}}}),ae=s.defineComponent({__name:"DepthOfFieldPmndrs",props:{blendFunction:{},worldFocusDistance:{},worldFocusRange:{},focusDistance:{},focusRange:{},bokehScale:{},resolutionScale:{},resolutionX:{},resolutionY:{}},setup(r,{expose:t}){const e=r,{camera:a}=v.useTres(),{pass:o,effect:n}=m(()=>new c.DepthOfFieldEffect(a.value,e),e);return t({pass:o,effect:n}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.worldFocusDistance,"circleOfConfusionMaterial.worldFocusDistance"],[()=>e.focusDistance,"circleOfConfusionMaterial.focusDistance"],[()=>e.worldFocusRange,"circleOfConfusionMaterial.worldFocusRange"],[()=>e.focusRange,"circleOfConfusionMaterial.focusRange"],[()=>e.bokehScale,"bokehScale"],[()=>e.resolutionScale,"blurPass.resolution.scale"],[()=>e.resolutionX,"resolution.width"],[()=>e.resolutionY,"resolution.height"]],n,()=>new c.DepthOfFieldEffect),()=>{}}}),ne=s.defineComponent({__name:"GlitchPmndrs",props:{blendFunction:{},delay:{},duration:{},strength:{},mode:{},active:{type:Boolean},ratio:{},columns:{},chromaticAberrationOffset:{},perturbationMap:{},dtSize:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.GlitchEffect(e),e,["dtSize"]);t({pass:a,effect:o});const{invalidate:n}=v.useTres(),{onBeforeRender:l}=v.useLoop();return l(()=>n()),s.watchEffect(()=>{const u=()=>{if(e.mode!==void 0)return e.active===!1?c.GlitchMode.DISABLED:e.mode;const f=new c.GlitchEffect,h=f.mode;return f.dispose(),h};o.value&&(o.value.mode=u())}),E(()=>e.blendFunction,o,"blendMode.blendFunction",()=>new c.GlitchEffect),N(te(e,["active","blendFunction"]),o,()=>new c.GlitchEffect),()=>{}}}),ie=s.defineComponent({__name:"NoisePmndrs",props:{premultiply:{type:Boolean,default:void 0},blendFunction:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.NoiseEffect(e),e);t({pass:a,effect:o});const{invalidate:n}=v.useTres(),{onBeforeRender:l}=v.useLoop();return l(()=>n()),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.premultiply,"premultiply"]],o,()=>new c.NoiseEffect),()=>{}}}),se=s.defineComponent({__name:"OutlinePmndrs",props:{outlinedObjects:{},blur:{type:Boolean,default:void 0},xRay:{type:Boolean,default:void 0},kernelSize:{},pulseSpeed:{},resolutionX:{},resolutionY:{},edgeStrength:{},patternScale:{},multisampling:{},blendFunction:{},patternTexture:{},resolutionScale:{},hiddenEdgeColor:{},visibleEdgeColor:{}},setup(r,{expose:t}){const e=r,a=h=>h!==void 0?v.normalizeColor(h).getHex():void 0,{camera:o,scene:n}=v.useTres(),{pass:l,effect:u}=m(()=>new c.OutlineEffect(n.value,o.value,{blur:e.blur,xRay:e.xRay,kernelSize:e.kernelSize,pulseSpeed:e.pulseSpeed,resolutionX:e.resolutionX,resolutionY:e.resolutionY,patternScale:e.patternScale,edgeStrength:e.edgeStrength,blendFunction:e.blendFunction,multisampling:e.multisampling,patternTexture:e.patternTexture,resolutionScale:e.resolutionScale,hiddenEdgeColor:a(e.hiddenEdgeColor),visibleEdgeColor:a(e.visibleEdgeColor)}),e);t({pass:l,effect:u}),s.watch([()=>e.outlinedObjects,u],()=>{u.value?.selection.set(e.outlinedObjects||[])},{immediate:!0});const f=s.computed(()=>({hiddenEdgeColor:e.hiddenEdgeColor?v.normalizeColor(e.hiddenEdgeColor):void 0,visibleEdgeColor:e.visibleEdgeColor?v.normalizeColor(e.visibleEdgeColor):void 0}));return g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.blur,"blur"],[()=>e.xRay,"xRay"],[()=>e.pulseSpeed,"pulseSpeed"],[()=>e.kernelSize,"kernelSize"],[()=>e.edgeStrength,"edgeStrength"],[()=>e.patternScale,"patternScale"],[()=>e.multisampling,"multisampling"],[()=>e.resolutionX,"resolution.width"],[()=>e.resolutionY,"resolution.height"],[()=>e.patternTexture,"patternTexture"],[()=>e.resolutionScale,"resolution.scale"],[()=>f.value.hiddenEdgeColor,"hiddenEdgeColor"],[()=>f.value.visibleEdgeColor,"visibleEdgeColor"]],u,()=>new c.OutlineEffect),()=>{}}}),re=s.defineComponent({__name:"PixelationPmndrs",props:{granularity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.PixelationEffect(e.granularity),e);return t({pass:a,effect:o}),N(e,o,()=>new c.PixelationEffect),()=>{}}}),le=s.defineComponent({__name:"VignettePmndrs",props:{technique:{},blendFunction:{},offset:{},darkness:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.VignetteEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.offset,"offset"],[()=>e.darkness,"darkness"],[()=>e.technique,"technique"]],o,()=>new c.VignetteEffect),()=>{}}});class j extends c.Effect{constructor({blendFunction:t=c.BlendFunction.NORMAL,amount:e=.15,offset:a=new i.Vector2(.5,.5)}={}){super("BarrelBlurEffect",`
9
- uniform float amount;
10
- uniform vec2 offset;
11
-
12
- #define NUM_ITER 16
13
- #define RECIP_NUM_ITER 0.0625
14
- #define GAMMA 1.0
15
-
16
- vec3 spectrum_offset(float t) {
17
- float lo = step(t, 0.5);
18
- float hi = 1.0 - lo;
19
- float w = 1.0 - abs(2.0 * t - 1.0);
20
- return pow(vec3(lo, 1.0, hi) * vec3(1.0 - w, w, 1.0 - w), vec3(1.0 / GAMMA));
21
- }
22
-
23
- vec2 barrelDistortion(vec2 p, float amt) {
24
- p = p - offset;
25
- float theta = atan(p.y, p.x);
26
- float radius = pow(length(p), 1.0 + 3.0 * amt);
27
- return vec2(cos(theta), sin(theta)) * radius + offset;
28
- }
29
-
30
- void mainUv(inout vec2 uv) {
31
- uv = barrelDistortion(uv, amount * 0.5);
32
- }
33
-
34
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
35
- vec3 sumcol = vec3(0.0);
36
- vec3 sumw = vec3(0.0);
37
-
38
- for (int i = 0; i < NUM_ITER; ++i) {
39
- float t = float(i) * RECIP_NUM_ITER;
40
- vec3 w = spectrum_offset(t);
41
- vec2 distortedUV = barrelDistortion(uv, amount * t);
42
- sumcol += w * texture(inputBuffer, distortedUV).rgb;
43
- sumw += w;
44
- }
45
-
46
- vec3 outcol = pow(sumcol / sumw, vec3(1.0 / GAMMA));
47
-
48
- outcol = clamp(outcol, 0.0, 1.0); // Ensures normalized color values
49
-
50
- outputColor = vec4(outcol, inputColor.a); // Preserves original alpha
51
- }
52
- `,{blendFunction:t,uniforms:new Map([["amount",new i.Uniform(e)],["offset",new i.Uniform(a)]])})}get amount(){return this.uniforms.get("amount")?.value}set amount(t){this.uniforms.get("amount").value=t}get offset(){return this.uniforms.get("offset")?.value}set offset(t){this.uniforms.get("offset").value=t}}const ce=s.defineComponent({__name:"BarrelBlurPmndrs",props:{blendFunction:{},amount:{},offset:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new j({...e,offset:Array.isArray(e.offset)?new i.Vector2(...e.offset):e.offset}),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.amount,"amount"],[()=>e.offset,"offset"]],o,()=>new j),()=>{}}}),ue=s.defineComponent({__name:"ToneMappingPmndrs",props:{mode:{},blendFunction:{},resolution:{},averageLuminance:{},middleGrey:{},minLuminance:{},whitePoint:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.ToneMappingEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.mode,"mode"],[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.resolution,"resolution"],[()=>e.averageLuminance,"averageLuminance"],[()=>e.middleGrey,"middleGrey"],[()=>e.minLuminance,"adaptiveLuminanceMaterial.minLuminance"],[()=>e.whitePoint,"whitePoint"]],o,()=>new c.ToneMappingEffect),()=>{}}}),de=s.defineComponent({__name:"ChromaticAberrationPmndrs",props:{blendFunction:{},offset:{},radialModulation:{type:Boolean,default:void 0},modulationOffset:{}},setup(r,{expose:t}){const e=r,a=new c.ChromaticAberrationEffect,{pass:o,effect:n}=m(()=>new c.ChromaticAberrationEffect({...e,radialModulation:e.radialModulation??a.radialModulation,modulationOffset:e.modulationOffset??a.modulationOffset}),e);return a.dispose(),t({pass:o,effect:n}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.offset,"offset"],[()=>e.radialModulation,"radialModulation"],[()=>e.modulationOffset,"modulationOffset"]],n,()=>new c.ChromaticAberrationEffect),()=>{}}}),fe=s.defineComponent({__name:"HueSaturationPmndrs",props:{saturation:{},hue:{},blendFunction:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.HueSaturationEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.hue,"hue"],[()=>e.saturation,"saturation"]],o,()=>new c.HueSaturationEffect),()=>{}}}),he=s.defineComponent({__name:"ScanlinePmndrs",props:{blendFunction:{},density:{},scrollSpeed:{},opacity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.ScanlineEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.density,"density"],[()=>e.scrollSpeed,"scrollSpeed"]],o,()=>new c.ScanlineEffect),s.watch([()=>e.opacity],()=>{if(e.opacity!==void 0)o.value?.blendMode.setOpacity(e.opacity);else{const n=new c.ScanlineEffect;o.value?.blendMode.setOpacity(n.blendMode.getOpacity()),n.dispose()}},{immediate:!0}),()=>{}}}),me=`
53
- uniform float radius;
54
- uniform int sectorCount;
55
-
56
- const int MAX_SECTOR_COUNT = 8;
57
-
58
- float polynomialWeight(float x, float y, float eta, float lambda) {
59
- float polyValue = (x + eta) - lambda * (y * y);
60
- return max(0.0, polyValue * polyValue);
61
- }
62
-
63
- void getSectorVarianceAndAverageColor(mat2 anisotropyMat, float angle, float radius, out vec3 avgColor, out float variance) {
64
- vec3 weightedColorSum = vec3(0.0);
65
- vec3 weightedSquaredColorSum = vec3(0.0);
66
- float totalWeight = 0.0;
67
-
68
- float eta = 0.1;
69
- float lambda = 0.5;
70
- float angleStep = 0.196349; // Precompute angle step
71
- float halfAngleRange = 0.392699; // Precompute half angle range
72
-
73
- float cosAngle = cos(angle);
74
- float sinAngle = sin(angle);
75
-
76
- for (float r = 1.0; r <= radius; r += 1.0) {
77
- float rCosAngle = r * cosAngle;
78
- float rSinAngle = r * sinAngle;
79
- for (float a = -halfAngleRange; a <= halfAngleRange; a += angleStep) {
80
- float cosA = cos(a);
81
- float sinA = sin(a);
82
- vec2 sampleOffset = vec2(rCosAngle * cosA - rSinAngle * sinA, rCosAngle * sinA + rSinAngle * cosA) / resolution;
83
- sampleOffset *= anisotropyMat;
84
-
85
- vec3 color = texture2D(inputBuffer, vUv + sampleOffset).rgb;
86
- float weight = polynomialWeight(sampleOffset.x, sampleOffset.y, eta, lambda);
87
-
88
- weightedColorSum += color * weight;
89
- weightedSquaredColorSum += color * color * weight;
90
- totalWeight += weight;
91
- }
92
- }
93
-
94
- // Calculate average color and variance
95
- avgColor = weightedColorSum / totalWeight;
96
- vec3 varianceRes = (weightedSquaredColorSum / totalWeight) - (avgColor * avgColor);
97
- variance = dot(varianceRes, vec3(0.299, 0.587, 0.114)); // Convert to luminance
98
- }
99
-
100
- vec4 getDominantOrientation(vec4 structureTensor) {
101
- float Jxx = structureTensor.r;
102
- float Jyy = structureTensor.g;
103
- float Jxy = structureTensor.b;
104
-
105
- float trace = Jxx + Jyy;
106
- float det = Jxx * Jyy - Jxy * Jxy;
107
- float lambda1 = 0.5 * (trace + sqrt(trace * trace - 4.0 * det));
108
- float lambda2 = 0.5 * (trace - sqrt(trace * trace - 4.0 * det));
109
-
110
- float dominantOrientation = atan(2.0 * Jxy, Jxx - Jyy) / 2.0;
111
- return vec4(dominantOrientation, lambda1, lambda2, 0.0);
112
- }
113
-
114
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
115
- vec4 structureTensor = texture2D(inputBuffer, uv);
116
-
117
- vec3 sectorAvgColors[MAX_SECTOR_COUNT];
118
- float sectorVariances[MAX_SECTOR_COUNT];
119
-
120
- vec4 orientationAndAnisotropy = getDominantOrientation(structureTensor);
121
- vec2 orientation = orientationAndAnisotropy.xy;
122
-
123
- float anisotropy = (orientationAndAnisotropy.z - orientationAndAnisotropy.w) / (orientationAndAnisotropy.z + orientationAndAnisotropy.w + 1e-7);
124
-
125
- float alpha = 25.0;
126
- float scaleX = alpha / (anisotropy + alpha);
127
- float scaleY = (anisotropy + alpha) / alpha;
128
-
129
- mat2 anisotropyMat = mat2(orientation.x, -orientation.y, orientation.y, orientation.x) * mat2(scaleX, 0.0, 0.0, scaleY);
130
-
131
- for (int i = 0; i < sectorCount; i++) {
132
- float angle = float(i) * 6.28318 / float(sectorCount); // 2π / sectorCount
133
- getSectorVarianceAndAverageColor(anisotropyMat, angle, float(radius), sectorAvgColors[i], sectorVariances[i]);
134
- }
135
-
136
- float minVariance = sectorVariances[0];
137
- vec3 finalColor = sectorAvgColors[0];
138
-
139
- for (int i = 1; i < sectorCount; i++) {
140
- if (sectorVariances[i] < minVariance) {
141
- minVariance = sectorVariances[i];
142
- finalColor = sectorAvgColors[i];
143
- }
144
- }
145
-
146
- outputColor = vec4(finalColor, inputColor.a);
147
- }
148
- `;class _ extends c.Effect{constructor({blendFunction:t=c.BlendFunction.NORMAL,radius:e=1,sectorCount:a=4}={}){super("KuwaharaEffect",me,{blendFunction:t,uniforms:new Map([["radius",new i.Uniform(e)],["sectorCount",new i.Uniform(a)]])})}get radius(){return this.uniforms.get("radius")?.value}set radius(t){this.uniforms.get("radius").value=t}get sectorCount(){return this.uniforms.get("sectorCount")?.value}set sectorCount(t){this.uniforms.get("sectorCount").value=t}}const pe=s.defineComponent({__name:"KuwaharaPmndrs",props:{blendFunction:{},radius:{},sectorCount:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new _(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.radius,"radius"],[()=>e.sectorCount,"sectorCount"]],o,()=>new _),()=>{}}}),ge=s.defineComponent({__name:"ColorAveragePmndrs",props:{blendFunction:{},opacity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.ColorAverageEffect(e.blendFunction),e);return t({pass:a,effect:o}),E(()=>e.blendFunction,o,"blendMode.blendFunction",()=>new c.ColorAverageEffect),s.watch([o,()=>e.opacity],()=>{if(o.value)if(e.opacity!==void 0)o.value?.blendMode.setOpacity(e.opacity);else{const n=new c.ColorAverageEffect;o.value?.blendMode.setOpacity(n.blendMode.getOpacity()),n.dispose()}}),()=>{}}}),ve=s.defineComponent({__name:"LensDistortionPmndrs",props:{distortion:{},principalPoint:{},focalLength:{},skew:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.LensDistortionEffect({...e,distortion:e.distortion?Array.isArray(e.distortion)?new i.Vector2(...e.distortion):e.distortion:new i.Vector2,principalPoint:e.principalPoint?Array.isArray(e.principalPoint)?new i.Vector2(...e.principalPoint):e.principalPoint:new i.Vector2,focalLength:e.focalLength?Array.isArray(e.focalLength)?new i.Vector2(...e.focalLength):e.focalLength:new i.Vector2}),e);return t({pass:a,effect:o}),N(e,o,()=>new c.LensDistortionEffect),()=>{}}}),xe=s.defineComponent({__name:"ShockWavePmndrs",props:{position:{},amplitude:{},speed:{},maxRadius:{},waveSize:{}},setup(r,{expose:t}){const e=r,{camera:a}=v.useTres(),{pass:o,effect:n}=m(()=>new c.ShockWaveEffect(a.value,Array.isArray(e.position)?new i.Vector3(...e.position):e.position,e),e);return t({pass:o,effect:n}),s.watch(()=>e.position,l=>{n.value&&(Array.isArray(l)?n.value.position.set(...l):l instanceof i.Vector3&&n.value.position.copy(l))},{immediate:!0}),g([[()=>e.amplitude,"amplitude"],[()=>e.waveSize,"waveSize"],[()=>e.maxRadius,"maxRadius"],[()=>e.speed,"speed"]],n,()=>new c.ShockWaveEffect),()=>{}}}),be=s.defineComponent({__name:"TiltShiftPmndrs",props:{blendFunction:{},offset:{},rotation:{},focusArea:{},feather:{},kernelSize:{},resolutionScale:{},resolutionX:{},resolutionY:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.TiltShiftEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.offset,"offset"],[()=>e.rotation,"rotation"],[()=>e.focusArea,"focusArea"],[()=>e.feather,"feather"],[()=>e.kernelSize,"kernelSize"],[()=>e.resolutionScale,"resolution.scale"],[()=>e.resolutionX,"resolution.width"],[()=>e.resolutionY,"resolution.height"]],o,()=>new c.TiltShiftEffect),()=>{}}}),we=s.defineComponent({__name:"DotScreenPmndrs",props:{angle:{},scale:{},blendFunction:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.DotScreenEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.angle,"angle"],[()=>e.scale,"scale"]],o,()=>new c.DotScreenEffect),()=>{}}}),Se=s.defineComponent({__name:"SepiaPmndrs",props:{blendFunction:{},intensity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.SepiaEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.intensity,"intensity"]],o,()=>new c.SepiaEffect),()=>{}}});class Y extends c.Effect{constructor({blendFunction:t=c.BlendFunction.NORMAL,scale:e=.85,noiseScale:a=0,center:o=[.5,.5],rotation:n=0}={}){const l=Array.isArray(o)?new i.Vector2().fromArray(o):o;super("LinocutEffect",`
149
- uniform float scale;
150
- uniform float noiseScale;
151
- uniform vec2 center;
152
- uniform float rotation;
153
-
154
- float luma(vec3 color) {
155
- return dot(color, vec3(0.299, 0.587, 0.114));
156
- }
157
-
158
- float luma(vec4 color) {
159
- return dot(color.rgb, vec3(0.299, 0.587, 0.114));
160
- }
161
-
162
- // Simple pseudo-random noise function
163
- float noise(vec2 p) {
164
- return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453123);
165
- }
166
-
167
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
168
- // Calculate the center based on center
169
- vec2 fragCoord = uv * resolution.xy;
170
-
171
- // Apply rotation to the coordinates
172
- vec2 d = fragCoord - center * resolution.xy;
173
- mat2 rotMat = mat2(cos(rotation), -sin(rotation), sin(rotation), cos(rotation));
174
- vec2 rotatedD = d * rotMat;
175
-
176
- // Calculate radial distance and angle
177
- float r = length(rotatedD) / (1000.0 / max(scale, 0.01)); // Normalization to avoid artifacts
178
- float a = atan(rotatedD.y, rotatedD.x) + scale * (0.5 - r) / 0.5;
179
-
180
- // Calculate transformed coordinates
181
- vec2 uvt = center * resolution.xy + r * vec2(cos(a), sin(a));
182
-
183
- // Normalize UV coordinates
184
- vec2 uv2 = fragCoord / resolution.xy;
185
-
186
- // Generate sinusoidal line patterns
187
- float c = (0.75 + 0.25 * sin(uvt.x * 1000.0 * max(scale, 0.01))); // Prevent excessive distortions
188
-
189
- // Load the texture and convert to grayscale
190
- vec4 color = texture(inputBuffer, uv2);
191
- color.rgb = color.rgb * color.rgb; // Convert from sRGB to linear
192
- float l = luma(color);
193
-
194
- // Add noise based on noiseScale
195
- float n = noise(uv2 * 10.0); // Generate noise
196
- l += noiseScale * (n - 0.5); // Apply noise as a perturbation
197
-
198
- // Apply smoothing to achieve the linocut effect
199
- float f = smoothstep(0.5 * c, c, l);
200
- f = smoothstep(0.0, 0.5, f);
201
-
202
- // Convert the final value back to sRGB
203
- f = sqrt(f);
204
-
205
- // Output the final color in black and white
206
- outputColor = vec4(vec3(f), 1.0);
207
- }
208
- `,{blendFunction:t,uniforms:new Map([["scale",new i.Uniform(e)],["noiseScale",new i.Uniform(a)],["center",new i.Uniform(l)],["rotation",new i.Uniform(n)]])})}get scale(){return this.uniforms.get("scale")?.value}set scale(t){this.uniforms.get("scale").value=t}get noiseScale(){return this.uniforms.get("noiseScale")?.value}set noiseScale(t){this.uniforms.get("noiseScale").value=t}get center(){return this.uniforms.get("center")?.value}set center(t){this.uniforms.get("center").value=Array.isArray(t)?new i.Vector2().fromArray(t):t}get rotation(){return this.uniforms.get("rotation")?.value}set rotation(t){this.uniforms.get("rotation").value=t}}const Ae=s.defineComponent({__name:"LinocutPmndrs",props:{blendFunction:{},scale:{},noiseScale:{},center:{},rotation:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new Y({...e,center:e.center instanceof i.Vector2?[e.center.x,e.center.y]:e.center}),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.scale,"scale"],[()=>e.noiseScale,"noiseScale"],[()=>e.center,"center"],[()=>e.rotation,"rotation"]],o,()=>new Y),()=>{}}}),ye=s.defineComponent({__name:"DepthPickingPassPmndrs",props:{depthPacking:{},mode:{}},setup(r,{expose:t}){const e=r,a=s.inject(P),o=new c.DepthPickingPass(e),n=s.watchEffect(()=>{a?.value&&(s.nextTick(()=>n()),a.value.addPass(o))});return s.onUnmounted(()=>{!a?.value||!o||(a?.value?.removePass(o),o.dispose())}),t({pass:o}),()=>{}}}),Te=s.defineComponent({__name:"GodRaysPmndrs",props:{blendFunction:{},lightSource:{},opacity:{},density:{},decay:{},kernelSize:{},resolutionScale:{},blur:{type:Boolean},resolutionX:{},resolutionY:{},weight:{},exposure:{},samples:{},clampMax:{}},setup(r,{expose:t}){const e=r,{camera:a}=v.useTres(),o=s.computed(()=>e.lightSource??new i.Mesh(new i.SphereGeometry(1e-5),new i.MeshBasicMaterial({visible:!1}))),{pass:n,effect:l}=m(()=>new c.GodRaysEffect(a.value,o.value,e),e);return t({pass:n,effect:l}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.density,"godRaysMaterial.density"],[()=>e.decay,"godRaysMaterial.decay"],[()=>e.weight,"godRaysMaterial.weight"],[()=>e.exposure,"godRaysMaterial.exposure"],[()=>e.samples,"godRaysMaterial.samples"],[()=>e.clampMax,"godRaysMaterial.maxIntensity"],[()=>e.resolutionScale,"resolution.scale"],[()=>e.resolutionX,"resolution.width"],[()=>e.resolutionY,"resolution.height"],[()=>e.kernelSize,"blurPass.kernelSize"],[()=>e.blur,"blurPass.enabled"]],l,()=>new c.GodRaysEffect),s.watch([()=>e.lightSource,l],()=>{l.value&&(l.value.lightSource=s.toRaw(o.value))},{immediate:!0}),s.watch([()=>e.opacity],()=>{if(e.opacity!==void 0)l.value?.blendMode.setOpacity(e.opacity);else{const u=new c.GodRaysEffect(a.value,s.toRaw(o.value));l.value?.blendMode.setOpacity(u.blendMode.getOpacity()),u.dispose()}},{immediate:!0}),()=>{}}}),Me=s.defineComponent({__name:"ColorDepthPmndrs",props:{blendFunction:{},bits:{},opacity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.ColorDepthEffect(e),e);return t({pass:a,effect:o}),E(()=>e.blendFunction,o,"blendMode.blendFunction",()=>new c.ColorDepthEffect),s.watch([o,()=>e.bits],()=>{if(o.value)if(e.bits!==void 0)o.value?.setBitDepth(e.bits);else{const n=new c.ColorDepthEffect;o.value?.setBitDepth(n.getBitDepth()),n.dispose()}}),s.watch([o,()=>e.opacity],()=>{if(o.value)if(e.opacity!==void 0)o.value?.blendMode.setOpacity(e.opacity);else{const n=new c.ColorDepthEffect;o.value?.blendMode.setOpacity(n.blendMode.getOpacity()),n.dispose()}}),()=>{}}}),Ce=s.defineComponent({__name:"GridPmndrs",props:{blendFunction:{},scale:{},lineWidth:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.GridEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.scale,"scale"],[()=>e.lineWidth,"lineWidth"]],o,()=>new c.GridEffect),()=>{}}});class k extends c.Effect{constructor({blendFunction:t=c.BlendFunction.NORMAL,lensS:e=new i.Vector2(1,1),lensF:a=new i.Vector2(0,1),scale:o=1}={}){super("FishEyeEffect",`
209
- uniform vec2 lensS;
210
- uniform vec2 lensF;
211
- uniform float scale;
212
-
213
- void mainUv(inout vec2 uv) {
214
- vec2 newUv = uv * 2.0 - 1.0;
215
- newUv.x = newUv.x + ((pow(newUv.y, 2.0) / scale) * newUv.x / scale) * -lensF.x;
216
- newUv.y = newUv.y + ((pow(newUv.x, 2.0) / scale) * newUv.y / scale) * -lensF.y;
217
- newUv = newUv * lensS;
218
- newUv = newUv / scale * 0.5 + 0.5;
219
-
220
- uv = newUv;
221
- }
222
-
223
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
224
- outputColor = vec4(inputColor.rgb, inputColor.a); // Preserves original alpha
225
- }
226
- `,{blendFunction:t,uniforms:new Map([["lensS",new i.Uniform(e)],["lensF",new i.Uniform(a)],["scale",new i.Uniform(o)]])})}get lensS(){return this.uniforms.get("lensS")?.value}set lensS(t){this.uniforms.get("lensS").value=t}get lensF(){return this.uniforms.get("lensF")?.value}set lensF(t){this.uniforms.get("lensF").value=t}get scale(){return this.uniforms.get("scale")?.value}set scale(t){this.uniforms.get("scale").value=t}}const Ee=s.defineComponent({__name:"FishEyePmndrs",props:{blendFunction:{},lensS:{},lensF:{},scale:{}},setup(r,{expose:t}){const e=r,a=s.computed(()=>Array.isArray(e.lensS)?new i.Vector2(...e.lensS):e.lensS),o=s.computed(()=>Array.isArray(e.lensF)?new i.Vector2(...e.lensF):e.lensF),{pass:n,effect:l}=m(()=>new k({...e,lensS:a.value,lensF:o.value}),e);return t({pass:n,effect:l}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>a.value,"lensS"],[()=>o.value,"lensF"],[()=>e.scale,"scale"]],l,()=>new k),()=>{}}}),De=s.defineComponent({__name:"BrightnessContrastPmndrs",props:{blendFunction:{},brightness:{},contrast:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.BrightnessContrastEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.brightness,"brightness"],[()=>e.contrast,"contrast"]],o,()=>new c.BrightnessContrastEffect),()=>{}}}),z={OFF:0,EDGES:1,WEIGHTS:2},Pe=s.defineComponent({__name:"SMAAPmndrs",props:{blendFunction:{},opacity:{},preset:{},edgeDetectionMode:{},predicationMode:{},debug:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.SMAAEffect(e),e),{camera:n}=v.useTres(),l=s.inject(P);t({pass:a,effect:o});const u=new c.SMAAEffect;g([[()=>Number(e.blendFunction),"blendMode.blendFunction"],[()=>Number(e.predicationMode),"edgeDetectionMaterial.predicationMode"],[()=>Number(e.edgeDetectionMode),"edgeDetectionMaterial.edgeDetectionMode"]],o,()=>new c.SMAAEffect),s.watch([o,()=>e.opacity],()=>{o.value&&(e.opacity!==void 0?o.value.blendMode.setOpacity(e.opacity):o.value.blendMode.setOpacity(u.blendMode.getOpacity()))},{immediate:!0}),s.watch([o,()=>e.preset],()=>{o.value&&o.value.applyPreset(Number(e.preset))});let f=null,h=null;const p=b=>{if(!o.value)return null;const x=b==="edges"?o.value.edgesTexture:o.value.weightsTexture,S=new c.EffectPass(n.value,o.value,new c.TextureEffect({texture:x}));return S.renderToScreen=!1,S.enabled=!1,S.fullscreenMaterial.encodeOutput=!1,S},w=b=>{b==="edges"&&!f?f=p("edges"):b==="weights"&&!h&&(h=p("weights"))},A=(b,x)=>{!b||!l?.value||b.enabled!==x&&(b.enabled=x,b.renderToScreen=x,x&&!l?.value.passes.includes(b)?l?.value.addPass(b):!x&&l?.value.passes.includes(b)&&(l?.value.removePass(b),b.dispose()))},D=b=>{if(!a.value)return;const x=b===z.OFF,S=b===z.EDGES,G=b===z.WEIGHTS;a.value.enabled=x,a.value.renderToScreen=x,S&&w("edges"),G&&w("weights"),A(f,S),A(h,G),S||(f=null),G||(h=null)};return s.watch(()=>e.debug,()=>{!a.value||e.debug===void 0||D(e.debug)},{immediate:!0}),()=>{}}}),Fe=s.defineComponent({__name:"FXAAPmndrs",props:{blendFunction:{},opacity:{},samples:{},minEdgeThreshold:{},maxEdgeThreshold:{},subpixelQuality:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.FXAAEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.samples,"samples"],[()=>e.minEdgeThreshold,"minEdgeThreshold"],[()=>e.maxEdgeThreshold,"maxEdgeThreshold"],[()=>e.subpixelQuality,"subpixelQuality"]],o,()=>new c.FXAAEffect),s.watch([o,()=>e.opacity],()=>{if(o.value)if(e.opacity!==void 0)o.value?.blendMode.setOpacity(e.opacity);else{const n=new c.FXAAEffect;o.value?.blendMode.setOpacity(n.blendMode.getOpacity()),n.dispose()}},{immediate:!0}),()=>{}}}),Le=s.defineComponent({__name:"TexturePmndrs",props:{blendFunction:{},texture:{},opacity:{}},setup(r,{expose:t}){const e=r,{pass:a,effect:o}=m(()=>new c.TextureEffect(e),e);return t({pass:a,effect:o}),g([[()=>e.blendFunction,"blendMode.blendFunction"]],o,()=>new c.TextureEffect),s.watch([()=>e.opacity],()=>{if(e.opacity!==void 0)o.value?.blendMode.setOpacity(e.opacity);else{const n=new c.TextureEffect;o.value?.blendMode.setOpacity(n.blendMode.getOpacity()),n.dispose()}},{immediate:!0}),()=>{}}}),Oe=s.defineComponent({__name:"ASCIIPmndrs",props:{blendFunction:{},opacity:{},cellSize:{},inverted:{type:Boolean},color:{},useSceneColor:{type:Boolean},asciiTexture:{}},setup(r,{expose:t}){const e=r,a=new c.ASCIIEffect,{asciiTexture:o,...n}=e,{pass:l,effect:u}=m(()=>new c.ASCIIEffect(n),e);return t({pass:l,effect:u}),s.onUnmounted(()=>{a.dispose()}),g([[()=>e.blendFunction,"blendMode.blendFunction"],[()=>e.cellSize,"cellSize"],[()=>e.inverted,"inverted"]],u,()=>new c.ASCIIEffect),s.watch([u,()=>e.useSceneColor],()=>{u.value&&(e.useSceneColor?u.value.color=null:u.value.color=e.color??a.color)},{immediate:!0}),s.watch([u,()=>e.opacity],()=>{u.value&&u.value.blendMode.setOpacity(e.opacity??a.blendMode.getOpacity())},{immediate:!0}),s.watch([u,()=>e.color],()=>{u.value&&(e.useSceneColor||(u.value.color=e.color??null))},{immediate:!0}),s.watch([u,()=>e.asciiTexture],()=>{if(!u.value)return;const f=e.asciiTexture?new c.ASCIITexture(e.asciiTexture):a.asciiTexture;u.value.asciiTexture=f},{immediate:!0}),s.watch([u,()=>e.blendFunction],()=>{u.value&&(u.value.blendMode.blendFunction=e.blendFunction?Number(e.blendFunction):Number(a.blendMode.blendFunction))},{immediate:!0}),()=>{}}}),F={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:`
227
-
228
- varying vec2 vUv;
229
-
230
- void main() {
231
-
232
- vUv = uv;
233
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
234
-
235
- }`,fragmentShader:`
236
-
237
- uniform float opacity;
238
-
239
- uniform sampler2D tDiffuse;
240
-
241
- varying vec2 vUv;
242
-
243
- void main() {
244
-
245
- vec4 texel = texture2D( tDiffuse, vUv );
246
- gl_FragColor = opacity * texel;
247
-
248
-
249
- }`};class y{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const Re=new i.OrthographicCamera(-1,1,1,-1,0,1);class Be extends i.BufferGeometry{constructor(){super(),this.setAttribute("position",new i.Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new i.Float32BufferAttribute([0,2,0,0,2,0],2))}}const Ne=new Be;class T{constructor(t){this._mesh=new i.Mesh(Ne,t)}dispose(){this._mesh.geometry.dispose()}render(t){t.render(this._mesh,Re)}get material(){return this._mesh.material}set material(t){this._mesh.material=t}}class ze extends y{constructor(t,e="tDiffuse"){super(),this.textureID=e,this.uniforms=null,this.material=null,t instanceof i.ShaderMaterial?(this.uniforms=t.uniforms,this.material=t):t&&(this.uniforms=i.UniformsUtils.clone(t.uniforms),this.material=new i.ShaderMaterial({name:t.name!==void 0?t.name:"unspecified",defines:Object.assign({},t.defines),uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader})),this._fsQuad=new T(this.material)}render(t,e,a){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=a.texture),this._fsQuad.material=this.material,this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this._fsQuad.render(t))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}class q extends y{constructor(t,e){super(),this.scene=t,this.camera=e,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(t,e,a){const o=t.getContext(),n=t.state;n.buffers.color.setMask(!1),n.buffers.depth.setMask(!1),n.buffers.color.setLocked(!0),n.buffers.depth.setLocked(!0);let l,u;this.inverse?(l=0,u=1):(l=1,u=0),n.buffers.stencil.setTest(!0),n.buffers.stencil.setOp(o.REPLACE,o.REPLACE,o.REPLACE),n.buffers.stencil.setFunc(o.ALWAYS,l,4294967295),n.buffers.stencil.setClear(u),n.buffers.stencil.setLocked(!0),t.setRenderTarget(a),this.clear&&t.clear(),t.render(this.scene,this.camera),t.setRenderTarget(e),this.clear&&t.clear(),t.render(this.scene,this.camera),n.buffers.color.setLocked(!1),n.buffers.depth.setLocked(!1),n.buffers.color.setMask(!0),n.buffers.depth.setMask(!0),n.buffers.stencil.setLocked(!1),n.buffers.stencil.setFunc(o.EQUAL,1,4294967295),n.buffers.stencil.setOp(o.KEEP,o.KEEP,o.KEEP),n.buffers.stencil.setLocked(!0)}}class Ue extends y{constructor(){super(),this.needsSwap=!1}render(t){t.state.buffers.stencil.setLocked(!1),t.state.buffers.stencil.setTest(!1)}}class We{constructor(t,e){if(this.renderer=t,this._pixelRatio=t.getPixelRatio(),e===void 0){const a=t.getSize(new i.Vector2);this._width=a.width,this._height=a.height,e=new i.WebGLRenderTarget(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:i.HalfFloatType}),e.texture.name="EffectComposer.rt1"}else this._width=e.width,this._height=e.height;this.renderTarget1=e,this.renderTarget2=e.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new ze(F),this.copyPass.material.blending=i.NoBlending,this.clock=new i.Clock}swapBuffers(){const t=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=t}addPass(t){this.passes.push(t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(t,e){this.passes.splice(e,0,t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(t){const e=this.passes.indexOf(t);e!==-1&&this.passes.splice(e,1)}isLastEnabledPass(t){for(let e=t+1;e<this.passes.length;e++)if(this.passes[e].enabled)return!1;return!0}render(t){t===void 0&&(t=this.clock.getDelta());const e=this.renderer.getRenderTarget();let a=!1;for(let o=0,n=this.passes.length;o<n;o++){const l=this.passes[o];if(l.enabled!==!1){if(l.renderToScreen=this.renderToScreen&&this.isLastEnabledPass(o),l.render(this.renderer,this.writeBuffer,this.readBuffer,t,a),l.needsSwap){if(a){const u=this.renderer.getContext(),f=this.renderer.state.buffers.stencil;f.setFunc(u.NOTEQUAL,1,4294967295),this.copyPass.render(this.renderer,this.writeBuffer,this.readBuffer,t),f.setFunc(u.EQUAL,1,4294967295)}this.swapBuffers()}q!==void 0&&(l instanceof q?a=!0:l instanceof Ue&&(a=!1))}}this.renderer.setRenderTarget(e)}reset(t){if(t===void 0){const e=this.renderer.getSize(new i.Vector2);this._pixelRatio=this.renderer.getPixelRatio(),this._width=e.width,this._height=e.height,t=this.renderTarget1.clone(),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.renderTarget1=t,this.renderTarget2=t.clone(),this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2}setSize(t,e){this._width=t,this._height=e;const a=this._width*this._pixelRatio,o=this._height*this._pixelRatio;this.renderTarget1.setSize(a,o),this.renderTarget2.setSize(a,o);for(let n=0;n<this.passes.length;n++)this.passes[n].setSize(a,o)}setPixelRatio(t){this._pixelRatio=t,this.setSize(this._width,this._height)}dispose(){this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.copyPass.dispose()}}class Ge extends y{constructor(t,e,a=null,o=null,n=null){super(),this.scene=t,this.camera=e,this.overrideMaterial=a,this.clearColor=o,this.clearAlpha=n,this.clear=!0,this.clearDepth=!1,this.needsSwap=!1,this._oldClearColor=new i.Color}render(t,e,a){const o=t.autoClear;t.autoClear=!1;let n,l;this.overrideMaterial!==null&&(l=this.scene.overrideMaterial,this.scene.overrideMaterial=this.overrideMaterial),this.clearColor!==null&&(t.getClearColor(this._oldClearColor),t.setClearColor(this.clearColor,t.getClearAlpha())),this.clearAlpha!==null&&(n=t.getClearAlpha(),t.setClearAlpha(this.clearAlpha)),this.clearDepth==!0&&t.clearDepth(),t.setRenderTarget(this.renderToScreen?null:a),this.clear===!0&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),t.render(this.scene,this.camera),this.clearColor!==null&&t.setClearColor(this._oldClearColor),this.clearAlpha!==null&&t.setClearAlpha(n),this.overrideMaterial!==null&&(this.scene.overrideMaterial=l),t.autoClear=o}}const Q=Symbol("effectComposerThree"),He=s.defineComponent({__name:"EffectComposer",props:{enabled:{type:Boolean,default:!0},withoutRenderPass:{type:Boolean}},setup(r,{expose:t}){const e=r,a=s.shallowRef(null);s.provide(Q,a),t({composer:a});const{renderer:o,sizes:n,scene:l,camera:u}=v.useTresContext(),f=()=>{a.value?.dispose(),a.value=new We(o.instance)};s.watchEffect(f),s.watchEffect(()=>{const{width:p,height:w}=n;w.value&&p.value&&a.value?.setSize(p.value,w.value)});const{pixelRatio:h}=H.useDevicePixelRatio();return s.watchEffect(()=>{a.value?.setPixelRatio(h.value)}),e.withoutRenderPass||s.watchEffect(()=>{u.activeCamera.value&&l.value&&a.value&&a.value.addPass(new Ge(l.value,u.activeCamera.value))}),o.replaceRenderFunction(p=>{a.value&&e.enabled&&(a.value.render(),p())}),s.onUnmounted(()=>{a.value?.dispose()}),(p,w)=>s.renderSlot(p.$slots,"default")}}),M=(r,t,e)=>{if(!t&&e)throw new Error("passDependencies is required when dependencyFieldsTriggeringRecreation is provided");const a=s.inject(Q),o=s.shallowRef(r()),{sizes:n,invalidate:l}=v.useTres();t&&s.watch(t,()=>l());const u=()=>{a?.value?.removePass(o.value),o.value.dispose()},f=s.watchEffect(()=>{!a?.value||!n.height.value||!n.width.value||(a.value.addPass(o.value),s.nextTick(()=>f()))});return e&&s.watch(()=>e.map(h=>t?.[h]),()=>{if(!a?.value)return;const h=a.value.passes.findIndex(p=>p===o.value);~h&&(u(),o.value=r(),a.value.insertPass(o.value,h))}),s.onUnmounted(()=>{u()}),{pass:o}},U={uniforms:{tDiffuse:{value:null},tDisp:{value:null},byp:{value:0},amount:{value:.08},angle:{value:.02},seed:{value:.02},seed_x:{value:.02},seed_y:{value:.02},distortion_x:{value:.5},distortion_y:{value:.6},col_s:{value:.05}},vertexShader:`
250
-
251
- varying vec2 vUv;
252
- void main() {
253
- vUv = uv;
254
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
255
- }`,fragmentShader:`
256
-
257
- uniform int byp; //should we apply the glitch ?
258
-
259
- uniform sampler2D tDiffuse;
260
- uniform sampler2D tDisp;
261
-
262
- uniform float amount;
263
- uniform float angle;
264
- uniform float seed;
265
- uniform float seed_x;
266
- uniform float seed_y;
267
- uniform float distortion_x;
268
- uniform float distortion_y;
269
- uniform float col_s;
270
-
271
- varying vec2 vUv;
272
-
273
-
274
- float rand(vec2 co){
275
- return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
276
- }
277
-
278
- void main() {
279
- if(byp<1) {
280
- vec2 p = vUv;
281
- float xs = floor(gl_FragCoord.x / 0.5);
282
- float ys = floor(gl_FragCoord.y / 0.5);
283
- //based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
284
- float disp = texture2D(tDisp, p*seed*seed).r;
285
- if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {
286
- if(seed_x>0.){
287
- p.y = 1. - (p.y + distortion_y);
288
- }
289
- else {
290
- p.y = distortion_y;
291
- }
292
- }
293
- if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {
294
- if(seed_y>0.){
295
- p.x=distortion_x;
296
- }
297
- else {
298
- p.x = 1. - (p.x + distortion_x);
299
- }
300
- }
301
- p.x+=disp*seed_x*(seed/5.);
302
- p.y+=disp*seed_y*(seed/5.);
303
- //base from RGB shift shader
304
- vec2 offset = amount * vec2( cos(angle), sin(angle));
305
- vec4 cr = texture2D(tDiffuse, p + offset);
306
- vec4 cga = texture2D(tDiffuse, p);
307
- vec4 cb = texture2D(tDiffuse, p - offset);
308
- gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);
309
- //add noise
310
- vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);
311
- gl_FragColor = gl_FragColor+ snow;
312
- }
313
- else {
314
- gl_FragColor=texture2D (tDiffuse, vUv);
315
- }
316
- }`};class K extends y{constructor(t=64){super(),this.uniforms=i.UniformsUtils.clone(U.uniforms),this.material=new i.ShaderMaterial({uniforms:this.uniforms,vertexShader:U.vertexShader,fragmentShader:U.fragmentShader}),this.goWild=!1,this._heightMap=this._generateHeightmap(t),this.uniforms.tDisp.value=this.heightMap,this._fsQuad=new T(this.material),this._curF=0,this._randX=0,this._generateTrigger()}render(t,e,a){this.uniforms.tDiffuse.value=a.texture,this.uniforms.seed.value=Math.random(),this.uniforms.byp.value=0,this._curF%this._randX==0||this.goWild==!0?(this.uniforms.amount.value=Math.random()/30,this.uniforms.angle.value=i.MathUtils.randFloat(-Math.PI,Math.PI),this.uniforms.seed_x.value=i.MathUtils.randFloat(-1,1),this.uniforms.seed_y.value=i.MathUtils.randFloat(-1,1),this.uniforms.distortion_x.value=i.MathUtils.randFloat(0,1),this.uniforms.distortion_y.value=i.MathUtils.randFloat(0,1),this._curF=0,this._generateTrigger()):this._curF%this._randX<this._randX/5?(this.uniforms.amount.value=Math.random()/90,this.uniforms.angle.value=i.MathUtils.randFloat(-Math.PI,Math.PI),this.uniforms.distortion_x.value=i.MathUtils.randFloat(0,1),this.uniforms.distortion_y.value=i.MathUtils.randFloat(0,1),this.uniforms.seed_x.value=i.MathUtils.randFloat(-.3,.3),this.uniforms.seed_y.value=i.MathUtils.randFloat(-.3,.3)):this.goWild==!1&&(this.uniforms.byp.value=1),this._curF++,this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(),this._fsQuad.render(t))}dispose(){this.material.dispose(),this.heightMap.dispose(),this._fsQuad.dispose()}_generateTrigger(){this._randX=i.MathUtils.randInt(120,240)}_generateHeightmap(t){const e=new Float32Array(t*t),a=t*t;for(let n=0;n<a;n++){const l=i.MathUtils.randFloat(0,1);e[n]=l}const o=new i.DataTexture(e,t,t,i.RedFormat,i.FloatType);return o.needsUpdate=!0,o}}const Ve=s.defineComponent({__name:"Glitch",props:{dtSize:{},goWild:{type:Boolean}},setup(r,{expose:t}){const e=r,{pass:a}=M(()=>new K(e.dtSize),e,["dtSize"]),{invalidate:o}=v.useTres();t({pass:a});const{onBeforeRender:n}=v.useLoop();return n(()=>o()),g([[()=>e.goWild,"goWild"]],a,()=>new K),()=>{}}}),L={uniforms:{tDiffuse:{value:null},shape:{value:1},radius:{value:4},rotateR:{value:Math.PI/12*1},rotateG:{value:Math.PI/12*2},rotateB:{value:Math.PI/12*3},scatter:{value:0},width:{value:1},height:{value:1},blending:{value:1},blendingMode:{value:1},greyscale:{value:!1},disable:{value:!1}},vertexShader:`
317
-
318
- varying vec2 vUV;
319
-
320
- void main() {
321
-
322
- vUV = uv;
323
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
324
-
325
- }`,fragmentShader:`
326
-
327
- #define SQRT2_MINUS_ONE 0.41421356
328
- #define SQRT2_HALF_MINUS_ONE 0.20710678
329
- #define PI2 6.28318531
330
- #define SHAPE_DOT 1
331
- #define SHAPE_ELLIPSE 2
332
- #define SHAPE_LINE 3
333
- #define SHAPE_SQUARE 4
334
- #define BLENDING_LINEAR 1
335
- #define BLENDING_MULTIPLY 2
336
- #define BLENDING_ADD 3
337
- #define BLENDING_LIGHTER 4
338
- #define BLENDING_DARKER 5
339
- uniform sampler2D tDiffuse;
340
- uniform float radius;
341
- uniform float rotateR;
342
- uniform float rotateG;
343
- uniform float rotateB;
344
- uniform float scatter;
345
- uniform float width;
346
- uniform float height;
347
- uniform int shape;
348
- uniform bool disable;
349
- uniform float blending;
350
- uniform int blendingMode;
351
- varying vec2 vUV;
352
- uniform bool greyscale;
353
- const int samples = 8;
354
-
355
- float blend( float a, float b, float t ) {
356
-
357
- // linear blend
358
- return a * ( 1.0 - t ) + b * t;
359
-
360
- }
361
-
362
- float hypot( float x, float y ) {
363
-
364
- // vector magnitude
365
- return sqrt( x * x + y * y );
366
-
367
- }
368
-
369
- float rand( vec2 seed ){
370
-
371
- // get pseudo-random number
372
- return fract( sin( dot( seed.xy, vec2( 12.9898, 78.233 ) ) ) * 43758.5453 );
373
-
374
- }
375
-
376
- float distanceToDotRadius( float channel, vec2 coord, vec2 normal, vec2 p, float angle, float rad_max ) {
377
-
378
- // apply shape-specific transforms
379
- float dist = hypot( coord.x - p.x, coord.y - p.y );
380
- float rad = channel;
381
-
382
- if ( shape == SHAPE_DOT ) {
383
-
384
- rad = pow( abs( rad ), 1.125 ) * rad_max;
385
-
386
- } else if ( shape == SHAPE_ELLIPSE ) {
387
-
388
- rad = pow( abs( rad ), 1.125 ) * rad_max;
389
-
390
- if ( dist != 0.0 ) {
391
- float dot_p = abs( ( p.x - coord.x ) / dist * normal.x + ( p.y - coord.y ) / dist * normal.y );
392
- dist = ( dist * ( 1.0 - SQRT2_HALF_MINUS_ONE ) ) + dot_p * dist * SQRT2_MINUS_ONE;
393
- }
394
-
395
- } else if ( shape == SHAPE_LINE ) {
396
-
397
- rad = pow( abs( rad ), 1.5) * rad_max;
398
- float dot_p = ( p.x - coord.x ) * normal.x + ( p.y - coord.y ) * normal.y;
399
- dist = hypot( normal.x * dot_p, normal.y * dot_p );
400
-
401
- } else if ( shape == SHAPE_SQUARE ) {
402
-
403
- float theta = atan( p.y - coord.y, p.x - coord.x ) - angle;
404
- float sin_t = abs( sin( theta ) );
405
- float cos_t = abs( cos( theta ) );
406
- rad = pow( abs( rad ), 1.4 );
407
- rad = rad_max * ( rad + ( ( sin_t > cos_t ) ? rad - sin_t * rad : rad - cos_t * rad ) );
408
-
409
- }
410
-
411
- return rad - dist;
412
-
413
- }
414
-
415
- struct Cell {
416
-
417
- // grid sample positions
418
- vec2 normal;
419
- vec2 p1;
420
- vec2 p2;
421
- vec2 p3;
422
- vec2 p4;
423
- float samp2;
424
- float samp1;
425
- float samp3;
426
- float samp4;
427
-
428
- };
429
-
430
- vec4 getSample( vec2 point ) {
431
-
432
- // multi-sampled point
433
- vec4 tex = texture2D( tDiffuse, vec2( point.x / width, point.y / height ) );
434
- float base = rand( vec2( floor( point.x ), floor( point.y ) ) ) * PI2;
435
- float step = PI2 / float( samples );
436
- float dist = radius * 0.66;
437
-
438
- for ( int i = 0; i < samples; ++i ) {
439
-
440
- float r = base + step * float( i );
441
- vec2 coord = point + vec2( cos( r ) * dist, sin( r ) * dist );
442
- tex += texture2D( tDiffuse, vec2( coord.x / width, coord.y / height ) );
443
-
444
- }
445
-
446
- tex /= float( samples ) + 1.0;
447
- return tex;
448
-
449
- }
450
-
451
- float getDotColour( Cell c, vec2 p, int channel, float angle, float aa ) {
452
-
453
- // get colour for given point
454
- float dist_c_1, dist_c_2, dist_c_3, dist_c_4, res;
455
-
456
- if ( channel == 0 ) {
457
-
458
- c.samp1 = getSample( c.p1 ).r;
459
- c.samp2 = getSample( c.p2 ).r;
460
- c.samp3 = getSample( c.p3 ).r;
461
- c.samp4 = getSample( c.p4 ).r;
462
-
463
- } else if (channel == 1) {
464
-
465
- c.samp1 = getSample( c.p1 ).g;
466
- c.samp2 = getSample( c.p2 ).g;
467
- c.samp3 = getSample( c.p3 ).g;
468
- c.samp4 = getSample( c.p4 ).g;
469
-
470
- } else {
471
-
472
- c.samp1 = getSample( c.p1 ).b;
473
- c.samp3 = getSample( c.p3 ).b;
474
- c.samp2 = getSample( c.p2 ).b;
475
- c.samp4 = getSample( c.p4 ).b;
476
-
477
- }
478
-
479
- dist_c_1 = distanceToDotRadius( c.samp1, c.p1, c.normal, p, angle, radius );
480
- dist_c_2 = distanceToDotRadius( c.samp2, c.p2, c.normal, p, angle, radius );
481
- dist_c_3 = distanceToDotRadius( c.samp3, c.p3, c.normal, p, angle, radius );
482
- dist_c_4 = distanceToDotRadius( c.samp4, c.p4, c.normal, p, angle, radius );
483
- res = ( dist_c_1 > 0.0 ) ? clamp( dist_c_1 / aa, 0.0, 1.0 ) : 0.0;
484
- res += ( dist_c_2 > 0.0 ) ? clamp( dist_c_2 / aa, 0.0, 1.0 ) : 0.0;
485
- res += ( dist_c_3 > 0.0 ) ? clamp( dist_c_3 / aa, 0.0, 1.0 ) : 0.0;
486
- res += ( dist_c_4 > 0.0 ) ? clamp( dist_c_4 / aa, 0.0, 1.0 ) : 0.0;
487
- res = clamp( res, 0.0, 1.0 );
488
-
489
- return res;
490
-
491
- }
492
-
493
- Cell getReferenceCell( vec2 p, vec2 origin, float grid_angle, float step ) {
494
-
495
- // get containing cell
496
- Cell c;
497
-
498
- // calc grid
499
- vec2 n = vec2( cos( grid_angle ), sin( grid_angle ) );
500
- float threshold = step * 0.5;
501
- float dot_normal = n.x * ( p.x - origin.x ) + n.y * ( p.y - origin.y );
502
- float dot_line = -n.y * ( p.x - origin.x ) + n.x * ( p.y - origin.y );
503
- vec2 offset = vec2( n.x * dot_normal, n.y * dot_normal );
504
- float offset_normal = mod( hypot( offset.x, offset.y ), step );
505
- float normal_dir = ( dot_normal < 0.0 ) ? 1.0 : -1.0;
506
- float normal_scale = ( ( offset_normal < threshold ) ? -offset_normal : step - offset_normal ) * normal_dir;
507
- float offset_line = mod( hypot( ( p.x - offset.x ) - origin.x, ( p.y - offset.y ) - origin.y ), step );
508
- float line_dir = ( dot_line < 0.0 ) ? 1.0 : -1.0;
509
- float line_scale = ( ( offset_line < threshold ) ? -offset_line : step - offset_line ) * line_dir;
510
-
511
- // get closest corner
512
- c.normal = n;
513
- c.p1.x = p.x - n.x * normal_scale + n.y * line_scale;
514
- c.p1.y = p.y - n.y * normal_scale - n.x * line_scale;
515
-
516
- // scatter
517
- if ( scatter != 0.0 ) {
518
-
519
- float off_mag = scatter * threshold * 0.5;
520
- float off_angle = rand( vec2( floor( c.p1.x ), floor( c.p1.y ) ) ) * PI2;
521
- c.p1.x += cos( off_angle ) * off_mag;
522
- c.p1.y += sin( off_angle ) * off_mag;
523
-
524
- }
525
-
526
- // find corners
527
- float normal_step = normal_dir * ( ( offset_normal < threshold ) ? step : -step );
528
- float line_step = line_dir * ( ( offset_line < threshold ) ? step : -step );
529
- c.p2.x = c.p1.x - n.x * normal_step;
530
- c.p2.y = c.p1.y - n.y * normal_step;
531
- c.p3.x = c.p1.x + n.y * line_step;
532
- c.p3.y = c.p1.y - n.x * line_step;
533
- c.p4.x = c.p1.x - n.x * normal_step + n.y * line_step;
534
- c.p4.y = c.p1.y - n.y * normal_step - n.x * line_step;
535
-
536
- return c;
537
-
538
- }
539
-
540
- float blendColour( float a, float b, float t ) {
541
-
542
- // blend colours
543
- if ( blendingMode == BLENDING_LINEAR ) {
544
- return blend( a, b, 1.0 - t );
545
- } else if ( blendingMode == BLENDING_ADD ) {
546
- return blend( a, min( 1.0, a + b ), t );
547
- } else if ( blendingMode == BLENDING_MULTIPLY ) {
548
- return blend( a, max( 0.0, a * b ), t );
549
- } else if ( blendingMode == BLENDING_LIGHTER ) {
550
- return blend( a, max( a, b ), t );
551
- } else if ( blendingMode == BLENDING_DARKER ) {
552
- return blend( a, min( a, b ), t );
553
- } else {
554
- return blend( a, b, 1.0 - t );
555
- }
556
-
557
- }
558
-
559
- void main() {
560
-
561
- if ( ! disable ) {
562
-
563
- // setup
564
- vec2 p = vec2( vUV.x * width, vUV.y * height );
565
- vec2 origin = vec2( 0, 0 );
566
- float aa = ( radius < 2.5 ) ? radius * 0.5 : 1.25;
567
-
568
- // get channel samples
569
- Cell cell_r = getReferenceCell( p, origin, rotateR, radius );
570
- Cell cell_g = getReferenceCell( p, origin, rotateG, radius );
571
- Cell cell_b = getReferenceCell( p, origin, rotateB, radius );
572
- float r = getDotColour( cell_r, p, 0, rotateR, aa );
573
- float g = getDotColour( cell_g, p, 1, rotateG, aa );
574
- float b = getDotColour( cell_b, p, 2, rotateB, aa );
575
-
576
- // blend with original
577
- vec4 colour = texture2D( tDiffuse, vUV );
578
- r = blendColour( r, colour.r, blending );
579
- g = blendColour( g, colour.g, blending );
580
- b = blendColour( b, colour.b, blending );
581
-
582
- if ( greyscale ) {
583
- r = g = b = (r + b + g) / 3.0;
584
- }
585
-
586
- gl_FragColor = vec4( r, g, b, 1.0 );
587
-
588
- } else {
589
-
590
- gl_FragColor = texture2D( tDiffuse, vUV );
591
-
592
- }
593
-
594
- }`};class Ie extends y{constructor(t){super(),this.uniforms=i.UniformsUtils.clone(L.uniforms),this.material=new i.ShaderMaterial({uniforms:this.uniforms,fragmentShader:L.fragmentShader,vertexShader:L.vertexShader});for(const e in t)t.hasOwnProperty(e)&&this.uniforms.hasOwnProperty(e)&&(this.uniforms[e].value=t[e]);this._fsQuad=new T(this.material)}render(t,e,a){this.material.uniforms.tDiffuse.value=a.texture,this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(),this._fsQuad.render(t))}setSize(t,e){this.uniforms.width.value=t,this.uniforms.height.value=e}dispose(){this.material.dispose(),this._fsQuad.dispose()}}const Xe=s.defineComponent({__name:"Halftone",props:{shape:{},radius:{},rotateR:{},rotateG:{},rotateB:{},scatter:{},blending:{},greyscale:{type:Boolean},blendingMode:{}},setup(r,{expose:t}){const e=r,{sizes:a}=v.useTresContext(),o=s.computed(()=>Object.fromEntries(Object.entries(e).filter(([l,u])=>u!==void 0))),{pass:n}=M(()=>new Ie(o.value),e);return t({pass:n}),s.watchEffect(()=>{n.value.setSize(a.width.value,a.height.value)}),s.watchEffect(()=>{Object.entries(e).forEach(([l,u])=>{l in n.value.uniforms&&(n.value.uniforms[l].value=u??L.uniforms[l].value)})}),()=>{}}});class J extends y{constructor(t,e,a,o={}){super(),this.pixelSize=t,this.scene=e,this.camera=a,this.normalEdgeStrength=o.normalEdgeStrength||.3,this.depthEdgeStrength=o.depthEdgeStrength||.4,this.pixelatedMaterial=this._createPixelatedMaterial(),this._resolution=new i.Vector2,this._renderResolution=new i.Vector2,this._normalMaterial=new i.MeshNormalMaterial,this._beautyRenderTarget=new i.WebGLRenderTarget,this._beautyRenderTarget.texture.minFilter=i.NearestFilter,this._beautyRenderTarget.texture.magFilter=i.NearestFilter,this._beautyRenderTarget.texture.type=i.HalfFloatType,this._beautyRenderTarget.depthTexture=new i.DepthTexture,this._normalRenderTarget=new i.WebGLRenderTarget,this._normalRenderTarget.texture.minFilter=i.NearestFilter,this._normalRenderTarget.texture.magFilter=i.NearestFilter,this._normalRenderTarget.texture.type=i.HalfFloatType,this._fsQuad=new T(this.pixelatedMaterial)}dispose(){this._beautyRenderTarget.dispose(),this._normalRenderTarget.dispose(),this.pixelatedMaterial.dispose(),this._normalMaterial.dispose(),this._fsQuad.dispose()}setSize(t,e){this._resolution.set(t,e),this._renderResolution.set(t/this.pixelSize|0,e/this.pixelSize|0);const{x:a,y:o}=this._renderResolution;this._beautyRenderTarget.setSize(a,o),this._normalRenderTarget.setSize(a,o),this._fsQuad.material.uniforms.resolution.value.set(a,o,1/a,1/o)}setPixelSize(t){this.pixelSize=t,this.setSize(this._resolution.x,this._resolution.y)}render(t,e){const a=this._fsQuad.material.uniforms;a.normalEdgeStrength.value=this.normalEdgeStrength,a.depthEdgeStrength.value=this.depthEdgeStrength,t.setRenderTarget(this._beautyRenderTarget),t.render(this.scene,this.camera);const o=this.scene.overrideMaterial;t.setRenderTarget(this._normalRenderTarget),this.scene.overrideMaterial=this._normalMaterial,t.render(this.scene,this.camera),this.scene.overrideMaterial=o,a.tDiffuse.value=this._beautyRenderTarget.texture,a.tDepth.value=this._beautyRenderTarget.depthTexture,a.tNormal.value=this._normalRenderTarget.texture,this.renderToScreen?t.setRenderTarget(null):(t.setRenderTarget(e),this.clear&&t.clear()),this._fsQuad.render(t)}_createPixelatedMaterial(){return new i.ShaderMaterial({uniforms:{tDiffuse:{value:null},tDepth:{value:null},tNormal:{value:null},resolution:{value:new i.Vector4},normalEdgeStrength:{value:0},depthEdgeStrength:{value:0}},vertexShader:`
595
- varying vec2 vUv;
596
-
597
- void main() {
598
-
599
- vUv = uv;
600
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
601
-
602
- }
603
- `,fragmentShader:`
604
- uniform sampler2D tDiffuse;
605
- uniform sampler2D tDepth;
606
- uniform sampler2D tNormal;
607
- uniform vec4 resolution;
608
- uniform float normalEdgeStrength;
609
- uniform float depthEdgeStrength;
610
- varying vec2 vUv;
611
-
612
- float getDepth(int x, int y) {
613
-
614
- return texture2D( tDepth, vUv + vec2(x, y) * resolution.zw ).r;
615
-
616
- }
617
-
618
- vec3 getNormal(int x, int y) {
619
-
620
- return texture2D( tNormal, vUv + vec2(x, y) * resolution.zw ).rgb * 2.0 - 1.0;
621
-
622
- }
623
-
624
- float depthEdgeIndicator(float depth, vec3 normal) {
625
-
626
- float diff = 0.0;
627
- diff += clamp(getDepth(1, 0) - depth, 0.0, 1.0);
628
- diff += clamp(getDepth(-1, 0) - depth, 0.0, 1.0);
629
- diff += clamp(getDepth(0, 1) - depth, 0.0, 1.0);
630
- diff += clamp(getDepth(0, -1) - depth, 0.0, 1.0);
631
- return floor(smoothstep(0.01, 0.02, diff) * 2.) / 2.;
632
-
633
- }
634
-
635
- float neighborNormalEdgeIndicator(int x, int y, float depth, vec3 normal) {
636
-
637
- float depthDiff = getDepth(x, y) - depth;
638
- vec3 neighborNormal = getNormal(x, y);
639
-
640
- // Edge pixels should yield to faces who's normals are closer to the bias normal.
641
- vec3 normalEdgeBias = vec3(1., 1., 1.); // This should probably be a parameter.
642
- float normalDiff = dot(normal - neighborNormal, normalEdgeBias);
643
- float normalIndicator = clamp(smoothstep(-.01, .01, normalDiff), 0.0, 1.0);
644
-
645
- // Only the shallower pixel should detect the normal edge.
646
- float depthIndicator = clamp(sign(depthDiff * .25 + .0025), 0.0, 1.0);
647
-
648
- return (1.0 - dot(normal, neighborNormal)) * depthIndicator * normalIndicator;
649
-
650
- }
651
-
652
- float normalEdgeIndicator(float depth, vec3 normal) {
653
-
654
- float indicator = 0.0;
655
-
656
- indicator += neighborNormalEdgeIndicator(0, -1, depth, normal);
657
- indicator += neighborNormalEdgeIndicator(0, 1, depth, normal);
658
- indicator += neighborNormalEdgeIndicator(-1, 0, depth, normal);
659
- indicator += neighborNormalEdgeIndicator(1, 0, depth, normal);
660
-
661
- return step(0.1, indicator);
662
-
663
- }
664
-
665
- void main() {
666
-
667
- vec4 texel = texture2D( tDiffuse, vUv );
668
-
669
- float depth = 0.0;
670
- vec3 normal = vec3(0.0);
671
-
672
- if (depthEdgeStrength > 0.0 || normalEdgeStrength > 0.0) {
673
-
674
- depth = getDepth(0, 0);
675
- normal = getNormal(0, 0);
676
-
677
- }
678
-
679
- float dei = 0.0;
680
- if (depthEdgeStrength > 0.0)
681
- dei = depthEdgeIndicator(depth, normal);
682
-
683
- float nei = 0.0;
684
- if (normalEdgeStrength > 0.0)
685
- nei = normalEdgeIndicator(depth, normal);
686
-
687
- float Strength = dei > 0.0 ? (1.0 - depthEdgeStrength * dei) : (1.0 + normalEdgeStrength * nei);
688
-
689
- gl_FragColor = texel * Strength;
690
-
691
- }
692
- `})}}const je=s.defineComponent({__name:"Pixelation",props:{pixelSize:{},depthEdgeStrength:{},normalEdgeStrength:{}},setup(r,{expose:t}){const e=r,{scene:a,camera:o}=v.useTres(),{pass:n}=M(()=>new J(e.pixelSize,a.value,o.value),e);return t({pass:n}),s.watchEffect(()=>{n.value.setPixelSize(e.pixelSize)}),g([[()=>e.depthEdgeStrength,"depthEdgeStrength"],[()=>e.normalEdgeStrength,"normalEdgeStrength"]],n,()=>new J(1,a.value,o.value)),()=>{}}}),O={name:"OutputShader",uniforms:{tDiffuse:{value:null},toneMappingExposure:{value:1}},vertexShader:`
693
- precision highp float;
694
-
695
- uniform mat4 modelViewMatrix;
696
- uniform mat4 projectionMatrix;
697
-
698
- attribute vec3 position;
699
- attribute vec2 uv;
700
-
701
- varying vec2 vUv;
702
-
703
- void main() {
704
-
705
- vUv = uv;
706
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
707
-
708
- }`,fragmentShader:`
709
-
710
- precision highp float;
711
-
712
- uniform sampler2D tDiffuse;
713
-
714
- #include <tonemapping_pars_fragment>
715
- #include <colorspace_pars_fragment>
716
-
717
- varying vec2 vUv;
718
-
719
- void main() {
720
-
721
- gl_FragColor = texture2D( tDiffuse, vUv );
722
-
723
- // tone mapping
724
-
725
- #ifdef LINEAR_TONE_MAPPING
726
-
727
- gl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );
728
-
729
- #elif defined( REINHARD_TONE_MAPPING )
730
-
731
- gl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );
732
-
733
- #elif defined( CINEON_TONE_MAPPING )
734
-
735
- gl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );
736
-
737
- #elif defined( ACES_FILMIC_TONE_MAPPING )
738
-
739
- gl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );
740
-
741
- #elif defined( AGX_TONE_MAPPING )
742
-
743
- gl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );
744
-
745
- #elif defined( NEUTRAL_TONE_MAPPING )
746
-
747
- gl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );
748
-
749
- #elif defined( CUSTOM_TONE_MAPPING )
750
-
751
- gl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );
752
-
753
- #endif
754
-
755
- // color space
756
-
757
- #ifdef SRGB_TRANSFER
758
-
759
- gl_FragColor = sRGBTransferOETF( gl_FragColor );
760
-
761
- #endif
762
-
763
- }`};class _e extends y{constructor(){super(),this.uniforms=i.UniformsUtils.clone(O.uniforms),this.material=new i.RawShaderMaterial({name:O.name,uniforms:this.uniforms,vertexShader:O.vertexShader,fragmentShader:O.fragmentShader}),this._fsQuad=new T(this.material),this._outputColorSpace=null,this._toneMapping=null}render(t,e,a){this.uniforms.tDiffuse.value=a.texture,this.uniforms.toneMappingExposure.value=t.toneMappingExposure,(this._outputColorSpace!==t.outputColorSpace||this._toneMapping!==t.toneMapping)&&(this._outputColorSpace=t.outputColorSpace,this._toneMapping=t.toneMapping,this.material.defines={},i.ColorManagement.getTransfer(this._outputColorSpace)===i.SRGBTransfer&&(this.material.defines.SRGB_TRANSFER=""),this._toneMapping===i.LinearToneMapping?this.material.defines.LINEAR_TONE_MAPPING="":this._toneMapping===i.ReinhardToneMapping?this.material.defines.REINHARD_TONE_MAPPING="":this._toneMapping===i.CineonToneMapping?this.material.defines.CINEON_TONE_MAPPING="":this._toneMapping===i.ACESFilmicToneMapping?this.material.defines.ACES_FILMIC_TONE_MAPPING="":this._toneMapping===i.AgXToneMapping?this.material.defines.AGX_TONE_MAPPING="":this._toneMapping===i.NeutralToneMapping?this.material.defines.NEUTRAL_TONE_MAPPING="":this._toneMapping===i.CustomToneMapping&&(this.material.defines.CUSTOM_TONE_MAPPING=""),this.material.needsUpdate=!0),this.renderToScreen===!0?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this._fsQuad.render(t))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}const Ye=s.defineComponent({__name:"Output",setup(r,{expose:t}){const{pass:e}=M(()=>new _e);return t({pass:e}),()=>{}}}),R={defines:{SMAA_THRESHOLD:"0.1"},uniforms:{tDiffuse:{value:null},resolution:{value:new i.Vector2(1/1024,1/512)}},vertexShader:`
764
-
765
- uniform vec2 resolution;
766
-
767
- varying vec2 vUv;
768
- varying vec4 vOffset[ 3 ];
769
-
770
- void SMAAEdgeDetectionVS( vec2 texcoord ) {
771
- vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component
772
- vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component
773
- vOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 ); // WebGL port note: Changed sign in W component
774
- }
775
-
776
- void main() {
777
-
778
- vUv = uv;
779
-
780
- SMAAEdgeDetectionVS( vUv );
781
-
782
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
783
-
784
- }`,fragmentShader:`
785
-
786
- uniform sampler2D tDiffuse;
787
-
788
- varying vec2 vUv;
789
- varying vec4 vOffset[ 3 ];
790
-
791
- vec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {
792
- vec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );
793
-
794
- // Calculate color deltas:
795
- vec4 delta;
796
- vec3 C = texture2D( colorTex, texcoord ).rgb;
797
-
798
- vec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;
799
- vec3 t = abs( C - Cleft );
800
- delta.x = max( max( t.r, t.g ), t.b );
801
-
802
- vec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;
803
- t = abs( C - Ctop );
804
- delta.y = max( max( t.r, t.g ), t.b );
805
-
806
- // We do the usual threshold:
807
- vec2 edges = step( threshold, delta.xy );
808
-
809
- // Then discard if there is no edge:
810
- if ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )
811
- discard;
812
-
813
- // Calculate right and bottom deltas:
814
- vec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;
815
- t = abs( C - Cright );
816
- delta.z = max( max( t.r, t.g ), t.b );
817
-
818
- vec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;
819
- t = abs( C - Cbottom );
820
- delta.w = max( max( t.r, t.g ), t.b );
821
-
822
- // Calculate the maximum delta in the direct neighborhood:
823
- float maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );
824
-
825
- // Calculate left-left and top-top deltas:
826
- vec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;
827
- t = abs( C - Cleftleft );
828
- delta.z = max( max( t.r, t.g ), t.b );
829
-
830
- vec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;
831
- t = abs( C - Ctoptop );
832
- delta.w = max( max( t.r, t.g ), t.b );
833
-
834
- // Calculate the final maximum delta:
835
- maxDelta = max( max( maxDelta, delta.z ), delta.w );
836
-
837
- // Local contrast adaptation in action:
838
- edges.xy *= step( 0.5 * maxDelta, delta.xy );
839
-
840
- return vec4( edges, 0.0, 0.0 );
841
- }
842
-
843
- void main() {
844
-
845
- gl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );
846
-
847
- }`},B={defines:{SMAA_MAX_SEARCH_STEPS:"8",SMAA_AREATEX_MAX_DISTANCE:"16",SMAA_AREATEX_PIXEL_SIZE:"( 1.0 / vec2( 160.0, 560.0 ) )",SMAA_AREATEX_SUBTEX_SIZE:"( 1.0 / 7.0 )"},uniforms:{tDiffuse:{value:null},tArea:{value:null},tSearch:{value:null},resolution:{value:new i.Vector2(1/1024,1/512)}},vertexShader:`
848
-
849
- uniform vec2 resolution;
850
-
851
- varying vec2 vUv;
852
- varying vec4 vOffset[ 3 ];
853
- varying vec2 vPixcoord;
854
-
855
- void SMAABlendingWeightCalculationVS( vec2 texcoord ) {
856
- vPixcoord = texcoord / resolution;
857
-
858
- // We will use these offsets for the searches later on (see @PSEUDO_GATHER4):
859
- vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components
860
- vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components
861
-
862
- // And these for the searches, they indicate the ends of the loops:
863
- vOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );
864
-
865
- }
866
-
867
- void main() {
868
-
869
- vUv = uv;
870
-
871
- SMAABlendingWeightCalculationVS( vUv );
872
-
873
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
874
-
875
- }`,fragmentShader:`
876
-
877
- #define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )
878
-
879
- uniform sampler2D tDiffuse;
880
- uniform sampler2D tArea;
881
- uniform sampler2D tSearch;
882
- uniform vec2 resolution;
883
-
884
- varying vec2 vUv;
885
- varying vec4 vOffset[3];
886
- varying vec2 vPixcoord;
887
-
888
- #if __VERSION__ == 100
889
- vec2 round( vec2 x ) {
890
- return sign( x ) * floor( abs( x ) + 0.5 );
891
- }
892
- #endif
893
-
894
- float SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {
895
- // Not required if searchTex accesses are set to point:
896
- // float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);
897
- // e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +
898
- // e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;
899
- e.r = bias + e.r * scale;
900
- return 255.0 * texture2D( searchTex, e, 0.0 ).r;
901
- }
902
-
903
- float SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
904
- /**
905
- * @PSEUDO_GATHER4
906
- * This texcoord has been offset by (-0.25, -0.125) in the vertex shader to
907
- * sample between edge, thus fetching four edges in a row.
908
- * Sampling with different offsets in each direction allows to disambiguate
909
- * which edges are active from the four fetched ones.
910
- */
911
- vec2 e = vec2( 0.0, 1.0 );
912
-
913
- for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
914
- e = texture2D( edgesTex, texcoord, 0.0 ).rg;
915
- texcoord -= vec2( 2.0, 0.0 ) * resolution;
916
- if ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;
917
- }
918
-
919
- // We correct the previous (-0.25, -0.125) offset we applied:
920
- texcoord.x += 0.25 * resolution.x;
921
-
922
- // The searches are bias by 1, so adjust the coords accordingly:
923
- texcoord.x += resolution.x;
924
-
925
- // Disambiguate the length added by the last step:
926
- texcoord.x += 2.0 * resolution.x; // Undo last step
927
- texcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);
928
-
929
- return texcoord.x;
930
- }
931
-
932
- float SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
933
- vec2 e = vec2( 0.0, 1.0 );
934
-
935
- for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
936
- e = texture2D( edgesTex, texcoord, 0.0 ).rg;
937
- texcoord += vec2( 2.0, 0.0 ) * resolution;
938
- if ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;
939
- }
940
-
941
- texcoord.x -= 0.25 * resolution.x;
942
- texcoord.x -= resolution.x;
943
- texcoord.x -= 2.0 * resolution.x;
944
- texcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );
945
-
946
- return texcoord.x;
947
- }
948
-
949
- float SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
950
- vec2 e = vec2( 1.0, 0.0 );
951
-
952
- for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
953
- e = texture2D( edgesTex, texcoord, 0.0 ).rg;
954
- texcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign
955
- if ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;
956
- }
957
-
958
- texcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign
959
- texcoord.y -= resolution.y; // WebGL port note: Changed sign
960
- texcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign
961
- texcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign
962
-
963
- return texcoord.y;
964
- }
965
-
966
- float SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {
967
- vec2 e = vec2( 1.0, 0.0 );
968
-
969
- for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for
970
- e = texture2D( edgesTex, texcoord, 0.0 ).rg;
971
- texcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign
972
- if ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;
973
- }
974
-
975
- texcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign
976
- texcoord.y += resolution.y; // WebGL port note: Changed sign
977
- texcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign
978
- texcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign
979
-
980
- return texcoord.y;
981
- }
982
-
983
- vec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {
984
- // Rounding prevents precision errors of bilinear filtering:
985
- vec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;
986
-
987
- // We do a scale and bias for mapping to texel space:
988
- texcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );
989
-
990
- // Move to proper place, according to the subpixel offset:
991
- texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;
992
-
993
- return texture2D( areaTex, texcoord, 0.0 ).rg;
994
- }
995
-
996
- vec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {
997
- vec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );
998
-
999
- vec2 e = texture2D( edgesTex, texcoord ).rg;
1000
-
1001
- if ( e.g > 0.0 ) { // Edge at north
1002
- vec2 d;
1003
-
1004
- // Find the distance to the left:
1005
- vec2 coords;
1006
- coords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );
1007
- coords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)
1008
- d.x = coords.x;
1009
-
1010
- // Now fetch the left crossing edges, two at a time using bilinear
1011
- // filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to
1012
- // discern what value each edge has:
1013
- float e1 = texture2D( edgesTex, coords, 0.0 ).r;
1014
-
1015
- // Find the distance to the right:
1016
- coords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );
1017
- d.y = coords.x;
1018
-
1019
- // We want the distances to be in pixel units (doing this here allow to
1020
- // better interleave arithmetic and memory accesses):
1021
- d = d / resolution.x - pixcoord.x;
1022
-
1023
- // SMAAArea below needs a sqrt, as the areas texture is compressed
1024
- // quadratically:
1025
- vec2 sqrt_d = sqrt( abs( d ) );
1026
-
1027
- // Fetch the right crossing edges:
1028
- coords.y -= 1.0 * resolution.y; // WebGL port note: Added
1029
- float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;
1030
-
1031
- // Ok, we know how this pattern looks like, now it is time for getting
1032
- // the actual area:
1033
- weights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );
1034
- }
1035
-
1036
- if ( e.r > 0.0 ) { // Edge at west
1037
- vec2 d;
1038
-
1039
- // Find the distance to the top:
1040
- vec2 coords;
1041
-
1042
- coords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );
1043
- coords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;
1044
- d.x = coords.y;
1045
-
1046
- // Fetch the top crossing edges:
1047
- float e1 = texture2D( edgesTex, coords, 0.0 ).g;
1048
-
1049
- // Find the distance to the bottom:
1050
- coords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );
1051
- d.y = coords.y;
1052
-
1053
- // We want the distances to be in pixel units:
1054
- d = d / resolution.y - pixcoord.y;
1055
-
1056
- // SMAAArea below needs a sqrt, as the areas texture is compressed
1057
- // quadratically:
1058
- vec2 sqrt_d = sqrt( abs( d ) );
1059
-
1060
- // Fetch the bottom crossing edges:
1061
- coords.y -= 1.0 * resolution.y; // WebGL port note: Added
1062
- float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;
1063
-
1064
- // Get the area for this direction:
1065
- weights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );
1066
- }
1067
-
1068
- return weights;
1069
- }
1070
-
1071
- void main() {
1072
-
1073
- gl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );
1074
-
1075
- }`},W={uniforms:{tDiffuse:{value:null},tColor:{value:null},resolution:{value:new i.Vector2(1/1024,1/512)}},vertexShader:`
1076
-
1077
- uniform vec2 resolution;
1078
-
1079
- varying vec2 vUv;
1080
- varying vec4 vOffset[ 2 ];
1081
-
1082
- void SMAANeighborhoodBlendingVS( vec2 texcoord ) {
1083
- vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component
1084
- vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component
1085
- }
1086
-
1087
- void main() {
1088
-
1089
- vUv = uv;
1090
-
1091
- SMAANeighborhoodBlendingVS( vUv );
1092
-
1093
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1094
-
1095
- }`,fragmentShader:`
1096
-
1097
- uniform sampler2D tDiffuse;
1098
- uniform sampler2D tColor;
1099
- uniform vec2 resolution;
1100
-
1101
- varying vec2 vUv;
1102
- varying vec4 vOffset[ 2 ];
1103
-
1104
- vec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {
1105
- // Fetch the blending weights for current pixel:
1106
- vec4 a;
1107
- a.xz = texture2D( blendTex, texcoord ).xz;
1108
- a.y = texture2D( blendTex, offset[ 1 ].zw ).g;
1109
- a.w = texture2D( blendTex, offset[ 1 ].xy ).a;
1110
-
1111
- // Is there any blending weight with a value greater than 0.0?
1112
- if ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {
1113
- return texture2D( colorTex, texcoord, 0.0 );
1114
- } else {
1115
- // Up to 4 lines can be crossing a pixel (one through each edge). We
1116
- // favor blending by choosing the line with the maximum weight for each
1117
- // direction:
1118
- vec2 offset;
1119
- offset.x = a.a > a.b ? a.a : -a.b; // left vs. right
1120
- offset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs
1121
-
1122
- // Then we go in the direction that has the maximum weight:
1123
- if ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical
1124
- offset.y = 0.0;
1125
- } else {
1126
- offset.x = 0.0;
1127
- }
1128
-
1129
- // Fetch the opposite color and lerp by hand:
1130
- vec4 C = texture2D( colorTex, texcoord, 0.0 );
1131
- texcoord += sign( offset ) * resolution;
1132
- vec4 Cop = texture2D( colorTex, texcoord, 0.0 );
1133
- float s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );
1134
-
1135
- // WebGL port note: Added gamma correction
1136
- C.xyz = pow(C.xyz, vec3(2.2));
1137
- Cop.xyz = pow(Cop.xyz, vec3(2.2));
1138
- vec4 mixed = mix(C, Cop, s);
1139
- mixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));
1140
-
1141
- return mixed;
1142
- }
1143
- }
1144
-
1145
- void main() {
1146
-
1147
- gl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );
1148
-
1149
- }`};class ke extends y{constructor(){super(),this._edgesRT=new i.WebGLRenderTarget(1,1,{depthBuffer:!1,type:i.HalfFloatType}),this._edgesRT.texture.name="SMAAPass.edges",this._weightsRT=new i.WebGLRenderTarget(1,1,{depthBuffer:!1,type:i.HalfFloatType}),this._weightsRT.texture.name="SMAAPass.weights";const t=this,e=new Image;e.src=this._getAreaTexture(),e.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new i.Texture,this._areaTexture.name="SMAAPass.area",this._areaTexture.image=e,this._areaTexture.minFilter=i.LinearFilter,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;const a=new Image;a.src=this._getSearchTexture(),a.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new i.Texture,this._searchTexture.name="SMAAPass.search",this._searchTexture.image=a,this._searchTexture.magFilter=i.NearestFilter,this._searchTexture.minFilter=i.NearestFilter,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._uniformsEdges=i.UniformsUtils.clone(R.uniforms),this._materialEdges=new i.ShaderMaterial({defines:Object.assign({},R.defines),uniforms:this._uniformsEdges,vertexShader:R.vertexShader,fragmentShader:R.fragmentShader}),this._uniformsWeights=i.UniformsUtils.clone(B.uniforms),this._uniformsWeights.tDiffuse.value=this._edgesRT.texture,this._uniformsWeights.tArea.value=this._areaTexture,this._uniformsWeights.tSearch.value=this._searchTexture,this._materialWeights=new i.ShaderMaterial({defines:Object.assign({},B.defines),uniforms:this._uniformsWeights,vertexShader:B.vertexShader,fragmentShader:B.fragmentShader}),this._uniformsBlend=i.UniformsUtils.clone(W.uniforms),this._uniformsBlend.tDiffuse.value=this._weightsRT.texture,this._materialBlend=new i.ShaderMaterial({uniforms:this._uniformsBlend,vertexShader:W.vertexShader,fragmentShader:W.fragmentShader}),this._fsQuad=new T(null)}render(t,e,a){this._uniformsEdges.tDiffuse.value=a.texture,this._fsQuad.material=this._materialEdges,t.setRenderTarget(this._edgesRT),this.clear&&t.clear(),this._fsQuad.render(t),this._fsQuad.material=this._materialWeights,t.setRenderTarget(this._weightsRT),this.clear&&t.clear(),this._fsQuad.render(t),this._uniformsBlend.tColor.value=a.texture,this._fsQuad.material=this._materialBlend,this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(),this._fsQuad.render(t))}setSize(t,e){this._edgesRT.setSize(t,e),this._weightsRT.setSize(t,e),this._materialEdges.uniforms.resolution.value.set(1/t,1/e),this._materialWeights.uniforms.resolution.value.set(1/t,1/e),this._materialBlend.uniforms.resolution.value.set(1/t,1/e)}dispose(){this._edgesRT.dispose(),this._weightsRT.dispose(),this._areaTexture.dispose(),this._searchTexture.dispose(),this._materialEdges.dispose(),this._materialWeights.dispose(),this._materialBlend.dispose(),this._fsQuad.dispose()}_getAreaTexture(){return"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAIwCAIAAACOVPcQAACBeklEQVR42u39W4xlWXrnh/3WWvuciIzMrKxrV8/0rWbY0+SQFKcb4owIkSIFCjY9AC1BT/LYBozRi+EX+cV+8IMsYAaCwRcBwjzMiw2jAWtgwC8WR5Q8mDFHZLNHTarZGrLJJllt1W2qKrsumZWZcTvn7L3W54e1vrXX3vuciLPPORFR1XE2EomorB0nVuz//r71re/y/1eMvb4Cb3N11xV/PP/2v4UBAwJG/7H8urx6/25/Gf8O5hypMQ0EEEQwAqLfoN/Z+97f/SW+/NvcgQk4sGBJK6H7N4PFVL+K+e0N11yNfkKvwUdwdlUAXPHHL38oa15f/i/46Ih6SuMSPmLAYAwyRKn7dfMGH97jaMFBYCJUgotIC2YAdu+LyW9vvubxAP8kAL8H/koAuOKP3+q6+xGnd5kdYCeECnGIJViwGJMAkQKfDvB3WZxjLKGh8VSCCzhwEWBpMc5/kBbjawT4HnwJfhr+pPBIu7uu+OOTo9vsmtQcniMBGkKFd4jDWMSCRUpLjJYNJkM+IRzQ+PQvIeAMTrBS2LEiaiR9b/5PuT6Ap/AcfAFO4Y3dA3DFH7/VS+M8k4baEAQfMI4QfbVDDGIRg7GKaIY52qAjTAgTvGBAPGIIghOCYAUrGFNgzA7Q3QhgCwfwAnwe5vDejgG44o/fbm1C5ZlYQvQDARPAIQGxCWBM+wWl37ZQESb4gImexGMDouhGLx1Cst0Saa4b4AqO4Hk4gxo+3DHAV/nx27p3JziPM2pVgoiia5MdEzCGULprIN7gEEeQ5IQxEBBBQnxhsDb5auGmAAYcHMA9eAAz8PBol8/xij9+C4Djlim4gJjWcwZBhCBgMIIYxGAVIkH3ZtcBuLdtRFMWsPGoY9rN+HoBji9VBYdwD2ZQg4cnO7OSq/z4rU5KKdwVbFAjNojCQzTlCLPFSxtamwh2jMUcEgg2Wm/6XgErIBhBckQtGN3CzbVacERgCnfgLswhnvqf7QyAq/z4rRZm1YglYE3affGITaZsdIe2FmMIpnOCap25I6jt2kCwCW0D1uAD9sZctNGXcQIHCkINDQgc78aCr+zjtw3BU/ijdpw3zhCwcaONwBvdeS2YZKkJNJsMPf2JKEvC28RXxxI0ASJyzQCjCEQrO4Q7sFArEzjZhaFc4cdv+/JFdKULM4px0DfUBI2hIsy06BqLhGTQEVdbfAIZXYMPesq6VoCHICzUyjwInO4Y411//LYLs6TDa9wvg2CC2rElgAnpTBziThxaL22MYhzfkghz6GAs2VHbbdM91VZu1MEEpupMMwKyVTb5ij9+u4VJG/5EgEMMmFF01cFai3isRbKbzb+YaU/MQbAm2XSMoUPAmvZzbuKYRIFApbtlrfFuUGd6vq2hXNnH78ZLh/iFhsQG3T4D1ib7k5CC6vY0DCbtrohgLEIClXiGtl10zc0CnEGIhhatLBva7NP58Tvw0qE8yWhARLQ8h4+AhQSP+I4F5xoU+VilGRJs6wnS7ruti/4KvAY/CfdgqjsMy4pf8fodQO8/gnuX3f/3xi3om1/h7THr+co3x93PP9+FBUfbNUjcjEmhcrkT+8K7ml7V10Jo05mpIEFy1NmCJWx9SIKKt+EjAL4Ez8EBVOB6havuT/rByPvHXK+9zUcfcbb254+9fydJknYnRr1oGfdaiAgpxu1Rx/Rek8KISftx3L+DfsLWAANn8Hvw0/AFeAGO9DFV3c6D+CcWbL8Dj9e7f+T1k8AZv/d7+PXWM/Z+VvdCrIvuAKO09RpEEQJM0Ci6+B4xhTWr4cZNOvhktabw0ta0rSJmqz3Yw5/AKXwenod7cAhTmBSPKf6JBdvH8IP17h95pXqw50/+BFnj88fev4NchyaK47OPhhtI8RFSvAfDSNh0Ck0p2gLxGkib5NJj/JWCr90EWQJvwBzO4AHcgztwAFN1evHPUVGwfXON+0debT1YeGON9Yy9/63X+OguiwmhIhQhD7l4sMqlG3D86Suc3qWZ4rWjI1X7u0Ytw6x3rIMeIOPDprfe2XzNgyj6PahhBjO4C3e6puDgXrdg+/5l948vF3bqwZetZ+z9Rx9zdIY5pInPK4Nk0t+l52xdK2B45Qd87nM8fsD5EfUhIcJcERw4RdqqH7Yde5V7m1vhNmtedkz6EDzUMF/2jJYWbC+4fzzA/Y+/8PPH3j9dcBAPIRP8JLXd5BpAu03aziOL3VVHZzz3CXWDPWd+SH2AnxIqQoTZpo9Ckc6HIrFbAbzNmlcg8Ag8NFDDAhbJvTBZXbC94P7t68EXfv6o+21gUtPETU7bbkLxvNKRFG2+KXzvtObonPP4rBvsgmaKj404DlshFole1Glfh02fE7bYR7dZ82oTewIBGn1Md6CG6YUF26X376oevOLzx95vhUmgblI6LBZwTCDY7vMq0op5WVXgsObOXJ+1x3qaBl9j1FeLxbhU9w1F+Wiba6s1X/TBz1LnUfuYDi4r2C69f1f14BWfP+p+W2GFKuC9phcELMYRRLur9DEZTUdEH+iEqWdaM7X4WOoPGI+ZYD2+wcQ+y+ioHUZ9dTDbArzxmi/bJI9BND0Ynd6lBdve/butBw8+f/T9D3ABa3AG8W3VPX4hBin+bj8dMMmSpp5pg7fJ6xrBFE2WQQEWnV8Qg3FbAWzYfM1rREEnmvkN2o1+acG2d/9u68GDzx91v3mAjb1zkpqT21OipPKO0b9TO5W0nTdOmAQm0TObts3aBKgwARtoPDiCT0gHgwnbArzxmtcLc08HgF1asN0C4Ms/fvD5I+7PhfqyXE/b7RbbrGyRQRT9ARZcwAUmgdoz0ehJ9Fn7QAhUjhDAQSw0bV3T3WbNa59jzmiP6GsWbGXDX2ytjy8+f9T97fiBPq9YeLdBmyuizZHaqXITnXiMUEEVcJ7K4j3BFPurtB4bixW8wTpweL8DC95szWMOqucFYGsWbGU7p3TxxxefP+r+oTVktxY0v5hbq3KiOKYnY8ddJVSBxuMMVffNbxwIOERShst73HZ78DZrHpmJmH3K6sGz0fe3UUj0eyRrSCGTTc+rjVNoGzNSv05srAxUBh8IhqChiQgVNIIBH3AVPnrsnXQZbLTm8ammv8eVXn/vWpaTem5IXRlt+U/LA21zhSb9cye6jcOfCnOwhIAYXAMVTUNV0QhVha9xjgA27ODJbLbmitt3tRN80lqG6N/khgot4ZVlOyO4WNg3OIMzhIZQpUEHieg2im6F91hB3I2tubql6BYNN9Hj5S7G0G2tahslBWKDnOiIvuAEDzakDQKDNFQT6gbn8E2y4BBubM230YIpBnDbMa+y3dx0n1S0BtuG62lCCXwcY0F72T1VRR3t2ONcsmDjbmzNt9RFs2LO2hQNyb022JisaI8rAWuw4HI3FuAIhZdOGIcdjLJvvObqlpqvWTJnnQbyi/1M9O8UxWhBs//H42I0q1Yb/XPGONzcmm+ri172mHKvZBpHkJaNJz6v9jxqiklDj3U4CA2ugpAaYMWqNXsdXbmJNd9egCnJEsphXNM+MnK3m0FCJ5S1kmJpa3DgPVbnQnPGWIDspW9ozbcO4K/9LkfaQO2KHuqlfFXSbdNzcEcwoqNEFE9zcIXu9/6n/ym/BC/C3aJLzEKPuYVlbFnfhZ8kcWxV3dbv4bKl28566wD+8C53aw49lTABp9PWbsB+knfc/Li3eVizf5vv/xmvnPKg5ihwKEwlrcHqucuVcVOxEv8aH37E3ZqpZypUulrHEtIWKUr+txHg+ojZDGlwnqmkGlzcVi1dLiNSJiHjfbRNOPwKpx9TVdTn3K05DBx4psIk4Ei8aCkJahRgffk4YnEXe07T4H2RR1u27E6wfQsBDofUgjFUFnwC2AiVtA+05J2zpiDK2Oa0c5fmAecN1iJzmpqFZxqYBCYhFTCsUNEmUnIcZ6aEA5rQVhEywG6w7HSW02XfOoBlQmjwulOFQAg66SvJblrTEX1YtJ3uG15T/BH1OfOQeuR8g/c0gdpT5fx2SKbs9EfHTKdM8A1GaJRHLVIwhcGyydZsbifAFVKl5EMKNU2Hryo+06BeTgqnxzYjThVySDikbtJPieco75lYfKAJOMEZBTjoITuWHXXZVhcUDIS2hpiXHV9Ku4u44bN5OYLDOkJo8w+xJSMbhBRHEdEs9JZUCkQrPMAvaHyLkxgkEHxiNkx/x2YB0mGsQ8EUWj/stW5YLhtS5SMu+/YBbNPDCkGTUybN8krRLBGPlZkVOA0j+a1+rkyQKWGaPHPLZOkJhioQYnVZ2hS3zVxMtgC46KuRwbJNd9nV2PHgb36F194ecf/Yeu2vAFe5nm/bRBFrnY4BauE8ERmZRFUn0k8hbftiVYSKMEme2dJCJSCGYAlNqh87bXOPdUkGy24P6d1ll21MBqqx48Fvv8ZHH8HZFY7j/uAq1xMJUFqCSUlJPmNbIiNsmwuMs/q9CMtsZsFO6SprzCS1Z7QL8xCQClEelpjTduDMsmWD8S1PT152BtvmIGvUeDA/yRn83u/x0/4qxoPHjx+PXY9pqX9bgMvh/Nz9kpP4pOe1/fYf3axUiMdHLlPpZCNjgtNFAhcHEDxTumNONhHrBduW+vOyY++70WWnPXj98eA4kOt/mj/5E05l9+O4o8ePx67HFqyC+qSSnyselqjZGaVK2TadbFLPWAQ4NBhHqDCCV7OTpo34AlSSylPtIdd2AJZlyzYQrDJ5lcWGNceD80CunPLGGzsfD+7wRb95NevJI5docQ3tgCyr5bGnyaPRlmwNsFELViOOx9loebGNq2moDOKpHLVP5al2cymWHbkfzGXL7kfRl44H9wZy33tvt+PB/Xnf93e+nh5ZlU18wCiRUa9m7kib9LYuOk+hudQNbxwm0AQqbfloimaB2lM5fChex+ylMwuTbfmXQtmWlenZljbdXTLuOxjI/fDDHY4Hjx8/Hrse0zXfPFxbUN1kKqSCCSk50m0Ajtx3ub9XHBKHXESb8iO6E+qGytF4nO0OG3SXzbJlhxBnKtKyl0NwybjvYCD30aMdjgePHz8eu56SVTBbgxJMliQ3Oauwg0QHxXE2Ez/EIReLdQj42Gzb4CLS0YJD9xUx7bsi0vJi5mUbW1QzL0h0PFk17rtiIPfJk52MB48fPx67npJJwyrBa2RCCQRTbGZSPCxTPOiND4G2pYyOQ4h4jINIJh5wFU1NFZt+IsZ59LSnDqBjZ2awbOku+yInunLcd8VA7rNnOxkPHj9+PGY9B0MWJJNozOJmlglvDMXDEozdhQWbgs/U6oBanGzLrdSNNnZFjOkmbi5bNt1lX7JLLhn3vXAg9/h4y/Hg8ePHI9dzQMEkWCgdRfYykYKnkP7D4rIujsujaKPBsB54vE2TS00ccvFY/Tth7JXeq1hz+qgVy04sAJawTsvOknHfCwdyT062HA8eP348Zj0vdoXF4pilKa2BROed+9fyw9rWRXeTFXESMOanvDZfJuJaSXouQdMdDJZtekZcLLvEeK04d8m474UDuaenW44Hjx8/Xns9YYqZpszGWB3AN/4VHw+k7WSFtJ3Qicuqb/NlVmgXWsxh570xg2UwxUw3WfO6B5nOuO8aA7lnZxuPB48fPx6znm1i4bsfcbaptF3zNT78eFPtwi1OaCNOqp1x3zUGcs/PN++AGD1+fMXrSVm2baTtPhPahbPhA71wIHd2bXzRa69nG+3CraTtPivahV/55tXWg8fyRY/9AdsY8VbSdp8V7cKrrgdfM//z6ILQFtJ2nxHtwmuoB4/kf74+gLeRtvvMaBdeSz34+vifx0YG20jbfTa0C6+tHrwe//NmOG0L8EbSdp8R7cLrrQe/996O+ai3ujQOskpTNULa7jOjXXj99eCd8lHvoFiwsbTdZ0a78PrrwTvlo966pLuRtB2fFe3Cm6oHP9kNH/W2FryxtN1nTLvwRurBO+Kj3pWXHidtx2dFu/Bm68Fb81HvykuPlrb7LGkX3mw9eGs+6h1Y8MbSdjegXcguQLjmevDpTQLMxtJ2N6NdyBZu9AbrwVvwUW+LbteULUpCdqm0HTelXbhNPe8G68Gb8lFvVfYfSNuxvrTdTWoXbozAzdaDZzfkorOj1oxVxlIMlpSIlpLrt8D4hrQL17z+c3h6hU/wv4Q/utps4+bm+6P/hIcf0JwQ5oQGPBL0eKPTYEXTW+eL/2DKn73J9BTXYANG57hz1cEMviVf/4tf5b/6C5pTQkMIWoAq7hTpOJjtAM4pxKu5vg5vXeUrtI09/Mo/5H+4z+Mp5xULh7cEm2QbRP2tFIKR7WM3fPf/jZ3SWCqLM2l4NxID5zB72HQXv3jj/8mLR5xXNA5v8EbFQEz7PpRfl1+MB/hlAN65qgDn3wTgH13hK7T59bmP+NIx1SHHU84nLOITt3iVz8mNO+lPrjGAnBFqmioNn1mTyk1ta47R6d4MrX7tjrnjYUpdUbv2rVr6YpVfsGG58AG8Ah9eyUN8CX4WfgV+G8LVWPDGb+Zd4cU584CtqSbMKxauxTg+dyn/LkVgA+IR8KHtejeFKRtTmLLpxN6mYVLjYxwXf5x2VofiZcp/lwKk4wGOpYDnoIZPdg/AAbwMfx0+ge9dgZvYjuqKe4HnGnykYo5TvJbG0Vj12JagRhwKa44H95ShkZa5RyLGGdfYvG7aw1TsF6iapPAS29mNS3NmsTQZCmgTzFwgL3upCTgtBTRwvGMAKrgLn4evwin8+afJRcff+8izUGUM63GOOuAs3tJkw7J4kyoNreqrpO6cYLQeFUd7TTpr5YOTLc9RUUogUOVJQ1GYJaFLAW0oTmKyYS46ZooP4S4EON3xQ5zC8/CX4CnM4c1PE8ApexpoYuzqlP3d4S3OJP8ZDK7cKWNaTlqmgDiiHwl1YsE41w1zT4iRTm3DBqxvOUsbMKKDa/EHxagtnta072ejc3DOIh5ojvh8l3tk1JF/AV6FU6jh3U8HwEazLgdCLYSQ+MYiAI2ltomkzttUb0gGHdSUUgsIYjTzLG3mObX4FBRaYtpDVNZrih9TgTeYOBxsEnN1gOCTM8Bsw/ieMc75w9kuAT6A+/AiHGvN/+Gn4KRkiuzpNNDYhDGFndWRpE6SVfm8U5bxnSgVV2jrg6JCKmneqey8VMFgq2+AM/i4L4RUbfSi27lNXZ7R7W9RTcq/q9fk4Xw3AMQd4I5ifAZz8FcVtm9SAom/dyN4lczJQW/kC42ZrHgcCoIf1oVMKkVItmMBi9cOeNHGLqOZk+QqQmrbc5YmYgxELUUN35z2iohstgfLIFmcMV7s4CFmI74L9+EFmGsi+tGnAOD4Yk9gIpo01Y4cA43BWGygMdr4YZekG3OBIUXXNukvJS8tqa06e+lSDCtnqqMFu6hWHXCF+WaYt64m9QBmNxi7Ioy7D+fa1yHw+FMAcPt7SysFLtoG4PXAk7JOA3aAxBRqUiAdU9Yp5lK3HLSRFtOim0sa8euEt08xvKjYjzeJ2GU7YawexrnKI9tmobInjFXCewpwriY9+RR4aaezFhMhGCppKwom0ChrgFlKzyPKkGlTW1YQrE9HJqu8hKGgMc6hVi5QRq0PZxNfrYNgE64utmRv6KKHRpxf6VDUaOvNP5jCEx5q185My/7RKz69UQu2im5k4/eownpxZxNLwiZ1AZTO2ZjWjkU9uaB2HFn6Q3u0JcsSx/qV9hTEApRzeBLDJQXxYmTnq7bdLa3+uqFrxLJ5w1TehnNHx5ECvCh2g2c3hHH5YsfdaSKddztfjQ6imKFGSyFwlLzxEGPp6r5IevVjk1AMx3wMqi1NxDVjLBiPs9tbsCkIY5we5/ML22zrCScFxnNtzsr9Wcc3CnD+pYO+4VXXiDE0oc/vQQ/fDK3oPESJMYXNmJa/DuloJZkcTpcYE8lIH8Dz8DJMiynNC86Mb2lNaaqP/+L7f2fcE/yP7/Lde8xfgSOdMxvOixZf/9p3+M4hT1+F+zApxg9XfUvYjc8qX2lfOOpK2gNRtB4flpFu9FTKCp2XJRgXnX6olp1zyYjTKJSkGmLE2NjUr1bxFM4AeAAHBUFIeSLqXR+NvH/M9fOnfHzOD2vCSyQJKzfgsCh+yi/Mmc35F2fUrw7miW33W9hBD1vpuUojFphIyvg7aTeoymDkIkeW3XLHmguMzbIAJejN6B5MDrhipE2y6SoFRO/AK/AcHHZHNIfiWrEe/C6cr3f/yOvrQKB+zMM55/GQdLDsR+ifr5Fiuu+/y+M78LzOE5dsNuXC3PYvYWd8NXvphLSkJIasrlD2/HOqQ+RjcRdjKTGWYhhVUm4yxlyiGPuMsZR7sMCHUBeTuNWA7if+ifXgc/hovftHXs/DV+Fvwe+f8shzMiMcweFgBly3//vwJfg5AN4450fn1Hd1Rm1aBLu22Dy3y3H2+OqMemkbGZ4jozcDjJf6596xOLpC0eMTHbKnxLxH27uZ/bMTGs2jOaMOY4m87CfQwF0dw53oa1k80JRuz/XgS+8fX3N9Af4qPIMfzKgCp4H5TDGe9GGeFPzSsZz80SlPTxXjgwJmC45njzgt2vbQ4b4OAdUK4/vWhO8d8v6EE8fMUsfakXbPpFJeLs2ubM/qdm/la3WP91uWhxXHjoWhyRUq2iJ/+5mA73zwIIo+LoZ/SgvIRjAd1IMvvn98PfgOvAJfhhm8scAKVWDuaRaK8aQ9f7vuPDH6Bj47ZXau7rqYJ66mTDwEDU6lLbCjCK0qTXyl5mnDoeNRxanj3FJbaksTk0faXxHxLrssgPkWB9LnA/MFleXcJozzjwsUvUG0X/QCve51qkMDXp9mtcyOy3rwBfdvVJK7D6/ACSzg3RoruIq5UDeESfEmVclDxnniU82vxMLtceD0hGZWzBNPMM/jSPne2OVatiTKUpY5vY7gc0LdUAWeWM5tH+O2I66AOWw9xT2BuyRVLGdoDHUsVRXOo/c+ZdRXvFfnxWyIV4upFLCl9eAL7h8Zv0QH8Ry8pA2cHzQpGesctVA37ZtklBTgHjyvdSeKY/RZw/kJMk0Y25cSNRWSigQtlULPTw+kzuJPeYEkXjQRpoGZobYsLF79pyd1dMRHInbgFTZqNLhDqiIsTNpoex2WLcy0/X6rHcdMMQvFSd5dWA++4P7xv89deACnmr36uGlL69bRCL6BSZsS6c0TU2TKK5gtWCzgAOOwQcurqk9j8whvziZSMLcq5hbuwBEsYjopUBkqw1yYBGpLA97SRElEmx5MCInBY5vgLk94iKqSWmhIGmkJ4Bi9m4L645J68LyY4wsFYBfUg5feP/6gWWm58IEmKQM89hq7KsZNaKtP5TxxrUZZVkNmMJtjbKrGxLNEbHPJxhqy7lAmbC32ZqeF6lTaknRWcYaFpfLUBh/rwaQycCCJmW15Kstv6jRHyJFry2C1ahkkIW0LO75s61+owxK1y3XqweX9m5YLM2DPFeOjn/iiqCKJ+yKXF8t5Yl/kNsqaSCryxPq5xWTFIaP8KSW0RYxqupaUf0RcTNSSdJZGcKYdYA6kdtrtmyBckfKXwqk0pHpUHlwWaffjNRBYFPUDWa8e3Lt/o0R0CdisKDM89cX0pvRHEfM8ca4t0s2Xx4kgo91MPQJ/0c9MQYq0co8MBh7bz1fio0UUHLR4aAIOvOmoYO6kwlEVODSSTliWtOtH6sPkrtctF9ZtJ9GIerBskvhdVS5cFNv9s1BU0AbdUgdK4FG+dRnjFmDTzniRMdZO1QhzMK355vigbdkpz9P6qjUGE5J2qAcXmwJ20cZUiAD0z+pGMx6xkzJkmEf40Hr4qZfVg2XzF9YOyoV5BjzVkUJngKf8lgNYwKECEHrCNDrWZzMlflS3yBhr/InyoUgBc/lKT4pxVrrC6g1YwcceK3BmNxZcAtz3j5EIpqguh9H6wc011YN75cKDLpFDxuwkrPQmUwW4KTbj9mZTwBwLq4aQMUZbHm1rylJ46dzR0dua2n3RYCWZsiHROeywyJGR7mXKlpryyCiouY56sFkBWEnkEB/raeh/Sw4162KeuAxMQpEkzy5alMY5wamMsWKKrtW2WpEWNnReZWONKWjrdsKZarpFjqCslq773PLmEhM448Pc3+FKr1+94vv/rfw4tEcu+lKTBe4kZSdijBrykwv9vbCMPcLQTygBjzVckSLPRVGslqdunwJ4oegtFOYb4SwxNgWLCmD7T9kVjTv5YDgpo0XBmN34Z/rEHp0sgyz7lngsrm4lvMm2Mr1zNOJYJ5cuxuQxwMGJq/TP5emlb8fsQBZviK4t8hFL+zbhtlpwaRSxQRWfeETjuauPsdGxsBVdO7nmP4xvzSoT29pRl7kGqz+k26B3Oy0YNV+SXbbQas1ctC/GarskRdFpKczVAF1ZXnLcpaMuzVe6lZ2g/1ndcvOVgRG3sdUAY1bKD6achijMPdMxV4muKVorSpiDHituH7rSTs7n/4y5DhRXo4FVBN4vO/zbAcxhENzGbHCzU/98Mcx5e7a31kWjw9FCe/zNeYyQjZsWb1uc7U33pN4Mji6hCLhivqfa9Ss6xLg031AgfesA/l99m9fgvnaF9JoE6bYKmkGNK3aPbHB96w3+DnxFm4hs0drLsk7U8kf/N/CvwQNtllna0rjq61sH8L80HAuvwH1tvBy2ChqWSCaYTaGN19sTvlfzFD6n+iKTbvtayfrfe9ueWh6GJFoxLdr7V72a5ZpvHcCPDzma0wTO4EgbLyedxstO81n57LYBOBzyfsOhUKsW1J1BB5vr/tz8RyqOFylQP9Tvst2JALsC5lsH8PyQ40DV4ANzYa4dedNiKNR1s+x2wwbR7q4/4cTxqEk4LWDebfisuo36JXLiWFjOtLrlNWh3K1rRS4xvHcDNlFnNmWBBAl5SWaL3oPOfnvbr5pdjVnEaeBJSYjuLEkyLLsWhKccadmOphZkOPgVdalj2QpSmfOsADhMWE2ZBu4+EEJI4wKTAuCoC4xwQbWXBltpxbjkXJtKxxabo9e7tyhlgb6gNlSbUpMh+l/FaqzVwewGu8BW1Zx7pTpQDJUjb8tsUTW6+GDXbMn3mLbXlXJiGdggxFAoUrtPS3wE4Nk02UZG2OOzlk7fRs7i95QCLo3E0jtrjnM7SR3uS1p4qtS2nJ5OwtQVHgOvArLBFijZUV9QtSl8dAY5d0E0hM0w3HS2DpIeB6m/A1+HfhJcGUq4sOxH+x3f5+VO+Ds9rYNI7zPXOYWPrtf8bYMx6fuOAX5jzNR0PdsuON+X1f7EERxMJJoU6GkTEWBvVolVlb5lh3tKCg6Wx1IbaMDdJ+9sUCc5KC46hKGCk3IVOS4TCqdBNfUs7Kd4iXf2RjnT/LLysJy3XDcHLh/vde3x8DoGvwgsa67vBk91G5Pe/HbOe7xwym0NXbtiuuDkGO2IJDh9oQvJ4cY4vdoqLDuoH9Zl2F/ofsekn8lkuhIlhQcffUtSjytFyp++p6NiE7Rqx/lodgKVoceEp/CP4FfjrquZaTtj2AvH5K/ywpn7M34K/SsoYDAdIN448I1/0/wveW289T1/lX5xBzc8N5IaHr0XMOQdHsIkDuJFifj20pBm5jzwUv9e2FhwRsvhAbalCIuIw3bhJihY3p6nTFFIZgiSYjfTf3aXuOjmeGn4bPoGvwl+CFzTRczBIuHBEeImHc37/lGfwZR0cXzVDOvaKfNHvwe+suZ771K/y/XcBlsoN996JpBhoE2toYxOznNEOS5TJc6Id5GEXLjrWo+LEWGNpPDU4WAwsIRROu+1vM+0oW37z/MBN9kqHnSArwPfgFJ7Cq/Ai3Ie7g7ncmI09v8sjzw9mzOAEXoIHxURueaAce5V80f/DOuuZwHM8vsMb5wBzOFWM7wymTXPAEvm4vcFpZ2ut0VZRjkiP2MlmLd6DIpbGSiHOjdnUHN90hRYmhTnmvhzp1iKDNj+b7t5hi79lWGwQ+HN9RsfFMy0FXbEwhfuczKgCbyxYwBmcFhhvo/7a44v+i3XWcwDP86PzpGQYdWh7csP5dBvZ1jNzdxC8pBGuxqSW5vw40nBpj5JhMwvOzN0RWqERHMr4Lv1kWX84xLR830G3j6yqZ1a8UstTlW+qJPOZ+sZ7xZPKTJLhiNOAFd6tk+jrTH31ncLOxid8+nzRb128HhUcru/y0Wn6iT254YPC6FtVSIMoW2sk727AhvTtrWKZTvgsmckfXYZWeNRXx/3YQ2OUxLDrbHtN11IwrgXT6c8dATDwLniYwxzO4RzuQqTKSC5gAofMZ1QBK3zQ4JWobFbcvJm87FK+6JXrKahLn54m3p+McXzzYtP8VF/QpJuh1OwieElEoI1pRxPS09FBrkq2tWCU59+HdhNtTIqKm8EBrw2RTOEDpG3IKo2Y7mFdLm3ZeVjYwVw11o/oznceMve4CgMfNym/utA/d/ILMR7gpXzRy9eDsgLcgbs8O2Va1L0zzIdwGGemTBuwROHeoMShkUc7P+ISY3KH5ZZeWqO8mFTxQYeXTNuzvvK5FGPdQfuu00DwYFY9dyhctEt+OJDdnucfpmyhzUJzfsJjr29l8S0bXBfwRS9ZT26tmMIdZucch5ZboMz3Nio3nIOsYHCGoDT4kUA9MiXEp9Xsui1S8th/kbWIrMBxDGLodWUQIWcvnXy+9M23xPiSMOiRPqM+YMXkUN3gXFrZJwXGzUaMpJfyRS9ZT0lPe8TpScuRlbMHeUmlaKDoNuy62iWNTWNFYjoxFzuJs8oR+RhRx7O4SVNSXpa0ZJQ0K1LAHDQ+D9IepkMXpcsq5EVCvClBUIzDhDoyKwDw1Lc59GbTeORivugw1IcuaEOaGWdNm+Ps5fQ7/tm0DjMegq3yM3vb5j12qUId5UZD2oxDSEWOZMSqFl/W+5oynWDa/aI04tJRQ2eTXusg86SQVu/nwSYwpW6wLjlqIzwLuxGIvoAvul0PS+ZNz0/akp/pniO/8JDnGyaCkzbhl6YcqmK/69prxPqtpx2+Km9al9sjL+rwMgHw4jE/C8/HQ3m1vBuL1fldbzd8mOueVJ92syqdEY4KJjSCde3mcRw2TA6szxedn+zwhZMps0XrqEsiUjnC1hw0TELC2Ek7uAAdzcheXv1BYLagspxpzSAoZZUsIzIq35MnFQ9DOrlNB30jq3L4pkhccKUAA8/ocvN1Rzx9QyOtERs4CVsJRK/DF71kPYrxYsGsm6RMh4cps5g1DOmM54Ly1ii0Hd3Y/BMk8VWFgBVmhqrkJCPBHAolwZaWzLR9Vb7bcWdX9NyUYE+uB2BKfuaeBUcjDljbYVY4DdtsVWvzRZdWnyUzDpjNl1Du3aloAjVJTNDpcIOVVhrHFF66lLfJL1zJr9PQ2nFJSBaKoDe+sAvLufZVHVzYh7W0h/c6AAZ+7Tvj6q9j68G/cTCS/3n1vLKHZwNi+P+pS0WkZNMBMUl+LDLuiE4omZy71r3UFMwNJV+VJ/GC5ixVUkBStsT4gGKh0Gm4Oy3qvq7Lbmq24nPdDuDR9deR11XzP4vFu3TYzfnIyiSVmgizUYGqkIXNdKTY9pgb9D2Ix5t0+NHkVzCdU03suWkkVZAoCONCn0T35gAeW38de43mf97sMOpSvj4aa1KYUm58USI7Wxxes03bAZdRzk6UtbzMaCQ6IxO0dy7X+XsjoD16hpsBeGz9dfzHj+R/Hp8nCxZRqkEDTaCKCSywjiaoMJ1TITE9eg7Jqnq8HL6gDwiZb0u0V0Rr/rmvqjxKuaLCX7ZWXTvAY+uvm3z8CP7nzVpngqrJpZKwWnCUjIviYVlirlGOzPLI3SMVyp/elvBUjjDkNhrtufFFErQ8pmdSlbK16toBHlt/HV8uHMX/vEGALkV3RJREiSlopxwdMXOZPLZ+ix+kAHpMKIk8UtE1ygtquttwxNhphrIZ1IBzjGF3IIGxGcBj6q8bHJBG8T9vdsoWrTFEuebEZuVxhhClH6P5Zo89OG9fwHNjtNQTpD0TG9PJLEYqvEY6Rlxy+ZZGfL0Aj62/bnQCXp//eeM4KzfQVJbgMQbUjlMFIm6TpcfWlZje7NBSV6IsEVmumWIbjiloUzQX9OzYdo8L1wjw2PrrpimONfmfNyzKklrgnEkSzT5QWYQW40YShyzqsRmMXbvVxKtGuYyMKaU1ugenLDm5Ily4iT14fP11Mx+xJv+zZ3MvnfdFqxU3a1W/FTB4m3Qfsyc1XUcdVhDeUDZXSFHHLQj/Y5jtC7ZqM0CXGwB4bP11i3LhOvzPGygYtiUBiwQV/4wFO0majijGsafHyRLu0yG6q35cL1rOpVxr2s5cM2jJYMCdc10Aj6q/blRpWJ//+dmm5psMl0KA2+AFRx9jMe2WbC4jQxnikd4DU8TwUjRVacgdlhmr3bpddzuJ9zXqr2xnxJfzP29RexdtjDVZqzkqa6PyvcojGrfkXiJ8SEtml/nYskicv0ivlxbqjemwUjMw5evdg8fUX9nOiC/lf94Q2i7MURk9nW1MSj5j8eAyV6y5CN2S6qbnw3vdA1Iwq+XOSCl663udN3IzLnrt+us25cI1+Z83SXQUldqQq0b5XOT17bGpLd6ssN1VMPf8c+jG8L3NeCnMdF+Ra3fRa9dft39/LuZ/3vwHoHrqGmQFafmiQw6eyzMxS05K4bL9uA+SKUQzCnSDkqOGokXyJvbgJ/BHI+qvY69//4rl20NsmK2ou2dTsyIALv/91/8n3P2Aao71WFGi8KKv1fRC5+J67Q/507/E/SOshqN5TsmYIjVt+kcjAx98iz/4SaojbIV1rexE7/C29HcYD/DX4a0rBOF5VTu7omsb11L/AWcVlcVZHSsqGuXLLp9ha8I//w3Mv+T4Ew7nTBsmgapoCrNFObIcN4pf/Ob/mrvHTGqqgAupL8qWjWPS9m/31jAe4DjA+4+uCoQoT/zOzlrNd3qd4SdphFxsUvYwGWbTWtISc3wNOWH+kHBMfc6kpmpwPgHWwqaSUG2ZWWheYOGQGaHB+eQ/kn6b3pOgLV+ODSn94wDvr8Bvb70/LLuiPPEr8OGVWfDmr45PZyccEmsVXZGe1pRNX9SU5+AVQkNTIVPCHF/jGmyDC9j4R9LfWcQvfiETmgMMUCMN1uNCakkweZsowdYobiMSlnKA93u7NzTXlSfe+SVbfnPQXmg9LpYAQxpwEtONyEyaueWM4FPjjyjG3uOaFmBTWDNgBXGEiQpsaWhnAqIijB07Dlsy3fUGeP989xbWkyf+FF2SNEtT1E0f4DYYVlxFlbaSMPIRMk/3iMU5pME2SIWJvjckciebkQuIRRyhUvkHg/iUljG5kzVog5hV7vIlCuBrmlhvgPfNHQM8lCf+FEGsYbMIBC0qC9a0uuy2wLXVbLBaP5kjHokCRxapkQyzI4QEcwgYHRZBp+XEFTqXFuNVzMtjXLJgX4gAid24Hjwc4N3dtVSe+NNiwTrzH4WVUOlDobUqr1FuAgYllc8pmzoVrELRHSIW8ViPxNy4xwjBpyR55I6J220qQTZYR4guvUICJiSpr9gFFle4RcF/OMB7BRiX8sSfhpNSO3lvEZCQfLUVTKT78Ek1LRLhWN+yLyTnp8qWUZ46b6vxdRGXfHVqx3eI75YaLa4iNNiK4NOW7wPW6lhbSOF9/M9qw8e/aoB3d156qTzxp8pXx5BKAsYSTOIIiPkp68GmTq7sZtvyzBQaRLNxIZ+paozHWoLFeExIhRBrWitHCAHrCF7/thhD8JhYz84wg93QRV88wLuLY8zF8sQ36qF1J455bOlgnELfshKVxYOXKVuKx0jaj22sczTQqPqtV/XDgpswmGTWWMSDw3ssyUunLLrVPGjYRsH5ggHeHSWiV8kT33ycFSfMgkoOK8apCye0J6VW6GOYvffgU9RWsukEi2kUV2nl4dOYUzRik9p7bcA4ggdJ53LxKcEe17B1R8eqAd7dOepV8sTXf5lhejoL85hUdhDdknPtKHFhljOT+bdq0hxbm35p2nc8+Ja1Iw+tJykgp0EWuAAZYwMVwac5KzYMslhvgHdHRrxKnvhTYcfKsxTxtTETkjHO7rr3zjoV25lAQHrqpV7bTiy2aXMmUhTBnKS91jhtR3GEoF0oLnWhWNnYgtcc4N0FxlcgT7yz3TgNIKkscx9jtV1ZKpWW+Ub1tc1eOv5ucdgpx+FJy9pgbLE7xDyXb/f+hLHVGeitHOi6A7ybo3sF8sS7w7cgdk0nJaOn3hLj3uyD0Zp5pazFIUXUpuTTU18d1EPkDoX8SkmWTnVIozEdbTcZjoqxhNHf1JrSS/AcvHjZ/SMHhL/7i5z+POsTUh/8BvNfYMTA8n+yU/MlTZxSJDRStqvEuLQKWwDctMTQogUDyQRoTQG5Kc6oQRE1yV1jCA7ri7jdZyK0sYTRjCR0Hnnd+y7nHxNgTULqw+8wj0mQKxpYvhjm9uSUxg+TTy7s2GtLUGcywhXSKZN275GsqlclX90J6bRI1aouxmgL7Q0Nen5ziM80SqMIo8cSOo+8XplT/5DHNWsSUr/6lLN/QQ3rDyzLruEW5enpf7KqZoShEduuSFOV7DLX7Ye+GmXb6/hnNNqKsVXuMDFpb9Y9eH3C6NGEzuOuI3gpMH/I6e+zDiH1fXi15t3vA1czsLws0TGEtmPEJdiiFPwlwKbgLHAFk4P6ZyPdymYYHGE0dutsChQBl2JcBFlrEkY/N5bQeXQ18gjunuMfMfsBlxJSx3niO485fwO4fGD5T/+3fPQqkneWVdwnw/3bMPkW9Wbqg+iC765Zk+xcT98ibKZc2EdgHcLoF8cSOo/Oc8fS+OyEULF4g4sJqXVcmfMfsc7A8v1/yfGXmL9I6Fn5pRwZhsPv0TxFNlAfZCvG+Oohi82UC5f/2IsJo0cTOm9YrDoKhFPEUr/LBYTUNht9zelHXDqwfPCIw4owp3mOcIQcLttWXFe3VZ/j5H3cIc0G6oPbCR+6Y2xF2EC5cGUm6wKC5tGEzhsWqw5hNidUiKX5gFWE1GXh4/Qplw4sVzOmx9QxU78g3EF6wnZlEN4FzJ1QPSLEZz1KfXC7vd8ssGdIbNUYpVx4UapyFUHzJoTOo1McSkeNn1M5MDQfs4qQuhhX5vQZFw8suwWTcyYTgioISk2YdmkhehG4PkE7w51inyAGGaU+uCXADabGzJR1fn3lwkty0asIo8cROm9Vy1g0yDxxtPvHDAmpu+PKnM8Ix1wwsGw91YJqhteaWgjYBmmQiebmSpwKKzE19hx7jkzSWOm66oPbzZ8Yj6kxVSpYjVAuvLzYMCRo3oTQecOOjjgi3NQ4l9K5/hOGhNTdcWVOTrlgYNkEXINbpCkBRyqhp+LdRB3g0OU6rMfW2HPCFFMV9nSp+uB2woepdbLBuJQyaw/ZFysXrlXwHxI0b0LovEkiOpXGA1Ijagf+KUNC6rKNa9bQnLFqYNkEnMc1uJrg2u64ELPBHpkgWbmwKpJoDhMwNbbGzAp7Yg31wS2T5rGtzit59PrKhesWG550CZpHEzpv2NGRaxlNjbMqpmEIzygJqQfjypycs2pg2cS2RY9r8HUqkqdEgKTWtWTKoRvOBPDYBltja2SO0RGjy9UHtxwRjA11ujbKF+ti5cIR9eCnxUg6owidtyoU5tK4NLji5Q3HCtiyF2IqLGYsHViOXTXOYxucDqG0HyttqYAKqYo3KTY1ekyDXRAm2AWh9JmsVh/ccg9WJ2E8YjG201sPq5ULxxX8n3XLXuMInbft2mk80rRGjCGctJ8/GFdmEQ9Ug4FlE1ll1Y7jtiraqm5Fe04VV8lvSVBL8hiPrfFVd8+7QH3Qbu2ipTVi8cvSGivc9cj8yvH11YMHdNSERtuOslM97feYFOPKzGcsI4zW0YGAbTAOaxCnxdfiYUmVWslxiIblCeAYr9VYR1gM7GmoPrilunSxxeT3DN/2eBQ9H11+nk1adn6VK71+5+Jfct4/el10/7KBZfNryUunWSCPxPECk1rdOv1WVSrQmpC+Tl46YD3ikQYcpunSQgzVB2VHFhxHVGKDgMEY5GLlQnP7FMDzw7IacAWnO6sBr12u+XanW2AO0wQ8pknnFhsL7KYIqhkEPmEXFkwaN5KQphbkUmG72wgw7WSm9RiL9QT925hkjiVIIhphFS9HKI6/8QAjlpXqg9W2C0apyaVDwKQwrwLY3j6ADR13ZyUNByQXHQu6RY09Hu6zMqXRaNZGS/KEJs0cJEe9VH1QdvBSJv9h09eiRmy0V2uJcqHcShcdvbSNg5fxkenkVprXM9rDVnX24/y9MVtncvbKY706anNl3ASll9a43UiacVquXGhvq4s2FP62NGKfQLIQYu9q1WmdMfmUrDGt8eDS0cXozH/fjmUH6Jruvm50hBDSaEU/2Ru2LEN/dl006TSc/g7tfJERxGMsgDUEr104pfWH9lQaN+M4KWQjwZbVc2rZVNHsyHal23wZtIs2JJqtIc/WLXXRFCpJkfE9jvWlfFbsNQ9pP5ZBS0zKh4R0aMFj1IjTcTnvi0Zz2rt7NdvQb2mgbju1plsH8MmbnEk7KbK0b+wC2iy3aX3szW8xeZvDwET6hWZYwqTXSSG+wMETKum0Dq/q+x62gt2ua2ppAo309TRk9TPazfV3qL9H8z7uhGqGqxNVg/FKx0HBl9OVUORn8Q8Jx9gFttGQUDr3tzcXX9xGgN0EpzN9mdZ3GATtPhL+CjxFDmkeEU6x56kqZRusLzALXVqkCN7zMEcqwjmywDQ6OhyUe0Xao1Qpyncrg6wKp9XfWDsaZplElvQ/b3sdweeghorwBDlHzgk1JmMc/wiERICVy2VJFdMjFuLQSp3S0W3+sngt2njwNgLssFGVQdJ0tu0KH4ky1LW4yrbkuaA6Iy9oz/qEMMXMMDWyIHhsAyFZc2peV9hc7kiKvfULxCl9iddfRK1f8kk9qvbdOoBtOg7ZkOZ5MsGrSHsokgLXUp9y88smniwWyuFSIRVmjplga3yD8Uij5QS1ZiM4U3Qw5QlSm2bXjFe6jzzBFtpg+/YBbLAWG7OPynNjlCw65fukGNdkJRf7yM1fOxVzbxOJVocFoYIaGwH22mIQkrvu1E2nGuebxIgW9U9TSiukPGU+Lt++c3DJPKhyhEEbXCQLUpae2exiKy6tMPe9mDRBFCEMTWrtwxN8qvuGnt6MoihKWS5NSyBhbH8StXoAz8PLOrRgLtOT/+4vcu+7vDLnqNvztOq7fmd8sMmY9Xzn1zj8Dq8+XVdu2Nv0IIySgEdQo3xVHps3Q5i3fLFsV4aiqzAiBhbgMDEd1uh8qZZ+lwhjkgokkOIv4xNJmyncdfUUzgB4oFMBtiu71Xumpz/P+cfUP+SlwFExwWW62r7b+LSPxqxn/gvMZ5z9C16t15UbNlq+jbGJtco7p8wbYlL4alSyfWdeuu0j7JA3JFNuVAwtst7F7FhWBbPFNKIUORndWtLraFLmMu7KFVDDOzqkeaiN33YAW/r76wR4XDN/yN1z7hejPau06EddkS/6XThfcz1fI/4K736fO48vlxt2PXJYFaeUkFS8U15XE3428xdtn2kc8GQlf1vkIaNRRnOMvLTWrZbElEHeLWi1o0dlKPAh1MVgbbVquPJ5+Cr8LU5/H/+I2QlHIU2ClXM9G8v7Rr7oc/hozfUUgsPnb3D+I+7WF8kNO92GY0SNvuxiE+2Bt8prVJTkzE64sfOstxuwfxUUoyk8VjcTlsqe2qITSFoSj6Epd4KsT6BZOWmtgE3hBfir8IzZDwgV4ZTZvD8VvPHERo8v+vL1DASHTz/i9OlKueHDjK5Rnx/JB1Vb1ioXdBra16dmt7dgik10yA/FwJSVY6XjA3oy4SqM2frqDPPSRMex9qs3XQtoWxMj7/Er8GWYsXgjaVz4OYumP2+9kbxvny/6kvWsEBw+fcb5bInc8APdhpOSs01tEqIkoiZjbAqKMruLbJYddHuHFRIyJcbdEdbl2sVLaySygunutBg96Y2/JjKRCdyHV+AEFtTvIpbKIXOamknYSiB6KV/0JetZITgcjjk5ZdaskBtWO86UF0ap6ozGXJk2WNiRUlCPFir66lzdm/SLSuK7EUdPz8f1z29Skq6F1fXg8+5UVR6bszncP4Tn4KUkkdJ8UFCY1zR1i8RmL/qQL3rlei4THG7OODlnKko4oI01kd3CaM08Ia18kC3GNoVaO9iDh+hWxSyTXFABXoau7Q6q9OxYg/OVEMw6jdbtSrJ9cBcewGmaZmg+bvkUnUUaGr+ZfnMH45Ivevl61hMcXsxYLFTu1hTm2zViCp7u0o5l+2PSUh9bDj6FgYypufBDhqK2+oXkiuHFHR3zfj+9PtA8oR0xnqX8qn+sx3bFODSbbF0X8EUvWQ8jBIcjo5bRmLOljDNtcqNtOe756h3l0VhKa9hDd2l1eqmsnh0MNMT/Cqnx6BInumhLT8luljzQ53RiJeA/0dxe5NK0o2fA1+GLXr6eNQWHNUOJssQaTRlGpLHKL9fD+IrQzTOMZS9fNQD4AnRNVxvTdjC+fJdcDDWQcyB00B0t9BDwTxXgaAfzDZ/DBXzRnfWMFRwuNqocOmX6OKNkY63h5n/fFcB28McVHqnXZVI27K0i4rDLNE9lDKV/rT+udVbD8dFFu2GGZ8mOt0kAXcoX3ZkIWVtw+MNf5NjR2FbivROHmhV1/pj2egv/fMGIOWTIWrV3Av8N9imV9IWml36H6cUjqEWNv9aNc+veb2sH46PRaHSuMBxvtW+twxctq0z+QsHhux8Q7rCY4Ct8lqsx7c6Sy0dl5T89rIeEuZKoVctIk1hNpfavER6yyH1Vvm3MbsUHy4ab4hWr/OZPcsRBphnaV65/ZcdYPNNwsjN/djlf9NqCw9U5ExCPcdhKxUgLSmfROpLp4WSUr8ojdwbncbvCf+a/YzRaEc6QOvXcGO256TXc5Lab9POvB+AWY7PigWYjzhifbovuunzRawsO24ZqQQAqguBtmpmPB7ysXJfyDDaV/aPGillgz1MdQg4u5MYaEtBNNHFjkRlSpd65lp4hd2AVPTfbV7FGpyIOfmNc/XVsPfg7vzaS/3nkvLL593ANLvMuRMGpQIhiF7kUEW9QDpAUbTWYBcbp4WpacHHY1aacqQyjGZS9HI3yCBT9kUZJhVOD+zUDvEH9ddR11fzPcTDQ5TlgB0KwqdXSavk9BC0pKp0WmcuowSw07VXmXC5guzSa4p0UvRw2lbDiYUx0ExJJRzWzi6Gm8cnEkfXXsdcG/M/jAJa0+bmCgdmQ9CYlNlSYZOKixmRsgiFxkrmW4l3KdFKv1DM8tk6WxPYJZhUUzcd8Kdtgrw/gkfXXDT7+avmfVak32qhtkg6NVdUS5wgkru1YzIkSduTW1FDwVWV3JQVJVuieTc0y4iDpFwc7/BvSalvKdQM8sv662cevz/+8sQVnjVAT0W2wLllw1JiMhJRxgDjCjLQsOzSFSgZqx7lAW1JW0e03yAD3asC+GD3NbQhbe+mN5GXH1F83KDOM4n/e5JIuH4NpdQARrFPBVptUNcjj4cVMcFSRTE2NpR1LEYbYMmfWpXgP9KejaPsLUhuvLCsVXznAG9dfx9SR1ud/3hZdCLHb1GMdPqRJgqDmm76mHbvOXDtiO2QPUcKo/TWkQ0i2JFXpBoo7vij1i1Lp3ADAo+qvG3V0rM//vFnnTE4hxd5Ka/Cor5YEdsLVJyKtDgVoHgtW11pWSjolPNMnrlrVj9Fv2Qn60twMwKPqr+N/wvr8z5tZcDsDrv06tkqyzESM85Ycv6XBWA2birlNCXrI6VbD2lx2L0vQO0QVTVVLH4SE67fgsfVXv8n7sz7/85Z7cMtbE6f088wSaR4kCkCm10s6pKbJhfqiUNGLq+0gLWC6eUAZFPnLjwqtKd8EwGvWX59t7iPW4X/eAN1svgRVSY990YZg06BD1ohLMtyFTI4pKTJsS9xREq9EOaPWiO2gpms7397x6nQJkbh+Fz2q/rqRROX6/M8bJrqlVW4l6JEptKeUFuMYUbtCQ7CIttpGc6MY93x1r1vgAnRXvY5cvwWPqb9uWQm+lP95QxdNMeWhOq1x0Db55C7GcUv2ZUuN6n8iKzsvOxibC//Yfs9Na8r2Rlz02vXXDT57FP/zJi66/EJSmsJKa8QxnoqW3VLQ+jZVUtJwJ8PNX1NQCwfNgdhhHD9on7PdRdrdGPF28rJr1F+3LBdeyv+8yYfLoMYet1vX4upNAjVvwOUWnlNXJXlkzk5Il6kqeoiL0C07qno+/CYBXq/+utlnsz7/Mzvy0tmI4zm4ag23PRN3t/CWryoUVJGm+5+K8RJ0V8Hc88/XHUX/HfiAq7t+BH+x6v8t438enWmdJwFA6ZINriLGKv/95f8lT9/FnyA1NMVEvQyaXuu+gz36f/DD73E4pwqpLcvm/o0Vle78n//+L/NPvoefp1pTJye6e4A/D082FERa5/opeH9zpvh13cNm19/4v/LDe5xMWTi8I0Ta0qKlK27AS/v3/r+/x/2GO9K2c7kVMonDpq7//jc5PKCxeNPpFVzaRr01wF8C4Pu76hXuX18H4LduTr79guuFD3n5BHfI+ZRFhY8w29TYhbbLi/bvBdqKE4fUgg1pBKnV3FEaCWOWyA+m3WpORZr/j+9TKJtW8yBTF2/ZEODI9/QavHkVdGFp/Pjn4Q+u5hXapsP5sOH+OXXA1LiKuqJxiMNbhTkbdJTCy4llEt6NnqRT4dhg1V3nbdrm6dYMecA1yTOL4PWTE9L5VzPFlLBCvlG58AhehnN4uHsAYinyJ+AZ/NkVvELbfOBUuOO5syBIEtiqHU1k9XeISX5bsimrkUUhnGDxourN8SgUsCZVtKyGbyGzHXdjOhsAvOAswSRyIBddRdEZWP6GZhNK/yjwew9ehBo+3jEADu7Ay2n8mDc+TS7awUHg0OMzR0LABhqLD4hJEh/BEGyBdGlSJoXYXtr+3HS4ijzVpgi0paWXtdruGTknXBz+11qT1Q2inxaTzQCO46P3lfLpyS4fou2PH/PupwZgCxNhGlj4IvUuWEsTkqMWm6i4xCSMc9N1RDQoCVcuGItJ/MRWefais+3synowi/dESgJjkilnWnBTGvRWmaw8oR15257t7CHmCf8HOn7cwI8+NQBXMBEmAa8PMRemrNCEhLGEhDQKcGZWS319BX9PFBEwGTbRBhLbDcaV3drFcDqk5kCTd2JF1Wp0HraqBx8U0wwBTnbpCadwBA/gTH/CDrcCs93LV8E0YlmmcyQRQnjBa8JESmGUfIjK/7fkaDJpmD2QptFNVJU1bbtIAjjWQizepOKptRjbzR9Kag6xZmMLLjHOtcLT3Tx9o/0EcTT1XN3E45u24AiwEypDJXihKjQxjLprEwcmRKclaDNZCVqr/V8mYWyFADbusiY5hvgFoU2vio49RgJLn5OsReRFN6tabeetiiy0V7KFHT3HyZLx491u95sn4K1QQSPKM9hNT0wMVvAWbzDSVdrKw4zRjZMyJIHkfq1VAVCDl/bUhNKlGq0zGr05+YAceXVPCttVk0oqjVwMPt+BBefx4yPtGVkUsqY3CHDPiCM5ngupUwCdbkpd8kbPrCWHhkmtIKLEetF2499eS1jZlIPGYnlcPXeM2KD9vLS0bW3ktYNqUllpKLn5ZrsxlIzxvDu5eHxzGLctkZLEY4PgSOg2IUVVcUONzUDBEpRaMoXNmUc0tFZrTZquiLyKxrSm3DvIW9Fil+AkhXu5PhEPx9mUNwqypDvZWdKlhIJQY7vn2OsnmBeOWnYZ0m1iwbbw1U60by5om47iHRV6fOgzjMf/DAZrlP40Z7syxpLK0lJ0gqaAK1c2KQKu7tabTXkLFz0sCftuwX++MyNeNn68k5Buq23YQhUh0SNTJa1ioQ0p4nUG2y0XilF1JqODqdImloPS4Bp111DEWT0jJjVv95uX9BBV7eB3bUWcu0acSVM23YZdd8R8UbQUxJ9wdu3oMuhdt929ME+mh6JXJ8di2RxbTi6TbrDquqV4aUKR2iwT6aZbyOwEXN3DUsWr8Hn4EhwNyHuXHh7/pdaUjtR7vnDh/d8c9xD/s5f501eQ1+CuDiCvGhk1AN/4Tf74RfxPwD3toLarR0zNtsnPzmS64KIRk861dMWCU8ArasG9T9H0ZBpsDGnjtAOM2+/LuIb2iIUGXNgl5ZmKD/Tw8TlaAuihaFP5yrw18v4x1898zIdP+DDAX1bM3GAMvPgRP/cJn3zCW013nrhHkrITyvYuwOUkcHuKlRSW5C6rzIdY4ppnF7J8aAJbQepgbJYBjCY9usGXDKQxq7RZfh9eg5d1UHMVATRaD/4BHK93/1iAgYZ/+jqPn8Dn4UExmWrpa3+ZOK6MvM3bjwfzxNWA2dhs8+51XHSPJiaAhGSpWevEs5xHLXcEGFXYiCONySH3fPWq93JIsBiSWvWyc3CAN+EcXoT7rCSANloPPoa31rt/5PUA/gp8Q/jDD3hyrjzlR8VkanfOvB1XPubt17vzxAfdSVbD1pzAnfgyF3ycadOTOTXhpEUoLC1HZyNGW3dtmjeXgr2r56JNmRwdNNWaQVBddd6rh4MhviEB9EFRD/7RGvePvCbwAL4Mx/D6M541hHO4D3e7g6PafdcZVw689z7NGTwo5om7A8sPhccT6qKcl9NJl9aM/9kX+e59Hh1yPqGuCCZxuITcsmNaJ5F7d0q6J3H48TO1/+M57085q2icdu2U+W36Ldllz9Agiv4YGljoEN908EzvDOrBF98/vtJwCC/BF2AG75xxEmjmMIcjxbjoaxqOK3/4hPOZzhMPBpYPG44CM0dTVm1LjLtUWWVz1Bcf8tEx0zs8O2A2YVHRxKYOiy/aOVoAaMu0i7ubu43njjmd4ibMHU1sIDHaQNKrZND/FZYdk54oCXetjq7E7IVl9eAL7t+oHnwXXtLx44czzoRFHBztYVwtH1d+NOMkupZ5MTM+gUmq90X+Bh9zjRlmaQ+m7YMqUL/veemcecAtOJ0yq1JnVlN27di2E0+Klp1tAJ4KRw1eMI7aJjsO3R8kPSI3fUFXnIOfdQe86sIIVtWDL7h//Ok6vj8vwDk08NEcI8zz7OhBy+WwalzZeZ4+0XniRfst9pAJqQHDGLzVQ2pheZnnv1OWhwO43/AgcvAEXEVVpa4db9sGvNK8wjaENHkfFQ4Ci5i7dqnQlPoLQrHXZDvO3BIXZbJOBrOaEbML6sFL798I4FhKihjHMsPjBUZYCMFr6nvaArxqXPn4lCa+cHfSa2cP27g3Z3ziYTRrcbQNGLQmGF3F3cBdzzzX7AILx0IB9rbwn9kx2G1FW3Inic+ZLIsVvKR8Zwfj0l1fkqo8LWY1M3IX14OX3r9RKTIO+d9XzAI8qRPGPn/4NC2n6o4rN8XJ82TOIvuVA8zLKUHRFgBCetlDZlqR1gLKjS39xoE7Bt8UvA6BxuEDjU3tFsEijgA+615tmZkXKqiEENrh41iLDDZNq4pKTWR3LZfnos81LOuNa15cD956vLMsJd1rqYp51gDUQqMYm2XsxnUhD2jg1DM7SeuJxxgrmpfISSXVIJIS5qJJSvJPEQ49DQTVIbYWJ9QWa/E2+c/oPK1drmC7WSfJRNKBO5Yjvcp7Gc3dmmI/Xh1kDTEuiSnWqQf37h+fTMhGnDf6dsS8SQfQWlqqwXXGlc/PEZ/SC5mtzIV0nAshlQdM/LvUtYutrEZ/Y+EAFtq1k28zQhOwLr1AIeANzhF8t9qzTdZf2qRKO6MWE9ohBYwibbOmrFtNmg3mcS+tB28xv2uKd/agYCvOP+GkSc+0lr7RXzyufL7QbkUpjLjEWFLqOIkAGu2B0tNlO9Eau2W1qcOUvVRgKzypKIQZ5KI3q0MLzqTNRYqiZOqmtqloIRlmkBHVpHmRYV6/HixbO6UC47KOFJnoMrVyr7wYz+SlW6GUaghYbY1I6kkxA2W1fSJokUdSh2LQ1GAimRGm0MT+uu57H5l7QgOWxERpO9moLRPgTtquWCfFlGlIjQaRly9odmzMOWY+IBO5tB4sW/0+VWGUh32qYk79EidWKrjWuiLpiVNGFWFRJVktyeXWmbgBBzVl8anPuXyNJlBJOlKLTgAbi/EYHVHxWiDaVR06GnHQNpJcWcK2jJtiCfG2sEHLzuI66sGrMK47nPIInPnu799935aOK2cvmvubrE38ZzZjrELCmXM2hM7UcpXD2oC3+ECVp7xtIuxptJ0jUr3sBmBS47TVxlvJ1Sqb/E0uLdvLj0lLr29ypdd/eMX3f6lrxGlKwKQxEGvw0qHbkbwrF3uHKwVENbIV2wZ13kNEF6zD+x24aLNMfDTCbDPnEikZFyTNttxWBXDaBuM8KtI2rmaMdUY7cXcUPstqTGvBGSrFWIpNMfbdea990bvAOC1YX0qbc6smDS1mPxSJoW4fwEXvjMmhlijDRq6qale6aJEuFGoppYDoBELQzLBuh/mZNx7jkinv0EtnUp50lO9hbNK57lZaMAWuWR5Yo9/kYwcYI0t4gWM47Umnl3YmpeBPqSyNp3K7s2DSAS/39KRuEN2bS4xvowV3dFRMx/VFcp2Yp8w2nTO9hCXtHG1kF1L4KlrJr2wKfyq77R7MKpFKzWlY9UkhYxyHWW6nBWPaudvEAl3CGcNpSXPZ6R9BbBtIl6cHL3gIBi+42CYXqCx1gfGWe7Ap0h3luyXdt1MKy4YUT9xSF01G16YEdWsouW9mgDHd3veyA97H+Ya47ZmEbqMY72oPztCGvK0onL44AvgC49saZKkWRz4veWljE1FHjbRJaWv6ZKKtl875h4CziFCZhG5rx7tefsl0aRT1bMHZjm8dwL/6u7wCRysaQblQoG5yAQN5zpatMNY/+yf8z+GLcH/Qn0iX2W2oEfXP4GvwQHuIL9AYGnaO3zqAX6946nkgqZNnUhx43DIdQtMFeOPrgy/y3Yd85HlJWwjLFkU3kFwq28xPnuPhMWeS+tDLV9Otllq7pQCf3uXJDN9wFDiUTgefHaiYbdfi3b3u8+iY6TnzhgehI1LTe8lcd7s1wJSzKbahCRxKKztTLXstGAiu3a6rPuQs5pk9TWAan5f0BZmGf7Ylxzzk/A7PAs4QPPPAHeFQ2hbFHszlgZuKZsJcUmbDC40sEU403cEjczstOEypa+YxevL4QBC8oRYqWdK6b7sK25tfE+oDZgtOQ2Jg8T41HGcBE6fTWHn4JtHcu9S7uYgU5KSCkl/mcnq+5/YBXOEr6lCUCwOTOM1taOI8mSxx1NsCXBEmLKbMAg5MkwbLmpBaFOPrNSlO2HnLiEqW3tHEwd8AeiQLmn+2gxjC3k6AxREqvKcJbTEzlpLiw4rNZK6oJdidbMMGX9FULKr0AkW+2qDEPBNNm5QAt2Ik2nftNWHetubosHLo2nG4vQA7GkcVCgVCgaDixHqo9UUn1A6OshapaNR/LPRYFV8siT1cCtJE0k/3WtaNSuUZYKPnsVIW0xXWnMUxq5+En4Kvw/MqQmVXnAXj9Z+9zM98zM/Agy7F/qqj2Nh67b8HjFnPP3iBn/tkpdzwEJX/whIcQUXOaikeliCRGUk7tiwF0rItwMEhjkZ309hikFoRAmLTpEXWuHS6y+am/KB/fM50aLEhGnSMwkpxzOov4H0AvgovwJ1iGzDLtJn/9BU+fAINfwUe6FHSLhu83viV/+/HrOePX+STT2B9uWGbrMHHLldRBlhS/CJQmcRxJFqZica01XixAZsYiH1uolZxLrR/SgxVIJjkpQP4PE9sE59LKLr7kltSBogS5tyszzH8Fvw8/AS8rNOg0xUS9fIaHwb+6et8Q/gyvKRjf5OusOzGx8evA/BP4IP11uN/grca5O0lcsPLJ5YjwI4QkJBOHa0WdMZYGxPbh2W2nR9v3WxEWqgp/G3+6VZbRLSAAZ3BhdhAaUL33VUSw9yjEsvbaQ9u4A/gGXwZXoEHOuU1GSj2chf+Mo+f8IcfcAxfIKVmyunRbYQVnoevwgfw3TXXcw++xNuP4fhyueEUNttEduRVaDttddoP0eSxLe2LENk6itYxlrxBNBYrNNKSQmeaLcm9c8UsaB5WyO6675yyQIAWSDpBVoA/gxmcwEvwoDv0m58UE7gHn+fJOa8/Ywan8EKRfjsopF83eCglX/Sfr7OeaRoQfvt1CGvIDccH5BCvw1sWIzRGC/66t0VTcLZQZtm6PlAasbOJ9iwWtUo7biktTSIPxnR24jxP1ZKaqq+2RcXM9OrBAm/AAs7hDJ5bNmGb+KIfwCs8a3jnjBrOFeMjHSCdbKr+2uOLfnOd9eiA8Hvvwwq54VbP2OqwkB48Ytc4YEOiH2vTXqodabfWEOzso4qxdbqD5L6tbtNPECqbhnA708DZH4QOJUXqScmUlks7Ot6FBuZw3n2mEbaUX7kDzxHOOQk8nKWMzAzu6ZZ8sOFw4RK+6PcuXo9tB4SbMz58ApfKDXf3szjNIIbGpD5TKTRxGkEMLjLl+K3wlWXBsCUxIDU+jbOiysESqAy1MGUJpXgwbTWzNOVEziIXZrJ+VIztl1PUBxTSo0dwn2bOmfDRPD3TRTGlfbCJvO9KvuhL1hMHhB9wPuPRLGHcdOWG2xc0U+5bQtAJT0nRTewXL1pgk2+rZAdeWmz3jxAqfNQQdzTlbF8uJ5ecEIWvTkevAHpwz7w78QujlD/Lr491bD8/1vhM2yrUQRrWXNQY4fGilfctMWYjL72UL/qS9eiA8EmN88nbNdour+PBbbAjOjIa4iBhfFg6rxeKdEGcL6p3EWR1Qq2Qkhs2DrnkRnmN9tG2EAqmgPw6hoL7Oza7B+3SCrR9tRftko+Lsf2F/mkTndN2LmzuMcKTuj/mX2+4Va3ki16+nnJY+S7MefpkidxwnV+4wkXH8TKnX0tsYzYp29DOOoSW1nf7nTh2akYiWmcJOuTidSaqESrTYpwjJJNVGQr+rLI7WsqerHW6Kp/oM2pKuV7T1QY9gjqlZp41/WfKpl56FV/0kvXQFRyeQ83xaTu5E8p5dNP3dUF34ihyI3GSpeCsywSh22ZJdWto9winhqifb7VRvgktxp13vyjrS0EjvrRfZ62uyqddSWaWYlwTPAtJZ2oZ3j/Sgi/mi+6vpzesfAcWNA0n8xVyw90GVFGuZjTXEQy+6GfLGLMLL523f5E0OmxVjDoOuRiH91RKU+vtoCtH7TgmvBLvtFXWLW15H9GTdVw8ow4IlRLeHECN9ym1e9K0I+Cbnhgv4Yu+aD2HaQJ80XDqOzSGAV4+4yCqBxrsJAX6ZTIoX36QnvzhhzzMfFW2dZVLOJfo0zbce5OvwXMFaZ81mOnlTVXpDZsQNuoYWveketKb5+6JOOsgX+NTm7H49fUTlx+WLuWL7qxnOFh4BxpmJx0p2gDzA/BUARuS6phR+pUsY7MMboAHx5xNsSVfVZcYSwqCKrqon7zM+8ecCkeS4nm3rINuaWvVNnMRI1IRpxTqx8PZUZ0Br/UEduo3B3hNvmgZfs9gQPj8vIOxd2kndir3awvJ6BLvoUuOfFWNYB0LR1OQJoUySKb9IlOBx74q1+ADC2G6rOdmFdJcD8BkfualA+BdjOOzP9uUhGUEX/TwhZsUduwRr8wNuXKurCixLBgpQI0mDbJr9dIqUuV+92ngkJZ7xduCk2yZKbfWrH1VBiTg9VdzsgRjW3CVXCvAwDd+c1z9dWw9+B+8MJL/eY15ZQ/HqvTwVdsZn5WQsgRRnMaWaecu3jFvMBEmgg+FJFZsnSl0zjB9OqPYaBD7qmoVyImFvzi41usesV0julaAR9dfR15Xzv9sEruRDyk1nb+QaLU67T885GTls6YgcY+UiMa25M/pwGrbCfzkvR3e0jjtuaFtnwuagHTSb5y7boBH119HXhvwP487jJLsLJ4XnUkHX5sLbS61dpiAXRoZSCrFJ+EjpeU3puVfitngYNo6PJrAigKktmwjyQdZpfq30mmtulaAx9Zfx15Xzv+cyeuiBFUs9zq8Kq+XB9a4PVvph3GV4E3y8HENJrN55H1X2p8VyqSKwVusJDKzXOZzplWdzBUFK9e+B4+uv468xvI/b5xtSAkBHQaPvtqWzllVvEOxPbuiE6+j2pvjcKsbvI7txnRErgfH7LdXqjq0IokKzga14GzQ23SSbCQvO6r+Or7SMIr/efOkkqSdMnj9mBx2DRsiY29Uj6+qK9ZrssCKaptR6HKURdwUYeUWA2kPzVKQO8ku2nU3Anhs/XWkBx3F/7wJtCTTTIKftthue1ty9xvNYLY/zo5KSbIuKbXpbEdSyeRyYdAIwKY2neyoc3+k1XUaufYga3T9daMUx/r8z1s10ITknIO0kuoMt+TB8jK0lpayqqjsJ2qtXAYwBU932zinimgmd6mTRDnQfr88q36NAI+tv24E8Pr8zxtasBqx0+xHH9HhlrwsxxNUfKOHQaZBITNf0uccj8GXiVmXAuPEAKSdN/4GLHhs/XWj92dN/uetNuBMnVR+XWDc25JLjo5Mg5IZIq226tmCsip2zZliL213YrTlL2hcFjpCduyim3M7/eB16q/blQsv5X/esDRbtJeabLIosWy3ycavwLhtxdWzbMmHiBTiVjJo6lCLjXZsi7p9PEPnsq6X6wd4bP11i0rD5fzPm/0A6brrIsllenZs0lCJlU4abakR59enZKrKe3BZihbTxlyZ2zl1+g0wvgmA166/bhwDrcn/7Ddz0eWZuJvfSESug6NzZsox3Z04FIxz0mUjMwVOOVTq1CQ0AhdbBGVdjG/CgsfUX7esJl3K/7ytWHRv683praW/8iDOCqWLLhpljDY1ZpzK75QiaZoOTpLKl60auHS/97oBXrv+umU9+FL+5+NtLFgjqVLCdbmj7pY5zPCPLOHNCwXGOcLquOhi8CmCWvbcuO73XmMUPab+ug3A6/A/78Bwe0bcS2+tgHn4J5pyS2WbOck0F51Vq3LcjhLvZ67p1ABbaL2H67bg78BfjKi/jr3+T/ABV3ilLmNXTI2SpvxWBtt6/Z//D0z/FXaGbSBgylzlsEGp+5//xrd4/ae4d8DUUjlslfIYS3t06HZpvfQtvv0N7AHWqtjP2pW08QD/FLy//da38vo8PNlKHf5y37Dxdfe/oj4kVIgFq3koLReSR76W/bx//n9k8jonZxzWTANVwEniDsg87sOSd/z7//PvMp3jQiptGVWFX2caezzAXwfgtzYUvbr0iozs32c3Uge7varH+CNE6cvEYmzbPZ9hMaYDdjK4V2iecf6EcEbdUDVUARda2KzO/JtCuDbNQB/iTeL0EG1JSO1jbXS+nLxtPMDPw1fh5+EPrgSEKE/8Gry5A73ui87AmxwdatyMEBCPNOCSKUeRZ2P6Myb5MRvgCHmA9ywsMifU+AYXcB6Xa5GibUC5TSyerxyh0j6QgLVpdyhfArRTTLqQjwe4HOD9s92D4Ap54odXAPBWLAwB02igG5Kkc+piN4lvODIFGAZgT+EO4Si1s7fjSR7vcQETUkRm9O+MXyo9OYhfe4xt9STQ2pcZRLayCV90b4D3jR0DYAfyxJ+eywg2IL7NTMXna7S/RpQ63JhWEM8U41ZyQGjwsVS0QBrEKLu8xwZsbi4wLcCT+OGidPIOCe1PiSc9Qt+go+vYqB7cG+B9d8cAD+WJPz0Am2gxXgU9IneOqDpAAXOsOltVuMzpdakJXrdPCzXiNVUpCeOos5cxnpQT39G+XVLhs1osQVvJKPZyNq8HDwd4d7pNDuWJPxVX7MSzqUDU6gfadKiNlUFTzLeFHHDlzO4kpa7aiKhBPGKwOqxsBAmYkOIpipyXcQSPlRTf+Tii0U3EJGaZsDER2qoB3h2hu0qe+NNwUooYU8y5mILbJe6OuX+2FTKy7bieTDAemaQyQ0CPthljSWO+xmFDIYiESjM5xKd6Ik5lvLq5GrQ3aCMLvmCA9wowLuWJb9xF59hVVP6O0CrBi3ZjZSNOvRy+I6klNVRJYRBaEzdN+imiUXQ8iVF8fsp+W4JXw7WISW7fDh7lptWkCwZ4d7QTXyBPfJMYK7SijjFppGnlIVJBJBYj7eUwtiP1IBXGI1XCsjNpbjENVpSAJ2hq2LTywEly3hUYazt31J8w2+aiLx3g3fohXixPfOMYm6zCGs9LVo9MoW3MCJE7R5u/WsOIjrqBoHUO0bJE9vxBpbhsd3+Nb4/vtPCZ4oZYCitNeYuC/8UDvDvy0qvkiW/cgqNqRyzqSZa/s0mqNGjtKOoTm14zZpUauiQgVfqtQiZjq7Q27JNaSK5ExRcrGCXO1FJYh6jR6CFqK7bZdQZ4t8g0rSlPfP1RdBtqaa9diqtzJkQ9duSryi2brQXbxDwbRUpFMBHjRj8+Nt7GDKgvph9okW7LX47gu0SpGnnFQ1S1lYldOsC7hYteR574ZuKs7Ei1lBsfdz7IZoxzzCVmmVqaSySzQbBVAWDek+N4jh9E/4VqZrJjPwiv9BC1XcvOWgO8275CVyBPvAtTVlDJfZkaZGU7NpqBogAj/xEHkeAuJihWYCxGN6e8+9JtSegFXF1TrhhLGP1fak3pebgPz192/8gB4d/6WT7+GdYnpH7hH/DJzzFiYPn/vjW0SgNpTNuPIZoAEZv8tlGw4+RLxy+ZjnKa5NdFoC7UaW0aduoYse6+bXg1DLg6UfRYwmhGEjqPvF75U558SANrElK/+MdpXvmqBpaXOa/MTZaa1DOcSiLaw9j0NNNst3c+63c7EKTpkvKHzu6bPbP0RkuHAVcbRY8ijP46MIbQeeT1mhA+5PV/inyDdQipf8LTvMXbwvoDy7IruDNVZKTfV4CTSRUYdybUCnGU7KUTDxLgCknqUm5aAW6/1p6eMsOYsphLzsHrE0Y/P5bQedx1F/4yPHnMB3/IOoTU9+BL8PhtjuFKBpZXnYNJxTuv+2XqolKR2UQgHhS5novuxVySJhBNRF3SoKK1XZbbXjVwWNyOjlqWJjrWJIy+P5bQedyldNScP+HZ61xKSK3jyrz+NiHG1hcOLL/+P+PDF2gOkekKGiNWKgJ+8Z/x8Iv4DdQHzcpZyF4v19I27w9/yPGDFQvmEpKtqv/TLiWMfn4sofMm9eAH8Ao0zzh7h4sJqYtxZd5/D7hkYPneDzl5idlzNHcIB0jVlQ+8ULzw/nc5/ojzl2juE0apD7LRnJxe04dMz2iOCFNtGFpTuXA5AhcTRo8mdN4kz30nVjEC4YTZQy4gpC7GlTlrePKhGsKKgeXpCYeO0MAd/GH7yKQUlXPLOasOH3FnSphjHuDvEu4gB8g66oNbtr6eMbFIA4fIBJkgayoXriw2XEDQPJrQeROAlY6aeYOcMf+IVYTU3XFlZufMHinGywaW3YLpObVBAsbjF4QJMsVUSayjk4voPsHJOQfPWDhCgDnmDl6XIRerD24HsGtw86RMHOLvVSHrKBdeVE26gKB5NKHzaIwLOmrqBWJYZDLhASG16c0Tn+CdRhWDgWXnqRZUTnPIHuMJTfLVpkoYy5CzylHVTGZMTwkGAo2HBlkQplrJX6U+uF1wZz2uwS1SQ12IqWaPuO4baZaEFBdukksJmkcTOm+YJSvoqPFzxFA/YUhIvWxcmSdPWTWwbAKVp6rxTtPFUZfKIwpzm4IoMfaYQLWgmlG5FME2gdBgm+J7J+rtS/XBbaVLsR7bpPQnpMFlo2doWaVceHk9+MkyguZNCJ1He+kuHTWyQAzNM5YSUg/GlTk9ZunAsg1qELVOhUSAK0LABIJHLKbqaEbHZLL1VA3VgqoiOKXYiS+HRyaEKgsfIqX64HYWbLRXy/qWoylIV9gudL1OWBNgBgTNmxA6b4txDT4gi3Ri7xFSLxtXpmmYnzAcWDZgY8d503LFogz5sbonDgkKcxGsWsE1OI+rcQtlgBBCSOKD1mtqYpIU8cTvBmAT0yZe+zUzeY92fYjTtGipXLhuR0ePoHk0ofNWBX+lo8Z7pAZDk8mEw5L7dVyZZoE/pTewbI6SNbiAL5xeygW4xPRuLCGbhcO4RIeTMFYHEJkYyEO9HmJfXMDEj/LaH781wHHZEtqSQ/69UnGpzH7LKIAZEDSPJnTesJTUa+rwTepI9dLJEawYV+ZkRn9g+QirD8vF8Mq0jFQ29js6kCS3E1+jZIhgPNanHdHFqFvPJLHqFwQqbIA4jhDxcNsOCCQLDomaL/dr5lyJaJU6FxPFjO3JOh3kVMcROo8u+C+jo05GjMF3P3/FuDLn5x2M04xXULPwaS6hBYki+MrMdZJSgPHlcB7nCR5bJ9Kr5ACUn9jk5kivdd8tk95SOGrtqu9lr2IhK65ZtEl7ZKrp7DrqwZfRUSN1el7+7NJxZbywOC8neNKTch5vsTEMNsoCCqHBCqIPRjIPkm0BjvFODGtto99rCl+d3wmHkW0FPdpZtC7MMcVtGFQjJLX5bdQ2+x9ypdc313uj8xlsrfuLgWXz1cRhZvJYX0iNVBRcVcmCXZs6aEf3RQF2WI/TcCbKmGU3IOoDJGDdDub0+hYckt6PlGu2BcxmhbTdj/klhccLGJMcqRjMJP1jW2ETqLSWJ/29MAoORluJ+6LPffBZbi5gqi5h6catQpmOT7/OFf5UorRpLzCqcMltBLhwd1are3kztrSzXO0LUbXRQcdLh/RdSZ+swRm819REDrtqzC4es6Gw4JCKlSnjYVpo0xeq33PrADbFLL3RuCmObVmPN+24kfa+AojDuM4umKe2QwCf6EN906HwjujaitDs5o0s1y+k3lgbT2W2i7FJdnwbLXhJUBq/9liTctSmFC/0OqUinb0QddTWamtjbHRFuWJJ6NpqZ8vO3fZJ37Db+2GkaPYLGHs7XTTdiFQJ68SkVJFVmY6McR5UycflNCsccHFaV9FNbR4NttLxw4pQ7wJd066Z0ohVbzihaxHVExd/ay04oxUKWt+AsdiQ9OUyZ2krzN19IZIwafSTFgIBnMV73ADj7V/K8u1MaY2sJp2HWm0f41tqwajEvdHWOJs510MaAqN4aoSiPCXtN2KSi46dUxHdaMquar82O1x5jqhDGvqmoE9LfxcY3zqA7/x3HA67r9ZG4O6Cuxu12/+TP+eLP+I+HErqDDCDVmBDO4larujNe7x8om2rMug0MX0rL1+IWwdwfR+p1TNTyNmVJ85ljWzbWuGv8/C7HD/izjkHNZNYlhZcUOKVzKFUxsxxN/kax+8zPWPSFKw80rJr9Tizyj3o1gEsdwgWGoxPezDdZ1TSENE1dLdNvuKL+I84nxKesZgxXVA1VA1OcL49dFlpFV5yJMhzyCmNQ+a4BqusPJ2bB+xo8V9u3x48VVIEPS/mc3DvAbXyoYr6VgDfh5do5hhHOCXMqBZUPhWYbWZECwVJljLgMUWOCB4MUuMaxGNUQDVI50TQ+S3kFgIcu2qKkNSHVoM0SHsgoZxP2d5HH8B9woOk4x5bPkKtAHucZsdykjxuIpbUrSILgrT8G7G5oCW+K0990o7E3T6AdW4TilH5kDjds+H64kS0mz24grtwlzDHBJqI8YJQExotPvoC4JBq0lEjjQkyBZ8oH2LnRsQ4Hu1QsgDTJbO8fQDnllitkxuVskoiKbRF9VwzMDvxHAdwB7mD9yCplhHFEyUWHx3WtwCbSMMTCUCcEmSGlg4gTXkHpZXWQ7kpznK3EmCHiXInqndkQjunG5kxTKEeGye7jWz9cyMR2mGiFQ15ENRBTbCp+Gh86vAyASdgmJq2MC6hoADQ3GosP0QHbnMHjyBQvQqfhy/BUbeHd5WY/G/9LK/8Ka8Jd7UFeNWEZvzPb458Dn8DGLOe3/wGL/4xP+HXlRt+M1PE2iLhR8t+lfgxsuh7AfO2AOf+owWhSZRYQbd622hbpKWKuU+XuvNzP0OseRDa+mObgDHJUSc/pKx31QdKffQ5OIJpt8GWjlgTwMc/w5MPCR/yl1XC2a2Yut54SvOtMev55Of45BOat9aWG27p2ZVORRvnEk1hqWMVUmqa7S2YtvlIpspuF1pt0syuZS2NV14mUidCSfzQzg+KqvIYCMljIx2YK2AO34fX4GWdu5xcIAb8MzTw+j/lyWM+Dw/gjs4GD6ehNgA48kX/AI7XXM/XAN4WHr+9ntywqoCakCqmKP0rmQrJJEErG2Upg1JObr01lKQy4jskWalKYfJ/EDLMpjNSHFEUAde2fltaDgmrNaWQ9+AAb8I5vKjz3L1n1LriB/BXkG/wwR9y/oRX4LlioHA4LzP2inzRx/DWmutRweFjeP3tNeSGlaE1Fde0OS11yOpmbIp2u/jF1n2RRZviJM0yBT3IZl2HWImKjQOxIyeU325b/qWyU9Moj1o07tS0G7qJDoGHg5m8yeCxMoEH8GU45tnrNM84D2l297DQ9t1YP7jki/7RmutRweEA77/HWXOh3HCxkRgldDQkAjNTMl2Iloc1qN5JfJeeTlyTRzxURTdn1Ixv2uKjs12AbdEWlBtmVdk2k7FFwj07PCZ9XAwW3dG+8xKzNFr4EnwBZpy9Qzhh3jDXebBpYcpuo4fQ44u+fD1dweEnHzI7v0xuuOALRUV8rXpFyfSTQYkhd7IHm07jpyhlkCmI0ALYqPTpUxXS+z4jgDj1Pflvmz5ecuItpIBxyTHpSTGWd9g1ApfD/bvwUhL4nT1EzqgX7cxfCcNmb3mPL/qi9SwTHJ49oj5ZLjccbTG3pRmlYi6JCG0mQrAt1+i2UXTZ2dv9IlQpN5naMYtviaXlTrFpoMsl3bOAFEa8sqPj2WCMrx3Yjx99qFwO59Aw/wgx+HlqNz8oZvA3exRDvuhL1jMQHPaOJ0+XyA3fp1OfM3qObEVdhxjvynxNMXQV4+GJyvOEFqeQBaIbbO7i63rpxCltdZShPFxkjM2FPVkn3TG+Rp9pO3l2RzFegGfxGDHIAh8SteR0C4HopXzRF61nheDw6TFN05Ebvq8M3VKKpGjjO6r7nhudTEGMtYM92HTDaR1FDMXJ1eThsbKfywyoWwrzRSXkc51flG3vIid62h29bIcFbTGhfV+faaB+ohj7dPN0C2e2lC96+XouFByen9AsunLDJZ9z7NExiUc0OuoYW6UZkIyx2YUR2z6/TiRjyKMx5GbbjLHvHuf7YmtKghf34LJfx63Yg8vrvN2zC7lY0x0tvKezo4HmGYDU+Gab6dFL+KI761lDcNifcjLrrr9LWZJctG1FfU1uwhoQE22ObjdfkSzY63CbU5hzs21WeTddH2BaL11Gi7lVdlxP1nkxqhnKhVY6knS3EPgVGg1JpN5cP/hivujOelhXcPj8HC/LyI6MkteVjlolBdMmF3a3DbsuAYhL44dxzthWSN065xxUd55Lmf0wRbOYOqH09/o9WbO2VtFdaMb4qBgtFJoT1SqoN8wPXMoXLb3p1PUEhxfnnLzGzBI0Ku7FxrKsNJj/8bn/H8fPIVOd3rfrklUB/DOeO+nkghgSPzrlPxluCMtOnDL4Yml6dK1r3vsgMxgtPOrMFUZbEUbTdIzii5beq72G4PD0DKnwjmBULUVFmy8t+k7fZ3pKc0Q4UC6jpVRqS9Umv8bxw35flZVOU1X7qkjnhZlsMbk24qQ6Hz7QcuL6sDC0iHHki96Uh2UdvmgZnjIvExy2TeJdMDZNSbdZyAHe/Yd1xsQhHiKzjh7GxQ4yqMPaywPkjMamvqrYpmO7Knad+ZQC5msCuAPWUoxrxVhrGv7a+KLXFhyONdTMrZ7ke23qiO40ZJUyzgYyX5XyL0mV7NiUzEs9mjtbMN0dERqwyAJpigad0B3/zRV7s4PIfXSu6YV/MK7+OrYe/JvfGMn/PHJe2fyUdtnFrKRNpXV0Y2559aWPt/G4BlvjTMtXlVIWCnNyA3YQBDmYIodFz41PvXPSa6rq9lWZawZ4dP115HXV/M/tnFkkrBOdzg6aP4pID+MZnTJ1SuuB6iZlyiox4HT2y3YBtkUKWooacBQUDTpjwaDt5poBHl1/HXltwP887lKKXxNUEyPqpGTyA699UqY/lt9yGdlUKra0fFWS+36iylVWrAyd7Uw0CZM0z7xKTOduznLIjG2Hx8cDPLb+OvK6Bv7n1DYci4CxUuRxrjBc0bb4vD3rN5Zz36ntLb83eVJIB8LiIzCmn6SMPjlX+yNlTjvIGjs+QzHPf60Aj62/jrzG8j9vYMFtm1VoRWCJdmw7z9N0t+c8cxZpPeK4aTRicS25QhrVtUp7U578chk4q04Wx4YoQSjFryUlpcQ1AbxZ/XVMknIU//OGl7Q6z9Zpxi0+3yFhSkjUDpnCIUhLWVX23KQ+L9vKvFKI0ZWFQgkDLvBoylrHNVmaw10zwCPrr5tlodfnf94EWnQ0lFRWy8pW9LbkLsyUVDc2NSTHGDtnD1uMtchjbCeb1mpxFP0YbcClhzdLu6lfO8Bj6q+bdT2sz/+8SZCV7VIxtt0DUn9L7r4cLYWDSXnseEpOGFuty0qbOVlS7NNzs5FOGJUqQpl2Q64/yBpZf90sxbE+//PGdZ02HSipCbmD6NItmQ4Lk5XUrGpDMkhbMm2ZVheNYV+VbUWTcv99+2NyX1VoafSuC+AN6q9bFIMv5X/eagNWXZxEa9JjlMwNWb00akGUkSoepp1/yRuuqHGbUn3UdBSTxBU6SEVklzWRUkPndVvw2PrrpjvxOvzPmwHc0hpmq82npi7GRro8dXp0KXnUQmhZbRL7NEVp1uuZmO45vuzKsHrktS3GLWXODVjw+vXXLYx4Hf7njRPd0i3aoAGX6W29GnaV5YdyDj9TFkakje7GHYzDoObfddHtOSpoi2SmzJHrB3hM/XUDDEbxP2/oosszcRlehWXUvzHv4TpBVktHqwenFo8uLVmy4DKLa5d3RtLrmrM3aMFr1183E4sewf+85VWeg1c5ag276NZrM9IJVNcmLEvDNaV62aq+14IAOGFsBt973Ra8Xv11YzXwNfmft7Jg2oS+XOyoC8/cwzi66Dhmgk38kUmP1CUiYWOX1bpD2zWXt2FCp7uq8703APAa9dfNdscR/M/bZLIyouVxqJfeWvG9Je+JVckHQ9+CI9NWxz+blX/KYYvO5n2tAP/vrlZ7+8/h9y+9qeB/Hnt967e5mevX10rALDWK//FaAT5MXdBXdP0C/BAes792c40H+AiAp1e1oH8HgH94g/Lttx1gp63op1eyoM/Bvw5/G/7xFbqJPcCXnmBiwDPb/YKO4FX4OjyCb289db2/Noqicw4i7N6TVtoz8tNwDH+8x/i6Ae7lmaQVENzJFb3Di/BFeAwz+Is9SjeQySpPqbLFlNmyz47z5a/AF+AYFvDmHqibSXTEzoT4Gc3OALaqAP4KPFUJ6n+1x+rGAM6Zd78bgJ0a8QN4GU614vxwD9e1Amy6CcskNrczLx1JIp6HE5UZD/DBHrFr2oNlgG4Odv226BodoryjGJ9q2T/AR3vQrsOCS0ctXZi3ruLlhpFDJYl4HmYtjQCP9rhdn4suySLKDt6wLcC52h8xPlcjju1fn+yhuw4LZsAGUuo2b4Fx2UwQu77uqRHXGtg92aN3tQCbFexc0uk93vhTXbct6y7MulLycoUljx8ngDMBg1tvJjAazpEmOtxlzclvj1vQf1Tx7QlPDpGpqgtdSKz/d9/hdy1vTfFHSmC9dGDZbLiezz7Ac801HirGZsWjydfZyPvHXL/Y8Mjzg8BxTZiuwKz4Eb8sBE9zznszmjvFwHKPIWUnwhqfVRcd4Ck0K6ate48m1oOfrX3/yOtvAsJ8zsPAM89sjnddmuLuDPjX9Bu/L7x7xpMzFk6nWtyQfPg278Gn4Aekz2ZgOmU9eJ37R14vwE/BL8G3aibCiWMWWDQ0ZtkPMnlcGeAu/Ag+8ZyecU5BPuy2ILD+sQqyZhAKmn7XZd+jIMTN9eBL7x95xVLSX4On8EcNlXDqmBlqS13jG4LpmGbkF/0CnOi3H8ETOIXzmnmtb0a16Tzxj1sUvQCBiXZGDtmB3KAefPH94xcUa/6vwRn80GOFyjEXFpba4A1e8KQfFF+259tx5XS4egYn8fQsLGrqGrHbztr+uByTahWuL1NUGbDpsnrwBfePPwHHIf9X4RnM4Z2ABWdxUBlqQ2PwhuDxoS0vvqB1JzS0P4h2nA/QgTrsJFn+Y3AOjs9JFC07CGWX1oNX3T/yHOzgDjwPn1PM3g9Jk9lZrMEpxnlPmBbjyo2+KFXRU52TJM/2ALcY57RUzjObbjqxVw++4P6RAOf58pcVsw9Daje3htriYrpDOonre3CudSe6bfkTEgHBHuDiyu5MCsc7BHhYDx7ePxLjqigXZsw+ijMHFhuwBmtoTPtOxOrTvYJDnC75dnUbhfwu/ZW9AgYd+peL68HD+0emKquiXHhWjJg/UrkJYzuiaL3E9aI/ytrCvAd4GcYZMCkSQxfUg3v3j8c4e90j5ZTPdvmJJGHnOCI2nHS8081X013pHuBlV1gB2MX1YNmWLHqqGN/TWmG0y6clJWthxNUl48q38Bi8vtMKyzzpFdSDhxZ5WBA5ZLt8Jv3895DduBlgbPYAj8C4B8hO68FDkoh5lydC4FiWvBOVqjYdqjiLv92t8yPDjrDaiHdUD15qkSURSGmXJwOMSxWAXYwr3zaAufJ66l+94vv3AO+vPcD7aw/w/toDvL/2AO+vPcD7aw/wHuD9tQd4f+0B3l97gPfXHuD9tQd4f+0B3l97gG8LwP8G/AL8O/A5OCq0Ys2KIdv/qOIXG/4mvFAMF16gZD+2Xvu/B8as5+8bfllWyg0zaNO5bfXj6vfhhwD86/Aq3NfRS9t9WPnhfnvCIw/CT8GLcFTMnpntdF/z9V+PWc/vWoIH+FL3Znv57PitcdGP4R/C34avw5fgRVUInCwbsn1yyA8C8zm/BH8NXoXnVE6wVPjdeCI38kX/3+Ct9dbz1pTmHFRu+Hm4O9Ch3clr99negxfwj+ER/DR8EV6B5+DuQOnTgUw5rnkY+FbNU3gNXh0o/JYTuWOvyBf9FvzX663HH/HejO8LwAl8Hl5YLTd8q7sqA3wbjuExfAFegQdwfyDoSkWY8swzEf6o4Qyewefg+cHNbqMQruSL/u/WWc+E5g7vnnEXgDmcDeSGb/F4cBcCgT+GGRzDU3hZYburAt9TEtHgbM6JoxJ+6NMzzTcf6c2bycv2+KK/f+l6LBzw5IwfqZJhA3M472pWT/ajKxnjv4AFnMEpnBTPND6s2J7qHbPAqcMK74T2mZ4VGB9uJA465It+/eL1WKhYOD7xHOkr1ajK7d0C4+ke4Hy9qXZwpgLr+Znm/uNFw8xQOSy8H9IzjUrd9+BIfenYaylf9FsXr8fBAadnPIEDna8IBcwlxnuA0/Wv6GAWPd7dDIKjMdSWueAsBj4M7TOd06qBbwDwKr7oleuxMOEcTuEZTHWvDYUO7aHqAe0Bbq+HEFRzOz7WVoTDQkVds7A4sIIxfCQdCefFRoIOF/NFL1mPab/nvOakSL/Q1aFtNpUb/nFOVX6gzyg/1nISyDfUhsokIzaBR9Kxm80s5mK+6P56il1jXic7nhQxsxSm3OwBHl4fFdLqi64nDQZvqE2at7cWAp/IVvrN6/BFL1mPhYrGMBfOi4PyjuSGf6wBBh7p/FZTghCNWGgMzlBbrNJoPJX2mW5mwZfyRffXo7OFi5pZcS4qZUrlViptrXtw+GQoyhDPS+ANjcGBNRiLCQDPZPMHuiZfdFpPSTcQwwKYdRNqpkjm7AFeeT0pJzALgo7g8YYGrMHS0iocy+YTm2vyRUvvpXCIpQ5pe666TJrcygnScUf/p0NDs/iAI/nqDHC8TmQT8x3NF91l76oDdQGwu61Z6E0ABv7uO1dbf/37Zlv+Zw/Pbh8f1s4Avur6657/+YYBvur6657/+YYBvur6657/+YYBvur6657/+aYBvuL6657/+VMA8FXWX/f8zzcN8BXXX/f8zzcNMFdbf93zP38KLPiK6697/uebtuArrr/u+Z9vGmCusP6653/+1FjwVdZf9/zPN7oHX339dc//fNMu+irrr3v+50+Bi+Zq6697/uebA/jz8Pudf9ht/fWv517J/XUzAP8C/BAeX9WCDrUpZ3/dEMBxgPcfbtTVvsYV5Yn32u03B3Ac4P3b8I+vxNBKeeL9dRMAlwO83959qGO78sT769oB7g3w/vGVYFzKE++v6wV4OMD7F7tckFkmT7y/rhHgpQO8b+4Y46XyxPvrugBeNcB7BRiX8sT767oAvmCA9woAHsoT76+rBJjLBnh3txOvkifeX1dswZcO8G6N7sXyxPvr6i340gHe3TnqVfLE++uKAb50gHcXLnrX8sR7gNdPRqwzwLu7Y/FO5Yn3AK9jXCMGeHdgxDuVJ75VAI8ljP7PAb3/RfjcZfePHBB+79dpfpH1CanN30d+mT1h9GqAxxJGM5LQeeQ1+Tb+EQJrElLb38VHQ94TRq900aMIo8cSOo+8Dp8QfsB8zpqE1NO3OI9Zrj1h9EV78PqE0WMJnUdeU6E+Jjyk/hbrEFIfeWbvId8H9oTRFwdZaxJGvziW0Hn0gqYB/wyZ0PwRlxJST+BOw9m77Amj14ii1yGM/txYQudN0qDzGe4EqfA/5GJCagsHcPaEPWH0esekSwmjRxM6b5JEcZ4ww50ilvAOFxBSx4yLW+A/YU8YvfY5+ALC6NGEzhtmyZoFZoarwBLeZxUhtY4rc3bKnjB6TKJjFUHzJoTOozF2YBpsjcyxDgzhQ1YRUse8+J4wenwmaylB82hC5w0zoRXUNXaRBmSMQUqiWSWkLsaVqc/ZE0aPTFUuJWgeTei8SfLZQeMxNaZSIzbII4aE1Nmr13P2hNHjc9E9guYNCZ032YlNwESMLcZiLQHkE4aE1BFg0yAR4z1h9AiAGRA0jyZ03tyIxWMajMPWBIsxYJCnlITU5ShiHYdZ94TR4wCmSxg9jtB5KyPGYzymAYexWEMwAPIsAdYdV6aObmNPGD0aYLoEzaMJnTc0Ygs+YDw0GAtqxBjkuP38bMRWCHn73xNGjz75P73WenCEJnhwyVe3AEe8TtKdJcYhBl97wuhNAObK66lvD/9J9NS75v17wuitAN5fe4D31x7g/bUHeH/tAd5fe4D3AO+vPcD7aw/w/toDvL/2AO+vPcD7aw/w/toDvAd4f/24ABzZ8o+KLsSLS+Pv/TqTb3P4hKlQrTGh+fbIBT0Axqznnb+L/V2mb3HkN5Mb/nEHeK7d4IcDld6lmDW/iH9E+AH1MdOw/Jlu2T1xNmY98sv4wHnD7D3uNHu54WUuOsBTbQuvBsPT/UfzNxGYzwkP8c+Yz3C+r/i6DcyRL/rZ+utRwWH5PmfvcvYEt9jLDS/bg0/B64DWKrQM8AL8FPwS9beQCe6EMKNZYJol37jBMy35otdaz0Bw2H/C2Smc7+WGB0HWDELBmOByA3r5QONo4V+DpzR/hFS4U8wMW1PXNB4TOqYz9urxRV++ntWCw/U59Ty9ebdWbrgfRS9AYKKN63ZokZVygr8GZ/gfIhZXIXPsAlNjPOLBby5c1eOLvmQ9lwkOy5x6QV1j5TYqpS05JtUgUHUp5toHGsVfn4NX4RnMCe+AxTpwmApTYxqMxwfCeJGjpXzRF61nbcHhUBPqWze9svwcHJ+S6NPscKrEjug78Dx8Lj3T8D4YxGIdxmJcwhi34fzZUr7olevZCw5vkOhoClq5zBPZAnygD/Tl9EzDh6kl3VhsHYcDEb+hCtJSvuiV69kLDm+WycrOTArHmB5/VYyP6jOVjwgGawk2zQOaTcc1L+aLXrKeveDwZqlKrw8U9Y1p66uK8dEzdYwBeUQAY7DbyYNezBfdWQ97weEtAKYQg2xJIkuveAT3dYeLGH+ShrWNwZgN0b2YL7qznr3g8JYAo5bQBziPjx7BPZ0d9RCQp4UZbnFdzBddor4XHN4KYMrB2qHFRIzzcLAHQZ5the5ovui94PCWAPefaYnxIdzRwdHCbuR4B+tbiy96Lzi8E4D7z7S0mEPd+eqO3cT53Z0Y8SV80XvB4Z0ADJi/f7X113f+7p7/+UYBvur6657/+YYBvur6657/+aYBvuL6657/+aYBvuL6657/+aYBvuL6657/+aYBvuL6657/+VMA8FXWX/f8z58OgK+y/rrnf75RgLna+uue//lTA/CV1V/3/M837aKvvv6653++UQvmauuve/7nTwfAV1N/3fM/fzr24Cuuv+75nz8FFnxl9dc9//MOr/8/glixwRuUfM4AAAAASUVORK5CYII="}_getSearchTexture(){return"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII="}}const qe=s.defineComponent({__name:"SMAA",props:{width:{},height:{}},setup(r,{expose:t}){const e=r,{sizes:a}=v.useTresContext(),{pixelRatio:o}=H.useDevicePixelRatio(),n=s.computed(()=>e.width??a.width.value*o.value),l=s.computed(()=>e.height??a.height.value*o.value),{pass:u}=M(()=>new ke,e);return t({pass:u}),s.watchEffect(()=>{u.value.setSize(n.value,l.value)}),()=>{}}}),Z={uniforms:{tDiffuse:{value:null},luminosityThreshold:{value:1},smoothWidth:{value:1},defaultColor:{value:new i.Color(0)},defaultOpacity:{value:0}},vertexShader:`
1150
-
1151
- varying vec2 vUv;
1152
-
1153
- void main() {
1154
-
1155
- vUv = uv;
1156
-
1157
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1158
-
1159
- }`,fragmentShader:`
1160
-
1161
- uniform sampler2D tDiffuse;
1162
- uniform vec3 defaultColor;
1163
- uniform float defaultOpacity;
1164
- uniform float luminosityThreshold;
1165
- uniform float smoothWidth;
1166
-
1167
- varying vec2 vUv;
1168
-
1169
- void main() {
1170
-
1171
- vec4 texel = texture2D( tDiffuse, vUv );
1172
-
1173
- float v = luminance( texel.xyz );
1174
-
1175
- vec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );
1176
-
1177
- float alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );
1178
-
1179
- gl_FragColor = mix( outputColor, texel, alpha );
1180
-
1181
- }`};class C extends y{constructor(t,e=1,a,o){super(),this.strength=e,this.radius=a,this.threshold=o,this.resolution=t!==void 0?new i.Vector2(t.x,t.y):new i.Vector2(256,256),this.clearColor=new i.Color(0,0,0),this.needsSwap=!1,this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.nMips=5;let n=Math.round(this.resolution.x/2),l=Math.round(this.resolution.y/2);this.renderTargetBright=new i.WebGLRenderTarget(n,l,{type:i.HalfFloatType}),this.renderTargetBright.texture.name="UnrealBloomPass.bright",this.renderTargetBright.texture.generateMipmaps=!1;for(let p=0;p<this.nMips;p++){const w=new i.WebGLRenderTarget(n,l,{type:i.HalfFloatType});w.texture.name="UnrealBloomPass.h"+p,w.texture.generateMipmaps=!1,this.renderTargetsHorizontal.push(w);const A=new i.WebGLRenderTarget(n,l,{type:i.HalfFloatType});A.texture.name="UnrealBloomPass.v"+p,A.texture.generateMipmaps=!1,this.renderTargetsVertical.push(A),n=Math.round(n/2),l=Math.round(l/2)}const u=Z;this.highPassUniforms=i.UniformsUtils.clone(u.uniforms),this.highPassUniforms.luminosityThreshold.value=o,this.highPassUniforms.smoothWidth.value=.01,this.materialHighPassFilter=new i.ShaderMaterial({uniforms:this.highPassUniforms,vertexShader:u.vertexShader,fragmentShader:u.fragmentShader}),this.separableBlurMaterials=[];const f=[3,5,7,9,11];n=Math.round(this.resolution.x/2),l=Math.round(this.resolution.y/2);for(let p=0;p<this.nMips;p++)this.separableBlurMaterials.push(this._getSeparableBlurMaterial(f[p])),this.separableBlurMaterials[p].uniforms.invSize.value=new i.Vector2(1/n,1/l),n=Math.round(n/2),l=Math.round(l/2);this.compositeMaterial=this._getCompositeMaterial(this.nMips),this.compositeMaterial.uniforms.blurTexture1.value=this.renderTargetsVertical[0].texture,this.compositeMaterial.uniforms.blurTexture2.value=this.renderTargetsVertical[1].texture,this.compositeMaterial.uniforms.blurTexture3.value=this.renderTargetsVertical[2].texture,this.compositeMaterial.uniforms.blurTexture4.value=this.renderTargetsVertical[3].texture,this.compositeMaterial.uniforms.blurTexture5.value=this.renderTargetsVertical[4].texture,this.compositeMaterial.uniforms.bloomStrength.value=e,this.compositeMaterial.uniforms.bloomRadius.value=.1;const h=[1,.8,.6,.4,.2];this.compositeMaterial.uniforms.bloomFactors.value=h,this.bloomTintColors=[new i.Vector3(1,1,1),new i.Vector3(1,1,1),new i.Vector3(1,1,1),new i.Vector3(1,1,1),new i.Vector3(1,1,1)],this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,this.copyUniforms=i.UniformsUtils.clone(F.uniforms),this.blendMaterial=new i.ShaderMaterial({uniforms:this.copyUniforms,vertexShader:F.vertexShader,fragmentShader:F.fragmentShader,blending:i.AdditiveBlending,depthTest:!1,depthWrite:!1,transparent:!0}),this._oldClearColor=new i.Color,this._oldClearAlpha=1,this._basic=new i.MeshBasicMaterial,this._fsQuad=new T(null)}dispose(){for(let t=0;t<this.renderTargetsHorizontal.length;t++)this.renderTargetsHorizontal[t].dispose();for(let t=0;t<this.renderTargetsVertical.length;t++)this.renderTargetsVertical[t].dispose();this.renderTargetBright.dispose();for(let t=0;t<this.separableBlurMaterials.length;t++)this.separableBlurMaterials[t].dispose();this.compositeMaterial.dispose(),this.blendMaterial.dispose(),this._basic.dispose(),this._fsQuad.dispose()}setSize(t,e){let a=Math.round(t/2),o=Math.round(e/2);this.renderTargetBright.setSize(a,o);for(let n=0;n<this.nMips;n++)this.renderTargetsHorizontal[n].setSize(a,o),this.renderTargetsVertical[n].setSize(a,o),this.separableBlurMaterials[n].uniforms.invSize.value=new i.Vector2(1/a,1/o),a=Math.round(a/2),o=Math.round(o/2)}render(t,e,a,o,n){t.getClearColor(this._oldClearColor),this._oldClearAlpha=t.getClearAlpha();const l=t.autoClear;t.autoClear=!1,t.setClearColor(this.clearColor,0),n&&t.state.buffers.stencil.setTest(!1),this.renderToScreen&&(this._fsQuad.material=this._basic,this._basic.map=a.texture,t.setRenderTarget(null),t.clear(),this._fsQuad.render(t)),this.highPassUniforms.tDiffuse.value=a.texture,this.highPassUniforms.luminosityThreshold.value=this.threshold,this._fsQuad.material=this.materialHighPassFilter,t.setRenderTarget(this.renderTargetBright),t.clear(),this._fsQuad.render(t);let u=this.renderTargetBright;for(let f=0;f<this.nMips;f++)this._fsQuad.material=this.separableBlurMaterials[f],this.separableBlurMaterials[f].uniforms.colorTexture.value=u.texture,this.separableBlurMaterials[f].uniforms.direction.value=C.BlurDirectionX,t.setRenderTarget(this.renderTargetsHorizontal[f]),t.clear(),this._fsQuad.render(t),this.separableBlurMaterials[f].uniforms.colorTexture.value=this.renderTargetsHorizontal[f].texture,this.separableBlurMaterials[f].uniforms.direction.value=C.BlurDirectionY,t.setRenderTarget(this.renderTargetsVertical[f]),t.clear(),this._fsQuad.render(t),u=this.renderTargetsVertical[f];this._fsQuad.material=this.compositeMaterial,this.compositeMaterial.uniforms.bloomStrength.value=this.strength,this.compositeMaterial.uniforms.bloomRadius.value=this.radius,this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,t.setRenderTarget(this.renderTargetsHorizontal[0]),t.clear(),this._fsQuad.render(t),this._fsQuad.material=this.blendMaterial,this.copyUniforms.tDiffuse.value=this.renderTargetsHorizontal[0].texture,n&&t.state.buffers.stencil.setTest(!0),this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(a),this._fsQuad.render(t)),t.setClearColor(this._oldClearColor,this._oldClearAlpha),t.autoClear=l}_getSeparableBlurMaterial(t){const e=[];for(let a=0;a<t;a++)e.push(.39894*Math.exp(-.5*a*a/(t*t))/t);return new i.ShaderMaterial({defines:{KERNEL_RADIUS:t},uniforms:{colorTexture:{value:null},invSize:{value:new i.Vector2(.5,.5)},direction:{value:new i.Vector2(.5,.5)},gaussianCoefficients:{value:e}},vertexShader:`varying vec2 vUv;
1182
- void main() {
1183
- vUv = uv;
1184
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1185
- }`,fragmentShader:`#include <common>
1186
- varying vec2 vUv;
1187
- uniform sampler2D colorTexture;
1188
- uniform vec2 invSize;
1189
- uniform vec2 direction;
1190
- uniform float gaussianCoefficients[KERNEL_RADIUS];
1191
-
1192
- void main() {
1193
- float weightSum = gaussianCoefficients[0];
1194
- vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;
1195
- for( int i = 1; i < KERNEL_RADIUS; i ++ ) {
1196
- float x = float(i);
1197
- float w = gaussianCoefficients[i];
1198
- vec2 uvOffset = direction * invSize * x;
1199
- vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
1200
- vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
1201
- diffuseSum += (sample1 + sample2) * w;
1202
- weightSum += 2.0 * w;
1203
- }
1204
- gl_FragColor = vec4(diffuseSum/weightSum, 1.0);
1205
- }`})}_getCompositeMaterial(t){return new i.ShaderMaterial({defines:{NUM_MIPS:t},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:`varying vec2 vUv;
1206
- void main() {
1207
- vUv = uv;
1208
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
1209
- }`,fragmentShader:`varying vec2 vUv;
1210
- uniform sampler2D blurTexture1;
1211
- uniform sampler2D blurTexture2;
1212
- uniform sampler2D blurTexture3;
1213
- uniform sampler2D blurTexture4;
1214
- uniform sampler2D blurTexture5;
1215
- uniform float bloomStrength;
1216
- uniform float bloomRadius;
1217
- uniform float bloomFactors[NUM_MIPS];
1218
- uniform vec3 bloomTintColors[NUM_MIPS];
1219
-
1220
- float lerpBloomFactor(const in float factor) {
1221
- float mirrorFactor = 1.2 - factor;
1222
- return mix(factor, mirrorFactor, bloomRadius);
1223
- }
1224
-
1225
- void main() {
1226
- gl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +
1227
- lerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +
1228
- lerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +
1229
- lerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +
1230
- lerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );
1231
- }`})}}C.BlurDirectionX=new i.Vector2(1,0),C.BlurDirectionY=new i.Vector2(0,1);const Qe=s.defineComponent({__name:"UnrealBloom",props:{radius:{default:0},strength:{default:1},threshold:{default:0}},setup(r,{expose:t}){const e=r,{sizes:a}=v.useTresContext(),{pass:o}=M(()=>new C(new i.Vector2(a.width.value,a.height.value),e.radius,e.strength,e.threshold),e);return t({pass:o}),s.watchEffect(()=>{o.value.radius=e.radius??o.value.getCompositeMaterial().uniforms.bloomRadius?.value??.1}),s.watchEffect(()=>{o.value.strength=e.strength??o.value.getCompositeMaterial().uniforms.bloomStrength?.value??1}),s.watchEffect(()=>{o.value.threshold=e.threshold??Z.uniforms.luminosityThreshold?.value??1}),()=>{}}});d.ASCIIPmndrs=Oe,d.BarrelBlurPmndrs=ce,d.BloomPmndrs=oe,d.BrightnessContrastPmndrs=De,d.ChromaticAberrationPmndrs=de,d.ColorAveragePmndrs=ge,d.ColorDepthPmndrs=Me,d.DepthOfFieldPmndrs=ae,d.DepthPickingPassPmndrs=ye,d.DotScreenPmndrs=we,d.EffectComposer=He,d.EffectComposerPmndrs=$,d.FXAAPmndrs=Fe,d.FishEyePmndrs=Ee,d.Glitch=Ve,d.GlitchPmndrs=ne,d.GodRaysPmndrs=Te,d.GridPmndrs=Ce,d.Halftone=Xe,d.HueSaturationPmndrs=fe,d.KuwaharaPmndrs=pe,d.LensDistortionPmndrs=ve,d.LinocutPmndrs=Ae,d.NoisePmndrs=ie,d.OutlinePmndrs=se,d.Output=Ye,d.Pixelation=je,d.PixelationPmndrs=re,d.SMAA=qe,d.SMAAPmndrs=Pe,d.ScanlinePmndrs=he,d.SepiaPmndrs=Se,d.ShockWavePmndrs=xe,d.TexturePmndrs=Le,d.TiltShiftPmndrs=be,d.ToneMappingPmndrs=ue,d.UnrealBloom=Qe,d.VignettePmndrs=le,d.useEffect=M,d.useEffectPmndrs=m,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));