From 7fa1149944a963f4c982e00ccbb1db505e8b23f7 Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:50:58 +0530 Subject: [PATCH 1/9] Update my utilities mods for 1.7.37+ (API 9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit icons_keyboard: • Additional code which was added for compatibility between different versions of API 8 was removed; • Removed PLUGIN functionality (not required anymore) • Use default `# ba_meta export` class • No longer imports the whole babase module, only the necessary one's floater: • No longer requires a compulsive function to always show the party chat icon, hence, removed. • Add the missing JUMP_RELEASE button --- plugins/utilities/floater.py | 5 ++--- plugins/utilities/icons_keyboard.py | 16 +++++----------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/plugins/utilities/floater.py b/plugins/utilities/floater.py index bbd9a89..90099a0 100644 --- a/plugins/utilities/floater.py +++ b/plugins/utilities/floater.py @@ -269,7 +269,6 @@ def new_chat_message(*args, **kwargs): bs.chatmessage = new_chat_message # ba_meta export plugin - - class byFreaku(babase.Plugin): - def on_app_running(self): pass + def on_app_running(self): + pass diff --git a/plugins/utilities/icons_keyboard.py b/plugins/utilities/icons_keyboard.py index f42e1d6..ce7061d 100644 --- a/plugins/utilities/icons_keyboard.py +++ b/plugins/utilities/icons_keyboard.py @@ -10,10 +10,10 @@ # ba_meta require api 9 import bauiv1 -import babase +from babase import SpecialChar from babase import charstr -list_of_icons = [i for i in babase.SpecialChar] +list_of_icons = [i for i in SpecialChar] list_of_icons = [charstr(i) for i in list_of_icons] list_of_icons.reverse() @@ -21,7 +21,8 @@ for i in range(26 - (len(list_of_icons) % 26)): list_of_icons.append('‎') -class IconKeyboard(babase.Keyboard if hasattr(babase, 'Keyboard') else bauiv1.Keyboard): +# ba_meta export bauiv1.Keyboard +class IconKeyboard(bauiv1.Keyboard): """Keyboard go brrrrrrr""" name = 'Icons by \ue048Freaku' chars = [(list_of_icons[0:10]), @@ -31,11 +32,4 @@ class IconKeyboard(babase.Keyboard if hasattr(babase, 'Keyboard') else bauiv1.Ke pages = { f'icon{i//26+1}': tuple(list_of_icons[i:i+26]) for i in range(26, len(list_of_icons), 26) - } - - -# ba_meta export plugin -class byFreaku(babase.Plugin): - def __init__(self): - babase.app.meta.scanresults.exports['babase.Keyboard' if hasattr( - babase, 'Keyboard') else 'bauiv1.Keyboard'].append(__name__+'.IconKeyboard') + } \ No newline at end of file From ca8fcd8c2231ce112265d2a71ed555dbe6d47682 Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:53:59 +0530 Subject: [PATCH 2/9] Update my minigames for 1.7.37+ (API 9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit arms_race: • Fixed a warning error getting on curse_time being less than zero. --- plugins/minigames/arms_race.py | 14 ++++++++++++-- plugins/minigames/frozen_one.py | 2 +- plugins/minigames/icy_emits.py | 26 ++++++++++++-------------- plugins/minigames/memory_game.py | 3 ++- plugins/minigames/musical_flags.py | 2 +- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/plugins/minigames/arms_race.py b/plugins/minigames/arms_race.py index 084edb8..8fcb78a 100644 --- a/plugins/minigames/arms_race.py +++ b/plugins/minigames/arms_race.py @@ -1,3 +1,10 @@ +# Ported by your friend: Freaku + +#Join BCS: +# https://discord.gg/ucyaesh + + + # ba_meta require api 9 from __future__ import annotations @@ -30,8 +37,11 @@ class State: enable_bomb=self.bomb, enable_pickup=self.grab) if self.curse: - spaz.curse_time = -1 - spaz.curse() + try: + spaz.curse_time = -1 + spaz.curse() + except: + pass if self.bomb: spaz.bomb_type = self.bomb spaz.set_score_text(self.name) diff --git a/plugins/minigames/frozen_one.py b/plugins/minigames/frozen_one.py index 9b0c9ba..0a98b0c 100644 --- a/plugins/minigames/frozen_one.py +++ b/plugins/minigames/frozen_one.py @@ -6,7 +6,7 @@ import bascenev1 as bs from bascenev1lib.game.chosenone import Player, ChosenOneGame -# ba_meta require api 8 +# ba_meta require api 9 # ba_meta export bascenev1.GameActivity class FrozenOneGame(ChosenOneGame): name = 'Frozen One' diff --git a/plugins/minigames/icy_emits.py b/plugins/minigames/icy_emits.py index f5467e3..1fd86ab 100644 --- a/plugins/minigames/icy_emits.py +++ b/plugins/minigames/icy_emits.py @@ -2,20 +2,19 @@ import babase -import bascenev1 as bs -import random +import bascenev1 as bs, random from bascenev1lib.actor.bomb import Bomb from bascenev1lib.game.meteorshower import Player, MeteorShowerGame -# ba_meta require api 8 +# ba_meta require api 9 # ba_meta export bascenev1.GameActivity class IcyEmitsGame(MeteorShowerGame): name = 'Icy Emits' @classmethod def get_supported_maps(cls, sessiontype): - return ['Lake Frigid', 'Hockey Stadium'] + return ['Lake Frigid','Hockey Stadium'] def _drop_bomb_cluster(self) -> None: delay = 0.0 @@ -25,24 +24,23 @@ class IcyEmitsGame(MeteorShowerGame): pos = (-7.3 + 15.3 * random.random(), 5.3, -5.5 + 2.1 * random.random()) dropdir = (-1.0 if pos[0] > 0 else 1.0) - vel = (0, 10, 0) + vel = (0,10,0) bs.timer(delay, babase.Call(self._drop_bomb, pos, vel)) delay += 0.1 self._set_meteor_timer() def _drop_bomb(self, position, velocity): - random_xpositions = [-10, -9, -8, -7, -6, -5, - - 4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - random_zpositions = [-5, -4.5, -4, -3.5, -3, -2.5, -2, - - 1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] - bomb_position = (random.choice(random_xpositions), 0.2, random.choice(random_zpositions)) - Bomb(position=bomb_position, velocity=velocity, bomb_type='ice').autoretain() + random_xpositions = [-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10] + random_zpositions = [-5,-4.5,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5] + bomb_position = (random.choice(random_xpositions), 0.2,random.choice(random_zpositions)) + Bomb(position=bomb_position, velocity=velocity, bomb_type = 'ice').autoretain() + + # ba_meta export plugin class byFreaku(babase.Plugin): def __init__(self): ## Campaign support ## - randomPic = ['lakeFrigidPreview', 'hockeyStadiumPreview'] - babase.app.classic.add_coop_practice_level(bs.Level( - name='Icy Emits', displayname='${GAME}', gametype=IcyEmitsGame, settings={}, preview_texture_name=random.choice(randomPic))) + randomPic = ['lakeFrigidPreview','hockeyStadiumPreview'] + babase.app.classic.add_coop_practice_level(bs.Level(name='Icy Emits', displayname='${GAME}', gametype=IcyEmitsGame, settings={}, preview_texture_name=random.choice(randomPic))) diff --git a/plugins/minigames/memory_game.py b/plugins/minigames/memory_game.py index 5ab2502..5e8d6a0 100644 --- a/plugins/minigames/memory_game.py +++ b/plugins/minigames/memory_game.py @@ -16,7 +16,7 @@ from __future__ import annotations # def spawnAllMap(self) -# ba_meta require api 8 +# ba_meta require api 9 from typing import TYPE_CHECKING, overload import _babase import babase @@ -27,6 +27,7 @@ if TYPE_CHECKING: from typing import Any, Sequence, Optional, List, Dict, Type, Union, Any, Literal + class OnTimer(bs.Actor): """Timer which counts but doesn't show on-screen""" diff --git a/plugins/minigames/musical_flags.py b/plugins/minigames/musical_flags.py index 7934c10..f5aa47c 100644 --- a/plugins/minigames/musical_flags.py +++ b/plugins/minigames/musical_flags.py @@ -31,7 +31,7 @@ class Team(bs.Team[Player]): self.score = 0 -# ba_meta require api 8 +# ba_meta require api 9 # ba_meta export bascenev1.GameActivity class MFGame(bs.TeamGameActivity[Player, Team]): name = 'Musical Flags' From f7be182fa298cfa2176718b907eadf949176634a Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:58:08 +0530 Subject: [PATCH 3/9] Use proper snake_case naming for `volley_ball.py` Update for 1.7.37+ (API 9) --- plugins/minigames/{volleyball.py => volley_ball.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename plugins/minigames/{volleyball.py => volley_ball.py} (99%) diff --git a/plugins/minigames/volleyball.py b/plugins/minigames/volley_ball.py similarity index 99% rename from plugins/minigames/volleyball.py rename to plugins/minigames/volley_ball.py index 5642d85..0653dff 100644 --- a/plugins/minigames/volleyball.py +++ b/plugins/minigames/volley_ball.py @@ -32,7 +32,7 @@ """ -# ba_meta require api 8 +# ba_meta require api 9 from __future__ import annotations From f76c69f2a05e178d0f7f5a36f6b24e04dfc4b8eb Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 17:03:05 +0530 Subject: [PATCH 4/9] Update JSON files --- plugins/minigames.json | 8 +++++++- plugins/utilities.json | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/minigames.json b/plugins/minigames.json index 2e41b66..88cf5b4 100644 --- a/plugins/minigames.json +++ b/plugins/minigames.json @@ -39,6 +39,7 @@ } ], "versions": { + "2.0.0": null, "1.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -58,6 +59,7 @@ } ], "versions": { + "2.0.0": null, "1.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -296,7 +298,7 @@ } } }, - "volleyball": { + "volley_ball": { "description": "Play Volleyball in teams of two", "external_url": "", "authors": [ @@ -307,6 +309,7 @@ } ], "versions": { + "3.0.0": null, "2.0.1": { "api_version": 8, "commit_sha": "d511c15", @@ -338,6 +341,7 @@ } ], "versions": { + "3.0.0": null, "2.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -363,6 +367,7 @@ } ], "versions": { + "3.0.0": null, "2.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -666,6 +671,7 @@ } ], "versions": { + "2.1.1": null, "2.1.0": { "api_version": 9, "commit_sha": "17e968d", diff --git a/plugins/utilities.json b/plugins/utilities.json index 80ceea2..c6e6f92 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -655,6 +655,7 @@ } ], "versions": { + "2.0.3": null, "2.0.2": { "api_version": 9, "commit_sha": "2c66eac", @@ -975,6 +976,7 @@ } ], "versions": { + "3.1.1": null, "3.1.0": { "api_version": 9, "commit_sha": "bb129cc", From 6bf081a5860196ccf1e6ebd11948eaa64fdf6f24 Mon Sep 17 00:00:00 2001 From: Freaku17 <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 11:38:16 +0000 Subject: [PATCH 5/9] [ci] auto-format --- plugins/minigames/arms_race.py | 3 +-- plugins/minigames/icy_emits.py | 24 +++++++++++++----------- plugins/minigames/memory_game.py | 1 - plugins/utilities/floater.py | 2 ++ plugins/utilities/icons_keyboard.py | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/plugins/minigames/arms_race.py b/plugins/minigames/arms_race.py index 8fcb78a..cb797dd 100644 --- a/plugins/minigames/arms_race.py +++ b/plugins/minigames/arms_race.py @@ -1,10 +1,9 @@ # Ported by your friend: Freaku -#Join BCS: +# Join BCS: # https://discord.gg/ucyaesh - # ba_meta require api 9 from __future__ import annotations diff --git a/plugins/minigames/icy_emits.py b/plugins/minigames/icy_emits.py index 1fd86ab..edc4e04 100644 --- a/plugins/minigames/icy_emits.py +++ b/plugins/minigames/icy_emits.py @@ -2,7 +2,8 @@ import babase -import bascenev1 as bs, random +import bascenev1 as bs +import random from bascenev1lib.actor.bomb import Bomb from bascenev1lib.game.meteorshower import Player, MeteorShowerGame @@ -14,7 +15,7 @@ class IcyEmitsGame(MeteorShowerGame): @classmethod def get_supported_maps(cls, sessiontype): - return ['Lake Frigid','Hockey Stadium'] + return ['Lake Frigid', 'Hockey Stadium'] def _drop_bomb_cluster(self) -> None: delay = 0.0 @@ -24,23 +25,24 @@ class IcyEmitsGame(MeteorShowerGame): pos = (-7.3 + 15.3 * random.random(), 5.3, -5.5 + 2.1 * random.random()) dropdir = (-1.0 if pos[0] > 0 else 1.0) - vel = (0,10,0) + vel = (0, 10, 0) bs.timer(delay, babase.Call(self._drop_bomb, pos, vel)) delay += 0.1 self._set_meteor_timer() def _drop_bomb(self, position, velocity): - random_xpositions = [-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10] - random_zpositions = [-5,-4.5,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5] - bomb_position = (random.choice(random_xpositions), 0.2,random.choice(random_zpositions)) - Bomb(position=bomb_position, velocity=velocity, bomb_type = 'ice').autoretain() - - + random_xpositions = [-10, -9, -8, -7, -6, -5, - + 4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + random_zpositions = [-5, -4.5, -4, -3.5, -3, -2.5, -2, - + 1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] + bomb_position = (random.choice(random_xpositions), 0.2, random.choice(random_zpositions)) + Bomb(position=bomb_position, velocity=velocity, bomb_type='ice').autoretain() # ba_meta export plugin class byFreaku(babase.Plugin): def __init__(self): ## Campaign support ## - randomPic = ['lakeFrigidPreview','hockeyStadiumPreview'] - babase.app.classic.add_coop_practice_level(bs.Level(name='Icy Emits', displayname='${GAME}', gametype=IcyEmitsGame, settings={}, preview_texture_name=random.choice(randomPic))) + randomPic = ['lakeFrigidPreview', 'hockeyStadiumPreview'] + babase.app.classic.add_coop_practice_level(bs.Level( + name='Icy Emits', displayname='${GAME}', gametype=IcyEmitsGame, settings={}, preview_texture_name=random.choice(randomPic))) diff --git a/plugins/minigames/memory_game.py b/plugins/minigames/memory_game.py index 5e8d6a0..ae4cfa4 100644 --- a/plugins/minigames/memory_game.py +++ b/plugins/minigames/memory_game.py @@ -27,7 +27,6 @@ if TYPE_CHECKING: from typing import Any, Sequence, Optional, List, Dict, Type, Union, Any, Literal - class OnTimer(bs.Actor): """Timer which counts but doesn't show on-screen""" diff --git a/plugins/utilities/floater.py b/plugins/utilities/floater.py index 90099a0..45e9e76 100644 --- a/plugins/utilities/floater.py +++ b/plugins/utilities/floater.py @@ -269,6 +269,8 @@ def new_chat_message(*args, **kwargs): bs.chatmessage = new_chat_message # ba_meta export plugin + + class byFreaku(babase.Plugin): def on_app_running(self): pass diff --git a/plugins/utilities/icons_keyboard.py b/plugins/utilities/icons_keyboard.py index ce7061d..052bb4c 100644 --- a/plugins/utilities/icons_keyboard.py +++ b/plugins/utilities/icons_keyboard.py @@ -32,4 +32,4 @@ class IconKeyboard(bauiv1.Keyboard): pages = { f'icon{i//26+1}': tuple(list_of_icons[i:i+26]) for i in range(26, len(list_of_icons), 26) - } \ No newline at end of file + } From 4b76a45be904e2d91f6a5e8c706b1bb4de8cde17 Mon Sep 17 00:00:00 2001 From: Freaku17 <92618708+Freaku17@users.noreply.github.com> Date: Sat, 8 Feb 2025 11:38:20 +0000 Subject: [PATCH 6/9] [ci] apply-version-metadata --- plugins/minigames.json | 42 ++++++++++++++++++++++++++++++++++++------ plugins/utilities.json | 14 ++++++++++++-- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/plugins/minigames.json b/plugins/minigames.json index 88cf5b4..8f0673a 100644 --- a/plugins/minigames.json +++ b/plugins/minigames.json @@ -39,7 +39,12 @@ } ], "versions": { - "2.0.0": null, + "2.0.0": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "ae390fd99e657a19a553c29a48c4cff4" + }, "1.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -59,7 +64,12 @@ } ], "versions": { - "2.0.0": null, + "2.0.0": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "10c482f1843894f4376b6624df276cb7" + }, "1.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -309,7 +319,12 @@ } ], "versions": { - "3.0.0": null, + "3.0.0": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "ccfff509782e0f5d838fcc9813b4a3c7" + }, "2.0.1": { "api_version": 8, "commit_sha": "d511c15", @@ -341,7 +356,12 @@ } ], "versions": { - "3.0.0": null, + "3.0.0": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "67c9612e3bfdb0383737bcc1b32ef64b" + }, "2.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -367,7 +387,12 @@ } ], "versions": { - "3.0.0": null, + "3.0.0": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "d606c10308c2a42a604cc74dcf92c8d1" + }, "2.0.0": { "api_version": 8, "commit_sha": "48f9302", @@ -671,7 +696,12 @@ } ], "versions": { - "2.1.1": null, + "2.1.1": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "4feb8d6a90fee305ea70531fc9bb0e31" + }, "2.1.0": { "api_version": 9, "commit_sha": "17e968d", diff --git a/plugins/utilities.json b/plugins/utilities.json index c6e6f92..77594ac 100644 --- a/plugins/utilities.json +++ b/plugins/utilities.json @@ -655,7 +655,12 @@ } ], "versions": { - "2.0.3": null, + "2.0.3": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "e80d0282867e44f27d1efeadd13e1edf" + }, "2.0.2": { "api_version": 9, "commit_sha": "2c66eac", @@ -976,7 +981,12 @@ } ], "versions": { - "3.1.1": null, + "3.1.1": { + "api_version": 9, + "commit_sha": "6bf081a", + "released_on": "08-02-2025", + "md5sum": "53776b882b3c06be4d28a3d547984c46" + }, "3.1.0": { "api_version": 9, "commit_sha": "bb129cc", From e76a8232cec4e13ce48ae2f8dd89a3aa70f96c4d Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sun, 9 Feb 2025 11:44:26 +0530 Subject: [PATCH 7/9] Cancel `volleyball.py` rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • was breaking some stuff related to JSON --- plugins/minigames/{volley_ball.py => volleyball.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/minigames/{volley_ball.py => volleyball.py} (100%) diff --git a/plugins/minigames/volley_ball.py b/plugins/minigames/volleyball.py similarity index 100% rename from plugins/minigames/volley_ball.py rename to plugins/minigames/volleyball.py From 07f7a85f9e8da1920ccf351aa27db3bd5725bdce Mon Sep 17 00:00:00 2001 From: ! Freaku <92618708+Freaku17@users.noreply.github.com> Date: Sun, 9 Feb 2025 11:45:22 +0530 Subject: [PATCH 8/9] Update JSON files --- plugins/minigames.json | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/plugins/minigames.json b/plugins/minigames.json index 8f0673a..0a036af 100644 --- a/plugins/minigames.json +++ b/plugins/minigames.json @@ -308,7 +308,7 @@ } } }, - "volley_ball": { + "volleyball": { "description": "Play Volleyball in teams of two", "external_url": "", "authors": [ @@ -319,12 +319,7 @@ } ], "versions": { - "3.0.0": { - "api_version": 9, - "commit_sha": "6bf081a", - "released_on": "08-02-2025", - "md5sum": "ccfff509782e0f5d838fcc9813b4a3c7" - }, + "3.0.0": null, "2.0.1": { "api_version": 8, "commit_sha": "d511c15", @@ -1567,4 +1562,4 @@ } } } -} \ No newline at end of file +} From 9c1b0d1eb347bb958dd425606d2c5cf47a55edc4 Mon Sep 17 00:00:00 2001 From: Freaku17 <92618708+Freaku17@users.noreply.github.com> Date: Sun, 9 Feb 2025 06:15:42 +0000 Subject: [PATCH 9/9] [ci] apply-version-metadata --- plugins/minigames.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/minigames.json b/plugins/minigames.json index 0a036af..9f3727a 100644 --- a/plugins/minigames.json +++ b/plugins/minigames.json @@ -319,7 +319,12 @@ } ], "versions": { - "3.0.0": null, + "3.0.0": { + "api_version": 9, + "commit_sha": "07f7a85", + "released_on": "09-02-2025", + "md5sum": "ccfff509782e0f5d838fcc9813b4a3c7" + }, "2.0.1": { "api_version": 8, "commit_sha": "d511c15", @@ -1562,4 +1567,4 @@ } } } -} +} \ No newline at end of file