+
+2. Once you have a good location, trigger the effect you are looking for and enter the pause menu. In this case, we are interested in the flame effect from Diluc’s skill, so we press e then pause (note: for effects that show up only when the game isn’t paused, it is still possible to get them just a little more difficult – I will explain how later)
+
+
+
+3. Now, we are going to press `1` and `2` on the numpad to cycle through the Pixel Shaders (`PS`). There are two types of shaders – Vertex Shaders (`VS`) which control where things are drawn on-screen, and Pixel Shaders (`PS`) which decide how they look and draw textures/colors. Since we are interested in the color, we want the PS
+
+4. When you find the right `PS`, the effect will vanish in-game. For example, here is the shader that controls the center flame of the swing:
+
+
+
+ While this one controls the surrounding flame clouds:
+
+
+
+ We will start with these two.
+
+5. Pressing `3` on the numpad will copy the PS hash to your clipboard, and save the shader into the ShaderFixes folder. The hashes of the above two shaders are `e75b3ffb93a1d268` and `dd0757868249aaa5` (Note: you can press numpad `+` to reset buffers to 0 if you need to quickly go back to the starting point). Note that shader hashes can change between versions, so your hashes may not be the same values.
+
+6. The shaders should now show up in ShaderFixes with a name like `hash-ps_replace.txt`.
+
+
+
+ If they don’t show up after pressing `3` on the numpad, make sure you put `hlsl` and `asm` in the `marking_actions` as mentioned in the Important Note at the top and have refreshed with `F10`
+
+ Also note that a small number of shaders will not decompile properly into `hlsl` (high level shader language), and will instead revert back to `asm` (assembly). These shaders will still work, but they will be more unwieldy to edit. I won’t cover asm in this tutorial, but the concepts are the same – the syntax of the shaders is just harder to read.
+
+7. Open them up with your text editor of choice (Notepad/Notepad++/Sublime Text/whatever). The file will look daunting at first, but don’t worry – you don’t need to understand the details in order to make basic changes (I will go more into details of how this file works in the later sections).
+
+
+
+8. For now, we are most interested in messing around with the inputs and outputs. These are listed right under main – this file takes 9 inputs (numbered `v0`, `v1`, `v2`,…`v8`) and has one output (`o0`).
+
+
+
+9. Usually it is simplest to start with the output. It has a type of `float4` which means it has an `x`,`y`,`z` and `w` component and takes a floating point (i.e. decimal) number as input. We can experiment to see what it does by putting a line at the end of the code to forcibly set the value to a constant:
+
+
+
+ (`//` and `/* */` indicate comments in the code and are ignored by the program. 3dmigoto also exports the `asm` code below the `hlsl` code – when I say the “end”, I mean right before the `return` not after. Everything after that point is commented out, and will not run by default. If you see things like `div`, `mul` and `mov` you have gone too far)
+
+ Basically what we are doing is overwriting what the game is calculating for the value and substituting in our own.
+
+10. Save the file, then press `F10` in game to reload (make sure to also press `+` to reset buffers!). 3dmigoto will automatically load the shader from the ShaderFixes folder. This is what happens:
+
+
+
+ The central line has turned black, while the sparks have turned green. If you familiar with how colors are stored you might have a guess what `o0.x` represents, but we can continue checking to be sure:
+
+ Setting the `x` and `z` components to 0, and `y` to 1:
+
+
+
+ Sets everything to green:
+
+
+
+ While setting `x` and `y` to 0 and `z` to 1
+
+
+
+ Sets the color to blue:
+
+
+
+ Or in other words `o0.xyz` correspond to the RGB colors of the effect. It isn’t always the case that `o0` is the color – some shaders have multiple outputs, so the color might be on `o1` or `o2` etc; thankfully, this shader is fairly simple and only has one output `o0`.
+
+ (If you are wondering what `w` represents, it seems to be related to the wideness/emission of the effect:)
+
+
+
+11. Now that we know what the values correspond to, we can make basic changes to the colors. For example, setting all three `o0.xyz` to 0 causes Diluc’s flames to become black:
+
+
+
+
+
+ Or we can turn them to purple by setting `r` and `b` to 1, and leaving `g` as 0:
+
+
+
+ And note we aren’t limited to just setting constants either – we can shift the color hue as well. This reduces the amount of red in the attacks while giving more green and a lot more blue to create a salmon pink color:
+
+
+
+
+
+ Note that unlike the cases where we forcibly set a constant value, the flame texture is still visible here.
+
+ We can even do fancier things like set the values to mathematical expressions, but I will go over that in the final section.
+
+ Instead of changing the output it is also possible to change the effects by changing the input using a similar method (putting the lines right after when they are normally loaded and overriding the game’s values), though you will need to experiment to deduce which variable changes what.
+
+12. This is the basic process to change effect colors – find the hash, dump it, then modify either the input or output. However, if you have been following along you may have noticed that not all the flame textures have been replaced – there are still more we need to dump:
+
+ `0fa220b5adced192` is the sparks:
+
+
+
+ `bf7eb60b256538c7` is the flames along the sword:
+
+
+
+ `439c03865c4ce77e` is the bird:
+
+
+
+ `7690cf4aa6647c6c` is the sword glow during ult:
+
+
+
+ Collecting all the different shaders is what takes the majority of the time when editing effects.
+
+13. Even turning all of the above black, you may have noticed that there are still flame effects that show up during the ult where we cannot pause the game:
+
+
+
+ Getting these shaders is more annoying, but not impossible. The first method is to enable something like infinite burst energy in grasscutter and cast the ult over and over while cycling. This will take some time, but should work for anything that is repeatable.
+
+ (UPDATE: I have received recommendations of two more ways you can get shader information from bursts: one is to stand in shallow water or with your back to a wall to disable the burst camera. This will let you pause normally during bursts and give you time to cycle through the hashes:
+
+
+
+ The second is to use a cheat software like Akebi to reduce the gamespeed to below 1, which lets you watch the effects in slow-motion. Note that using cheat software can result in bans if used on official servers, so I recommend only using private servers if you decide to use this method.
+
+ Big thank you to ComplexSignal31#5778 and NK#1321 for the recommendations!)
+
+ For effects that only show up in cutscenes or are hard to reproduce, however, the fastest method is to do a frame dump. See the texture modding tutorial for more details on how to perform frame dumps, but essentially you press `F8` while the effect is on-screen to perform the dump at the same time as the effect is visible.
+
+ Unfortunately, since we do not know the shader hash it will need to be a full dump so make sure you have 5-10GB of space free and as few objects on screen as possible.
+
+
+
+ When you have the frame analysis folder that is created after pressing `F8`, you can look through it to see when the effect is drawn. The `o0` and `o1` files show what is being drawn each ID, and are very useful to isolate the exact ID an effect is drawn on screen.
+
+ Example: `000351-o0=3315d2b5-vs=eb65cb4eba57132b-ps=7690cf4aa6647c6c.dds` looks like this in my frame dump:
+
+
+
+ While `000352-o0=3315d2b5-vs=f6a1f24f9c9b28c2-ps=a69e25f25a6c8e04.dds` looks like this:
+
+
+
+ So we know that that in this frame, draw call `000352` is responsible for the glowing effect on the ground. We can also get the hash from the filename, `ps=a69e25f25a6c8e04`.
+
+ Using this method we can find the remaining hashes:
+
+ `000353-o0=3315d2b5-vs=f50ce30bb0caf55c-ps=4d4da8a4cbe1149a.dds`
+
+
+
+ And `000365-o0=3315d2b5-vs=72ce1e39ede0982f-ps=622a52d3edcf0363.dds`
+
+
+
+14. Now that we have the remaining hashes, we need to actually dump them. Press numpad `+` to reset buffers, cast the ult, then start cycling with numpad `1`/`2` while the effect is on-screen. Even though the effect will have left the screen by the time we reach the hash, as long as we started cycling when the effect was on-screen it will show up in the list and be available to dump:
+
+ Example of PS `4d4da8a4cbe1149a` showing up even though the ult isn’t active:
+
+
+
+ Using this technique, we can dump the remaining shaders `a69e25f25a6c8e04`, `4d4da8a4cbe1149a` and `622a52d3edcf0363`:
+
+
+
+15. Modding complete! Or…maybe not. If you switch to another pyro character such as Hu Tao, you may notice an issue:
+
+
+
+ We have set ALL flames to black, not just Diluc’s. Also, if someone else created a mod that changed another character’s flames like Hu Tao’s or Klee’s, it would overlap with the Diluc one as well.
+
+16. We want a way to limit the effect to only show up when Diluc is on-field. There are a couple of ways we can do this, but they all follow the same basic principle – we identify some condition that is caused whenever Diluc is on the field, then only apply the effects if that condition is true.
+
+This is a somewhat more advanced topic which will make more sense after you play around with the shaders more and read the later sections – if you have issues understanding this, try reading the following sections and coming back later.
+
+First, we need identify a hash that is unique to Diluc. For simplicity, I am going to use Diluc’s `VB` hash `56159d74` (`VB` can be cycled with numpad `/` and `*`, and copied with numpad `-`):
+
+
+
+17. Next, we construct an `.ini` which we will use to selectively apply the effects. We define a variable called `$ActiveCharacter`, and set it equal to 0 at the start of every frame (`[Present]` runs once per frame at the start). We only set the value equal to 1 whenever Diluc is on-field, indicated by the VB hash being matched:
+
+```
+[Constants]
+global $ActiveCharacter
+
+[Present]
+post $ActiveCharacter = 0
+
+[TextureOverrideDilucVB]
+hash = 56159d74
+match_priority = 1
+$ActiveCharacter = 1
+```
+The `match_priority` here is just to ensure this effect does not interfere with any loaded Diluc mods – if you are adding this effect as part of a mod and not separately, you won’t need to include it.
+
+18. Now, there are two ways to we can isolate the shader. The easier of the two is to simply define a custom shader and perform the replacement, then create a `shaderoverride` and only run the custom shader when Diluc is the active character:
+
+```
+[ShaderOverrideDilucFlame]
+hash = 4d4da8a4cbe1149a
+if $ActiveCharacter == 1
+ run = CustomShaderDilucFlame
+endif
+
+[CustomShaderDilucFlame]
+ps = 4d4da8a4cbe1149a-ps_replace.txt
+handling = skip
+drawindexed = auto
+```
+
+This will usually work, but 3dmigoto sometimes does not properly compile the `hlsl` if done this way leading to errors. Also, it will not work with `asm`. But the pros are that the shader can be bundled together in the mod folder with the rest of the mod, and it will not interfere if another mod tries to modify the same shader.
+
+The other method is to pass a custom variable to the shader, and only perform the effect if the variable matches. The next section will go over this in more detail, but essentially you want a section like this for each shader:
+
+```
+[ShaderOverrideDilucFlame]
+hash = 0fa220b5adced192
+x160 = $ActiveCharacter
+```
+
+Then to define a new constant in the shader:
+
+
+
+And only perform the effect if that constant is equal to 1 (e.g. the character is on-screen):
+
+
+
+With this, Diluc keeps the effect:
+
+
+
+While Hu Tao’s are normal:
+
+
+
+In motion (I left a few of the effects red for contrast):
+
+https://user-images.githubusercontent.com/107697535/212006132-08528c9c-2069-451c-9d78-bd1737768bb4.mp4
+
+
+## Passing Custom Values into Shaders (Cycling Colors)
+
+In this section, I will demonstrate how to load custom values from the `.ini` files to shaders, and how you can use this to make effects that cycle between multiple colors. I will also demonstrate how to find the parts of the shader that control emission, something that is more challenging than just effect colors.
+
+This section is medium-advanced difficulty – I will assume you have read most of the previous section, and have at least some basic familiarity with the `.ini` files and shaders (e.g. knowing how to open them, and at least vaguely understand the different parts). Basic programming knowledge will be helpful.
+
+1. Like before, we start by collecting the shader hashes, this time for Zhongli’s pillar:
+
+
+
+Unlike with Diluc, this hash won’t cause the entire pillar to disappear – just the textures. This is because it is drawn using multiple shaders, so even if we skip one parts of the object will still be drawn (in this case, the outline of the pillar remains).
+
+The hash in this case is `4c99fec14dca7797` – press `3` to dump the shader to ShaderFixes.
+
+Our ultimate goal here is to change the color of the yellow geo effect while leaving the other parts the same.
+
+
+
+2. Opening up the shader, we can see it is more complicated than the previous one with 9 inputs and 6 outputs. This is because the shader is responsible for doing multiple things like drawing the texture, handling the emission, calculating shading, etc.
+
+
+
+We start by trying the same method as before – setting each of the outputs to constants to learn about what they control.
+
+3. `o0` appears to have something to do with outlines, making them thicker and thinner (a bit hard to see, but can use `F9` to toggle back and forth between modded and unmodded):
+
+
+
+`o1.xyz` seem to correspond to colors RGB like before, and `w` seems to control brightness
+
+
+
+
+
+`o2` also seems to control color:
+
+
+
+`o3`-`o5` are unclear, but seem to affect the line thickness.
+
+However, you may have noticed an issue – all of these options change the color of the entire pillar, not just the yellow geo line! We have to dig a bit deeper to find where that is handled.
+
+4. Before we go further, let me explain the most important symbols in the shader in more detail:
+
+- `v0`,`v1`,`v2`..etc. are the input data in the vb files that is loaded in – that is to say, data related to things like vertex position, vertex colors (different from texture colors!), uv maps, blendweights, etc.
+- `o0`, `o1`, `o2`… are the output targets, and are what is actually drawn to the screen (or in the case of vertex shaders `VS`, what is passed to the pixel shader `PS`)
+- `t0`, `t1`, `t2`… are the textures – things like dds textures typically, though they can also be buffers in some cases. Whenever you see `ps-t0`, `vs-t0`, `ps-t1`, `vs-t1`, etc. in .ini files this is what they correspond to
+- `r0`, `r1`, `r2`… are the registers – these are temporary variables that the shader uses to store the results of calculations
+- `cb0`, `cb1`, `cb2`… are the constant buffers – these are values passed by the game to the shader that represent values of the current game state like global location of objects or time passed since the game started
+
+With this in mind, we can focus to the part of the code we are interested in instead of trying to understand all 200+ lines.
+
+We are interested in the glow of Zhongli’s pillar. Looking at the textures for the pillar, we can see that the diffuse texture contains the glowing part above the alpha layer and is loaded in slot 0 (is the first hash from the hash.json of the pillar, or by looking in a created mod and seeing the diffuse is loaded as `ps-t0`):
+
+
+
+
+
+Hence, we are interested in any part of the code that involves the variable `t0` which corresponds to the diffuse texture. Specifically, we are most interested in anything that involves the w component, since that is what represents the glowing portion.
+
+5. `t0` is loaded in twice in the shader: once around line 100 into the variable `r2`:
+
+
+
+And once around line 235 into the variable `r0`:
+
+
+
+There are ways to tell which is correct by reading the code, but experimenting with each will also work:
+
+Setting `r2.x` as a constant in the first block:
+
+
+
+Turns the pillar green, but leaves the geo effect normal:
+
+
+
+So we should probably look near the second block instead. The color is most likely represented by a variable with 3 components (one for each color channel), and the nearest one to that block is the `r1` that shows up 3 lines down:
+
+
+
+If we set `r1.x` to 1 here:
+
+
+
+We get:
+
+
+
+Success! This `r1` value is what controls the RGB of the pillar glow (we set the red component to 0).
+
+(Note: this does not mean that `r1` is always responsible for the pillar glow color everywhere in the code, just that it holds the pillar glow at this specific point in time. Register values are reused by the shader when performing calculations, so the “meaning” of what each one represents can change from line to line unlike the inputs and outputs).
+
+This same basic principle can be used in other situations to find what part of the shader controls what output – start with some component you know is tied to whatever you are looking for (such as a texture, or a specific vb value), then search the surrounding shader code and experiment to find it.
+
+6. One color is boring however – what if we could set the color to whatever we wanted? Actually, it is possible to pass custom values from the `.ini` files to the shader.
+
+First, define the variables you want to use near the top of the file under 3dmigoto declarations (180 was chosen arbitrarily, though ideally you should pick numbers over 100 so they don’t accidentally interfere with the ones the game uses)
+
+
+
+Next, we set the R, G and B below the t0 line we found in the previous part
+
+
+
+(NOTE: the `r1` has an `x`,`z` and `w` component not an `x`,`y`, and `z` component. They still correspond to RGB though, just the letters are different)
+
+Finally, in the .ini we are going to set the three values whenever we see the `IB` for the pillar:
+
+
+
+(You can find the pillar `IB` by using numpad `7`/`8` to cycle until you find the one that makes the pillar vanish, or by looking in hash.json):
+
+
+
+Success! We have set the lines to red:
+
+
+
+And we can set them to other colors just by changing the .ini values; this will set them to purple:
+
+
+
+
+
+However, note that this isn’t perfect – we have lost some of the animated effects in exchange for custom colors. I will go over ways to implement animations in the final section of this tutorial.
+
+7. We can still do more with this. One color is great, but what if we could have it automatically cycle between them? 3dmigoto has a special variable called `time` which represents the number of seconds that have passed since the game has started. We can use this to cycle between colors automatically over time:
+
+```
+[TextureOverridePillarIB]
+hash = 34e18b4f
+if time % 3 <= 1
+ x180 = 1
+ y180 = 0
+ z180 = 0
+else if time % 3 <= 2
+ x180 = 0
+ y180 = 1
+ z180 = 0
+else
+ x180 = 0
+ y180 = 0
+ z180 = 1
+endif
+```
+
+What this does is take the current time and puts it into 1 of 3 buckets, then sets the pillar to red, green or blue depending on the current time (cycling every 3 seconds). By changing the numbers you can set it to cycle faster or slower, or add/remove colors, etc.
+
+https://user-images.githubusercontent.com/107697535/212007147-b94b5eda-ca1d-40ee-938e-25d5e7b1f913.mp4
+
+8. Finally, similar to before we can load the shader in the `.ini` instead of putting it in shaderfixes:
+
+```
+[TextureOverridePillarIB]
+hash = 34e18b4f
+run = CustomShaderPillarColor
+
+[CustomShaderPillarColor]
+if time % 3 <= 1
+ x180 = 1
+ y180 = 0
+ z180 = 0
+else if time % 3 <= 2
+ x180 = 0
+ y180 = 1
+ z180 = 0
+else
+ x180 = 0
+ y180 = 0
+ z180 = 1
+endif
+ps = 4c99fec14dca7797-ps_replace.txt
+handling = skip
+drawindexed = auto
+```
+
+This will mostly work, but there is an glitch in the compilation here that will cause the pillar to leave a residue for ~1 second after disappearing:
+
+
+
+It is also possible to restrict this shader specifically to when Zhongli is on-field, though in this case I don’t know of any other object that shares this shader so it isn’t as important as it was for Diluc’s flames.
+
+
+## Animated Effects
+
+In this final section, I will demonstrate how we can use the principles from the previous two sections to create simple animated effects – I will be going through the process of creating the animated lines in cyber bodysuit raiden (https://gamebanana.com/mods/420434). This section is advanced – I will be assuming you understand the previous two sections, know how to make mods, as well as have some basic programming knowledge.
+
+1. To start, we find the shader that controls drawing the textures on Raiden Shogun:
+
+
+
+Raiden actually uses at least two – one for the body object and one for the dress object – but we are interested in the body object since that is the one that has the emission effect we need (found through trial and error previously)
+
+The hash is `7d2763cf91813333`, and we dump it to ShaderFixes.
+
+2. Now, we look for the part of the shader responsible for emission. The emission is above the alpha layer on the diffuse texture which is in slot 0, so we are looking for things related to `t0.w`. There is only one relevant line in the shader:
+
+
+
+And testing it, we find it is responsible for the glow:
+
+
+
+
+
+And we can modify the glowing portions of her texture only by adding a conditional that only triggers on pixels that have an alpha value greater than some arbitrary number:
+
+
+
+
+
+3. Now, I am going to demonstrate the process of adding lines to my cyber bodysuit raiden mod:
+
+
+
+First, I draw the lines:
+
+
+
+I did this through the Blender texture painting tab, but you could also paint directly on to the texture using paint.net\/photoshop. Note that the final output has to be `BC7 SRGB` `dds` for the diffuse texture. Also, don’t be like me – paint these on a separate layer so you can easily separate them out later ;-;.
+
+4. The final texture looks like this after moving the lines above the alpha layer (note: it is wide because I merged a few models together and put their textures side-by-side):
+
+
+
+Which gives us glowing lines in-game
+
+
+
+5. Now, time to implement some basic animations. I separate out the lines from the diffuse texture into another empty texture which I am going to call the “control” texture:
+
+
+
+This texture will essentially be what we are going to use to tell the shader which parts of the texture will have animated effects (since all four channels of the diffuse/lightmap are already in-use). The type for this texture should be `BC7 Linear`, since we want the color values to be evenly spaced.
+
+I have also recolored it to black for simplicity – we won’t be using specific colors in this example to keep things simpler, so we set all the color channels equal; if you wanted, you could use each color channel to control different things. Make sure the color is greater than 0 though, since we want to be able to differentiate it from the background without relying on the alpha channel.
+
+Note that I have removed the lines from the original diffuse texture now, so we are back to vanilla bodysuit:
+
+
+
+6. Next, we add a section into the `BodyOverride` in the `.ini` of the mod to pass the new texture to the shader:
+
+```
+[TextureOverrideRaidenShogunBody]
+hash = 428c56cd
+match_first_index = 17769
+ib = ResourceRaidenShogunBodyIBZipped
+ps-t0 = ResourceRaidenShogunBodyDiffuseRed
+ps-t1 = ResourceRaidenShogunBodyLightMap
+ps-t26 = ResourceRaidenShogunBodyControl
+
+[ResourceRaidenShogunBodyControl]
+filename = RaidenShogunBodyControl.dds
+```
+
+I chose to load it into slot 26 arbitrarily – I don’t recommend going lower than 20, since I’ve seen a few cases where they go up that high (vast majority of things use <10, and it’s rare that anything above 5 is important).
+
+7. We also need to add the variable in to the shader near the top:
+
+
+
+We can now load this texture in a similar way to how we load the other textures:
+
+`r2.xyzw = t26.SampleBias(s0_s, v2.xy, r0.x).xyzw;`
+
+(If you are wondering how we got this line, it was from looking at how the `t0` and `t1` textures are loaded in and mimicking the format. I chose `r2` since I know it will be replaced by whatever we load in from the diffuse, so it won’t end up breaking any other lines of code – another option would be to create an additional register variable).
+
+8. Now, we can add a conditional that only triggers on pixels of the control texture that have a red channel value greater than 0. When we see that, we set the pixel color to green; otherwise, we simply load the pixel value from the original diffuse texture:
+
+```
+ r2.xyzw = t26.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ if (r2.x > 0){
+ r2.xyz = float3(0,1,0);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+(Note: I’m being a bit lazy setting the values here since they should be normalized but it won’t make too much of a difference).
+
+Which leads us back to our original starting point:
+
+
+
+However, there is now one key difference – the line colors and locations are being fully controlled through the control texture and shader calculations, and not being read from the original texture.
+
+This lets us easily change the color just by changing the value of `r2.xyz = float3(R,G,B)`;
+
+
+
+
+
+Or even set them in the `.ini` like we did in the previous section. We can even make them cycle between colors using this as well!
+
+9. Now that the lines are being controlled through the shader and control texture, we have a lot more flexibility in what we can do. Let’s start by animating them. Instead of using a constant black across all the control texture lines, I am going to use a gradient from black to white:
+
+
+
+Now, the value of `r2.x` will linearly increase from 0 to 1 as you travel down the lines (this is why we saved as `BC7 linear` – otherwise, the values would be skewed leading to issues). We can then pass the time variable from the `.ini` into the shader:
+
+```
+[TextureOverrideRaidenShogunBody]
+hash = 428c56cd
+match_first_index = 17769
+ib = ResourceRaidenShogunBodyIBZipped
+ps-t0 = ResourceRaidenShogunBodyDiffuseRed
+ps-t1 = ResourceRaidenShogunBodyLightMap
+ps-t26 = ResourceRaidenShogunBodyControl
+x180 = time
+```
+
+Define a new variable in the shader:
+
+`#define TIME IniParams[180].x`
+
+Now, we can compare the value of `r2.x` to `TIME` to figure out what part of the model we want to draw. `r2.x` is in the range 0 to 1, so we need to shift the `TIME` into this range as well – we can divide `TIME` into repeating buckets using the modulo operator, then divide by the max value to put into the range 0 to 1. So the equation would be `TIME%2/2` to have it cycle between 0 and 1 every two seconds.
+
+```
+if (r2.x > TIME%2/2){
+ r2.xyz = float3(0,1,0);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+
+Result:
+
+https://user-images.githubusercontent.com/107697535/212007218-4d9aea37-e98a-4a6c-8098-f5e9bcb2bada.mp4
+
+Alternatively, to change the direction we can use `1- TIME%2/2` instead:
+
+```
+ if (r2.x > 1-TIME%2/2){
+ r2.xyz = float3(0,1,0);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+
+https://user-images.githubusercontent.com/107697535/212006027-a20bf56e-7b36-43f9-bfd3-91e0e286e863.mp4
+
+10. The result of this isn’t bad, but it isn’t quite what I was looking for – I don’t like how the lines gradually appear/disappear, and I was hoping for a more “matrix-like” effect where the line travels along the body.
+
+Instead of using a single condition, we can define a range where the lines will appear. This will only allow values that are at most 0.2 away of `TIME%2/2`:
+
+```
+ r2.xyzw = t26.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ if (r2.x > TIME%2/2 && r2.x < TIME%2/2+0.2){
+ r2.xyz = float3(0,1,0);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+
+https://user-images.githubusercontent.com/107697535/212007252-4550a581-3ef7-48ed-865c-f3c516361224.mp4
+
+Much better, but it moves a bit fast. Also, the lines still appear all at once at the start of the cycle, making the starting and stopping points obvious. The final equation I settled on was:
+
+```
+ if (r2.x > 0 && (TIME % 3)/2.5 > r2.x && (TIME % 3)/2.5-0.2 < r2.x){
+ r2.xyz = float3(0,1,0);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+
+https://user-images.githubusercontent.com/107697535/212007300-9ef429fc-14ae-4057-8c35-90ebc53476e8.mp4
+
+This loops every 3 seconds, and we actually put the time into the range 0 to 1.2 instead of 0 to 1 by dividing by 2.5 instead of 3 – the extra 0.2 side lets the lines gradually appear and disappear at the end of the cycle.
+
+11. Now, lets add some more cool effects. We are just using a constant color green, but we don’t have to – we can use math to make the colors cycle. Explaining how this works is beyond the scope of this tutorial, but basically we are using out of sync sine waves to travel around the color wheel. For more details, look here: https://krazydad.com/tutorials/makecolors.php
+
+```
+if (r2.x > 0 && (TIME % 3)/2.5 > r2.x && (TIME % 3)/2.5-0.2 < r2.x){
+ r2.xyz = float3((sin(TIME)+1)/2, (sin(TIME+2)+1)/2, (sin(TIME+4)+1)/2);
+ r2.w = 0.6;
+ }
+ else{
+ r2.xyzw = t0.SampleBias(s0_s, v2.xy, r0.x).xyzw;
+ }
+```
+
+https://user-images.githubusercontent.com/107697535/212008474-dd57332e-6b00-4fef-9d95-b9b585dd37e5.mp4
+
+12. At this point, I have mostly finished explaining how to create the effect. The actual cyber Raiden mod also has some additional toggles to turn the effects on and off, to limit them to while Raiden is on-screen and to let the user choose custom colors but all of those have already been covered in previous sections.
+
+The only additional thing I would note is that you aren’t just limited to using colors with this technique – instead of setting `r2` to be a constant color, you could instead use this to pick and choose between different textures. You can also use the separate channels on the control texture for different effects, or use different variables for toggles – the possibilities are limitless! (not really, but you can still do a lot!)
+
+13. While we are mostly done, I will point out some issues:
+
+- The lines don’t appear for ~1-2 seconds after character swap. This is because characters actually use a different shader when they are loading into the game for a few seconds – you can hunt down this shader and replace it as well to remove this issue
+- Reflections don’t have the lines. This is also because the reflections use a different shader, and can be fixed by also hunting down and replacing the shader.
+
+
+
+- The transparency filter is applied. While this isn’t an error, it means that someone using the remove transparency filter mod will have that one overwritten for Raiden. If you want to fix this, do a dif on the shader file with the one from remove transparency filter to see what the differences are and apply them to your file
+
+
+
+- Some characters break while Raiden is on screen for a moment when using the party menu. I don’t actually know why this happens – the part that breaks doesn’t even use the same shader and I couldn’t seem to isolate the issue. If anyone knows, please send me a message
+
+
+
+- The rainbow color effect is cool but isn’t 100% mathematically sound – the diffuse texture uses an `SRGB` color space not a `linear` one, which means you would need an additional step to convert the colors (you can see that the lines don’t ever turn fully red/green/blue as you would expect). See something like https://lettier.github.io/3d-game-shaders-for-beginners/gamma-correction.html for details
+
+- Shaders can change hashes between versions, and tend to do so more commonly than character hashes so you may need to update effect mods more often than character ones.
+
+If you have reached this point, congratulations! You know the majority of the basics of how shaders can be used to change effects or even make custom ones. Thank you for reading, and I look forward to seeing what you create!
+
+https://user-images.githubusercontent.com/107697535/212008927-9afe13ef-28ff-49b6-804e-847aa039daff.mp4
\ No newline at end of file
diff --git a/guides/basics/textures-101.md b/guides/basics/textures-101.md
new file mode 100644
index 0000000..60deab7
--- /dev/null
+++ b/guides/basics/textures-101.md
@@ -0,0 +1,199 @@
+# 3DMigoto GIMI Texture Modding Tutorial
+
+> Writen by: [SilentNightSound](https://github.com/SilentNightSound)
+
+This tutorial will go through the process of modding GI’s textures.
+
+This is useful if you want to change things like UI elements or banners (since many icons are drawn using the same vb/ib, meaning the GIMI plugins can’t be used to create mods) or just want to change a texture without making a full mod (e.g. wanting to change the color on an object or weapon but do not want to change the shape).
+
+This tutorial will walk through two examples of texture modding: modding a wish banner and modding a character glider. Modding textures is slightly more difficult than making basic mesh edits, but much easier than importing custom models.
+
+## Prerequisites
+
+Have the 3dmigoto GIMI Dev version installed, and setup either paint.net or photoshop to be able to open dds files (see Mona Hat tutorial for details).
+
+I also strongly recommend having no mods active in Mods and no shaders in ShaderFixes as well since that can sometimes mess with the process.
+
+## Important Note
+
+By default, the dev version of 3dmigoto is setup to dump ALL textures and buffers whenever you press F8, caused by this line in the d3dx.ini:
+
+
+
+This will often result in massive (5-10 GB+) frame dumps – I strongly recommend commenting this line out like so:
+
+
+
+And instead using [ShaderOverride] sections to specify what you are looking for when doing frame dumps. If space and time aren’t a concern however, or you are unable to find the shader that corresponds to the object you are looking for, uncommenting this and doing a full dump will still work.
+
+## Wish Banner
+
+1. The first step in modding textures is to hunt for the texture and its hash in-game. Make sure you are using the dev version and have the green text on the top and bottom, then go to the wish screen:
+
+
+
+2. We press 1 and 2 on the numpad to cycle through the PS (pixel shaders) – we are looking for the shaders that causes the banner textures to disappear. Once you have found them, press 3 on the numpad to copy the hash
+
+ In this case, the hashes we are looking for are: `000d2ce199e12697` (which draws the characters on the banner, the banner background, the icons on the top, the scroll bar and some of the text)
+
+
+
+ And `dcf5ad8be031c5fc` (which draws the card backgrounds, icons and the remaining text)
+
+
+
+ These are the hashes for version 3.2 of GI – while it is rare, sometimes shader hashes can change between versions.
+
+3. Once we have these hashes, create an Banner.ini file (can be any name as long as extension is .ini) somewhere in the Mods folder with the following text:
+
+ ```ini
+ [ShaderOverrideBanner1]
+ hash = 000d2ce199e12697
+ analyse_options = dump_rt dump_tex dump_cb dump_vb dump_ib buf txt dds
+
+ [ShaderOverrideBanner2]
+ hash = dcf5ad8be031c5fc
+ analyse_options = dump_rt dump_tex dump_cb dump_vb dump_ib buf txt dds
+ ```
+
+4. Press F10 in-game to reload changes. What the .ini file we just created will do is tell 3dmigoto what files to dump during a frame analysis – if you were unable to find the shader hashes (because the texture is only on-screen for a second for example), doing a full dump instead by uncommenting the line in d3dx.ini is an alternative.
+
+5. Now, while still remaining on the wish screen press F8 – this performs a Frame Analysis dump, which dumps all the buffers and textures to the 3dmigoto folder, one that is named something like FrameAnalysis-YYYY-MM-DD-HHMMSS
+
+
+
+
+
+ If the folder is empty or only contains a log.txt and ShaderUsage.txt, make sure you have created and saved the .ini in the correct location, have pressed F10 to reload, and are on the screen with the texture you are looking for.
+
+6. Once we have the folder, we can hunt through it looking for the textures we need. You can either look through the main folder which has the files sorted by draw ID (the string of 6 digits at the beginning of filenames which represents the order the textures are drawn in), or in the deduped folder which contains all the files but de-duplicated.
+
+ TIP: It can be helpful to have your dds editing software set to the default for opening .dds files, since it will let you see previews in Windows explorer.
+
+7. After a bit of searching, we can find the textures we are looking for:
+
+ Card background (filenames were `000059-ps-t0=93073271-vs=8236b1752acd9b01-ps=dcf5ad8be031c5fc.dds` in the main folder and `93073271-BC7_UNORM.dds` in deduped – the draw ID may be different for you):
+
+
+
+ Nahida (`000067-ps-t0=70a940c8-vs=28a248a16fa16289-ps=000d2ce199e12697.dds`, `70a940c8-BC7_UNORM.dds`):
+
+
+
+ The side characters (`000069-ps-t0=ad520043-vs=28a248a16fa16289-ps=000d2ce199e12697.dds`, `ad520043-BC7_UNORM.dds`)
+
+
+
+ Tip: the o0 files show what is being drawn that ID, so you can use them to narrow down your search
+
+ There are a couple of other related textures as well, but for now we will focus on these three. Also note that changing text using 3dmigoto is very difficult unless that text is an icon (which it is not in this case).
+
+8. Now we have the textures, we can get their hashes from their filenames.
+
+9. For the files in the main folder, the structure is DrawID–BufferType–Hash–ShaderType-ShaderHash.Extension – for example, the card is `000059-ps-t0=93073271-vs=8236b1752acd9b01-ps=dcf5ad8be031c5fc.dds` which means it has a DrawID of `000059`, is a `ps-t0` buffer, has a hash of `93073271`, and is used by the vertex shader `8236b1752acd9b01` and pixel shader `dcf5ad8be031c5fc`
+
+ For files in deduped, the structure is Hash – FileType. For the card the name is `93073271-BC7_UNORM.dds`, which is a hash of `93073271` and a type of `BC7_UNORM`.
+
+ The most important information is the hash and type, since that is what we will be using – so in this case it is `93073271` and `BC7_UNORM` for the card, `70a940c8` and `BC7_UNORM` for Nahida and `ad520043` and `BC7_UNORM` for the 4 star characters.
+
+10. Add the following lines to the Banner.ini:
+
+ ```ini
+ [TextureOverrideDendroBannerCard]
+ hash = 93073271
+ this = ResourceDendroBannerCard
+
+ [TextureOverrideBannerNahidaBanner]
+ hash = 70a940c8
+ this = ResourceNahidaBanner
+
+ [TextureOverrideNahida4StarBanner]
+ hash = ad520043
+ this = ResourceNahida4StarBanner
+
+ [ResourceDendroBannerCard]
+ filename = DendroBannerCard.dds
+
+ [ResourceNahidaBanner]
+ filename = NahidaBanner.dds
+
+ [ResourceNahida4StarBanner]
+ filename = Nahida4StarBanner.dds
+ ```
+
+ What these lines tell the program to do is whenever it sees the hash of the texture in-game, it replaces it with a new texture (`DendroBannerCard.dds`, `NahidaBanner.dds`, and `Nahida4StarBanner.dds` respectively).
+
+11. Now, lets create those textures and add them to the same folder as the Banner.ini. Note that all 3 textures have `BC7_UNORM` as their type, which corresponds to `BC7 Linear`
+
+ For the banner, I’ll give it a recolor and save it as `DendroBannerCard.dds` (details on how to open and save dds files in the [Mona Hat Removal](./mona-hat.md) tutorial)
+
+
+
+ For Nahida, I’ll replace the texture with a jade eye cat – to get the size right, I make sure to compare to the original (has a size of 2048x1024, and the original is stored upside down):
+
+
+
+Finally, for the 4star characters I’ll add the true star of the banner (note this texture has a weird 560x512 size):
+
+
+
+12. Putting those 3 files into the same folder as the .ini and pressing F10 in game results in the following:
+
+
+
+Success! First texture mod completed.
+
+(If nothing happened after pressing F10, make sure you put the text in the .ini, the new dds images with the correct names in the same folder as the .ini, and no error messages popped up on screen)
+
+(One other possibility is that the game is not checking for textures on that specific shader for whatever reason – try emptying out the ShaderFixes folder, and adding the line `checktextureoverride = ps-tx` where `ps-tx` is the original buffer of the texture (in this case, `ps-t0`) to the ShaderOverride sections to force 3dmigoto to check for textures on that shader)
+
+## Gliders
+
+For another demonstration, let’s replace the textures on wing gliders. Unlike UI elements gliders do actually have a model (though it looks like a flat rectangle) so we can use the GIMI tools to make mods, but every single glider shares the same mesh. If we want to only mod one glider, we need to be more precise in what exactly we are replacing.
+
+1. Similar to before, find the PS hash that draws the wings. We can pause while gliding in the overworld, and cycle through them with 1/2 on the numpad like before
+
+
+
+ In this case, the hash is `f8143fa00dc241fe` (note that there are other shaders that cause the wings to disappear along with chunks of the environment, but we want to look for the one that is most unique to the wings):
+
+
+
+2. We put the following lines an ini file (e.g. wings.ini) in the Mod folder:
+
+ ```ini
+ [ShaderOverrideGlider]
+ hash = f8143fa00dc241fe
+ analyse_options = dump_rt dump_tex dump_cb dump_vb dump_ib buf txt dds
+ ```
+
+3. And press F10 to reload, followed by F8 to perform the frame dump.
+
+4. Searching through the files, we can find the wings (`000081-ps-t0=d27db883-vs=7494a6d4010b8dec-ps=f8143fa00dc241fe.dd` or `d27db883-BC7_UNORM_SRGB.dds`).
+
+
+
+5. And replace them with something else (NOTE: we can see from the filename that the type is `BC7_UNORM_SRGB` now, which means these are stored as BC7 SRGB instead of Linear).
+
+
+
+6. We create the texture overrides and resources like so in a .ini:
+
+ ```ini
+ [ShaderOverrideGlider]
+ hash = f8143fa00dc241fe
+ analyse_options = dump_rt dump_tex dump_cb dump_vb dump_ib buf txt dds
+
+ [TextureOverrideFirstFlight]
+ hash = d27db883
+ this = ResourceFirstFlight
+
+ [ResourceFirstFlight]
+ filename = WingsOfFirstFlight.dds
+ ```
+
+7. And press F10 to reload in-game:
+
+
+
+
diff --git a/guides/blender/blender-baking.md b/guides/blender/blender-baking.md
new file mode 100644
index 0000000..a07c52e
--- /dev/null
+++ b/guides/blender/blender-baking.md
@@ -0,0 +1,75 @@
+# Blender Materials and Baking
+
+This is an introduction to the blender UI. Please note that for more detailed information, you will need to look at the documentation or watch guides.
+
+## Table of Contents
+
+[[toc]]
+
+## Documentation and Note
+
+This page covers the basics of materials and baking.
+
+For materials, you can find the documentation here:
+https://docs.blender.org/manual/en/latest/render/materials/index.html
+
+For Baking, you can find the documentation here:
+https://docs.blender.org/manual/en/latest/render/cycles/baking.html
+
+For far more accurate GI/HSR/WW/ZZZ materials than those shown in the guides here, please take a look at the [Omatsuri Discord](https://discord.com/invite/omatsuri-894925535870865498).
+
+## Material Introduction
+
+In Blender, materials allow the user to use shaders, combined with textures, to preview a model. This can be useful for modding, as it allows the modder to preview their textures.
+
+This is a fairly basic blender material:
+
+
+
+Any node in blender, as well as any function, can be accessed by using the `F3` key and typing it in.
+
+### The Principled BSDF Node
+
+This node is the basic shader that will always be created with a default material in blender. It is vital for previews, and will be used in virtually all examples.
+
+Below are the important settings to remember in a PPrincipled BSDF:
+- `Base Color`: The base color of the shader. This is where a diffuse texture would be connected.
+- `Metallic`: How metallic the material is. For lightmaps, the Metallic channel would be connected here.
+- `Roughness`: How rough, or glossy, the material is. For lightmaps, the gloss map would be connected here.
+- `Normal`: The normal value of the material. Normal maps should be connected here.
+
+In most cases for a proper material, the shader should be the last node connected to the `Material Output` node, as it is the output node that Blender displays in the viewport.
+
+### Image Node and Image layers
+
+The image node in this image are the `Shadow Layer` and `barghestsword2.png` nodes, with an orange header.
+
+The only non-standard part of the image is the `Mix` node. Blender, by default, does not have layers for images like photoshop or other image editing softwares This can be overcome with plugins or nodes, as seen in this image. Below is a step by step guide on how to layer images:
+- Create the base image.
+- Create a blank (white (A), or empty (B)) image.
+- Press F3 and enter 'Multiply'. **NOTE:** Multiply acts like multiply in photoshop. For other layer blends, choose the alternative you want.
+- Select `Mix Color - Multiply`. This will create a new node.
+- Depending on what you do in step 2, do the following:
+ - A: Connect the base image into the the A input, and the top layer into the B input.
+ - B: Do A, then connect the Alpha of the top layer to the Factor.
+- Connect the result into the next node. If you want more layers, connect it into the A of the next `Mix` node, otherwise connect it into the shader node's base color.
+
+If you want to bring all the layers together, you can **bake** the texture. View the Baking section below.
+
+## Baking
+
+To bake a texture, do as follows:
+- Set up your scene, including the lighting, in Blender.
+- In `Render Properties`, ensure the Cycles Render Engine is selected.
+ - To ensure a quick bake, it is strongly recommended to set your device to cycles.
+- In `Sampling` > `Render`, ensure that Denoise is disabled and that max samples is set somewhere between 256-512 samples. The default 4096 is far more than necessary.
+- In `Bake`, ensure the `Bake Type` setting is set to 'Combined' and the `View From` setting is set to 'Above Surface', and that all lighting influences are on.
+- Make sure all nodes are properly connected.
+ - **NOTE**: To bake the layers of a texture, if you do not want the material's shading to affect the textures, simply connect the output of the last `Mix` node to the Material Output.
+- Create a new `Image` node and create an image (Preferably the same size as the base texture).
+- Select the image node (it should be highlighted in white).
+- Bake!
+- Save the texture.
+
+Here is an example of a material that is about to be baked. Please note that the shader is also being baked into the texture here:
+
\ No newline at end of file
diff --git a/guides/blender/blender-edit.md b/guides/blender/blender-edit.md
new file mode 100644
index 0000000..5790023
--- /dev/null
+++ b/guides/blender/blender-edit.md
@@ -0,0 +1,194 @@
+# 3D Modeling tips
+
+> Written by [Anilyan](https://anilyan.ccard.co)
+
+These are mostly beginner tips. It’s fairly important that you have a basic notion of how to navigate in blender. This is about Modeling, so Texture and UV-related tips will not be covered.
+
+Many of these tips are only applicable in a specific mode \- either Object Mode, Sculpt Mode, or Edit Mode. To go into **Edit Mode** (shortcut Tab or go there manually through the dropdown menu with the modes).
+
+![][image1]
+
+## Table of Contents
+
+[[toc]]
+
+## Documentation
+
+For more advanced documentation on edit mode, please see:
+https://docs.blender.org/manual/en/latest/modeling/index.html
+
+## Cleaning up loose vertices
+
+Do this right after importing your model, for each element in the sidebar.
+
+Right beside the Mode selection, you can see these 3 icons depicting a cube with different parts highlighted. They represent Vertex select, Edge select, and Face select, respectively. **Select Vertex**.
+
+You can see a bunch of messy dots that don’t belong to the part you have selected. To get rid of that, go into **Mesh » Clean Up » Delete Loose**
+
+**![][image2]**
+
+## Convert triangular faces into squares
+
+**Face Mode » A to select all » Right click » Tris to Quads** will convert the triangulated faces back into squares. Keep in mind that you should also check these options to avoid ruining the UV Mapping
+
+With this, you will be able to select loops and do other stuff more easily.
+
+![][image3]
+
+## Separating elements or faces
+
+There are 3 situations:
+
+1\) You want to select specific parts of the model to separate them. You will say tips for manual selection next. Once that is done, you hit **P » By Selection**. A new element will appear in the Scene Collection.
+
+2\) Maybe your object has multiple Materials, or you joined 2 elements in the scene collection that use different materials, worked on them, but then you realize you need to separate them again for any reason, like adjusting the UVs. In that case, **A to select All » P » By Material.**
+
+3\) Separate anything not connected: **A to select All » P » Separate by Loose Parts**
+
+**![][image4]**
+
+**![][image5]**
+
+## See both sides of the model
+
+This icon here lets you see both sides of the model. Especially useful if you are trying to delete a vertex and you notice that Genshin, due to not having faces linked, has more than one vertex in the same place. And useful too if you want to select things on either side of the model, ofc
+
+**![][image6]**
+
+## Extend or subtract existing selection
+
+These icons let you determine if selecting something will replace, add, subtract, etc… to the things you already selected. You can also press Shift to add to an existing selection while in the first mode.
+
+You can also keep the default and, as yu select more faces, **hold down Shift to extend** the selection or **hold Ctrl to subtract**.
+
+**![][image7]**
+
+## Merge by distance
+
+Select anything you want in edit mode, then hit **M » By Distance** » choose a small value like 0.0001
+
+You can also choose a different option (like Merge at Center).
+
+**Uses:** Many types of selection require linked faces, that not all models have, so this will link adjacent faces/edges or overlapping vertexes. It can also be used to close certain holes or fix vertices you accidentally separated.
+
+**Downsides:** If you merge more things than what you need, it might be troublesome to separate them again. You might also end up ruining the face Normals/shading \- since the reason faces of the same part of a model are separated by default is to allow each subsection to have normals facing a different direction. However, you can somewhat restore that later by adding sharp edges or separating some faces again \- check the shadows section.
+
+## Select linked faces
+
+Ctrl+L (after selecting something in edit mode): Lets you select all linked faces/edges/vertexes.
+
+You can also choose if you want parts linked by the UVs (share the same area in the UV Mapping), Seam, Sharp (if you have seams or sharp edges), or more. Useful if you have merged vertices but have one of those things facilitating the separation.
+
+![][image8]
+
+## Select path between 2 faces/edges/vertexes
+
+**Selecting one vertex/edge/face, holding down Ctrl, then selecting another vertex/edge/face** that is not directly connected but is within the same linked area, will select the whole pathway connecting them.
+
+If that is not working, there are probably separated faces that are stopping the connection. You might want to consider merging by distance, like taught above.
+
+![][image9]
+
+## Select a loop
+
+**Alt+L \+ select:** Select Edge Loop. This only works if you are working with Quads/squares instead of Triangles.
+
+If that is not working, there are probably separated faces that are stopping the connection. You might want to consider merging by distance, like taught above.
+
+![][image10]
+
+## Select based on UVs
+
+(also useful when doing textures)
+
+While I’ve shown above how you can select a given UV area with Ctrl+L, you can also be more precise in the UV mapping tab. To see what is mapped to what part of the texture, and select what you want.
+
+It's **bi-directional, depending if you have these arrows selected** (icon circled on top of the screen):
+
+* (pic 1\) off, by selecting on the model, you see the selection on the map
+* (pic 2\) on, by selecting on the image you see it on the model
+
+![][image11]
+
+![][image12]
+
+## Positioning an element
+
+If you know how to navigate blender, then you will at least know how to use, in Edit Mode and Object Mode, for vertices and objects, **G to Grab an object, R to rotate it, S to scale it**, and how to do so along only one axis if that’s what you want (for example, GZ will only move an object along the Z axis n the 3D space)
+
+You will notice that, especially when you scale and rotate an object, it does not rotate around itself but rather around the center of the 3D space. To **manipulate an object around itself, you right click» Set Origin » Origin to Geometry**.
+
+Pictures of skirt scaled with default origin VS origin to geometry. In the 1st case, the skirt flew up:
+
+![][image13]
+
+### Proportional Editing
+
+You can use Proportional Editing and scale the affected area to move/rotate/scale several vertexes at once \- the further away from the center of the area, the less affected things are. The areas affected and unaffected by the transformations are changed gradually / the strength transitions.
+
+The result has similarities with using Sculpt tools, but some things are easier to do like this, especially rotating or curving certain objects.
+
+![][image14]
+
+### Brushes beginner-friendly \- Sculpt Mode
+
+**Note:** Don’t forget to turn on mirror if you want the changes you make to be reflected on both sides.
+
+**Note 2:** You can press down F and drag the mouse to scale the brush
+
+![][image16]
+
+In Sculpt Mode, you can use some brushes to fine-tune the shape. That said… **Grab (shortcut G) is the best friend of beginners**. Other plausible brushes are the Elastic Deform and other yellow brushes.
+
+Due to some faces not being linked (and beginners are prone to merge more than they should so I don’t advise that either), using brushes like Inflate results in vertices separating like this:
+
+![][image17]
+
+## See and fix backfaces
+
+(this mostly matters for textures, which I won’t cover here, but can affect other properties so I decided to still talk about it)
+
+First of all, what are backfaces? They are faces that appear in Red in this mode, and will not typically display texture. You can’t have both sides of a face as blue. Make sure to **reset transforms** of your model when checking this, because otherwise the information/colors displayed might be wrong.
+
+![][image18]
+
+Sometimes, when putting a model together, or mirroring things, you end up accidentally inverting the normals and indicating to blender that the outside faces are actually backfaces. That is easy to fix. Go into **Edit Mode » Select those faces » Alt+N » Flip**. If you forget the shortcut, you can find the Normals menu under Mesh on top of Edit Mode \- and from there, you can also try the option t **Recalculate outside**.
+
+![][image19]
+
+
+[image1]: CVr3Ode<64A;ziq@lKp}IhB(0AFH2LS zM}SAqG^rdCc1!}UEM1WY{K zt$5@(^_V`Lp_2;QAW=9X2oPsk6UDVIz;`&&i-n8pdZa{QTJz*xR-8Jt2tgScRuR2N z2d%AzK|N25$2vE#yZ2nOtU&Y5EL~Lun7tNn>bo=Th~V GcFiCjQ0#{YgOF{=UDsaW`?g3rnHc{GgJi)m|0paqZ zx9%|Y?%R;#(7{fDy)4%|5Ua|*`aIREYQ85Zc1A9iqcF+mCztZl#9Ot$rRFoXvHWOs zSHF)Q1Pe^i6|ru36ur~ndD(#e_^eG4c$|(3RHpw*#oDqPPJv^gXKlqyn#FHzW&Z0s zhjYfhqt9?4F^=j7G` -{sWqz)4kAtgjV02o#kPw z;q;xKipC*t`1kK0Egj>grMS$J#f=v(T*x0uiF98P6c(n=)bV393;4UG+jo37xq_Bv zvw)UA+C|3Ob$bHlySVb=J`Je@qEMKlERkmD>bi&1>ci(w5mUVy2eF+y%hNMUeCzqo z*${B{?!KH8AI@>N=?23dvs@!_b|N4UrVHF(m0dmR-v72iMI$g!1-g$o2jx}Hd4aNg zb_!}H-f%7%>)zC)z=~p@-_xCL4I6mlWcOhKhrkB%$Hn-M4_JTU#>RjA_%Q_lcO}v6 zaJ0!ODeHkk>>IPsWi{3bEa$p`kkssmH@*r=DQ;58M(9JfRV|S;X57mXmAoqYoVTf{ zn11uN=2dj3C1o7?fv5_u&e)k)Mk@w1i4R}C>`UOSs6Dm^4HUAtn!5Vcz5<6VqUIGA zo}ITHff)fEOK8uD_nd(lP=#cRZ7<;(SXzGL{G6y{sJuTJtuE{AYa%Wz2%su;xa;jx z@)$eW*m9od0e9Zj&rdX4-^elZOMEDsTss@Owq(y*nClQ4`zW82vPhU#Negw8)J(~7 zW(|FcSgk9rbH9X|xN3^!PDCC}pPrlVkoFo{Cwg>JmD;Xl&&JEY7GCT$&+E`XbLM(Q zg*s^V(fOU?;#DuyS7t|VeP@(C)9jdMRTaJo;?#jm)Av=90a{U<>mcT<1S~ErZ}bLK zA;LW9%(cGCFdE*6XI`HsYeG~~lKGM=ZSBAe@$vxV=;hVg9P?;awzC{nQ(M=ZX%;J> z5lWTQGn&=kZCBWzzGI1nW6RZ!8h0uyhEx0amTi8hbt?RoyM210 Nl z+}yXogeN)+z7N+4?7?zwEeY^DF84_xB86y=gUr10mqA%02SO|R4gdy7pZ~zZz_o`8 zJ+pabL=e>oxQ-xG@(Uu{<@InvqgHeuxr~p$&Ofin%j7=#Z3Bmi`z8W(A#p4v9D|kF zdzD_IEX$(OxqJi1HrROaPP0AHDLR|ay!Z8Z9d~dfPUE@GLr-1dFz5W}<-$AuD=(q5 z5n+hWXK)i~{pL}9H?{c6pTw#}&`TCer5PIh7{A2vy*qO&50BWl<_wcabTjxWW9O6i zmGK8H3y8=mUb}WJcZz`$9EbfROR~x3=%}bFh#k1m#9PTdTU{oGegU*q$mH>5UyC_R zC+~^u+ALIS Kil(}snBn`^HqZaNAV;?mZxY-m# zHX~3G4FUl8qEwBP&+K_3_n_2Q12JXz=@n{2#DF++4L3YIhh8F|0_qv@7uYn{S$$5e zw@C_M=ZmFj*gv0ePg?%MN46aMw#}Kvvl~r)M|UvrDH|=HIG}&~vdTWqSEt2JXBc0{ zy>}mP)~QOiX?TR1#_~(vAjdGqTbZvD_ujT8V{5n1@Ydqx*-x}|bmeGEfH2u80%RBB zs3 5T z{vx^wWw-&2*;ZNy5BWO1(Rr|!4g~}3k-FP^fRTYy>N11uZ4}^`!NK!5P;;~`;IzU3 zIx7Y+zykou9xMGs*8O-#Y=+zkAt6duVeJF>ch#$hCgWB+uKzkV_DvU5FlBYI5l!Il z5%Gwt2?@Mil5E6Z!SWlS4ljkQQl?e$5TStOQwjl#d;4Keygny~=B!cA^Z=!EVQczS zM;^0WkG~8y=`WcnTI
L>KK^5uUUs_FZf(tT;#XOk zkP(eoAOGnZq0LscF 3#aNDm60+g(^Y!mTOU$hwr!l+4*(%-<+@8T>R(T zv9y;j)lZ&e%P9EC{og|FyT(D*FP4sE|KCo0#JxQiHsY8>(iLo8HGC+4pP5-EcT8qx z@XLFbfe)TpMx2ila@ixBU&Lup^yYo3oo-9ne}FacF0IvpmL{XlphVw*?^`T`t1E8s z@-tyI*mX-Je31OTbnxcs8J&Ta{?%#Q%!*$A^dB2*?ny)kbvk+lM~6Z6L?j>!Xnvxn z)XX1P^SG&L#<4h6!kWKW)5~8hf)A3_F^L)*|Mt?e;^N}wBYoIYe^;ejvB-Me6)DG@ zP~0~qdww=?VaYRjzS{cuWliu>YGzfD>QvR}n@a_>6x;SIa0e~>Z0@u0%(2^YK}ECb zat*`vE=LYk38||+S$h`~=-cz0e$DGpLzZkY3)+8gZa{mrvg&)Pp4`Wka5pt{)8N1# z%b 3*vrHUS7Az(7+t*tFljW5sbQe4!C2??R%Rq|v| z@|p_im}DALTPM6`0wQ|x`*REEaNf{(7?x<0c;5uB_-a3teXScO%@h3e>2?Aq0v7*# z4OrkYMn?@r{n#!dLOv@>I_J`ljo^snFmazR+)<(0uU2LKHW^NsZCBwwau_JD`CX1r zpFTzTW+F%uyuNCX`bKT@DnvRJxx% Z=Rz{1QxK2~70jtRt4;%P&5zNZqPcvt+))gS4G13_!^ zK@hpa!K86%Hc(PClqvlx4!%auVObrq#e4PNu(a2dF?cIMBhY*iVqlMbFc(&BSw1`T z=_|2gtE$QdW_tT0C2Md8TtMCgS_(bvOcIIyK$I;IK8TB(9olo$;08&%{nQpen?s8d zp=28H_ms=qJlUi{`m{p{ldF}SmGy~AF8x(>*lH{hDcg`ff&dApH&}j~OUJo)_Sd1M zSv0>oLxe+F`_{|2Cj`n69UV4GFz6%M(~fyOc$rb5`_2;v23X{cPqdgxwZq-JwZkS9 z$4 )eyFSdS#ZwWVLB{L<22&7(Htyhq7VnPfd&g33>%TY^=IhETe?C`LLV zT)++V91@_P)xd7Yjg5)BasI-Ee-rn3)@wfe{1!SJmf kpio6@xZ$3(215w a~r8ei~1(&b7 U}7fd$%s;>SQ&=pbHH?81ku>Q`_-qZH5|J?O{^#X|W6SxvB*B#E|RJ_UHx%SNc z?J1%gNtj^2T8MNgRJF<@x#&{}bIrGPN1>4Qzp&c_+O9Huul%@)$<}F(r^J^R7PdL+ z?!FgBuX}A_Pte*{$&v-Zjr8;`I9IFL!8-IuaEppRqu+^wgS$*{(u=>`)>hG5*C&gX z&6iHrMkd*pc~rLdhi;nmj~P-({g|yZe!Hh`%b^4ZGv9Zym22JmD15FBQLz27=LlQM zoD2<2d{Aj=@j>im8SAgt)phF!>fS4)j>)R^*)NGyiqtM?@QJm=qks(l{7EP`dNT{Z zidx9?x+Ih_{4jz?`4FxSjF@((z-^pXq{A2+C-lr-8OvbAPDio6tk|9#Rdr>c`fxa- z<|WJRoRsVtbrpT~J=uGPZmrhk|7y?ppnNvObNBe1#(M-n>e(5;2aoF_P6D*qJ1>-! znlL_>j~?X_cMnQ?{o_aMJ{gl4^ne1tmDCOiqgtSb-i=#%6SNjcJQPUf*ma!p&f63{ zCqx5}Pe3r?;fVya6-3cSmjj5p47O=(%=_}?OJY3{u8yA*&o&}5G9Y71g1pOmtyn%y zef^t_K8R|N?~!A{3(K(4+?W2M)%Q*JRf6=Cg9lXq-OUQDBud2REYHca#IS(I$?5~F zRSoHrNP@(KQ`2L*_-dsRK02`l0e!FyMpR(lo421k%*3z4ps61szE{-{pbzl-hhoi( z0Om9}`i2CGKuVRLDqRbds&R&JJTOzsU;Fe(988y)4??koV;_PTLP8`!wd4SP75|Qj z6+j7s(5X^hH2lbqWFI1GnI1__)4xFp`mK;9RRd@J_}Q~BBQ@}1ds!aPZ`f;0U iCOz3RQS+ok<3vC zSnbtkL!iO}(gzZeYIxVLz JK80#T6sUL4d~*$G9a1-%6t&vFlev_NTa@iT z*0i%rXP0g1%Vz;P`fTvVMA8C+fwk+*HXITTBQ6W )+djlwLQ9xW!`D}P&N;MQ5<@}PG8 z?aoa4;$jYfUhQJ0&&I$bt1ZVRxN|2RI4`9Y!~OgB!9r$~&ZJ~dbi-^w3Nr#ch!Bx= zB4G!3oYZ*u4?H|zeCpJWBcll6B~1Nrx(%G8ogn{JiaGZ-DXj}sn-rK}b~TysMny(y zfQI|qze-D+zAwL79H~vn1%V>r$eun9dN%5=7$AIo`nud3r(As#10jk2`~T&C_p-B! z=vJYrL~HT+P+= t z@t&uju0$8PN&k)fl7I2MAH!ICe^ipKvuuD%>uc}c!YQNaS^@tRJ7KmBNOU|as$Ong z`=kCagw}s0eJ1)^fL7#~`>{p)MVpYD%xpf(hGsY^F5q4-7P$xbYf$63|6esUP7)7h zr}ES3=Fe^Gd3S+rPwW< -8OMx*6uNY9>ddJ{B*b%sMJXwxiiUex{R*y8jVCA&x*UB_0bT4O_+#&-kxi07T z8QT?61dm9f2rAbm9-eWx*efO6cgLUVQSHVRL>bgKnG6_Xd2d+p>7i=4l(f1&8)1yC z*;X{fA aQ#>Wvk^$$phZEXS(9NAfzN!Nyn#t^q)T zI~f~H!`u&ZqpEam<=5kPlaGH*J9HIpArOFM>&${ywgj#I6PbEHZ>kNRxwcTNiZlyC zh||RQd*nA&p6@a+JzdF6{Myh^1njK(tF9OJ&OCmPu444wH`n;-5jRwMwk=zdfw)}R zQ3$~W$mfnR$uC>Wuc3U2wx?fs>~T7 z>KBvdG?SJ?C>Vr q7&R+{ ;5dOHKMld`g;_1qt@7{wqwX!Y^9hIud z@)$o&5_kLk{#>pdD2LO0 `IcxMbThvIV3>hGil;3iy1)yGiO zM}DNo=V$3Iy{b-WKfEMvrEPDx*DPJraQOa>J9n;uHa&sq``@)BcEX)I&yLOKN%lDy zoJ-nkFY=|f##UstYKLvGqRQdHRz}COoLjZD@wNI=s)oo0(h4D}3QyD0Xp XiR5E=I1$dE^hMN~{o j77M+LY9RWlZsgm4YNrP ~;3MzAzJ4X z(c)TM*y)P1Z&@*Z0` z7M}=Y^gX)xPo~^5+x%De`_`O`28m9#*Fr;6UcTJ*c;&PhCFODbp&E~d<*Rj0YghWe zmBlqlj@=Bo7tT_={KI-e`8Y*-b!nhby+@DIxxL!VOrLQoqEiFLZeRA9pI5)EIw+!% z@M(@XKz&rt;VHgvuKPXwZK`k Dp%lJpErw87pxto9? zAvdM{uFuWB+T1ENDLjjmhP3r(PQ(pIB%->Z|IpIYS7P_S6l+P=pb>z{a|5AEvJ}oQ z*!cm)XF&s)XwRjG7Di+%eG`*t6i);%5tiF%f)1U(G*yH;N`HfAA-6myH4432TUq!L z{_TfPpT3(M{QTj=^a~l#cKlmJ`?k$Zb cVGLG+`pI`9VLcuOhP~Y0?_uGpVCC! z8(>Z!{d}=<1BdapMGaIg#0DjWH&S(IjR(U}jOE);;tt9P6cQdk1J$69c-Fvy)QsFA zlr&7p-$S;d y-3#k~=NYv0#WD1eDKcJ@In+_#~RQIGotHqiVG23xjo3GP0SB z+;(JRKBw(jd!CwV1#_~nPT-BPiFp(Wl;P@BLa4lP`!*GHf80>ZmBqiv6<_&2`o~9g zhZO@r=K9| zt$0Dq!P-Q{sTk(ezNlR!2PHwl?I(h3lqvz#XZ=w?qY wEP`WH$<*C*|^eDAR6#5s)$tM z2kag_JrDNk5U~N>F8nXwe&1ef!dj$2uJJhLBZoa^7t;_@!>Pnso>M0 f((n{5bhY;3$dFIt~7DUa&fzeVB?@ ucM?ZMG~ALNpHfL5&4Pm5wIFeSa=MWpDq0~bQLx|lJE|BU7?O$g&T5$ ze%(Z%(MN=>NmhZ1La=gTVK`)6IFnb(oA&6gF#2)-1o`-YUzt?^)iXZ~&HCWtRX{aQ zwk * za#{TU;|a}?+OiKBiO%_7ZbqgUyoIEF;rul(a!$Y%Tt>){q(e-7hPITdxnWYlW{KKL zj-u1`({8m5Bj{L}Et ^7)XaQQfL%l%f*F1LODM1q?prk3!|=?}MJR~$O;lN; zYeJ}_#Ica$MVzx1uOuI?50jS6Y>>@QQg1L+h~p YqZ7&cxqN;JvTlcMSW&lTX0hnUgu9VjTk=$VWtAElve5P=b~Iv~_T zhY!<&9bVZabjTd@B_!B;I@2^7@?DNyi*9ST`kVLgeo;d;Fce2FAr{8S(7Bw(IvX3C zCrHfYFZ4%}bRbw*r~mISBq$uXJfj7F2{sJ{bSeyOoh*yHzDQ OVyRh7_m+cHX(9P~FN#Rvn8e{9>3(0- |v=T}IaWt`-6=NO1l89 |&RTvaTj%9|Md3W53pupk6sjre$gEAAegUmLS6qL5gvA1=;C zG!5}$Eu0GRGx!4+%C-2v3xE1KJUsqr{fV<@BM`n!e8s?T!@u9R>DR##46gz )?;n*%D zorppd7<;F@@wgR@-zR#Hi=F3dF5e6|*LP*S(CR0%k~=Hm;=9Fb*NTc+@7l{>eRH&D zK$7Al|61iQmxr5QNgkpa?@0@MedC-_% R!^4uH`=$yMM}KL4tG_ckb(m*Fri=^ zF0en&`DOm*hJbuNCFU&)%KHb6muiy&=^Yq;&Um|9$*peGey-DuS 7heCoP zGb@awpuqC500c$)JDNvsab!54!8*71fxyLkMg7}4`Fh-pBgCpg2Y>b%CEcWac*mmu zl*!F+g6rK3c@H=yd+`QlESWxbdxJN50`LOSy9}mEK>c_aBTp!{ALc^Mv91c0buaGL zE4|`rkcCmEXM-0XLmPvX70SBzyfJm=o>WjI!VHPwL70;4WM=^@L8TC07*sKKB2_HM zY41n%=8KsrfT_NbQ8+>vWSEnfFi6)w^Xn>LPz~A&>6QR`tQ%-_M(lPhMdKJ3+Y|K! zAz88yNzjnQbg-Z+uqVH!>hb>>`$2DL;<1Gc5 faP@0v25RBfkeIlppSlCmJm_3i`-LfpMFv*A zV@?PR9+S4}5YZsOZenK-g^nkPK`c}Q >HU$B5$ef@I(N+9 zl}~jQ2}w)q+mFW^yV3!!%plkJF-7ew%Mwler)NsfvDPbxT(9TRk$eTJ)gcV>;O$7S zz*G=36h)*ENvIrDS99;!&N~^u1zPC@{V7;6Uqs*}8Rx^OC|VRe{QwnMOT?ulWckdQ zolHkp9hc+p-nHy5_F0#7^h8H_>xU^=ekhRHLTLB?uQ{raV23ZYPE-G2@Irb#$T7xH zNKb)nX9YPU9~loAo=8EM5h*SBi#60W-g!jULr8QDFO|+HS-gbn`Cl{_4GHsALwC;+ zwU`*3kmC;P=pdVBd vMD zocytu=~=KmyCi=no7flQJLiRI3nbb$0A>(#4<(L7DWttiP-C-QhmJyIB8F*7JxZA% zhI}O7|JjVJRT(EyzDTNLrhexC;<&A)L8=%kih&=>wTStQQ+7Oc2^ZI1h+!X+WBRX~ z!Ow&UY2HqClY|Q429`t7CvjAw!I0D;2`~aIV9JM!Kz;Fct2}^JSXa!%cO&!H$OK8e z|8oM4H$M`zJmPoD-Wrat|1O+w-=0GUUzs2RA|D}w#YdndIzUKgO*D_kJ5XY}j^s&J zGK@mTrCPJfGnc_I4hE4%icbti7a$PGspOw9>?6#pB1%R&8uEQ? ZZ{cMp2M0GK erD!4 zBG{Pai3>#g-MbI7`N>-ih-`#4P09j?skZ>h6rxNn?LSirLr@CYsaI!nca6*-$Ofzp z&=k#?j?m&Y+vZnXC>9|trhYmf5dN@$H3Xv1%Hg#fy@Y+yv$pD0>4Ft(=Q7eLfDbVC z>hj=J@s~%v%XaEf!5N`swWgL}9k-0$^L;*0cEF*s4Ty(Gp!hA3Fc5@e*9%X7@d6i( zfJw4kigCjWBi&YQX)#zEb=%^+D{asU0|itfY5-*z@2dWfHj5<5&*6ly|DEM|p(<*D zKCn&FZATl&cN`p#goK3fGzatCv*5ikXy@=ewx`hv+V-~MNg3OaWn_=6PEG7`lq0%4 zpa-| l%k}~+v6V-Ll?_yzH1*+E znv6^45N?R)AW-=jd!Q>B`wZPtspZ%7>$(qF0Xu0*hUtYEqqOH^)`Of@wmrKx-uc1D zFnTkDX03Vaug_gq%$oV(@1RXR-+`2|vk6p >7bCJJ_A%BUWl7Nb5EU(@oCL*~l|LX!(=5 4 w11d5+e$j^!aP9Tvo!@%|*8 z7#LX6FpN!x36d>(`9@jh>)_gLOQ+^8n_BGMXnB?PyKtB?5*ywa+miB|vtPy zgkU`k8InM<)BC@7`(i)X4Zx+uI@f^f`asS}qW;dm??VN6z5!ybx9&BOjMD8(agoRw z5`YRYQi K_Q~qIhiLzacME)9WmM(0G3YO+>BV>?b{W za0Z|jkbV+hgyra21fD=w!wGBlRbclPL$mx9ppU|JO0n-JB5Mb(ROod&$jax$`8vu; z4u91xVbi>VpH^F5`C|S3ul`w)Uv|raYG5Vsx-tJ=#kiqeYaFlJ6mY+}_BTE$*)~&N zKZjK_Z*Kf3)BMeOpS+IU_5&+-^Db&wH0iqY^v&Q#kiks6@%jxBTI=2#ndcfo%Elo| z+0^rrabIw8*2$`lJ5G5_VU;#TL;o1NbWyf|wAjZ%6-Y`4(Gf}at?*z;pk5eRagrnb zL#!Q`i-$~2AGPKY>n?#AW4-IkAmX|ptkEB|IvmuC&%pxrM-I;@-#NJ_zyxp_&o0 RIl5HL&F^KsZJEL8b<%3T-p z$M3HE97i3PfscWQqih8Csf4lQM3MuIradU<&~w9>oD~z1x0PG}&cr0`i{s+Kj00%y z?NG;(q~5p;96}1|Lv1%$xQQ`FU_9~dVPo^9TGiDnFeYdTL_cz*oILOVwmTCvOgwIZ zjLpNs*{G@S|5298 kZEGME)8gzGO z$8?0AG4})Wm7+8)!KtF>JdP{FC%Wvc&o}*?jhUo$$ylMMquV5R64(-w_UocEe6&Sf zF~GN%=g4D2qF&3-=F9Bf&4}(&lc3;MCB{4HsYEy&w4kQxu+soyl~@b0)sY-a#k=+> zDV<9#C4dj%Fnwd=3Aex@=JX%r0SF|Os4@_Eru62@Z2(kbj~}O?6Hav&keNB$K;(MK z?5oC-PY>l~`of&Dfwk}S%*ELowcL)mXYM`0wjsDkB<0LW+MjDKw25bHdq>YL_E!EY zlA3ub;XP2Knr&Tsq|4JAqrIK0w~;ktCDx{eg@CF5jHZjk7avH~WCV#!;ez5O>%B^@ zZZPXgz+-X Xa>otuj z~lNyL?(=gjU*)>Ap-pZ@N+;jlXE zSTre%RYFTf*b=?EFLL??C0u{a7WD21;x!AGRo@}^{N|HHC99tD6*6M?d$_?#%1nFp zED*qRH9Uc5$32H>OkW*>9WF&e!*(r9Wbz$}j7sXFN5ioP-c=vd>;BbQAcF$#C|`G6 z7?rpZ4=q3pYS{2}Nj(jPnn^$+<~9C5qZFak8kka5g{2LcCxBzPbC8JsrJ;$tVe_d( zaql}?{G@gS8Nd0a4qcUXmGA)|lIW%yC_jqnK0G962(2H*3x7h4kqL1u`Dcx0I+Gq4 z2whD+S8L#m_}KRy>xX{Ruex#x6-~B(@xPR$^Ke>CM8i38b!<@9W$mBH_U#8hQ0?lu z-B$v`sbZ&2FQ9b=Ketz^Mh|~}toB2yih+uO&lh-v*tLuL_&0Cv|J~>CC1B8#wqsvu zewRu~Xxg~(qv3z!%$+uu;+{N;V_Jp~t;m$>CCL0`;9YAD&xs~8K8`7xFU)jwYPPm% zADl$}6qJQ?R2(^?nR_H~3M~CigL^R;mO><*a>qQ9RScc{7=Ka8B`IH9BQH+FSJfQi z8Njs1TaJO;d3DUE4 4O z*H-6CzaoK8s6Q% mNYV} zr;frfE%FyG *3V!9rs 0XcUT^C)g;t~*;VrVtUo*|KA#eJ$q0v~tHc6uQ}w+A`fSP=k|xtN4P%2h3Y}M` zJt-(_)_P79%Q=Z$>fCtRe*Y8-4TXL8!$`-A*;xrRVeNmp6ht#$mcO=Atmv;bui Tq=KcGlG6fak z
O81Z21_(P;%$TS#t=O+Hy$JJb=x7lM2tlm>| zC5MkithZvgc;u${pXYqE^w|OfjXRA!)i!4E-HM2MWw78}E}`sepl9Ej7`#vE4W(n) z+LtEw`OwQ3TSEWQP>=w=IA*nw%S`XHLAXFAV8mYE)RYOh0PLO*Nj}ThNyNVgxq9 DugO;kDA>)74*@yIgmF$ya(4qZ#qVhHaq<6^FPbm%4iI* Dk zH}}y9_)c#O`C6VKAvIgYq7-!J+TNYPpFX%2Ymh0|T0BD}3&~Flnma=r9Tx)jCN J7kw0_p>7>HI?&6UqkA1hS=1b4a 6>%$kjFIW0_(%<-=#_4;F z_v$=cxC(dAa6ZT5Y#!KUl;Z(E*>1zSeZi%kLyNX0oy aMmS;Z!!F8-Serlj7JJ!~M^SNn&ZH{y_17|Iv>eX!?^KA#;OGaSYUzMQchX$Q zTfx$akhZGnjZvB^+v?SMg{(I+i-9rjEbkdh#Htzbtd#?C_qQX#8%$OiGBDWaDwz-H z<_7a*3l99dGF#6My8+|m8xVBBqoyPm`NA@5tE&aj1;IJ`zqXg(f~rb_ZpbGC*{H3Y zKvWB=MEStXw%xm5>(?ixzkKOmWA;B0)FyIeX?_5K5%RPx>;v*_oyfgAErk+V-SSzk zrHW+-8Zy0N4-K)lcylji!eA(?Lp GLp+lyDO1G$-bmJ^Sg^X-gnLgb6BTx&Sh z6J fYYoX>&mizjcwOs?$1i zeL^rfBcu9guk?u;&vnp~;D*tm*BNp~cJF<>^DDt>k=8f%dh<(k1~o-WIDD;q5hPg# z{xBzC$sKAw irME@Aljjg^ zF!JF+*HW?yX1(&ASsILpM+TATSwEVu$S597#cU`gM)yW4Q5y$g1LWAa<|wi-5*;1g zgbePmf3~&O3ta_3M|8jSOw#QkyceAp{dLU3BguknXxYM%Lkl`ha9PB`+#ilUb$(D1 zAw4S?rXwFc$n2pv3X;)S4ITtDHipRI3rq? !Y)Wq-veJ*hYk}k9B5f1 wS44Dq|`^m `&VIlJHHMT|cqb(0e>V2C@&r?}I)u(%6F9 z70PS?%K3ciA4o_{%&Mue{M*<@3_Q^FlefABGO4q|!s>9sh6c;5ao>T CkA{<8G3Upv12L0LIZNGA2(AD6)%mQ2Ni(R$`My^E{sqk4u+c0nd4 z3B#sz+) K)g-<9h!Rjfw*}I`V$y3F?f}!Y_Rdw~l>p4Iyv#((k8LMAftE(C#zkQQeEPeuo zoh3Msc2mLJfVdf84sbD5MbdLx9|&3}p|t_s!>$Q; IUmR-Mp+LEI@| z&Ktpjv=*e?EL#=EpGP_>w|;qiU=k`p=7LDE19z?T1COw)`hc8~bsTmn*!P|p=3snq zglvMIQ#9 ;J$~Cz*?AV|d_mG1ga(B2R`q4@+1eSfCsJA;`o8(S zp|7w17)lVpLm;9O{Ce35&|HGgNgb{U#KHi2qOHi73&=j;5U*lu;ux rZ6EK+I}iUy&3V9-gRr%gaj=6ucq_3g9_oMMok5?KFXjcF*k1R7vCdxpX% zR_7 Ek{j# GY3RJa5vlm$R&LqvlSX2et^@yzpdeZcmItA5d z52SGWl#5#HCu=_dE>Ke=fyXz5z2%bUA?0F)uo#ZtO`qAG2)%~8i6d{P%4Ogw+)SGR zenhCgkp;F+`Eel-@~&QeF^rdUkXLP(@dODxZLaDZ6x%i)&^2K}tSEbsd%o9M10Ecx zy#Y!vKm%bAgPoV^o&NM26t}05${*P^RH63*SN0K7=&nyGe_lIu|2*ZHg$k(PKSE5Y z^&yPRwAU{Vg0K7(U@4KKWaIGe6GM=r{rF)C&6^7umTHFN-Ou^8FH=xP&?Q1>nV`Bc zR|XLrm>?Qqlx|<~cya;M5CN3Cpcr6(gdEWq7Z=SLSRGOj`e}rZ<}J+4XCIT(5svU6 zf^Gf#1svhOwBN6#6uFE_U@>D-ZqG%-;LP8@Cbjn@!n%}|HPv-JN;=L1e )|*Tsnhm6)=ngMlcHU-qA-`l z#UyG6+;q@LK|PW=4bupipszk!nRbc1Yyt9lAz4lbwV+#d&Ew E?o+|*#5f@xD&IS8&00aV(CdMSAxjB+k7Y4flhgO8nP_Q}`fVF0M$;gfM(E^(A} z8btbu(1m3llubE5HM Ek>PL*FJoV7E90JU zoYMfNTk1gNe*vrgU7P{Bd;*}$DduESBQz+3x#!PuYSx)wX1m6GLeaPQpp4A+Ro*Br zo@}A8)a%fVg>k+*%KPKcuhv)pTRX1!S(+H_zgf+8-1L<2w-)*|?XFvTat8*LH8!u) zaA(6g|Cm(>d0@}M91#{gINBZh9@EiO-80Ol#QpSr=I}6^I``Au&UJ45PGMnTBOB}9 z-gdbjp|HhWK6duroHa81Uv$`X4+3zgtKHxjrk3zIUj4?6e}Ml9YP4s7a-d&;N#}~! zpOLQOl@CL|>6LRAO+|^*=_gMe ;>A`AjS8pXW4D&^~9!V@L;TS|^bs#uV=qxDz(mJE1$AXNN0Y;F$-K?tc5 z8tR?0o*kwiXVr|BddIhaxvaM5UNaiFOBtkRc6x{b#LwX;GI{d-z!^5V7^1&{^fXG`8=j48Y{a$%b*V&raH3=y9nh4 i4y20y*9o=_Cs(ZJjnA97T+6)xu+>yf8&Bg%=d;+=uwv%wo z+-<)HDQlNikvr(WzQ(t~EcwZ5?D Pu>|GAL=`};+qu>U;z|9(%c%PUEAZ)yGSANtRqmHvgj`MgIK@?fn&3?QBQ z$= nV+@wcE|W(^*%a`TTQmKbc5*TGJuf1^2?pIKOmLkkc&9 zD7z9m&eoh))1~yp=9Oq0Pq{$CTYKjDSD3EY9y>+eY_Fhs0U{&qYHGf4!jUbeIaZRx zrbL2tK}6H%f8QCqWk|%5udv^=4?AHcFLvFZ-J?8hhG4a j( zt|G}OW#J^Dh1%l%NSc%O+cxHj65*>C=jI`6>@mIMj!bIjrD?@iHaUV}3MdO^o7{tk zl $_@?udhK} zV$+z*zFrX=S4GS>t)f(enmo~HUX;~Pa)}3*weDJnBiCZnjnHzv#2solSA%|8(y9J) zH0Nm?FZ!rMoYpV?{`QG;<-%y(+U(*(|CgNu#RFgFU(G&wVx>8&Nn@1zcID^En-V{q z3s~uw5@=^JY(sdLcmuTI{%5-3a|}_eR{f3SVS=?q|2#U3siN(o4E>q`6DH1OeYQ^3 zqIKTxwO~a8?*nVyZ`qr?LAza^zk_3R=#@4L(G7!Vhd$lR)H0bJ6Vpm!HBs)>$t?3s zTW9_7u0uAV|KhT#HO~9V_tv-`4c_XV)4Qi8m+`zwduFcG)xBnLM5`28M6)w(zg+h! zQ{wK)7(acv_q1W10pXnmJE^smN@tDQl!*7tZ{4b7H)q;PPo67k# 6 zcN7 kH0?yS@qX z R3+zH`E(Mv@{=fIK40wack6U}2C_X9 zd+B=h#)ZPFD9TYhvwwUXCRZlR$FZzlCOCp+OIqxw=Z*%uSK9aUGmA;TS)F-$ukRe* z(jLyF<`Hw;I4j;7>-K64nhqY%o8R)QP#=()S5BC)XV>Veq&s!a>RopQW2q58IW1hN zKuR}KT!mt4tXvUQ{D?>)a%R4N^DOn5LA$_C$d}pi!2D$o3qLOv(rBHPFL%{2cH-2D zE2tRB)-n0*hK|DPD ?&&rou`NsS)d)vpvvr*C( zM4_GMO>H>Q=q!~Xq3IP*_xSEce4Ns$g|YX_Jf}?#4JdcLmUK-D!zSvIdmXlC?$wz` zH|UhtnWh&9yL>d3MNcYuIL=LQcFE@{6=>x|NLXX#6!b*KtR{y^4kD&IM@v^I@niNR zO_J6fv5uarFTJ?gO2?@~JP!p@HmYPhuvV)UIT2Dv*~&!6%Qu#c%~9FZmjzB%3Zhan zWlT(SxZPH9eeEF0dhIHXcGOR6y!__c^z2?e4*Th)7po63pD%yQ`12xlQH}W4-nYG6 zICSuB?9#C+11shq9L6YZCVyvxxUs#C;zEQMl_$x{+Z$~?PPN8~Vn%7FbaRIDh+8|C z1?*Ml4<}3KR39McGwV+n^ZoP-xcI%!z#>YêVqlnc}snxw}KvRc A-bj*vuDo>hChj8B2y2H#Xg*`75xNauxJ6Y`WTB2M}WA!c-dO#l$=^}Q+t&bm+i!x#(F5@ zlgiB=u~{keN% j8utOfJ z$5(%Xv=uMv(cAg-wk4?#ObP6>&RKed$e*Uem{x3uN3zN+k@w5%!>D}T&@Ca`@fcAZ zgDN*Uz=SF&>I+YJy3c;nQ`X#*vfW5*p_kLs?7L@dt;?|)xIT2~_Whb8oAjKMY&*u^ zv>7UxjbrSx>&i6s10+1G%3RIA<>_(_f2YvWgthwRY#vFTy^xgMEaLXA#a(Ui_t_iF zg%5}Ff_QrM+FDB!CZg7sJie-K%a*;#=Tfpi+1#Gt*5e=kjb57W ANZ^&^y8*YkrLI$Dlf#~6G(FfJ48^47^;Ia83EJkGYa zDDt19ZZ`4%rhFH377wo&PpRp6i8)+mxSb!Qpu@h5KRcV 2CYl z?oHMt4)2SDe=7WHc;aH*;1zZ4o}7315b08-Y~>*z44iP6^|%CD?C0GGfqv!+>1X{O z1PV^jP9JL>vv8|JA4|V(^i$V )R(TbEnq)nr?f_-fn+LEFC zdmB0O{D@Xk-9{Wi)m|=~B&bO)jP2@flsVmRpJB8iP;o}DC!x3CxO`q<#j}oETE$;* zO3W0-P|DP-6!zD;WjtAUpniqf*7o0`maY8Axp-HrLUd(HQej7rI#?R&uY9>(n%o~7 zoLSueD5Z@}9TCC-tLKJpF&iR8KwLO-14vz*^W;TT)c)H9o7^s#9R)+I0CFy1@Qhz! z0DdualAz?@?r+bMp?UX=+}OJ9>-)jgN=c6NRyE*;knLb=MY1E4T--4Z+QvcUxTS}m z8OGIbvY&KP5}HZYp%>b+)O?;kLeWiS*3Gq#9G_6w{Iyr3Pe<%|o4mc5Tv1=ysiqs{ zDZ1&F&*Jp913aBL8?Sy_DV`;3YP{EI*`TbL_07Ga8rdm6Uy2>iY{afz&z6t$ln^0! zTsHbR;gzkBZI5>~j)@bI>f=q%-N&W2QK}R1a{9vZ{>$M8*m3;;e<4G12pVPK#ldf) zSgxCv2XDAcl5H{h;pP&5r@T(+6Fp6z*{8CihD^_t ?GNYnHJt z2R39x+0)K7Ic@FEc4!7D)W~p8%u)^$me>c^N!3e!XB9-tV+^+&LnhCK_YLLDcicB~ z-kUji@>?19lrBBTYdJqN>A;^p*Ommy2gTG@KGd|V#I0}X#Ld5|(vlPO5RS}P<9W+9 zV`5r^xp(^dQWt;Ji^z3VeM!2yrAdsg!T63`0zdK8?>z Fk z0zcZ!G2s1yMZk{F|IO5kvcPX|YK9A9<3u! q;PJgH0$7i10rfGa=UZgs XuTMPOC= zGQ`=pe3Zqb`Lw2tFahcusGaKP#QcNSJYF-M rQH>ZRjP{eZ9DtuD>s9;zAR0B zJl|nYavR_nU=>vhkiOPW(~M^D_!_2MR^tDLGRE1c?+|YplWAq>a@teIdERDUOktM{ zyLQzaYjYm2RZ_t6Z}hk~NqCAJS}9y LL5EJ7&_KT&)UW!JId -PiI1Oc0BbFRji6NWBgeb==b?Is z#c{4O|NK>%@<9i3a%4&j;LXfHdxGQxP&!S_)d}Anc9kbpu_h)Yym(TXr6}`qNo(`m zU@JB&ecM-0qN4EYc4{1P$z*rqst8uxBm0_s$1AbBMh#bm{|KzPSEt>;Kfb+hJtRo& zf}62&-F?-h#wyD?l;RHuZX;1O%v<@hW$%W!-nf}LE{A6|=_d3JKEGU2QFz~kP@U77 zXJ5;~7)glgt{Eo8kP?a}D%%KMm)vRUc+$e*lh2nW#E2P#YUFDz6q5+Q33>Ire=HAY zZI-o5l-JEr#^%3}+fQm{MP1$IDoQEeFVak0j4}8@iq$47k#0$Baq9cfa?I;YZ#fih ztQ9dDTHLSeWh!}ReiO}b%#GGYpll12W-S?8twseuZa{xOOLa6W(M?jV+n;ZNd$G}0 z_hBA?%V~e_>*<}h`aIR5=hc!-%oYd{r;?8NRo5D(JQ&Wil9Jip+pWw`WpEbLo7(O6 z+SQpqx+U#J;tOQ5vHNo>$k7ZnzN@mOMAeuz*;8uNRmm!Pq1(&DT2TS3w)3iIQ}$1% z!hmQTZfC}`KyVskEM=Chlrv*gzWeEQuA1|`F0I#n=$wu24R_z4ntn8CsT9wvIf`B~ z-CGs&LujV_c1x`8^BEdjMof~q*v$Lqn2{(RpSg15m%@WrgxOHNKi`f(Ll&U9$2IKg z M$>g&*nUg9G#}BgL0nWe6AM+X8_vLF71Pe)FdZasg5LTQ zmy*GP%ott)z8@S0(JpE?8j>0w_i6Rzv+`P{#L1ZUza`9DScbajMX=@RPkA)D|Vm zuRGOlD_2&0Xsx?##GiybO6P#XZMLdloKZmMpxO96a;$Pn{)uGG^{XCcgF>EO*J&rs zaH+*-x8^OP-}C37W?nYpf9l@(sJ&JhwP>WHKk>SXWi+NdMydcEniZJ$$AgK^5O?f? zT<)oy ;4= zxAA#|N6J++{k)r$lA(Nw7WtZIz}{0o3HBj+#_9Q6j&jyF8=mr3X)wLrEqJe2VALnn z#???Sgnl1WnQ&-6yCBNBKk~}j;w~dO*{|M zM|5zNYT@D~*L8zGvwlNdx9#^@s2NKAkDUG>q8M@UgU25{)fPAm!8XuHmHTkBX0Pl@ zMj!#iCYDnJJyVj@d9q-XmK7~yR7o>+Wl7SJpebtJ$!I=)B{?fkHfQr-uK&w}GvjGr zh(=sN9K1D~gJn1MQ^!2aJi0|L;xljGW>w6*nS=JYf0=owQ#51Aen2Q)H=ySzRo{qn zZ+XNXsp9fLjiuTa2D75-4JZHZjysXo`ip)1RY!uoBfAMs>9PFH;z3IxSNhnOyV{JD zofNaIoK;EJ#{}_VKOGIQcjI|cUDhu#r()36@nlo;#QqNoRZ&w0Tt^tX1#1?zrW1di zT3xElvTteBqkDKAAJ(Ehe0bSBRbBX*d6{l~%j|NK^*ou^I=VkUHsFcrAUWFF%9>U~ z+gF12r^U_QzA;4b2^i@Yd9$>3!R3s2mQwho%_WWB4-}fNu)Zi+H0n8HbItf-_b_Q+ zzzIh)5B^s;cdp%bvXRBHG76q>!fiW;a4m2^lPV!?l)#T6QV#?erjhRAix1|ZyTzMR zFd0cGd`_U)Y_7~9i&h<3jajkee~VcL*HvbZ&d<-6C@J0Zz yz3*^+%08G5-XXh*zXz`wwa%uc{ZnW%ZeiB#9sdx&g}h6Vr|dHXk5Q2 z@;kgQunhZnFrD{~q-xh-=f@lVr+)o7k%@I$JBl`@Y0phZT{4$0Qe*EMum+MmxEG)! z?pEWZ;26|DHzMBoxynKVb8kRtH*>;MB01RjIXU~DR+rW)O~&e-6pFKk9Q|XrJYc%) zRMZj2fEs2;i#$e4^%bK7&R#u%&}j$=TRoQ oph>4|)ya9JblC^t>5Be5ptZO^pK@2Wx2k9P9b EGs91LZ^t-5?`05jxYAEMBb+@L7>OwoY zl`T8^2Ba|-wCs7c39ri7KnB;Ua!iYRCL9A3#&qtC-+dp3>KKy|Zx8BbotAYAvKp41 zzJ6%<_iNLnZ=xrht!~tYE!$ZobmbhQ3Ut5SSduVioi{SB`d81Qcf#HGH`~CsXVyP& zk`y!5xG#752fD=CaSGTTKYHC9_wVOnJ4n?qPr!dCVy>$3H%4cx+`BGvb$n^8JXena zJwcfMQgHVLp?LiZ`73=$7=~$3T&>u`)i(Xc>XN@z&|B2tu$0e@nYE6d4=h+euN^cc zKBp!*qfuu`bfxT9Ol90!^X$^rD24;|sM?je%fo}~=-xp>`R?t5jEs^c{8&1#4?iuE zy#KBf;-jx&`T)4yqpM$UDUC$Dc%h02QF={GM{`qLuYf+y&LCb8%tOrYZWg9)C%qL7 zAdk=K4=d$e=ARJCT74FSe)m#LqMOY;T}xC&-$(9Cyph3~4;k0KeGUmYZP2y*Ldqry z|68%t db-iHP)|2L zZpGvgl|y%?OqfVc$vXR!QFuEgkpm-|w8X){%>4*otSz3!@#K>8gO_WW9FZCaYD>q7 zkuJgICyua{iaetBNJ!MAri#r?pzU~$&C-iMxf|bExMRSX7THMJ6={CyT18?t$7Y?y zm*Ks#m+QH7o~-HE66>g5zO$sw!p7H?Z$#1I`^)jiickgnYdntOziB^eBOj*fcwzg$ z{Bc(;5!o}Xcq)$7S=mbs<9H`{F_d`U>NNeKfvNi&@ k%# z?6llVUcZEUf7O8T!m^CE?PvRnaQ`a~C!49h{8a8ao~ZfdD7yZ_vjkbH#*eE^HR9`A z%}agf8q*rCSIxiF;J-jvU87m7%`DhinR1lsMOV38sD9@dB&}De%CT2O&+51hUS>tq zmnJyxkQEfMY ?zrky(!Gk5>ay6MF;hk%e@! z#Yg2i7mUhJ pzCrwSThtNdk<6Aa@2b;%E+vLATN7UYxHQIZj`vY%(Bazbmg4NoL znlkviw@4*!jq$mBxpC>vJrhH$x`Gc^Fh=Y9wR&QY;|}R&S6!r?FTqn`)O+!kpFNel zuPWk;ZTlFD^LxP?0pqiWNP*ulYY7H*o8D?WBg-CK$sI)ZH-l{veW%3Zh+Up;DTTAV z)>Y>hh8DW~55@2a?A$Va-iKrF9nhN_M|Ek^lj)L7-d{!at!}pTTsqJ*BObEKSETUg z_{4{y sw;ZjN=jP01Q$kX9#BZG;|0eIAipIY# zaDO?W;xg$}?wZT~Yj^r~ftbykq zpWJ%z^A^EIj4Iwf9tih4AGr3~>T zn!GmeguRB&NYPtZLcdnLmME&b(p_|A>w=@%@X4?(b~h$=9~$1Ylbl!+X%IBw-lZC? zc15--#Yu_i{&LWS`HW)V#?~*^74GFX2E((pQ{jLn81lBn>VYZo7 aoRw=oi^T=c5$!%?^tbw+>CJcKICE@MkiYJhs%Tgjn+*)B za2E=D^FR9BdHhbVuhFY>%g%o;QPfqRiyMW-Urnu<=w0zbE9yt}#Li2Wy~tX;x1XMa zH^83RMzpa?W?F+IXp3%gtT2$P-ocDvgnW}Q5%ueK=Yr4W$K@f@5xaw5$T7V(Ta03w zUY(u=ru__WmA+0yu1>oMxpEI)8|*;e@TrNaR6BpYX9ItzE;4sOZLXV`|Ic%sYvW8i zxKfEvLNbA|^Kry|ShtZ-Qql;n=HCunJ5_dbZvy+)TbVKZzGZ^JVB%hiAelX6@Jw5r zOeiWq;qI=>TY2AfQEQLw4fzG026{7&(`ct;OH_jNOH;O1nKR9ti>^k2zwYH|O)+8^ zJbvT^F5!FELfu^6dYtOjyS(3=qw-1r)CH}s{&Uo;)8uQX_s7aETde7beu=|K-(YiJ zrS8?FUUxE1Z@%_(%J8y%N`5i;fB~fmq#0+YJ@ePgips2vQRrOqiG-wyar?oNal*NU z!tF%cCK?0hDqHeoVb34&@MdjMJuij_Oqm<6WEYA3EWh*Moj>{VQXZGO^>vBm{tQfh zWQ}f5l--DslE<6D75+^}-pfJ5$*(#HVMz%z#>RenvzVL4=S$8Kb{HB0)9UD*jII0V zjtU&AN)QX)a5yG;UI@oEqxD!JXeO5YhIT$?=qgX=Ye{SX>nECQ?}gRFs}rmCs~(+$ zeGzdw3PWzGI~&f%(X*2iJ9ly-)>VT_FP4SOW_9B2`7}8bWEFIYV@$zr)+cgY2` z#R>IPh@Z&4@39k3I$2;+n-Q#P0{A3&b7+y9j|8m@QhG1Xj&94V1 z{oH(fE&;_55~c;Z4Gj&Es6`lHr@7c3g&H0Z!*U;VK?0~S-OoATB4Y`1N(43l0V+s0 z6mhTukfW$$t?L!!0DnSc*AS%j3GxJh+<>@Uq3O1sF`o_&EhM&v{lZPoVp%D;3w?gQ z5LyJ#8 ^5d=muj38nxJ zkSB!#gaaJCs>h|rEms){LkL;@@9Radg@gA>G$6uC#`Q-Sq_%y~j?WMc_%}DVX= 9V?wLH? ns;WJw4hv}TS=48p?CV8G=-aIVz zo2^FA_U4GrdefJ)e95&nK?hQ# 5hi!% z8r#cNcfRr=A2V**fIrzjvt4d`Pw73-a}`Qo=;hy}G`sD0X6T!-@kg-~MU_`3uA!w^ zvN}BY!Uyv;Do#D$@}z`TA1+?$eQ423o5Y~fOGIa@_|3oFt1NMCA`zTCpA1Y}Sai*G z_Twh=(dEoeX3iWTi8u-C6kp|@0wH^!6iT-`Z5os5ZRAV%O8#_Kuf4xHanhIQNd9 AQoaCi1^I z+nk5XQHHONn_?PqHP*OENossvd_Z<37jz6Ggp3~f^4ymzjdBt UbWv5VZ>?}2%u_~j?VZ$IxQYYV~vqC zZ6y!!s0Vz#^h47vjeseMl^L_&sLC=?rRtlBNu~Mr_X?+B{LSJh5InbZ?D%!1ZY8>N z*uk^i8mLYhB_U_#r~Pjp^ja2r%Hy 8@#@TvO!;4b0eWP zv!#<`tnmSPCWT}$UA5)?p6Lj6!me#~*cK)TEpJ;?nATwqaM5>ZRlFp4AF;Y}O<2-u z+nz^bhjhG%S47RLo0BMUD$p|KGeNgYUYh!1a%O%tQI?eLrfP+~S=dGUI&Y%vd?XpS zb`D>>{)ED|7JKPFSDdQNLWFa0eL2h9h!=vH5hat@I`7dxZyxfF8dVjGIbBu4`&iUB zGju8G7alP*S8!sg!Q{6s+ZV^+RyMfW7 Q*;m;~$CCvYcudl)l`}O|m<1MQ zyDP+U69gjuX_ZOV-T$G(pUdus=-fzqez7n0T7n_k1XWAq{Wv6=xYr=*UdtW?=K<=w zF%Y*m6jl8UH^|of3>XUm0kz{rYzGe>+<@@cJ$rx;zZ&JhCir@`7W%6uAmtPhVR!lu zngbN*@&ipdKx~0rC{6{Ri=ZR7n9>7DAt)n-3#mlJ(2gXwBM$R_oqPYfV-QI)kf=eB z${!(n5R#=4!Z6| #QBkoK(3!>1Bg&+jh^!>vFp|Y|vrv8psNV)}Rc@gd9 z9?0fKcuAm6?$%M40C!Z-XuM*8wRjKM>X2w9fHfcvk-s1bP&QVNKIcIQ0WH7eLH-y5 z6 stzbkZo|8G{93v;04IqTvpA`41p6GpCM;40y5FGza3qi zzq`3S;RBX(B-3&X;g%vWC?H;`9ak0`<&fDpczSsM;);Mqm#FO`o65X+&|p^V5@k$? z(0%ZX-V}#Ib&cRT&qcOJnLX3$QP>}amD3)c9H<(hrXQk|q%Dzal<^97)Xt9+0}ds_ z3Od;4B>vva=ciQ&r?a!Fo+R2*sQaz(vU=x*Xx9&W$44Aj7}Bnj)hp36*kI?Zt$EmW zFCy#gV8sD9vhPI2KZnpV#TL3_6R-QG@|Y@2D$~RYOQ$Ak$_Ah6)&4l&sQ1 Jjtu1u6|F~U2EmqQhjNkv7D+WeVO^ot!%y8^C|&- z1LMr^ANMmKVJ)gr4a%6dWqNG+4ks^Hzpq=2L?P{D&xv{BO&quLI?h+Do0N*S%}@*T z{PL~Bzu&DPba_?0x@pc_*-6hi^u4oLdqb~Z+Lx03gIgi+)MCALZ4kaXcDKpvevQ+1 zeXgmd14F4%gJIc|DWkL>H#MWt3VPqq%yiy7efh2bQN7%|ezOy(CKcKNEnSDNk1|u% z_m{ozUDihbn#l@WkZ+eX&y}|e==_yA-8OA2Y U(lwS+PIe5TO0r%fU6W>@3p`!3}Y zW_KwGM_a<(-W}8En&0sBTKXQlrDD^NIrHmF%WnIHgQe|kj+YCF&ITt0G%hPGdKSN! zVpJTI)iWeLO=iJZa7b(g(gpH%VS)_N@ndTK+2Thf{NH?UrFIo)Z0BGiCMA3C &ku@o_tf(AM?cEks zg>b%FzgXDOOsyWh=O4=z^d{sT`D%2f*Q|HKvs}NE1X-e3wV8}}e%fAGD2gPBG>4K! z+w^Nm)&uTN+o#qg3GV_OYjbv50@bHScV|3(6| j80qUm@(REgs0@n5%Iv?2E4}S}=4DRlJ3LEg;69(R z)7_r)8TH0rp0O&VTSn*w*eIXG3@ecj42d}o-zd^oe=_~j;MhW`*0ZipyU!7W3j~5_ z`1#2rSTrQ$;nCXMXUO8R!p)Y3f36q?p$ E=0iYjvP0R3)5z;s!>qer~klYMdc)q}b)CF8Av+`DC`TXQuVFR2L#G6^_ zG9d9k_I$)F37jH94!K#*c}9dB1$aN%ffur%o1|*Vs;UF#7qH9_G60(a$KRj_sKR{^ zs~jw22;L8{VOJxjK`>k&$tAgnK#R=0p0nPDIMLDQ)&u6xdtznM&cOzRu$X~6!3zGi z{fcKt_Y&}*Y~z3!1IfuYfbY4&P$K(%i-*TmOYO!#m(Z}jf)W{Y_+KCw3Ms|?f$NMs z1%#CgjGz{cZx?`wAX>9{1%bT-1?>|8Z>{?2$N1i%LlgY1PbrV0y2LiT@04zQjoPan zh?oK4;Sr|C#%hmVDKH#>0(0T)#}xUmQ bDt+eceVA zrPd@(ua~OE_vqeY_SzUoGDw+zAub{y>d%#?e%&j7)0!(fjLmFvmsn|-a!ezLU#n78 zbT(vg )N@DkH+Qgv6n~;$&>9p#6lv$ep(`o1rzl>dqMI_;zpD73?W}hbA5>5J}y3n(Xjno z=VbXz#Df-gCVeDIpqJS1G<^Fsz2!|5KYMy^OwysKb5Th(==hZoMMH~l2}3zKlm}Lj z#zm23EA8uddX_rXFPo*;68Aly>dpg(4IRyr=6=}^qH=+e iHf{Sg6ujm1*-fbhMJvo5C6=30nY!5OfxxrWq2qE`Rb_Jid6=g%mrRxDrXo?A`BE zB{YhS?W73IZiP+Hj}rZZuFSs7R9Y&Nuq;_@$1$N*0(-m0&mSa}`9i&Dg>^W#~%~ z#yK%wVNk#PXvd((pT-zp8Ps)`u4yj35~F{)+Pd^NPQ=8_>Xezm9p{M#K{QImre!|U z!!l7VAXCX8C7(BB>swN<7bV`!CFI0aRDa`WX_gnUbgadrJP^9DPsViC2Q?<_|2)Ii z9HaKCq<<+i81ZVrqBYkHA8jl}(%NSwUnXVZy-H1ZzBPMOSfwmJV9RxnaAc9O%oqPv zD>m(GCm!%^4dicTYLffGvUfOy&+xJbSD4HSN)pr9iB1-@(X@5C&5FXd$Q(kyz4c(o zJXbaOp&3qVS*!1$b##+eRnhEN+se3~6L-SO;2oFu_}>_YxP|PVe%3U-9FdR{yX~Aa zC#=!-s7p20>A8iWIbAWStVMx$>JoF?^5zR8IPycAq670-%sG;9fm>?d#Tq*!43ev; zp1bk>xq>f`vCD-}CW#~t7HX8*n1H~P_~g7=xi0qwx8z%^xfcdyZp<^c-TWhyeh#9- zz(fn|lfN;rV9p$c(oz;-l|x7j2g1LkNclc)evYOU0oV}Ok73l=e%bIH!6ySyD B$ewmPh- zQOJS-vD`99)C*)6g>6Gr;%$I8Az^JxzdtVg0zan^pk%l`eZ#?111aE;L+Xsh-3Ln= zC-~Y_p^l_${f%UR!or~iy+JSge+*Krp8NtxRtXYG1pe1Xz;HDf(IX+`fJSb>)x-r< zG`53wXlCR=QaRv|Z&kW*fusSbmH*&+UL3};L5_=JTU#5Fh8MPX9$sE3utpYM%V4;3 z^{_ygSp-hq9at3~SH7 `~jX@!yj7EA3fOvm)SVwjx04lJIDs{_9yh4Q1E`JLBunX zb_!m=mVw7>-%AlcJ5qgv!)OV}6yaM?2XAk#{N=VFof4pbAn2B$UH>26WXuNeRuEnX zf`LXN_AK0LLm=G=R3Zcw=*wvE0SBc4*;&9Qdk5fjNc1$&5R2cB)g5W#gkCQ2Z{Qca zyZ=JuTq)lM`P(*zAr;6V$Wa1G`9VyAwtRmSiA_u_E@zMr4&N3J%63A^VL;A?{s_AG2k zw`zRcKkYV?L#mjA$_~VsW?*t*Lk2Ppe{t=ac_ze$m?8N{SDAJ85~3dD#e{o$wDeC@ zX39Suz#1sl2p2_^Tv$F>_&J2>17VPoYj5u;M`5+XbzX9}<14ee@$u4?JM= %9nMl&WI?a)U6So9(b){Y2~X{ A@)2Zywszu`4nQ~FC0eUNZ<&F6 HL8w0LQ*ng5D}VcCG^-kv$o^>>@PTRX>_4D z?tQ@q{WzYjz*3SFNK|_8C@)f5$nT$`9?!+fGXc+u4B;pp+48vQx4sI)*rCXE2W1)^ z=l7HScZ{R^uI{`XJ4K%G{^$-3#%fE^ib&nT?+&^c_YuyS3~#Q4C#qKdQCu#CWmwV) z^Ev}7%jeCplx3Xh^eKBgGf 1qd6*) z+|1#Plql1&l-0p4F7M8bEGnGWTd}kIc(SomJ4Ttue*6|^Z-;nyE3r+co3m5OJjO*i z;jKjMU~I_)E|y+3`*FW*)d|n73Z)xyvm=Yk+XAtaHHRuaxpU~Xl)+iCnB3M)P4TzB zWkIo?n?%{}Gqgtg*K1t^jrQ7>c8{j %3}z=^Q~ N!m3-d>MN;&AEaG23$P*2(lRDpFd%Ik?Ulk-a zkw>IrD2Y8AW$z-${B5x^SuJY^m6<7HXME-3ZN9w@G(4_1HeBvnkYe*nm#S|UK$866 z>MT^D^ 4V% z39wsxl=}m@Y!PJEhWOo#d-$?lh`!;1f8@5-7sP(a0vphOV>EOFKzK`FUi}3vR*A@> z7l#&tw|n#v(yiKarq2lC0icQzw8yW27sv =vwBHTLw-vBn=m1e*aE&-x?3{u$D0GnG}x9ex1cX2`vh{4amAqx=B31NtT zJ%sgNJ_z0EecIkZ@T36319>3_w+;$a46vUS1w*J7SkIBrMr8d}1I_0 > zS|QNVxZ>#OsFJdAGHh7NHB9x0Et8_(>L);PMZ>!hws!)874I*OsPd29zqHtWUF_f+ zJm~ZmXK>h4@Up6gyi@diA=wE)M4rEYaJkhi(WeKjnE^8zS>7RQ{+Bcg`557p5RFUs zI|P9ldmcly-w2SOnvpC%Xx{vKF0ARO){Q~+fNcuD4AqSeMFcP|q zKpY_y!zj36$v;#a0EMS2s}NG0jLgk`A;4rs0H28ttkd#<_8Xpm%$f*=fcNP$XGWo? z)r53rkX8`@`D<>rjNbp`S|#he%>j%@WUqi1jL;sAz=Qrrjslk#K>rX z>|3UTpC%P;GDHRn5CZ-wm@;0men zs~_%=%~O!P^!eG7$QtyoMFr80u@d`mv`eR_nXJxOWzW{QhliChLl5N`kzR-x{`s<( zeJw9Rm~4A`>;e1DturqpTe>`r>OMp%q+P)z1{kqPtBUB2uQd0rBr|WZqLZj?N)N`r z&$L~gsaI}S`XC&Y PSH{j~YbwGY;@U9(Ng)(qSRJV{6w?*DcjQw zhDpjnzJ73ggpTLuDqBaT7H{!xQxJP{QEIW62;yS3K5fEFTZyurcuHh8k=imtQr @!d`N(NR#2A=yZk(H1@=Vs7T}fh@UN0%&qm=Q2S14$hSEJziZX(tFHS|Lh zdT-Vcxh*-O_KysSR!6ElqA*Z(D%FI S7Gm) RNtP+-xhJf(GV*DW_6#$7e08sj`Ck!W$5EkZ= zo#lI_;oco>!_roMC_6YHY(T~QKcO=RAmZZK1j=ukAC~V?0`2z~AVr2De-$t$1W&xt zhx0=?RLwTPCV4IIbsi}=0e9bO<24CC_-St7Z}bE#27mj>(6B!rcsLm>(J(Unh5P`d zRX+i|^cZAY*CS~__b)-n$TQ%Ijv(bSj2TNIApqGA!hp%D{A2%PI3d}>%8fvYkBeDH z!f+6V es2STe^ zt)6et+GYd*1F!a6xq)Cr0U5C8G1vpKPhJ4B9DWprrHwg^dk}ax!u|yY5hE<|v9Di+ z!D}3aMf)=#WlAB7?`x_Y8v-@2Dz<9;>^sqxaI3 LC b(2~1TXK|-emkrT~p#YZv-X9%^^I)d1;+o}aNR%QnTSX#VEg@qFjuWBa*8u4U#1cM+{p&U`a1ih^ z5?ukvwVw+aqyu2$09p!?h=OEEb`@J)whDxQ5r@R;znE&M-vQtnB82rn3IrZbY3EmA zt#F!Ig0w5x-ql`NAxW r!qLLo37pnzY26&`q)5Fr%<$2V3zMd~p) z2LuC!_#gn#Rm{!JgBwaSuR?w&eAJ>sd-oum@})~fO^@9i_P~}`ME-{4a3DNrpbq2b zN1$KGMurKq_Kh3ra9CaJof|+h#E~F*NJ~<=k>xlY=z;{KLB+I)oKS(n!m7A>7$Nu} z1Le}v(%X^zaBPLou^DOzqz(4Yx|SQMV WK)b@a`Z-qRBT7{{rY3!l_UPY*OeRBk*XP9<~WdRk>IEfgVZL0N~Bx)k^Z~0R5$h zSFZK5m!$r_m61k0zh@l%U{?3++sZM#Pl3PTRlVxX(4?_Wd`9}p)2sI9YI1D!Z&t=k z8t_!7$q$jV{H|a|-X9^+%dse+NkUfBBM`MsKg@Xk)VJ_;@p6TvDpoPjUCB}2vzqfn z40pG9KLEg9O9@A;%LMgeuGPg+_qd<^*T-@q-uw_%n554Q{?71|zTkyl5cJcqyn&Me zFX^fdo_?;$@p?k)PL*n^#-lie4=mi5(={=fi`7PaS?HNc_xThT8t-O(Y>U9sxKp`~ zBX@;q`{_XU;c_>#P-n@a{@KtgTarl*H6_l&Bo0x5Rp;HMEmi-FQnqE1P^JMoG;RkU z5#69=a3KmyvQ~%^pnaJqHJVN@w@DVY18O)yRC{@zkDlP3qAnl9XGH8$2x$mT%AO5B zZe(UX-X&EbgZ1iseNWawotv8Uow56mI$K`Ivv>8F+{<*<(dfOoyN+JrJB2@v*RYuA zPvgq)GABz%?tiTQqbY7;t1@0K)~&;nOTBPjfTCa1e0X=XjHK!IqjuQ&M=d^2IGg$O zEY6WKzWn3=BkH^3ss7{dD gpA=H{ZMUoTAn%O&P2jpOxh~M^Js8Q-}VO`wGJ6i z@tY%7R_Y?f#CRfuE`L&be23EKrB*HD!#qM&TB+XWqjl5$8us$wmBkR5Z2gJ%YGTXQ z@Z&F1caON;WBr;=c4Kdyw5djqL>W~vQ(h|%7a-8c)`%?q*uV)cvFvNh+c0L@4*5-? z3%YK9|B
AC(r5ayW;t31HMH)=!6Xn6VevYRdrr#rUn8>`c4*Uj+^&!wP zdL#J({Wp!jY9#HT(c~MvMWs`|wY1;(A6lQiMd!p2-m%Ir$+8w5dYK3DeXn!%Xpo0x zh497q#~1eLi45c(N_ijFzNV=)w9N|1mJ^_}qYi$?Bco- zKpv0+V@ak)!2O(*B?2~8!DI$f6G-7P;D`+%r>3_!KG>R5`Gg!y0o!@P;LIYW&y3eN zh67WXuCd)Ez;Xaj-7OlDJ37e-kht@Y!;h`cT 50ZtpJ7rkPy+T@Cbxp4_JL7?JNCf%d8AuYT%GqVTA#o=S%?Q zCP3ikNi|ab>`?2G^nDi~LIgB97y;V*Nx2a8;mTKxN?!5;&ld12SWI-Po28K19nvL@ z7+yQe?5`7yO3^kFMH-GEyAoIhQUFt3Fp+>^n+=2(ml`2yDYp>_W+0dcHX^TdffqiI zKzn|?G;C__RR52Q !Ud2j{} FVqO@{;~PE}@B!}M3OdJyY#M27mf4p+TAaU;hc3{|m-%=7(nVFSpWM2_BKw)s z5btti LBX 3or9Ry TT_Ku$M<>p;MRAiz1rk8kps@jpnsEH>%V+Cn~&+<0u`b36~hYH7ncVr){) z?gN8iy+cE^56bQD&=4I9C75?>SSb^qk#G3mq+@ZCnLcw=rZ^I7q_3a6r#P~YuZ+^| zth&k$-jbQPP{$S-_WH z(C_%5bNUex*myoITjW$r`cIu@Ys-CyiAimMhW@`Y3;Mh}033OU-v7Dr3fvTl`3MnU ztP~T$f$8mFa*p8Z`87Qq9WGFRDeH8nU~pn09H<3M=4mLLm+w3jM^r&kp?Y<3l6|t& zG(iW;eVw1JHVulBN5v@b&EaK~dk)z@ctzs13qx=H({?HnIOR$HrdcD3gK`rp4`xHN zu%!dpG2wmj9fOKgzlR|k>2Ry8R7M=i|3hLN%%tlN)r)@ZbUk$JSH&F*UGGIm!yzR{ zOv6oNX9`TmbcK5Y=JepY;YvVwi8n!8$&+qc$IsB |cKvMpOqevH4=ELyl6Rs_46c3iYW>4+7u6@?$Fmu#QiDd^) zWg;iVhTNQav2p|D6l%_ZA>7;I(R7NsQL38>Bphve_#~@Hw@1s5wmmQWqle`kG_1=! zH1Ae~sUm3He&6t2BhQF@5san7s-FBB|C_h39kf|0_x5hpGem*Jbb<*^QeMhGBx #ViR`+1EvvN)uzK(TX_v)>@Xq22f?`0#G2niCeLm-+K zR@q0oD| zIde1Jb9ghe{=qqq-d>ufF>CtkRix7EZ3@Ay!-D5*e#bb=48V6hH!=T zvuCcL $Xxe^a7rdFb zNUITD!V=wXmi;r|FU-X4W@S(%=GEobvI|q@*#iw5?_`{ iOYvpx{Ief$ko%EgtNIpzX7bj t_SSf;8o>yjR5 z73CFv?|WVSudiZT;L^sttA;fOr6S{*mBj5zCDG{j`|wLW^7BPZ8CO=g LjYX|0L6Shdhq*nl+TV7p_H~=F{&1vRW6pE1)DFZC&i%_pa zZ5zRnlkQZ{vmIw!f9xFtrjCCb5(|;MxlbY=zke@I@{9M`EjDlGOg8yg?z?9H#@QLN zBQh<%1K*gq(z{O@I?|_)DgJX3KbqRlY4;a~yO%I^P6EU gRi6jR~489z$E@ z!OJh+_apv;5yhr`VDx0C8WiBm6=rikEkrW;(0(J9r=0(=;k)5|0BozHLFDGq!PGuF z*x8SeUbk_2)J1j~I%>lm1DL2eaG_jNC+qL$N#qeJ0f;1m+TFF}Jl|h9=5J!Cs2F&< z* qttU0Pg*iqz;0VvzH4wxi3c?jJ5=fR|oJMC)oj$ zJcM~lg~$sRfflzNa(1BN@MEopD5Q^S-0UTo99oza?K~BV ejqDIw$9UMClC@vNlN{b zz#(82pzv4%mI<<%5&+=cT`czGRqN;M><*^qd{dpGDLN-rTo)x}`DU!LFfmLoH`Le& ztBSsV#us2gWzML>-ji19?R+sh4F|XxK`nwH pN7qAnSR(jF0<*vC6&qW1HV{ z6{?RUXVcxi-n1SrkK(QtaTdk;jQXIsjA@Qy;ZO2 (#2Z5nUgX6QR$&VOkIv1Gtj&2yG;c+61I$~nsMsVzDY<`LFe zz7H4_a_S@awwB^dytE{_u@_wXU}@>KFwHRg5B5 U#YTJ$O%`+x}=Sfa*Gj-x;UWY zu&2fy8scv%?pj)CWZlR{@GC8Sv_Rf}Q)-TPt_?9GoCVGL;TUxn%EsO!e70$b+WbO% zk+l3&0K+DGZbVXY@1Mafrm@!{m!o~#(l20M3RGCB==b`+K6qAYzxeCy@rO0WI2v`w zZ7av^$*e3@J}<_@UnUU(gr=Hz{=o6>w#e%UGnFDJS(o|aI++Vvg~)E#QO)B~sRXsw z?By^MOWRegofCBDXhBC@CF=ABV{7|mdxZ#2nkep&ZFWZW6N|>z=I)Gl0*_iToVXk5 zE2B$=f7&3e+Z;Z5F`Q=Qxn9RFCHLxk8IEdqt0!MKPuifNY|~;C9CHJR+`Fd!Q85N6 z7cET1UXq!mO-7-d0-h5xC!b0-Ot+PN!dn&{VMe21GKNUu7zKeVCzVm98g-T0nGL1L zo7Sh?`{gV-+`F$+f7CGeKbjHBPwyUEYC=DU+c-VOph_rXxrz62mnd*8_L6`6Ei)Im z2U_8o`0w|JbmOY`ew*03`NaihST&aD&qQx8!h(#`W1qFL_)Lq06-xPKHp4F$qr6{5 ztul@@x^#=y`OMYpIgPyNIOdXwsM5YOCw14aRQ6Cis*Z-M>>$)l M+W_jURTV|Wd+7Mc1igRfHT zz~GgO43YpdTr!XMk>``2gjQO?7chjJtt${6)`aBFRlkSj@ZdCES0%G=H@C*E&}Lc< zAnnos<;Gbv FZZ6hpH|vaE`xAsFuMeW-TqfX48@9*dItD+!=5mGh3+PF35Oy zM^j? _PBe5zax>^&kMgiFPs5P z^y4I((bwsYdbR*+90k0DAYcSYKGdBAW)eX{4Q==U4!T#fEuTn;B1rzRze`_Pwg*ZG z2}61}1-Au}n_}HZR*<9HHPe3Hz-Inl>OK&22{}zlxVyXGE?2&ipx-S|xBz1|%v;5B zHcG90n>VK>GWGPDyUP%lb4Pvm|L!VrQW6268D3K(CbQW@7D!aa0pLixQ18F%0n-&p zCqYuUlHQJQ2@OooEvXigOE 6o%2DM;HuToq+y?S2$ SO__;d*E=z?KevcHSMp_I3b+oqV(Z>yc`c?7?CU`bigRS9bAfL9vWxVeo z>70uxu53$?c*Hw*?regJrhfvau+KympS|XBrT|bsuK*PZFDOW5S=Wa~Mn2EB2In?5 zLP*K9A_Fpkc1V%{dlt|>9YCWH3D8cf>OL_=b93_rXiwGo-7Md|u@ #C3lAkLV*ma`84!xw=@%Q3sQ-N5(mGa)G! z??O=&tD}kz+YQIr$p_uXk-`(52pJc8W4z+(njF56<>W<}t{9FcD|q56&C7d`zg`m- z^c00e_x_=~a*nd6v2O#M(;JI