From 3c3ec67ab39e80071c44e07d6bea4f7df9c6a2a7 Mon Sep 17 00:00:00 2001 From: Axle1975 Date: Sat, 30 Mar 2024 10:22:49 +1100 Subject: [PATCH] tavmod-4.6 --- .gitattributes | 24 + Icon/AIRCONS.PCX | Bin 981 -> 989 bytes Icon/CONS.PCX | Bin 977 -> 985 bytes LICENSE | 79 ++ ProTA 4.4 changelog.txt | 2 +- ProTA 4.6 changelog.txt | 632 ++++++++++++ ProTA readme.txt | 141 ++- ProTA.gp3 | 4 +- TA.ini => ProTA.ini | 151 +-- Settings.ini | 278 ------ .../crt/crt-lottes-fast-no-warp-bilinear.glsl | 701 ++++++++++++++ Shaders/interpolation/bilinear.glsl | 73 ++ .../interpolation/catmull-rom-bilinear.glsl | 137 +++ Shaders/interpolation/jinc2-dedither.glsl | 202 ++++ Shaders/interpolation/lanczos2-sharp.glsl | 205 ++++ Shaders/nearest-neighbor.glsl | 73 ++ Shaders/readme.txt | 10 + Shaders/scanlines/scanline.glsl | 106 ++ Shaders/shader-package.zip | 3 + Shaders/sharpen/fast-sharpen.glsl | 148 +++ Shaders/xbr/xbr-lv2-noblend.glsl | 300 ++++++ Shaders/xbrz/xbrz-freescale.glsl | 375 ++++++++ TADEMO.UFO | 3 - TADemo/3DTA.exe | 3 + TADemo/3DTAConfig.exe | 3 + TADemo/HPIUtil.dll | 3 + TADemo/MAPS.TXT | 139 +++ TADemo/PALETTE.PAL | Bin 0 -> 1024 bytes TADemo/SERVER.EXE | 3 + TADemo/bagge.fnt | 3 + TADemo/bitmaps/detailtex.jpg | 3 + TADemo/bitmaps/gran.bmp | 3 + TADemo/bitmaps/gran2.bmp | 3 + TADemo/bitmaps/ocean.jpg | 3 + TADemo/uikeys.txt | 24 + TADemo/unitid.txt | 99 ++ TotalA.exe | 2 +- audiere.dll | 3 + bass.dll | Bin 139128 -> 131 bytes basscd.dll | Bin 26776 -> 130 bytes bassflac.dll | Bin 39232 -> 130 bytes bassmix.dll | Bin 32080 -> 130 bytes basswasapi.dll | Bin 14266 -> 130 bytes cnc-ddraw config.exe | 3 + ddraw.dll | 3 + ddraw.ini | 906 ++++++++++++++++++ dplayx.dll | 3 + tdraw.dll | 3 + tmusi.dll | 3 + tplayx.dll | 3 + wgmus.dll | Bin 62976 -> 130 bytes win32.dll | 3 + 52 files changed, 4481 insertions(+), 387 deletions(-) create mode 100644 LICENSE create mode 100644 ProTA 4.6 changelog.txt rename TA.ini => ProTA.ini (63%) delete mode 100644 Settings.ini create mode 100644 Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl create mode 100644 Shaders/interpolation/bilinear.glsl create mode 100644 Shaders/interpolation/catmull-rom-bilinear.glsl create mode 100644 Shaders/interpolation/jinc2-dedither.glsl create mode 100644 Shaders/interpolation/lanczos2-sharp.glsl create mode 100644 Shaders/nearest-neighbor.glsl create mode 100644 Shaders/readme.txt create mode 100644 Shaders/scanlines/scanline.glsl create mode 100644 Shaders/shader-package.zip create mode 100644 Shaders/sharpen/fast-sharpen.glsl create mode 100644 Shaders/xbr/xbr-lv2-noblend.glsl create mode 100644 Shaders/xbrz/xbrz-freescale.glsl delete mode 100644 TADEMO.UFO create mode 100644 TADemo/3DTA.exe create mode 100644 TADemo/3DTAConfig.exe create mode 100644 TADemo/HPIUtil.dll create mode 100644 TADemo/MAPS.TXT create mode 100644 TADemo/PALETTE.PAL create mode 100644 TADemo/SERVER.EXE create mode 100644 TADemo/bagge.fnt create mode 100644 TADemo/bitmaps/detailtex.jpg create mode 100644 TADemo/bitmaps/gran.bmp create mode 100644 TADemo/bitmaps/gran2.bmp create mode 100644 TADemo/bitmaps/ocean.jpg create mode 100644 TADemo/uikeys.txt create mode 100644 TADemo/unitid.txt create mode 100644 audiere.dll create mode 100644 cnc-ddraw config.exe create mode 100644 ddraw.dll create mode 100644 ddraw.ini create mode 100644 dplayx.dll create mode 100644 tdraw.dll create mode 100644 tmusi.dll create mode 100644 tplayx.dll create mode 100644 win32.dll diff --git a/.gitattributes b/.gitattributes index 5f29d3c..210f1ae 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,27 @@ TA_Features_2013.ccx filter=lfs diff=lfs merge=lfs -text ProTA.gp3 filter=lfs diff=lfs merge=lfs -text TotalA.exe filter=lfs diff=lfs merge=lfs -text TADEMO.UFO filter=lfs diff=lfs merge=lfs -text +Shaders/shader-package.zip filter=lfs diff=lfs merge=lfs -text +TADemo/3DTAConfig.exe filter=lfs diff=lfs merge=lfs -text +TADemo/HPIUtil.dll filter=lfs diff=lfs merge=lfs -text +TADemo/bagge.fnt filter=lfs diff=lfs merge=lfs -text +TADemo/bitmaps/gran.bmp filter=lfs diff=lfs merge=lfs -text +TADemo/bitmaps/gran2.bmp filter=lfs diff=lfs merge=lfs -text +TADemo/3DTA.exe filter=lfs diff=lfs merge=lfs -text +TADemo/bitmaps/detailtex.jpg filter=lfs diff=lfs merge=lfs -text +TADemo/bitmaps/ocean.jpg filter=lfs diff=lfs merge=lfs -text +TADemo/SERVER.EXE filter=lfs diff=lfs merge=lfs -text +bass.dll filter=lfs diff=lfs merge=lfs -text +basscd.dll filter=lfs diff=lfs merge=lfs -text +basswasapi.dll filter=lfs diff=lfs merge=lfs -text +ddraw.dll filter=lfs diff=lfs merge=lfs -text +tmusi.dll filter=lfs diff=lfs merge=lfs -text +win32.dll filter=lfs diff=lfs merge=lfs -text +audiere.dll filter=lfs diff=lfs merge=lfs -text +bassflac.dll filter=lfs diff=lfs merge=lfs -text +bassmix.dll filter=lfs diff=lfs merge=lfs -text +dplayx.dll filter=lfs diff=lfs merge=lfs -text +tdraw.dll filter=lfs diff=lfs merge=lfs -text +tplayx.dll filter=lfs diff=lfs merge=lfs -text +wgmus.dll filter=lfs diff=lfs merge=lfs -text +cnc-ddraw[[:space:]]config.exe filter=lfs diff=lfs merge=lfs -text diff --git a/Icon/AIRCONS.PCX b/Icon/AIRCONS.PCX index 8f3d91481fcc0da49021137f24ddafddf43af4de..e04068a634e19c2546b5e5b1d755cb07effb5b53 100644 GIT binary patch delta 28 jcmcc0ewTg1X2FAB4@DpR8hwcK;Q#1DK=z@HdnB0w=?xG5 delta 20 ccmcc1ewBT~X3isDqYrT&{2zU6;}J<_0B+3+UH||9 diff --git a/Icon/CONS.PCX b/Icon/CONS.PCX index 6f392fe7c3064902e73299b3c183ff4d0d1909f4..daa383340738ee72073de04ef10e2e7b4e56a6a0 100644 GIT binary patch delta 26 fcmcb}ev^H|68=M94@DpP8qLWGB!R4rtJRnRxV8;y delta 18 acmcb~evy5`682+Xqd7UFk8Rwn#tZ;X#s|s( diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..41838b3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,79 @@ +# TA Demo Recorder and Community Patch + +## LICENSE + +### TA Community Patch (original filename: tdraw.dll; source directory: src/DDRaw) + +The MIT License (MIT) + +Copyright (c) 2023 Axle1975, FunkyFr3sh +Copyright (c) 2019 Xpoy +Copyright (c) 2003 SJ, Yeha + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### TA Demo Recorder (original filename: tplayx.dll; source directory: src/Recorder) + +The MIT License (MIT) + +Copyright (c) 2015 Rime +Copyright (c) 2003 SJ, Yeha + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### TA Demo Replayer (original filename: SERVER.EXE, source directory: src/Server) + +The MIT License (MIT) + +Copyright (c) 2015 Chaos +Copyright (c) 2003 Fnordia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ProTA 4.4 changelog.txt b/ProTA 4.4 changelog.txt index 56731fe..6c0679e 100644 --- a/ProTA 4.4 changelog.txt +++ b/ProTA 4.4 changelog.txt @@ -235,7 +235,7 @@ Arm Maverick: Arm Shooter: Reduced health (1250->960) Reduced turn rate (1216->608) - Reduced torse aiming rate (210->105) + Reduced torso aiming rate (210->105) Core Sumo: Increased build time (14268->15365) diff --git a/ProTA 4.6 changelog.txt b/ProTA 4.6 changelog.txt new file mode 100644 index 0000000..7e189b3 --- /dev/null +++ b/ProTA 4.6 changelog.txt @@ -0,0 +1,632 @@ +ProTA 4.6 changelog +------------------------------------ + +Gameplay notes: + +- Added new units: Arm/Core Underwater Moho Mine +- Added new units: Arm/Core Underwater Moho Metal Maker +- Added auto unload scripts for sea/hover transports +- Added rotated versions of Arm Big Bertha/Core Intimidator to improve balance when turning to aim the first shot +- Added rotated versions of Arm Vulcan/Core Buzzsaw to improve balance when turning to aim the first shot +- Fixed incorrect footprint for Arm/Core Advanced Construction Sub which stopped them moving close to each other +- Added Commander build menus to Decoy Commanders +- Added .exe hacks: + - Allow weapons to acquire targets while reclaiming a unit + - Allow weapons to acquire targets while capturing a unit + - Allow weapons to acquire targets while repairing a unit + - Allow weapons to acquire targets while assist-nanolating a new unit + - Allow weapons to acquire targets while building a new unit + - Patches main rendering function to draw player 11 features regardless of LOS (see engine notes) + - Enable mex snap and set its default (3) and maximum (3) radius (see engine notes) + - Enable wreck snap and set its default (1) and maximum (1) radius (see engine notes) +- Removed units from CTRL+S/CTRL+W hotkeys (see engine notes): + - Arm Bear + - Arm Eraser + - Arm Escort + - Arm Fibber + - Arm Hulk + - Arm Infiltrator + - Arm Invader + - Arm Jammer + - Arm Marky + - Arm Scarab + - Arm Seer + - Core Deleter + - Core Envoy + - Core Hedgehog + - Core Informer + - Core Parasite + - Core Phantom + - Core Roach + - Core Spectre + - Core Turtle + - Core Voyeur +- Removed units from CTRL+F hotkey (see engine notes): + - Arm Protector + - Arm Retaliator + - Arm Stunner + - Core Fortitude + - Core Neutron + - Core Silencer + +GUI notes: + +- Added arrows to Arm Big Bertha/Core Intimidator build pictures to build rotated versions +- Added arrows to Arm Vulcan/Core Buzzsaw build pictures to build rotated versions +- Fixed cursor animation speed +- Added +noshake and .ready buttons to sharing menu (see engine notes) +- Added .autopause button to battleroom screen (see engine notes) +- Added clock and weather report (wind and tidal strength) on top resource panel (see engine notes) + +Engine notes: + +- Updated to new TA engine v2024.3.25 (see tdraw.txt for new features in detail) + +NEW FEATURES IN BRIEF: + +- Set start positions based on battleroom teams (or alliances) +- Repair battleroom team icons so they can be used to create teams before launching game +- Add +autoteam battleroom and in-game commands to automatically assign teams +- Add +randomteam battleroom command to automatically assign random teams +- Add .exereport battleroom command to report CRC32 of each player's totala.exe +- Add .tdreport battleroom command to report CRC32 of each player's tdraw.dll +- Add .tpreport battleroom command to report CRC32 of each player's tplayx.dll +- Add .gp3report battleroom command to report CRC32 of each player's rev31.gp3 +- Add .crcreport battleroom command to report fingerprints of each player's totala.exe, tdraw.dll, tplayx.dll and rev31.gp3 file all at once +- ClickSnap to snap to nearest mex, geo or reclaimable feature +- Add ability to drag queued orders around the map +- Con units patrol behaviour - hold position: reclaim only +- Fix the "ghost com" bug (remote commanders appear in top left of map during first 50sec of game) +- Fix the "units exploding in factories" bug by holding back recycling of deceased units' IDs for 5 seconds +- Option to render DTs and fortwalls that belong to the map (not built by a player) +- Supress "qqqqqq" whiteboard marker lables when "q" is used as the whiteboard key +- Show clock and weather report (wind and tidal strength) on top resource panel +- Sync wind speed across all players +- Set default resolution on new installs to 1024x768 (.ini setting "DisplayModeMinHeight768 = TRUE/FALSE") +- Disable relay of F11 chatmacro text to other players +- Enable start button in multiplayer lobby if only one player + AI are present +- Add +noshake and .ready buttons to sharing menu +- Add .autopause button to battleroom screen +- Change whiteboard, mappos and resource indicator colours in response to +logo commands +- Prevent +logo commands from affecting other players +- Ctrl-B doesn't select aircraft carriers +- Ctrl-F centres view on selected factory +- Ctrl-S works correctly with mobile-units-can-build-mobile-units hack +- Set +lostype as a cheatcode (not available unless cheats enabled) +- Look for ddraw.dll in current working directory as backend, or failing that use system ddraw.dll +- Use the same .ini file as TotalA.exe +- Use the same registry path as TotalA.exe +- Add FPS counter to megamap, increase megamap FPS +- Fix blue background on scoreboard +- Grey background on mega map to distinguish from unmapped area +- Prevent Ctrl-F2 dialog and allies resource bar from moving off screen +- Improve responsiveness of whiteboard marker movements sent to remote players +- Render cursor while in megamap +- Fix crash when removing markers +- Fix crash on simultaneous whiteboard marker move and delete +- Fix rare crash on TA Hook line drawing +- Radar and sonar jammers no longer jam your own radar and sonar in >3 player multiplayer +- Use CTRL_F and CTRL_B unit category tags for CTRL+F and CTRL+B hotkeys in preference to heuristics +- Change CTRL+S to use CTRL_W and NOTAIR/NAIR categories so as not to select jammers etc + +Other notes: + +- CnC-DDraw 6.3 by FunkyFr3sh included in install (updated from 5.1.0.0) +- WGMUS 0.0.23 by MnHebi included in install (updated from 0.0.17) + + +Buildings +------------------------------------ + +Arm Wind Generator: +- Fixed build angle shading glitch + +Arm Sentinel: +- Increased weapon velocity (800->900) + +Core Gaat Gun: +- Increased weapon velocity (800->900) + +Core Viper: +- Increased weapon velocity (800->900) + +Arm Guardian: +- Reduced metal cost (1946->1751) +- Reduced health (2477->2230) + +Core Punisher: +- Reduced metal cost (1887->1698) +- Reduced health (2540->2285) + +Arm Underwater Metal Extractor: +- Reduced self destruct countdown (5->0) +- Added sound on self destruct + +Core Underwater Metal Extractor: +- Reduced self destruct countdown (5->0) +- Added sound on self destruct + +Arm Sonar Station: +- Increased sonar distance (1180->1250) + +Core Sonar Station: +- Increased sonar distance (1180->1250) + +Arm Defender - NS: +- Increased health (252->335) + +Core Stinger: +- Reduced build time (2357->2239) +- Increased health (290->340) + +Arm Stingray: +- Reduced range (550->500) +- Increased weapon velocity (800->900) + +Core Thunderbolt: +- Reduced range (550->500) +- Increased weapon velocity (800->900) + +Arm Seaplane Platform: +- Added Arm Peeper to build menu +- Reduced energy cost (3777->3597) +- Reduced metal cost (1556->1482) +- Reduced build time (13473->12832) + +Core Seaplane Platform: +- Added Core Fink to build menu +- Reduced energy cost (3757->3578) +- Reduced metal cost (1613->1537) +- Reduced build time (14071->13401) + + +Mines +------------------------------------ + +Arm Tiny: +- Reduced build time (1322->661) +- Reduced energy cost (1017->509) +- Reduced cloak cost (7->3) +- Reduced edge effectiveness (1->0.1) + +Arm Area Mine: +- Reduced build time (2481->1241) +- Reduced energy cost (1909->955) +- Reduced cloak cost (14->6) +- Reduced edge effectiveness (1->0.05) + +Arm Focused Mine: +- Reduced build time (3494->1747) +- Reduced energy cost (2688->1344) +- Reduced cloak cost (19->9) +- Reduced edge effectiveness (1->0.1) + +Arm HE Area Mine: +- Reduced build time (5582->2791) +- Reduced energy cost (4294->2147) +- Reduced cloak cost (31->15) +- Reduced edge effectiveness (1->0.05) + +Arm Precision Mine: +- Reduced build time (5375->2688) +- Reduced energy cost (4135->2068) +- Reduced health (200->100) +- Reduced cloak cost (30->15) +- Reduced edge effectiveness (1->0.1) + +Arm Nuclear Mine: +- Reduced build time (28953->14477) +- Reduced energy cost (22272->11136) +- Reduced cloak cost (79->40) +- Reduced edge effectiveness (1->0.15) + +Core M-104: +- Reduced build time (665->333) +- Reduced energy cost (532->266) +- Reduced health (200->100) +- Reduced cloak cost (5->2) +- Reduced edge effectiveness (1->0.1) + +Core M-209: +- Reduced build time (1445->723) +- Reduced energy cost (1156->578) +- Reduced health (200->100) +- Reduced cloak cost (11->5) +- Reduced edge effectiveness (1->0.05) + +Core M-303: +- Reduced build time (2130->1065) +- Reduced energy cost (1704->852) +- Reduced health (200->100) +- Reduced cloak cost (15->8) +- Reduced edge effectiveness (1->0.1) + +Core M-420: +- Reduced build time (2927->1464) +- Reduced energy cost (2342->1171) +- Reduced health (200->100) +- Reduced cloak cost (21->11) +- Reduced edge effectiveness (1->0.05) + +Core M-515: +- Reduced build time (9508->4754) +- Reduced energy cost (7607->3804) +- Reduced health (200->100) +- Reduced cloak cost (70->35) +- Reduced edge effectiveness (1->0.1) + +Core M-610: +- Reduced build time (32715->16358) +- Reduced energy cost (26172->13086) +- Reduced health (200->100) +- Reduced cloak cost (123->50) +- Reduced edge effectiveness (1->0.15) + + +Kbots +------------------------------------ + +Arm Construction Kbot: +- Fixed opening/closing animation glitch + +Core Storm: +- Increased acceleration (0.091552734->0.1) + +Arm Jethro: +- Reduced energy cost (1036->975) +- Reduced metal cost (109->102) +- Reduced build time (2104->1973) + +Core Crasher: +- Reduced energy cost (1040->979) +- Reduced metal cost (110->103) +- Reduced build time (2108->1977) + + +Vehicles +------------------------------------ + +Arm Jeffy: +- Increased weapon velocity (700->900) + +Core Weasel: +- Increased weapon velocity (700->900) + +Arm Podger: +- Increased build time (1519->3038) +- Increased energy cost (1031->2062) +- Increased speed (1.2->1.5) +- Reduced worker time (120->90) + +Core Spoiler: +- Increased build time (1740->3480) +- Increased energy cost (1117->2234) +- Increased speed (1.1->1.4) +- Reduced worker time (120->90) + + +Ships +------------------------------------ + +Arm Skeeter: +- Increased weapon velocity (laser) (700->900) + +Core Searcher: +- Fixed incorrect wake +- Increased weapon velocity (laser) (700->900) + +Arm Hulk: +- Added auto unload script + +Core Envoy: +- Added auto unload script + + +Hovercraft +------------------------------------ + +Arm Skimmer: +- Increased weapon velocity (450->900) + +Core Scrubber: +- Increased weapon velocity (400->900) + +Arm Swatter: +- Reduced opening animation time +- Changed primary weapon bad target category (VTOL->NOTAIR) +- Removed NoChaseCategory tag +- Reduced metal cost (256->240) +- Increased health (775->844) +- Increased speed (1.9->2) +- Increased aim speed (250->350) + +Core Slinger: +- Reduced opening animation time +- Changed primary weapon bad target category (VTOL->NOTAIR) +- Removed NoChaseCategory tag +- Reduced metal cost (250->230) +- Increased health (795->888) +- Increased speed (1.9->2) +- Increased range (600->650) +- Increased aim speed (250->350) + +Arm Wombat: +- Reduced weapon timer (3->2) +- Reduced flight time (10->4) +- Increased start velocity (100->250) + +Core Nixer: +- Reduced weapon timer (3->2) +- Reduced flight time (10->4) +- Increased start velocity (100->250) + +Arm Bear: +- Added auto unload script + +Core Turtle: +- Added auto unload script + + +Advanced Buildings +------------------------------------ + +Core Moho Metal Maker: +- Fixed bug where unit wouldn't turn off when hit +- Reduced opening/closing animation speed + +Arm Flakker: +- Added improved fire and hit sounds +- Changed from ballistic weapon to line of sight +- Increased tolerance (1000->4000) +- Added selfprop tag (1) +- Added unitsonly tag (1) +- Added pitchtolerance tag (6000) +- Added guidance tag (1) +- Added turnrate tag (3000) + +Core Cobra: +- Added improved fire and hit sounds +- Changed from ballistic weapon to line of sight +- Increased tolerance (1000->4000) +- Added selfprop tag (1) +- Added unitsonly tag (1) +- Added pitchtolerance tag (6000) +- Added guidance tag (1) +- Added turnrate tag (3000) + +Arm Big Bertha: +- Added rotated versions +- Reduced accuracy (500->562) (lower is better) + +Core Intimidator: +- Added rotated versions +- Reduced range (5120->4608) + +Arm Vulcan: +- Added rotated versions +- Fixed build angle shading glitch and added more team colour + +Core Buzzsaw: +- Added rotated versions + +Arm Stunner: +- Added special damages for new units +- Reduced area of effect (640->512) +- Increased reload time (130->150) + +Core Neutron: +- Added special damages for new units +- Reduced area of effect (640->512) +- Increased reload time (130->150) + +Arm Protector: +- Reduced energy cost (88000->79200) +- Reduced build time (95678->86110) +- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE) + +Core Fortitude: +- Reduced energy cost (92321->83089) +- Reduced build time (96450->86805) +- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE) + +Arm Retaliator: +- Increased build time (143517->160608) + +Core Silencer: +- Increased build time (144675->163119) + +Arm Adv. Aircraft Plant: +- Increased metal cost (2431->2542) + +Core Adv. Aircraft Plant: +- Increased metal cost (2410->2520) + +Arm Adv. Shipyard: +- Reduced metal cost (2524->2272) + +Core Adv. Shipyard: +- Reduced metal cost (2460->2214) + +Arm Advanced Sonar Station: +- Increased sonar distance (2360->2500) + +Arm Advanced Sonar Station: +- Increased sonar distance (2360->2500) + + +Advanced Kbots +------------------------------------ + +Arm Warrior: +- Reduced health (1550->1395) + +Core Pyro: +- Reduced health (1350->1215) + +Core Gimp: +- Increased weapon velocity (laser) (700->900) + +Arm Zeus: +- Reduced health (2450->2330) + +Core Can: +- Reduced health (2800->2660) +- Increased weapon velocity (700->900) + +Arm Fido: +- Edited model to lower barrel +- Converted to single shot weapon +- Increased weapon velocity (350->400) +- Increased damage per shot (65->150) +- Reduced DPS (75->57.69) +- Reduced health (1300->1250) +- Reduced turn rate (900->800) +- Reduced speed (1.4->1.25) + +Core Morty: +- Reduced health (1150->1100) +- Reduced speed (1.13->1.1) +- Increased brake rate (0.183105469->0.19) +- Reduced range (770->720) + +Core Dominator: +- Reduced range (500->450) + +Arm Marky: +- Increased speed (0.94->1) + +Core Sumo: +- Increased weapon velocity (800->900) +- Reduced energy storage (100->0) + +Arm FARK: +- Fixed opening/closing animation glitch +- Increased build time (7931->8922) +- Increased energy cost (3219->4024) +- Increased energy storage (0->50) +- Increased metal storage (0->50) + +Core Necro: +- Increased build time (8562->9133) +- Increased energy production (0.4->19) +- Increased metal production (0->0.5) + +Arm Infiltrator: +- Increased metal cost (128->154) +- Increased speed (1.9->2.1) +- Reduced minimum cloak distance (80->60) + +Core Parasite: +- Reduced energy cost (13452->9416) +- Reduced build time (12711->12005) +- Reduced minimum cloak distance (80->60) + +Arm Decoy Commander: +- Reduced death explosion AOE (950->580) +- Added Commander build menu + +Core Decoy Commander: +- Reduced death explosion AOE (950->580) +- Added Commander build menu + + +Advanced Vehicles +------------------------------------ + +Arm Adv. Construction Vehicle: +- Reduced build time (10397->9357) + +Core Adv. Construction Vehicle: +- Reduced build time (10806->9725) + +Arm Bulldog: +- Added barrels from TA Mayhem model and retextured to add more team colour + +Arm Spider: +- Scaled model down by 15% and added team colour +- Changed footprint from 3x3 to 2x2 +- Increased speed (1.6->1.7) +- Increased range (220->240) +- Increased weapon velocity (700->900) + +Arm Merl: +- Reduced reload time (12->10) +- Increased DPS (50->60) +- Reduced weapon timer (3->2) +- Reduced flight time (5->4) +- Increased start velocity (100->250) + +Core Diplomat: +- Reduced reload time (13->11) +- Increased DPS (46.15->54.55) +- Reduced weapon timer (3->2) +- Reduced flight time (5->4) +- Increased start velocity (100->250) + +Arm Scarab: +- Reduced energy cost (88000->79200) +- Reduced build time (95678->86110) +- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE) + +Core Hedgehog: +- Reduced energy cost (92321->83089) +- Reduced build time (96450->86805) +- Changed death explosion (ATOMIC_BLAST -> ATOMIC_BLASTSML) (2000 damage, 516 AOE -> 1000 damage, 260 AOE) + + +Advanced Aircraft +------------------------------------ + +Arm Phoenix: +- Reduced health (520->470) + +Core Hurricane: +- Reduced health (530->480) + + +Advanced Ships +------------------------------------ + +Arm Advanced Construction Sub: +- Changed footprint from 6x6 to 4x4 +- Increased speed (2.15->2.35) + +Core Advanced Construction Sub: +- Changed footprint from 6x6 to 4x4 +- Increased speed (2.05->2.25) + +Arm Ranger: +- Fixed radar not activating +- Added radar dish to unit model +- Added script from TA Mayhem +- Reduced weapon timer (3->2) +- Reduced flight time (5->4) +- Increased start velocity (100->250) + +Core Hydra: +- Added script from TA Mayhem +- Reduced weapon timer (3->2) +- Reduced flight time (5->4) +- Increased start velocity (100->250) + +Arm Pirahna: +- Increased damage per shot (300->350) +- Increased DPS (130.43->152.17) +- Increased special damage (double) to Arm Lurker and Core Snake (580->700) +- Increased special damage (double) to Core Leviathan (580->700) +- Increased special damage (double) to Arm Triton and Core Crock (600->700) + +Core Shark: +- Increased damage per shot (310->370) +- Increased DPS (135.96->162.28) +- Increased special damage (double) to Arm Lurker and Core Snake (600->740) +- Increased special damage (double) to Core Leviathan (600->740) +- Increased special damage (double) to Arm Triton and Core Crock (600->740) + +Arm Fibber: +- Increased sight distance (150->200) +- Increased sonar jamming distance (150->200) + +Core Warlord: +- Increased weapon velocity (laser) (800->900) +- Reduced range (laser) (810->770) \ No newline at end of file diff --git a/ProTA readme.txt b/ProTA readme.txt index 68f3c9f..56d841b 100644 --- a/ProTA readme.txt +++ b/ProTA readme.txt @@ -1,49 +1,124 @@ -ProTA by TAG_Venom - Readme +ProTA - https://prota.tauniverse.com +A rebalancing of Total Annihilation by the pros that stays true to the original game. -The goal of ProTA is to bring units that were neglected in OTA into balance with the dominant meta of 2000-2010. Key important units from that time remain untouched (Flash, Thunder, Samson, Slasher, Weasel, Pelican, etc) allowing the same strategies from that era to remain viable. Most other units have had subtle and thoughtful changes that bring them into use. You can still go fast advanced and reclaim that factory to get your Fusion going if you want to, but now those formerly neglected advanced units have had their costs and stats altered to make them competitive with standard units. So you might want to keep that advanced factory after all, and you might want to replace those Metal Extractors with Moho Mines first. -Core and Arm have been balanced using the existing Flash/Samson/Slasher meta as a baseline. The Instigator is now viable and competitive against the Flash. The Raider and the Stumpy have a place in the melee. Kbots are an early option as well as vehicles. Each unit has a role where it can be the optimal choice based on the map conditions and player you’re up against. Choose the style that best suits you or one that will annihilate your opponent. Despite all the unit stat changes, gameplay tweaks and bug fixes, I still wanted it to feel like playing OTA and not too drastically different, as far as the early game strategies available and the pacing in general. I feel like I have achieved that quite well. +Mission -On top of all this, lots of quality of life improvements have been made. The GUI has been improved and extended with 12 build icons per page. Orders are on the same page and you are not required to switch to a separate page to reclaim wreckages or repair units. Build hotkeys are available and overlays are shown on the build menu, showing you which hotkey to press to build each unit. Many visual improvements have been made as well, from the mini map dot colors, to team colors, to the models and textures. +Our mission is to bring a renewed vitality to Total Annihilation by making every unit relevant without compromising the essence of the original game. We acknowledge the inherent conflict in our goals, aiming for a middle ground that retains the familiar pace and strategies while infusing new life into underutilised units. -This mod has been fine-tuned and play tested by an all-star cast of OTA commanders: +1. Maximising Unit Relevance +Our primary objective is to ensure that every unit in ProTA serves a meaningful purpose within the gameplay. Through careful adjustments and enhancements, we strive to make all units useful, offering players a diverse array of strategic options without diminishing the core Total Annihilation experience. + +2. Preserving the Total Annihilation Experience + +We are committed to maintaining the original pace and strategies that players know and love. ProTA seeks to retain the familiar feel of Total Annihilation, allowing players to employ classic strategies and tactics while incorporating the newfound usefulness of units. + +3. Affordability and Pace + +ProTA adopts a strategic approach to unit balancing, prioritising either the reduction of costs for weaker units or strengthening within the current cost framework, depending on the unit and situation. The decision between these two options is made on a case-by-case basis, ensuring the best fit for each unit. Importantly, ProTA strives to avoid increasing costs, maintaining affordability and pace. This ensures units are affordable and replaceable, readily deployable to contribute to the action as soon as possible. ProTA underscores the significance of fighting over and reclaiming wreck fields, adhering to the original game's emphasis on dynamic play rather than adopting a passive strategy of waiting for expensive units to be constructed. + +4. Minimal Changes to Established Units + +Acknowledging the significance of player familiarity, ProTA strives to make minimal adjustments to frequently used units. This approach ensures that gameplay retains its distinctive identity, staying true to the essence of the original units while providing a sense of continuity for seasoned players. + +5. Asymmetric Balance between Arm and Core + +ProTA recognises that Arm and Core factions are not mirrored but are balanced asymmetrically. This deliberate asymmetry contributes to the richness of gameplay dynamics, allowing for diverse strategies and interactions between the factions. Importantly, ProTA aims for a balanced asymmetry that ensures both Arm and Core factions remain viable choices on all maps. The goal is to provide players with the freedom to choose their preferred faction without being constrained by the map, fostering a diverse and strategic playing environment. + +6. Community Feedback and Evolution + +ProTA is built upon the extensive experience and insights of long-time, high level players of the original game. To maintain ProTA's integrity, we prioritise input grounded in real-world gameplay experiences, especially valuing perspectives from seasoned players. However, all feedback is valuable, regardless of experience, provided it aligns with the mod's goals and is substantiated with evidence or replays. + +7. Real-World Gameplay over Numbers Critique + +ProTA highly values feedback grounded in genuine gameplay experiences. While numbers and data are important, our primary focus is on the real impact of changes in live matches. We approach critiques based solely on game files with caution, recognising the concrete goals we aim to achieve in practical gameplay. It's important to note that some of the data can be misleading in different ways, and our emphasis on real-world experiences helps to navigate through potential discrepancies. + +8. Enhancing Gameplay Interaction + +ProTA is dedicated to refining the player experience by enhancing the user interface and usability within the constraints of the TA engine. With the addition of intuitive hotkeys and an extended build menu, our aim is to make navigation more seamless and player-friendly. We recognise the limitations imposed by the engine but strive to optimise the available interface elements for improved gameplay accessibility. + +By navigating the challenges that arise and exploring exciting possibilities, our commitment to honoring Total Annihilation's legacy persists. Our goal is clear: to craft the ultimate Total Annihilation mod that both seasoned veterans and newcomers can proudly call their own. We deeply appreciate our community's insights, which contribute to the delicate balance of our conflicting goals. As we strive to enhance your gaming experience, we hope we've done our players proud, by elevating Total Annihilation gameplay to new heights. Here's to another 4000 years of total war. + + +Credits + +In the collaborative journey of bringing ProTA to life, a dedicated group of individuals has contributed their time, expertise, and passion. Their collective efforts have played a vital role in shaping the mod and enhancing the Total Annihilation experience. Here, we express our sincere gratitude to those whose contributions have been instrumental in the development and success of ProTA. + +This mod has been fine-tuned and play-tested by an all-star cast of OTA commanders: TAG_Venom TAG_ROCK PRO_rANDY Tiptushi TAG_Metn -Gnug215 timmyfred -TAG_Webster +TAG_Sensation FFAxPostal -Gnug115 TAG_Dominator +Gnug215 OZ_coolnick BTU_Natas TAG_Mastah -Gnug615 - -In addition to the help of the play testers, the mod would not have been possible without the efforts of the following people: - -gamma - Helped me a lot with scripting, brought his experience into balancing discussions and allowed me to use some TA Mayhem scripts, fixes and models -Switeck - I used many fixes from Switeck's TA Bugfix. Some of the fixes I disagree with from a gameplay perspective, but many were used and the mod is much better as a result of Switeck's work -ArmouredFish - Helped me a lot with scripting, helped me implement some game changing fixes such as non blocking sea wreckages and offered a lot of general TA knowledge throughout the process -Vohvelieläin - Helped me a lot with his modding knowledge and helped edit some models and scripts -Thaldren - Improved performance in Windows 10 and helped setup the ProTA recorder -FunkyFr3sh - Helped fix bugs with ddraw and spent time making CnC-ddraw work flawlessly with TA -Axle1975 - Helped me fix some issues with the recorder and gave ProTA a platform for competitive play (www.taforever.com) -poosticks - I used his TA guide extensively throughout the modding process to check unit stats and other details -Idec Sdawkminn - I used his TAU forum posts "Complete Unit FBI Guide" and "Comprehensive Weapons Guide" a lot which were massively useful when learning how to mod TA -zwzsg - His TAU forum posts provided the knowledge that allowed for non blocking sea wreckages -SnakeInTheMirror - For work on the TA complete colour enhancement pack. I used orange, teal and the improved yellow from this mod -PlasmoidThunder - Informed me of some sound category bugs within OTA that I wasn't aware of and some other things I had missed -TAAN - I used some of the Evolva models made by TAAN to improve the mod visually. Some I kept as-is, some I made edits to, to fit with my own vision -ACE_Beeky - I often checked his TAU post "A Guide To Every Unit In TA" for things I may have missed -Wotan - Changed a stubborn, anti-mod OTA player's mind about mods in general and showed me what was possible -Dragun101 - Promoted the mod to a wider audience and exposed the FAF community to ProTA and TA in general, by involving ProTA in his SCTA mod showmatch livestreams -Postal - Helped promote the mod via his Total Annihilation Replays Youtube channel, offered his Core Commander knowledge in balance discussions and helped keep me motivated to finish the project -timmyfred - Helped keep me motivated after Postal went on paternity leave. Helped with a lot of things along the way from testing fixes, putting in play time and always joined in with balance discussions -TAG_ROCK - Just for being TAG_ROCK - -To anyone that I may have missed, thank you. \ No newline at end of file +Gnug115 + +In addition to the help of the play-testers, the mod would not have been possible without the efforts of the following people: + +gamma +Instrumental in scripting, gamma brought a wealth of experience to balancing discussions. We are grateful for the permission to incorporate TA Mayhem scripts, fixes, and models. + +Switeck +Leveraging numerous fixes from Switeck's TA Bugfix, we enhanced the mod's functionality. While not in complete alignment from a gameplay perspective, Switeck's work has undeniably elevated the mod. + +ArmouredFish +Offering substantial support in scripting, ArmouredFish played a crucial role in implementing game-changing fixes, such as non-blocking sea wreckages. His extensive TA knowledge proved invaluable throughout the development process. + +Vohvelieläin +Contributing significant modding expertise, Vohvelieläin aided in editing models and scripts, enriching the overall quality of the mod. + +Axle1975 +Addressing recorder issues and providing a platform for competitive play on taforever.com, the contributions of Axle1975 have left a lasting impact on ProTA. Additionally, his significant work on the TA engine, including bug fixes and the implementation of game-changing features, has further enhanced the mod's overall experience. + +FunkyFr3sh +Integral to ProTA's functionality on modern operating systems, FunkyFr3sh played a crucial role by adapting his software, CnC-DDraw, to seamlessly integrate with TA. This ensured full compatibility and functionality, addressing potential issues on newer platforms. Furthermore, FunkyFr3sh's expertise extended to valuable contributions in fixing issues within the TA engine, enhancing the overall performance and stability of the mod. + +poosticks +A comprehensive TA guide served as an essential reference throughout the modding process, aiding in the verification of unit statistics and other details. + +Idec Sdawkminn +Leveraging insights from TAU forum posts, particularly "Complete Unit FBI Guide" and "Comprehensive Weapons Guide," Idec Sdawkminn's resources played a crucial role in learning the intricacies of modding TA. + +zwzsg +Thanks to zwzsg's TAU forum posts, knowledge was acquired that facilitated the implementation of non-blocking sea wreckages. + +SnakeInTheMirror +Acknowledging the significant work on the TA complete colour enhancement pack, we incorporated the team colours orange and teal, and enhanced the existing yellow, enriching the visual experience within the mod. + +PlasmoidThunder +Identifying sound category bugs and providing additional insights, PlasmoidThunder's expertise ensured a more refined end product. + +TAAN +Integrated some of the Evolva models by TAAN for a visual boost, some as-is and tweaking others to enhance the mod's aesthetics. + +ACE_Beeky +Regular reference to ACE_Beeky's TAU post, "A Guide To Every Unit In TA," ensured comprehensive coverage and understanding, catching details that might have been otherwise overlooked. + +Wotan +Effectively challenging the perspectives of anti-mod players, Wotan demonstrated what was achievable through modding. + +Dragun101 +Elevated the mod's visibility by promoting it to a wider audience and incorporating ProTA into SCTA mod showmatch live streams. + +Postal +Played a pivotal role in mod promotion through the Total Annihilation Replays YouTube channel. Also, Postal's Core Commander knowledge and contributions to balance discussions have been invaluable. + +timmyfred +Assisted in maintaining motivation during Postal's absence, contributing to various tasks such as testing fixes, actively participating in playtesting, and consistently engaging in discussions on balance improvements. + +TAG_ROCK +Has played a pivotal role in showcasing the mod's gameplay, dedicating significant playtime, offering valuable assistance, and generously contributing funds for new 3D models. His dedicated involvement has been indispensable to the project's success. + +Tristan +Preserving the mod's visual coherence, Tristan's 3D models for new units seamlessly assimilate into the theme, capturing the essence of Cavedog's original design. Throughout the collaborative process, his keen attention to detail and receptiveness to our ideas and thoughts fostered a dynamic exchange, resulting in finely crafted additions to the mod. + + +We extend our gratitude to anyone inadvertently omitted from this list. Your contributions have been invaluable to the success of ProTA. A heartfelt thank you to all players, casters, map makers, feedback contributors, content creators, and everyone who has lent their support in any form. Your collective efforts have played a significant role in shaping the success of ProTA, and we appreciate your dedication to the Total Annihilation community. \ No newline at end of file diff --git a/ProTA.gp3 b/ProTA.gp3 index c1d34aa..c2da808 100644 --- a/ProTA.gp3 +++ b/ProTA.gp3 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa4e7c10156b4254aa4c42d8afbdd62dea3e2ecb3c8f0880640efee951c3da16 -size 10910632 +oid sha256:bb035766e6eeed5d0679620d269bb60ece3db44e2886915a1268338a4622ded3 +size 11200301 diff --git a/TA.ini b/ProTA.ini similarity index 63% rename from TA.ini rename to ProTA.ini index 37a50e5..a52dcef 100644 --- a/TA.ini +++ b/ProTA.ini @@ -1,75 +1,96 @@ -; Total Annihilation v3.9.02 advanced settings +; ProTA 4.6 settings (TA v2024.3.25) -; Windowed mode will disable many TA v3.9.02 features (including some of these) and is not recommended +; Original windowed mode will disable many TA v2024.3.25 features (including some of these) and is not recommended +; You can use cnc-ddraw for windowed mode instead: https://github.com/FunkyFr3sh/cnc-ddraw/releases (included with ProTA 4.6) -[Preferences] ; custom settings, if any entry is disabled the "TA v3.9.02 default" values will be used +[Preferences] +; custom settings, if any entry is disabled the "TA v2024.3.25 default" values will be used -UseVideoMemory=TRUE; +; Create DirectDraw surfaces in video memory rather than system memory +; Change the following setting if your game is not running smoothly +; This setting is ignored if you are using cnc-ddraw +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE +UseVideoMemory = TRUE; + +; Override your "DisplayModeHeight" registry setting if lower than 768 +; If "DisplayModeWidth" is below 1024 it will override it as well +; Resolutions shown in the in-game list (EnumDisplayModes) are only filtered by height (768 minimum), any width is allowed still if supported by your hardware +; TA v2024.3.25 default is FALSE +; ProTA 4.6 default is TRUE +DisplayModeMinHeight768 = TRUE; + +; Megamap FPS Limit +; Supports the following values: 0-1000 +; 0 = no limit +; TA v2024.3.25 default is 60 +; ProTA 4.6 default is 0 +MegamapFPSLimit = 0; ; Unit limit per player -; Set from 20 - 6553 (setting higher than 1500 may cause instability) +; Set from 20 - 1500 ; TA v3.1 default is 250 -; TA v3.9.02 default is 1500 - +; TA v2024.3.25 default is 1500 +; ProTA 4.6 default is 1500 UnitLimit = 1500; ; Pathfinding cycles ; Setting too low (such as TA v3.1 default) ruins pathfinding but setting extremely high lowers fps ; TA v3.1 default is 1333 -; TA v3.9.02 default is 66650 - +; TA v2024.3.25 default is 66650 +; ProTA 4.6 default is 66650 AISearchMapEntries = 66650; ; Special effects limit (smoke, etc.) ; Setting too low (such as TA v3.1 default) will degrade visual quality ; This setting is still experimental, if you experience visual issues set to 400 ; TA v3.1 default is 400 -; TA v3.9.02 default is 20480 - +; TA v2024.3.25 default is 20480 +; ProTA 4.6 default is 20480 SfxLimit = 20480; ; Unit model size limit ; Set max width and height for unit model drawing buffer ; TA v3.1 default is 600x600 -; TA v3.9.02 default is 1280x1280 - +; TA v2024.3.25 default is 1280x1280 +; ProTA 4.6 default is 1280x1280 X_CompositeBuf = 1280; Y_CompositeBuf = 1280; ; Unit ID limit ; Set the maximum number of unique unit IDs ; TA v3.1 default is 512 -; TA v3.9.02 default is 16000 - +; TA v2024.3.25 default is 16000 +; ProTA 4.6 default is 16000 UnitType = 16000; ; Weapon ID limit ; Set the maximum number of unique weapon IDs ; TA v3.1 default is 256 -; TA v3.9.02 default is 16000 - +; TA v2024.3.25 default is 16000 +; ProTA 4.6 default is 16000 WeaponType = 16000; ; Weapon ID multiplayer patch ; Set to TRUE to enable increased Weapon ID limit in multiplayer ; Set to FALSE to allow increased Weapon ID limit only in single player ; TA v3.1 default is FALSE -; TA v3.9.02 default is FALSE (Weapon ID limit increase not yet compatible with Replayer) - +; TA v2024.3.25 default is FALSE (Weapon ID limit increase not yet compatible with Replayer) +; ProTA 4.6 default is FALSE MultiGameWeapon = FALSE; ; Double-click selection ; Enable or disable the new "double-click to select all units of the same type on screen" feature ; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE - +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE DoubleClick = TRUE; ; Expanded Multiplayer Sharing Menu ; Enable or disable the new expanded multiplayer sharing menu ; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE - +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE ShareDialogExpand = TRUE; ; Main menu resolution adjuster @@ -77,26 +98,22 @@ ShareDialogExpand = TRUE; ; Set to TRUE to match main menu resolution to the in-game resolution set via options menu ; If TRUE, the main menu will not be upscaled to fit increased output resolution ; If resolution is not valid, the game will not start (use resolution overrider below to fix) +; Note: This setting is ignored if you are using cnc-ddraw ; TA v3.1 default is FALSE -; TA v3.9.02 default is FALSE - +; TA v2024.3.25 default is FALSE +; ProTA 4.6 default is FALSE MenuResolution = FALSE; ; Megamap ; Enable or disable the new megamap ; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE - +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE FullScreenMinimap = TRUE; -; Megamap FPS Limit - -MegamapFpsLimit = 1000; - ; Megamap Icon Configuration File ; Set the location of the megamap's icon configuration file -; TA v3.9.02 default is .\Icon\iconcfg.ini - +; TA v2024.3.25 default is .\Icon\iconcfg.ini MegaMapConfig = .\Icon\iconcfg.ini; ; Megamap Configuration Settings @@ -104,34 +121,33 @@ MegaMapConfig = .\Icon\iconcfg.ini; ; Megamap Mouse Wheel Zooming ; Enable or disable ability to zoom in and out of the megamap with the mouse wheel -; TA v3.9.02 default is TRUE; - +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE WheelZoom = TRUE; ; Megamap Mouse Wheel Zoom In Mode ; Set to TRUE to zoom to the cursor location when rolling the wheel up from the megamap ; Set to FALSE to zoom to the previous camera location when rolling the wheel up from the megamap -; TA v3.9.02 default is TRUE; - +; TA v2024.3.25 default is TRUE +; ProTA 4.6 default is TRUE WheelMoveMegaMap = TRUE; ; Megamap Double-Click to Zoom Option ; Enable or disable the option to zoom to the cursor location... ; ...when double-clicking terrain on the megamap -; TA v3.9.02 default is FALSE; - +; TA v2024.3.25 default is FALSE +; ProTA 4.6 default is FALSE DoubleClickMoveMegamap = FALSE; ; Megamap Unit Icon Flashing When Under Attack ; Enable or disable megamap unit icon flashing when under attack - UnderAttackFlash=TRUE; ; Megamap Minimum Sensor Range Ring Distances ; Set the minimum sensor values required to display range rings on the megamap ; These settings could be helpful if you want to eliminate clutter from short-ranged rings -; TA v3.9.02 default is 0 for all sensors - +; TA v2024.3.25 default is 0 for all sensors +; ProTA 4.6 default is 0 for all sensors MegamapRadarMinimum = 0; MegamapSonarMinimum = 0; MegamapSonarJamMinimum = 0; @@ -142,17 +158,16 @@ MegamapAntiNukeMinimum = 0; ; Customize the colors of the player minimap/megamap icons and line markers ; Set from 0 to 255 to select colors from the TA indexed color palette ; These settings are disabled by default (remove the semicolons to enable) - -Player1DotColors=252; ;Default is 227 -Player2DotColors=249; ;Default is 212 -Player3DotColors=80; ;Default is 80 -Player4DotColors=250; ;Default is 235 -Player5DotColors=66; ;Default is 108 -Player6DotColors=148; ;Default is 219 -Player7DotColors=208; ;Default is 208 -Player8DotColors=0; ;Default is 93 -Player9DotColors=210; ;Default is 130 -Player10DotColors=33; ;Default is 67 +Player1DotColors=252; ;Default is 227 ProTA 4.6 default is 252 +Player2DotColors=249; ;Default is 212 ProTA 4.6 default is 249 +Player3DotColors=80; ;Default is 80 ProTA 4.6 default is 80 +Player4DotColors=250; ;Default is 235 ProTA 4.6 default is 250 +Player5DotColors=66; ;Default is 108 ProTA 4.6 default is 66 +Player6DotColors=148; ;Default is 219 ProTA 4.6 default is 148 +Player7DotColors=208; ;Default is 208 ProTA 4.6 default is 208 +Player8DotColors=0; ;Default is 93 ProTA 4.6 default is 0 +Player9DotColors=210; ;Default is 130 ProTA 4.6 default is 210 +Player10DotColors=33; ;Default is 67 ProTA 4.6 default is 33 ; Player Dot Marker Colors ; Customize the colors of player dot markers by setting a custom icon file @@ -160,7 +175,6 @@ Player10DotColors=33; ;Default is 67 ; The icon file must contain all 10 player markers from left to right ; The icon width and height settings must match the dimensions of your icons ; These settings are disabled by default (remove the semicolons to enable) - PerPlayerMarkerWidth=10; PerPlayerMarkerHeight=10; PlayerMarkerPcx=Icon\smallcircle.pcx; @@ -172,44 +186,44 @@ PlayerMarkerPcx=Icon\smallcircle.pcx; ; When set to 3D, the speaker layout is read from the Windows control panel ; All speaker layouts are supported by the 3D sound engine (stereo, 5.1, 7.1, etc.) ; TA v3.1 default is Mono (dword:1) -; TA v3.9.02 default is 3D (dword:2) - +; TA v2024.3.25 default is 3D (dword:2) +; ProTA 4.6 default is 3D (dword:2) "Sound Mode" = dword:2 ; Max number of simultaneous sounds before sounds are cut off ; Set from 2 - 32 for specific limits or 33 or higher for unlimited ; TA v3.1 default is 8 (dword:8) -; TA v3.9.02 default is 128 / unlimited (dword:128) - +; TA v2024.3.25 default is 128 / unlimited (dword:128) +; ProTA 4.6 default is 128 / unlimited (dword:128) "MixingBuffers" = dword:128 ; Default game speed ; Set from 0 - 20 (corresponding to game speed -10 to +10) ; Use plus and minus keys to adjust while playing -; TA and TA v3.9.02 default is 10 which is equivalent to Normal game speed (dword:10) - +; TA and TA v2024.3.25 default is 10 which is equivalent to Normal game speed (dword:10) +; ProTA 4.6 default is 10 which is equivalent to Normal game speed (dword:10) "GameSpeed" = dword:10 ; Group selection hotkey modifier ; Set to 1 to select unit groups with number key and build menus with ALT + number key ; Set to 0 to select build menus with number key and unit groups with ALT + number key ; TA v3.1 default is 0 (dword:0) -; TA v3.9.02 default is 1 (dword:1) - +; TA v2024.3.25 default is 1 (dword:1) +; ProTA 4.6 default is 1 (dword:1) "SwitchAlt" = dword:1 ; Max number of players in skirmish mode ; Set from 2 - 10 ; TA v3.1 default is 4 (dword:4) -; TA v3.9.02 default is 10 (dword:10) - +; TA v2024.3.25 default is 10 (dword:10) +; ProTA 4.6 default is 10 (dword:10) "NumSkirmishPlayers" = dword:10 ; Default setting for display of chat messages from other players ; Set to 1 to enable and 0 to disable ; Use "+screenchat" command in-game to toggle setting for the current game -; TA and TA v3.9.02 default is 1 - +; TA and TA v2024.3.25 default is 1 +; ProTA 4.6 default is 1 "ScreenChat" = dword:1 ; Music playback mode @@ -219,8 +233,8 @@ PlayerMarkerPcx=Icon\smallcircle.pcx; ; ...resulting in only a single track being played, either stopping thereafter (CD version)... ; ...or looping forever (MP3 version), therefore Random is best for most people ; TA v3.1 default is Custom (dword:4) -; TA v3.9.02 default is Random (dword:2) - +; TA v2024.3.25 default is Random (dword:2) +; ProTA 4.6 default is Random (dword:2) "CDMode" = dword:2 ; Resolution overrider (disabled by default) @@ -230,6 +244,5 @@ PlayerMarkerPcx=Icon\smallcircle.pcx; ; If you set a resolution not supported by your setup (driver or display) the game will crash ; The override is set at game launch, using options menu will defeat override until next launch ; Example: dword:1920 x dword:1080 (1920x1080) - ;"DisplayModeWidth" = dword:1920 ;"DisplayModeHeight" = dword:1080 \ No newline at end of file diff --git a/Settings.ini b/Settings.ini deleted file mode 100644 index 2042e9b..0000000 --- a/Settings.ini +++ /dev/null @@ -1,278 +0,0 @@ -; ProTA 4.5 settings - -[Settings] - -; Use a different order for autoclick queues when the footprint is set to 2 -; Construction units will spend ever so slightly less time building lines of Dragon Teeth this way -OptimizeDTEnabled=1 - -; Creates a full ring queue when the footprints of the structure being queued and the structure you -; are queuing around don't match up -FullRingsEnabled=0 - -; The code for the key that controls the whiteboard features -WhiteboardKey=220 - -; The code for the key that toggles the full screen megamap mode -MegaMapKey=115 - -; The code for the key that controls the autoclick features -BuildLinesRingsKey=88 - -; The color of the regions outside of the megamap area -; Setting this to anything other than black highlights the edge of the playable area when unmapped -; Set to 95 as default which is a dark grey -MegaMapEmptyRegionColor=95 - -; The position of the income display box -; This will update itself when moved in game -IncomePosX=1749 -IncomePosY=32 - -; Fully solid background color behind the income display box -IncomeBackgroundEnabled=0 - -; Change the color of the fully solid background colour behind the income display box -IncomeBackgroundColor=95 - -; Text only background behind the income display box -IncomeTextBackgroundEnabled=1 - -; Change the color of the text only background behind the income display box -IncomeTextBackgroundColor=95 - - ------------------------------------------------------------------------------------------------------- - -; ProTA 4.5 advanced settings - -; Windowed mode will disable many TA v3.9.02 features (including some of these) and is not recommended - -[Preferences] ; custom settings, if any entry is disabled the "TA v3.9.02 default" values will be used - -; Disabled in tdraw.dll -;UseVideoMemory = TRUE; - -; Unit limit per player -; Set from 20 - 6553 (setting higher than 1500 may cause instability) -; TA v3.1 default is 250 -; TA v3.9.02 default is 1500 -; ProTA 4.5 default is 1500 -; Broken atm (*playx overwrites this setting forcibly to 1500) -UnitLimit = 1500; - -; Pathfinding cycles -; Setting too low (such as TA v3.1 default) ruins pathfinding but setting extremely high lowers fps -; TA v3.1 default is 1333 -; TA v3.9.02 default is 66650 -; ProTA 4.5 default is 66650 -AISearchMapEntries = 66650; - -; Special effects limit (smoke, etc.) -; Setting too low (such as TA v3.1 default) will degrade visual quality -; This setting is still experimental, if you experience visual issues set to 400 -; TA v3.1 default is 400 -; TA v3.9.02 default is 20480 -; ProTA 4.5 default is 20480 -SfxLimit = 20480; - -; Unit model size limit -; Set max width and height for unit model drawing buffer -; TA v3.1 default is 600x600 -; TA v3.9.02 default is 1280x1280 -; ProTA 4.5 default is 1280x1280 -X_CompositeBuf = 1280; -Y_CompositeBuf = 1280; - -; Unit ID limit -; Set the maximum number of unique unit IDs -; TA v3.1 default is 512 -; TA v3.9.02 default is 16000 -; ProTA 4.5 default is 16000 -UnitType = 16000; - -; Weapon ID limit -; Set the maximum number of unique weapon IDs -; TA v3.1 default is 256 -; TA v3.9.02 default is 16000 -; ProTA 4.5 default is 16000 -WeaponType = 16000; - -; Weapon ID multiplayer patch -; Set to TRUE to enable increased Weapon ID limit in multiplayer -; Set to FALSE to allow increased Weapon ID limit only in single player -; TA v3.1 default is FALSE -; TA v3.9.02 default is FALSE (Weapon ID limit increase not yet compatible with Replayer) -; ProTA 4.5 default is FALSE -MultiGameWeapon = FALSE; - -; Double-click selection -; Enable or disable the new "double-click to select all units of the same type on screen" feature -; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE -; ProTA 4.5 default is TRUE -DoubleClick = TRUE; - -; Expanded Multiplayer Sharing Menu -; Enable or disable the new expanded multiplayer sharing menu -; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE -; ProTA 4.5 default is TRUE -ShareDialogExpand = TRUE; - -; Main menu resolution adjuster -; Set to FALSE to keep main menu resolution at the default 640x480 -; Set to TRUE to match main menu resolution to the in-game resolution set via options menu -; If TRUE, the main menu will not be upscaled to fit increased output resolution -; If resolution is not valid, the game will not start (use resolution overrider below to fix) -; TA v3.1 default is FALSE -; TA v3.9.02 default is FALSE -; ProTA 4.5 default is FALSE -MenuResolution = FALSE; - -; Megamap -; Enable or disable the new megamap -; TA v3.1 default is FALSE -; TA v3.9.02 default is TRUE -; ProTA 4.5 default is TRUE -FullScreenMinimap = TRUE; - -; Megamap FPS Limit -MegamapFpsLimit = 1000; - -; Megamap Icon Configuration File -; Set the location of the megamap's icon configuration file -; TA v3.9.02 default is .\Icon\iconcfg.ini -MegaMapConfig = .\Icon\iconcfg.ini; - -; Megamap Configuration Settings -; Use the fields below to customize the megamap - -; Megamap Mouse Wheel Zooming -; Enable or disable ability to zoom in and out of the megamap with the mouse wheel -; TA v3.9.02 default is TRUE -; ProTA 4.5 default is TRUE -WheelZoom = TRUE; - -; Megamap Mouse Wheel Zoom In Mode -; Set to TRUE to zoom to the cursor location when rolling the wheel up from the megamap -; Set to FALSE to zoom to the previous camera location when rolling the wheel up from the megamap -; TA v3.9.02 default is TRUE -; ProTA 4.5 default is TRUE -WheelMoveMegaMap = TRUE; - -; Megamap Double-Click to Zoom Option -; Enable or disable the option to zoom to the cursor location... -; ...when double-clicking terrain on the megamap -; TA v3.9.02 default is FALSE -; ProTA 4.5 default is FALSE -DoubleClickMoveMegamap = FALSE; - -; Megamap Unit Icon Flashing When Under Attack -; Enable or disable megamap unit icon flashing when under attack -UnderAttackFlash=TRUE; - -; Megamap Minimum Sensor Range Ring Distances -; Set the minimum sensor values required to display range rings on the megamap -; These settings could be helpful if you want to eliminate clutter from short-ranged rings -; TA v3.9.02 default is 0 for all sensors -; ProTA 4.5 default is 0 for all sensors -MegamapRadarMinimum = 0; -MegamapSonarMinimum = 0; -MegamapSonarJamMinimum = 0; -MegamapRadarJamMinimum = 0; -MegamapAntiNukeMinimum = 0; - -; Player Icon and Line Marker Colors -; Customize the colors of the player minimap/megamap icons and line markers -; Set from 0 to 255 to select colors from the TA indexed color palette -; These settings are disabled by default (remove the semicolons to enable) -Player1DotColors=252; ;Default is 227 ProTA 4.5 default is 252 -Player2DotColors=249; ;Default is 212 ProTA 4.5 default is 249 -Player3DotColors=80; ;Default is 80 ProTA 4.5 default is 80 -Player4DotColors=250; ;Default is 235 ProTA 4.5 default is 250 -Player5DotColors=66; ;Default is 108 ProTA 4.5 default is 66 -Player6DotColors=148; ;Default is 219 ProTA 4.5 default is 148 -Player7DotColors=208; ;Default is 208 ProTA 4.5 default is 208 -Player8DotColors=0; ;Default is 93 ProTA 4.5 default is 0 -Player9DotColors=210; ;Default is 130 ProTA 4.5 default is 210 -Player10DotColors=33; ;Default is 67 ProTA 4.5 default is 33 - -; Player Dot Marker Colors -; Customize the colors of player dot markers by setting a custom icon file -; Edit the example smallcircle.pcx file or create a new icon file -; The icon file must contain all 10 player markers from left to right -; The icon width and height settings must match the dimensions of your icons -; These settings are disabled by default (remove the semicolons to enable) -PerPlayerMarkerWidth=10; -PerPlayerMarkerHeight=10; -PlayerMarkerPcx=Icon\smallcircle.pcx; - -[REG] ; registry override settings, if any entry is disabled the last value used will be remembered - -; Sound mode -; Set to 0 for no sound, 1 for mono sound, and 2 for 3D positional sound -; When set to 3D, the speaker layout is read from the Windows control panel -; All speaker layouts are supported by the 3D sound engine (stereo, 5.1, 7.1, etc.) -; TA v3.1 default is Mono (dword:1) -; TA v3.9.02 default is 3D (dword:2) -; ProTA 4.5 default is 3D (dword:2) -"Sound Mode" = dword:2 - -; Max number of simultaneous sounds before sounds are cut off -; Set from 2 - 32 for specific limits or 33 or higher for unlimited -; TA v3.1 default is 8 (dword:8) -; TA v3.9.02 default is 128 / unlimited (dword:128) -; ProTA 4.5 default is 128 / unlimited (dword:128) -"MixingBuffers" = dword:128 - -; Default game speed -; Set from 0 - 20 (corresponding to game speed -10 to +10) -; Use plus and minus keys to adjust while playing -; TA and TA v3.9.02 default is 10 which is equivalent to Normal game speed (dword:10) -; ProTA 4.5 default is 10 which is equivalent to Normal game speed (dword:10) -"GameSpeed" = dword:10 - -; Group selection hotkey modifier -; Set to 1 to select unit groups with number key and build menus with ALT + number key -; Set to 0 to select build menus with number key and unit groups with ALT + number key -; TA v3.1 default is 0 (dword:0) -; TA v3.9.02 default is 1 (dword:1) -; ProTA 4.5 default is 1 (dword:1) -"SwitchAlt" = dword:1 - -; Max number of players in skirmish mode -; Set from 2 - 10 -; TA v3.1 default is 4 (dword:4) -; TA v3.9.02 default is 10 (dword:10) -; ProTA 4.5 default is 10 (dword:10) -"NumSkirmishPlayers" = dword:10 - -; Default setting for display of chat messages from other players -; Set to 1 to enable and 0 to disable -; Use "+screenchat" command in-game to toggle setting for the current game -; TA and TA v3.9.02 default is 1 -; ProTA 4.5 default is 1 -"ScreenChat" = dword:1 - -; Music playback mode -; Set to 1 for Play All, 2 for Random, 3 for Repeat, and 4 for Custom. -; When set to Custom, the game will attempt to use the dynamic build/battle system... -; ...however this mode is buggy and almost never works correctly on modern systems... -; ...resulting in only a single track being played, either stopping thereafter (CD version)... -; ...or looping forever (MP3 version), therefore Random is best for most people -; TA v3.1 default is Custom (dword:4) -; TA v3.9.02 default is Random (dword:2) -; ProTA 4.5 default is Random (dword:2) -"CDMode" = dword:2 - -; Resolution overrider (disabled by default) -; Use this to override the resolution set in the options menu (remove semicolons to enable) -; All resolutions and aspect ratios supported by your setup are supported by the game... -; ...as long as they are available in 8-bit color depth (if not, create a custom resolution) -; If you set a resolution not supported by your setup (driver or display) the game will crash -; The override is set at game launch, using options menu will defeat override until next launch -; Example: dword:1920 x dword:1080 (1920x1080) - -;"DisplayModeWidth" = dword:1920 -;"DisplayModeHeight" = dword:1080 diff --git a/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl b/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl new file mode 100644 index 0000000..449b9be --- /dev/null +++ b/Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl @@ -0,0 +1,701 @@ +//_____________________________/\_______________________________ +//============================================================== +// +// +// [CRTS] PUBLIC DOMAIN CRT-STYLED SCALAR - 20180120b +// +// by Timothy Lottes +// https://www.shadertoy.com/view/MtSfRK +// adapted for RetroArch by hunterk +// +// +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//_____________________________/\_______________________________ +//============================================================== +// +// WHAT'S NEW +// +//-------------------------------------------------------------- +// Evolution of prior shadertoy example +//-------------------------------------------------------------- +// This one is semi-optimized +// - Less texture fetches +// - Didn't get to instruction level optimization +// - Could likely use texture fetch to generate phosphor mask +//-------------------------------------------------------------- +// Added options to disable unused features +//-------------------------------------------------------------- +// Added in exposure matching +// - Given scan-line effect and mask always darkens image +// - Uses generalized tonemapper to boost mid-level +// - Note this can compress highlights +// - And won't get back peak brightness +// - But best option if one doesn't want as much darkening +//-------------------------------------------------------------- +// Includes option saturation and contrast controls +//-------------------------------------------------------------- +// Added in subtractive aperture grille +// - This is a bit brighter than prior +//-------------------------------------------------------------- +// Make sure input to this filter is already low-resolution +// - This is not designed to work on titles doing the following +// - Rendering to hi-res with nearest sampling +//-------------------------------------------------------------- +// Added a fast and more pixely option for 2 tap/pixel +//-------------------------------------------------------------- +// Improved the vignette when WARP is enabled +//-------------------------------------------------------------- +// Didn't test HLSL or CPU options +// - Will incorportate patches if they are broken +// - But out of time to try them myself +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//_____________________________/\_______________________________ +//============================================================== +// +// LICENSE = UNLICENSE (aka PUBLIC DOMAIN) +// +//-------------------------------------------------------------- +// This is free and unencumbered software released into the +// public domain. +//-------------------------------------------------------------- +// Anyone is free to copy, modify, publish, use, compile, sell, +// or distribute this software, either in source code form or as +// a compiled binary, for any purpose, commercial or +// non-commercial, and by any means. +//-------------------------------------------------------------- +// In jurisdictions that recognize copyright laws, the author or +// authors of this software dedicate any and all copyright +// interest in the software to the public domain. We make this +// dedication for the benefit of the public at large and to the +// detriment of our heirs and successors. We intend this +// dedication to be an overt act of relinquishment in perpetuity +// of all present and future rights to this software under +// copyright law. +//-------------------------------------------------------------- +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +// OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +//-------------------------------------------------------------- +// For more information, please refer to +// +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +#pragma parameter MASK "Mask Type" 1.0 0.0 3.0 1.0 +#pragma parameter MASK_INTENSITY "Mask Intensity" 0.5 0.0 1.0 0.05 +#pragma parameter SCANLINE_THINNESS "Scanline Intensity" 0.5 0.0 1.0 0.1 +#pragma parameter SCAN_BLUR "Sharpness" 2.5 1.0 3.0 0.1 +#pragma parameter CURVATURE "Curvature" 0.02 0.0 0.25 0.01 +#pragma parameter TRINITRON_CURVE "Trinitron-style Curve" 0.0 0.0 1.0 1.0 +#pragma parameter CORNER "Corner Round" 3.0 0.0 11.0 1.0 +#pragma parameter CRT_GAMMA "CRT Gamma" 2.4 0.0 51.0 0.1 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float CRT_GAMMA; +uniform COMPAT_PRECISION float SCANLINE_THINNESS; +uniform COMPAT_PRECISION float SCAN_BLUR; +uniform COMPAT_PRECISION float MASK_INTENSITY; +uniform COMPAT_PRECISION float CURVATURE; +uniform COMPAT_PRECISION float CORNER; +uniform COMPAT_PRECISION float MASK; +uniform COMPAT_PRECISION float TRINITRON_CURVE; +#else +#define CRT_GAMMA 2.4 +#define SCANLINE_THINNESS 0.5 +#define SCAN_BLUR 2.5 +#define MASK_INTENSITY 0.54 +#define CURVATURE 0.00 +#define CORNER 3.0 +#define MASK 1.0 +#define TRINITRON_CURVE 0.0 +#endif + +//_____________________________/\_______________________________ +//============================================================== +// +// GAMMA FUNCTIONS +// +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// Since shadertoy doesn't have sRGB textures +// And we need linear input into shader +// Don't do this in your code + float FromSrgb1(float c){ + return (c<=0.04045)?c*(1.0/12.92): + pow(c*(1.0/1.055)+(0.055/1.055),CRT_GAMMA);} +//-------------------------------------------------------------- +vec3 FromSrgb(vec3 c){return vec3( + FromSrgb1(c.r),FromSrgb1(c.g),FromSrgb1(c.b));} + +// Convert from linear to sRGB +// Since shader toy output is not linear +float ToSrgb1(float c){ + return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);} +//-------------------------------------------------------------- +vec3 ToSrgb(vec3 c){return vec3( + ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));} +//-------------------------------------------------------------- + +//_____________________________/\_______________________________ +//============================================================== +// +// DEFINES +// +//-------------------------------------------------------------- +// CRTS_CPU - CPU code +// CRTS_GPU - GPU code +//-------------------------------------------------------------- +// CRTS_GLSL - GLSL +// CRTS_HLSL - HLSL (not tested yet) +//-------------------------------------------------------------- +// CRTS_DEBUG - Define to see on/off split screen +//-------------------------------------------------------------- +// CRTS_WARP - Apply screen warp +//-------------------------------------------------------------- +// CRTS_2_TAP - Faster very pixely 2-tap filter (off is 8) +//-------------------------------------------------------------- +// CRTS_MASK_GRILLE - Aperture grille (aka Trinitron) +// CRTS_MASK_GRILLE_LITE - Brighter (subtractive channels) +// CRTS_MASK_NONE - No mask +// CRTS_MASK_SHADOW - Horizontally stretched shadow mask +//-------------------------------------------------------------- +// CRTS_TONE - Normalize mid-level and process color +// CRTS_CONTRAST - Process color - enable contrast control +// CRTS_SATURATION - Process color - enable saturation control +//-------------------------------------------------------------- +#define CRTS_STATIC +#define CrtsPow +#define CRTS_RESTRICT +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +//============================================================== +// SETUP FOR CRTS +//-------------------------------------------------------------- +//============================================================== +//#define CRTS_DEBUG 1 +#define CRTS_GPU 1 +#define CRTS_GLSL 1 +//-------------------------------------------------------------- +//#define CRTS_2_TAP 1 +//-------------------------------------------------------------- +#define CRTS_TONE 1 +#define CRTS_CONTRAST 0 +#define CRTS_SATURATION 0 +//-------------------------------------------------------------- +#define CRTS_WARP 1 +//-------------------------------------------------------------- +// Try different masks -> moved to runtime parameters +//#define CRTS_MASK_GRILLE 1 +//#define CRTS_MASK_GRILLE_LITE 1 +//#define CRTS_MASK_NONE 1 +//#define CRTS_MASK_SHADOW 1 +//-------------------------------------------------------------- +// Scanline thinness +// 0.50 = fused scanlines +// 0.70 = recommended default +// 1.00 = thinner scanlines (too thin) +#define INPUT_THIN 0.5 + (0.5 * SCANLINE_THINNESS) +//-------------------------------------------------------------- +// Horizonal scan blur +// -3.0 = pixely +// -2.5 = default +// -2.0 = smooth +// -1.0 = too blurry +#define INPUT_BLUR -1.0 * SCAN_BLUR +//-------------------------------------------------------------- +// Shadow mask effect, ranges from, +// 0.25 = large amount of mask (not recommended, too dark) +// 0.50 = recommended default +// 1.00 = no shadow mask +#define INPUT_MASK 1.0 - MASK_INTENSITY +//-------------------------------------------------------------- +#define INPUT_X InputSize.x +#define INPUT_Y InputSize.y +//-------------------------------------------------------------- +// Setup the function which returns input image color +vec3 CrtsFetch(vec2 uv){ + // For shadertoy, scale to get native texels in the image + uv*=vec2(INPUT_X,INPUT_Y)/TextureSize.xy; + // Move towards intersting parts +// uv+=vec2(0.5,0.5); + // Non-shadertoy case would not have the color conversion + return FromSrgb(COMPAT_TEXTURE(Texture,uv.xy,-16.0).rgb);} +#endif + +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//_____________________________/\_______________________________ +//============================================================== +// +// GPU CODE +// +//============================================================== +#ifdef CRTS_GPU +//_____________________________/\_______________________________ +//============================================================== +// PORTABILITY +//============================================================== + #ifdef CRTS_GLSL + #define CrtsF1 float + #define CrtsF2 vec2 + #define CrtsF3 vec3 + #define CrtsF4 vec4 + #define CrtsFractF1 fract + #define CrtsRcpF1(x) (1.0/(x)) + #define CrtsSatF1(x) clamp((x),0.0,1.0) +//-------------------------------------------------------------- + CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){ + return max(a,max(b,c));} + #endif +//============================================================== + #ifdef CRTS_HLSL + #define CrtsF1 float + #define CrtsF2 float2 + #define CrtsF3 float3 + #define CrtsF4 float4 + #define CrtsFractF1 frac + #define CrtsRcpF1(x) (1.0/(x)) + #define CrtsSatF1(x) saturate(x) +//-------------------------------------------------------------- + CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){ + return max(a,max(b,c));} + #endif +//_____________________________/\_______________________________ +//============================================================== +// TONAL CONTROL CONSTANT GENERATION +//-------------------------------------------------------------- +// This is in here for rapid prototyping +// Please use the CPU code and pass in as constants +//============================================================== + CrtsF4 CrtsTone( + CrtsF1 contrast, + CrtsF1 saturation, + CrtsF1 thin, + CrtsF1 mask){ +//-------------------------------------------------------------- + if(MASK == 0.0) mask=1.0; +//-------------------------------------------------------------- + if(MASK == 1.0){ + // Normal R mask is {1.0,mask,mask} + // LITE R mask is {mask,1.0,1.0} + mask=0.5+mask*0.5; + } +//-------------------------------------------------------------- + CrtsF4 ret; + CrtsF1 midOut=0.18/((1.5-thin)*(0.5*mask+0.5)); + CrtsF1 pMidIn=pow(0.18,contrast); + ret.x=contrast; + ret.y=((-pMidIn)+midOut)/((1.0-pMidIn)*midOut); + ret.z=((-pMidIn)*midOut+pMidIn)/(midOut*(-pMidIn)+midOut); + ret.w=contrast+saturation; + return ret;} +//_____________________________/\_______________________________ +//============================================================== +// MASK +//-------------------------------------------------------------- +// Letting LCD/OLED pixel elements function like CRT phosphors +// So "phosphor" resolution scales with display resolution +//-------------------------------------------------------------- +// Not applying any warp to the mask (want high frequency) +// Real aperture grille has a mask which gets wider on ends +// Not attempting to be "real" but instead look the best +//-------------------------------------------------------------- +// Shadow mask is stretched horizontally +// RRGGBB +// GBBRRG +// RRGGBB +// This tends to look better on LCDs than vertical +// Also 2 pixel width is required to get triad centered +//-------------------------------------------------------------- +// The LITE version of the Aperture Grille is brighter +// Uses {dark,1.0,1.0} for R channel +// Non LITE version uses {1.0,dark,dark} +//-------------------------------------------------------------- +// 'pos' - This is 'fragCoord.xy' +// Pixel {0,0} should be {0.5,0.5} +// Pixel {1,1} should be {1.5,1.5} +//-------------------------------------------------------------- +// 'dark' - Exposure of of masked channel +// 0.0=fully off, 1.0=no effect +//============================================================== + CrtsF3 CrtsMask(CrtsF2 pos,CrtsF1 dark){ + if(MASK == 2.0){ + CrtsF3 m=CrtsF3(dark,dark,dark); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0)); + if(x<(1.0/3.0))m.r=1.0; + else if(x<(2.0/3.0))m.g=1.0; + else m.b=1.0; + return m; + } +//-------------------------------------------------------------- + if(MASK == 1.0){ + CrtsF3 m=CrtsF3(1.0,1.0,1.0); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0)); + if(x<(1.0/3.0))m.r=dark; + else if(x<(2.0/3.0))m.g=dark; + else m.b=dark; + return m; + } +//-------------------------------------------------------------- + if(MASK == 0.0){ + return CrtsF3(1.0,1.0,1.0); + } +//-------------------------------------------------------------- + if(MASK == 3.0){ + pos.x+=pos.y*2.9999; + CrtsF3 m=CrtsF3(dark,dark,dark); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/6.0)); + if(x<(1.0/3.0))m.r=1.0; + else if(x<(2.0/3.0))m.g=1.0; + else m.b=1.0; + return m; + } + } +//_____________________________/\_______________________________ +//============================================================== +// FILTER ENTRY +//-------------------------------------------------------------- +// Input must be linear +// Output color is linear +//-------------------------------------------------------------- +// Must have fetch function setup: CrtsF3 CrtsFetch(CrtsF2 uv) +// - The 'uv' range is {0.0 to 1.0} for input texture +// - Output of this must be linear color +//-------------------------------------------------------------- +// SCANLINE MATH & AUTO-EXPOSURE NOTES +// =================================== +// Each output line has contribution from at most 2 scanlines +// Scanlines are shaped by a windowed cosine function +// This shape blends together well with only 2 lines of overlap +//-------------------------------------------------------------- +// Base scanline intensity is as follows +// which leaves output intensity range from {0 to 1.0} +// -------- +// thin := range {thick 0.5 to thin 1.0} +// off := range {0.0 to <1.0}, +// sub-pixel offset between two scanlines +// -------- +// a0=cos(min(0.5, off *thin)*2pi)*0.5+0.5; +// a1=cos(min(0.5,(1.0-off)*thin)*2pi)*0.5+0.5; +//-------------------------------------------------------------- +// This leads to a image darkening factor of roughly: +// {(1.5-thin)/1.0} +// This is further reduced by the mask: +// {1.0/2.0+mask*1.0/2.0} +// Reciprocal of combined effect is used for auto-exposure +// to scale up the mid-level in the tonemapper +//============================================================== + CrtsF3 CrtsFilter( +//-------------------------------------------------------------- + // SV_POSITION, fragCoord.xy + CrtsF2 ipos, +//-------------------------------------------------------------- + // inputSize / outputSize (in pixels) + CrtsF2 inputSizeDivOutputSize, +//-------------------------------------------------------------- + // 0.5 * inputSize (in pixels) + CrtsF2 halfInputSize, +//-------------------------------------------------------------- + // 1.0 / inputSize (in pixels) + CrtsF2 rcpInputSize, +//-------------------------------------------------------------- + // 1.0 / outputSize (in pixels) + CrtsF2 rcpOutputSize, +//-------------------------------------------------------------- + // 2.0 / outputSize (in pixels) + CrtsF2 twoDivOutputSize, +//-------------------------------------------------------------- + // inputSize.y + CrtsF1 inputHeight, +//-------------------------------------------------------------- + // Warp scanlines but not phosphor mask + // 0.0 = no warp + // 1.0/64.0 = light warping + // 1.0/32.0 = more warping + // Want x and y warping to be different (based on aspect) + CrtsF2 warp, +//-------------------------------------------------------------- + // Scanline thinness + // 0.50 = fused scanlines + // 0.70 = recommended default + // 1.00 = thinner scanlines (too thin) + // Shared with CrtsTone() function + CrtsF1 thin, +//-------------------------------------------------------------- + // Horizonal scan blur + // -3.0 = pixely + // -2.5 = default + // -2.0 = smooth + // -1.0 = too blurry + CrtsF1 blur, +//-------------------------------------------------------------- + // Shadow mask effect, ranges from, + // 0.25 = large amount of mask (not recommended, too dark) + // 0.50 = recommended default + // 1.00 = no shadow mask + // Shared with CrtsTone() function + CrtsF1 mask, +//-------------------------------------------------------------- + // Tonal curve parameters generated by CrtsTone() + CrtsF4 tone +//-------------------------------------------------------------- + ){ +//-------------------------------------------------------------- + #ifdef CRTS_DEBUG + CrtsF2 uv=ipos*rcpOutputSize; + // Show second half processed, and first half un-processed + if(uv.x<0.5){ + // Force nearest to get squares + uv*=1.0/rcpInputSize; + uv=floor(uv)+CrtsF2(0.5,0.5); + uv*=rcpInputSize; + CrtsF3 color=CrtsFetch(uv); + return color;} + #endif +//-------------------------------------------------------------- + // Optional apply warp + CrtsF2 pos; + #ifdef CRTS_WARP + // Convert to {-1 to 1} range + pos=ipos*twoDivOutputSize-CrtsF2(1.0,1.0); + // Distort pushes image outside {-1 to 1} range + pos*=CrtsF2( + 1.0+(pos.y*pos.y)*warp.x, + 1.0+(pos.x*pos.x)*warp.y); + // TODO: Vignette needs optimization + CrtsF1 vin=(1.0-( + (1.0-CrtsSatF1(pos.x*pos.x))*(1.0-CrtsSatF1(pos.y*pos.y)))) * (0.998 + (0.001 * CORNER)); + vin=CrtsSatF1((-vin)*inputHeight+inputHeight); + // Leave in {0 to inputSize} + pos=pos*halfInputSize+halfInputSize; + #else + pos=ipos*inputSizeDivOutputSize; + #endif +//-------------------------------------------------------------- + // Snap to center of first scanline + CrtsF1 y0=floor(pos.y-0.5)+0.5; + #ifdef CRTS_2_TAP + // Using Inigo's "Improved Texture Interpolation" + // http://iquilezles.org/www/articles/texture/texture.htm + pos.x+=0.5; + CrtsF1 xi=floor(pos.x); + CrtsF1 xf=pos.x-xi; + xf=xf*xf*xf*(xf*(xf*6.0-15.0)+10.0); + CrtsF1 x0=xi+xf-0.5; + CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y); + // Coordinate adjusted bilinear fetch from 2 nearest scanlines + CrtsF3 colA=CrtsFetch(p); + p.y+=rcpInputSize.y; + CrtsF3 colB=CrtsFetch(p); + #else + // Snap to center of one of four pixels + CrtsF1 x0=floor(pos.x-1.5)+0.5; + // Inital UV position + CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y); + // Fetch 4 nearest texels from 2 nearest scanlines + CrtsF3 colA0=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA1=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA2=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA3=CrtsFetch(p); + p.y+=rcpInputSize.y; + CrtsF3 colB3=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB2=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB1=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB0=CrtsFetch(p); + #endif +//-------------------------------------------------------------- + // Vertical filter + // Scanline intensity is using sine wave + // Easy filter window and integral used later in exposure + CrtsF1 off=pos.y-y0; + CrtsF1 pi2=6.28318530717958; + CrtsF1 hlf=0.5; + CrtsF1 scanA=cos(min(0.5, off *thin )*pi2)*hlf+hlf; + CrtsF1 scanB=cos(min(0.5,(-off)*thin+thin)*pi2)*hlf+hlf; +//-------------------------------------------------------------- + #ifdef CRTS_2_TAP + #ifdef CRTS_WARP + // Get rid of wrong pixels on edge + scanA*=vin; + scanB*=vin; + #endif + // Apply vertical filter + CrtsF3 color=(colA*scanA)+(colB*scanB); + #else + // Horizontal kernel is simple gaussian filter + CrtsF1 off0=pos.x-x0; + CrtsF1 off1=off0-1.0; + CrtsF1 off2=off0-2.0; + CrtsF1 off3=off0-3.0; + CrtsF1 pix0=exp2(blur*off0*off0); + CrtsF1 pix1=exp2(blur*off1*off1); + CrtsF1 pix2=exp2(blur*off2*off2); + CrtsF1 pix3=exp2(blur*off3*off3); + CrtsF1 pixT=CrtsRcpF1(pix0+pix1+pix2+pix3); + #ifdef CRTS_WARP + // Get rid of wrong pixels on edge + pixT*=vin; + #endif + scanA*=pixT; + scanB*=pixT; + // Apply horizontal and vertical filters + CrtsF3 color= + (colA0*pix0+colA1*pix1+colA2*pix2+colA3*pix3)*scanA + + (colB0*pix0+colB1*pix1+colB2*pix2+colB3*pix3)*scanB; + #endif +//-------------------------------------------------------------- + // Apply phosphor mask + color*=CrtsMask(ipos,mask); +//-------------------------------------------------------------- + // Optional color processing + #ifdef CRTS_TONE + // Tonal control, start by protecting from /0 + CrtsF1 peak=max(1.0/(256.0*65536.0), + CrtsMax3F1(color.r,color.g,color.b)); + // Compute the ratios of {R,G,B} + CrtsF3 ratio=color*CrtsRcpF1(peak); + // Apply tonal curve to peak value + #ifdef CRTS_CONTRAST + peak=pow(peak,tone.x); + #endif + peak=peak*CrtsRcpF1(peak*tone.y+tone.z); + // Apply saturation + #ifdef CRTS_SATURATION + ratio=pow(ratio,CrtsF3(tone.w,tone.w,tone.w)); + #endif + // Reconstruct color + return ratio*peak; + #else + return color; + #endif +//-------------------------------------------------------------- + } + + +void main() +{ + vec2 warp_factor; + warp_factor.x = CURVATURE; + warp_factor.y = (3.0 / 4.0) * warp_factor.x; // assume 4:3 aspect + warp_factor.x *= (1.0 - TRINITRON_CURVE); + FragColor.rgb = CrtsFilter(vTexCoord.xy * OutputSize.xy*(TextureSize.xy / InputSize.xy), + InputSize.xy / OutputSize.xy, + InputSize.xy * vec2(0.5,0.5), + 1.0/InputSize.xy, + 1.0/OutputSize.xy, + 2.0/OutputSize.xy, + InputSize.y, + warp_factor, + INPUT_THIN, + INPUT_BLUR, + INPUT_MASK, + CrtsTone(1.0,0.0,INPUT_THIN,INPUT_MASK)); + + // Shadertoy outputs non-linear color + FragColor.rgb=ToSrgb(FragColor.rgb); +} +#endif diff --git a/Shaders/interpolation/bilinear.glsl b/Shaders/interpolation/bilinear.glsl new file mode 100644 index 0000000..aa7bee6 --- /dev/null +++ b/Shaders/interpolation/bilinear.glsl @@ -0,0 +1,73 @@ +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3]; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +void main() +{ + FragColor = COMPAT_TEXTURE(Texture, TEX0.xy); +} +#endif \ No newline at end of file diff --git a/Shaders/interpolation/catmull-rom-bilinear.glsl b/Shaders/interpolation/catmull-rom-bilinear.glsl new file mode 100644 index 0000000..03d5b77 --- /dev/null +++ b/Shaders/interpolation/catmull-rom-bilinear.glsl @@ -0,0 +1,137 @@ +/* + The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae + Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 + Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. + See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details + ATENTION: This code only work using LINEAR filter sampling set on Retroarch! + Modified to use 5 texture fetches +*/ + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +precision COMPAT_PRECISION float; +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out mediump vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + // We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding + // down the sample location to get the exact center of our "starting" texel. The starting texel will be at + // location [1, 1] in the grid, where [0, 0] is the top left corner. + vec2 samplePos = vTexCoord * SourceSize.xy; + vec2 texPos1 = floor(samplePos - 0.5) + 0.5; + + // Compute the fractional offset from our starting texel to our original sample location, which we'll + // feed into the Catmull-Rom spline function to get our filter weights. + vec2 f = samplePos - texPos1; + + // Compute the Catmull-Rom weights using the fractional offset that we calculated earlier. + // These equations are pre-expanded based on our knowledge of where the texels will be located, + // which lets us avoid having to evaluate a piece-wise function. + vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f)); + vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f); + vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f)); + vec2 w3 = f * f * (-0.5 + 0.5 * f); + + // Work out weighting factors and sampling offsets that will let us use bilinear filtering to + // simultaneously evaluate the middle 2 samples from the 4x4 grid. + vec2 w12 = w1 + w2; + vec2 offset12 = w2 / (w1 + w2); + + // Compute the final UV coordinates we'll use for sampling the texture + vec2 texPos0 = texPos1 - 1.; + vec2 texPos3 = texPos1 + 2.; + vec2 texPos12 = texPos1 + offset12; + + texPos0 *= SourceSize.zw; + texPos3 *= SourceSize.zw; + texPos12 *= SourceSize.zw; + + float wtm = w12.x * w0.y; + float wml = w0.x * w12.y; + float wmm = w12.x * w12.y; + float wmr = w3.x * w12.y; + float wbm = w12.x * w3.y; + + vec3 result = vec3(0.0f); + + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm; + result += COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos12.y)).rgb * wml; + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm; + result += COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr; + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm; + + FragColor = vec4(result * (1./(wtm+wml+wmm+wmr+wbm)), 1.0); +} +#endif diff --git a/Shaders/interpolation/jinc2-dedither.glsl b/Shaders/interpolation/jinc2-dedither.glsl new file mode 100644 index 0000000..32235e0 --- /dev/null +++ b/Shaders/interpolation/jinc2-dedither.glsl @@ -0,0 +1,202 @@ +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#define JINC2_WINDOW_SINC 0.405 +#define JINC2_SINC 0.79 +#define JINC2_AR_STRENGTH 0.8 + +#define texCoord TEX0 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; +OUT vec4 color; +OUT vec2 texCoord; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + texCoord = TexCoord * 1.0001; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D s_p; +IN vec2 texCoord; + +const float halfpi = 1.5707963267948966192313216916398; +const float pi = 3.1415926535897932384626433832795; +const float wa = JINC2_WINDOW_SINC*pi; +const float wb = JINC2_SINC*pi; + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return min(a, min(b, min(c, d))); +} + +vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return max(a, max(b, max(c, d))); +} + +vec4 resampler(vec4 x) +{ + vec4 res; + + res = (x==vec4(0.0, 0.0, 0.0, 0.0)) ? vec4(wa*wb) : sin(x*wa)*sin(x*wb)/(x*x); + + return res; +} + +void main() +{ + + vec3 color; + vec4 weights[4]; + + vec2 dx = vec2(1.0, 0.0); + vec2 dy = vec2(0.0, 1.0); + + vec2 pc = texCoord*TextureSize; + + vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5)); + + weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + dx = dx/TextureSize; + dy = dy/TextureSize; + tc = tc/TextureSize; + + vec3 c00 = tex2D(s_p, tc -dx -dy).xyz; + vec3 c10 = tex2D(s_p, tc -dy).xyz; + vec3 c20 = tex2D(s_p, tc +dx -dy).xyz; + vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz; + vec3 c01 = tex2D(s_p, tc -dx ).xyz; + vec3 c11 = tex2D(s_p, tc ).xyz; + vec3 c21 = tex2D(s_p, tc +dx ).xyz; + vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz; + vec3 c02 = tex2D(s_p, tc -dx +dy).xyz; + vec3 c12 = tex2D(s_p, tc +dy).xyz; + vec3 c22 = tex2D(s_p, tc +dx +dy).xyz; + vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz; + vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz; + vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz; + vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz; + vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz; + + color = tex2D(s_p, texCoord).xyz; + + // Get min/max samples + vec3 min_sample = min4(c11, c21, c12, c22); + vec3 max_sample = max4(c11, c21, c12, c22); +/* + color = mat4x3(c00, c10, c20, c30) * weights[0]; + color+= mat4x3(c01, c11, c21, c31) * weights[1]; + color+= mat4x3(c02, c12, c22, c32) * weights[2]; + color+= mat4x3(c03, c13, c23, c33) * weights[3]; + mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]); + vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0); + color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0))); +*/ + + + color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z))); + color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z))); + color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z))); + color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z))); + color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1))); + + // Anti-ringing + vec3 aux = color; + color = clamp(color, min_sample, max_sample); + color = mix(aux, color, JINC2_AR_STRENGTH); + + // final sum and weight normalization + FragColor.xyz = color; +} +#endif diff --git a/Shaders/interpolation/lanczos2-sharp.glsl b/Shaders/interpolation/lanczos2-sharp.glsl new file mode 100644 index 0000000..5f83af3 --- /dev/null +++ b/Shaders/interpolation/lanczos2-sharp.glsl @@ -0,0 +1,205 @@ +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#define JINC2_WINDOW_SINC 0.5 +#define JINC2_SINC 1.0 +#define JINC2_AR_STRENGTH 0.8 + +#define texCoord TEX0 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; +OUT vec4 color; +OUT vec2 texCoord; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + texCoord = TexCoord; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D s_p; +IN vec2 texCoord; + +const float halfpi = 1.5707963267948966192313216916398; +const float pi = 3.1415926535897932384626433832795; +const float wa = JINC2_WINDOW_SINC*pi; +const float wb = JINC2_SINC*pi; + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return min(a, min(b, min(c, d))); +} + +vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return max(a, max(b, max(c, d))); +} + +vec4 resampler(vec4 x) +{ + vec4 res; + + res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x); + res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y); + res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z); + res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w); + + return res; +} + +void main() +{ + + vec3 color; + vec4 weights[4]; + + vec2 dx = vec2(1.0, 0.0); + vec2 dy = vec2(0.0, 1.0); + + vec2 pc = texCoord*TextureSize; + + vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5)); + + weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + dx = dx/TextureSize; + dy = dy/TextureSize; + tc = tc/TextureSize; + + vec3 c00 = tex2D(s_p, tc -dx -dy).xyz; + vec3 c10 = tex2D(s_p, tc -dy).xyz; + vec3 c20 = tex2D(s_p, tc +dx -dy).xyz; + vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz; + vec3 c01 = tex2D(s_p, tc -dx ).xyz; + vec3 c11 = tex2D(s_p, tc ).xyz; + vec3 c21 = tex2D(s_p, tc +dx ).xyz; + vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz; + vec3 c02 = tex2D(s_p, tc -dx +dy).xyz; + vec3 c12 = tex2D(s_p, tc +dy).xyz; + vec3 c22 = tex2D(s_p, tc +dx +dy).xyz; + vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz; + vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz; + vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz; + vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz; + vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz; + + color = tex2D(s_p, texCoord).xyz; + + // Get min/max samples + vec3 min_sample = min4(c11, c21, c12, c22); + vec3 max_sample = max4(c11, c21, c12, c22); +/* + color = mat4x3(c00, c10, c20, c30) * weights[0]; + color+= mat4x3(c01, c11, c21, c31) * weights[1]; + color+= mat4x3(c02, c12, c22, c32) * weights[2]; + color+= mat4x3(c03, c13, c23, c33) * weights[3]; + mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]); + vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0); + color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0))); +*/ + + + color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z))); + color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z))); + color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z))); + color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z))); + color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1))); + + // Anti-ringing + vec3 aux = color; + color = clamp(color, min_sample, max_sample); + color = mix(aux, color, JINC2_AR_STRENGTH); + + // final sum and weight normalization + FragColor.xyz = color; +} +#endif diff --git a/Shaders/nearest-neighbor.glsl b/Shaders/nearest-neighbor.glsl new file mode 100644 index 0000000..aa7bee6 --- /dev/null +++ b/Shaders/nearest-neighbor.glsl @@ -0,0 +1,73 @@ +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3]; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +void main() +{ + FragColor = COMPAT_TEXTURE(Texture, TEX0.xy); +} +#endif \ No newline at end of file diff --git a/Shaders/readme.txt b/Shaders/readme.txt new file mode 100644 index 0000000..abd02a0 --- /dev/null +++ b/Shaders/readme.txt @@ -0,0 +1,10 @@ +This is a package of pixel shaders intended for old school emulators. +Copyrights are held by the respective authors. + +https://github.com/libretro/glsl-shaders + + +Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR) + + +Extract shader-package.zip to unlock 100+ additional shaders diff --git a/Shaders/scanlines/scanline.glsl b/Shaders/scanlines/scanline.glsl new file mode 100644 index 0000000..7c8423b --- /dev/null +++ b/Shaders/scanlines/scanline.glsl @@ -0,0 +1,106 @@ +// Parameter lines go here: +#pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01 +#pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01 +#pragma parameter SCANLINE_SINE_COMP_B "Scanline Sine Comp B" 0.15 0.0 1.0 0.05 + +#define pi 3.141592654 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 omega; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; + omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y); +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 omega; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutputSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +// All parameter floats need to have COMPAT_PRECISION in front of them +uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS; +uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A; +uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B; +#else +#define SCANLINE_BASE_BRIGHTNESS 0.95 +#define SCANLINE_SINE_COMP_A 0.0 +#define SCANLINE_SINE_COMP_B 0.15 +#endif + +void main() +{ + vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B); + vec3 res = COMPAT_TEXTURE(Source, vTexCoord).xyz; + vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0))); + FragColor = vec4(scanline.x, scanline.y, scanline.z, 1.0); +} +#endif diff --git a/Shaders/shader-package.zip b/Shaders/shader-package.zip new file mode 100644 index 0000000..5989e50 --- /dev/null +++ b/Shaders/shader-package.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:620204ec5e11f4611e147ed978bce6a387c8d8171b4e2a86e894bcba1009b621 +size 276036 diff --git a/Shaders/sharpen/fast-sharpen.glsl b/Shaders/sharpen/fast-sharpen.glsl new file mode 100644 index 0000000..623fd6d --- /dev/null +++ b/Shaders/sharpen/fast-sharpen.glsl @@ -0,0 +1,148 @@ +/* + Fast Sharpen Shader + + Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.com + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#pragma parameter SHARPEN "Sharpen strength" 1.00 0.0 2.00 0.05 +#pragma parameter CONTR "Ammount of sharpening" 0.07 0.0 0.25 0.01 +#pragma parameter DETAILS "Details sharpened " 1.00 0.0 1.00 0.05 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +COMPAT_VARYING vec2 g10; +COMPAT_VARYING vec2 g01; +COMPAT_VARYING vec2 g12; +COMPAT_VARYING vec2 g21; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy * 1.00001; + g10 = vec2( 0.3333,-1.0)*SourceSize.zw; + g01 = vec2(-1.0,-0.3333)*SourceSize.zw; + g12 = vec2(-0.3333, 1.0)*SourceSize.zw; + g21 = vec2( 1.0, 0.3333)*SourceSize.zw; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 g10; +COMPAT_VARYING vec2 g01; +COMPAT_VARYING vec2 g12; +COMPAT_VARYING vec2 g21; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float SHARPEN; +uniform COMPAT_PRECISION float CONTR; +uniform COMPAT_PRECISION float DETAILS; +#else +#define SHARPEN 1.2 +#define CONTR 0.08 +#define DETAILS 1.0 +#endif + +void main() +{ + vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb; + vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb; + vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb; + vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb; + vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord ).rgb; + vec3 b11 = (c10+c01+c12+c21)*0.25; + + float contrast = max(max(c11.r,c11.g),c11.b); + contrast = mix(2.0*CONTR, CONTR, contrast); + + vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast)); + vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast)); + + vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75)); + vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif); + + c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1); + + FragColor = vec4(c11,1.0); +} +#endif diff --git a/Shaders/xbr/xbr-lv2-noblend.glsl b/Shaders/xbr/xbr-lv2-noblend.glsl new file mode 100644 index 0000000..bbc2aae --- /dev/null +++ b/Shaders/xbr/xbr-lv2-noblend.glsl @@ -0,0 +1,300 @@ +#version 130 + +/* + Hyllian's xBR-lv2-noblend Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#pragma parameter XBR_EQ_THRESHOLD "Eq Threshold" 0.6 0.0 2.0 0.1 +#pragma parameter XBR_LV2_COEFFICIENT "Lv2 Coefficient" 2.0 1.0 3.0 0.1 + +#define mul(a,b) (b*a) + +// Uncomment just one of the three params below to choose the corner detection +#define CORNER_A +//#define CORNER_B +//#define CORNER_C +//#define CORNER_D + +#define lv2_cf XBR_LV2_COEFFICIENT + +#define texCoord TEX0 +#define t1 TEX1 +#define t2 TEX2 +#define t3 TEX3 +#define t4 TEX4 +#define t5 TEX5 +#define t6 TEX6 +#define t7 TEX7 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define PRECISION mediump +#else +#define PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; + +OUT vec4 color; +OUT vec2 texCoord; +OUT vec4 t1; +OUT vec4 t2; +OUT vec4 t3; +OUT vec4 t4; +OUT vec4 t5; +OUT vec4 t6; +OUT vec4 t7; + +uniform mat4 MVPMatrix; +uniform PRECISION int FrameDirection; +uniform PRECISION int FrameCount; +uniform PRECISION vec2 OutputSize; +uniform PRECISION vec2 TextureSize; +uniform PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + + float dx = (1.0/TextureSize.x); + float dy = (1.0/TextureSize.y); + + texCoord = TexCoord; + texCoord.x *= 1.00000001; + t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1 + t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C + t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F + t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I + t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5 + t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0 + t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4 +} + + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define PRECISION mediump +#else +#define PRECISION +#endif + +uniform PRECISION int FrameDirection; +uniform PRECISION int FrameCount; +uniform PRECISION vec2 OutputSize; +uniform PRECISION vec2 TextureSize; +uniform PRECISION vec2 InputSize; +uniform sampler2D decal; +IN vec2 texCoord; +IN vec4 t1; +IN vec4 t2; +IN vec4 t3; +IN vec4 t4; +IN vec4 t5; +IN vec4 t6; +IN vec4 t7; + +#ifdef PARAMETER_UNIFORM +uniform PRECISION float XBR_EQ_THRESHOLD; +uniform PRECISION float XBR_LV2_COEFFICIENT; +#else +#define XBR_EQ_THRESHOLD 0.6 +#define XBR_LV2_COEFFICIENT 2.0 +#endif +// END PARAMETERS // + +const vec3 Y = vec3(0.2126, 0.7152, 0.0722); + +// Difference between vector components. +vec4 df(vec4 A, vec4 B) +{ + return vec4(abs(A-B)); +} + +// Compare two vectors and return their components are different. +vec4 diff(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +// Determine if two vector components are equal based on a threshold. +vec4 eq(vec4 A, vec4 B) +{ + return (step(df(A, B), vec4(XBR_EQ_THRESHOLD))); +} + +// Determine if two vector components are NOT equal based on a threshold. +vec4 neq(vec4 A, vec4 B) +{ + return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B)); +} + +// Weighted distance. +vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h)); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +void main() +{ + vec4 edri, edr, edr_l, edr_u; // px = pixel, edr = edge detection rule + vec4 irlv1, irlv2l, irlv2u, block_3d; + bvec4 nc, px; + vec4 fx, fx_l, fx_u; // inequations of straight lines. + + vec2 fp = fract(texCoord*TextureSize); + + vec3 A1 = tex2D(decal, t1.xw ).xyz; + vec3 B1 = tex2D(decal, t1.yw ).xyz; + vec3 C1 = tex2D(decal, t1.zw ).xyz; + vec3 A = tex2D(decal, t2.xw ).xyz; + vec3 B = tex2D(decal, t2.yw ).xyz; + vec3 C = tex2D(decal, t2.zw ).xyz; + vec3 D = tex2D(decal, t3.xw ).xyz; + vec3 E = tex2D(decal, t3.yw ).xyz; + vec3 F = tex2D(decal, t3.zw ).xyz; + vec3 G = tex2D(decal, t4.xw ).xyz; + vec3 H = tex2D(decal, t4.yw ).xyz; + vec3 I = tex2D(decal, t4.zw ).xyz; + vec3 G5 = tex2D(decal, t5.xw ).xyz; + vec3 H5 = tex2D(decal, t5.yw ).xyz; + vec3 I5 = tex2D(decal, t5.zw ).xyz; + vec3 A0 = tex2D(decal, t6.xy ).xyz; + vec3 D0 = tex2D(decal, t6.xz ).xyz; + vec3 G0 = tex2D(decal, t6.xw ).xyz; + vec3 C4 = tex2D(decal, t7.xy ).xyz; + vec3 F4 = tex2D(decal, t7.xz ).xyz; + vec3 I4 = tex2D(decal, t7.xw ).xyz; + + vec4 b = mul( mat4x3(B, D, H, F), Y ); + vec4 c = mul( mat4x3(C, A, G, I), Y ); + vec4 e = mul( mat4x3(E, E, E, E), Y ); + vec4 d = b.yzwx; + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + vec4 i4 = mul( mat4x3(I4, C1, A0, G5), Y ); + vec4 i5 = mul( mat4x3(I5, C4, A1, G0), Y ); + vec4 h5 = mul( mat4x3(H5, F4, B1, D0), Y ); + vec4 f4 = h5.yzwx; + + vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); + vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); + vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); + vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); + vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); + vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); + + // These inequations define the line below which interpolation occurs. + fx = vec4(greaterThan(Ao*fp.y+Bo*fp.x, Co)); + fx_l = vec4(greaterThan(Ax*fp.y+Bx*fp.x, Cx)); + fx_u = vec4(greaterThan(Ay*fp.y+By*fp.x, Cy)); + +#ifdef CORNER_A + irlv1 = diff(e,f) * diff(e,h); +#endif +#ifdef CORNER_B + irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c)); +#endif +#ifdef CORNER_D + vec4 c1 = i4.yzwx; + vec4 g0 = i5.wxyz; + irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0)); +#endif +#ifdef CORNER_C + irlv1 = (neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)); +#endif + + irlv2l = diff(e,g) * diff(d,g); + irlv2u = diff(e,c) * diff(b,c); + + vec4 wd1 = wd( e, c, g, i, h5, f4, h, f); + vec4 wd2 = wd( h, d, i5, f, i4, b, e, i); + + edri = step(wd1, wd2) * irlv1; + edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1); + edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr; + edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr; + + nc = bvec4( edr * ( fx + edr_l * (fx_l)) + edr_u * fx_u); + + px = lessThanEqual(df(e, f), df(e, h)); + + vec3 res1 = nc.x ? px.x ? F : H : nc.y ? px.y ? B : F : nc.z ? px.z ? D : B : E; + vec3 res2 = nc.w ? px.w ? H : D : nc.z ? px.z ? D : B : nc.y ? px.y ? B : F : E; + + vec2 df12 = abs( mul( mat2x3(res1, res2), Y ) - e.xy); + + vec3 res = mix(res1, res2, step(df12.x, df12.y)); + + FragColor.xyz = res; +} +#endif diff --git a/Shaders/xbrz/xbrz-freescale.glsl b/Shaders/xbrz/xbrz-freescale.glsl new file mode 100644 index 0000000..3cc9edd --- /dev/null +++ b/Shaders/xbrz/xbrz-freescale.glsl @@ -0,0 +1,375 @@ +/* + Hyllian's xBR-vertex code and texel mapping + + Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +// This shader also uses code and/or concepts from xBRZ as it appears +// in the Desmume source code. The license for which is as follows: + +// **************************************************************************** +// * This file is part of the HqMAME project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * +// * * +// * Additionally and as a special exception, the author gives permission * +// * to link the code of this program with the MAME library (or with modified * +// * versions of MAME that use the same license as MAME), and distribute * +// * linked combinations including the two. You must obey the GNU General * +// * Public License in all respects for all of the code used other than MAME. * +// * If you modify this file, you may extend this exception to your version * +// * of the file, but you are not obligated to do so. If you do not wish to * +// * do so, delete this exception statement from your version. * +// **************************************************************************** + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float WHATEVER; +#else +#define WHATEVER 0.0 +#endif + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy * 1.0001; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#define BLEND_NONE 0 +#define BLEND_NORMAL 1 +#define BLEND_DOMINANT 2 +#define LUMINANCE_WEIGHT 1.0 +#define EQUAL_COLOR_TOLERANCE 30.0/255.0 +#define STEEP_DIRECTION_THRESHOLD 2.2 +#define DOMINANT_DIRECTION_THRESHOLD 3.6 + +float DistYCbCr(vec3 pixA, vec3 pixB) +{ + const vec3 w = vec3(0.2627, 0.6780, 0.0593); + const float scaleB = 0.5 / (1.0 - w.b); + const float scaleR = 0.5 / (1.0 - w.r); + vec3 diff = pixA - pixB; + float Y = dot(diff.rgb, w); + float Cb = scaleB * (diff.b - Y); + float Cr = scaleR * (diff.r - Y); + + return sqrt(((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr)); +} + +bool IsPixEqual(const vec3 pixA, const vec3 pixB) +{ + return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE); +} + +float get_left_ratio(vec2 center, vec2 origin, vec2 direction, vec2 scale) +{ + vec2 P0 = center - origin; + vec2 proj = direction * (dot(P0, direction) / dot(direction, direction)); + vec2 distv = P0 - proj; + vec2 orth = vec2(-direction.y, direction.x); + float side = sign(dot(P0, orth)); + float v = side * length(distv * scale); + +// return step(0, v); + return smoothstep(-sqrt(2.0)/2.0, sqrt(2.0)/2.0, v); +} + +#define eq(a,b) (a == b) +#define neq(a,b) (a != b) + +#define P(x,y) COMPAT_TEXTURE(Source, coord + SourceSize.zw * vec2(x, y)).rgb + +void main() +{ + //--------------------------------------- + // Input Pixel Mapping: -|x|x|x|- + // x|A|B|C|x + // x|D|E|F|x + // x|G|H|I|x + // -|x|x|x|- + + vec2 scale = OutputSize.xy * SourceSize.zw; + vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5); + vec2 coord = vTexCoord - pos * SourceSize.zw; + + vec3 A = P(-1.,-1.); + vec3 B = P( 0.,-1.); + vec3 C = P( 1.,-1.); + vec3 D = P(-1., 0.); + vec3 E = P( 0., 0.); + vec3 F = P( 1., 0.); + vec3 G = P(-1., 1.); + vec3 H = P( 0., 1.); + vec3 I = P( 1., 1.); + + // blendResult Mapping: x|y| + // w|z| + ivec4 blendResult = ivec4(BLEND_NONE,BLEND_NONE,BLEND_NONE,BLEND_NONE); + + // Preprocess corners + // Pixel Tap Mapping: -|-|-|-|- + // -|-|B|C|- + // -|D|E|F|x + // -|G|H|I|x + // -|-|x|x|- + if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I)))) + { + float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0,2), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F)); + float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1,2)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I; + blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + + // Pixel Tap Mapping: -|-|-|-|- + // -|A|B|-|- + // x|D|E|F|- + // x|G|H|I|- + // -|x|x|-|- + if (!((eq(D,E) && eq(G,H)) || (eq(D,G) && eq(E,H)))) + { + float dist_G_E = DistYCbCr(P(-2.,1.) , D) + DistYCbCr(D, B) + DistYCbCr(P(-1.,2.), H) + DistYCbCr(H, F) + (4.0 * DistYCbCr(G, E)); + float dist_D_H = DistYCbCr(P(-2.,0.) , G) + DistYCbCr(G, P(0.,2.)) + DistYCbCr(A, E) + DistYCbCr(E, I) + (4.0 * DistYCbCr(D, H)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_H) < dist_G_E; + blendResult.w = ((dist_G_E > dist_D_H) && neq(E,D) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: -|-|x|x|- + // -|A|B|C|x + // -|D|E|F|x + // -|-|H|I|- + // -|-|-|-|- + if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F)))) + { + float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1.,-2.)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C)); + float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C; + blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: -|x|x|-|- + // x|A|B|C|- + // x|D|E|F|- + // -|G|H|-|- + // -|-|-|-|- + if (!((eq(A,B) && eq(D,E)) || (eq(A,D) && eq(B,E)))) + { + float dist_D_B = DistYCbCr(P(-2.,0.), A) + DistYCbCr(A, P(0.,-2.)) + DistYCbCr(G, E) + DistYCbCr(E, C) + (4.0 * DistYCbCr(D, B)); + float dist_A_E = DistYCbCr(P(-2.,-1.), D) + DistYCbCr(D, H) + DistYCbCr(P(-1.,-2.), B) + DistYCbCr(B, F) + (4.0 * DistYCbCr(A, E)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_B) < dist_A_E; + blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + vec3 res = E; + + // Pixel Tap Mapping: -|-|-|-|- + // -|-|B|C|- + // -|D|E|F|x + // -|G|H|I|x + // -|-|x|x|- + if(blendResult.z != BLEND_NONE) + { + float dist_F_G = DistYCbCr(F, G); + float dist_H_C = DistYCbCr(H, C); + bool doLineBlend = (blendResult.z == BLEND_DOMINANT || + !((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || + (IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I)))); + + vec2 origin = vec2(0.0, 1.0 / sqrt(2.0)); + vec2 direction = vec2(1.0, -1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C); + origin = haveShallowLine? vec2(0.0, 0.25) : vec2(0.0, 0.5); + direction.x += haveShallowLine? 1.0: 0.0; + direction.y -= haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|-|-|-|- + // -|A|B|-|- + // x|D|E|F|- + // x|G|H|I|- + // -|x|x|-|- + if(blendResult.w != BLEND_NONE) + { + float dist_H_A = DistYCbCr(H, A); + float dist_D_I = DistYCbCr(D, I); + bool doLineBlend = (blendResult.w == BLEND_DOMINANT || + !((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || + (IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G)))); + + vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0); + vec2 direction = vec2(1.0, 1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I); + origin = haveShallowLine? vec2(-0.25, 0.0) : vec2(-0.5, 0.0); + direction.y += haveShallowLine? 1.0: 0.0; + direction.x += haveSteepLine? 1.0: 0.0; + } + origin = origin; + direction = direction; + + vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|-|x|x|- + // -|A|B|C|x + // -|D|E|F|x + // -|-|H|I|- + // -|-|-|-|- + if(blendResult.y != BLEND_NONE) + { + float dist_B_I = DistYCbCr(B, I); + float dist_F_A = DistYCbCr(F, A); + bool doLineBlend = (blendResult.y == BLEND_DOMINANT || + !((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || + (IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C)))); + + vec2 origin = vec2(1.0 / sqrt(2.0), 0.0); + vec2 direction = vec2(-1.0, -1.0); + + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A); + origin = haveShallowLine? vec2(0.25, 0.0) : vec2(0.5, 0.0); + direction.y -= haveShallowLine? 1.0: 0.0; + direction.x -= haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|x|x|-|- + // x|A|B|C|- + // x|D|E|F|- + // -|G|H|-|- + // -|-|-|-|- + if(blendResult.x != BLEND_NONE) + { + float dist_D_C = DistYCbCr(D, C); + float dist_B_G = DistYCbCr(B, G); + bool doLineBlend = (blendResult.x == BLEND_DOMINANT || + !((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || + (IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A)))); + + vec2 origin = vec2(0.0, -1.0 / sqrt(2.0)); + vec2 direction = vec2(-1.0, 1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G); + origin = haveShallowLine? vec2(0.0, -0.25) : vec2(0.0, -0.5); + direction.x -= haveShallowLine? 1.0: 0.0; + direction.y += haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + FragColor = vec4(res, 1.0); +} +#endif diff --git a/TADEMO.UFO b/TADEMO.UFO deleted file mode 100644 index 50df617..0000000 --- a/TADEMO.UFO +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dece463378c754c039a3f28061dc975b6af70e00a2fc8a2d8506cf1848fb3203 -size 143151 diff --git a/TADemo/3DTA.exe b/TADemo/3DTA.exe new file mode 100644 index 0000000..927e22b --- /dev/null +++ b/TADemo/3DTA.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9917e96c903a92bea03b6d5661d1115e3c7ed1ac5d52f50fe776e5a3c26cfb5 +size 536627 diff --git a/TADemo/3DTAConfig.exe b/TADemo/3DTAConfig.exe new file mode 100644 index 0000000..c74ac93 --- /dev/null +++ b/TADemo/3DTAConfig.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30823823ab670e6b8f315af651579b4524bbc088c367a1ee4ca31e87c06087ba +size 32768 diff --git a/TADemo/HPIUtil.dll b/TADemo/HPIUtil.dll new file mode 100644 index 0000000..0aa4645 --- /dev/null +++ b/TADemo/HPIUtil.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bc007e99bc3f9de69b26d8ae4c10f0592110ef69a826390c6c3ec6ff21f98e7 +size 95232 diff --git a/TADemo/MAPS.TXT b/TADemo/MAPS.TXT new file mode 100644 index 0000000..3d5cd3d --- /dev/null +++ b/TADemo/MAPS.TXT @@ -0,0 +1,139 @@ +; +; Default list of maps that the Random Map Selector (tm) will chose from, with weightings. +; Thanks to Xeno for making the list of mapnames! +; +; Structure of this file (quite simple) +; +; +Group_name +; +; +; ... +; +Group_name +; ... +; +; NOTE: If you want to disable a group, just remove the + since all lines that doesn't start with either an +; integer or a + will be considered as groups to ignore. (and no +10 won't count as an integer). If you want +; to disable a specific map, just delete the line or perhaps set the weight to 0. +; +; About the weightings: They are an INTEGER, and the chance for getting a certain map is proportional to +; / . + ++ORIGINAL TA MAPS + +100 Anteer Strait +100 Ashap Plateau +100 Caldera's Rim +100 Coast to Coast +100 Dark Side +100 Etorrep Glacier +100 Evad River Confluence +100 Fox Holes +100 Full Moon +100 Gods of War +100 Great Divide +100 Greenhaven +100 Hundred Isles +100 Kill the Middle +100 King of the Hill +100 Lava & Two Hills +100 Lava Alley +100 Lava Highground +100 Lava Mania +100 Lava Run +100 Metal Heck +100 Over Crude Water +100 Painted Desert +100 Pincushion +100 Red Hot Lava +100 Red Planet +100 Red Triangle +100 Ring Atoll +100 Rock Alley +100 Seven Islands +100 Sherwood +100 Shore to Shore +100 The Cold Place +100 The Desert Triad +100 The Pass +100 Two Continents +100 Yerrot Mountains + + ++CORE CONTINGENCY MAPS + +100 Acid Foursome +100 Acid Pools +100 Acid Trip +100 Assault on Suburbia +100 Biggie Biggs +100 Block Wars +100 Brain Coral +100 Cavedog Links CC +100 Checker Ponds +100 Cluster Freak +100 Comet Catcher +100 Core Prime Industrial Area +100 Crater Islands +100 Crystal Cracked +100 Crystal Isles +100 Crystal Maze +100 Crystal Treasure Island +100 Dire Straits +100 East Indeez +100 Eastside Westside +100 Expanded Confluence +100 Flooded Glaciers +100 Gasbag Forests +100 Gasplant Plain +100 Higher Ground +100 Ice Scream +100 Icy Bergs +100 John's Pass +100 Lake Shore +100 Lusch Puppy +100 Luschaven +100 Metal Isles +100 Moon Quartet +100 Ooooweeee +100 Pillopeens +100 Plains and Passes +100 Polar Range +100 Polyp Fields +100 Red River North +100 Red River +100 Ror Shock +100 Sail Away +100 Sector 410b +100 Show Down +100 Slate Gordon +100 Slated Fate +100 Steel Jungle +100 Surface Meltdown +100 Temblorian Mist +100 The Barrier Reef +100 The Bayou +100 Town & Country +100 Trout Farm + + ++BATTLE TACTICS MAPS + +100 Aqua Verdigris +100 Brilliant Cut Lake +100 Canal Crossing +100 Coremageddon +100 Metal Gridlock +100 Wretched Ridges + + ++ONLINE CAVEDOG MAPS + +100 Ancient Issaquah +100 Evad River Delta +100 Luschie +100 Luschinfloggen +100 Mounds of Mars +100 ThundurLok Rok +100 Tropical Paradise + + diff --git a/TADemo/PALETTE.PAL b/TADemo/PALETTE.PAL new file mode 100644 index 0000000000000000000000000000000000000000..dfdf5388e5b3d876eeab3e9b4b3d7d821e141b07 GIT binary patch literal 1024 zcmZ{jA&lxu6ox-nQBhG*QBhHWsHmtwR8&+TDiFO10)ePNR3KI$Dj=yqAP@)yqBr3s z2*e5m0>MoXD-bIX2ws9fAP~G{#R^_B?`+=6dnf%TGbeNA{Qdtk07JpoH2hu+zc)h( z{QCPBKYslCb>g=}-9Na$9XT!5>_;OrFhkqdzhH4AJ5Or7gP@pifK`hH-# zSu&_f@==#gFQt<;XtzSrIG_=Fgn^6i*|?60Wg6(Z#`AgNa@nxo&snWXrqdq%ev2%N zNz;Hhb_oLE>l)a$hGl7(CKys)*OB}u_xqjm`OM*PV7uMQJuBw(Ipgt|qA1AooOZiS zk|cy-i064Yjw5#%+&>hDs}lZ-*;-M|6y1R$%^yVVD?xI?4G&oUD@JXG<`igFCIlKn zz~}m@*qv`wyLZavhJ3Oh?T?8%FZfA^TGYa=H*x$1b}hnk>X^2VVb;(Mhm+{Hy*`*9 zE|i;h^2MHXvL-4P`1uUCJ;F}BbIIElX~Q51b>cuH^fc^$ts#2)Ba9Z@b4`GwP;hI; is the same number that is saved in a unit restrictions file. Don't know +; how that is related to the unit, or if it can be found in the unit's file somewhere. So if +; you know, feel free to enlighten me. +; +; If you add stuff to the file, you could always send it to me so that future releases of TA Demo can +; recognize what 3rd-party units was used. (If there should happen to be a nice easy way to get the unit +; names from those id numbers, this file might become obsolete) +; +; Edited by Fnordia 990220 +; 991027 +; 000219 +; 010318 +; +; +; Syntax: (very simple) +; +; = +; +; +; <...> +; +; = +; +; etc.. +; +; update: only units in one of the +-groups will show. with the group furthest down takes presedence. +; however, the units before the first +-group will be tested for all groups + +; I just added one unit to CC cuz I'm lazy. Btw, it's inclusive, so if any unit in the groups list were +; enabled in the game, this group's name will be listed under used units. + +=BAI +6da73737 + +=Queller +; albatross +62cc5579 + +=Counterstrike +; fluxor +9a34465c + ++regular ta +=Core Contingency + +; it's the nixter btw. :) +848ebee6 + +=ARM Flea +371d264a + +=ARM Scarab +6b81b8be + +=CORE Hedgehog +763476f4 + +=CORE Immolator +3fcf5935 + +=ARM Fast Attack-Repair Kbot +d6d867f3 + +=CORE Necro +f4c81832 + ++uberhack 1.0 +=UberHack 1.0 TAEC +; The anemone +b9f36d39 + ++uberhack 1.1 +=Uberhack 1.1 +; the gimp +16b40f07 + +=TAEC units +; the thumper hehe +a89cec32 + ++uberhack 3.0 +=Uberhack 3.0 +;centurion +3b978743 + ++xta 0.8 +=XTA 0.8 +f804eafe + ++xta betas +=XTA pre1.0 +; fortwall +6d197dcf \ No newline at end of file diff --git a/TotalA.exe b/TotalA.exe index 14b898e..af953b9 100755 --- a/TotalA.exe +++ b/TotalA.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8409fb25e680ee3b4b02938226d40b53f304a2a87191c41e894d326cf8ac3702 +oid sha256:3b9c0fadabf3dc67ed5f05a70f1e1505a0c65deadd1a3c930adfe30e2a84995e size 1178624 diff --git a/audiere.dll b/audiere.dll new file mode 100644 index 0000000..c72ed77 --- /dev/null +++ b/audiere.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90e59c4f60941a2838d46e20fb78ba0cf71e9cfd0782e291ca876645e3794a66 +size 512000 diff --git a/bass.dll b/bass.dll index 10114b668cfdfd2275dbc4e9280879b67c7efdc0..cb33ffa5fbdc9f56cb7eea6e712529412f7dc43b 100644 GIT binary patch literal 131 zcmWN`xe>!45CFiODrmssheO@)+!M zw=&*h9$3Vs*yxqdmbCM`N0kXMc|$R3;~@kY$)YA%Qwc=QLDnhXhfp9TWrG15tVijx Ns%-Wja%G~@!2TN8C$j(m literal 139128 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 z zKn<2Y<5z0$cdX(vz3U=shOuc|#mCeU-0Ynna-|NsejH^NEHBh#>NH{aja|gz&Uc2K zA(|YRUUe|A%1#iQGB8D&Z(M-gK|mVhpVK4vU?n$DB#Ih!GBxmhQ$BbONKWl`BMo~j zK_<)-|KWr0KA;N*6GjD2Z5f=URoGVL=u-Xb05bahzx1)H6@gBv*l@D}y{ZK%;W64@ z`w{-@Pd6v4Mc@b-t@{fEWCVZSB;=?r>77J<4bqVcqrbNAMR<3Jhe^khY)QHD+Mb$i^Z?QAQqFsZe)j&!^%;@zk{y)1A%7&$9**h?Ct`7 z`)CgtW&%zcG^zHte7LQ<1LF!X?{iggP#A@Yf5xuL;`9pS`PlqLY<;m( z>Q2gPWfAF>7Az0&Z!O?H_fqd^S9wnBoG=+Rde*b5AgJG;X^KstUt(#lI`WG`W(2Z&LIq*<=SeX3x5FrA z--d}7d3~zwU0JCvz5V-wlzEsvoHt8V@0vYhx^TE_m-gI+;4LI>9D4c$#gDhUn(ZqR z4j~HARUvicb*DfK?S3Ijx8P%6`;I6F3(9&vy>3MueNq@hQI;(oFtk|Ied$_D>a`;$ zUXnkE$fm2A6(^f0yq0D}c-1J%5cC@mKq9PingZH_hyc_V{&9$sxPE&@klA&N3hXKZ zQF4HwyI{oaV=yIswQi8OTwgsZ`(Az6&&7?bFaK^>T^>{mka>hu_VR5nkonb$2qPJD z$_2>W8S3Ups$)8W0C83rz=E*x@?`6}Out-oc;#Cs-OrzYH&=!uK>SK{aa;7--L z#MD87*0f9vv_;`QwMG$47SDXY@AhEfs}fUhyZ*pfcZL;m`r1CHyI2t4&5CRW0}yYN zbx;9fe)cV4eworA75Ia`I|X64ca&l1*kyzD{fE!>-a`KQnuk-l!b*3azfaCtlCF7ak<{tL_zK5pa`U zaSy9rUsMHn>#hewbn$%#^HPY9o&1OOi3P4&;27u~nZ^8i^xYU+v@%e-}}t$ zYaiXny^2cv%2`?(Spg=ys?l4_r9-QZpe9d~AvSs_NYBleYG) zjU4oonT^zh6-kQB%Xxdmr(m-1v~{ECF-X=Fg{fn0VIB1z4D|W?5*tF!8$}zCUX9bW z(i<{SNwn3tRQ`>;DJxK*1xotzGe0fbAMh2DFzGL@A5$t{Jlkzm0M_6yE5PcUTsHPD z%1QSp3j^T-+vg4407F9H8-fefBjV&F9{%78)?TzI6vFv}$GkAoaN9S`kF%jumB--M zRiZ%&CH;_twG03>#k#G7J%3-;F^I9-q{p�fir*|4#DW5-7F#;+Cb{HK2noaJWYl zep+GzR7Sg)%M@lj@xut2OaNq&Zxxns6#q5pZ|{bA<5f|%9EOoODqmJvR-{oD5pxKB zN!!oNreGyl4rBEfjk_)027_r=c5!09_OrYU99B4St9%X+-wG8)(UsI1g9Pe($pQ~- z7Fy8!JI;TpxK3nk=XIKy-mKxMi-O^~$;C8QS9@2YCWSuMxz^GubydgcTmc(BQ`LwP zy944&0;U+RHMe7(-#05=E3wnw6I5uq@tNZv7*VS3eqB!QuP-f2VqosWrXK@5A(-;~ zj>50U30q)HfqPs)fh*_dUEceKbh@gzc9kS|ZE~S%{09XpF0K;|uQ52|>o%ssfxK;q zHS+lY>jl+^fu=7qp=sEv97YwoVGzyP3>z98qd*M%%^}MC=DD7hGMD&&br@avj+bYq ztwJo}A-t;QtC?rh7ovdtCtpvJE8S9du)NWTLouqw!PPBPFH5m~?XD`n$Lbj+uap4< z%;KY5om8h<=2c8`d<4e;3Ib{1iH3q0u=G{j5jq~zHc(Kve;9r4?k8)bt{>V8l!d`x ziQM(2x=ZNWaCKT{%z|yB$9K9gRo-iVv8isa=)%0-fdKv{JY*&fdql7UB<1;ee-Z!G zZa#v^x+v#Wu@t{_Sl!F&kpk&T|czj|c3r*B zp;oF&)v?GY#=Z(Jkm^5s_^eJFg^mvcMccVb^=2t9@IAo@=W;zj;BbsBTse0gcMkOv zjSkdrDB|Bit!k?=eH27Se)BSHn5eb~RIJrS5-|)xHu(BNLSE#fCK`0gw`y1a9U3ph z-~g;T8|ix2B^}RSc=zwhN2&ic9px3wZa?L?){g`bR~Po%!t%S zMR3D`+=NHWtQ@?V;D$%0V`8E(S8F`8<}*Crbm(=JGECFtdrWG>(zscE0unH2(E&=@ z6iQazwD$+6F1!g`SH7-@T34Qo4W4>WCb{~{`P_|P5$b(4C=AF^P)C{;622>)Eu;SJ zyIB=aM@aQs0eN?-;N^lOdS!8a2Hp*dK6<(VKzqC+clE)WTm%)fOJfj8U*F`y3 z|5`}v1*dTd6Pncuz~n0V?<1^hSmj_njXCV3yc$ezBYH%xJ)j(mvl7{CZ4}g+U)2l=vY!VaJesTbc_O1yN zUV^yNvQERCiXZr08u70i?C+R|NU4iXd?r>!cWn`qj?vqfC`qi-mrUcCFDug6PyDBg3VikiBQ-H+7Q8P$}MbXC;|44ka{HkwSzh5<*t zzFfY+z)h~Ea8jqOd{u-P604&TSAw>lx>WH0dh7j-OsP_byySt&xRX*uLrv3{LIZmD z`QyI1oqK)7S&WXV?CE|i-faES$y5`<%CMrw`)d48fV_ZrzX7Gc`Sk@UE^qwA$>ZWJ z_-L4qB-Ua-$hT1G1HQeD#|DRA?_3s?XUOD&TNy>bv_e&3dl8D%4EqA1(k*HT;9teF zFV3a}4mXPBW`Y?g3oT`qrHK|Mk$)Ez%t>RGD=}%l*;3P(Gf2JZF&lZHovk~NiXv%Z zb{bAEO0Z_^hh=plJ#yPN1vF)jR{(5@`KpRcewwdjU(t&kOg;TS*QP@l#-Bq_9?k@GoQuXzVd^LyCBHecPH@O26M*e9ouqvq3urwPfJ^b|^svCwPKl9Pf%{nqM(4@{^ z#h@k$b+VVnWsz(Zo(hVt0=ZuePf#8DPjGat7@)Ngjg>F{dcgwPH)lU}s>Qi%K#BhH zT@@gLSiH&PrLvCM+honZl9x3)SFp&4Xx;Yy}wBX2_qel!{v2 zC?W~Dm5;=uKL zfYlj3J7Lx`)l`xEbxjX|=iF1+f_i}%bsI!9XrF^zu|d5jM%DWG>EgvI-mZ4~E;c4P z76tNA6cGt1ZJ4k#(OF*fdF1X4n)I;f^Q$MLgMUA#z;^ogg;192u3WO}G19QV1FOhT ztaoaq|el*;b@K*&qt<<ty+x-1I zFo#snDsZ=Uj0xriaV2069dN6|%hlj5eEti{c!lE=cxSWPPcJo3DVXMq=jOd$d+_f` z6-Olm&y7tCoGBEX5*AS?G>xMy#MaD|A^>#7sG^{)!B8(q%xeKte1en1BtoG zlB-VZ%wKoYzAw11uh?e&t@jg5G5tqb*S0GX21PsO*Hyy0s(VzscO^p(ocsT-A9@f* z23||Ow`gS)aBd~FAtyuk)6XSN!+>g_*y5(FoulG$f5(r+7-L`n$XE_`4)^-m!x(Lc z+PjK>4)$Izh-r`H1^v(`Z5J%vE|}yM8(ea1;bM=+Tm^4*$5N#erbT z^v+;Wcw+@dOrVb2Bt z>f6^>;XeQc#2MdJDyd|3%j119uzls5FlOygu_*LQ|6Z79u?D~HAnm&|f~pE7o%^FY z(s1m!jH2qvu0jq0TfYj;&?B7zUKBdbQY*n5Jl>Xm)$zqRnoiaqH@_)}plH zaE0jU^CNe{`fcAmuap|2Ccg93Ew;ML3wMP|-GtRbdsdl+f4qoV_GmN-M>hp)1qxEU zx+z};CLk&^G+&hO_Z1${t_y8)0R!4BWu6zG0qlrn$pKNn*ML9tvxGxcf@n= zHh$9_p>`~FpJLqd_cdkxhq(Kt&7-$E7dW%)dRvA^GVYkaFG#v$B>@w-xwGQmy?V{v zD>3S75osb-I_*yP%kbu*>g>+cd8-%GnQ!U>;ui|^)f64${qLw4b&yiegB*T$WsP88 z>PriK@i0dCGscRh?{kclg3;C%bS7ZMNf;Is+?_^YVLMF2P9DmjQj{_#ELHg@Q?GyF zoDMll-!hj1fntKa5erUk6O)UIj?)@>zkdofi!cUqI6|X>DbLY13us-rmHphR3<wS0i0oq1mXq zX#SN9v@h+|17Rr6iW7m?5dVF>aQSaj;7n8FeItn-EEygn#+LL48IoWU8?BH zbHJc!V7jvIx>KNnA}sxgn@eC)`s&Qw>2LS7q67?*B&)Qw2{k_4HwCIc?&<_@P0DY$ zqv^F2ujPt`_me6a1(cs4Sq$ndcUa}SXCL=lO+GsQ*>Ne{60pwwb9rTAP0DX7kfZ(m z2l?e^0I)KY>funNT?3H75i4B04bTFoP#`QgK?JJ&j z*>RYZ@-Obe*}ZLMDpAW#UC!6{i8+8@ihnHy0R5%n@h^ z!DOc)hpEAtI1vXMCzr$%|3y@dbQ+boFFI4B73bMStH@wlB-|8x!?#8_--ShPv0%$P zY2RvWR!G#ucg5tD`aP1&SIGgJDurEPGhqGUti4z~3@bKR$)+a^R9s1o90NMKMK*>p zmvFp3)g(CcRV&y~UjxLtiu6kCO28E5&gXXovL-yqLY&p8Gaj&|YoN`z434iCOw~2u zz&m8TbQ-Q8v*kGV0r3v78!ncA8m-0LyZ6P(1I$F4BES*^*smIHrX5|Q)qM-0-o_%= z&+JJ#P5fkl#1w`9j}ZO2r7256Sc`F^+LiZTsZ87A?!H9oXzaV{_)f)PS07k*-&JVV zv)XJP7-9AUn4UYE~-L(g$TG_Rys=Ia9f?- zoV>1y!LIsRfGT?YkXgu}V@wx>WAMCvi{HkU3)z&6zvEIoZX-h`TUDkWt|AG!5?-=% zA77cz0AwS2lqPR25Uevfcrrk9aD!>WO2V{$eHSB1uP=HEwoM!CX#MVP?kec~0e?7~ znB7JR+4N6Dzp5W-cQ+UzcqzyI)4{@teg@P*Qyq2EZsON5sDbO>o$|^H%#Y%WMN*wE zoH8=%qkj}Rzwh=r*M~#7N&`l1!j8_GNsFQeRgP{R1d+zkx`yd{=)P2T$#CqIb+W0% zzf&$ZWWI@c0W_;!C&j9)uG_P&Cqpb)CA^Hz1*8pVVoN@nzIj)twj zBoy_lud2)vqLVCfR@o{K7rVz6XcUx~3$Ck#*x?j?h4Ql_wZV zl_?;6fkiLkTy#%7pB~wn1Vh(+yBFM5K9}O9tx?a=zW#%B9XVn8t~Dj`Y}JicQs__2 zTuOCABUC!P3-)~S$ylF(vu~>IYI7*=cs~#+(Ei^nFxLyrUOD71K$Q50&)sjV#WBu| zZ@Q8WzJqaeMYvn&JM>FHmR7soG+M6%W?gJwvabr^;d$>~h1WHLA@%FP0iz2+eQ%a@ zVpR;e{B=!{D`c*C7za~cwH@8Z$Q6}VUC_3li8FCaw_R}@^1?t4^%Z6Y<>+A$Q?~&X zyNbafw_yD#Z5P)oG0px?Zza52uV4O9^~8Yo3`AJc_>2t2#o#jzA$qS0=2S8;*D2E_ z)(|nq>Jx6D2|mjD-qG%kxyIH6s3?uJ)yfC|_CP7xhAF}7J$+b-0CL#E!&qi>!^)XQ zN_^82boX;H)xfNL=PDlc5ZU^Rf{c*Xb9*O zx+0~PS^BX-g3L|*up+s&)-n<0utb76xZV0wWl+@s3nV>iV~Cs#R1*bxgFAPAnK-N@1~ynYnsvb# zRZg4b4yudB*?&2tAM2xyvzdY}HWLpK^Fh&M)+9bb9B&pY*MklW+0Q9_e5-8<7)WM! zUA%HrO<@W!RBnz{sg-0^?iX2ccArmNRE3;e=2!w)oV?GaDz^k%an9Zzz?^PgNg}kq zFMDgnlwxjZsxn%xSO6s~)_E10CvGTwm-hii=Gv@`5Tu5lxky4!!RD}J#8#zL1RL*@ zG19r9(>WP15j^ zR(5shIt2Q{MEECvJ$UtNMu!(7^(=f7vjdy}WtmBiR978k%7LpcnubaZB&vH02TT2R zSbQb3R-@qSHi0G{qJ+j)xIFykL71WM(EiVbNGgR>Qn#^*2^V2%fb^0cCuL}r91tvB z`wA6Br|>Eqz5mx_bw&!OP(lV!M36z~c|_-bRgq+xT)GM2&?swKWR_P3Cma)ZOcUOc zmu$}9An8Z4Y~vb8=BdePfMQyu?g|c0dysIh#gp*K8?WUM@7IuUJ^cwMMs4ws1p)I! zZ8$(U1cjvrph%K{oagq8f(VMJ2AK>h8=@g|Vg{&ih(-vBc~Ini!1Tzd@cJDRK|+!! zkZJJIkTgy6^f?IM(b78sqkP)f7FFk~zT zL9SLYhr&J#bZw6!y^lsC3C1_xHQmN_SO;STZ89nw1h&OE7NFvk=t@mW^13TRd?C41 zilMb(8aE;A1}y4g9_G?U4T6C}5z-nfY#*k@6LnX&`sQW1h6>~a&tXL5Xe|?P`#2%1 zu0YH?98GV-7f`Zt#wTAkAqGuxDWc0n@6?EuH#ONxFGp1nVQgAKbU_kY2Fr2^w%SF_ zRwp@nSzy)$F~dZmQ+RTa-`0k91kR6NtLMqNh1r8wBhGH@=}rXh_F+|ZSqFRkstQ0X>#v7p z>beaEg7aP7{*D`8V%8BcyWI@-@Iz=j2*k7^=g)-d!TRBHJwzxNCU-P0XOLu&Efp3P z^@GvsJI+Q#m_`kHI1YoY#D=#@_eBx@y*Y1Jg|%i(NA~p^kD1ITfY?5DiTMA7r%ojG zN={4m>*Q>|u-iJ*ck;unW%F5I{D|wIECkGEC2N4cx{_L*aHD|Vb?{PuU(sCNE?4Bw ziY6UJ+4NNjV)msSperKV1uNLEYP^%MP__Pcs(8N+yq1LL0bHg2k5!A4j)a$o{P(H- zFaOzJ3$PABghgHYZI@0kB75}l?*18fu~Pl^!~MyW8VSoz5X%9b^KAClTiD%G#n|$7 z<+SI&pO|vHj-d>D;>K+cDz1q8isjKft>OYbSh`o5p}HVTXoA92Y%eFvX_GG9fb5vq z)gkvUEQu-$DQQ!cR;Y?XyDmoxk4 ztC8SWrzpVs56O6|ufJ<0C?KTvcL#d^Uc9)o@724)@Ae|R70OjvV24?FP1J{#^d6T56G15C-$;hL{E`ZV#jq7_@d&i~TGzb`3Z{sSdHnMfdT0d_ z>=m2yg5__fWW5U`9oO>^w4)$6QnJo$}iFSe3p z-tkhmk49);QzhrXg6g8S@|v*aD>Bpa&x#=XJq5!maYll zXJ-Wz<_3`gGX$#!S2t60kZy7?nywASJom~vLS=bT!`tbE_)A4m!Po=b9rQ)_yMzb^ zL{{-#PL38+n3N5De#kER^MTN>tFUd^b}5WJxOML2yh1E&7}w97{(XgLSS4IQX7^RB zV;!@svef_>(P~rJkZZ_QA2#p$)L0WJw-r1x|C3=5iFYA&*)?IimG|$m zca|MPRen1W!|`bYW%6`QNX9q zY4#VX2YVnt>M*V%DhFNIuEO=hv2EeHn!*h1_rkI*PzwpgvTG5)mIDT3&~Wt*LsBIL;ndvrJt9xdVF3NczC`M-i1m)ZfXx)P zeV8x3^d)4DPylyLOajJ5Md4mORA*obi%pGr)6H*{UYeDZsusum3Z#SZ@s zzQ*fuy}-G2nA7nObr`)2>QO{YI{I2_h#+cugLR}UW@Sb z;a6a*LSBVQu%E5qSsic;1(`3%`L(?4xn-Uh?Dry>!$GHq%Kk5%ImJzVQt5v)nZ6E# z^Rx?;$-V1Y+SQWR4l#uDh-@SBO<76Y`{-~#Nhy6T&TH-cint>^S;f_GVydE?CB2|dh1naUbomV#A8T~~ea>W~R z;?64`$wz~%D&k^ZtZ8i~a&aS`(V%w!`&(aZE0YXGMptkZohK7VRjT|X$>@lYR7cEQjZo0DZe9P!g0&968aOh84@3h31beHJ5$}9^x zXRG`h>vq^*^>4o)(&5^3LGW1zj%gHGtZGAmz5EPUJKJmBD%}2GG5rmkf4emsm;PLJ z`Ctp>Nls)~^C;NIx&ys+%5bX(r|#Op{&uYn_P46BwjRaiwtR9VqiHIr^Pv82CG|xL zuTmBVlAJpr+TK6AAl9QeDnjDKIk5>Y%JW=f+IoM>04}Wa!YADPCib$@_98_eP8v_Z z99e6+!oy2pV!tbDvkXVF*tgN6UMvjPU>(~9>}rBO{3>;jp4diiVg)Y9x_ze%ZjVi! zjQKlf7UxlkZ86@Ums|XnG3EYS zjA(wjKk+rWA8?kqQ8&9b7*`Qf1+>&(tO z)6TPaxrXj8>XQ?7L|+YG6=>M+qH34<9YDI?%pv8;AY-j7iTcBQ@l)y%Pyyd9;XA1V z5n+=D4edP$Y;50U1-?;(y?6aKez;e6SPkYNxC`p?ASr3pO%-%Is7vYy*;Kc_>i6(= zh;MzGfiQ5E{}Uem{u+))q&NyNDZ|?R0!7226isf6;5{34@-JwOH(SazSv@B%33_%F zpjXA=eucq2Q8gdiuTm&NEQ8jXBA`ea_#PDkx|7tIUezL{K-U^la267liV@beOtuWu$$JgD2Ew)KXx*i6OX(#~&1X z9XdaMS?E_#2&eiF|4Jbb)gt*WkhGfse}tlcGVpb%3lDFoY_E!Kjt8-t?E$@H(`_<678Yt9Q6*eI&jrdRGZya1C1Y$p$o!~jm;b^A>gQI?%dYyTDE>x3Icby+dQr76z|{(wBaDGECVfwliv zT>`bg_582P0<(3NHtgzNFkdKTMK{%vSE~6}+`1?WOo5W#VP4!Aa~njmcGjN);q_HC zkrc<4Iywmzs~Vmzu*TKK0PnE|v+y$v=34X->R}SaT_D=ExB{wpxJp+z`n`P6km!HZT^9Ab!ie|AHbey!}uSXc@`to}-5h(e27YU~?7BP0lQs z-uS?nk{AZ#^su6@f0cq6kW_&&2bbujnavqnou!@`#u56ZouOqBg?{J@e{HoJ_v`xW zzoWyl>zoN`Fymd|b?JjYh)_z_z-*vgaYN73YTli_0u3xs|5 zWkg(wzdNl*<7|jolEjEeYl~)t5=Wqb!B!8ao2H$Z%_EA`=D(EuR_c|;wv@HChyEa{ z@4#RGTbRlq(d_*u?-Z3tnYxhP=9})c&2=>b4s*i<(O_)3JWuH1tD+P*46%2!t_Y0oNks$!yb(~k5LzJCQMs%r4pc%m*m0jmiZ z5?b=WT{pO@JTM5DAIYW()@wF@Z?eIFf!Kj!B2@Kf5@Yl{V>kcj(Dn()C?f#|0TLMs z_+poj&Cv3P(YE8cuPQ*$<`9?R@i%U@bt())2Zv92oa-0~tUQ0}t>%EyphZflU{erT zTcvDB#DKnKE>h;HJ|KrqKf6`kRo5TC&Vh-`oAxFy#AuggLY#(q1GjDE!{*NJ(KH#l zOWV}%R{+<>{|1fHUDe?E;={zgr+2oHeO*8uAWg`NcZoK2@xkr%0p!3njT_9PLll0$`3CJ`8ot`Gb(FLsv^_TClkh;t+vVBjC$9%NRy2!1KFDgHXCW;X+oq=Qk9>0PJeCg2cKcv|&M(&c5 zh>9uvJEL`frah-#z^>5nEzTE<;Ze5?ZOtFmgE+r*c_cif%rm_EJ3AF#%Zfh4Yr+u#o;}IAW zyoC0Fdu>oy_WrWy(;}u{9;|1ds*aYqBCCr}O_gSy(@JbxLqJu;!A&8$H~aaCtWQr4 zf`Z1W`Fjio&I5obfQ7F|@RVH{*`_O^j00ckN{Xx~GwCPvU+JI8suU^c zs9|8cCW%6;UhG$n)L`PSx;xV69S1`4cNc}vNUCOM=Uq1-LgTyWt9(*7{5%I}>}9HU zSzkgDU8YThv#`S{%WtV#u{+xHPXs`gCwCP|`i_ITG6uQH2__SPGP@ALeXNbO<;i1_ z8FUd1TZQUh6^8`&I9xlXX}(WlauU?Lu5lwiwO;_;Q#I$T-qP~`+-|e&^Bt)p)G6-L zGF)qix~ki&Ak^zB;YV6VSvQCHhIZ3 z0WEl2wkuLT$3Wo!GE+Wh7eX#g(N#4_gk+Mt4{6V3L(wubtS}zn#-W*RAxQ+V>=wB! zj$BnAKh@$<_=(6=IX{RE3!xIH4&5&g&C^#m_&t*^jRphYPOg z;GcNuV+==5{P!d%K|?bND4;lNk_QTCN5Pz@`_hbyiYc7Z)2s*MBPV)N>5>$!n0$!j zj2vS)(#gQ?Nr5Mm63#>W`Z^8+fnb2z?%rgy#-urGYm4mmw`a$g5i~>0KuA3Xhm>hL zOt1_SAfRq7US)nU3tCh!ei;JV&vi7}Pb-44L292xjd_1~)q$;H;I9*c(8Lf(Y$zeM ztAt_*2uPa2#LIvf0s^YFyyJ{AbdqrSd@O9JVcWunfPjF_hE0GTbf! zSrSJw;McGA%|Vgq9e#-w{#UBkb%l?v7ojd1+kk@lP|Ech9!4LCIb*rus-7t>??(Ss zj{y;3wXlZ`>w(6EC%9g_yLD~ExxK1HX1w*eD8I1q+8tP^J?N=B>&uWPFN_~D{j*vsZH$7MhrEHfFl46PsXwI=8u2nfiy=Q`bk z3^E8j=;Uo>Fl(2V+M?G^(#q^f20N<6CX>*L+|2fu&P*E~zje0oz%7o3r9SWS=RNq& z7rx9a(0y8suK#j?7&QZpZ>$Wo!O3Da`9W7nK_O z85zWk0^0nDnRr<&Jl>dE`dmywUoraP8xgX_9hT_nNuBfWzN0T(O*UV(ul~juf%~+$IM_aQ@At6c&K8D{l|a%$7%YNrmp(`=f(lDkZ0gDfrjq(OQB~S4%>l%|FMT)@zJ)^Ic0HrKe38nj@64?vxcXmihuGYz!kj(e?N5o(blz zT1JQqt7(?u0cI|`CadDVR%vc>ag5^K!Zq_8{V{+M?f(fOAla~)pnl6Ka_tZ69tQnQ zoE3h>2Yjsiell8Bn^kAs>H_0^>mCwK7B1K>7h1sYW;AdN%eYBl#{VT`%*; z?HV+3EFO^E;C9!z`29BwKX7mLhWe4?AE9h`G%5f>7q<91xu{dx16#afXOr5&rZK6J zYbKUsgM^$bJQkB0$i67DOJAerFb2=lBIMa1ha~v|YV%SlkE$ZYSx z{qGX#?f<3V*#)k}%ZSlRQYiJ>V9D=6&+kP`{Mr5gb1>BvHGh1?*Ovn7un-W#_W4Kq zio*HRRCNmy$1kf3wUgWYN<5~t2_xYbLo;s1vrGf&{e+=?6PMFzU(CSq?s(e1LL`vp zpbs-Bve1-Wj)<9d?t+;6$T3m8su5x2vcH}?qV=hd`>gH%6&OI^@$_rxV6R#avd6iT z<)C;*_4j-umvQ6^jbY~eD_=$FlDb^+W$6u}im^Kw0`t|*sI~`C#Mt6?NY(nmUywb+ z_BSsp{%JNX&W>EyTdapdSA=|QeRmBSgmu-HdaJy-lJ_L+FN8uJWW&Ew{f@}grB@d$ zY5Xn~(M1;pHZ*ZNEl`zH#dS8(;Oy6jEC2Z~U1roidX*-1CG1_n!lmY}stmf?iLJAR zh$EZOg+%szfFAWt)vl`2Z6zDUx~HlhG5B3ZclOoT`*odYU4J(@U0pTNZs&nDhDcK=v=`r@)O_n+DoxZ^Rhh~BLrv$dFHyy2 z`#@79Xf9N!z7U4GI|Y^Q?YhTqb|9WOOTLbTdmkyRUW=#7^{!1@wQ6})CZ?RNpgmFR z3RRWF*Y2*`p>@D(oU-UTEh-+y-MxiWiHYMzT~PN7gTHiV&5uIQsv-57?k?la^3L)V zULe&=++VWS#%^>)nCKQh=-IlCoFr?a;O*1sGwo5)Arsdn@6bT;vJ)ieD0< zE9(qWjfmY5Vo7-9;zd-7x}B5r@8CI)fx2MBzMUFf}$!QLTQJidW&0uf0pr z@8DGcS23+{32Y=&hk-|{MrJEw{K}(sf5MS{JOvY$fYSn2yYDf8`WWqO@Rid|is992 zO#C0dwrzg|VTxXx%df5$Vxv2F8vLtun)ry)lyw)PEja6Pjj}&d7R4v|q%AuWluH*PpAMvH#EOS~U8*$MbLOn{cdRXNSkuM+vS%-+}N%B~V2@mLhT z(!{?>T^Hy(#|~3hDPA~gE4A;S40Q=>45+4A)gq=g6TEwRW~-umimKpcUZbq4C;WSTg*bf*w1HChuBG7ryhmR>mMJd! z%9v+2$?K!aK0a0W>Q`Z|kxUukWK>r>i1o9&d^GR&)x7nW9Tr#2-j&ttg&$^DZ;48o zoA<++jgv^SIwP|sjpK1|X99d{B_9BSqA8nMk=@lFePWtk;-JqhtkvqzNRlK;(lskH zeUc1{qA({MBqyRsk_a9VpOYRvIB!dil={xsNQsiS?7~Yp9%W~DMTEYA>ly^6Z_g8E zAg1E1Nb?s35dO%!WVx#{NytC&aZ+0t6%&3Cdxka$bG*Sq((mOa-IAWw=#ZQ1g5m1Y z$E%k>#Q$4JyBeM)s)%l_P13{EZVa?eocB+8Kvp3GMZxRczW0kP;evQ28+ zDx`){`!cw-8G{dw^1bbEG$fs&R$kPa)?&nGU~hrGKtQuxBow9G{`JPX-7cwcC@f>$ zE&ly&HG?Mu6O{lNd3+ikt=%8){?V#iHw;~0@xnkMqwjxFJARk*^t4cS3m)WV@;Wqjp~<@a|MqlNvdb%83$EeB-0piho<}F_HMRHuuL@c3mg_ z74dED)rGYKYvoA90IPGN7P+I=tD%v1aQ(l@)?EM*T3Me3VgLCiOjoNy1oV$_F127V zM5_i8;&=`ykP06?1<@Xz`KhW(19zrf9b?`O9^onwF88SjINQ(aA63lMmtUw7z+J=e zPVQry_prs*73hKO#*6cUU;$@CTX#t(HSXFU7h?Tr&cCa3gYcyCk>&L9jbr`QkQDy< zhQ={+J3)M*Nn2Mvy-#Yh3B?({x?BplgdoEUqgZbLq`Y?!>wAMI{9NF!?<`d@P_FM% z(3#XkRGBTp><&>fR-g3*nN%Gw`a`%Nf>pkA1c=B5^R71#`2Tcjl)wQMTkj}GP?Op% zAPAEP*V1n{R}eShS0h~;(sqSMXc;&kwzz-NOrkUBE$GP{fWn{dsG1mv>{g(F) zCGVQN-<8EUNJwR9rM=rc)ej_?YFN7Efsdk_yp5URSVHtf1gqqIc8wgqgNla+=CCj* z4ClIvLEZ}b#Q4W$0P8B98)bH#FP^SQzudb+zY063DOQvr7F5{76p{3T`ndrLqPmJ_ zRS(sDvhV8ySkyQo0fCB}*gEm0&g6pPS5*vII7ht(7z5>AU>CFJK{;1NJ9Z$rs@1=K z0vGDzs#1Fr@t#bSQQbSCyS7ci4$P23>%Vt?5^aw(RbaCJ0@ICGB7C)Ml!yMpGd>$% z(|S-{zNWKFeY?J4PBb;Fs1^G8Xjjj`J8)Qh&>)0WC$4)pwvfJ|7l~~0uR-Khr4}6N zt7-*QKmV(!YCQ7&J1f_7FF2E?p~b0Lc;72o4)qe9jB2Fr^ysa3*&R!8nbnx(q53pj z-BsN5s_b}pr&sialTA3i z!Ufu_?(pn?h1PvYOLejEAUQbd#%H0bFzlg;Mr0@;x#|n*WUx9}*jLPs!v5yh5tSM~ z4%KrHmdR6p;Aj2EmB4_>)9kxN>VTC@?3JW?)z>x4%79i1MG{>>%Gkh``+tw6`EaDhpcdA zHNb*uv#+>g6Y>>cUW417`*PC1cPI|r$lUs#&=igWe-Gj%{Ci|-v5d4^r;-7$5@)+| zH27U0n}_ZSj41XMVkAkDq+57VeqVev`%02A5`sP71z$V{zskV-BCK=7hJ*8=Bvjk? zIx8<%gScv{*$0X?~aBn zMp`d*05~Q?_)!dzPLUBC7{O-soOb|p9baD(OD~42?m#J4ZO+Y?k7Hd2rc$eoR^o0b zP}g7!JSQLI$7Dz}^foZ{I@kg9pgQos9tkAtHip_&&Bp*J!Gq_wg!-9}@Cbez7$Vms z#24-i3tK!5w#3XJZz>`z>ujiCbIi}`02X{ic)B$J$j7(54|%d)enWjj*sH+nYJ_U0 z#0tiWY~pt3LVvV&M}|M^w+#r%npjxromZNJtZ;`Mt@2<(>^dy3eyu*QzM{EUOJbS1 zd*XwPHG~!)WfmnMZ)>+pn|zJFnjJ+R#PQ~$;fY( zNqOHl_DzA^V8Mn;Z4LtxPZk+q0jdmL&d>2tUhOy!CgzwpltrQXb*_2vhNpd=68PX@ z{BGkMGv_{nx85=`imxwFl|Mic&dQLMt;d}P&zHiD`|yR$^+$*QWhIat{Q3%jx$7b$ zzUvkI3PHuk!y}_bu!dgfV8dELH2=;R@O1)S_uW|dV#N6EGBhHx(qE=jbKRGM#=O4* zbI91Tu2DY^zy4p{Rxhem^ccRb|1I$9Ea)`GoF)~P%&;yxMtmH=wvV*GvWT#_RH&?}WAt4cpb`TTSi)aT zoIXWyM6m}(F-=H{FvfW`DI*~rVDi8@A=~lY@vHqNe|KYD9Jo4)N4e^z;#{+Uqz}pw zzyro#;&TvFVKMO46Z#hdw`5&DSdz5fS71&V*CjBXNn4n|%{N05Y{OW)WJ>U68m2-% z&g&sDcU@emS>k(SV)fM@0o}Pj7e=W*s8THYl_hg^SI|U&P-%U2@WB4ESA@M3Lni>C zTcQD>;KxuTLu@N++s#DNM2s^S7Z_G*^Nq@I!bxcJep$SY)V~`9o$RVC+WFxFGgee|vKR+<| zwM?-fAt5NQy~BGx1`sUD3MtxVH2O}l}a*UKaFnx<)z69E$`Icb`vY2VB5nYBqW zNv4%)p?UYX0j6o1rV}a4zpa-|(bqF|)U+ozpZ;)9Lfg-@&G7nk1S0 zr_IALKbod#nl%Xx6Cr7urfFYCO>22}nt`W#rB3Yzo*cicYG8-C)9qw(n4iV*31G=I zO_LL4Uq`WX8hDx}-}i&p!`zmeB|Dvda+42VAjWKf#kjnfjpGPr29t`Hg^#_7orjJ$ zcp9LtnuwE?jg5t#y|2H%n4}EEnzgpMuerv7p&0^6v7)lS(h~#p3R~E$~?8&h6>+;O`O^N;G8?Ef*LXKX!4LvOI=o zHfSpa9WGSP9ZDjG2ml5$c_Du!b|7XheAXU z5m|C?SxQP>Nnb@GfM*|HkD6!kt~9ytj`ooN01yE! zh(XC0pd})%3mTqog7H6W3&Xx^0*qU173M=k^C^gI?KJC!iGYG5J$!z#ab2H3-5dZ& zpGNC%0VW+@{<8o8A^z>%0Cg#C#xai?TR7Axpv1Ljn9h^MSE~7z zV?R*|tz&BflSrkJ(r00000^d*T!=#L@M^})wwP_q|jGMHPUmLZ=t zILbjil$;qTp8XYLWxu{ z*T^m7q?dH&?*ae-0A|-8{r|j@QzZ@^6NG<>?#2J^DN5D8M?LH!*YzOQK2Z1gtSwE# ztO5Aw0Jo+kq?iQn90S9j&s&B8KJ2}BP?Sy3FZwLIAi)3vlCuOQ34$OJl&pXX3P=z{5hQa446pjW->Gx!{&A{q-L-zsGd(>$Ju^Mi zJ+sR$8&B$!(cvqJI^pyxqmAa#d~Nw;)I(|y^9<*@ZIleF_0B|ZE3;RFNyMoyrmUrdMcYSix)8Z+qVL?6lmt0a@l@evzmC+qXC2L~>>fsSwgyHap_x z6NgJiEOBwMK3VLV{n%Id6NpwQzTHxzP;Z~0J9kf>?roBil2Wlgg@85b{e;il$qyEc zpT~ZzkYZ7iPo^S|*;Suh>L}p)lqz~nZRk=E)nn~GSv7WwI7n;PCtN3lxvNH0 zi2d5f>j=_D^-Q&)iETPWwRP4YD!J5QbNiz_U{#-r@>zFJB+wVxcgp09I#9KdaQ+-Q zW~;@nmlaM_XpBtMGgV>rJl$lpIhjdEv2d4BD5Zi{3G7YWVY)gTU?~`8756gsNN0lYzpCne0P( zddQNl*`Jwr^H(0*0f7i&yUi&F27wheUk9PoEq3_yVzH2 z7eo_gb{q}A*0`;CZ}HUQT>E+=^P*&+Qm!G`QE9EPRd5ZRy+UpXZcB~Yu(gh{F6hBu ze%Or+6$m}^Mb|lpo$~Vu68kQfSG^SK_L&J|?miZkNH(AtpUP9J`7ZN&w;lnB7F2>Q zGoLsQH|wQ(p_CqW_T;BwrTT~$=M%QXd4PV`o?e!+ZxY+s9kM4Qml5##@WEk^GEP*> zj8dd#ZMC$Q{hAsv_jB`e0aSH)&#(CmYdC3V7J)(TE}`s-o8_D-7_6?MY8X~$y^z?; zsM!!p$>`0_BvN{oJLOp>XZ*Q^^DYKr7aE*07vVPT=A&8+SkJST3eMTT@V@4gP-;KF zXECXD!TE~-p@R*WT2c82PWs%6_s(s(R@1iLV5jIlcRt|)LYaH(x|$m9HrYVb3*j$y zypqww+jUOqQJMGTohIJ4Sl#5lI3Su_E}=i9Y>hYoJI&WrluFE^Wb7vFj&eyzwb>dVsM;!7xA9FmmFfsHp({dT9yX1fr zXbK%76`;UMnL&NlRbzwV66fyf6a#ntDtX`@`Pv--Y_&)9iL0;T3Y+s2>7Zh!SG zzFRg1mX^2wY5f$A1Iguf>s9e<1Jh=BAH|s|+!!;Z@@*QJ=A)>=+E8K>^9(;(CA{2z zkvpcWKj+Z$D^<$l>P~2yKb)k96TN15YsTP-o#M6KIU%$}MR>ZgR)vh1VDJ=j3WXgI z(L%D>|3pDCI}*1|e)y>f-6^f^b)*y?iPOm{GK*@`$5E?iHupBG_|_X35!FFfrx=w) zO2<1~%^^}^x?_^;!Yq8^9|g2MP0pPP(^Pd5q%6|YcXu1jYe3qZQ(!N4gr zP}wP5?!Iz>kqyS*-utqHTwi)#cGxOd4{9x3!;d)=GiYiB zF7V@B*0}ndMdsWleK5_Mwt1-exfaPLm+r-6No11O8yp{7oAa7M%Fen6WoE8!wC1Pj-+oZKhgG*Tas8>6#rwXtr-Cpa zY+&G{`u2>IoN>3`nY(Q<5l*@WqWiP@WZE?=bPMYos^$eGiGkaZQwZI_dOt?a|8dp% z^jdo3{4Daqr7eUn?KCYOB=?FW_=MHo3Pzjc+XbB6bMdS&BvT>gE2n1uYlXLPqmf2k zZK;t?T5IQtFWtp@h!uf5$Cfe#?iyf)XgFwO50`7Z8QK~4*QD{tU%!2MXyj}C{gSVg zU*d}t;{+LV8z0nn6jHp;%_+Q_bJfFo(?Xnf1hV^dL zykFj)?yN54BsXzV3n5TJBv5uO{V%}%t4w%-MB+KjLkeZ-~w7VD^|xqNB$J^ z;!`SS25cz(!N_wB)mR?Srr$o7RaSH_rz??*4fJ_ULREXS*h>G0mi&tx(a} zYj+};&ctsghr7S|qLXlCsHN@fuax<1OAlvY>=(4JWGsK% z{}dN5NhCK~^L8_e`>V5W`o!N~m&v+HrOLl^oeDQ(hqgkD zp1YhPtQn`XE2p7u`LfX7{WyyaA<-hjeEQ4HPIa5DIlJIb$k5 zNUk4pv#*8=MIUiGzSh}M+U>+$0S3|cI^Z|1ThzFIWb zQG6Rat>5H#Oo62M)NjvH=S$*Pe7nc^s&shQ`{4skX!^j&Ugq@ zRbu+#;=IJ`!B+9m$_feo!@Ayb;pdNyF_|_V--RaDDODHVKfWf_g}tOn@Wt14GIQaj z7A{nuoZsAda+i}Lypm&525NUeg2p` z`iN~$L3VVj-Jj6j>bkj*M@0^kvB@XBYoi<@-0y-f^sE+e+8N0qjS z77kXG=G8^rEsMQ9#)Vtdc zqgX*@dM_*aKphv0xPb=aICD&=~ZG3Xqld%DgK*VE1``5R#>_W$v!+Lvrf*;%` z@^8qo^?nc8@5z$x6|EACm)*dL4S*%x$2!opXSS3lpy#Ctb|YISgyxBD16za`scwo@ zvP+l=OWQ#&)=60uPPMZ0D&%ux<3w2oE9HsQST~LXx-KFbgDc)su z>>l&GkDt@gWyQwgg;Sd^Z@+o^Y=2dSz0BC3DFd}IK6t6Q>_JPDXo{pyOH)gB^TVQs z;|$Nw)>;p@-=6sDNE4!fHNE8Tl~uFD|`LT z;wD(S;HD2N>rPg3hOWO!a_P_nBwz#H#DWER`^b0Qr%<$3{KCh^Z$gm%hL%}7NWi~& z0JesFR~GUa>wHX3QBIwtesY9qh9dTT-PVr8A>nk5Cw9c?5n5?B2XD-*gC1=8T&F&p zwy-Bao6bBu?c<#IsaaC$wVL_uIqjf1Z5b(R8L8Wj!3J`<6qEL90z3(20KjyuG&9VOX5-PK^D+h55xVqi@8aG}q_L1LHMi*$QoK z`oy}_&COLe7!88&-u0ANTq-FmF&8mW&A*qcHqcs~mXv%o*?Kp|{G0)sge$Q}>&nb%p^K>R96^lVeB1TQ5eb2dMD{ zvZ+&$E2C6IyfygTLk*=K!tf-LxsDX zRx9Ri0>`6`*&??jYMSu0v%QqO-z1&zkkq8?{<=-7W_d+M3!C2NA`Mjt=~)l8AOt&& zkF2s0v6OSmaj0vpho<{;e^PJDAQKe+bQ6b=3P0vs-Fo~|<3jqUH_K7)i>6|$M?PHN zR?On;@4wAaTOxWGu3C^czw#5ASLs>l8qv$ zLboij`k>N8R|I^s6PDcl2kuNZlo)a)T7PQyD?3w8Jakl$c!p_N=4f>iLa!!jt>3Uj z-L_z+tkfXR4E1>QDfQ*l^5=Vgr%U2%7qjEI=|Y=twoEjR4cAG0(cwsGG&}i~J=`bcD3@;8-{?gtfiueI=klxFJkKEy%qaKbpw4mIo6`pTNyT|HN?5nADv zWnMIe2T55A>!DP|{X_$K)J)M=o{jpQ8LdC?UJou*q0Tb>X2x4Q@gxu*!iDM0j=#&= z*OM;APJQIZYnvcQ^@yu;mhfhXmR{R>!uIK{_?J%vq417Jsu=ljg&0)|r9RV-#+jB| z^hE6t6!Q7f^(*36J>%NrKc)!Wa89~;=t8d5W{utca`SzLbiwg^LAe@t^ULc?uNAKq z>ZLZ9iB^bEa#M+y2J70!~Y%tV4xhG$rL@ zk5E^*!%F!Uagm$o1?d2*GMTatLc~N=mb)!Xg&c6PQri;H*LtwaQIV_HAZ?!M$d_(d zj293kbH}HvrfYL-+NDvEE0YIbJ0IkVdl_R6OhKEBR8Aj^~7oB~g!J`Z;GGAr1ctB7-HpVAJ@yQ50a)^(O z>u-f8<_|zntdui>E8*>y>r}R6X+^2~0Uv|Lxovrj6K;`T^4kLIAxFeg zJp7xd$wwfwquXhk_}iE9WLF~{Y<{jjtZ*!A)$N944(0q_-iCl-! zX4kl~qq2uW39y_ia&Y-*MQtTkm0jaUrY2Sa7HB<$PDFuMq03!{-LLK-W+;yey&d@| z{8jYkMVxp@tc8^-HqkO!Gb!kXV+yz;YrL3MmGSyK%J?JrRSX=^d=5|#V{=XJXM zJ|E^2r4+GwOBPCNH22tuXr)pG4E(SxX%k{&uwc6so3vYPOv7cQt1@4(l&Ki+u8_?e z;?MC*EyZe1Vo(zf?M#q6-3ZUn*#Vp9G<|;Nqq&9MT~;_s;!BTh8mS(J)GPWfu@ae8 zTPg1;P$`!b72FHXRmENmkqo`LY1`@g@&mS`r(?Erxld(WJ_IAl#u!EkM{LI2y2KJV z6t)(6-y0haB2%v?{`9_g(#oBTJo??3>_}}QZ)(|7DU*|DnXKF~;f+`tzsIbsGdFf+ zuX=ku?P9#tg}^+q7*^dGUiXtl`Mg4rEb+)JL0kTa8#P??>>P19vG&KVmsHD;X(+Wx zS>j<4Upure*8+`zOF7)hO2+NG*2Q{HxFfmaH9tQfvw3&L{}D1ir%-bylhu6kDr>#( z*;iIpkt0R$r_KH4y(?YuIq~atl51hgVf*5jop{n?1S=xg1@Fqf9slAHVzeG3k zFvvaJDq1ci)u*V0`Pl@f1zVMTCiX@#_Vs%f7oB#WfO%^;ocVDGakyWZgq|c^*sz(8gEH_dAaGWVsFA^+HmPL--_0(1;3h-Rsb8Ep4 z4=|{=K7timMIPJCSEpd9-;)hor8s?2F9wfw+0veQZ?3eQ-T7rsY-G`g39%Qi5y`P& z!yu?<3bTCTbU|6>5l1K3IT^{CysBSSTG#p1tQCh=zyJ$tDZiA%GYLyPd~&rcJR8H* z3<{S=$sSjo<-QhFNKrLKm4#}DDJiu<=L4Swt6a_V!}I#U;_*5@NlC|mso=bp9YX$a zi@LeYxF-2X2a)Wo+gr1xX1k$Gm2k~e;fgG(;&3OjycSqz1W(3Orxl3jt&ZV*F@jCE zyWn}8`qQ!vnKC)fT4fmlEK??(U56^%>^k=FoqY$L4)!?v&+{{j9(R?1l~tafh_P6I zH3X)q>`jvXK=+flbary}{+znDjirXSJb74Oy)3;fW2n0MkvK6FyCgF9 zYFLCrHo82x)6txksY8_^fJLG0(Dr-uFf0XDNDfg%2`+qTiH$IV9}y#nMNGc#Jys`?1E z=G(bK(qhw?Q^I%03vP^AlOB+-joEG%pTk}Y@3F5JbjJj~ci1vgdJ#+85B}tcEtqfB zK;_GNn8iN-WebjIp2X)?W!*c>9}V}5Z%U6)6H!0PTozzBzcz+`J=SgIc!d~F7!!8o z&E=dm+B*kZw|B(%!ooJwa+`LslY{tfTp8eq{}3^t9agxT=rm$OG&P;Zg=6b|rD=#F z1?=@OUT3Y4PyG~ARh+86_GV`!xktnlV8==JKC%hR&tG`UpsX_^MEvP>vphi#!M7e| z^AXD`v`cDB0D^YYU-29~AzG}0;TwK-sL>E51Qp>hGF%mkaMBY^Svf0NV)sCb`w>w) zrRM84+4+fcP{(wMuW|S+%%*N(5CuVa{n^Xf&NZJCXlmC*p$A*p(wefYtVjh#{0DY2 zDzWulluy2;R-S;6Sd7kTf_C9m*gbcyPb}XnWG%Q?7BLwc8(S07Q5*Gfi1dR(`I=2! zY%G!U_V78Z*UiK8$Q-Q8W{+|mweWSMTVpDCaAE?Jx6LIVS0dljVp*@-qraeCw(~r; zTlTUAWp}=2O_Ofd?&rzw3vL&LLTbV}Ln*c`ZR zeDU*&umEEnDVE}r=GfEnvGk6Eg*HS2azu8~oi1)nmFZaRZ>~Vf6x<;<+cCmIJ1nM}BxFw^+%7c$NjP-bwEm#@a)&@%}}1kEM|hTl0Jut}<^ zUy(#r6&UOBE#Fg@v^?EZ%s(Z1OUhTjluV%h^HyKGT1~sCMB{VW^7z|Jiz#Pk8|NN4 ztp`0AnR3R=E&6Em)|1ZSwNLt;-MSp{^kK?nqz<-ez|6B%i`60fK!*X+vZZJ1nEhfV z|F_)^OvKNR^TOY7UiH7he{c`+It~1w5mtIwbePe+r*l-c$wjpgPj_Rvh|&8`1+A`{3L6>4*Jyw z|8`>%_*-1z1pJ|C(TK+EriR$g6FFaI2$o7lI2oR-8*`!WEa`?Ctd{fk&DQM`#FQ>3 zE>Gq<%fGrwGYBEM>N9KX$uT$jqJwNlJ`iG?8mWY-D^v1os_8K)mo)ghg}5I0qC?SdLz8S%b*~jHdHx{;9^B{%^4ZeSJ#&CP4n_FN);<98Rl;eD z%0U(#Y%H|YHJ64OZT5W|uf6f8WV`!YlWo_mTVoyN#NCN$!f27KDGbglL7Jcu1I+iVeP<;PA~T&aixz04mM1YNlY$-=S~pT;R7G#4b!sUOjl0 zR{Vf0gEBcWn<%MR;C_#ZY4sP;assMP-A~8KzveQ{@mzks-ey)BB&zSS)o_rs!T0O#QY;1qP+Z&wf zlj1sf44d&Keu}z#Ydbth{`>(Zc}b-UKCSQR{u=9L#whv~r#GdcStw7&ejZt$>ypvy z9!zOQ?eNk`?PuiNbQf<-SIkV*)!V#(nWQ&t$lWxvH{aHeg`56hZf$pYHsJ+U)K~B> z2xEbIR{4vy1RuWRIL0O`HAOLm1UeddZh^V=27==9WrW~l9(;qxWcq=F8uL3d)&OPC zIA?cNZ7B8piSw>;>RO!S=jxUE+FuE>YTvTeDbkM=ry|8%kDI%V4ZYKjjEdWy+WPQq zd2emLD!L@-yiH%QSop%k7#g9F-^nV><`T8jm+O(kHCCl-aI969e)}PwnrOGw#_J6c!rB~ zdMNlrNO!Pzn75HrW_UhBmZ`peHXzCA2S~Mo4~=l1787F;JC={{m}xOhM+3fz+$j@_ z=G27_>&<3pCW!GC(sd-vnU-j$M6nxJ@V)t6 z-R{WlZ{|B;(p^9AEzGjq1akN##mJeohLre-Ly4K%!Mlz8()?VnwAd-G4KP1@{XFoA zSVWTAEzXyN$0kQ!dDYp14+}Ks-OtZ`{V1m?ui@U^du7?VB_%};5keBlS>bU|>+Rc> zmzs*pWA+=O6R(v;LJ&`M!ec4SdG|1n^GG>!i{OAT%y}PY9lv4)m{*vGlB2bqO9vKH zo8nnbEf}~e^`aM{SCt_bz>$zdot6+|7Do_E5p#;N3Xq?45Cy|VCZ;Y)AP8YIA}C2j z(;#{{9P1drARiq!3;k(M=fOm5d?RLdg5jWe8sz@`e#_@qOI=&Dg~o%|-%fY0uEc`( zi1u%;_KqcOkG1Z+sb6}0x@r93!mEyOyvUS}rM|)b8n?`+Um}Zl5IAz}&_?A$*Sfme z`i6%O?p?f;x5HAn#HhV$TNl5dTN*kX1J}0{PD#EIf!k1Zrrul_Q!ESE=^!D< z?J``!%>u(utEZ}c!Knb!nIvoVHQ<&zWoB(L`AXeD?m4}sQk-q7iA<&howe>W5n(=} zaD7oUcZ-J^cPJMz?KWdrEsJfhyv>bvI#Y*TD)KMzI&CM)n6i97) zD_-5(T=$q>^wp%yZW%$YTr|N~7)$={BY8ry`zbB&@3F>&_7E9J^USwz(UJ!@w!Aw# z`=TQ{;TDUBM9moe)?k=b52Q4&@^Lhrw)|OVE2&j{&a;iVv{5em2+o42H2V9Fr$^{C$qQ;y|-Xd>uxK{n}Y*=gN|C(1#LRxfy;2Zq22DR7+$*gXIQD*5lFl2 zw$hrYrrxXgk$HDg!|Rm0%+MxI__(a57;ctE^@_Y$nd3odI~#K>Qa%!&+1C6Q(K$Zk?6Q7`Mopjwxebv$z%7W$(Fgm?;pf#t`a4KDxu>#Er-yFvC%Qs%_U~|uctZU=NFF6WZ^!$e}tV(iL zjD8fVz~IPG$TZwT+Zaj+en>DyLF8;iu}sx0m#X6>1J#0uX;xp&uq+fBTd2jG5hLxQ zJmgO}213S8dgo^!nmK(&x@M2D7FcQTY7<(hcc~pbN2{pZRV}b&aNvVV9?-A)_v(V$fC}LC;f~jW7k>tIDH6h`+`qDZMj$6-(*_jSac~9^5)A_p?)< z3;(xIJ8+1A^2ONDTinM_Heb!;-u&`}x>Bz1+vZ4F&+x>kn{pY}^!?nV&jnTW5^@%D zkE4j{9<3LLPo~@|zf{RlUh2EGPw=9eHKn=WUQhG<=4|5YJ!zwe8HKAa!%H=8m46Ju z3YEF~#M{&M_@sazw(6;yX?(2GDcq*cG$#~D=~?|PcsdM`7mEgwanOC}Vxw^+9 z>-^t7E05HxGNXm$UTS;F`4j}{h1#o2&+!>~dZgw;DBYGbnhHvLWOjO$yjavO-u8aF zc(aCiy96C&hN@z3%mZF2SQg^wGoMB}pfy~idlB5H#Oxt_LP${bgm6)&CRG+i^=T=3 z)bV3ZiX_yqSnaE-oOOJWi4o-d%u5Sl&kT36JYNv;EzZuz;_aa}13q{;zUzBFtN~wP zXq>n{Z7_{|gRbBElqoMbtVNY|sBP{QqewY<86j^*3-uf<74*z6+d+y+}i5@pmo@g0enD(L+>E%Iw zdQW!>PoayN(deL9e5=dpS4(u8WSdN<&lL9=l+PF?UC_Om-?hxn?X#85FO_CW1(#1F zqNXBtmX?(vOvUbBJvptak70fsMaN2Y%nL^l%KT>W@FGqnmIW7)u|WjuaSEIW+8Y$! z`ysnez3%3$rwgPRbiXri5Iv7|d!e8VcOmyoCv2z>M_gR{Tj$lywzC6f8$3w?SnLBlSd694;;6}1#*_9IT1QshR zIp`2Y6gzp@t*#KXajEH+BH4Ux*>lQ!ly*01btYfGoKA!|so{RxmyL?D<01s@SlQOZ zFsn5|R1kz~in%ny9=edj?C_pJL3uWB)D}M~2OBEi!X9AL)-S=ueHmY_LL;MVfFMnT8=D>~_-DbIgsrWG-iDAfy4&t8kb=K=LMoVnj1Bz-&OH=k>{LJy9tv! z&ry;3I=_s@+UM3Clb&b7*`oE4wKO;Is*5P_Fl1k12+sz3@rC%83(@0nOUH2Be#GIEYd<8l1QY#tGlF=wQDBD2#%pK zB!7Wd;cQ5VC&Qo{sorTn2IQAkJMYx56w~-Ilh$A1_t=h2sc7q+E3-9($ZqUl$A85e zDGt2wMdvG(Wq1OCgN)7mmNi@2f*tcICTLuANa%IOOKa*exXF+PHfB`0n}zm09$DKI zPtdbGRNLK`&hfmmOC2yM{PTGEo^J3i*I+5_Ia0=o1S>01uHa`34_`|?tG0|tq3*ps zITpAE6J#O7FW-fH{OoX3x#zId0|=Hfa@?rni0s}?V0VNPk>s5Ud|p5@d`tbEi6*-< zgd#knl3$i38+Vbc+xb-8NnVPnE;1pdoP3UmV|X21$0*y^i9V7*p5p2%4jjPdz)!nF zhqi|eu7v)dzhDp@^!}_1gFwU#0g?Zr=@| z9w$)4{fJKik_X!A9X$&`xWCmg1a&Z=)<3+$kN{|301|>u9`S2KG=N_d@Hqf2U5_;P z1Uet~+yQa~?LhxQLqbJBcOgjf=pR2M4Ein%{z0HWhht|5WMO`3{?Dj^5cp`s^+D<3 z*m#2$ZT{#B1XUhR$^ZZQ|G)@50GkGx^_4N`(aHZB_3kF@@)HaCNIkX{f5@&2j>(+w*cn~n(RdLhbBqc`tIAe7pIlj z5m6&Bkl;m)Kye86`NQ|^DZA%cjuKzIdG24|)cgPv%$IghO$+VqZR3De@Cc9xIe%|YjFY?1`NL=B04E=9 zjE5ay06A5(kCunMuPa*3#@*f(eaLV~J7kczx5s>Ef()H7KE5`tfa-&`J6wc6De|ta z9)}(NnODJ}4|f(lH9fSCp^dBWkw6K!+%FV8)ZLwY zoNQdb7eN@H1|a|T%6^Q1v;ls9m4LkYU$h4xAMh8g1LVX1qP+n5*uQAwAfNOXZ3g7i z|DyfWVYL+j?E@UX2-*-39RMGI41hL(HNfG^{YM(|BTe{`rvFF_f26+NXpD%kfW50L z4J$gvXvSpvs#2o(T2Sr~+?3WIdiVUW2w40-@iV+wd%>VrmN3Z69q0jM1!@2qzy~1DnFIzk16iW} zFsKNm0|1Q_FsPmu1|fm&I5a>nV&LfjA2y)rQ^6n%c#Z(6JxKdOc{(W!%BF@v(WhWg zu>_C}p7rU0UdLci;$aHpbe@Jm22wDn2k=}0DS+r5&-NO0-^-q0+0pJ z18@fj2e<~12T%vl1Mm`H835`*Km-7c0D=Ig0nPxJ19$<116&6v0;mJ%1Q-E$3$OyP z2SC(|fM@|u07wF80+<810z?300+a!?0lWfO0N4kh=tDqk0Ac{j0A>IffJ*@B0EGaJ z0Q~@O09FCu{h%HIJAep)I)E{N9e^7^7(gmO1waSDFu*4OEU>qJ*eGOhyCIg81_oL=Q1Qj1UvV3>}A%5DWMtHa3VI z;($0IE{GdC0r5b*5Ff-3A|yfJs)RsHBLdw&&1gZk5f{0ZeM1UF~p3(wQ-#JJd(m9Gu^+DWc2pK`fkO^c8nL*}Yf3ScoL9A*G z;vZWO)!Bmx?EF#0*-m^dwRMCiYR^0C_37>gFQ+i&7?#{-s5jhO|-j%kK@0oerVVKB>ubo|EVwfe-D$ox4fN?li#0ese9|WI@vq9 zJN(g_riY!&9|Ub1;6?tVxY`8%LC{6JdHA7~^tAtjs$%>fL`^66KO6ZjK`+qV?ho!C zMj(7-5`UHa&+`mo1QDhG92-#b-}C%?!C&JHivI4|A?e@K45)u~7Eu1xQ$YKlRQq@L z!Tg~A2ZeoXFg|~dh>wTo9|QwWdmEo0GpCHfcwoTVQ1r0>K~XV2499FRHg0GiH0H-b zQ8CswZ05gf&4M{DqC@u}F@`FQ*kctrWLzlU0A8+_OF z@Y%!tyweX8{FT-A!Te%S((~|jw?Aj=d>A4AZ07gj2erOu|5;>!q%3dzx9))Y2a6%- z_phA*6dHQC`nvrXp2O(zduw2s9F8^G{(Dx-*W1bNpDrI|H9c&8l>W9@v|W82oZOY& zZERhC$ox+Er|$RsA6k7U{Uc8o?1C8kf2w@XgDSrdz+c3F`uMBhKS`dxKYI8Z8=##9 z7V*8S-|7F1#P>Xy|9>|Qi0bZt2|OCM?~?Rv+&o>;iXc}1X^`J3|8(qo9(3%-KK^^X zf2cpq^cV9#8}KjEKVAJ!`e!V^=MUBYwQc_*{as7%*J1+vB1(VQ^bzGxn+Bxc?f6&r zmmLGj?}G-i|6!ki`nw7KK7RkGb9CVOVqvf)@T zEG#nfOil_eBTddaF#>l>h?5RQ{7WksA!t9~NFBHV0*4aIKu?GSMT7$~ctqIx=l~mU zAu<%nVIG$VSIxuM+sDIQh#W&LDtcf%g+x)pha@-=FCYondAI?xJsPR! z#7I|C0qy^gpto zB4Ihd4+#t#f=9xxg6V_BV@1Lupq!$@M*&oUt8ga9Q1a8A!#(IrdhfU{WYAI#$D3g4ho=$wAb$F~(X228{PaW6K zOvquy+4{gG_xcLvv^33y^##+pM!e&LFJfo(B(sRJ8e%*L=nIWr8goJyy85*uweKxN zpD_ATaQ5xm6rY@K&9Q~g4l{TAQ8~f^SJUx**-g>hrpdT>+nff-`X9~fF`RPGU}4fz zx+7(3Ym4H>PohlACC~nfCHsc9h0ry_@k;vRyvU`Rvf(T@(X$DdX z@Cjq_IJ!^y8Z2Z>LiDE0~pxTcqnl2hD7; zFHgPNEcw(}wzf)Uz_1d}>&FK>!4OZR2aDWF!^!Y}K7BA!<*>GMYfmgszake4*gq^c z5*7nyBl{3Qt%P4z>Phn=^l_fJtM9bk@3NW>YG8VU~w$033UENhe$4$=4ZU4(+c;V={* zisz>wEEo;*p&)OdlfS?JPdS1ZwC7<2?|}(KQ67rqKoFq_epZ6RQCf$@;|LX$5=tRk zE?efGj$vGXY4d;BF^nsU=};UAf(Ahama$f168I@ff6D9rvRBg7SBiO#);|*|40eD( zz_D<{e_t$M|A0qgf%}GcUx_C6X!ox~hOK<%uja3iI+sJwFJg?UX6KL=mKhNf>~Y*4 zJ+sfFL8Y*0MrvPv^%C}DUhV?1%UaXjv}t+dsBRW`z(qM|W;eW}`!-2Lr_%=Pbde4B zZHxH!V=K?L(oSxN4-OJUv3$@(I}&`xRuxlieP5+uY;R1a1~tVzCBK_%vefC#aBnKu zWlMN7VZPM4c)V`QHnKxuIZQn|&Sw9CLG(opwGC#S`lbsCZ+Z&i8~X1@t_alI7RBo! zdZ#0Oh^?+i_J3RyZvmgeq-zdVPlj%^k>7N^U3uzEYp1I=+dgCSLq?O>LYx-OrODx! zm%r}Gs6AM@`z%$F(Zhj66W_)mfxZ7cv&dpUS zT!JVoP`xduU;bG|nQtV_Vd|lI%$DP~YSgzaY9Hs%%)@WUIJq6Puiv*VDVL2od)#@F zBOHE%Q01g(@~+i{K$;M&cl}P&da%jIfPTaKMeDm6k|wkd8t+-!QW@v7mEdkIDOwh~ zDd9Jl3`-+Mu8_obtpx>&J+c(NuU5_|)3GjYv5xfZOreLepULn=eliq{qRhihMAIG9#NlxM9Q>12TPdKG$t_(y+xA+)#^P2?uOEh+Qk-Rx8 znjKoYV$AhKs=HCI5x5)-a5<*mT@IeTh|W-#L>As(rh*FjZA1S*ay4L?1KR|yhV-Ya z@xa&|o@|ALP=bdga3b!X9!J;1!w0DdR<_f5C%Ypiq`a?><53WQ=y49+jgUA>Tv${X zB`PX%=x#)We#`z}bcB&utiKP{kqg2i1uh7S0PAphWkpeX7gu(=vGhz_4vO)4;We3< zhRK|1j1{eU9S-jlRL=9se8fzuy?DnhU@dD~hqFlf_CR%tk<5-{9K$tU!%q%9bA<0n zBojKtz9vY&=2(E0(kg@+)5uM3jc_Y5rP`xxPT7A+8}rr-4Q9h~Tk~BqkoG9%@2F_; zDYe*luG?KS4_qKsyj81L;#<7p!;b<`}|}f)WAY%^Nu7@}fN{%FQ>s;^>YOHXIa{JIiHIzW${B7S`|u zG5SL2t*C^hk=auTX2ao9wfyCStp{zVmmjmYC|MWy_l-!Wo75;S7F&n*J)RZ(ytF=y z97z*(w?MdHlMfChC*X4_EuRw;Qn}!B4BPf&-1|i~&-9rA!QpsHI+g3_S!3@ZO=+$m zR@wH=T!Z?pxtPe0%FIvPPlZ&SeOTi7?WWzxHTkBZ?=CQ62Nkh-6nimI9`452C^$&| z@QAMw__#UiL7}>O6v?S865$-g`6ejTPtO57B0Gxp|G!aPPSI$dIMh?ZYy^MTxRsSMa-B1+n*d4Aot&55J1IQI?#R($? zsjkY@jh5cUT(uks z21l{1+KtcNnsyTKWjfnq!@Pb^Q~E7*Nqxflm)_@&@CS*WZtMAB;6t_+c2!o z8{Qt>6=+Ihx$hS>cx@X;d!P#ZTFU-J8L7kaX6WQAPqUx~$J+a6&eLA~u=>I1wbOo+ z<@88G7G+~i;{}h?>S5C$df|u%Sp9}JlVSxNb6@1;N|vCT|(sK#Eh#+ z7n|)|Q@?<|#-1gd=jm%^4KJk^zA{3#=*uVam)WO-m@bNj<}i3Q=jZu!fn)%X4LFsIPGzb_TwN)VB-a9OJD zq&XqCdLGMtFDsZ6Y93EbZCUrS<)+;^VyEhzk{Pa-lR2D>mgn$29TZ#VUg>DOBS%I| zm@iWB^(DOFGHl$~+K^QqqZFKKSV84o3Lv85NRirdA2@mYeM0qyRe z8HjpCWvUair}ebOQOB=fcDbrg)N`SRXtu{4mn(&iebyB%f(s@`1xs1GKMf1zXmak* zKwsqCzCGx^;Wj8rqPsVl7;$mwX}2S7G(Oi$9Rf1?yMr`c8zW@YU8{tyW@OVZ3}lw1t^hL^EEj4&lS|}hLi{O$R>MvDEY;Pqp%e#J&UD~#1C-eEsx)2UO{Ws=cts7Co z$GBZMUWf~y^U`HKmSj6TDF58L>}jB@z!W+nzsch3q&EveRrwX&jIRY>1{I_Cvj=RJ zFqK5@TiV3;z6!Z#y$p)Uzd?L6LXsP{f0A=Hkft9UDSuyvrYCjRDln_}Aw{H0qAdMJ zagy|?Pm{bYqxP9`qJ9p-h?jg{d0yO&B;iFxl5qW+TW}B%iX@>0G|FEydU!`bf&e54 z3kDY=MiJuRTSu$G&~OA6u9E;#j{%nl$g^l4e-H4*z(1omO733_dTR2*V&X`BCpR>>6ms)Cyf-*JiJ>t_ex#~M zb|k@NR3x?ph%%8sE;fR(tA^Dbb(Fq!#|_>(cAMgNyFa|xh-m&(X<8KZccn?drKr=P zY(8)^VJ9H;kGek#kbkOs3MFw^laNw~+wKGsI6DdCPtNZmfQl*}7^KbjcryrXj|A^0 zAU)h&1BE0|;)iwNl!8C2APwBX+Z4bXx+4E~G3$?bRY(Z5cli1quY$=D77>#alQc#7 z|Jl9&w{yac;{2}Y@&E0dD9VF#_`kzd*kQN|1K}zRyz^>u+r;49?F5VkeMHWZ!CED( zOvbv}wz5VJRQ?-J38=H#v#n zYd9a|LjoCldde6cy-dBfwz}fFS$0EGAgqn+L4f3wi}#k7D`FD+uXMRB4yMP6HKo}C_EufC}<9h*VF-nt+{HTt$I zeB#>5ep9j$#{X+yVedZv`t_47sj<#aCcjo`4EN9DU$d&c7$_DWPPEyz+S*R(9O>F=mNve(;LO{ ziwO&LjQ&5_FrGFjfuC$36a;}Fiuq?A1&gNm5xap41R&b}Q1p@Mf&fnt#gF36K9S88 z&G84*_x62%nlnEJM0ZEA-GAI#;Gwt=J4ucJw|05JR)vm%d(NYULH29S^MjL_1i#2{ z7ZMeAqt9~BUcyWjG|8`>$dL#O_qF{a;;r-Fc2ZN#(xVu8yof98hdYpld+e``09@z6 zAm7DG{t?k*=EBPRB-6v^@&o?Y4(4Bfb@z_{=Y=O4JH9XP7k%cSx%OG?mqj6!il-@rvCWX|jV=82WBMM>zcLfuPd<9l%l!My1pRAVIex}(u5Foo!e>IVhoyt! zk-OLOI%n8yoiY8zO1ABsC;NlL9Vh5Nl=Jnwb4s8h$0_f_wxd51V}ic=ear6s?p3w# z^Vz@5*KdAfUcvu3_&ZnWn`5PVtI}FoW^Vt%7XI)U-?ta*Z@rlBEUU|BH*BN&Eg^bE9N{+r5W#@pEEuc=ixuFqo zAQ)EY8Ce<_8vz9%h2Fr|L%r5n+ibAfz&%3hCFYVR6jQw)Ox}Nkp^eU~|x13x068kortx_r)KctHSZBKA^ zsBu{R{N=1%>R!OJIX=3dL$=5xJk@tSla0goFL#YBCfh&NS@t9>de|m4rWwlM!4#5$X zeL;q7zEhZ8kDRk%ezTq7lap>ghHd)Lf~%xh7ufmKD+iZy;Fb%x3@y$`1hzhOONxQgiQpm(H1H&=3hHMg zkG*oB7U#gx&~jK23M^8y4KfjfyTBq9Jh%%S+XY$*8Yo7$)xa927dSSJ67Nt1FTHc~g7=epZw|VP7>{t}P zXr{;c73$uKXE*I!R#cFz|2R~$+S1MMd0i@7ME9QXu1UNcHw1Q>sr=%q{%w6ZX}{ML z(PvG!yFzmRYy3+;Uugf#nDgeMNP#bMUjI_h+`E$fI7qXU!ApDTnbWghtn~f9MLcqn zG@%FJWm|74Hd`h&#`IdWg(> zy8j---tvtzM2bXI?jIM_k!P?!>@9LEUFM7&+u{lFF(KV{kBy_7_>XRHWAZDU|1!4IS-@m}?wt+d4=}h{D zzy_rOaJ-2{;Yi83GKN|vOF!PFPwv%-9BcUbsEN_$-?!lRvD@YEC;kBSbfA43U?yq; zE=Bydsp{8*{+{@&K7SJyeliSswEF3{HC4`@rM>r0nTLK>`w@J1e>Ja%VzHO*=}Rqw z7HiY%yt_MipK;ahRakR&VN+t|>bJHl*Phkz<|zx5)A|zX|2pc-O@+9l_g{%A?p@LP z!D!vvz1K@TPS{SqzAD>xpVET%!~D9pBMMA2XKpzAIKKX1Lgwd3{c^ISgj{jitFsY9fBI4bq=uSJwBsR UA#rm0(Y@T-Qn~jZg4dt|0Ix4w-~a#s diff --git a/basscd.dll b/basscd.dll index a67d67f0bd16d6164626c9c340d98bf861f11b40..6b5c44e13d72c66b86066936d9a31c7893229d27 100644 GIT binary patch literal 130 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

j=f^29yD~kaI=Up4PoUX= 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 diff --git a/bassmix.dll b/bassmix.dll index e4138235197459d518bcccd6c8a345dbf51d2990..df14384df9c1f28ab6aa530461824a55e960245e 100644 GIT binary patch literal 130 zcmWN`yAi`63;@ucDOeyz7|h4pfFuHUN$>^iBGbp!E8fN5(fUW$Igha`^=$L;Dr32= zXI`+s)i@Z{rA2QfM@{SIb}Yp(p@x_dNC%fwASwh6@ZJqaCv$q<(b|F!w%wUX< O8#poAkEK~5fcOI*@F)HN literal 32080 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 Bm0SP- diff --git a/cnc-ddraw config.exe b/cnc-ddraw config.exe new file mode 100644 index 0000000..29401b1 --- /dev/null +++ b/cnc-ddraw config.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac706afd1807feafca1ae2ceca718013db5148e66e0c2328879aa6ec3b0b9fc2 +size 4622336 diff --git a/ddraw.dll b/ddraw.dll new file mode 100644 index 0000000..d674d53 --- /dev/null +++ b/ddraw.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f71bf13e02503f08b1604cfe8b906656417435586188c9b5f1865f55749dd639 +size 361984 diff --git a/ddraw.ini b/ddraw.ini new file mode 100644 index 0000000..ba108c2 --- /dev/null +++ b/ddraw.ini @@ -0,0 +1,906 @@ +; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw + +[ddraw] +; ### Optional settings ### +; Use the following settings to adjust the look and feel to your liking + + +; Stretch to custom resolution, 0 = defaults to the size game requests +width=0 +height=0 + +; Override the width/height settings shown above and always stretch to fullscreen +; Note: Can be combined with 'windowed=true' to get windowed-fullscreen aka borderless mode +fullscreen=true + +; Run in windowed mode rather than going fullscreen +windowed=true + +; Maintain aspect ratio +maintas=false + +; Windowboxing / Integer Scaling +boxing=false + +; Real rendering rate, -1 = screen rate, 0 = unlimited, n = cap +; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks=' +maxfps=-1 + +; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl*/direct3d9*') +; Note: vsync=true can fix tearing but it will cause input lag +vsync=false + +; Automatic mouse sensitivity scaling +; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window +adjmouse=false + +; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders +; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV +; You can specify a full path to a .glsl shader file here or use one of the values listed below +; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2 +shader=Shaders\interpolation\catmull-rom-bilinear.glsl + +; Window position, -32000 = center to screen +posX=-32000 +posY=-32000 + +; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi) +renderer=opengl + +; Developer mode (don't lock the cursor) +devmode=false + +; Show window borders in windowed mode +border=true + +; Save window position/size/state on game exit and restore it automatically on next game start +; Possible values: 0 = disabled, 1 = save to global 'ddraw' section, 2 = save to game specific section +savesettings=1 + +; Should the window be resizable by the user in windowed mode? +resizable=true + +; Upscaling filter for the direct3d9* renderers +; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games) +d3d9_filter=2 + +; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme) +vhack=false + +; Where should screenshots be saved +screenshotdir=.\Screenshots\ + +; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes +toggle_borderless=true + +; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes +toggle_upscaled=false + + + +; ### Compatibility settings ### +; Use the following settings in case there are any issues with the game + + +; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab +noactivateapp=false + +; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed +; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations +; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed) +maxgameticks=-1 + +; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS +; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens) +minfps=0 + +; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers +; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible +nonexclusive=false + +; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact +; Note: Disable this if the game is not running smooth or there are sound issues +singlecpu=false + +; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list +; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list +; Note: Set this to 1 if the game is crashing on startup +resolutions=0 + +; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide +; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though) +fixchilds=2 + +; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled +hook_peekmessage=false +hook_getmessage=false + + +; Undocumented settings - You may or may not change these (You should rather focus on the settings above) +releasealt=false +game_handles_close=true +fixnotresponding=false +hook=4 +guard_lines=200 +max_resolutions=32 +limit_bltfast=false +lock_surfaces=false +allow_wmactivate=false +flipclear=false +fixmousehook=false +rgb555=false +no_dinput_hook=false +refresh_rate=0 +anti_aliased_fonts_min_size=13 +custom_width=0 +custom_height=0 +min_font_size=0 +direct3d_passthrough=false + + + +; ### Hotkeys ### +; Use the following settings to configure your hotkeys, 0x00 = disabled +; Virtual-Key Codes: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes + + +; Switch between windowed and fullscreen mode = [Alt] + ??? +keytogglefullscreen=0x0D + +; Maximize window = [Alt] + ??? +keytogglemaximize=0x22 + +; Unlock cursor 1 = [Ctrl] + ??? +keyunlockcursor1=0x09 + +; Unlock cursor 2 = [Right Alt] + ??? +keyunlockcursor2=0xA3 + +; Screenshot +keyscreenshot=0x2C + + + +; ### Config program settings ### +; The following settings are for cnc-ddraw config.exe + + +; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian +configlang=auto + +; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia +configtheme=Cobalt XEMedia + +; Hide the 'Compatibility Settings' tab in cnc-ddraw config +hide_compat_tab=false + +; Allow the users to 'Restore default settings' via cnc-ddraw config +allow_reset=false + + + +; ### Game specific settings ### +; The following settings override all settings shown above, section name = executable name + + +; Atrox +[Atrox] +fixchilds=0 +allow_wmactivate=true + +; Atomic Bomberman +[BM] +maxgameticks=60 + +; Age of Empires +[empires] +nonexclusive=true +adjmouse=true +resolutions=2 + +; Age of Empires: The Rise of Rome +[empiresx] +nonexclusive=true +adjmouse=true +resolutions=2 + +; Age of Empires II +[EMPIRES2] +nonexclusive=true +adjmouse=true + +; Age of Empires II: The Conquerors +[age2_x1] +nonexclusive=true +adjmouse=true + +; American Conquest / Cossacks +[DMCR] +resolutions=2 +guard_lines=300 +minfps=-2 + +; Age of Wonders 2 +[AoW2] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders 2 +[AoW2Compat] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders 2 Config Tool +[aow2Setup] +resolutions=2 + +; Age of Wonders: Shadow Magic +[AoWSM] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders: Shadow Magic +[AoWSMCompat] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders: Shadow Magic Config Tool +[AoWSMSetup] +resolutions=2 + +; Anstoss 3 +[anstoss3] +renderer=gdi +adjmouse=true + +; Anno 1602 +[1602] +adjmouse=true + +; Alien Nations +[AN] +adjmouse=true + +; Atlantis +[ATLANTIS] +renderer=opengl +maxgameticks=60 + +; Airline Tycoon Deluxe +[AT] +fixchilds=0 + +; Baldur's Gate II +; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe +[BGMain] +resolutions=2 + +; BALDR FORCE EXE +[BaldrForce] +noactivateapp=true + +; Blade & Sword +[comeon] +maxgameticks=60 +fixchilds=3 + +; Blood II - The Chosen / Shogo - Mobile Armor Division +[Client] +checkfile=.\SOUND.REZ +noactivateapp=true + +; Carmageddon +[CARMA95] +noactivateapp=true +flipclear=true + +; Carmageddon +[CARM95] +noactivateapp=true +flipclear=true + +; Carmageddon 2 +[Carma2_SW] +noactivateapp=true + +; Captain Claw +[claw] +adjmouse=true +noactivateapp=true +nonexclusive=true + +; Command & Conquer: Sole Survivor +[SOLE] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer Gold - CnCNet +[cnc95] +maxfps=125 + +; Command & Conquer Gold +[C&C95] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert - CnCNet +[ra95-spawn] +maxfps=125 + +; Command & Conquer: Red Alert +[ra95] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert +[ra95_Mod-Launcher] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert +[ra95p] +maxfps=60 +minfps=-1 + +; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2 +[game] +checkfile=.\blowfish.dll +tshack=true +noactivateapp=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Tiberian Sun Demo +[SUN] +noactivateapp=true +tshack=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Tiberian Sun - CnCNet +[ts-spawn] +noactivateapp=true +tshack=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2 - XWIS +[ra2] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2 - XWIS +[Red Alert 2] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge +[gamemd] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe? +[ra2md] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet +[gamemd-spawn] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS +[Yuri's Revenge] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Commandos +[comandos] +maxgameticks=-1 + +; Commandos +[comandos_w10] +maxgameticks=-1 + +; Caesar III +[c3] +nonexclusive=true +adjmouse=true + +; Chris Sawyer's Locomotion +[LOCO] +adjmouse=true + +; Cultures 2 +[Cultures2] +adjmouse=true + +; Cultures 2 MP +[Cultures2MP] +adjmouse=true + +; Close Combat 2: A Bridge Too Far +[cc2] +adjmouse=true +nonexclusive=true + +; Close Combat 3: The Russian Front +[cc3] +adjmouse=true +nonexclusive=true + +; Close Combat 4: The Battle of the Bulge +[cc4] +adjmouse=true +nonexclusive=true + +; Close Combat 5: Invasion: Normandy +[cc5] +adjmouse=true +nonexclusive=true + +; Call To Power 2 +[ctp2] +maintas=false +boxing=false + +; Corsairs Gold +[corsairs] +adjmouse=true + +; Divine Divinity +[div] +resolutions=2 +singlecpu=false + +; Dragon Throne: Battle of Red Cliffs +[AdSanguo] +maxgameticks=60 +noactivateapp=true +limit_bltfast=true + +; Dark Reign: The Future of War +[DKReign] +maxgameticks=60 + +; Dungeon Keeper 2 +[DKII] +maxgameticks=60 +noactivateapp=true + +; Deadlock 2 +[DEADLOCK] +fixchilds=0 +adjmouse=false +maintas=false +boxing=false + +; Diablo +[Diablo] +devmode=true + +; Diablo: Hellfire +[hellfire] +devmode=true + +; Escape Velocity Nova +[EV Nova] +nonexclusive=true +hook_peekmessage=true +rgb555=true +keytogglefullscreen=0x46 +adjmouse=true + +; Economic War +[EcoW] +maxgameticks=60 +fixnotresponding=true + +; Enemy Infestation +[EI] +hook_getmessage=true + +; Fairy Tale About Father Frost, Ivan and Nastya +[mrazik] +guard_lines=0 + +; Future Cop - L.A.P.D. +[FCopLAPD] +nonexclusive=true +adjmouse=true + +; G-Police +[GPOLICE] +maxgameticks=60 + +; Gangsters: Organized Crime +[gangsters] +adjmouse=true +nonexclusive=true + +; Grand Theft Auto +[Grand Theft Auto] +singlecpu=false + +; Grand Theft Auto: London 1969 +[gta_uk] +singlecpu=false + +; Grand Theft Auto: London 1961 +[Gta_61] +singlecpu=false + +; Gruntz +[GRUNTZ] +adjmouse=true +noactivateapp=true +nonexclusive=true + +; Heroes of Might and Magic II: The Succession Wars +[HEROES2W] +adjmouse=true + +; Heroes of Might and Magic III +[Heroes3] +game_handles_close=true + +; Heroes of Might and Magic III HD Mod +[Heroes3 HD] +game_handles_close=true + +; Hard Truck: Road to Victory +[htruck] +maxgameticks=25 +renderer=opengl +noactivateapp=true + +; Icewind Dale 2 +; Note: 'Full Screen' must be enabled in Config.exe +; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash) +[iwd2] +resolutions=2 +custom_width=1070 +custom_height=602 + +; Invictus +[Invictus] +adjmouse=true +renderer=opengl + +; Interstate 76 +[i76] +adjmouse=true + +; Infantry Online +[infantry] +devmode=true +resolutions=2 +infantryhack=true +max_resolutions=90 + +; Jagged Alliance 2 +[ja2] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2: Unfinished Business +[JA2UB] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2: Wildfire +[WF6] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2 - UC mod +[JA2_UC] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2 - Vengeance Reloaded mod +[JA2_Vengeance] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jedi Knight Dark Forces 2 +[JK] +direct3d_passthrough=true + +; Kings Quest 8 +[Mask] +renderer=opengl + +; Konung +[konung] +fixchilds=0 + +; Konung 2 +[Konung2] +fixchilds=0 + +; KKND Xtreme (With high resolution patch) +[KKNDgame] +vhack=true + +; KKND2: Krossfire +[KKND2] +noactivateapp=true + +; Lionheart +[Lionheart] +hook_peekmessage=true + +; Majesty Gold +[Majesty] +minfps=-2 + +; Majesty Gold HD +[MajestyHD] +adjmouse=true + +; Majesty Gold HD +[MajestyHD - Old] +adjmouse=true + +; Mech Warrior 3 +[Mech3] +nonexclusive=true + +; Moorhuhn 2 +[Moorhuhn2] +releasealt=true + +; New Robinson +[ROBY] +adjmouse=true +hook_peekmessage=true + +; Nox +[NOX] +checkfile=.\NOX.ICD +renderer=direct3d9 +nonexclusive=false +windowed=false +maxgameticks=125 + +; Nox Reloaded +[NoxReloaded] +maxgameticks=125 + +; Nox GOG +[Game/2] +checkfile=.\nox.cfg +maxgameticks=125 + +; Outlaws +[olwin] +noactivateapp=true +maxgameticks=60 +adjmouse=true +renderer=gdi + +; Pharaoh +[Pharaoh] +adjmouse=true + +; Pax Imperia +[Pax Imperia] +nonexclusive=true + +; Railroad Tycoon II +[RT2] +adjmouse=true + +; ROAD RASH +[RoadRash] +adjmouse=true +fixchilds=1 + +; Sim Copter +[SimCopter] +nonexclusive=true + +; Settlers 3 +[s3] +nonexclusive=true + +; Star Trek - Armada +[Armada] +armadahack=true +nonexclusive=true +adjmouse=true +maintas=false +boxing=false + +; Star Wars: Galactic Battlegrounds +[battlegrounds] +nonexclusive=true +adjmouse=true + +; Star Wars: Galactic Battlegrounds: Clone Campaigns +[battlegrounds_x1] +nonexclusive=true +adjmouse=true + +; Starcraft +[StarCraft] +game_handles_close=true + +; Space Rangers +[Rangers] +hook_peekmessage=true + +; Stronghold Crusader HD +[Stronghold Crusader] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Stronghold Crusader Extreme HD +[Stronghold_Crusader_Extreme] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Stronghold HD +[Stronghold] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Sim City 3000 +[SC3] +minfps=-2 + +; Shadow Watch +[sw] +adjmouse=true + +; Shadow Flare +[ShadowFlare] +nonexclusive=true +adjmouse=true +maintas=false +boxing=false + +; Total Annihilation (Unofficial Beta Patch v3.9.02) +[TotalA] +max_resolutions=32 +lock_surfaces=true +singlecpu=false + +; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02) +[Viewer] +max_resolutions=32 +lock_surfaces=true +singlecpu=false + +; Total Annihilation: Kingdoms +[Kingdoms] +game_handles_close=true +max_resolutions=32 + +; Three Kingdoms: Fate of the Dragon +[sanguo] +maxgameticks=60 +noactivateapp=true +limit_bltfast=true + +; RollerCoaster Tycoon +[rct] +no_dinput_hook=true +singlecpu=false +maxfps=0 +adjmouse=true + +; Twisted Metal +[TWISTED] +nonexclusive=true +maxgameticks=25 +minfps=5 + +; Twisted Metal 2 +[Tm2] +nonexclusive=true +maxgameticks=60 +adjmouse=true +fixchilds=1 +maintas=false +boxing=false + +; Tzar: The Burden of the Crown +; Note: Must set 'DIRECTXDEVICE=0' in 'Tzar.ini' +[Tzar] +adjmouse=true + +; Uprising +[uprising] +adjmouse=true + +; Uprising 2 +[Uprising 2] +renderer=opengl +adjmouse=true + +; Vermeer +[vermeer] +adjmouse=true +vermeer_hack=true + +; Wizardry 8 +[Wiz8] +fixmousehook=true +noactivateapp=true +releasealt=true + +; Worms 2 +[worms2] +game_handles_close=true + +; Worms Armageddon +[WA] +adjmouse=true +width=0 +height=0 +resizable=false + +; War Wind +[WW] +minfps=-1 + +; Zeus and Poseidon +[Zeus] +adjmouse=true + diff --git a/dplayx.dll b/dplayx.dll new file mode 100644 index 0000000..2319dd9 --- /dev/null +++ b/dplayx.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe17fc0f02d163d97ec76472a431ef348a4fd7107b6b23104c369d298d7ed31 +size 153600 diff --git a/tdraw.dll b/tdraw.dll new file mode 100644 index 0000000..ddd49af --- /dev/null +++ b/tdraw.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09c73a348b22617b5b5d23970795a75e36f6f1625b14d570dd5fed8aacab3053 +size 626688 diff --git a/tmusi.dll b/tmusi.dll new file mode 100644 index 0000000..b602423 --- /dev/null +++ b/tmusi.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfd96f5385984e8082db694f4d0192d65b660c1479df70f1a243a9e959beb202 +size 31744 diff --git a/tplayx.dll b/tplayx.dll new file mode 100644 index 0000000..a6d891a --- /dev/null +++ b/tplayx.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91905ddc9a782089b5034df3d9ae9ed3a24c6af673624a88bad5eeb7f009f706 +size 298496 diff --git a/wgmus.dll b/wgmus.dll index 3e2ba05938f7b87380ab35a442ba83cf63894d80..2ac25956ebc7bc22116ea3eae98dd44023bac1f8 100644 GIT binary patch literal 130 zcmWN?NfN>!5CFh?Ucm{=a4ZQ2Z~w>9-Bi;1O`n5olFc4y{!OHQPpg**`mR!7uE5R^;X4-b(jLjV8( literal 62976 zcmd?Sdwf*Yx%fR3CNhD69VKYcD6t*dL<3C}TcW{+%LvubV!4O~Dk?^;pcZC;RxXJ% zBiRmv=@G4Mtw##&!IpmNX({5Rm;^|GdI{hq+!WF3-V8`YO~OU;exJ4Xo|yz{d(Q9t z_rfRHYp=_*p7q?;v!1oq&bS}cx_Y==E)PGQoi5h~p7O6;{r>V_RTTFf_(EUTx~x|( z-Qccx_0oxV-90z|{yF#EIp@~d`M2MC@4fd0^KZK&e@^J${JZbXAN{=v`LpkvdB>1G zeR}zA(BlIxSB1Nm>*SBGn(6d*z}5Gwz1~^j2p1nwNJ#}tZ z?pcaw{l@L0i+}oWNbrsYK}u(?;+G&KV@(c%H2-F}#?Kfs^VZ<4q=!jH9Y2iOwT7Rx zf90;?x*>C{icjZI(9F;I{QN$x63KGcjPfCO+;vMO+^G|!Tlu+=pE`ch{sFIi$Zd1y zO4hK&{K`K2K&o6b>W185^{Z$p0~Y-DNXyhe1@CUFo}x80cljvam#QNvHI7l=pD1ZX z(`RjXhUBFFsd~X#3cq~Gh6k$OL#aBFQuXHCG3&nDT^0|Usn?5w!)MeR*)`|?KW`Jl zhjU~7J=r5>M|TEGSGq{Vr<^L?GykIadZ9wBN3<^J?QFK{gcF|9J@XQJj^7ydpDtHZ zrZkjlO&-5IjB(_KH|I{>R2yISHOaYYGCgF+ruqG`pg%vh&|eTf=?<3aL;dZe?;Xx%EQ z9lWQB9G7dAAiuI^fB9@s&JplUqx~L{M|$gQrVHa<_-vTNRgO~unQ$3b**MhcjX^!J zjE>?jeO-Xkdr4bb|Hh+qT+-I0=kqb1Hn=E_>Ef?%G!#$ z@a8;ieO-IYCb|j#^ZF&!r|PEK^na7|e<+Fy!JErx8|$RfVNVo_{Ws{^+4?49f>p4p zZi$6OKWgiFe&ZgM@6{UxwL&{{vX!~YRR{6fg6B$^SJ3zPx3-qg?tE+IP${VkUQNyj z>9@@3_XVL+u)nnUojYboxXxl1-=34Y) zny#E7M9Lh`Z^6DP({HE1tcaea3$IvY=}H6*BHSh9`{Gv?ugEe6JP9D_RXTgp>Z~bq zr~?xy)Dj3@1p!FU_eizATv`hns2ROZjrAAwq`yTLJM@WuukqWo{+=PNTBIY{&+5WK z@)1FDN?M~J>G0+py=CeTEk#Vqd(lckHCh+CXywr5Dls)YTyV(LB0?kMQpDkm{x0s? z-zw?P_+@HX9_c%?%qBv3bI~Tt9)&yHp+DR3L#xBX^Q%V8?%_~Ri~LDCoI;0pXZnyU z84j$28o4g_SA>RY?&m2?Q8cxm7L6?{mYIJp%z%Q%IZBfARw?d~p#+K6${`STO;VEQ zGcUjp)W(BfOEGd6B`XC7tADS{o$pvl1$va#GO@~dhSdKJx^E*37!xx6t#M-ck$fHB|u1$nlGzlXHL&C86zfTpEa zI-3prZpKRO)S|6YA`VP(-c1y>zXp3thO{rn*Ks0`b#L6rAF!d=S-;+S;g9~ zk!NOs3{g5v@uzElg$ka>mL&%9Z^?=lc@IjZ_-4~5B|F;{7MARo6CL?5ekIw$3YG;Mb#GlT&2lz8NVQH9{K{SjQplV!u$?!YQJQFcdLH$%(>Ll+iZJ4 zM~;dm&6e~c2voh8>hwv~IEQ&FdW!b8L}`(u0?am?;!>m`zF838{CEn+0n+A18VKSk zdt^L;y#3qqE?A~@QX%qwOIjxnkWR__a6q3`-bbf387ocxeR+RI)Zg%ljLTrVwu>-Cf?re^=ruE;d>}Znx!qdZt;1c>gqJ|Nlw@@(0q6Jm=$oDeZv{x6@}o>g@)kSn)?yxlb(y()82(!+*G3 zY45iGD=pmcrDP}5CE^n7U2k~8t!}*`e9*0}Z%}@)G@Cr3`tVRJnW*eEQC*L}4nNH( z11!Vu(U{DNPxBWUgUNnD>V@kvq>0q6)N412YnP{dMC1EZaiEEVeC%h8drxDz+ZF2- zZt%pbJ5QfJ-M-_}t%Iug7d-S#Rh7%7MgD>hrq{dbH{31I_w;DWn1AQ&P}4}y+#z@0 zTd9xq3alZ}&>D~yX~2fB$=0GT@H~S7Yi$O6LFWt!kS@awVlY7Ykdh%to}iv^U?*1U zzbVJ*TO}?~_j-M);MCLYdSa2Nmjj$^nGAUPT+5WN=)Fkl1OL*rcHg0$LKG2`^~IGS z9_uf?NzK93glo#X9FvCi4W#YiX%ShK$NEdh(xg1CNlsdm-1H`|T9|ol%si8uKXpaLr?0eeblgt)zIwV|TR*d%Gngdo6i zL#@V47r!qv^6esdbGq=8XU|z$Ptzi&NmOqZeVh72+kdhN9=Q#N0lF&l(QHfa zx6}F`McN!rCB>+cy&^$mS#T$-4l=aJ_dSx+LyP=EB|KX6LFV&~m1?XuH*dYWvQocF z*crUd;pF*LkkJ80sMH{IeP+2zljAbBkhVB!mWYFpT+i1V+2Mu^bL1)8Uq3@)1Zq0x zKaE>GrE~su^3KNjckR0AeEf^#*?jy@(#jfPf`oVGRB)qEp?n!y5bJNP#yuKml%|L%D7`utX?#UmCy|X`6EG z5J@^MPm_~{5SCd$X7n5uH(KNx?BI(9{YK2*h@!b_S55(Odl+@@=+0I09vqi8gsWr- z{nL6JK-w{gN~~u|fAl+^nldpM%TkOzENRMY5+6V+jPX{vN|%vttdiuk%=bj}sVndV zP61_l(4S47&(=t<)Ra0RNuok!SEi6jPLDwwkz1^e6ya|ty;4XZt%XA2MtAil1%|H1 zF($|)mgx{2R22n^R^_SkH z$sTLe%EI4~*5vN=Chwe-CW44GIh@wyinJ!*OmFfB)kGX#Y4Sx{lg@`zi1kQsvOqPF zF-ntj-$+e8ucS3;CT)(RYElXAyYtSZ5`0ytVo#^tl;AN@f*++pdWf{G1jmkdc5b*` zDC^8Fm9uWGTqWj6i@Z)}4$N*Q=??<){4|(Xq+mV;Ogn6-gaM{K(oe)hwBKSf9l~xI zv6T`ETPYD5;ihnU#)%ZCFOe2d$L6#jA{meCDT4l)wD}DhSb-FKy`jL8UAw-w}Q0ewvx=$j<{Z!Y{+p*Mu+sGg_B^S@m5Zbm%RA|Q0t8R!n`N{Ly5 z?y{N`CDxFRkM@rjg$yb+fiLYyq z{~W^^D4baH0Uq;qKs$sRN@CeyuTOjXd4c&fxR)l8tGd&J@Yp4R4d z(hRJEk@yDSd#MrGs67o%Of^VH6(Gb0j)m1OV=rys2cz**yi+hACRv;Be^De!0)Dqh zpw^Zbz>gL16ms8HX7IB5lT}b=ogbn%&%tq{^>=$_aAB&8xh+xfb!o8&T%nHyme}a?qFQHexau&V` z_&WtW_^wojurAoMq;8YEvpzMN5!tRzI78<0-zX5JsDF}T@)NvJ3{H0OHA6ONPkvz?BqI{|N zy1?J1ivOok#$eHx1e_NrkamReE_(cuy00L2vK3NBHJjo8L_d5+%ZHAbAdhG0Kl=z~ zs$9fs!IAWL+3)qsuEuD%n7zRbKTvr#$rL?|9w1^o&M${^`-M7#t3-{3^;CDIH4Zwgd-6>d{L+gOk7BZqNsD2Ske%;{n<&%p`4~5$ENx3XV*UnT0`0S zUl^JJds&7JX~2gE%F2q#kF~feihud(f$PZ6s_9d2wGBhJWO7%TuTst&4r%6Z;+;)uP3EA6Y8|zb9^xu>Bwqg^O#` zfIdsw8SK|m=H@f2s&b$frB$yc9Ud;*XD)5|y$pchA1~G>w}^RkXDHM7)%yeq)NZw8 zHDwARNMLhP+qX@bp5#JCZO2h=Ue1h*zR4gFkR^@S2-?a%L%wcB(*Np)G5ODAOG(~_Dq+?3IqC`jjh}0Mtv@38XtM4)Um}w+WLUNdxx>0XN#eu&LZb&1B3odI*9_er&uqe4>ZmtVP}u`*OlvF1Ds0wj+GP zt3?LUDtv;-<)6+W(LuoSA}~4wiwnA9F}wvVveK{^Bv=eqY(1hyE}*B_aCMA=A!eP8 zkKG~`lLX*~pQNbt25Ea(=g}Tw|DC0NWv!T~XnqPshQf=Z5#7XjtA=J1%bXvqFz@iMQYO`5;Ol-a(0i}Rz zPjuVoT#yD}p$!1FSSfX7=F!J^^k%a&eaHjQ4~Gqxc4fnpqJe$VKo&Y6%Y8H{2pjHj z$8Fj}M??uk0n5GSDqt%UtVM22X@eH|Gt;)y&7iK`OcTofZeD8W4Wv2K0nP~DLo~E3 zoJB(|vI;stj$6=@*u^qw$(D`mbU4IG&PcgkI|>Vpho^OPGijT~eJmP}$39u}tB@-` z(hbFu8kB(5&MdvhqPlTT8n|9IIHAL@kN}|rg7_&gMFA5$9TN2FirL#jf>ogu30@|x z`ZfPbtFW>#gp-{qT8rLDwo#1;o-ycdOk5+N$EJavDWF9(%|1!c(77*zI|EiX0zN4O zJQYl#nF}nNfPF0jYRnf}v>p~2Q;!Meij8M;GtTa0$bmdq>B2ur><1(9kXDT*6ORAo zb27x%D(~$RY?Dl$lhV{8$@%=Q^omjk1Dn zz2=R=7&*o!$}WBBIEQZ|YB$~}2w2N-d`HQCmh9b`L4qo~x3S*Y|K7U?p3=e@ux9^m zA~)AcFzi}8l2S(GtBeR(G0$sp_KT7Dp^gMdOvsCSFKc*DyDjS%reSyq=`*nU4&6_h zbOu%zo)xQMu=!tMRRLDhQdkXTu^}gq6;`-W zDe3T-H7SkKA_L$7gi$e(tGaT3gJ{+7ew@O-fwZ6+Uf{z87y%f0L!L&!f3t-5Bro52 z@2uQ}W(>bL9;T-%eUtejlit5-1NTJ=;)I-N(`0^v^Wa$FXe$v$WBZ$uBc=m;@k6MC zPVS~)r6ONl=t`xnYPD16)<=5Gk3cnif=Tur83SZdv>ntbLQL^iDV90-WfH1w;cM|( z{xJjIh0fk#!rxEzB3a^kn510#X|~kj3;pASj>fnPIK#Kepunk|tXJk&H7=(H8-tuC zxn8Q20fMJEtrD*G7>WL=wl-_5e%MSrdOnp}bW=Z3f55A)H|q~(50YCp)d#t3Eor@TX3uxGZrj5t;Xr zX)G5hv%5>KN%O6tIiW{o?Ixvl`eW%-8l`NUc`+-8GZa|#X2JxB(bcTnO!k>(W%9pa zRvZQHV!v#S)iGEX0QoF-%s>OuI&@Uowr9`$8~u9HKguzS+S52#z^)Y?0C9-V}R#l6D$(v7xrLGTvf|?aUc_ zNDJ#N`-4$p)4c*NX^|J{TPe1-e*rWvWCy#>9jEaWZC6 zAi-C3N0dNEFD7CvMSHXyK7B3C}0p}PQ+?7>wRIk4B-2- zQaqR}X^1pi%GHq{D1#_Gb&t&F+?ud0h7dyvq^<<9;Gu-Lj7DN<9OVjc_LtOgz&_iR zj8{v|pIT6j@fNfa@|6AInS>@`FbCQK3z|e8{0f=?sj-3dwty6!4T!|g93WR(Kun3V zO8dv`_J9A88q!(YOU%s?%TE((NT!@Uk@lQ z4kpjoklul(Qnt;8G{SkY8#O(4(rftWAp2j!PK5*f7n zY05lIp@_NhEqb(1X=Eela*t%F)b{RG>^FJ>(fl6hpd_-B?ddHAY75M39K2fy6q4D( zQ()yAkE^`kPs#Ibwowo}D|Nb{@Ct?Eo*C;7S>!VjO1hU`d~et-%I)|OB6yS*Qz=JoF{-c*nkh%9J$#B{HME= zY+NHSSKBbpO6j!}V)tFftAy59uCc-W3~=Hx%GhqRL9Vbsj&^9U!UlU*8a!!(UG+2x zQr$w9cq;T`=br)Abyeq?9Vo^ zpD17yYDf9z=FhvkX;k){VCdGSQ8}~nM~!YAl}r5_3Ytb0Nz?G=f~j&h zY2DX&an36^)9AP4pz%b%as&PQ9JG977vFQ`7P$(Hmc#~`sIJo{|;E7B@IkzV-=scdi1wA+>MOsjkkX=dX~sFSO) z5WHkB8e$!m*mqSGYsPiH=r%bUk;jTKkCkCI&r6W6Y<-g!`I6f1Fru%7Sz|Cdq+Uo1eYNjOVU7vNh_k`pd8|6ofbJjBaszpB~%xhk4tND zqtn7%D#peZ!$+;d9dd@F`h<15;|dH6XDc4HPIt&54yQzHk(5}+JLDvXQ*s)RQevI) zkmDRq$p?0cb^lOEbb+wBtTw1*t*aN0a;msm$W?E4HNBQlSOjQrv@B&jYWbFm7q6yA=l;+6yFLfHS3 zg0%Aj>K#$<`Kfi@n(Gb{;*iS>0#j@vj)w7TVCs7S_$7A~g7eh9^imc3KJrNTpcp#yq%G%Cml@lNDiIscw{!)swWQI5UK2_&!Huua+_9im)P4Q9gSWZ-Gu_xJ@ z*p`yNm75t>8a+AhO$KI|kpqEhq7a6T&FHda-{m}s zx_=xV?wW^#LmPjv7dM>cg&x^Q2%bmOG5GE9<{Y(kt}fGV%z1Xi?COu@cldOV#qXEw zjfLd}bTYWMzR6SiPUuLN762}QBWi*aQ_6e34q|^|T!~d(@Zr3REt%Fs;Rh8D2)AFJ z!OV4W3rRVZvNt%mvNqO30G+-?$plxPXHo?Q`Osr;Y?OzU9p3_&>W%IVz3D*t#HtL2 zToRZ(p`?xDge&(cvWHmG2!OU$bf_ znt`%PI?i)kvKQd;{1&CoN%c0#JN<_p=I61ee1QHbbz=qtEDPx0>F5`sV z$2PlmkcE*H3Yn9TY8{Lw+O_u@a`O{iu*qiZmDisqWk$)%%Boe?vWZxjatj3}p0u18 zUB+AxpHhz1^ci2D4iQBbapGk;1h0)pr-9pK3M{dlbd&!23i0Fs{G%^wyRe6vVEQ z5;@}Vh`e3ATHcsutL3fF8s1)9D_PsL$VReWl-jXT>|+w^9R=j@CSUbQ$<)HSH0c+6 zz!U#7-$a=mdsu#J>nC_6NK5Z0h-*Jao$!f#Epk{TyhMdaKo;4W@V%o9zYNV~B#;l) zn+1OEkk}2LSikTlZ;zh|v^WTs&wk!xwa$wRVZG47sy%0Ccym4+OP$BF5buZC{uAa! zxGqP@62EceQG4#^0-hc^jLur_`m75+vA;Wndh5mtWAVovFVb-pQ& z7Q$v{U~g)LW@u$jJNc)`S)snI~{Hxs71IN=6W%oUqs2a6rSAmp}u?95&ihC16d#IyTQ(< zzll_ORo+3$jI0K|SwGa?roX9gYM<%%mA*MA8%({l`LMKcZqL#;Lp{O?cS&b@&n2C5 zKsSYn-qPMqjV{=w>|5z;b9^Oxuc2FQX&D4ohr~_sXf2b$e2P{V33lKnQ>SQ-G6g)< zES1HG#Hy(VVqg4}s9gimN+?=}zFZTZBDR-!F^h6a40CH^CK zr$1Vb^ryyOQm0=Y-t4ig4$H!gWfaTzI9&SMpZ+d%f2_!_Dr}G}Rcqt0^cwMzJ+z#yk^zxE&Xdh4*Qp_gc*R>6tYm9L;9QPI8inJql^tA$?Tm|#c2`ul$#@X@AiEai~dtQ;rHFabHWS!Uj+L=9yzdW z`JcD|BW}Wel&d*y$Pd(PeO*!TCT+bdQWqRwwgd_*%Mc727f@4_Nr*14qcA|+JQN9` zxR5a$d6x@>#pAW-Ci*X|)F&6{*ZC8DQ}orIn_PghYteb&8oRE@TH3xf84g}o1V~r7 z(sSCpnLxL9Y)V9*aPYr`LR*6M2e&P2pL>T8(V(ioWcj-MCK$#Lo%O>X4u>fS`K%B`l zm*)(ga{pl%PajX|#cNFch6vo)skZ&6r{G0xo6Ca|BpW8?OLh6erk7z&ZDp@LIft>Vg{~ODpCml^MnX&zZti~z1Um{xa5_-rNwtr%dLcvfv$PT%fv9?GvXEgA~JHp&8t0Eej2!d_ZU5aO{H(dgPAVF(Z5-37 z?=d>D;-&4OkHbVF+=+EU7Jbi#eEKnD)l9!^;NpEw@GkktnaB%U+eT%2^if_*1Ua2T zIwhY@`_*0BhdwgL3f^y--{?wzMW05YkS}((FM4FblF~O9Js>0Avhd325qrGxMV(xM z1uy;c@D{KS2=*iBLaBYB;qGv^hW?QlQdwJQ*yshXjvk>|=v50tXZ~>T^K`{e#^+P! zNPja??KDZF#~aLgV8wlVgIk*nIrI+&UyI(&fD+GvC=fdn8@kyKdp?ZTHI495-Wj|$ zcDIN9qdv%iuaTd@;eX_pv}x<}t_Z*XZdRfu?^|4yWStW_9KWeYVS}+3u*?RQL7nHK zb^8{H83+4I>&qQbi4B%Kv~MYgOu<|!%ug2nD!E@G-Rez=haGxUGMC)LN2EkdH^oP4 z`fKuGfx~6>2R!;6Zy0Y*aJdRM#{(Z|&+P@8uPN{W;ANT-tL0_0%lLhv60V|nUQfip z5w2s#Z*U1p-wk~nyW@?Ly7(QRsS(s}5F%_+zbQz3G{ypSL`bg;^4sP7mUKG4(MT;I`yy>wa77P7Pr^=GPiz}NRnc@hN-? zV&k*JC%yat*@J2uiCAA*{9j!**JJ>jRA8jJZk3 zlAM~V{W40uVR2vWxeA$_ZphImWG5ccp1UC@@wrX^a7R(_qHxEMP*0A)-2yGmU&@ur zWPcN4Kk(~2wC6?^=zFG`i_xmC>rq=2U&CU?ZuaScIz4cJ?d3_E^+_MppB&h}>#H~W zj5|9R$EFJ)d4_v$?7OT$^>MH0TNh>ME#W#10Y-X_3vX1SD}mKOGc%pXhk z4K4B}GfVh@TMx8o(cYw+0{bA4t1a+GRWLUe*o>oH^E2|R?|5U02t?ow{W?!9a3D76 zgV>^GoWJI*7A>-cCVHq&Uvxl!D>iOl;)lcs799}l5on2zam$iTTr(7<7d3ebV_o{V zeGJO@GXxLU71#9qC)JGqW?xr&(%;Hz0eWy^bX%}I7HEO3ztA?0aN}MKVrmL^EQv4Z zM5^$}^hGW7erY|J#uvC7T}5UH?6r;V#BQ6+;Ah@So}>S~$3k_n$?S?RzC`c1JkYG~ zD6Efe)3+|x+#Q^cZE`n`=`1eo2z}1&%5$$-)Ex3P_ADmbo`1%@65Y0Vnrdma)4%Io zT+tqQqfU&}IYNxA2kOVHIp==ZnpUvnBa2&#DO2LN zxEp&8E}h;C{pVhlv}d^M+QuIGF(Zs9VQ!A50a$zy{+|syr#o!NA_+=@={HpemnVJ= zsUaAGj%+Od0H_eyqOKw>+%w-yi7m*L>nF9y?a&l6)z~xNoI)~*ACfc3bq?odT}YD_ zJt@;pYV6wbfmC*Pr1Zm~cT?!|rt8#PZ_4+d(%{v_CT(tS3GZ|vMD2S}3v(vuIQ(o1 zw1|wER|tyO6E(lSCG%?@Ohpn|jTLLl2Z4>=q3<{HIMcvb5zXM$v73stjf8cy<$EYD z*_JpD{x^t#1uum8=a+6-d|u%eZR1EcVi&0ky-)4LdtxPf5Z#E4@s>idh#cuMnH;CwP5W7pI;pDZC z@dz!s8Ow`E))=pT!jhe#oQMPi%U`((e+55CP>7sMRVodJD25!HjNL>(i~GgKc+&V1 zxsO_e4;1#qJ&N^r@oIgrMO%OVhGN=Ab|TA-$XWxK78_e2Tlk1OG>)j?cj&4(enY2t zU9s{aZN1mMDUs#OM?07TwDsAv&#F4HBgn>1gMY zW%@~BQf!O_d6xf*YI=u}LlyeE#QYYRo{5xx!ngvIXk$~rw`7mwH8hP;a%2-EDqj$T z%59DA&^_UU+&{VJ>GNK6nYSM^}@tR+uUfY;VJi)0*G1!IN zFy03&p_s7}Sg1tksCkEI#EA_oZCpl7dYDhk@FBN;lkiVf4wBu4e{kcGITmKB!USn& zNRN%@P*IDVLc-O(Iwc4`vk#ppY$DG}iJVr^ljxfF@(Oj#9|$V@ol%&h$hO@9Yd$3Y z_V(ln@tZrJzq7KklCJ}z8hq7}C_y>XI(|3fe(8SZr~RV*lQK%1mrSwM8@A*SHCCIu1R1utjql(% z#jeZOuk(rhYX~36uih>i5#AcmCwnk;V>zPczE|P~x%wx_Ql8N$6XNC~&efTL=|B$Sz{GW7uwVLI$`hP)KR;fl-cZ4fa2=7O&5j$E5AB?xLh$ntGQUTH*(_taab5emvIGm)Ugx7hfd)G z8?a=DJHJ?XPi&O0v}wsqRzm2eoN|+KjJys5+=0m*<}DD@V+d@g(UZbgjTY7@$yAgH~V*-$wwiMVO^@bE+vMgbG&7-TYiE!96~A zV!Ne=UFh3FVPOXl&GD$Ml8+?0S8?t=@!Q(i1aU5w7gO$TW?5!_jg%1H_HWVWEfT|# zu*Utn>yYvS71*d8yUw3{5}U5JNxjg7dBzhy z*;ji=&3^$8dzjZsI6g+vG`!aR+H(>!m7U=nF#;dS)z+HP{)=ds2j@MB8}T>MOC?*2 zdx4El7%^S>n&#Ssw@UV;B_x#piZvYn$CW4sqhRNq>{qaJxI}i_oExwvtXl_0h>NkBZr) zka@nQ#&#D$0j=gLG+A&3|8RY=84xC~XBbH~R91sZ=eKQM2q&Uw3Dgz}FMSF@5{g0E zXy<}+g(vPd*wJRQ;rYIRQp>QCorSyW-^t)V-TB+jTiEChR3|=E!B1-`#S!!#` z|Hhm4@52y>~2bCIRO-sG*h$u zY}JiNKZL-Cw@xvp%ljnDV+(Zg*gj)$ii(_|nRmu|;E*vFTV8sS^+3ROi6;5fdcf|; zqdH0!S>v&K9dCTZ`9`6rJLJ{P>T&Wn3|zl3ZUv%!S2eXiLunP5m|N}hUfRpFQU5pJlUoX#KfT`FTAPzy5;BbuiNYmo@$Kd^Q070F-=g6ow5?DnO~J*Psd@v0Lu9lud;KG zgNE79CX{2Jt zEuD)8(06h@&a&O8rUr*t2z1)PL92a6v~#h{=`|nGj}8x}w?sP|%iYB_x$!9(iyxM; zM1~5U)A!A(1~PCHYaIJ3$Z|6d!G>SpM-b%6APHki);H{qF>ExD)c>x*jcl8#F zUwGV&(b^IQg+f@&coJUD?V1zR(<$M z89;!DEIP&>NMN(|*osD?bD>w70?pJwO*VksAQx6b4@C69OR)d}u{WAL{%g>0V_6wP zVwr3*!D<_`m5U!fR4iAxm%b^JZYYN>ra%h;G7IqZ19l9!DX>Dp53NaDl!{;IpEA?v zp*2<4;O8EtLe;f{LWknlF{RY%fi>~K8Y7D%(oAh~JJs+etuwy_R7miJ8Vl9h1C3q)&24{V+={p-ejWq2!;p_c;FpCpg`1<> zB*Lr*YV<&r7Wpke;yGFRZx=}8k=b_r+o=!H3Az(**F$Ud4)=+YZG4`$QXhM|v?27V zzNj{FVUj*Jz1J#wKO(B`&^x*ixO!l1Jh0Yy994tlfo0nAyV+ij1=cnNo)zvj1=h)f z`A46=HjzoZN0H8^wxY;au2!V}kP3=X(E3xtncBu3oGMeIk~RO56h48qh!JZ}?xyXq zO6MgM{okWw!R7bwq4pj4#9HJc^hv%E5IIk#kH9khu^>3drmq!=R39bT*rO&oSH=Nv zY+e~ZV?joR^|+6+>N(0}UN^L9KkDh`*@HM5Zus(@6vh7< zobO4^koV=8P_9zHI$Y-|Z4B*+&qeMPAEFCV`bvY?q!lG~j(w^OmyJO)9)nYmsI+(sF4QYlNG_f_8vlTSNLQ`=(TXYFY!uAU0bF{HWr9$(%!rv zI``}kM%98hdfw{i#)u`YWSbZ!Dn%*K%o|_}EWk1lCehssQ-@`$RY1qHo_@oWSSTxA2MEEhgAj&pKza+hwf34}f zEf)Ad=Rm=W-xSqqcIH@z-ai1WqBr5)EN$ug#6i;dZ5z&G>LVH2`WxJEz+6uqMyij? zF+SWcQ}-+k3dGT(SFzHt#Y~G7@FHJ?hz=yt6j&y!knp&dJdBw&u}j~lw(?h5u)&-T8|bT2X2s?p>7yN3uDRwDox5U=Sk(jvao@SxV49Fr&=tK8xG`p zV!4D1BmIyei9$`eif02e@VE`elh8`qUM+1W)e>U%!IWzPFKLk>RCn4thA=j6osP~k zXHI$+>TOt{`j^NmFxr>_V}V*^Ao@+vuO9c3I0X6*^D^GTi;t96>UW+FF7bmsV$c~ zW1^Uo_|r$#r()x3pugL^OL8rKRsswRnX}C43hqm56gQ*42KD_y0I$uDsW#Q*<2tc` zQ%&T!OSK42ju5wjYPJc0u+ZlPu(t_XsYLBrqh-HU_wh84!SP)fdzCE(bJMD5(Osb0 zrPt*)aurs!G|37*+oj?^Y(e=d6_ZTAAA0Zt(;G#HkyK%J%+U?7)gp33!{Yi+r1r^> z7I7=pdKT4zL@15kVtkF@oQ!@mCIgMN3E(L1r_!K1F=|BZo;42Jw0PKR$#+JlueIC) zQM?=gQtPfR-4Kyee|xNP=tll^tIjR^R>ofZ-b?B3Zn^XnIcmJAto&|V&E2w3zK7$mX+3P58VZ; z%^&bf?607+!~8uYZwl0awaa`4&go6z0NC%6p^LpulVI~Z=!}(V*)wdJ`EA-bv)mu( zIUZR3G93cbTH*w%%ywWwVkHA>jq8w7@u#1)Bnvh((Mk6Rr`gwFJPWs8-^lp<{>Uh^P4kbA1^pG`WLyKw*!~(TF3Yzi zeNL0m*M$?x)^CpprsWA6GPa5uJMz)k*u)y{f>KkaiL`8&@41jUpK( zI0nC}`cK4JUv3^Mw+)l~M;lPLPV>k7GH#}Nlj|}7ZV=@&r}2wH)SP408OLiS-yh)S zsp1GD8|@#0`@L}G0gD@w%EH*t8j9J^*S?e1;7_IlDC4 zKMSdufz-@o_uwv>ao!U=*fr{o=X(q}9nb&f9dj|-@23Hu_mrhH=wBx2lc`1~xkc&zH zbN&*fh?ks2_vsyl22ZcyVYCDV>r20w+Y4zrr%9#_#H>O$tb=^^c*!X_GF3O!EfdzO zpk3gDJm&dAlX=_^7L4QgNE#V$sZ?G zUqMxvT7r13(BNK-5Lj(DW$CZlD{&a6M8OgRb$eZKb;RJo!mi}~KJVSc;B~SPgRzLg zH^5Y=FZr3eshlTANBmO-;zg)t1UbzccG5()r0LOqQt#D$aq2+yn?d|Nw>@u081 z_0JVFKE}Z)o-%wg>Xb4`kBVMOJo6Dt^~oo0t^Lp<+c0|QqCGbhbS2wGymuqp6J&8N zR545KS$aU%YaBqqs^rDJ_qDlauYRq{DUgPMe0 zD2&t0=C=q33>vE&j5rVUniA)^o2nLi2D`ZS2uceR*^Qh=$bG3cai4kHWZO5&v3wEVCZPdTaQ=>o~hSdP)#(seGx4 zFhk3M^!psNdYV@F;lsk6`HTCitpj%*_LCC^?MSF`;YAAQ8fxiV;$u4FlXB`iGUL8# znySoQn9^J){>6FRI!~B8oAvsHQ*-6?N^apUj?;8xaLWPv!CyJ%VC7asg9|P(-!Cz4 zhqb>=jArYB?D_+l1Qw4CqyY!!=bW$lT}{8ZVtn8SV^O3SiW0tupt=;v}Gp;Ht2$mgv{Zhy7P2DtkE(0+2= zE%C9PErSkA9~J&wjstAp*Qb@YeVHBnR(HPpxZW$D{Z74B(+`aF=D}A%KEhbpKvmb# z_x16r3fvUGS9@->|6c14JIvyv1+(_TJf8RN{&>GBpTJxCE&&hr6SoRiA+7`@UG)cY zdN3!1Pn-`(|NO%Jo;POzQSjTnZI5dA(2wX;ZtqvzuPbv;x17L#Z?lx>zT+Eq-{Vj=%{Vh~0ZmDa@^b6Iovh*m^ zhsexCoXGMXyvUKSVdA5Fm)<2UjetE~U{gMWJS-}olkKg_XY9@_0-OkigTcO`Tc(he zE+aH5;QU&Hd*4i9wkVVMpecJ@P z?Yp;sDQ?$yD&*#^f|$F7r2IV(OLReLy!LQ!c&9}(g@d?isG=G;=j+S>a?}*a7Al%! zaT?hF#K?$ET0y1^2y?ueQg?mfCb3`U2x>J&l$c5@hF1WY3ikEM7J`Vz&ljSxva;DBg_fv1vV}C@qJKhUTKW`FLj=;%>9Bldo~i}mrVN1ROD7DbsHBr4 z1O=RSDA_1^ASqYF@^!RiCG$^IeQ76{t(VELa*a57l;>I|FxOZl?<Rcjb@%5OD%j8EwYBlY_x50kuX7mQ{D^ceim|ztTh=A!vc#P`Nqc>RS?S8 zxA1#(VJk*bqPq6C3yOtVESu>kAN-atLL>wraEx`#cecS5mC0X{6+TJGd>13-`wl_O z({0Il%NN z%;;-_l+p+9V?|;Qr%7=>IN5k)Xv@#DgjP&p^nFkf2rvL%DS7ZPIF}B@O2%!`z$1W- zdHC^vQ6wd-TJ!@%7aia4 zT8^#r#cy)UI?nQV9OGNTdX*V0KB5?c+~m*r#30eYYM*cDDTeokMiFeg8q`$URT}^sk}6 zi2c~#A}nBu)om(zfsh_57V71YadFR*z2>r%aH4kQUBpwOc;+;zU{C(?b=@98%un0m zzK(5}Caz5rUOTkrGwa*^jX zRBLm)*`wo=rV?Sh57lE;S92*G@BO4zF*{We*N6i2UCd!IF>XWrI5f`<>>`}9_3*l8 zgp6Pqd|0SOBp8b3!s4V-GjF?$72s3KHwd~HFiy4_q{bX-=tGk&^(Lx%RNE<1(nz-p zrQ3YlFc_au$j1ygu0jre4s0DQKCCfTXeMzw`4EV*h7U=sel)ADn4Jd0;W0^XtBgbrdd9(wtNRbFG_J#EXyW3?4$Ml)FJJT4*7+7qH^ReV~Q9%b-O@ zi#M|^=qo)Q^y)spkwY1EvE(U_j!~JnV+WOrDRlDbNmNeuqa%-jlHEjEQ!r0?g4fUv z86DQwp;2;)ptx?nNn~1YxSYS)SJLJtA}PXRe#3GG*TG1!N9F+NZELs~Df!dQSa4GL zBwXfiB*tFhpV7sjIsG9#1^axjijVFr;gs9FdwU|QWxE{Og5-i-84@3Je7anSr$5!wvjT)V*Q$q$Yc9unw$#}!-;d#8+SDn&hKv?e#RYaK z!8pgOD}NkWWV1{LPj_q@Uf=2b3BU5o(Kq2Mc#30F#Agrk7#b`thKuE>AMUUgxfuDd zbVOz!%R)wO7WzO-=vJP%GEF!2(}1)L+ETGxqW?)-Hc0GhotUsPm2KOt#aKSna`{Yp zQnr@;F|-#zU979l1&}L&NxZE{ZwfsuI42@j-?HcE5{)#@b*xUZ*MWc!cgS{2k@iR~ zQ+22}XU5C;gimi?WN1o!miWv(MrF+}n~3fei_(8?X3OMmPl$@r5R;5^oze`w{$sK+Gx40L5Gu~4Ic_}Awa0iL$3z&R$ihzRNmj2El$)#Z zlJw)kTfN;pj3t1fWu*?ktpj9=2l{ciAPS&N9)b!-OpiE>wo)inN?+Iv zs|(+MjTwXk+VYj)1DQsL>q=C=T0|CKASQv_;(XFcc4*6cQaObR-Am7AwagZw99gMU zkSu94W$|KbAj^0&3p$10Q=+a#{sHsoFjwXhx*2cYZ)KDLt4Ky2?kEj@i_tmj$g;#T z>KBx>>ATFA7_Gy3C`+cTuX>01-yGwIj$p(YE26=!(ib>TC<~PW^A)rxNmjlg^p=o2 zxPt=%{blerLFJ3^W#&Z)fQ)$wr+ac-{K*^Ml{l)C@?3su(c2SGsWR)%CBYl>Lz&jg z&X{(M{>TLf36vZzInSAG>1UYs$UP!H_AF~Igl!hgBIr@lhS)w*3Q%(yzmn?leO?^C zn78x7rkNo5Se@Qj|Dnfhk+yYaKaPtihul2Oc@VXSVSTSc?xy%ryMoxHY;H4lWR^B- z@yDQ2e0om!y@4XRo^ZVEQ4sW4`<=0&eia%nY(?4079;72abJWJ*7_&AjMBHQzuL+= z(hqR2{tl*%?;XZ2)Xi|Cha-%;-q+Uq{8=sfb*Ew@Pf3gU2QQa9JJb_&;y0ZPA3PPG z*pIJZ=^4Qv#7BAxRor+)lNDiU3g9ClhkU9*?MAJax6-D02Z%Vw#-Ea)a}z=5`K^Ll zd$YSEeBcyCgq{Hy$PT{jv}A>>02_QP>CtZA^N>G1!h!JY`1qW7-ovGP<`%@p=ExC} zVDChKS^xBkZVUMsPPi_=bl3dWshd94UfSl~%9j}H_{2l)gp$4T1xMBn;p6@0ovZE~ z5l-iL|M=|E?ejj%5<3r=*yCy3aZJz=L|kfQBrr!P1)Kbjg|qK z8LrDwSK9KKSh*sF@u)wL5g*!eG-s$_5B)&YA8Tjg~C_lG@H=CH^q3~4FSp}#iw z6}lP*g2nNi=VHiu=<4{$Q>9Hv?vGAIkAyCjdzwlA>tCZgl)Xf2Z$u1+^*xl8cP-%? znc|nrwFvPH1)>YhLSTh@Imnm(8ddp=Ib22cbVEF;ECS<@A!bshhpHX>v&&2Lkei{>JNA;_&IL zC0EBhe=P?=2sI}>Tp=FI)^k)|=mxtFSe|G6m3X^+e2sMC3PDrm z=ek4v(H`y-)hF^%+4;-E?{&EA^*&NN@pLU?ktsPJJ5d;Zz>~FP2=~U?B}g!ezh!F; zB_}F_)AOuHKfVVeY_{zUN%QMqYnwHPps$d{K+|ekf3JDcO(ompM1`!R#G@Y@E6>*3 zIp{Csk-Yd6*$^MC?A?%!h-`Ln~Pa@-Z3_64PU7zs06 z`uLnMUj|H*SI6Fpt(}Fo?ZIRBA?#M6uXIUd>mz0)^p`GW5h-e)&8@N!{j|I zXLN?@fNbJZ0-jlAXuMoPrv-6e4IgVHSW((McK`^KIq|9{5hRuZp3;W-pT@^X<>I*K zSswWuxQ+XsAmuOJDh~bJpQ8UPUX*e3$L_+|1gD7EgN+5ciJB2LRpwh6XZ@to&rLWC zv1{9JKUH$X-Er~${oIuA?CR~xT8r5`Ohf?dnUht0*8$eaHfRL<4Up`QW|1MtJy zqWL;q3?)o;1vzE0n@?eazs@Lz>dj0xh4uPY?z*p2>&;k2?I~vLOsq3kYp4P^`NrZ< zeXQ7K_V{gMXV4CkK&^3I2qanzmrF9(0>&zFdhs;u+ks2{Ydb?3A@tVV)#M460m?v7s8b(hGT!|?D7U&3WqZXB`)Fnq!y(oNe z99CJv(Wv(f9FzFDIb_~#Q7M_=&~tzQB!%& zkFnIYOs^7Z***NZDO27=EJ}`;cY>Nl?=ob2JT#xk&VK#L%-AFkd)xO*WX8|sw$jGM z=Q{MYjwUo(M-!GU#2qrFn3Gnf}C#?Cj&eK$WN;>4qd?8-;AgrGl zJ}^+P58kibT10I;-bfK!(O3@pEdV1vtXL}>nR&4*a4yA#{ZKcvTJ=#$2lhSgp3+LN z*LwtelJ;{J3*hAdSMG z@281>9OTf_sO;F}?84?yN!%x{I-j`BiRbi=SM<$E^husaDBU&p+^~r=;)#`%UJ+~^ zP#50nPCJk1&|5Z&gV6hdY&K#FxvM944Op%U;P?$WanHH&iRb4eyqw4l-$fAs@o{38 zl@@SbvDP4+uf7KdrG)$vG06>Y;VQ)`zWTTqdqielto)Sa4B-f2q;ZA92i>K! zuom^y&(`0wpBa^j6d{(9hUr_#xMuBB$w&(_S#WFF$&w*1wD?cW%!1Db3 z4$m=^w*T?65LnZ<$n?-+%4|trI#+b_IX?oKHh3~ zTv)&BD4!0NlO`B0Cen}RX2u@q*mX2Mw*Rh!Sts-y|9%gB^R08fJ6%~z`FF!cZ>j{p z_q_C+grmQz*Ry;uljm0WaL}$p`VPqF%i0dHJn;z~rEkq06PxgvZc!Yl<6a9du z*M}}F=}b2C=w<1h?mB4qkzOUSSK24uwCy)FgtmydItOP=QqhoLNPo9JkyHJVoU5sR zzY{~M?+?nSl3m&Chz4&f*~x0|Eq%wXk0rh)TBgRNpDf(5>wSGk);qh7>i2VDmQNcm z$kiU(#JVneM4yr!ypEoR#g|?7DuD^T@AFsDvT%pKU8X1fT#T=xme}i(Z8j&Bn@4Z2 z?>fqdCU4Bw7vzLq5Gd7$t{`@*pU$4&pvM&ushYv!7o3>9L?Z4yy$f{ia>>z%YEH9NQl8;f#Cqa4enW|7uX*(ww zxAJ9gK3(F7W@)Sb>HO=pzZv2Guf1=9bE>-bK9dRFfndaE5mAo_c2MA+oV+v1ITJFO z2h59^K|s+=CdteM@-oT5fKYiql(wkUqNO@T1XOP2Dz?-|ML>%dEj~)A(iV`mXtkpC ztu^0&?Q@dJ%w+uf^?vt$_xD{7tl9glz1G@$uf5jV`<(2Ze0XVB6F#k3_8NS_K78z1 zt6n09#Ns4N%HrL?F9|=*z9js>#~=P>8|)izm)_4Zu=S237Lnu4 zp*W|4$b_2{Kq0gs$dtTt3co!0Ed2JHM8+dNe+7Dxej;~c& zyDwSNb+#QZep0%t(7=lz2}qJL{hDaYPv>E*Qx0SHQl79J!-l|O?Rm2PBq=7rn}Yj z2{qlLru)_OfSMju(?e?ds+t~A)1zv7jHOwd!S@wh_h!fSxqd?fnR5IN3C5bEJf;8L zFPbR`sJ+>%6@4fNZr@Xx%pO@O$1O+C(3F0C{r{nXNVu&d5b&jZ!TI7u!=zv&!ufp3 zP)9hG4kdl9^q=O$9%wb}2-XBPZ=Y`V?vN+!iceA^(#@C$oC)1@} zv4p=X6&jCHTtg?LBEBLtFB}N*HL-9y?2m*O`qSZfjIVUp)Ossax*7hIKN0@lQ4Vc` zIA41_83<8Zvvp8Yl}2O*)OSVOLP)@hWt^5j#PtwHii7baIAy(cLl?7J{3x*ahKxTlkq5orHE*#yI)y25<(Fl zjE7QuES}~=-5A_7p(7Ybq;&&es?E5f1R} zXnY@K4Q0*b+gaz7VN`Ue4s5)gPbXoiDISL8smL4X0R+7^pvYu=d|QY{3&R-9la4VO zNRvv(lkkmjOsNr>_IO_&cPbU`h=HauoJ^%B@U?#W>*-1+LosChu^?X`>Q1XIR`dcw zRi5Hp#M1|%viHIDN>N4_?QQ9V>+^m9JX2LkI?gGaO+a&$at8&OsjSizh-cer{+17p3u^7mwtX1tRfOh!qaamSUhfK+UJp{&ZK) zr~8-A^GCWuS%>dmml3vY@x z)S}8{D3sGs9y#G!$Woc^SriIHLjJtaq-xdE>5s)ik>+$f!C%EUvlfw1+^9w5&JZ`B zqhH-jO^U=jxS^O7(AKm+fbdOKp#Ugf!k_NUdN&shgquULphp>ZcWIDC#3HUv4nWlfRyRNA0dZYkkuJHs?j~Y*_*p-ZfR)D-FRvnSkcg$j#xZN%!);*hRdhIF-#^cZhn3k zy-%gtUv#k7viOJ4@R#tI?~FG1*y3M8TMS?&%dZ4JaE*RZDZW+Za#5coF>ukc<<=AlKVKwIg*66^g!ejhDM#UHtaZ=A4e5}1 zVltE>ho?!JSNe<}vh|a#hTE0JMIRq$3!HpvRaV~+fklu)ldmo6O=VL3V#)=;0jWF zMOj}4m5>|CVz|%W)m;@zV}AAc6DfBo1!II@Wxk~Vjj@@)M-o)(XHhxOMtN4C*m1rb zEJ$I_Ov(Te!TCz58qa&{#{zR8AEp3SbuSlgX&yl2N+UM4r}^eY$UhfRmRYYdUxJ1_ zg3&aEJ37CDh|!?;**TZZw+jDICSEmfwH(1uEhO9LziPf#7wpPh4nAca|H8q8E_^+@ z{KCOn*=RJ%cinj*o}4+{AC&I8^G*qPi7OxN0nUfK3n_Q^yW5_fY8_SH*ias=g9FXy zlUV{sFS2b5=`L^7U^2jUTaUMQKO=sqqui3a+sc-q2g%!v!}ETPcW z7)7qeV&d9nlt=ffus$!J#ri&x|Ef z&0M{|o~wx=e3WuAu8WJ{-+1V$G}aY~jOQAgYU*1mecqXk4fWpo7GFh8RZUAXch$si z^1|gb2GWh?(FYeRFk+#S-nc+XkL8u!jr>aWK7zDG%?DK4tc-sqO)OICt5DO6k$wdE zx2yMO<<(J{m+xPf<|ai>KK>0=Mn0~8{xOwiGW76g=-@HHw*jpHs+(}xHe}QBz>(~O zdF@$`JeB9ynavX(!$b@11#HX&jytdx@8DD@zZrP~ZjbEu!~@$_zbrp;p!Js0o1c|G zUvN+3xfQR-+RqmM@PdgOoZ>ZA)9Ie$mH>D+-guRB+%Z58fFpnIb76BncOhVLA8h}d z(<E;ciqDagCxJlTIbp0j!pE!)vbj62rhkLjs$E*wXxjkIZk(Dz{^E}*v`i|(+4|+J) zt*s|#9`}^5d$jxFht98PeD}oRlcT0q-1h6bGk$e?Nd@Gx>xs2TzW?yco1DgN+kbue zM>TfWwht=)e%5{B55K?eS0#^KJI)i|5iC990GlVWJbhBN{%^#FJo@PF+bci(RDQF# z!B!_;EPPr$f7vz8r&2fluHpQyK0J9hRUVInFRiMdKAyKsGETzCa@^oJM9``klj6w^ z9yAjf!$d=lQ{nqZX#UaqzNY)f$L62YRh}t)o&8VH0Q)!{a*Gx=aYc(tiY^+i)vhT* zkO7XiEgicwlbMN>bL&f%Ydm^h)1)tP@6+QWT8{ALfYE#=a{?*Rtk$^o!&eo%^&^&R zLG9O{hribj(~t1%(+_t)3*KMowUxSs41YcQI~}FoKBW*v?b-y`3E2~oau5?lt%TnN zH~>7GWP$gocp~fH586RX{UG||M1VG~)J#5eh<8=-a;;|Xuzl`l-Or%Y6*@*&4U%=2 zWipfUY3C4u(k4RpuY-7~juqf*hwiA3RiuaI#c17i`tzpf`9}T7Iz3;n9}SFV4ohPC z5!JY9(+`JkN}wCkDFxn6!1ghj%$+35qZc&o!}QuJU8jCRonBZ>IuowfkHy~^`U%x~ zVJ6F0<&}c15wH`$jm>2Ks6k3{?qG8AxfD4Kz*p*kC!!Wsfu;ezXzjTrQdw|;s z9KJ}3*$a5Rdj4vr*CjyhLHQn(d$3P2Z;UGSdo-E{^iROLk-0{{lVw6`+NIyFsYXF@ zk!BbySRJWKUGeorV5vb#Di2?w(**UqnSkQ4MQUz32uZ|xR9k_uScjiW9!?D(;4e#x zG;w{zqeohyZ)K@hzlhS=`g9$kf2|ZZ!)L1Vd}gXHt?wkddWF3B_eK4D&a3kj@-rUI zID$5nSTh;&E3O$PIT`jaRR{IKK5x=%$%noG%@)vb&>^F#VWpZHka~1=Y?MIC{Ie9h zi@R~enfYg}e#8{uYr$3y{CeO|Dl&vzJ!Hk2dCUmw@=RJW&e@7tHZnsDv%io^h2p#urmZCZM81SdItL^Ck?X> z*6Fo9Afc}-8CjOeJVjrF&f*DteKp0rRa&?HyyZhY`h*5T&V#j#fL{+s%qwv}Ly9VX z1XeTv4{I7zLgN>4gLAIF)6H_z^}(sQ$H?a27vEFd7olnBd(YzL4z$sPuaujh+F33h zkxRpq1Xx2Z?$qkK8P1z$$sQHAn3ZU%lq9a_X{>H!cZ-ypX-WbLDr!*@5K{O+)15j4yrHLOH(f$xAe~dj1C3kqOx~z;^>bk^<%c z9}Tmm%I%Y2-b3m-XdE+^@|u@ETo;g{$dIQofnfU{F7M0Ix#M4^%m9tVo=4l))}3f&UMPLr@0U*cL$bEZ8;0 z!#Vxebb{t2CK80U+;VOTbU0YQmOupc>%cXc%qWtFeyQ!wkC%c5!!@8iH98HV@Bp-1 z2UjY9#WH39cIsEOjoM6YtG%{&&CmhsAFMB=n=Ji8@&f*by$oHz)sf9Eg-?IBfH%M_yYC6sMeqJaba4X z|5WODlpg@}%*L8a9mnN}bB&tY)Bse)1=b=PGwEl5c}k8TxrX5aymnObm zKiA9}riN7YS;Pjq@>X>oV7i1c1QiWZ{WDSCi1Kf%a%enwT9GkjyJ^8!0t>;?-j~DC zoI>BYyd8XN^Y{b=DU}Uw#B$_1+(^J4(3ki#8IkDyG^Vxe0gz-JMcD+D)l#5G8`-m! zs)OPV4ST#&wBXj!m=6bCZ4hh29DTpFQI~g(-pt<$E8&6xg8`AZD@KtnXG6x6p!2xolUWEMIO$BJb z0N+vYb*VO<|9ni99_$xOYjp8`7^UCz{T=7c$z;BVwNJr*W6fDyqb<7Ox17;uT+aguUH#WGoxqI-Y+9Ph(9b55oLqb< z*G$*jJo@sR^riTVfSy}WxOG@N=k6x!>htvL)@gi<0aJ5s`C0=*r9Q3!>{*8AW~6y_ zd0`O?`^Z3X3t%@uSf0tuRogZo_R?(m8dQokK%X#ML$1ZJp1jq)m;8kX&{?zU6`9Ox zkyB=F~pul@c1a;1}{3u7Rv!6S7tKvkdpj-o1&0~ z)mfkU*@K2H0ckg&6@1ab`b!4+aDo21b#(=>Q*})Ru+=&Z9!>`+ht^qx^?L={Mg2Cd z!aRHdGAxetiwl+do}yx*P+*v>OQOR5&stLk!4}sKDM0;|YjUy`YTy1JWHR(~+XdU_ z(T~;qyny5?a_9lAWA%-Ns5D^Rrc6dcs@O^bvjCQkRZ2q3&%yLYZ6Y9k7MoRD!#cI3 z0(>TvIRQIR&bDC=uoYetfUTg8+**zrM(cNK*9YL^khmChgyHh`oYv^f64>Q(&+a|yk>6mC>rJYYWU<4taz4djOauYxzI z^0McJwA$J#HuX}gYSm?b_SF^BBYg>WNl))P(*f&v1VqiZU^V^Y4jh^ESPTB$;2%eI zqmO>{h{h)f{2}1!yxJf(+FCrj@c6WXWef3b&SdCU8wTMQ*n+%&yDG8TrFVyk0&Pab zu3?3W4V7TMF#O(3=AyytXw>|vu*dLdRyFwF20z&iwNafWxp8xo0nrzEp!X)BsQS=ro1a@8oABcO>TH z+O3()JID{J^YsPfdUf=`F`&Av|0W>!B;;N}a&eK}(A9sAUIHBXU&;OOnZflXz_bh0 zg%{HUurP)KSTuJ{0W?;+$~9Q~sBJ7hJdnxIYg}fB$0|`1}Sl3uEin z7qQp7^kFVRDefBq-GDm)<#4*Eksd=T)Zp1ez+Bj@N2*ufYX4# z1I|R532+@?B>J9kl-rEdf75FAUfIg#Rz+i@dZ?i*jV)AJ@dYrf<-K^dvVn+v zy54rEbiIiG*m(Y*a3AfVu~4q_9w_1>n~S(l@^BM?TLYZ-N4<1T;5Gm^JP$V$xJ|%~ z&ckg2ZU=BP^KiR>I|W>49?tY2>ICj+94{1l$4G4){6XHNa_r zc02S8m;jgzm;#sym;+b{SP!6UtD5da`g6dGfFpoofK!0efX@Kh`-?a|-~s>-CF6f7gCphk01y>jD#!)ln zFoHW6R5xWpwkjvT+=IRU=@1!}!b@j>R92;kPAE~S+AdFp4{c>#G$s(Y5vM^=jBU@6P(#}sBKw0jE4U?| zs|~wZe5rIY*p)o<`LOfe7xkkj7Z>?L$z%+H=|@GraJ-G< z%C!Ercrwj-wf=NG%yCn+Fe&JS<7Q~v**OD_yGGmI9_dQq)j^xKoz5t5L2Y{i#~IS? zTsv}I=>RuZODB3bZl1P%J`5AN8?_y<(imRC-L0jq)e(vcxVu*yRcm-i8x2JRi3NCC z*Q(;UUusjKv_j4u(xz1OtJ+j5;HRC&hqdTvzz=;LVY$vEzEqdxqKKHUvm8l0PPqu0 z%AKNIG62H2D2M-u;zQC?KxLi^rKAz~e+H<&tn46UWWil=HI4!s#Yq*lwG^Ma zQTAU6Q@u^~-dfZTL!|oGq5f!UULcuPFg>{ce+BvN*oAiB09;dVOR2R3FFJd`5qy39 zkJLcX9(Qy!;MFd7RJ-%*?|1kgWdtMe&K%Rg8Nyk@m4YnXDm*0|6kZapH3ST|7;ZN_ zj;|j(Zg|u1r9m%_5-$@=MWa|N2F0kjOxz|uEdEUVllY-{rtuu(MMjfRHhPT>#-wqL z@lNBj##fB58$U6A!&G6aGtDq{npT_cHvQDJ$Mme}HPiX#E6o3Do@Tz@yw<$m{I>aH zbH>bDES73Zqa|!vYFTaBXnEYS-*Uq8p55%lA^o4Y;e33jxw#Zd-z1%LxcU5`QTk7LST2#ZN@e zc)oF*Q8HEf&6ZQgEv*!){_iRFBY$+7|?@rGrrb-Y!yPPfjr zF1D_;Zn55P{h9Sm>shvH+fv*2Y(KW`wf({NH`_&all@xzE%q(;Cou*z0%tp}aD3bG zh~pW@UmRzbU0L?8Ws}QhmMt#3r|c(XFO|Jj_HLQRInp`N+2CwZ-(81X@43EoT_#;AO_SQB+ogM@UD8w1ucY^+v*o$+Vrc#c z@_q8pf^g)cltDOiQU{swHmuj^*DhyDhITb5-%`LGS(Zn7~eFGH-$|%!p|Qu zJ!5*w^t$O?({S@B^F(tc{5)y?u6c*~IrGcrqwx2?n}=A&Sgx{|Endqk%RE@vM$1mi z3zox{W0p@WrPc~-oweQiE$dy@N36fF{sC5YmCb9r&UW1Pfz4`fwkPfD?f2WCwjZ^h zwhwh&4DHlAzUA29*y{L+qp0kXGHY35S!da@vQ4nDL$EQe^Ae}oxybn=*w#DFajs6+ zQrE4nVbWDnmE@OF(oNDG(pKqV>7aC6dS99$2jvy=&GPrn)%IBfQf&?qNRoDV; z>=OPc6dUvgqrq=T88#TU!do9VJk31zZ-y&Gw>ZP-hrP@XKzUg+82^zl)o_o9X zecPYympXioeU6tLzi}K#9Be6j-g%*G0&HTdYnN-SbcS3?eO<47-ZECG66#HdY`?Qz zZvVI}Q#OP?VC-SV+&7Jl#+Y#_eBmDB1BfuMqethME`uKgOi|N3)4yZn-!=_JM6sA% z=78C3+icrm+h@Dbe!1OX4#KclwpRQ5Dz1oH4v!Whh8qTmoF3sZz9 z;ToY$m?I>Gg~Br7X5lvBE@89qfbg*Jn6OuPUU*q(6Xzh3F2p=`vv`|$m$+Gc0Q1>n z;$C?C%i?R|3GprQeep9j(rl>}^F=3SjD(biw=Ke`u8`J9>!kJYyN%K&sYlu(ZI^aPI}yWnOHW`%*)JV{ z{T-5Cm5xY9;g=_+Q_|bgY3T#$6U;Q6td(cWt+32aIU*$UEg-@^1MFd5^qbJ|G{I56Q2}N93dOG5I87+VFG$+5^RD~C`TNq7HWk?p#?rLTWA%6LZ=WB5<*(&Mr2(g ztPs`+>xA{f24SPHN$7!>Y!`M2JK-t2g(rkP!hYe1a8x)ZoD@z8P}oj