From e2931190f9b37fc4ec171cd348d85eb96ed591a3 Mon Sep 17 00:00:00 2001 From: Respawn Date: Tue, 10 Sep 2024 23:33:49 +0200 Subject: [PATCH 01/37] Renormalize line endings LF vs CRLF --- .../mod/resource/ui/menus/mode_select.menu | 686 +++++++++--------- 1 file changed, 343 insertions(+), 343 deletions(-) diff --git a/Northstar.Client/mod/resource/ui/menus/mode_select.menu b/Northstar.Client/mod/resource/ui/menus/mode_select.menu index f8afcf0ff..e0f511052 100644 --- a/Northstar.Client/mod/resource/ui/menus/mode_select.menu +++ b/Northstar.Client/mod/resource/ui/menus/mode_select.menu @@ -1,343 +1,343 @@ -resource/ui/menus/mode_select.menu -{ - menu - { - ControlName Frame - xpos 0 - ypos 0 - zpos 3 - wide f0 - tall f0 - autoResize 0 - pinCorner 0 - visible 1 - enabled 1 - PaintBackgroundType 0 - infocus_bgcolor_override "0 0 0 0" - outoffocus_bgcolor_override "0 0 0 0" - - MenuCommon - { - ControlName CNestedPanel - xpos 0 - ypos 0 - wide f0 - tall f0 - visible 1 - controlSettingsFile "resource/ui/menus/panels/menu_common.res" - } - - MatchmakingStatus - { - ControlName CNestedPanel - xpos 0 - ypos 0 - wide f0 - tall f0 - visible 1 - controlSettingsFile "resource/ui/menus/panels/matchmaking_status.res" - } - - NextModeImageFrame - { - ControlName RuiPanel - xpos 800 - ypos 160 - wide 860 - tall 418 - labelText "" - visible 1 - bgcolor_override "0 0 0 0" - paintbackground 1 - rui "ui/basic_border_box.rpak" - } - - NextModeImage - { - ControlName RuiPanel - pin_to_sibling NextModeImageFrame - pin_corner_to_sibling BOTTOM - pin_to_sibling_corner BOTTOM -// xpos -12 - ypos -12 - wide 480 - tall 240 - visible 1 - scaleImage 1 - rui "ui/basic_menu_image.rpak" - zpos 2 - } - - ModeIconImage - { - ControlName RuiPanel - pin_to_sibling NextModeImage - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner TOP_LEFT - xpos 0 - ypos -16 - wide 72 - tall 72 - visible 1 - scaleImage 1 - rui "ui/basic_image_add.rpak" - zpos 2 - } - - NextModeName - { - ControlName Label - pin_to_sibling NextModeImageFrame - pin_corner_to_sibling TOP - pin_to_sibling_corner TOP - ypos -20 - wide 840 - auto_tall_tocontents 1 - visible 1 - labelText "Foo" - textAlignment center - centerWrap 1 - font Default_43_DropShadow - allcaps 1 - fgcolor_override "255 255 255 255" - } - - NextModeDesc - { - ControlName Label - pin_to_sibling NextModeName - pin_corner_to_sibling TOP - pin_to_sibling_corner BOTTOM - xpos 0 - ypos 0 - wide 840 - wrap 1 - auto_tall_tocontents 1 - visible 1 - labelText "Bar" - textAlignment center - centerWrap 1 - font Default_27 - allcaps 0 - fgcolor_override "255 255 255 255" - } - - MenuTitle - { - ControlName Label - InheritProperties MenuTitle - labelText "#SELECT_GAME_MODE" - } - - ButtonRowAnchor - { - ControlName Label - labelText "" - - xpos 96 - ypos 160 - } - - BtnMode1 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 0 - navUp BtnMode15 - navDown BtnMode2 - - pin_to_sibling ButtonRowAnchor - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner TOP_LEFT - } - BtnMode2 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 1 - pin_to_sibling BtnMode1 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode1 - navDown BtnMode3 - } - BtnMode3 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 2 - pin_to_sibling BtnMode2 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode2 - navDown BtnMode4 - } - BtnMode4 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 3 - pin_to_sibling BtnMode3 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - //ypos 11 - navUp BtnMode3 - navDown BtnMode5 - } - BtnMode5 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 4 - pin_to_sibling BtnMode4 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode4 - navDown BtnMode6 - } - BtnMode6 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 5 - pin_to_sibling BtnMode5 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode5 - navDown BtnMode7 - } - BtnMode7 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 6 - pin_to_sibling BtnMode6 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode6 - navDown BtnMode8 - } - BtnMode8 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 7 - pin_to_sibling BtnMode7 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode7 - navDown BtnMode9 - } - BtnMode9 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 8 - pin_to_sibling BtnMode8 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode8 - navDown BtnMode10 - } - BtnMode10 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 9 - pin_to_sibling BtnMode9 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode9 - navDown BtnMode11 - } - BtnMode11 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 10 - pin_to_sibling BtnMode10 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode10 - navDown BtnMode12 - } - BtnMode12 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 11 - pin_to_sibling BtnMode11 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode11 - navDown BtnMode13 - } - BtnMode13 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 12 - pin_to_sibling BtnMode12 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode12 - navDown BtnMode14 - } - BtnMode14 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 13 - pin_to_sibling BtnMode13 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode13 - navDown BtnMode15 - } - BtnMode15 - { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 14 - pin_to_sibling BtnMode14 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode14 - navDown BtnMode1 - } - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ButtonTooltip - { - ControlName CNestedPanel - InheritProperties ButtonTooltip - } - - FooterButtons - { - ControlName CNestedPanel - xpos 0 - ypos r119 - wide f0 - tall 36 - visible 1 - controlSettingsFile "resource/ui/menus/panels/footer_buttons.res" - } - } -} +resource/ui/menus/mode_select.menu +{ + menu + { + ControlName Frame + xpos 0 + ypos 0 + zpos 3 + wide f0 + tall f0 + autoResize 0 + pinCorner 0 + visible 1 + enabled 1 + PaintBackgroundType 0 + infocus_bgcolor_override "0 0 0 0" + outoffocus_bgcolor_override "0 0 0 0" + + MenuCommon + { + ControlName CNestedPanel + xpos 0 + ypos 0 + wide f0 + tall f0 + visible 1 + controlSettingsFile "resource/ui/menus/panels/menu_common.res" + } + + MatchmakingStatus + { + ControlName CNestedPanel + xpos 0 + ypos 0 + wide f0 + tall f0 + visible 1 + controlSettingsFile "resource/ui/menus/panels/matchmaking_status.res" + } + + NextModeImageFrame + { + ControlName RuiPanel + xpos 800 + ypos 160 + wide 860 + tall 418 + labelText "" + visible 1 + bgcolor_override "0 0 0 0" + paintbackground 1 + rui "ui/basic_border_box.rpak" + } + + NextModeImage + { + ControlName RuiPanel + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling BOTTOM + pin_to_sibling_corner BOTTOM +// xpos -12 + ypos -12 + wide 480 + tall 240 + visible 1 + scaleImage 1 + rui "ui/basic_menu_image.rpak" + zpos 2 + } + + ModeIconImage + { + ControlName RuiPanel + pin_to_sibling NextModeImage + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner TOP_LEFT + xpos 0 + ypos -16 + wide 72 + tall 72 + visible 1 + scaleImage 1 + rui "ui/basic_image_add.rpak" + zpos 2 + } + + NextModeName + { + ControlName Label + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP + pin_to_sibling_corner TOP + ypos -20 + wide 840 + auto_tall_tocontents 1 + visible 1 + labelText "Foo" + textAlignment center + centerWrap 1 + font Default_43_DropShadow + allcaps 1 + fgcolor_override "255 255 255 255" + } + + NextModeDesc + { + ControlName Label + pin_to_sibling NextModeName + pin_corner_to_sibling TOP + pin_to_sibling_corner BOTTOM + xpos 0 + ypos 0 + wide 840 + wrap 1 + auto_tall_tocontents 1 + visible 1 + labelText "Bar" + textAlignment center + centerWrap 1 + font Default_27 + allcaps 0 + fgcolor_override "255 255 255 255" + } + + MenuTitle + { + ControlName Label + InheritProperties MenuTitle + labelText "#SELECT_GAME_MODE" + } + + ButtonRowAnchor + { + ControlName Label + labelText "" + + xpos 96 + ypos 160 + } + + BtnMode1 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 0 + navUp BtnMode15 + navDown BtnMode2 + + pin_to_sibling ButtonRowAnchor + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner TOP_LEFT + } + BtnMode2 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 1 + pin_to_sibling BtnMode1 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode1 + navDown BtnMode3 + } + BtnMode3 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 2 + pin_to_sibling BtnMode2 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode2 + navDown BtnMode4 + } + BtnMode4 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 3 + pin_to_sibling BtnMode3 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + //ypos 11 + navUp BtnMode3 + navDown BtnMode5 + } + BtnMode5 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 4 + pin_to_sibling BtnMode4 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode4 + navDown BtnMode6 + } + BtnMode6 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 5 + pin_to_sibling BtnMode5 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode5 + navDown BtnMode7 + } + BtnMode7 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 6 + pin_to_sibling BtnMode6 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode6 + navDown BtnMode8 + } + BtnMode8 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 7 + pin_to_sibling BtnMode7 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode7 + navDown BtnMode9 + } + BtnMode9 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 8 + pin_to_sibling BtnMode8 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode8 + navDown BtnMode10 + } + BtnMode10 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 9 + pin_to_sibling BtnMode9 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode9 + navDown BtnMode11 + } + BtnMode11 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 10 + pin_to_sibling BtnMode10 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode10 + navDown BtnMode12 + } + BtnMode12 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 11 + pin_to_sibling BtnMode11 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode11 + navDown BtnMode13 + } + BtnMode13 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 12 + pin_to_sibling BtnMode12 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode12 + navDown BtnMode14 + } + BtnMode14 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 13 + pin_to_sibling BtnMode13 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode13 + navDown BtnMode15 + } + BtnMode15 + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModeButton + scriptID 14 + pin_to_sibling BtnMode14 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + navUp BtnMode14 + navDown BtnMode1 + } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ButtonTooltip + { + ControlName CNestedPanel + InheritProperties ButtonTooltip + } + + FooterButtons + { + ControlName CNestedPanel + xpos 0 + ypos r119 + wide f0 + tall 36 + visible 1 + controlSettingsFile "resource/ui/menus/panels/footer_buttons.res" + } + } +} From 525f671513eb3f80775399ba34a879b528d9a7a4 Mon Sep 17 00:00:00 2001 From: F1F7Y <64418963+F1F7Y@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:43:36 +0200 Subject: [PATCH 02/37] Rework mode select menu (#624) Turns mode list from page based into a scrollable list that is categorised and supports filtering. --- Northstar.Client/mod.json | 4 + .../northstar_client_localisation_english.txt | 12 + .../mod/resource/ui/menus/mode_select.menu | 613 +++++++++++++----- .../ui/menus/panels/mode_select_button.res | 31 + .../scripts/vscripts/ui/menu_mode_select.nut | 582 +++++++++++++++-- 5 files changed, 1003 insertions(+), 239 deletions(-) create mode 100644 Northstar.Client/mod/resource/ui/menus/panels/mode_select_button.res diff --git a/Northstar.Client/mod.json b/Northstar.Client/mod.json index 44937a2b0..0d0cfc169 100644 --- a/Northstar.Client/mod.json +++ b/Northstar.Client/mod.json @@ -46,6 +46,10 @@ "Name": "modlist_reverse", "DefaultValue": "0", "Flags": "ARCHIVE_PLAYERPROFILE" + }, + { + "Name": "modemenu_mode_filter", + "DefaultValue": "-1" } ], "Scripts": [ diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt index 29d7cddf8..f7c5ee2d1 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt @@ -324,6 +324,18 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a "JSON_PARSE_ERROR" "Error parsing json response" "UNSUPPORTED_VERSION" "The version you are using is no longer supported" + // Mode menu + "MODE_MENU_PVPVE" "PvPvE" + "MODE_MENU_PVE" "PvE" + "MODE_MENU_PVP" "PvP" + "MODE_MENU_FFA" "FFA" + "MODE_MENU_TITAN_ONLY" "Titan Only" + "MODE_MENU_OTHER" "Other" + "MODE_MENU_CUSTOM" "Custom" + "MODE_MENU_ALL" "All" + "MODE_MENU_UNKNOWN" "Unknown" + "MODE_MENU_SWITCH" "Filter" + "AUTHENTICATION_FAILED_HEADER" "Authentication Failed" "AUTHENTICATION_FAILED_BODY" "Failed to authenticate with Atlas!" "AUTHENTICATION_FAILED_ERROR_CODE" "Error code: ^DB6F2C00%s1^" diff --git a/Northstar.Client/mod/resource/ui/menus/mode_select.menu b/Northstar.Client/mod/resource/ui/menus/mode_select.menu index e0f511052..bf07164e7 100644 --- a/Northstar.Client/mod/resource/ui/menus/mode_select.menu +++ b/Northstar.Client/mod/resource/ui/menus/mode_select.menu @@ -38,33 +38,53 @@ resource/ui/menus/mode_select.menu controlSettingsFile "resource/ui/menus/panels/matchmaking_status.res" } - NextModeImageFrame - { - ControlName RuiPanel - xpos 800 + MenuTitle + { + ControlName Label + InheritProperties MenuTitle + labelText "#SELECT_GAME_MODE" + } + + ButtonRowAnchor + { + ControlName Label + labelText "" + + xpos 96 + ypos 140 + } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// NEXT MODE PANEL +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + NextModeImageFrame + { + ControlName RuiPanel + xpos 740 ypos 160 wide 860 - tall 418 - labelText "" - visible 1 - bgcolor_override "0 0 0 0" - paintbackground 1 - rui "ui/basic_border_box.rpak" - } + tall 520 + labelText "" + visible 1 + bgcolor_override "0 0 0 0" + paintbackground 1 + rui "ui/control_options_description.rpak" + } NextModeImage { ControlName RuiPanel pin_to_sibling NextModeImageFrame - pin_corner_to_sibling BOTTOM - pin_to_sibling_corner BOTTOM -// xpos -12 - ypos -12 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner TOP_LEFT + xpos 0 + ypos 14 wide 480 tall 240 visible 1 scaleImage 1 - rui "ui/basic_menu_image.rpak" + rui "ui/basic_menu_image.rpak" zpos 2 } @@ -80,23 +100,24 @@ resource/ui/menus/mode_select.menu tall 72 visible 1 scaleImage 1 - rui "ui/basic_image_add.rpak" + rui "ui/basic_image_add.rpak" zpos 2 } NextModeName { ControlName Label - pin_to_sibling NextModeImageFrame - pin_corner_to_sibling TOP - pin_to_sibling_corner TOP - ypos -20 + pin_to_sibling NextModeImage + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + ypos -10 + xpos -10 wide 840 auto_tall_tocontents 1 visible 1 labelText "Foo" - textAlignment center - centerWrap 1 + //textAlignment center + //centerWrap 1 font Default_43_DropShadow allcaps 1 fgcolor_override "255 255 255 255" @@ -106,219 +127,463 @@ resource/ui/menus/mode_select.menu { ControlName Label pin_to_sibling NextModeName - pin_corner_to_sibling TOP - pin_to_sibling_corner BOTTOM + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT xpos 0 - ypos 0 + ypos 10 wide 840 wrap 1 auto_tall_tocontents 1 visible 1 labelText "Bar" - textAlignment center - centerWrap 1 + //textAlignment center + //centerWrap 1 font Default_27 allcaps 0 fgcolor_override "255 255 255 255" } - MenuTitle +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// FILTERS PANEL +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + FiltersPanel { - ControlName Label - InheritProperties MenuTitle - labelText "#SELECT_GAME_MODE" + ControlName RuiPanel + xpos 740 + ypos 682 + wide 860 + tall 156 + zpos -1 + + rui "ui/control_options_description.rpak" } - ButtonRowAnchor + BtnModeLabel { - ControlName Label - labelText "" + ControlName RuiButton + InheritProperties RuiSmallButton + labelText "#SEARCHBAR_LABEL" + textAlignment west + classname FilterPanelChild - xpos 96 - ypos 160 + wide 500 + xpos -18 + ypos -16 + + pin_to_sibling FiltersPanel + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeSearch + { + ControlName TextEntry + classname FilterPanelChild + zpos 100 // This works around input weirdness when the control is constructed by code instead of VGUI blackbox. + xpos -400 + ypos -5 + wide 390 + tall 30 + textHidden 0 + editable 1 + font Default_21 + allowRightClickMenu 0 + allowSpecialCharacters 0 + unicode 1 + + pin_to_sibling BtnModeLabel + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner TOP_RIGHT + } + + SwtModeLabel + { + ControlName RuiButton + InheritProperties SwitchButton + labelText "#MODE_MENU_FILTER" + ConVar "modemenu_mode_filter" + classname FilterPanelChild + wide 500 + ypos 2 + + pin_to_sibling BtnModeLabel + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode1 + BtnModeFiltersClear { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton - scriptID 0 - navUp BtnMode15 - navDown BtnMode2 + ControlName RuiButton + InheritProperties RuiSmallButton + labelText "#CLEAR_FILTERS" + textAlignment west + classname FilterPanelChild - pin_to_sibling ButtonRowAnchor - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner TOP_LEFT + wide 100 + ypos 2 + + pin_to_sibling SwtModeLabel + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode2 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// PANELS LIST +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + Panel1 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName CNestedPanel + classname ModeSelectorPanel scriptID 1 - pin_to_sibling BtnMode1 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode1 - navDown BtnMode3 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling ButtonRowAnchor + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode3 + + Panel2 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 2 - pin_to_sibling BtnMode2 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode2 - navDown BtnMode4 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel1 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode4 + + Panel3 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 3 - pin_to_sibling BtnMode3 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - //ypos 11 - navUp BtnMode3 - navDown BtnMode5 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel2 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode5 + + Panel4 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 4 - pin_to_sibling BtnMode4 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode4 - navDown BtnMode6 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel3 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode6 + + Panel5 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 5 - pin_to_sibling BtnMode5 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode5 - navDown BtnMode7 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel4 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode7 + + Panel6 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 6 - pin_to_sibling BtnMode6 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode6 - navDown BtnMode8 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel5 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode8 + + Panel7 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 7 - pin_to_sibling BtnMode7 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode7 - navDown BtnMode9 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel6 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode9 + + Panel8 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 8 - pin_to_sibling BtnMode8 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode8 - navDown BtnMode10 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel7 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode10 + + Panel9 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 9 - pin_to_sibling BtnMode9 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode9 - navDown BtnMode11 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel8 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode11 + + Panel10 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 10 - pin_to_sibling BtnMode10 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode10 - navDown BtnMode12 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel9 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode12 + + Panel11 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 11 - pin_to_sibling BtnMode11 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode11 - navDown BtnMode13 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel10 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode13 + + Panel12 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 12 - pin_to_sibling BtnMode12 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode12 - navDown BtnMode14 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel11 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode14 + + Panel13 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 13 - pin_to_sibling BtnMode13 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode13 - navDown BtnMode15 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel12 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT } - BtnMode15 + + Panel14 { - ControlName RuiButton - InheritProperties RuiSmallButton - classname ModeButton + ControlName "CNestedPanel" + classname ModeSelectorPanel scriptID 14 - pin_to_sibling BtnMode14 - pin_corner_to_sibling TOP_LEFT - pin_to_sibling_corner BOTTOM_LEFT - navUp BtnMode14 - navDown BtnMode1 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel13 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + } + + Panel15 + { + ControlName "CNestedPanel" + classname ModeSelectorPanel + scriptID 15 + + controlSettingsFile "resource/ui/menus/panels/mode_select_button.res" + wide %100 + tall 45 + + pin_to_sibling Panel14 + pin_corner_to_sibling TOP_LEFT + pin_to_sibling_corner BOTTOM_LEFT + } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// SLIDER +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + BtnModeListUpArrow + { + ControlName RuiButton + InheritProperties RuiSmallButton + //labelText "A" + wide 40 + tall 40 + xpos 2 + ypos 2 + + image "vgui/hud/white" + drawColor "255 255 255 128" + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeListUpArrowPanel + { + ControlName RuiPanel + wide 40 + tall 40 + xpos 2 + ypos 2 + + rui "ui/control_options_description.rpak" + + visible 1 + zpos -1 + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeListDownArrow + { + ControlName RuiButton + InheritProperties RuiSmallButton + //labelText "V" + wide 40 + tall 40 + xpos 2 + ypos -639 + + image "vgui/hud/white" + drawColor "255 255 255 128" + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeListDownArrowPanel + { + ControlName RuiPanel + wide 40 + tall 40 + xpos 2 + ypos -639 + + rui "ui/control_options_description.rpak" + + visible 1 + zpos -1 + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeListSlider + { + ControlName RuiButton + InheritProperties RuiSmallButton + //labelText "V" + wide 40 + tall 599 + xpos 2 + ypos -42 + zpos 0 + + image "vgui/hud/white" + drawColor "255 255 255 128" + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + BtnModeListSliderPanel + { + ControlName RuiPanel + wide 40 + tall 599 + xpos 2 + ypos -42 + + rui "ui/control_options_description.rpak" + + visible 1 + zpos -1 + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT + } + + // sh_menu_models.gnut has a global function which gets called when + // left mouse button gets called while hovering and has mouse + // deltaX; deltaY which we can yoink for ourselfes + MouseMovementCapture + { + ControlName CMouseMovementCapturePanel + wide 40 + tall 562 + xpos 2 + ypos -42 + zpos 1 + + pin_to_sibling NextModeImageFrame + pin_corner_to_sibling TOP_RIGHT + pin_to_sibling_corner TOP_LEFT } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Northstar.Client/mod/resource/ui/menus/panels/mode_select_button.res b/Northstar.Client/mod/resource/ui/menus/panels/mode_select_button.res new file mode 100644 index 000000000..b361e4faa --- /dev/null +++ b/Northstar.Client/mod/resource/ui/menus/panels/mode_select_button.res @@ -0,0 +1,31 @@ +resource/ui/menus/panels/mode_select_button.res +{ + BtnMode + { + ControlName RuiButton + InheritProperties RuiSmallButton + classname ModButton + labelText "please show up" + wide 600 + tall 45 + + pin_to_sibling ControlBox + pin_corner_to_sibling LEFT + pin_to_sibling_corner RIGHT + } + + Header + { + ControlName Label + InheritProperties RuiSmallButton + wide 600 + labelText "labelText" + font Default_41 + fgcolor_override "255 255 255 255" + tall 45 + + pin_to_sibling ControlBox + pin_corner_to_sibling LEFT + pin_to_sibling_corner RIGHT + } +} diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut index 605af3832..6cddee2af 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut @@ -1,81 +1,551 @@ +untyped global function InitModesMenu +global function NSSetModeCategory + +global enum eModeMenuModeCategory +{ + UNKNOWN = 0, + PVPVE = 1, + PVE = 2, + PVP = 3, + FFA = 4, + TITAN = 5, + OTHER = 6, + CUSTOM = 7 + + SIZE +} + +// List of blocked modes due to them being unfinished +const array blockedModes = +[ + "fd_easy", + "fd_normal", + "fd_hard", + "fd_master", + "fd_insane" +] + +struct ListEntry_t { + string mode + int category +} + +// Slider mouse delta buffer +struct { + int deltaX = 0 + int deltaY = 0 +} mouseDeltaBuffer struct { - int currentModePage + int scrollOffset + var menu + + string searchString + int searchEnum + + // Table of category overrides + table categoryOverrides + + // List of all modes we know + array modes + + // Sorted list of modes we want to show with categories included + array sortedModes } file const int MODES_PER_PAGE = 15 void function InitModesMenu() { - var menu = GetMenu( "ModesMenu" ) + file.menu = GetMenu( "ModesMenu" ) + + AddMouseMovementCaptureHandler( Hud_GetChild( file.menu, "MouseMovementCapture"), UpdateMouseDeltaBuffer ) + + AddMenuEventHandler( file.menu, eUIEvent.MENU_CLOSE, OnCloseModesMenu ) + AddMenuEventHandler( file.menu, eUIEvent.MENU_OPEN, OnOpenModesMenu ) + AddButtonEventHandler( Hud_GetChild( file.menu, "BtnModeListUpArrow"), UIE_CLICK, OnUpArrowSelected ) + AddButtonEventHandler( Hud_GetChild( file.menu, "BtnModeListDownArrow"), UIE_CLICK, OnDownArrowSelected ) - AddMenuEventHandler( menu, eUIEvent.MENU_OPEN, OnOpenModesMenu ) + AddButtonEventHandler( Hud_GetChild( file.menu, "BtnModeLabel"), UIE_CHANGE, FilterAndUpdateList ) + AddButtonEventHandler( Hud_GetChild( file.menu, "BtnModeSearch"), UIE_CHANGE, FilterAndUpdateList ) + AddButtonEventHandler( Hud_GetChild( file.menu, "SwtModeLabel"), UIE_CHANGE, FilterAndUpdateList ) - AddEventHandlerToButtonClass( menu, "ModeButton", UIE_GET_FOCUS, ModeButton_GetFocus ) - AddEventHandlerToButtonClass( menu, "ModeButton", UIE_CLICK, ModeButton_Click ) + AddButtonEventHandler( Hud_GetChild( file.menu, "BtnModeFiltersClear"), UIE_CLICK, OnBtnFiltersClear_Activate ) + + array buttons = GetElementsByClassname( file.menu, "ModeSelectorPanel" ) + foreach ( var panel in buttons ) + { + AddEventHandlerToButton( panel, "BtnMode", UIE_GET_FOCUS, ModeButton_GetFocus ) + AddEventHandlerToButton( panel, "BtnMode", UIE_CLICK, ModeButton_Click ) + } - AddMenuFooterOption( menu, BUTTON_A, "#A_BUTTON_SELECT" ) - AddMenuFooterOption( menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) - - AddMenuFooterOption( menu, BUTTON_SHOULDER_LEFT, "#PRIVATE_MATCH_PAGE_PREV", "#PRIVATE_MATCH_PAGE_PREV", CycleModesBack ) - AddMenuFooterOption( menu, BUTTON_SHOULDER_RIGHT, "#PRIVATE_MATCH_PAGE_NEXT", "#PRIVATE_MATCH_PAGE_NEXT", CycleModesForward ) + Hud_SetText( Hud_GetChild( file.menu, "SwtModeLabel" ), "#MODE_MENU_SWITCH" ) + SetButtonRuiText( Hud_GetChild( file.menu, "SwtModeLabel" ), "" ) + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtModeLabel" ) , "#MODE_MENU_ALL", "-1" ) + for( int i = 0; i < eModeMenuModeCategory.SIZE; i++ ) + { + Hud_DialogList_AddListItem( Hud_GetChild( file.menu, "SwtModeLabel" ) , GetCategoryStringFromEnum(i), string(i) ) + } + + AddMenuFooterOption( file.menu, BUTTON_A, "#A_BUTTON_SELECT" ) + AddMenuFooterOption( file.menu, BUTTON_B, "#B_BUTTON_BACK", "#BACK" ) +} + +void function NSSetModeCategory( string mode, int category ) +{ + if( mode in file.categoryOverrides ) + { + file.categoryOverrides[mode] = category + printt( "Overwriting category for mode:", mode ) + return + } + + file.categoryOverrides[mode] <- category +} + +void function OnBtnFiltersClear_Activate( var b ) +{ + file.searchString = "" + file.searchEnum = -1 + + SetConVarInt( "modemenu_mode_filter", -1 ) + Hud_SetText( Hud_GetChild( file.menu, "BtnModeSearch"), "" ) + + file.scrollOffset = 0 + + BuildSortedModesArray() + UpdateListSliderHeight(float(file.sortedModes.len())) + UpdateListSliderPosition(file.sortedModes.len()) + UpdateVisibleModes() +} + +void function FilterAndUpdateList( var n ) +{ + file.searchString = Hud_GetUTF8Text( Hud_GetChild( file.menu, "BtnModeSearch" ) ) + file.searchEnum = GetConVarInt( "modemenu_mode_filter" ) + + file.scrollOffset = 0 + + BuildSortedModesArray() + UpdateListSliderHeight(float(file.sortedModes.len())) + UpdateListSliderPosition(file.sortedModes.len()) + UpdateVisibleModes() } void function OnOpenModesMenu() { + RegisterButtonPressedCallback( MOUSE_WHEEL_UP , OnScrollUp ) + RegisterButtonPressedCallback( MOUSE_WHEEL_DOWN , OnScrollDown ) + + // Reset filters + file.searchString = "" + file.searchEnum = -1 + + // We rebuild the modes array on open menu to make sure + // all modes get listed + BuildModesArray() + BuildSortedModesArray() + + UpdateListSliderHeight(float(file.sortedModes.len())) + UpdateListSliderPosition(file.sortedModes.len()) UpdateVisibleModes() - - if ( level.ui.privatematch_mode == 0 ) // set to the first mode if there's no mode focused - Hud_SetFocused( GetElementsByClassname( GetMenu( "ModesMenu" ), "ModeButton" )[ 0 ] ) + + // Set to the first mode if there's no mode focused + if ( level.ui.privatematch_mode == 0 ) + { + array panels = GetElementsByClassname( file.menu, "ModeSelectorPanel" ) + foreach( var panel in panels ) + { + if( Hud_IsEnabled( Hud_GetChild( panel, "BtnMode") ) ) + { + Hud_SetFocused( Hud_GetChild( panel, "BtnMode") ) + break + } + } + } +} + +void function OnCloseModesMenu() +{ + try + { + DeregisterButtonPressedCallback( MOUSE_WHEEL_UP , OnScrollUp ) + DeregisterButtonPressedCallback( MOUSE_WHEEL_DOWN , OnScrollDown ) + } + catch ( ex ) {} } +string function GetCategoryStringFromEnum( int category ) +{ + switch( category ) + { + case eModeMenuModeCategory.PVPVE: return "#MODE_MENU_PVPVE" + case eModeMenuModeCategory.PVE: return "#MODE_MENU_PVE" + case eModeMenuModeCategory.PVP: return "#MODE_MENU_PVP" + case eModeMenuModeCategory.FFA: return "#MODE_MENU_FFA" + case eModeMenuModeCategory.TITAN: return "#MODE_MENU_TITAN_ONLY" + case eModeMenuModeCategory.OTHER: return "#MODE_MENU_OTHER" + case eModeMenuModeCategory.CUSTOM: return "#MODE_MENU_CUSTOM" + } + + return "#MODE_MENU_UNKNOWN" +} + +void function BuildModesArray() +{ + file.modes.clear() + + foreach( string mode in GetPrivateMatchModes() ) + { + ListEntry_t entry + entry.mode = mode + entry.category = eModeMenuModeCategory.UNKNOWN + + switch( mode ) + { + case "aitdm": + case "at": + entry.category = eModeMenuModeCategory.PVPVE + break + case "fd_easy": + case "fd_normal": + case "fd_hard": + case "fd_master": + case "fd_insane": + entry.category = eModeMenuModeCategory.PVE + break + case "tdm": + case "ctf": + case "mfd": + case "ps": + case "cp": + case "speedball": + case "rocket_lf": + case "holopilot_lf": + entry.category = eModeMenuModeCategory.PVP + break + case "ffa": + case "fra": + entry.category = eModeMenuModeCategory.FFA + break + case "lts": + case "ttdm": + case "attdm": + case "turbo_ttdm": + case "alts": + case "turbo_lts": + entry.category = eModeMenuModeCategory.TITAN + break + case "coliseum": + case "sp_coop": + entry.category = eModeMenuModeCategory.OTHER + break + case "chamber": + case "hidden": + case "sns": + case "fw": + case "gg": + case "tt": + case "inf": + case "kr": + case "fastball": + case "hs": + case "ctf_comp": + case "tffa": + entry.category = eModeMenuModeCategory.CUSTOM + break + } + + file.modes.append(entry) + } +} + +int function SortModesAlphabetize( string a, string b ) +{ + a = Localize( GetGameModeDisplayName( a ) ) + b = Localize( GetGameModeDisplayName( b ) ) + + if ( a > b ) + return 1 + + if ( a < b ) + return -1 + + return 0 +} + +void function BuildSortedModesArray() +{ + file.sortedModes.clear() + + // Build sorted list of categories + array categories + for( int i = 0; i < eModeMenuModeCategory.SIZE; i++ ) + { + if( file.searchEnum != -1 && file.searchEnum != i ) + continue + + categories.append( GetCategoryStringFromEnum( i ) ) + } + + categories.sort( SortStringAlphabetize ) + + // Build final list of mixed modes and categories + foreach( string category in categories ) + { + // Build sorted list of modes in category + array modes + foreach( ListEntry_t entry in file.modes ) + { + int iCategory = entry.category + if( entry.mode in file.categoryOverrides ) + iCategory = file.categoryOverrides[entry.mode] + + if( GetCategoryStringFromEnum( iCategory ) != category ) + continue + + string mode = entry.mode + + if( file.searchString != "" && Localize(GetGameModeDisplayName(mode)).tolower().find(file.searchString.tolower()) == null ) + continue + + if( !modes.contains(mode) ) + modes.append( mode ) + } + + modes.sort( SortModesAlphabetize ) + + if( modes.len() == 0 ) + continue + + // Add to final list we then display + file.sortedModes.append( category ) + foreach( string mode in modes ) + file.sortedModes.append( mode ) + } +} + +//////////////////////////// +// Slider +//////////////////////////// +void function UpdateMouseDeltaBuffer( int x, int y ) +{ + mouseDeltaBuffer.deltaX += x + mouseDeltaBuffer.deltaY += y + + SliderBarUpdate() +} + +void function FlushMouseDeltaBuffer() +{ + mouseDeltaBuffer.deltaX = 0 + mouseDeltaBuffer.deltaY = 0 +} + + +void function SliderBarUpdate() +{ + if( file.sortedModes.len() < MODES_PER_PAGE ) + return + + var sliderButton = Hud_GetChild( file.menu , "BtnModeListSlider" ) + var sliderPanel = Hud_GetChild( file.menu , "BtnModeListSliderPanel" ) + var movementCapture = Hud_GetChild( file.menu , "MouseMovementCapture" ) + + Hud_SetFocused( sliderButton ) + + int[2] screenSize = GetScreenSize() + float minYPos = -40.0 * ( screenSize[1] / 1080.0 ) + float maxHeight = 596.0 * ( screenSize[1] / 1080.0 ) + float maxYPos = minYPos - ( maxHeight - Hud_GetHeight( sliderPanel ) ) + float useableSpace = maxHeight - Hud_GetHeight( sliderPanel ) + + float jump = minYPos - ( useableSpace / ( float( file.sortedModes.len() ) ) ) + + // got local from official respaw scripts, without untyped throws an error + local pos = Hud_GetPos( sliderButton )[1] + local newPos = pos - mouseDeltaBuffer.deltaY + FlushMouseDeltaBuffer() + + if ( newPos < maxYPos ) newPos = maxYPos + if ( newPos > minYPos ) newPos = minYPos + + Hud_SetPos( sliderButton , 2, newPos ) + Hud_SetPos( sliderPanel , 2, newPos ) + Hud_SetPos( movementCapture , 2, newPos ) + + file.scrollOffset = -int( ( ( newPos - minYPos ) / useableSpace ) * ( file.sortedModes.len() - MODES_PER_PAGE ) ) + UpdateVisibleModes() +} + +void function UpdateListSliderHeight( float modes ) +{ + var sliderButton = Hud_GetChild( file.menu , "BtnModeListSlider" ) + var sliderPanel = Hud_GetChild( file.menu , "BtnModeListSliderPanel" ) + var movementCapture = Hud_GetChild( file.menu , "MouseMovementCapture" ) + + int[2] screenSize = GetScreenSize() + float maxHeight = 596.0 * ( screenSize[1] / 1080.0 ) + float minHeight = 80.0 * ( screenSize[1] / 1080.0 ) + + float height = maxHeight * ( MODES_PER_PAGE / modes ) + + if ( height > maxHeight ) height = maxHeight + if ( height < minHeight ) height = minHeight + + Hud_SetHeight( sliderButton, height ) + Hud_SetHeight( sliderPanel, height ) + Hud_SetHeight( movementCapture, height ) +} + + +void function UpdateListSliderPosition( int modes ) +{ + if( modes < MODES_PER_PAGE ) + return + + var sliderButton = Hud_GetChild( file.menu, "BtnModeListSlider" ) + var sliderPanel = Hud_GetChild( file.menu, "BtnModeListSliderPanel" ) + var movementCapture = Hud_GetChild( file.menu, "MouseMovementCapture" ) + + float minYPos = -40.0 * ( GetScreenSize()[1] / 1080.0 ) + float useableSpace = (596.0 * ( GetScreenSize()[1] / 1080.0 ) - Hud_GetHeight( sliderPanel ) ) + + float jump = minYPos - ( useableSpace / ( float( modes ) - MODES_PER_PAGE ) * file.scrollOffset ) + + if ( jump > minYPos ) jump = minYPos + + Hud_SetPos( sliderButton, 2, jump ) + Hud_SetPos( sliderPanel, 2, jump ) + Hud_SetPos( movementCapture, 2, jump ) +} + +void function OnScrollDown( var button ) +{ + if (file.sortedModes.len() <= MODES_PER_PAGE) return + file.scrollOffset += 5 + if (file.scrollOffset + MODES_PER_PAGE > file.sortedModes.len()) { + file.scrollOffset = file.sortedModes.len() - MODES_PER_PAGE + } + UpdateVisibleModes() + UpdateListSliderPosition( file.sortedModes.len() ) +} + +void function OnScrollUp( var button ) +{ + file.scrollOffset -= 5 + if ( file.scrollOffset < 0 ) { + file.scrollOffset = 0 + } + UpdateVisibleModes() + UpdateListSliderPosition( file.sortedModes.len() ) +} + +void function OnDownArrowSelected( var button ) +{ + if ( file.sortedModes.len() <= MODES_PER_PAGE ) return + file.scrollOffset += 1 + if ( file.scrollOffset + MODES_PER_PAGE > file.sortedModes.len() ) + { + file.scrollOffset = file.sortedModes.len() - MODES_PER_PAGE + } + + UpdateVisibleModes() + UpdateListSliderPosition( file.sortedModes.len() ) +} + + +void function OnUpArrowSelected( var button ) +{ + file.scrollOffset -= 1 + if ( file.scrollOffset < 0 ) + { + file.scrollOffset = 0 + } + + UpdateVisibleModes() + UpdateListSliderPosition( file.sortedModes.len() ) +} + +bool function IsStringCategory( string str ) +{ + return GetGameModeDisplayName( str ) == "" +} + +///////////////////////////// +// LIST +///////////////////////////// + void function UpdateVisibleModes() -{ +{ // ensures that we only ever show enough buttons for the number of modes we have - array buttons = GetElementsByClassname( GetMenu( "ModesMenu" ), "ModeButton" ) - foreach ( var button in buttons ) + array buttons = GetElementsByClassname( GetMenu( "ModesMenu" ), "ModeSelectorPanel" ) + foreach ( var panel in buttons ) { - Hud_SetEnabled( button, false ) - Hud_SetVisible( button, false ) + Hud_SetEnabled( panel, false ) + Hud_SetVisible( panel, false ) + Hud_SetText( Hud_GetChild( panel, "Header" ), "" ) + Hud_SetText( Hud_GetChild( panel, "BtnMode" ), "" ) + SetButtonRuiText( Hud_GetChild( panel, "BtnMode" ), "" ) } - - array modesArray = GetPrivateMatchModes() + for ( int i = 0; i < MODES_PER_PAGE; i++ ) { - if ( i + ( file.currentModePage * MODES_PER_PAGE ) >= modesArray.len() ) + if ( i + file.scrollOffset >= file.sortedModes.len() ) break - - int modeIndex = i + ( file.currentModePage * MODES_PER_PAGE ) - SetButtonRuiText( buttons[ i ], GetGameModeDisplayName( modesArray[ modeIndex ] ) ) - - Hud_SetEnabled( buttons[ i ], true ) - Hud_SetVisible( buttons[ i ], true ) - - // This check is refactored in the new mode menu so we can just ignore this atrocity - if ( !ModeSettings_RequiresAI( modesArray[ modeIndex ] ) || modesArray[ modeIndex ] == "aitdm" || modesArray[ modeIndex ] == "at" ) - Hud_SetLocked( buttons[ i ], false ) + + // Setup locals + var panel = buttons[i] + var button = Hud_GetChild( panel, "BtnMode" ) + var header = Hud_GetChild( panel, "Header" ) + + int modeIndex = i + file.scrollOffset + string mode = file.sortedModes[ modeIndex ] + + bool bIsCategory = IsStringCategory( mode ) + mode = bIsCategory ? mode : GetGameModeDisplayName( mode ) + + // Show the panel + Hud_SetEnabled( panel, true ) + Hud_SetVisible( panel, true ) + Hud_SetLocked( button, false ) + + if( bIsCategory ) + { + Hud_SetText( header, mode ) + Hud_SetEnabled( button, false ) + } else - Hud_SetLocked( buttons[ i ], true ) + { + Hud_SetEnabled( button, true ) + SetButtonRuiText( button, mode ) + + if( blockedModes.contains( file.sortedModes[ modeIndex ] ) ) + Hud_SetLocked( button, true ) + + if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), mode ) ) + { + Hud_SetLocked( button, true ) + SetButtonRuiText( button, mode ) + } + } } } void function ModeButton_GetFocus( var button ) { - int modeId = int( Hud_GetScriptID( button ) ) + ( file.currentModePage * MODES_PER_PAGE ) - - var menu = GetMenu( "ModesMenu" ) - var nextModeImage = Hud_GetChild( menu, "NextModeImage" ) - var nextModeIcon = Hud_GetChild( menu, "ModeIconImage" ) - var nextModeName = Hud_GetChild( menu, "NextModeName" ) - var nextModeDesc = Hud_GetChild( menu, "NextModeDesc" ) + int modeId = int( Hud_GetScriptID( Hud_GetParent( button ) ) ) + file.scrollOffset - 1 - array modesArray = GetPrivateMatchModes() + var nextModeImage = Hud_GetChild( file.menu, "NextModeImage" ) + var nextModeIcon = Hud_GetChild( file.menu, "ModeIconImage" ) + var nextModeName = Hud_GetChild( file.menu, "NextModeName" ) + var nextModeDesc = Hud_GetChild( file.menu, "NextModeDesc" ) - if ( modeId > modesArray.len() ) + if ( modeId > file.sortedModes.len() ) return - string modeName = modesArray[modeId] + string modeName = file.sortedModes[modeId] asset playlistImage = GetPlaylistImage( modeName ) RuiSetImage( Hud_GetRui( nextModeImage ), "basicImage", playlistImage ) @@ -99,35 +569,17 @@ void function ModeButton_Click( var button ) if ( Hud_IsLocked( button ) ) return - int modeID = int( Hud_GetScriptID( button ) ) + ( file.currentModePage * MODES_PER_PAGE ) + int modeID = int( Hud_GetScriptID( Hud_GetParent( button ) ) ) + file.scrollOffset - 1 - array modesArray = GetPrivateMatchModes() - string modeName = modesArray[ modeID ] + string modeName = file.sortedModes[ modeID ] // on modded servers set us to the first map for that mode automatically // need this for coliseum mainly which is literally impossible to select without this - if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), modesArray[ modeID ] ) ) + if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), modeName ) ) + { ClientCommand( "SetCustomMap " + GetPrivateMatchMapsForMode( modeName )[ 0 ] ) - + } // set it ClientCommand( "PrivateMatchSetMode " + modeName ) CloseActiveMenu() } - -void function CycleModesBack( var button ) -{ - if ( file.currentModePage == 0 ) - return - - file.currentModePage-- - UpdateVisibleModes() -} - -void function CycleModesForward( var button ) -{ - if ( ( file.currentModePage + 1 ) * MODES_PER_PAGE >= GetPrivateMatchModes().len() ) - return - - file.currentModePage++ - UpdateVisibleModes() -} \ No newline at end of file From e8ffff54bb150c73622bfd3cca0a11b024e3a44b Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Wed, 11 Sep 2024 12:29:30 +0200 Subject: [PATCH 03/37] Translations update from Weblate (#879) Translated using Weblate (Russian) Currently translated at 92.5% (299 of 323 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/ru/ Co-authored-by: WofWca --- .../resource/northstar_client_localisation_russian.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt index 91a0dedee..a0f751ff1 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt @@ -250,7 +250,7 @@ "UNAUTHORIZED_PWD" "Неправильный пароль" "STRYDER_RESPONSE" "Не удалось разобрать ответ Stryder" "PLAYER_NOT_FOUND" "Не удалось найти аккаунт игрока" - "INVALID_MASTERSERVER_TOKEN" "Некорректный или истёкший токен главного сервера. Перезапустите EA App, чтобы обновить токен." + "INVALID_MASTERSERVER_TOKEN" "Некорректный или истёкший токен главного сервера. Попробуйте перезапустить EA App." "JSON_PARSE_ERROR" "Ошибка разбора json-ответа" "UNSUPPORTED_VERSION" "Используемая вами версия больше не поддерживается" "DISABLE" "Выключить" @@ -367,5 +367,12 @@ "MOD_FETCHING_FAILED_GENERAL" "Ошибка распаковки мода. Проверьте файл лога, чтобы узнать подробности." "MANIFESTO_FETCHING_TEXT" "Скачиваем список проверенных модов..." "MANIFESTO_FETCHING_TITLE" "Начало загрузки модов" + "MODE_MENU_FFA" "Все против всех" + "MODE_MENU_OTHER" "Другое" + "MODE_MENU_CUSTOM" "Свой" + "MODE_MENU_ALL" "Все" + "MODE_MENU_UNKNOWN" "Неизвестный" + "MODE_MENU_SWITCH" "Фильтр" + "MODE_MENU_TITAN_ONLY" "Только титаны" } } From 6437c5eef53e921613946f309f51ac441e08bdf0 Mon Sep 17 00:00:00 2001 From: William Miller Date: Wed, 11 Sep 2024 19:24:26 -0300 Subject: [PATCH 04/37] Fix mode selection menu locking all modes (#880) Invert previously incorrect logic in check to lock gamemode. --- Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut index 6cddee2af..109eed129 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_mode_select.nut @@ -524,7 +524,7 @@ void function UpdateVisibleModes() if( blockedModes.contains( file.sortedModes[ modeIndex ] ) ) Hud_SetLocked( button, true ) - if ( !PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), mode ) ) + if ( PrivateMatch_IsValidMapModeCombo( PrivateMatch_GetSelectedMap(), mode ) ) { Hud_SetLocked( button, true ) SetButtonRuiText( button, mode ) From fd16d8cc79d65636b097d247a00dbbf2b1263292 Mon Sep 17 00:00:00 2001 From: William Miller Date: Fri, 13 Sep 2024 06:47:00 -0300 Subject: [PATCH 05/37] Fix Discord presence crashing on Campaign (#881) Add MP/SP check to prevent running logic that would script error on SP. Also gives more accurate playercount now. --- .../scripts/vscripts/presence/cl_presence.nut | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Northstar.Client/mod/scripts/vscripts/presence/cl_presence.nut b/Northstar.Client/mod/scripts/vscripts/presence/cl_presence.nut index 142c94bad..191ef1444 100644 --- a/Northstar.Client/mod/scripts/vscripts/presence/cl_presence.nut +++ b/Northstar.Client/mod/scripts/vscripts/presence/cl_presence.nut @@ -22,14 +22,21 @@ GameStateStruct function DiscordRPC_GenerateGameState( GameStateStruct gs ) gs.mapDisplayname = Localize(GetMapDisplayName(GetMapName())) gs.playlist = GetCurrentPlaylistName() - gs.playlistDisplayname = Localize(GetCurrentPlaylistVarString("name", GetCurrentPlaylistName())) + gs.playlistDisplayname = Localize( GetCurrentPlaylistVarString( "name", GetCurrentPlaylistName() ) ) - gs.currentPlayers = GetPlayerArray().len() - gs.maxPlayers = GetCurrentPlaylistVarInt( "maxPlayers", -1 ) + int reservedCount = GetTotalPendingPlayersReserved() + int connectingCount = GetTotalPendingPlayersConnecting() + int loadingCount = GetTotalPendingPlayersLoading() + int connectedCount = GetPlayerArray().len() + int allKnownPlayersCount = reservedCount + connectingCount + loadingCount + connectedCount + + gs.currentPlayers = allKnownPlayersCount + gs.maxPlayers = GetCurrentPlaylistVarInt( "max_players", 16 ) if ( IsValid( GetLocalClientPlayer() ) ) gs.ownScore = GameRules_GetTeamScore( GetLocalClientPlayer().GetTeam() ) + #if MP if ( GameRules_GetGameMode() == FD ) { gs.playlist = "fd" // So it returns only one thing to the plugin side instead of the 5 separate difficulties FD have @@ -41,6 +48,9 @@ GameStateStruct function DiscordRPC_GenerateGameState( GameStateStruct gs ) else gs.fd_waveNumber = -1 // Tells plugin it's on Wave Break } + #else + gs.fd_waveNumber = -1 // Unecessary for campaign so return -1 + #endif gs.serverGameState = GetGameState() == -1 ? 0 : GetGameState() gs.otherHighestScore = gs.ownScore == highestScore ? secondHighest : highestScore From 3e00833bb7665bbc727c96bdb0fe84ad59e9d4e2 Mon Sep 17 00:00:00 2001 From: Respawn Date: Mon, 16 Sep 2024 21:54:08 +0200 Subject: [PATCH 06/37] Add cl_mp_glitch.nut from englishclient_mp_glitch --- .../vscripts/mp/levels/cl_mp_glitch.nut | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut diff --git a/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut b/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut new file mode 100644 index 000000000..5c1a20927 --- /dev/null +++ b/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut @@ -0,0 +1,175 @@ +global function ClientCodeCallback_MapInit +global function AddInWorldMinimapObject + +// someday, move this to in world minimap + +struct +{ + array minimapBGTopos + array minimapTopos + array screens + float mapCornerX + float mapCornerY + float mapScale + float threatMaxDist +} file + +void function ClientCodeCallback_MapInit() +{ + AddCallback_EntitiesDidLoad( EntitiesDidLoad ) + AddCallback_MinimapEntSpawned( AddInWorldMinimapObject ) + AddCallback_LocalViewPlayerSpawned( AddInWorldMinimapObject ) +} + +void function EntitiesDidLoad() +{ + InitMinimapScreens() +} + +var function AddInWorldMinimapTopo( entity ent, float width, float height ) +{ + vector ang = ent.GetAngles() + vector right = ( (AnglesToRight( ang )*-1) * width * 0.5 ) + vector down = ( (AnglesToUp( ang )*-1) * height * 0.5 ) + + vector org = ent.GetOrigin() + + org = ent.GetOrigin() - right*0.5 - down*0.5 + + var topo = RuiTopology_CreatePlane( org, right, down, true ) + return topo +} + +void function InitMinimapScreens() +{ + array screens = GetEntArrayByScriptName( "inworld_minimap" ) + foreach ( screen in screens ) + { + file.minimapTopos.append( AddInWorldMinimapTopo( screen, 350, 350 ) ) + file.minimapBGTopos.append( AddInWorldMinimapTopo( screen, 450, 450 ) ) + } + + asset mapImage = Minimap_GetAssetForKey( "minimap" ) + file.mapCornerX = Minimap_GetFloatForKey( "pos_x" ) + file.mapCornerY = Minimap_GetFloatForKey( "pos_y" ) + float displayDist = Minimap_GetFloatForKey( "displayDist" ) + float threatDistNear = Minimap_GetFloatForKey( "threatNearDist" ) + float threatDistFar = Minimap_GetFloatForKey( "threatFarDist" ) + file.mapScale = Minimap_GetFloatForKey( "scale" ) + + file.threatMaxDist = Minimap_GetFloatForKey( "threatMaxDist" ) + + foreach ( screen in file.minimapBGTopos ) + { + entity player = GetLocalViewPlayer() + var rui = RuiCreate( $"ui/in_world_minimap_border.rpak", screen, RUI_DRAW_WORLD, 0 ) + string factionChoice = GetFactionChoice( player ) + ItemDisplayData displayData = GetItemDisplayData( factionChoice ) + asset factionLogo = displayData.image + RuiSetImage( rui, "logo", factionLogo ) + RuiSetImage( rui, "basicImage", $"overviews/mp_glitch_wallmap_bracket" ) + } + foreach ( screen in file.minimapTopos ) + { + var rui = RuiCreate( $"ui/in_world_minimap_base.rpak", screen, RUI_DRAW_WORLD, 0 ) + RuiSetImage( rui, "mapImage", $"overviews/mp_glitch_wallmap" ) + RuiSetFloat3( rui, "mapCorner", ) + RuiSetFloat( rui, "displayDist", max( file.threatMaxDist, 2200 ) ) + RuiSetFloat( rui, "mapScale", file.mapScale ) + file.screens.append( rui ) + } + + foreach ( player in GetPlayerArray() ) + { + if ( IsValid( player ) ) + AddInWorldMinimapObject( player ) + } +} + +void function AddInWorldMinimapObject( entity ent ) //TODO: If we want radar jammer boost to hide friendly players we need to be able to get the rui handles back. +{ + Assert( IsValid( ent ) ) + + if ( !ent.IsPlayer() && !ent.IsTitan() ) + return + + ent.SetDoDestroyCallback( true ) + + foreach ( screen in file.minimapTopos ) + thread AddInWorldMinimapObjectInternal( ent, screen ) +} + +void function AddInWorldMinimapObjectInternal( entity ent, var screen ) +{ + printt( "AddInWorldMinimapObject" ) + printt( screen ) + printt( ent ) + + bool isNPCTitan = ent.IsNPC() && ent.IsTitan() + bool isPetTitan = ent == GetLocalViewPlayer().GetPetTitan() + bool isLocalPlayer = ent == GetLocalViewPlayer() + int customState = ent.Minimap_GetCustomState() + asset minimapAsset = $"ui/in_world_minimap_player.rpak" + if ( isNPCTitan ) + { + minimapAsset = $"ui/in_world_minimap_object.rpak" + } + + int zOrder = ent.Minimap_GetZOrder() + entity viewPlayer = GetLocalViewPlayer() + + var rui = RuiCreate( minimapAsset, screen, RUI_DRAW_WORLD, MINIMAP_Z_BASE + zOrder ) + + //RuiTrackGameTime( rui, "lastFireTime", ent, RUI_TRACK_LAST_FIRED_TIME ) + + RuiSetFloat3( rui, "mapCorner", ) + RuiSetFloat( rui, "mapScale", file.mapScale ) + + RuiTrackFloat3( rui, "objectPos", ent, RUI_TRACK_ABSORIGIN_FOLLOW ) + RuiTrackFloat3( rui, "objectAngles", ent, RUI_TRACK_EYEANGLES_FOLLOW ) + RuiTrackInt( rui, "objectFlags", ent, RUI_TRACK_MINIMAP_FLAGS ) + RuiTrackInt( rui, "customState", ent, RUI_TRACK_MINIMAP_CUSTOM_STATE ) + RuiSetFloat( rui, "displayDist", max( file.threatMaxDist, 2200 ) ) + + if ( isLocalPlayer ) + RuiSetBool( rui, "isLocalPlayer", isLocalPlayer ) + + // MinimapPackage_PlayerInit( ent, rui ) + + if ( isPetTitan ) + { + RuiSetBool( rui, "useTeamColor", false ) + RuiSetFloat3( rui, "iconColor", TEAM_COLOR_YOU / 255.0 ) + } + + OnThreadEnd( + function() : ( rui ) + { + RuiDestroy( rui ) + } + ) + + ent.EndSignal( "OnDestroy" ) + + if ( ent.IsPlayer() ) + { + while ( IsValid( ent ) ) + { + WaitSignal( ent, "SettingsChanged", "OnDeath" ) + } + } + else + { + ent.WaitSignal( "OnDestroy" ) + } +} + +void function MinimapPackage_PlayerInit( entity ent, var rui ) +{ + RuiTrackGameTime( rui, "lastFireTime", ent, RUI_TRACK_LAST_FIRED_TIME ) + if ( !IsFFAGame() ) //JFS: Too much work to get FFA to work correctly with Minimap logic, so disabling it for FFA + { + RuiTrackFloat( rui, "sonarDetectedFrac", ent, RUI_TRACK_STATUS_EFFECT_SEVERITY, eStatusEffect.sonar_detected ) + RuiTrackFloat( rui, "maphackDetectedFrac", ent, RUI_TRACK_STATUS_EFFECT_SEVERITY, eStatusEffect.maphack_detected ) + } +} \ No newline at end of file From c92707e0966225c827c3ce3383b1b8f72ee3bb96 Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Mon, 30 Sep 2024 23:55:52 +0200 Subject: [PATCH 07/37] Translations update from Weblate (#886) Translated using Weblate (French) Currently translated at 100.0% (323 of 323 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/fr/ Co-authored-by: DragonLordGON --- .../northstar_client_localisation_french.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_french.txt b/Northstar.Client/mod/resource/northstar_client_localisation_french.txt index 9444a39e3..38d601b0c 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_french.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_french.txt @@ -367,7 +367,7 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst "DOWNLOADING_MOD_TEXT" "Téléchargement de %s1 v%s2..." "WRONG_MOD_VERSION" "Le serveur requiert la version v%s2 du mod \"%s1\" (vous avez la version v%s3)" "DOWNLOADING_MOD_TEXT_W_PROGRESS" "Téléchargement de %s1 v%s2...\n(%s3/%s4 Mo)" - "CHECKSUMING_TITLE" "Vérification de la somme de contrôle du mod" + "CHECKSUMING_TITLE" "Vérification de l'intégrité du mod" "CHECKSUMING_TEXT" "Vérification du contenu de %s1 v%s2..." "EXTRACTING_MOD_TEXT" "Extraction de %s1 v%s2...\n(%s3/%s4 Mo)" "FAILED_DOWNLOADING" "Echec du téléchargement du mod" @@ -379,5 +379,15 @@ Choisissez Oui si vous êtes d'accord. Ce choix peut être modifié à tout inst "MOD_FETCHING_FAILED_GENERAL" "L'extraction du mod a échoué. Consultez le journal pour plus d'informations." "MANIFESTO_FETCHING_TITLE" "Préparation du téléchargement du mod" "MANIFESTO_FETCHING_TEXT" "Récupération de la liste des mods vérifiés..." + "MODE_MENU_PVPVE" "JcJcE" + "MODE_MENU_PVE" "JcE" + "MODE_MENU_PVP" "JcJ" + "MODE_MENU_FFA" "Mêlée générale" + "MODE_MENU_OTHER" "Autre" + "MODE_MENU_CUSTOM" "Personnalisé" + "MODE_MENU_ALL" "Tout" + "MODE_MENU_UNKNOWN" "Inconnu" + "MODE_MENU_SWITCH" "Filtre" + "MODE_MENU_TITAN_ONLY" "Titan Uniquement" } } From 75e95ef7c8f319765e5702e8c178d93f03471e75 Mon Sep 17 00:00:00 2001 From: William Miller Date: Wed, 2 Oct 2024 09:36:01 -0300 Subject: [PATCH 08/37] Restore missing faction dialogue for Titan Meter buildup (#876) Adds faction dialogue saying that Titan is soon ready as well as showing a message when Titan is ready to drop. --- .../vscripts/earn_meter/sv_earn_meter_mp.gnut | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut index a20e7aa05..21723ab5d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut @@ -91,6 +91,8 @@ void function EarnMeterMP_PlayerLifeThink( entity player ) EarnObject pilotReward = PlayerEarnMeter_GetReward( player ) float pilotRewardFrac = PlayerEarnMeter_GetRewardFrac( player ) int lastEarnMeterMode = PlayerEarnMeter_GetMode( player ) + bool saidTitanSoon = false + bool titanReadyMsg = false float lastPassiveGainTime = Time() OnThreadEnd( @@ -148,8 +150,22 @@ void function EarnMeterMP_PlayerLifeThink( entity player ) if ( lastEarnMeterMode == eEarnMeterMode.DEFAULT ) { + if ( Riff_TitanAvailability() != eTitanAvailability.Never ) + { + if ( PlayerEarnMeter_GetOwnedFrac( player ) >= 0.75 && PlayerEarnMeter_GetOwnedFrac( player ) < 0.95 && !saidTitanSoon ) + { + PlayFactionDialogueToPlayer( "mp_titanSoon", player ) + saidTitanSoon = true + } + else if( PlayerEarnMeter_GetOwnedFrac( player ) < 0.75 ) + saidTitanSoon = false + } + if ( PlayerEarnMeter_GetOwnedFrac( player ) < 1.0 ) + { PlayerEarnMeter_DisableGoal( player ) + titanReadyMsg = false + } else if ( player.GetPlayerNetInt( "goalState" ) != eRewardState.UNAVAILABLE ) { // if goal is enabled then the client will show "titan ready" alerts even if it isn't @@ -157,6 +173,11 @@ void function EarnMeterMP_PlayerLifeThink( entity player ) // so unfortunately we have to do this manually player.SetPlayerNetInt( "goalState", eRewardState.AVAILABLE ) PlayerEarnMeter_RefreshGoal( player ) + if( !titanReadyMsg ) + { + Remote_CallFunction_NonReplay( player, "ServerCallback_TitanReadyMessage" ) + titanReadyMsg = true + } } if ( Time() - lastPassiveGainTime > 4.0 && file.passiveMeterGainEnabled ) // this might be 5.0 From 22109d62eea28ce96838a0f739a9de14bd9b18a7 Mon Sep 17 00:00:00 2001 From: William Miller Date: Fri, 4 Oct 2024 12:08:03 -0300 Subject: [PATCH 09/37] Remove Clutter Client Logging from Glitch (#889) --- .../mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut b/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut index 5c1a20927..4ca323919 100644 --- a/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut +++ b/Northstar.Client/mod/scripts/vscripts/mp/levels/cl_mp_glitch.nut @@ -101,10 +101,6 @@ void function AddInWorldMinimapObject( entity ent ) //TODO: If we want radar jam void function AddInWorldMinimapObjectInternal( entity ent, var screen ) { - printt( "AddInWorldMinimapObject" ) - printt( screen ) - printt( ent ) - bool isNPCTitan = ent.IsNPC() && ent.IsTitan() bool isPetTitan = ent == GetLocalViewPlayer().GetPetTitan() bool isLocalPlayer = ent == GetLocalViewPlayer() From 7a58805827c9447a4584bfe6025dbff18a1bda90 Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:11:43 +0200 Subject: [PATCH 10/37] Translations update from Weblate (#891) Translated using Weblate (Portuguese) Currently translated at 100.0% (323 of 323 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/pt/ Co-authored-by: William Miller --- ...orthstar_client_localisation_portuguese.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt index 75a5faad6..79f3272de 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_portuguese.txt @@ -304,8 +304,8 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen "HIDE_LOCKED" "Esconder desativados" // In-game chat - "HUD_CHAT_WHISPER_PREFIX" "[WHISPER]" - "HUD_CHAT_SERVER_PREFIX" "[SERVER]" + "HUD_CHAT_WHISPER_PREFIX" "[SUSSURRO]" + "HUD_CHAT_SERVER_PREFIX" "[SERVIDOR]" "ONLY_HOST_MATCH_SETTINGS" "Somente o Host pode mudar as configurações da Partida Privada" "ONLY_HOST_CAN_START_MATCH" "Somente o Host pode Iniciar a Partida" "LOG_UNKNOWN_CLIENTCOMMANDS" "Registrar Comandos desconhecidos de Clientes" @@ -355,8 +355,8 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen "MOD_DL_DISABLED" "(download automático de mod está desabilitado)" "DOWNLOADING_MOD_TITLE" "Baixando mod" "DOWNLOADING_MOD_TEXT_W_PROGRESS" "Baixando %s1 v%s2...\n(%s3/%s4 MB)" - "CHECKSUMING_TITLE" "Verificando o mod" - "CHECKSUMING_TEXT" "Verificando conteúdo de %s1 v%s2..." + "CHECKSUMING_TITLE" "Verificando a integridade do mod" + "CHECKSUMING_TEXT" "Validando arquivos de %s1 v%s2..." "EXTRACTING_MOD_TITLE" "Extraíndo mod (%s1%)" "MOD_REQUIRED_WARNING" " Este mod pode ser desativado quando entrar em um servidor" "AUTHENTICATION_FAILED_HEADER" "Autenticação Falhou" @@ -376,5 +376,15 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen "MOD_FETCHING_FAILED_GENERAL" "Extração do mod falhou. Verifique os logs para mais detalhes." "MANIFESTO_FETCHING_TEXT" "Retornando a lista de mods verificados..." "MANIFESTO_FETCHING_TITLE" "Preparando o download do mod" + "MODE_MENU_PVPVE" "JcJcA" + "MODE_MENU_PVE" "JcA" + "MODE_MENU_PVP" "JcJ" + "MODE_MENU_FFA" "TcT" + "MODE_MENU_OTHER" "Outros" + "MODE_MENU_CUSTOM" "Personalizado" + "MODE_MENU_ALL" "Todos" + "MODE_MENU_UNKNOWN" "Desconhecido" + "MODE_MENU_SWITCH" "Filtrar" + "MODE_MENU_TITAN_ONLY" "Somente Titãs" } } From e616cb1d5f148bbc1b892cac140a0138735ed05c Mon Sep 17 00:00:00 2001 From: William Miller Date: Thu, 10 Oct 2024 09:24:57 -0300 Subject: [PATCH 11/37] Delete `_spawnpoints.gnut` (#890) Unused file, not loaded by Northstar. --- .../mod/scripts/vscripts/gamemodes/_spawnpoints.gnut | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_spawnpoints.gnut diff --git a/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_spawnpoints.gnut b/Northstar.CustomServers/mod/scripts/vscripts/gamemodes/_spawnpoints.gnut deleted file mode 100644 index e69de29bb..000000000 From 9beff344f5c71856e27c8a18e97e42fc92bb793d Mon Sep 17 00:00:00 2001 From: GeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:07:21 +0200 Subject: [PATCH 12/37] Update links to point to new wiki (#894) Documentation was moved from GitBook to MkDocs so the links to the wiki should updated accordingly. --- Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut b/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut index 89b7f7196..966686025 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/atlas_auth.nut @@ -37,7 +37,7 @@ void function AtlasAuthDialog_Threaded() if ( res.errorCode != "" ) dialogData.message += format( "\n\n%s", Localize( "#AUTHENTICATION_FAILED_ERROR_CODE", res.errorCode ) ) - string link = "https://r2northstar.gitbook.io/r2northstar-wiki/installing-northstar/troubleshooting" + string link = "https://docs.northstar.tf/Wiki/installing-northstar/troubleshooting/" // link to generic troubleshooting page if we don't have an error code from Atlas if ( res.errorCode != "" ) link = format( "%s#%s", link, res.errorCode ) diff --git a/README.md b/README.md index 4dbbd6edd..3d7a9019c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Translation status -[Squirrel](http://www.squirrel-lang.org/squirreldoc/reference/index.html) scripts used to recreate server-side gamelogic and add [custom content](https://r2northstar.gitbook.io/r2northstar-wiki/using-northstar/gamemodes) to the game. +[Squirrel](http://www.squirrel-lang.org/squirreldoc/reference/index.html) scripts used to recreate server-side gamelogic and add [custom content](https://docs.northstar.tf/Wiki/using-northstar/gamemodes/) to the game. ## Contents: From 9b83a632621264e28dd1724b90d381727c83d941 Mon Sep 17 00:00:00 2001 From: William Miller Date: Wed, 30 Oct 2024 19:40:11 -0300 Subject: [PATCH 13/37] Fix Match Stats Tracking Improperly (#898) Previously would incorrectly count each round in round based modes as individual games duplicating and stacking stats for those modes in the process. This commit changes where the hook happens. Ensures the stats will register only once and only when the match really ends, still disconsidering Epilogue state. --- .../mod/scripts/vscripts/mp/_gamestate_mp.nut | 32 +------------- .../mod/scripts/vscripts/mp/_stats.nut | 44 +++++++++---------- 2 files changed, 22 insertions(+), 54 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut index 0c66f5a96..17323c38b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_gamestate_mp.nut @@ -226,37 +226,7 @@ void function SetWinner( int team, string winningReason = "", string losingReaso SetGameState( eGameState.WinnerDetermined ) ScoreEvent_MatchComplete( team ) - array players = GetPlayerArray() - int functionref( entity, entity ) compareFunc = GameMode_GetScoreCompareFunc( GAMETYPE ) - if ( compareFunc != null ) - { - players.sort( compareFunc ) - int playerCount = players.len() - int currentPlace = 1 - for ( int i = 0; i < 3; i++ ) - { - if ( i >= playerCount ) - continue - - if ( i > 0 && compareFunc( players[i - 1], players[i] ) != 0 ) - currentPlace += 1 - - switch( currentPlace ) - { - case 1: - UpdatePlayerStat( players[i], "game_stats", "mvp" ) - UpdatePlayerStat( players[i], "game_stats", "mvp_total" ) - UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" ) - break - case 2: - UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" ) - break - case 3: - UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" ) - break - } - } - } + RegisterMatchStats_OnMatchComplete() } } } diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut index 74a9088b8..84b09ec8d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_stats.nut @@ -13,6 +13,7 @@ global function UpdateTitanCoreEarnedStat global function PreScoreEventUpdateStats global function PostScoreEventUpdateStats global function Stats_OnPlayerDidDamage +global function RegisterMatchStats_OnMatchComplete struct { table< string, array > refs @@ -36,7 +37,6 @@ void function Stats_Init() AddCallback_OnPlayerRespawned( OnPlayerRespawned ) AddCallback_OnClientConnected( OnClientConnected ) AddCallback_OnClientDisconnected( OnClientDisconnected ) - AddCallback_GameStateEnter( eGameState.WinnerDetermined, OnWinnerDetermined ) thread HandleDistanceAndTimeStats_Threaded() thread SaveStatsPeriodically_Threaded() @@ -813,7 +813,7 @@ void function OnPlayerRespawned( entity player ) thread SetLastPosForDistanceStatValid_Threaded( player, true ) } -void function OnWinnerDetermined() +void function RegisterMatchStats_OnMatchComplete() { // award players for match completed, wins, and losses foreach ( entity player in GetPlayerArray() ) @@ -888,30 +888,28 @@ void function OnWinnerDetermined() player.SetPersistentVar( "kdratio_lifetime_pvp", kdratio_lifetimepvp ) } - // award mvp and top 3 in each team - if ( !IsFFAGame() ) + array players = GetPlayerArray() + players.sort( GetScoreboardCompareFunc() ) + int playerCount = players.len() + int currentPlace = 1 + for ( int i = 0; i < 3; i++ ) { - string gamemode = GameRules_GetGameMode() - int functionref( entity, entity ) compareFunc = GameMode_GetScoreCompareFunc( gamemode ) - - for( int team = 0; team < MAX_TEAMS; team++ ) + if ( i >= playerCount ) + continue + + int functionref( entity, entity ) compareFunc = GetScoreboardCompareFunc() + if ( i > 0 && compareFunc( players[i - 1], players[i] ) != 0 ) + currentPlace += 1 + switch( currentPlace ) { - array players = GetPlayerArrayOfTeam( team ) - if ( compareFunc == null ) - { - printt( "gamemode doesn't have a compare func to get the top 3" ) - return - } - players.sort( compareFunc ) - int maxAwards = int( min( players.len(), 3 ) ) - for ( int i = 0; i < maxAwards; i++ ) - { - if ( i == 0 ) - Stats_IncrementStat( players[ i ], "game_stats", "mvp", "", 1.0 ) - Stats_IncrementStat( players[ i ], "game_stats", "top3OnTeam", "", 1.0 ) - } + case 1: // MVP have two parallel stats which one registers MVP for the map played and the other goes to the player's stats menu as a total MVP times + UpdatePlayerStat( players[i], "game_stats", "mvp" ) + UpdatePlayerStat( players[i], "game_stats", "mvp_total" ) + case 2: + case 3: + UpdatePlayerStat( players[i], "game_stats", "top3OnTeam" ) // Ingame this is the "Times Top 3" for the whole match, not per team + break } - } } From 730616d4ceef904cf8a286837249a75cd886fbb2 Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Mon, 4 Nov 2024 00:01:47 +0000 Subject: [PATCH 14/37] Replace uses of `disconnect` with `NSDisconnectPlayer` (#841) As we want to remove `FCVAR_SERVER_CAN_EXECUTE` flag from `disconnect`. --- .../mod/scripts/vscripts/burnmeter/sh_burnmeter.gnut | 2 +- Northstar.CustomServers/mod/scripts/vscripts/sh_loadouts.nut | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/burnmeter/sh_burnmeter.gnut b/Northstar.Custom/mod/scripts/vscripts/burnmeter/sh_burnmeter.gnut index 37d4356f0..10bca342c 100644 --- a/Northstar.Custom/mod/scripts/vscripts/burnmeter/sh_burnmeter.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/burnmeter/sh_burnmeter.gnut @@ -207,7 +207,7 @@ string function GetSelectedBurnCardRef( entity player ) #if SERVER if ( GetItemDisplayData( ref ).hidden ) - ClientCommand( player, "disconnect" ) + NSDisconnectPlayer( player, "" ) #endif #if SERVER || CLIENT diff --git a/Northstar.CustomServers/mod/scripts/vscripts/sh_loadouts.nut b/Northstar.CustomServers/mod/scripts/vscripts/sh_loadouts.nut index 7a7498b8c..4bf195b6d 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/sh_loadouts.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/sh_loadouts.nut @@ -1509,7 +1509,7 @@ string function GetValidatedPersistentLoadoutValue( entity player, string loadou { printt( "Invalid Loadout Property: ", loadoutType, loadoutIndex, loadoutProperty, value ) value = ResetLoadoutPropertyToDefault( player, loadoutType, loadoutIndex, loadoutProperty ) //TODO: This will call player.SetPersistentVar() directly. Awkward to do this in a getter function - ClientCommand( player, "disconnect #RESETTING_LOADOUT", 0 ) //Kick player out with a "Resetting Invalid Loadout" message. Mainly necessary so UI/Client script don't crash out later with known, bad data from persistence + NSDisconnectPlayer( player, "#RESETTING_LOADOUT" ) // Kick player out with a "Resetting Invalid Loadout" message. Mainly necessary so UI/Client script don't crash out later with known, bad data from persistence } } @@ -1519,7 +1519,8 @@ string function GetValidatedPersistentLoadoutValue( entity player, string loadou { printt( "Invalid Loadout Property: ", loadoutType, loadoutIndex, loadoutProperty, value ) value = ResetLoadoutPropertyToDefault( player, loadoutType, loadoutIndex, loadoutProperty ) //TODO: This will call player.SetPersistentVar() directly. Awkward to do this in a getter function - ClientCommand( player, "disconnect #RESETTING_LOADOUT", 0 ) //Kick player out with a "Resetting Invalid Loadout" message. Mainly necessary so UI/Client script don't crash out later with known, bad data from persistence + NSDisconnectPlayer( player, "#RESETTING_LOADOUT" ) // Kick player out with a "Resetting Invalid Loadout" message. Mainly necessary so UI/Client script don't crash out later with known, bad data from persistence + } ValidateSkinAndCamoIndexesAsAPair( player, loadoutType, loadoutIndex, loadoutProperty, value ) //TODO: This is awkward, has the potential to call a SetPersistentLoadoutValue() if skinIndex and camoIndex are not correct as a pair From 28f398d3f2557311129535c07a2c519a911a4162 Mon Sep 17 00:00:00 2001 From: NachosChipeados <103285866+NachosChipeados@users.noreply.github.com> Date: Mon, 11 Nov 2024 07:55:16 -0400 Subject: [PATCH 15/37] Allow executing ``npc_pilot_elite`` NPCs (#888) Allows players to execute pilot NPCs --- .../scripts/aisettings/npc_pilot_elite.txt | 5 +++++ .../mod/scripts/vscripts/melee/sh_melee.gnut | 20 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Northstar.Custom/keyvalues/scripts/aisettings/npc_pilot_elite.txt diff --git a/Northstar.Custom/keyvalues/scripts/aisettings/npc_pilot_elite.txt b/Northstar.Custom/keyvalues/scripts/aisettings/npc_pilot_elite.txt new file mode 100644 index 000000000..349277c39 --- /dev/null +++ b/Northstar.Custom/keyvalues/scripts/aisettings/npc_pilot_elite.txt @@ -0,0 +1,5 @@ +npc_pilot_elite +{ + GibModel0 "models/gibs/human_gibs.mdl" + headshotFX "P_headshot_pilot" +} \ No newline at end of file diff --git a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut index 95ab39158..a34def670 100644 --- a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut @@ -969,10 +969,28 @@ string function GetVictimSyncedMeleeTargetType( entity ent ) { targetType = "prowler" } + + // Disabled to allow for executing NPC Pilots + + // The way this function works, is that if an entity gets added here, then whatever "targetType" it returns + // gets passed to sh_melee_synced_human.gnut or sh_melee_synced_titan.gnut, + // which determines what animation set that entity should use when getting executed + // If an entity is not included, the it uses its BodyType to determine it ( see line 83 in sh_melee_synced_human) + // As you can see: Grunts, and Spectres are not included here, so it gets their BodyType (human) and goes from there + + // I imagine the reason Respawn added the NPC Pilots to this function, is so they could make unique executions for them, + // just like the Prowlers + // Unfortunately, they either scrapped them, or simply never got around to making them + // That means this piece of code has basically no reason to exist anymore + // The only thing it does is break executions and thats it + // Since NPC Pilots also use the "human" BodyType, it means we can execute them with no issues + +/* else if ( IsPilotElite( ent ) ) { targetType = "pilotelite" } +*/ else if ( ent.IsNPC() ) { targetType = ent.GetBodyType() @@ -1223,4 +1241,4 @@ SyncedMelee ornull function PickRandomExecution( SyncedMeleeChooser actions, ent return possibleExecutions[0] } #endif -#endif \ No newline at end of file +#endif From 19ac9bf6da11aab85867417d65efee0fccc5aa92 Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Thu, 14 Nov 2024 22:05:41 +0100 Subject: [PATCH 16/37] Translations update from Weblate (#901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Translated using Weblate (Italian) Currently translated at 96.2% (311 of 323 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/it/ Co-authored-by: Rémy Raes --- .../mod/resource/northstar_client_localisation_italian.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt index 089edf35b..eebdcb714 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_italian.txt @@ -20,7 +20,7 @@ Premi Sì se sei d'accordo. Questa scelta può essere modificata in qualsiasi mo "DIALOG_AUTHENTICATING_MASTERSERVER", "Autenticazione Sul Master Server in corso" "AUTHENTICATIONAGREEMENT_NO", "Hai Scelto di non autenticarti con Northstar. Puoi vedere l'Accordo nel Menu delle Mods" - "MENU_TITLE_SERVER_BROWSER" "Server Browser" + "MENU_TITLE_SERVER_BROWSER" "Lista dei Server" "NS_SERVERBROWSER_NOSERVERS" "Nessun server trovato" "NS_SERVERBROWSER_UNKNOWNMODE", "Modalità Sconosciuta" "NS_SERVERBROWSER_WAITINGFORSERVERS" "In attesa dei server..." From 843b54cc9196341d7190e4a4709e6413bfcf9f9f Mon Sep 17 00:00:00 2001 From: Respawn Date: Fri, 15 Nov 2024 00:13:08 +0100 Subject: [PATCH 17/37] Add cl_screenfade.gnut from englishclient_mp_common --- .../vscripts/client/cl_screenfade.gnut | 312 ++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut diff --git a/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut b/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut new file mode 100644 index 000000000..9844b65b3 --- /dev/null +++ b/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut @@ -0,0 +1,312 @@ +global function ClScreenfade_Init + +global function RegisterDoomProtectionHintDamage + +global function UpdateScreenFade + + +struct +{ + var screenFade = null + int lastAlpha = -1 + void functionref() screenFadeFunc +} file + +void function ClScreenfade_Init() +{ + RegisterSignal( "NewScreenFade" ) + if ( IsSingleplayer() ) + file.screenFadeFunc = UpdateScreenFade_SpFirstFrame + else + file.screenFadeFunc = UpdateScreenFadeInternal + + + thread PlayerPainSoundThread() + + AddCallback_OnClientScriptInit( ScreenFade_AddClient ) + + file.screenFade = RuiCreate( $"ui/screen_fade.rpak", clGlobal.topoFullScreen, RUI_DRAW_HUD, RUI_SORT_SCREENFADE ) + + if ( IsLobby() ) + return + + RuiSetFloat3( file.screenFade, "fadeColor", <0, 0, 0> ) + RuiSetFloat( file.screenFade, "fadeAlpha", 1.0 ) +} + +void function ScreenFade_AddClient( entity player ) +{ +} + + +void function UpdateScreenFade() +{ + file.screenFadeFunc() +} + +void function UpdateScreenFadeInternal() +{ + table fadeParams = expect table( GetFadeParams() ) + + //For debugging screen fade + /*int alpha = expect int (fadeParams.a ) + + if ( file.lastAlpha != alpha ) + printt( "Alpha changed in UpdateScreenFade to: " + alpha ) + + file.lastAlpha = alpha*/ + + RuiSetFloat3( file.screenFade, "fadeColor", < expect int( fadeParams.r ) / 255.0, expect int( fadeParams.g ) / 255.0, expect int( fadeParams.b ) / 255.0 > ) + RuiSetFloat( file.screenFade, "fadeAlpha", expect int( fadeParams.a ) / 255.0 ) +} + +void function UpdateScreenFade_SpFirstFrame() +{ + RuiSetFloat3( file.screenFade, "fadeColor", < 0, 0, 0 > ) + RuiSetFloat( file.screenFade, "fadeAlpha", 255 ) + file.screenFadeFunc = UpdateScreenFadeInternal +} + +float g_doomProtectionHintDamage = 0.0 +float g_doomProtectionHintLastShowedTime = 0.0 + +void function RegisterDoomProtectionHintDamage( float newAmount ) +{ + const float LOCKOUT_TIME = 20.0 + if ( newAmount < 0.0 ) + return + if ( (Time() - g_doomProtectionHintLastShowedTime) < LOCKOUT_TIME ) + return + + g_doomProtectionHintDamage += newAmount; + printt( "g_doomProtectionHintDamage is now:", g_doomProtectionHintDamage ) +} + +void function DoomProtectionHintThread() +{ + const float HINT_DURATION = 4.0 + const float THRESHOLD_PILOT = 1000 + const float THRESHOLD_TITAN = 2000 + const float FIRSTTIME_SCALE = 0.6 + + while ( true ) + { + WaitFrame() + + entity player = GetLocalViewPlayer() + if ( !IsValid( player ) ) + continue; + + float threshold = player.IsTitan() ? THRESHOLD_TITAN : THRESHOLD_PILOT + if ( g_doomProtectionHintLastShowedTime == 0.0 ) + threshold *= FIRSTTIME_SCALE + + if ( g_doomProtectionHintDamage > threshold ) + { + wait 0.4 + entity player = GetLocalViewPlayer() + if ( IsValid( player ) ) + { + SetTimedEventNotification( HINT_DURATION, player.IsTitan() ? "#NOTIFY_HINT_TITAN_USE_FINISHERS" : "#NOTIFY_HINT_PILOTS_USE_FINISHERS" ) + g_doomProtectionHintLastShowedTime = Time() + g_doomProtectionHintDamage = 0.0 + } + } + } +} + +string function GetPainSound( entity player, string varName ) +{ + var resultRaw = player.GetPlayerSettingsField( varName ) + if ( resultRaw == null ) + { + Assert( 0, ("Invalid player setting field: " + varName) ) + return "" + } + + return expect string( resultRaw ) +} + +void function PlayerPainSoundThread() +{ + // Each layer has: + //: begin threshold (health falls below XX) + //: end threshold (health has risen back up above YY) + //: looping sound + //: endcap sound + + float HEALTH_PERCENT_LAYER1 = 0.85; + float HEALTH_PERCENT_LAYER1_END = 0.85; + float HEALTH_PERCENT_LAYER2 = 0.55; + float HEALTH_PERCENT_LAYER2_END = 0.55; + float HEALTH_PERCENT_LAYER3 = 0.55; + float HEALTH_PERCENT_LAYER3_END = 0.59; + + if ( shGlobal.proto_pilotHealthRegenDisabled ) + { + HEALTH_PERCENT_LAYER1 *= 0.33 + HEALTH_PERCENT_LAYER1_END *= 0.33 + HEALTH_PERCENT_LAYER2 *= 0.33 + HEALTH_PERCENT_LAYER2_END *= 0.33 + HEALTH_PERCENT_LAYER3 *= 0.33 + HEALTH_PERCENT_LAYER3_END *= 0.33 + } + + entity ourPlayer = null; + bool arePlayingLayer1 = false; + bool arePlayingLayer2 = false; + bool arePlayingLayer3 = false; + + string soundLayer1Loop = "" + string soundLayer1End = "" + string soundLayer2Start = "" + string soundLayer2Loop = "" + string soundLayer3Loop = "" + string soundLayer3End = "" + + while ( true ) + { + bool shouldPlayLayer1 = false + bool shouldPlayLayer2 = false + bool shouldPlayLayer3 = false + bool endcapsAllowed = false + entity localViewPlayer = GetLocalViewPlayer(); + + if ( !IsValid( localViewPlayer ) ) + { + } + else if ( !IsAlive( localViewPlayer ) ) + { + } + else if ( (ourPlayer != null) && (ourPlayer != localViewPlayer) ) + { + } + else if ( localViewPlayer.IsTitan() ) + { + endcapsAllowed = true + } + else + { + endcapsAllowed = true + + int health = localViewPlayer.GetHealth() + int maxHealth = localViewPlayer.GetMaxHealth() + float healthPercent = ((maxHealth > 0) ? (health.tofloat() / maxHealth.tofloat()) : 1.0) + + if ( !arePlayingLayer1 && (healthPercent <= HEALTH_PERCENT_LAYER1) ) + shouldPlayLayer1 = true + else if ( arePlayingLayer1 && (healthPercent <= HEALTH_PERCENT_LAYER1_END) ) + shouldPlayLayer1 = true + + if ( !arePlayingLayer2 && (healthPercent <= HEALTH_PERCENT_LAYER2) ) + shouldPlayLayer2 = true + else if ( arePlayingLayer2 && (healthPercent <= HEALTH_PERCENT_LAYER2_END) ) + shouldPlayLayer2 = true + + if ( !arePlayingLayer3 && (healthPercent <= HEALTH_PERCENT_LAYER3) ) + shouldPlayLayer3 = true + else if ( arePlayingLayer3 && (healthPercent <= HEALTH_PERCENT_LAYER3_END) ) + shouldPlayLayer3 = true + } + + if ( shouldPlayLayer1 != arePlayingLayer1 ) + { + if ( shouldPlayLayer1 ) + { + //printt( "LAYER 1 STARTS" ) + arePlayingLayer1 = true + Assert( (ourPlayer == null) || (ourPlayer == localViewPlayer) ) + ourPlayer = localViewPlayer + + soundLayer1Loop = GetPainSound( ourPlayer, "sound_pain_layer1_loop" ) + soundLayer1End = GetPainSound( ourPlayer, "sound_pain_layer1_end" ) + if ( soundLayer1Loop != "" ) + EmitSoundOnEntity( ourPlayer, soundLayer1Loop ) + } + else + { + //printt( "LAYER 1 _stop_" ) + if ( IsValid( ourPlayer ) ) + { + if ( soundLayer1Loop != "" ) + StopSoundOnEntity( ourPlayer, soundLayer1Loop ) + if ( endcapsAllowed && (soundLayer1End != "") ) + EmitSoundOnEntity( ourPlayer, soundLayer1End ) + } + arePlayingLayer1 = false; + } + } + + if ( shouldPlayLayer2 != arePlayingLayer2 ) + { + if ( shouldPlayLayer2 ) + { + //printt( "LAYER 2 STARTS" ); + arePlayingLayer2 = true; + Assert( (ourPlayer == null) || (ourPlayer == localViewPlayer) ) + ourPlayer = localViewPlayer; + soundLayer2Start = GetPainSound( ourPlayer, "sound_pain_layer2_start" ) + soundLayer2Loop = GetPainSound( ourPlayer, "sound_pain_layer2_loop" ) + EmitSoundOnEntity( ourPlayer, soundLayer2Start ) + EmitSoundOnEntity( ourPlayer, soundLayer2Loop ) + } + else + { + //printt( "LAYER 2 _stop_" ); + if ( IsValid( ourPlayer ) ) + { + if ( soundLayer2Start != "" ) + StopSoundOnEntity( ourPlayer, soundLayer2Start ) + if ( soundLayer2Loop != "" ) + StopSoundOnEntity( ourPlayer, soundLayer2Loop ) + } + arePlayingLayer2 = false; + } + } + + if ( shouldPlayLayer3 != arePlayingLayer3 ) + { + if ( shouldPlayLayer3 ) + { + //printt( "LAYER 3 STARTS" ) + arePlayingLayer3 = true + Assert( (ourPlayer == null) || (ourPlayer == localViewPlayer) ) + ourPlayer = localViewPlayer + soundLayer3Loop = GetPainSound( ourPlayer, "sound_pain_layer3_loop" ) + soundLayer3End = GetPainSound( ourPlayer, "sound_pain_layer3_end" ) + EmitSoundOnEntity( ourPlayer, soundLayer3Loop ) + } + else + { + //printt( "LAYER 3 _stop_" ) + if ( IsValid( ourPlayer ) ) + { + if ( soundLayer3Loop != "" ) + StopSoundOnEntity( ourPlayer, soundLayer3Loop ) + if ( endcapsAllowed && (soundLayer3End != "") ) + EmitSoundOnEntity( ourPlayer, soundLayer3End ) + } + arePlayingLayer3 = false; + } + } + + if ( !arePlayingLayer1 && !arePlayingLayer2 && !arePlayingLayer3 ) + ourPlayer = null + + WaitFrame() + } +} + + +/* +void function ClientSetPilotPainFlashColor( entity player, int a ) +{ + player.hudElems.damageOverlayPainFlash.SetColor( 255, 255, 255, a ) + + if ( a > 0 ) + player.hudElems.damageOverlayPainFlash.Show() + else + player.hudElems.damageOverlayPainFlash.Hide() +} +*/ + From d4fdd967952ef25f2207b963087342e7cac42e6a Mon Sep 17 00:00:00 2001 From: Respawn Date: Fri, 15 Nov 2024 00:23:26 +0100 Subject: [PATCH 18/37] Add sh_melee_human.gnut from englishclient_mp_common --- .../vscripts/melee/sh_melee_human.gnut | 538 ++++++++++++++++++ 1 file changed, 538 insertions(+) create mode 100644 Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut diff --git a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut new file mode 100644 index 000000000..514d4aaa8 --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut @@ -0,0 +1,538 @@ +untyped + +global function MeleeHumanShared_Init + +global function HumanUnsyncedMelee +global function HumanMeleeAttack + +function MeleeHumanShared_Init() +{ + PrecacheParticleSystem( $"P_melee_player" ) + RegisterSignal( "StopSlowMoMelee" ) + RegisterSignal( "StopHighlightValidMeleeEnemy" ) +} + +function HumanUnsyncedMelee( entity player, bool movestunBlocked ) +{ + entity activeWeapon = player.GetActiveWeapon() + if ( !IsValid( activeWeapon ) ) + { +#if SERVER + print( "SERVER: " + player + " has no valid active weapon\n" ) +#else + print( "CLIENT: " + player + " has no valid active weapon\n" ) +#endif + return + } + + entity meleeWeapon = player.GetMeleeWeapon() + if ( !IsValid( meleeWeapon ) ) + { +#if SERVER + print( "SERVER: " + player + " has no valid melee weapon\n" ) +#else + print( "CLIENT: " + player + " has no valid melee weapon\n" ) +#endif + return + } + + local meleeAttackType = PLAYER_MELEE_STATE_HUMAN_KICK_ATTACK + if ( activeWeapon.GetWeaponClassName() == "mp_weapon_dash_melee" ) + meleeAttackType = PLAYER_MELEE_STATE_HUMAN_EVISCERATE_ATTACK + + player.PlayerMelee_StartAttack( meleeAttackType ) + + if ( player.PlayerMelee_GetState() == PLAYER_MELEE_STATE_HUMAN_EVISCERATE_ATTACK ) + { + vector lungeTargetPos = (player.GetOrigin() + (player.GetViewVector() * 300)) + player.Lunge_SetTargetPosition( lungeTargetPos ) + player.Lunge_EnableFlying() + } + else + { + entity lungeTarget = GetLungeTargetForPlayer( player ) + if ( IsAlive( lungeTarget ) ) + { + if ( !movestunBlocked ) + { +#if SERVER + print( "SERVER: " + player + " is calling Lunge_SetTargetEntity() from HumanUnsyncedMelee()\n" ) +#else + print( "CLIENT: " + player + " is calling Lunge_SetTargetEntity() from HumanUnsyncedMelee()\n" ) +#endif + if ( player.Lunge_SetTargetEntity( lungeTarget, true ) ) + { + if ( lungeTarget.IsTitan() ) + { + player.Lunge_EnableFlying() + vector oldOffset = player.Lunge_GetEndPositionOffset() + player.Lunge_SetEndPositionOffset( oldOffset + <0, 0, 128> ) + } + else + { + if ( player.IsOnGround() ) + player.Lunge_LockPitch( true ) + } + } + } + } +#if SERVER + // if we don't lunge at anything stop slowmo + else if ( IsSingleplayer() && PROTO_IsSlowMoWeapon( meleeWeapon ) ) + { + player.Signal( "StopSlowMoMelee" ) + } +#endif // #if SERVER + } + +#if SERVER + meleeWeapon.EmitWeaponNpcSound_DontUpdateLastFiredTime( 200, 0.2 ) +#endif // #if SERVER + + //player.Weapon_StartCustomActivity( meleeActivity1p, false ) + player.SetSelectedOffhandToMelee() +} + +function DoReactionForTitanHit( entity player, entity titan ) +{ +#if SERVER + print( "SERVER: " + player + " is calling Lunge_SetTargetEntity() from DoReactionForTitanHit()\n" ) +#else + print( "CLIENT: " + player + " is calling Lunge_SetTargetEntity() from DoReactionForTitanHit()\n" ) +#endif + player.Lunge_SetTargetEntity( titan, true ) + if ( player.Lunge_IsLungingToEntity() ) + player.Lunge_EnableFlying() + + vector titanCenter = titan.EyePosition() + vector delta = (player.EyePosition() - titanCenter) + vector dir = Normalize( delta ) + player.Lunge_SetEndPositionOffset( dir * 350 ) +} + +function HumanMeleeAttack( entity player ) +{ + if ( player.IsPhaseShifted() ) + return + if ( player.PlayerMelee_GetAttackHitEntity() ) + return + if ( IsInExecutionMeleeState( player ) ) + return + + entity meleeWeapon = player.GetMeleeWeapon() + float attackRange = meleeWeapon.GetMeleeAttackRange() + + if ( player.Lunge_IsGroundExecute() ) + attackRange = 150 + +#if SERVER + print( "SERVER: " + player + " is calling PlayerMelee_AttackTrace() from HumanMeleeAttack()\n" ) +#else + print( "CLIENT: " + player + " is calling PlayerMelee_AttackTrace() from HumanMeleeAttack()\n" ) +#endif + table traceResult = PlayerMelee_AttackTrace( player, attackRange, CodeCallback_IsValidMeleeAttackTarget ) + + entity hitEnt = expect entity( traceResult.ent ) + if ( !IsValid( hitEnt ) ) + { +#if SERVER + print( "SERVER: " + player + " call to PlayerMelee_AttackTrace() did NOT hit\n" ) +#else + print( "CLIENT: " + player + " call to PlayerMelee_AttackTrace() did NOT hit\n" ) +#endif + return + } + +#if SERVER + print( "SERVER: " + player + " call to PlayerMelee_AttackTrace() hit " + hitEnt + "\n" ) +#else + print( "CLIENT: " + player + " call to PlayerMelee_AttackTrace() hit " + hitEnt + "\n" ) +#endif + + if ( PlayerMelee_IsServerSideEffects() ) + { +#if SERVER + vector hitNormal = Normalize( traceResult.startPosition - traceResult.position ) + player.DispatchImpactEffects( hitEnt, traceResult.startPosition, traceResult.position, hitNormal, traceResult.surfaceProp, traceResult.staticPropIndex, traceResult.damageType, meleeWeapon.GetImpactTableIndex(), player, traceResult.impactEffectFlags | IEF_SERVER_SIDE_EFFECT ) +#endif + } + else + { + vector hitNormal = Normalize( traceResult.startPosition - traceResult.position ) + player.DispatchImpactEffects( hitEnt, traceResult.startPosition, traceResult.position, hitNormal, traceResult.surfaceProp, traceResult.staticPropIndex, traceResult.damageType, meleeWeapon.GetImpactTableIndex(), player, traceResult.impactEffectFlags ) + } + + player.PlayerMelee_SetAttackHitEntity( hitEnt ) + if ( !hitEnt.IsWorld() ) + player.PlayerMelee_SetAttackRecoveryShouldBeQuick( true ) + + if ( hitEnt.IsTitan() ) + DoReactionForTitanHit( player, hitEnt ) + + if ( hitEnt.IsBreakableGlass() ) + { +#if SERVER + hitEnt.BreakSphere( traceResult.position, 50 ) +#endif // #if SERVER + } + else + { + if ( player.IsInputCommandHeld( IN_MELEE ) && AttemptHumanMeleeExecution( player, hitEnt, meleeWeapon, traceResult ) ) + return + +#if CLIENT + //MeleeImpactFX( player, meleeWeapon, hitEnt ) +#else + HumanMeleeAttack_DoImpact( player, meleeWeapon, traceResult ) +#endif + const float SCALE_WHEN_ENEMY = 1.0 + const float SCALE_WHEN_NOT_ENEMY = 0.5 + float severityScale = IsEnemyTeam( player.GetTeam(), hitEnt.GetTeam() ) ? SCALE_WHEN_ENEMY : SCALE_WHEN_NOT_ENEMY + meleeWeapon.DoMeleeHitConfirmation( severityScale ) + } +} + +#if 0 //CLIENT +function MeleeImpactFX( entity player, entity meleeWeapon, entity target ) +{ + if ( !target.IsWorld() ) + { + entity cockpit = player.GetCockpit() + if ( IsValid( cockpit ) ) + StartParticleEffectOnEntity( cockpit, GetParticleSystemIndex( $"P_melee_player" ), FX_PATTACH_ABSORIGIN_FOLLOW, -1 ) //P_MFD works well too + } +} +#endif // CLIENT + +#if SERVER +function HumanMeleeAttack_DoImpact( entity player, entity meleeWeapon, traceResult ) +{ + local angles = player.EyeAngles() + entity target = expect entity( traceResult.ent ) + player.PlayerMelee_SetAttackHitEntity( target ) + + string weaponName = meleeWeapon.GetWeaponClassName() + local damageSource = eDamageSourceId[weaponName] + int damageAmount = GetDamageAmountForTarget( meleeWeapon, target ) + + if ( IsHumanSized( target ) ) + { + if ( target.IsPlayer() ) //Strip away rodeo protection + { + entity titanBeingRodeoed = GetTitanBeingRodeoed( target ) + if ( IsValid( titanBeingRodeoed ) ) + TakeAwayFriendlyRodeoPlayerProtection( titanBeingRodeoed ) + } + + // ?? + target.SetContinueAnimatingAfterRagdoll( true ) + } + + vector oldVelocity = target.GetVelocity() + vector damageForce = AnglesToForward( angles ) * meleeWeapon.GetWeaponDamageForce() + + print( "SERVER: HumanMeleeAttack_DoImpact() applying damage to " + target + "\n" ) + + if ( target.IsNPC() && target.CanBeGroundExecuted() ) + target.TakeDamage( target.GetHealth(), player, player, { scriptType = DF_RAGDOLL | meleeWeapon.GetWeaponDamageFlags(), damageType = DMG_MELEE_ATTACK, damageSourceId = damageSource, origin = traceResult.position, force = Vector( 0, 0, 0 ) } ) + else + target.TakeDamage( damageAmount, player, player, { scriptType = meleeWeapon.GetWeaponDamageFlags(), damageType = DMG_MELEE_ATTACK, damageSourceId = damageSource, origin = traceResult.position, force = damageForce } ) + + // PROTO DEV + if ( IsSingleplayer() ) + { + if ( PROTO_ShouldActivateSlowMo( target, meleeWeapon ) ) + { + thread PROTO_SlowMoMelee( player, target, meleeWeapon ) + } + } + + // triggers: + { + local triggerTraceDir = Normalize( traceResult.position - traceResult.startPosition ) + player.TraceAttackToTriggers( damageAmount, player, player, { scriptType = meleeWeapon.GetWeaponDamageFlags(), damageType = DMG_MELEE_ATTACK, damageSourceId = damageSource, force = damageForce }, traceResult.startPosition, traceResult.position, triggerTraceDir ) + } + + if ( target.IsPlayerDecoy() ) + { + player.PlayerMelee_EndAttack() + } +} + +int function GetDamageAmountForTarget( entity meleeWeapon, entity target ) +{ + // special case + if ( IsTurret( target ) && IsHumanSized( target ) ) + return target.GetMaxHealth() + 1 + + // default + return meleeWeapon.GetDamageAmountForArmorType( target.GetArmorType() ) +} + + +// HACK - testing linked slow mo melee +void function PROTO_SlowMoMelee( entity player, entity currentEnemy, entity meleeWeapon ) +{ + player.EndSignal( "OnDeath" ) + player.EndSignal( "OnDestroy" ) + player.EndSignal( "StopSlowMoMelee" ) + + float duration = 1.75 //1.75 + float timescale = 0.4 + float lastKillTimescale = 0.2 + + var SlowMoTimeRemaining = player.s.meleeSlowMoEndTime - Time() + + meleeWeapon.SetMods( [ "SlowMoLinked" ] ) // need to switch to the other mod to get the longer lunge range + + // find an enemy close enough that we can melee him next + entity nextEnemy = PROTO_GetNextMeleeEnemy( player, meleeWeapon, currentEnemy ) + + if ( !IsValid( nextEnemy ) ) + { + meleeWeapon.SetMods( [ "SlowMo" ] ) + if ( SlowMoTimeRemaining > 0 ) + { + // do extra slowdown for the last kill in a linked slow-mo melee chain. + ServerCommand( "host_timescale " + string( lastKillTimescale ) ) + wait 0.2 + player.Signal( "StopSlowMoMelee" ) // this will also end this thread + } + + return + } + + if ( player.s.meleeSlowMoEndTime > Time() ) + { + // if we are already in slow-mo just turn towards the next enemy and extend the duration + thread PROTO_TurnViewTowardsClosestEnemy( player, nextEnemy ) + player.s.meleeSlowMoEndTime = Time() + duration // += duration + return + } + + // require a 5 second cool down between leaving and reentering slow mo. + if ( SlowMoTimeRemaining > -5 ) + return + + thread PROTO_TurnViewTowardsClosestEnemy( player, nextEnemy ) + + // enter slow mo + ServerCommand( "host_timescale " + string( timescale ) ) + player.s.meleeSlowMoEndTime = Time() + duration + meleeWeapon.SetMods( [ "SlowMoLinked" ] ) + + float range = meleeWeapon.GetMeleeLungeTargetRange() + array enemyArray = PROTO_GetMeleeEnemiesWithinRange( player.GetOrigin(), player.GetTeam(), range ) + foreach( enemy in enemyArray ) + thread PROTO_HighlightValidMeleeEnemy( player, enemy, meleeWeapon ) + + player.SetInvulnerable() + + OnThreadEnd( + function() : ( player, meleeWeapon ) + { + if ( IsValid( meleeWeapon ) ) + meleeWeapon.SetMods( [ "SlowMo" ] ) + + if ( IsValid( player ) ) + { + player.ClearInvulnerable() + player.s.meleeSlowMoEndTime = 0 + } + + thread PROTO_EaseOutSlowMo() + } + ) + + while( Time() <= player.s.meleeSlowMoEndTime ) + { + var waitTime = player.s.meleeSlowMoEndTime - Time() + wait waitTime + } + + player.Signal( "StopSlowMoMelee" ) +} + +void function PROTO_EaseOutSlowMo() +{ + ServerCommand( "host_timescale 0.4" ) + wait 0.1 + ServerCommand( "host_timescale 0.7" ) + wait 0.1 + ServerCommand( "host_timescale 1.0" ) +} + +bool function PROTO_IsSlowMoWeapon( entity meleeWeapon ) +{ + return ( meleeWeapon.HasMod( "SlowMo" ) || meleeWeapon.HasMod( "SlowMoLinked" ) ) +} + +bool function PROTO_ShouldActivateSlowMo( entity enemy, entity meleeWeapon ) +{ + if ( !PROTO_IsSlowMoWeapon( meleeWeapon ) ) + return false + + if ( !IsHumanSized( enemy ) ) + return false + + return true +} + +void function PROTO_TurnViewTowardsClosestEnemy( entity player, entity nextEnemy ) +{ + player.EndSignal( "OnDeath" ) + + OnThreadEnd( + function() : ( player ) + { + if ( IsValid( player ) ) + { + player.ClearParent() + player.PlayerCone_Disable() + } + } + ) + + // turn player view towards next enemy + vector vec = nextEnemy.GetOrigin() - player.GetOrigin() + vector newAngles = VectorToAngles( vec ) + + entity scriptMover = CreateScriptMover( player.GetOrigin(), player.GetAngles() ) + player.SetParent( scriptMover ) + + player.PlayerCone_SetLerpTime( 0.15 ) + + player.PlayerCone_FromAnim() + player.PlayerCone_SetMinYaw( -15 ) + player.PlayerCone_SetMaxYaw( 15 ) + player.PlayerCone_SetMinPitch( -5 ) + player.PlayerCone_SetMaxPitch( 15 ) + + wait 0.2 + + scriptMover.NonPhysicsRotateTo( newAngles, 0.4, 0.2, 0.2 ) + wait 0.4 +} + +entity function PROTO_GetNextMeleeEnemy( entity player, entity meleeWeapon, entity lastEnemy ) +{ + float range = meleeWeapon.GetMeleeLungeTargetRange() + array enemyArray = PROTO_GetMeleeEnemiesWithinRange( player.GetOrigin(), player.GetTeam(), range ) + entity nextEnemy = null + + foreach ( enemy in enemyArray ) + { + float heightDif = enemy.GetOrigin().z - player.GetOrigin().z + if ( heightDif < -96 || heightDif > 48 ) + continue + + float frac = TraceLineSimple( player.EyePosition(), enemy.EyePosition(), enemy ) + if ( frac < 1 ) + continue + + if ( enemy == lastEnemy ) + continue + + nextEnemy = enemy + break + } + + return nextEnemy +} + +array function PROTO_GetMeleeEnemiesWithinRange( vector playerOrigin, int playerTeam, float range ) +{ + array enemyArray = GetNPCArrayEx( "npc_soldier", TEAM_ANY, playerTeam, playerOrigin, range ) + enemyArray.extend( GetNPCArrayEx( "npc_spectre", TEAM_ANY, playerTeam, playerOrigin, range ) ) + + return enemyArray +} + +void function PROTO_HighlightValidMeleeEnemy( entity player, entity enemy, entity meleeWeapon ) +{ + enemy.Signal( "StopHighlightValidMeleeEnemy" ) + enemy.EndSignal( "StopHighlightValidMeleeEnemy" ) + + player.EndSignal( "StopSlowMoMelee" ) + player.EndSignal( "OnDeath" ) + player.EndSignal( "OnDestroy" ) + + enemy.EndSignal( "OnDestroy" ) + + OnThreadEnd( + function() : ( enemy ) + { + if ( IsValid( enemy ) ) + Highlight_ClearEnemyHighlight( enemy ) + } + ) + + float range = meleeWeapon.GetMeleeLungeTargetRange() + float minDot = AngleToDot( meleeWeapon.GetMeleeLungeTargetAngle() ) + + while( true ) + { + vector viewVector = player.GetViewVector() + vector enemyVector = enemy.GetCenter() - player.EyePosition() + float dist = expect float( enemyVector.Norm() ) + + if ( DotProduct( enemyVector, viewVector ) > minDot && dist < range ) + Highlight_SetEnemyHighlight( enemy, "enemy_sur_base" ) // enemy_sur_base, enemy_sonar, map_scan + else + Highlight_ClearEnemyHighlight( enemy ) + + wait 0.1 + } +} + +#endif // #if SERVER + +bool function AttemptHumanMeleeExecution( entity player, entity syncedTarget, entity meleeWeapon, table traceResult ) +{ + if ( player.PlayerMelee_GetState() == PLAYER_MELEE_STATE_NONE ) + return false + + if ( !IsAlive( player ) ) + return false + + if ( player.IsPhaseShifted() ) + return false + + if ( !CodeCallback_IsValidMeleeExecutionTarget( player, syncedTarget ) ) + return false + + #if SERVER + player.Anim_StopGesture( 0 ) + #endif + + thread PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack( player, syncedTarget, meleeWeapon, traceResult ) + return true +} + +void function PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack( entity player, entity target, entity meleeWeapon, table traceResult ) +{ +#if SERVER + print( "SERVER: PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack() for " + player + "\n" ) +#else + print( "CLIENT: PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack() for " + player + "\n" ) +#endif + if ( !PlayerTriesSyncedMelee( player, target ) ) + { +#if SERVER + print( "SERVER: PlayerTriesSyncedMelee() for " + player + " failed\n" ) +#else + print( "CLIENT: PlayerTriesSyncedMelee() for " + player + " failed\n" ) +#endif +#if SERVER + HumanMeleeAttack_DoImpact( player, meleeWeapon, traceResult ) +#endif + } + else + { +#if SERVER + print( "SERVER: PlayerTriesSyncedMelee() for " + player + " succeeded\n" ) +#else + print( "CLIENT: PlayerTriesSyncedMelee() for " + player + " succeeded\n" ) +#endif + } +} From e75be3def31f33dd56e7f208d7201d63e199ad8f Mon Sep 17 00:00:00 2001 From: Respawn Date: Fri, 15 Nov 2024 00:35:49 +0100 Subject: [PATCH 19/37] Add sh_stim.gnut from englishclient_mp_common --- .../mod/scripts/vscripts/weapons/sh_stim.gnut | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut diff --git a/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut b/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut new file mode 100644 index 000000000..50e030eeb --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut @@ -0,0 +1,167 @@ + +global function StimShared_Init +global function StimPlayer +global function EndlessStimBegin +global function EndlessStimEnd + + +global int COCKPIT_STIM_FX +global int PILOT_STIM_HLD_FX + +global const float STIM_EFFECT_SEVERITY = 0.4 // assuming 'movement_speedboost_extraScale' is 2.0 + +void function StimShared_Init() +{ + COCKPIT_STIM_FX = PrecacheParticleSystem( $"P_heal" ) + PILOT_STIM_HLD_FX = PrecacheParticleSystem( $"P_pilot_stim_hld" ) + + #if CLIENT + StatusEffect_RegisterEnabledCallback( eStatusEffect.stim_visual_effect, StimVisualsEnabled ) + StatusEffect_RegisterDisabledCallback( eStatusEffect.stim_visual_effect, StimVisualsDisabled ) + #endif + + RegisterSignal( "EndStim" ) + RegisterSignal( "StopEndlessStim" ) +} + +void function EndlessStimBegin( entity player, float effectSeverity ) +{ + StimPlayer_Internal( player, USE_TIME_INFINITE, effectSeverity ) +} +void function EndlessStimEnd( entity player ) +{ + player.Signal( "StopEndlessStim" ) +} + +void function StimPlayer( entity player, float duration, float severity = STIM_EFFECT_SEVERITY ) +{ + StimPlayer_Internal( player, duration, severity ) +} + +void function StimPlayer_Internal( entity player, float duration, float effectSeverity ) +{ + int endlessStatusEffectHandle = 0 + if ( duration == USE_TIME_INFINITE ) + { + endlessStatusEffectHandle = StatusEffect_AddEndless( player, eStatusEffect.speed_boost, effectSeverity ) + } + else + { + StatusEffect_AddTimed( player, eStatusEffect.speed_boost, effectSeverity, duration + 0.5, 0.25 ) // sound is slightly off + StatusEffect_AddTimed( player, eStatusEffect.stim_visual_effect, 1.0, duration, duration ) + } + +#if SERVER + thread StimThink( player, duration, endlessStatusEffectHandle ) +#else + entity cockpit = player.GetCockpit() + if ( !IsValid( cockpit ) ) + return + + HealthHUD_ClearFX( player ) +#endif +} + +#if SERVER +void function StimThink( entity player, float duration, int endlessStatusEffectHandle ) +{ + player.EndSignal( "OnDeath" ) + player.EndSignal( "OnChangedPlayerClass" ) + if ( endlessStatusEffectHandle != 0 ) + player.EndSignal( "StopEndlessStim" ) + + EmitSoundOnEntityOnlyToPlayer( player, player, "pilot_stimpack_loop_1P" ) + EmitSoundOnEntityExceptToPlayer( player, player, "pilot_stimpack_loop_3P" ) + + int attachmentIndex = player.LookupAttachment( "CHESTFOCUS" ) + + entity stimFX = StartParticleEffectOnEntity_ReturnEntity( player, PILOT_STIM_HLD_FX, FX_PATTACH_POINT_FOLLOW, attachmentIndex ) + stimFX.SetOwner( player ) + stimFX.kv.VisibilityFlags = (ENTITY_VISIBLE_TO_FRIENDLY | ENTITY_VISIBLE_TO_ENEMY) // not owner only + + //thread StimSlowmoAim( player, duration ) + + OnThreadEnd( + function() : ( player, stimFX, endlessStatusEffectHandle ) + { + if ( !IsValid( player ) ) + return + + if ( IsValid( stimFX ) ) + EffectStop( stimFX ) + + StopSoundOnEntity( player, "pilot_stimpack_loop_1P" ) + StopSoundOnEntity( player, "pilot_stimpack_loop_3P" ) + + if ( endlessStatusEffectHandle != 0 ) + StatusEffect_Stop( player, endlessStatusEffectHandle ) + + player.Signal( "EndStim" ) + } + ) + + if ( duration == USE_TIME_INFINITE ) + WaitForever() + + wait duration - 2.0 + + EmitSoundOnEntityOnlyToPlayer( player, player, "pilot_stimpack_deactivate_1P" ) + EmitSoundOnEntityExceptToPlayer( player, player, "pilot_stimpack_deactivate_3P" ) + + wait 2.0 +} + +#else // #if SERVER +void function StimVisualsEnabled( entity ent, int statusEffect, bool actuallyChanged ) +{ + if ( ent != GetLocalViewPlayer() ) + return + + entity player = ent + + entity cockpit = player.GetCockpit() + if ( !IsValid( cockpit ) ) + return + + int fxHandle = StartParticleEffectOnEntity( cockpit, COCKPIT_STIM_FX, FX_PATTACH_ABSORIGIN_FOLLOW, -1 ) + thread StimScreenFXThink( player, fxHandle, cockpit ) +} + +void function StimVisualsDisabled( entity ent, int statusEffect, bool actuallyChanged ) +{ + if ( ent != GetLocalViewPlayer() ) + return + + ent.Signal( "EndStim" ) +} + +void function StimScreenFXThink( entity player, int fxHandle, entity cockpit ) +{ + player.EndSignal( "EndStim" ) + player.EndSignal( "OnDeath" ) + cockpit.EndSignal( "OnDestroy" ) + + OnThreadEnd( + function() : ( fxHandle ) + { + if ( !EffectDoesExist( fxHandle ) ) + return + + EffectStop( fxHandle, false, true ) + } + ) + + for ( ;; ) + { + float velocityX = Length( player.GetVelocity() ) + + if ( !EffectDoesExist( fxHandle ) ) + break + + velocityX = GraphCapped( velocityX, 0.0, 360, 5, 200 ) + EffectSetControlPointVector( fxHandle, 1, Vector( velocityX, 999, 0 ) ) + WaitFrame() + } +} + +#endif // #else // #if SERVER From 227e7ef2a39adc0aebdaa95ae8f8bf2703716bd0 Mon Sep 17 00:00:00 2001 From: NachosChipeados <103285866+NachosChipeados@users.noreply.github.com> Date: Thu, 14 Nov 2024 19:42:11 -0400 Subject: [PATCH 20/37] Remove clutter client logging in melee scripts (#895) Removes logging print statements that just clutter up console. --- .../mod/scripts/vscripts/melee/sh_melee.gnut | 32 +------------ .../vscripts/melee/sh_melee_human.gnut | 48 ------------------- 2 files changed, 1 insertion(+), 79 deletions(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut index a34def670..89ea38f03 100644 --- a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee.gnut @@ -378,11 +378,6 @@ bool function CodeCallback_IsValidMeleeAttackTarget( entity attacker, entity tar void function CodeCallback_OnMeleePressed( entity player ) { -#if SERVER - print( "SERVER: " + player + " pressed melee\n" ) -#else - print( "CLIENT: " + player + " pressed melee\n" ) -#endif if ( !Melee_IsAllowed( player ) ) { @@ -410,24 +405,10 @@ void function CodeCallback_OnMeleePressed( entity player ) } if ( player.PlayerMelee_GetState() != PLAYER_MELEE_STATE_NONE ) - { -#if SERVER - print( "SERVER: PlayerMelee_GetState() for " + player + " is " + player.PlayerMelee_GetState() + "\n" ) -#else - print( "CLIENT: PlayerMelee_GetState() for " + player + " is " + player.PlayerMelee_GetState() + "\n" ) -#endif return - } if ( !IsAlive( player ) ) - { -#if SERVER - print( "SERVER: " + player + " is dead\n" ) -#else - print( "CLIENT: " + player + " is dead\n" ) -#endif return - } thread CodeCallback_OnMeleePressed_InternalThread( player ) } @@ -527,14 +508,7 @@ bool function PlayerTriesSyncedMelee( entity player, entity target ) } if ( !player.Lunge_IsActive() || !player.Lunge_IsGroundExecute() || !player.Lunge_IsLungingToEntity() || (player.Lunge_GetTargetEntity() != target) ) - { -#if SERVER - print( "SERVER: " + player + " is calling Lunge_SetTargetEntity() from PlayerTriesSyncedMelee()\n" ) -#else - print( "CLIENT: " + player + " is calling Lunge_SetTargetEntity() from PlayerTriesSyncedMelee()\n" ) -#endif player.Lunge_SetTargetEntity( target, false ) - } #if SERVER OnThreadEnd( @@ -1024,11 +998,7 @@ SyncedMeleeChooser ornull function GetSyncedMeleeChooserForPlayerVsTarget( entit void function CodeCallback_OnMeleeAttackAnimEvent( entity player ) { Assert( IsValid( player ) ) -#if SERVER - print( "SERVER: " + player + " is calling CodeCallback_OnMeleeAttackAnimEvent()\n" ) -#else - print( "CLIENT: " + player + " is calling CodeCallback_OnMeleeAttackAnimEvent()\n" ) -#endif + if ( player.PlayerMelee_IsAttackActive() ) { if ( player.IsTitan() ) diff --git a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut index 514d4aaa8..031acacfa 100644 --- a/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/melee/sh_melee_human.gnut @@ -55,11 +55,6 @@ function HumanUnsyncedMelee( entity player, bool movestunBlocked ) { if ( !movestunBlocked ) { -#if SERVER - print( "SERVER: " + player + " is calling Lunge_SetTargetEntity() from HumanUnsyncedMelee()\n" ) -#else - print( "CLIENT: " + player + " is calling Lunge_SetTargetEntity() from HumanUnsyncedMelee()\n" ) -#endif if ( player.Lunge_SetTargetEntity( lungeTarget, true ) ) { if ( lungeTarget.IsTitan() ) @@ -95,11 +90,6 @@ function HumanUnsyncedMelee( entity player, bool movestunBlocked ) function DoReactionForTitanHit( entity player, entity titan ) { -#if SERVER - print( "SERVER: " + player + " is calling Lunge_SetTargetEntity() from DoReactionForTitanHit()\n" ) -#else - print( "CLIENT: " + player + " is calling Lunge_SetTargetEntity() from DoReactionForTitanHit()\n" ) -#endif player.Lunge_SetTargetEntity( titan, true ) if ( player.Lunge_IsLungingToEntity() ) player.Lunge_EnableFlying() @@ -125,29 +115,11 @@ function HumanMeleeAttack( entity player ) if ( player.Lunge_IsGroundExecute() ) attackRange = 150 -#if SERVER - print( "SERVER: " + player + " is calling PlayerMelee_AttackTrace() from HumanMeleeAttack()\n" ) -#else - print( "CLIENT: " + player + " is calling PlayerMelee_AttackTrace() from HumanMeleeAttack()\n" ) -#endif table traceResult = PlayerMelee_AttackTrace( player, attackRange, CodeCallback_IsValidMeleeAttackTarget ) entity hitEnt = expect entity( traceResult.ent ) if ( !IsValid( hitEnt ) ) - { -#if SERVER - print( "SERVER: " + player + " call to PlayerMelee_AttackTrace() did NOT hit\n" ) -#else - print( "CLIENT: " + player + " call to PlayerMelee_AttackTrace() did NOT hit\n" ) -#endif return - } - -#if SERVER - print( "SERVER: " + player + " call to PlayerMelee_AttackTrace() hit " + hitEnt + "\n" ) -#else - print( "CLIENT: " + player + " call to PlayerMelee_AttackTrace() hit " + hitEnt + "\n" ) -#endif if ( PlayerMelee_IsServerSideEffects() ) { @@ -231,8 +203,6 @@ function HumanMeleeAttack_DoImpact( entity player, entity meleeWeapon, traceResu vector oldVelocity = target.GetVelocity() vector damageForce = AnglesToForward( angles ) * meleeWeapon.GetWeaponDamageForce() - print( "SERVER: HumanMeleeAttack_DoImpact() applying damage to " + target + "\n" ) - if ( target.IsNPC() && target.CanBeGroundExecuted() ) target.TakeDamage( target.GetHealth(), player, player, { scriptType = DF_RAGDOLL | meleeWeapon.GetWeaponDamageFlags(), damageType = DMG_MELEE_ATTACK, damageSourceId = damageSource, origin = traceResult.position, force = Vector( 0, 0, 0 ) } ) else @@ -511,28 +481,10 @@ bool function AttemptHumanMeleeExecution( entity player, entity syncedTarget, en void function PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack( entity player, entity target, entity meleeWeapon, table traceResult ) { -#if SERVER - print( "SERVER: PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack() for " + player + "\n" ) -#else - print( "CLIENT: PlayerTriesSyncedMelee_FallbackToHumanMeleeAttack() for " + player + "\n" ) -#endif if ( !PlayerTriesSyncedMelee( player, target ) ) { -#if SERVER - print( "SERVER: PlayerTriesSyncedMelee() for " + player + " failed\n" ) -#else - print( "CLIENT: PlayerTriesSyncedMelee() for " + player + " failed\n" ) -#endif #if SERVER HumanMeleeAttack_DoImpact( player, meleeWeapon, traceResult ) -#endif - } - else - { -#if SERVER - print( "SERVER: PlayerTriesSyncedMelee() for " + player + " succeeded\n" ) -#else - print( "CLIENT: PlayerTriesSyncedMelee() for " + player + " succeeded\n" ) #endif } } From 22a9dc50fc20d384930b177ab8c47fdf7bb9870c Mon Sep 17 00:00:00 2001 From: Respawn Date: Sat, 16 Nov 2024 11:45:48 +0100 Subject: [PATCH 21/37] Add cl_player.gnut from englishclient_mp_common --- .../scripts/vscripts/client/cl_player.gnut | 2742 +++++++++++++++++ 1 file changed, 2742 insertions(+) create mode 100644 Northstar.Client/mod/scripts/vscripts/client/cl_player.gnut diff --git a/Northstar.Client/mod/scripts/vscripts/client/cl_player.gnut b/Northstar.Client/mod/scripts/vscripts/client/cl_player.gnut new file mode 100644 index 000000000..fa5428c51 --- /dev/null +++ b/Northstar.Client/mod/scripts/vscripts/client/cl_player.gnut @@ -0,0 +1,2742 @@ +untyped + +global function ClPlayer_Init + +global function PlayIt +global function JumpRandomlyForever + +global function ClientCodeCallback_PlayerDidDamage +global function ClientCodeCallback_PlayerSpawned +//global function ClientCodeCallback_OnHudReloadScheme +global function ClientCodeCallback_HUDThink +global function Player_AddPlayer +global function Player_AddClient +global function PlayerConnectedOrDisconnected +global function ServerCallback_GameModeAnnouncement +global function MainHud_InitScoreBars + +global function ServerCallback_PlayerConnectedOrDisconnected +global function ClientCodeCallback_PlayerDisconnected +global function ServerCallback_PlayerChangedTeams +global function ClientCodeCallback_OnModelChanged +global function ServerCallback_RodeoerEjectWarning +global function ServerCallback_PlayScreenFXWarpJump +global function PlayShieldBreakEffect +global function PlayShieldActivateEffect +global function HandleDoomedState +global function RewardReadyMessage +global function TitanReadyMessage +global function CoreReadyMessage + +global function ServerCallback_RewardReadyMessage +global function ServerCallback_TitanReadyMessage + +global function OnClientPlayerAlive +global function OnClientPlayerDying +global function PlayPlayerDeathSound +global function StopPlayerDeathSound + +global function ServerCallback_ShowNextSpawnMessage +global function GetWaveSpawnTime +global function ServerCallback_HideNextSpawnMessage + +global function ClientCodeCallback_OnHealthChanged +global function ClientCodeCallback_OnCrosshairCurrentTargetChanged +global function Pressed_TitanNextMode +global function ClientCodeCallback_OnGib +global function ClientPilotSpawned +global function AddCallback_OnPlayerDisconnected + +global function IsPlayerEliminated + +global function ServerCallback_GiveMatchLossProtection +global function ServerCallback_OnEntityKilled +global function ServerCallback_OnTitanKilled + +global function ShouldShowSpawnAsTitanHint +global function ServerCallback_SetAssistInformation + +global function GetShieldEffectCurrentColor +global function ClientPlayerClassChanged + +#if DEV +global function BloodSprayDecals_Toggle +#endif + +const float DEFAULT_GAMEMODE_ANNOUNCEMENT_DURATION = 5.0 + +struct { + var orbitalstrike_tracer = null + var law_missile_tracer = null + float nextSpawnTime = 0.0 + entity lastEarnedReward // primarily used to check if we should still show the reward message after a delay +} file + +struct BloodDecalParams +{ + float traceDist + float secondaryTraceDist + asset fxType + asset secondaryFxType +} + +void function ClPlayer_Init() +{ + ClPilotJumpjet_Init() + ClDamageIndicator_Init() + + ClPlayer_Common_Precache() + + RegisterSignal( "OnAnimationDone" ) + RegisterSignal( "OnAnimationInterrupted" ) + RegisterSignal( "OnBleedingOut" ) + RegisterSignal( "PanelAlphaOverTime" ) + RegisterSignal( "LocalClientPlayerRespawned" ) + RegisterSignal( "OnClientPlayerAlive" ) + RegisterSignal( "OnClientPlayerDying" ) + RegisterSignal( "StopAlertCore" ) + RegisterSignal( "OnSpectatorMode" ) + RegisterSignal( "HealthChanged" ) + + FlagInit( "DamageDistancePrint" ) + FlagInit( "EnableTitanModeChange", true ) + FlagInit( "EnableBloodSprayDecals", true ) + + level.vduOpen <- false + level.canSpawnAsTitan <- false + level.grenadeIndicatorEnabled <- true + level.clientsLastKiller <- null + + AddCreateCallback( "player", SetupPlayerAnimEvents ) + AddCreateCallback( "player", MpClientPlayerInit ) + + AddCreateCallback( "first_person_proxy", SetupFirstPersonProxyEvents ) + AddCreateCallback( "predicted_first_person_proxy", SetupFirstPersonProxyEvents ) + + AddCreateCallback( "player", EnableDoDeathCallback ) + AddCreateCallback( "npc_titan", EnableDoDeathCallback ) + + AddCreateCallback( "titan_soul", CreateCallback_TitanSoul ) + + AddCallback_OnPlayerLifeStateChanged( PlayerADSDof ) + + file.orbitalstrike_tracer = PrecacheParticleSystem( $"Rocket_Smoke_Large" ) + //DEBUG Remove when bug is fixed. + file.law_missile_tracer = PrecacheParticleSystem( $"wpn_orbital_rocket_tracer" ) + + level.menuHideGroups <- {} + + level.spawnAsTitanSelected <- false + + AddPlayerFunc( Player_AddPlayer ) +} + +entity function FindEnemyRodeoParent( entity player ) +{ + entity ent = player.GetParent() + if ( ent == null ) + return null + + if ( !ent.IsTitan() ) + return null + + if ( ent == player.GetPetTitan() ) + return null + + if ( ent.GetTeam() == player.GetTeam() ) + return null + + return ent +} + +void function MpClientPlayerInit( entity player ) +{ + player.ClientCommand( "save_enable 0" ) +} + +void function ClientCodeCallback_PlayerSpawned( entity player ) +{ + if ( !IsValid( player ) ) + return + + if ( IsMenuLevel() ) + return + + ClearCrosshairPriority( crosshairPriorityLevel.ROUND_WINNING_KILL_REPLAY ) + + if ( !level.clientScriptInitialized ) + return + + // exists on server and client. Clear it when you respawn. + ClearRecentDamageHistory( player ) + DamageHistoryStruct blankDamageHistory + clGlobal.lastDamageHistory = blankDamageHistory + + if ( player == GetLocalViewPlayer() ) + { + foreach ( callbackFunc in clGlobal.onLocalViewPlayerSpawnedCallbacks ) + { + callbackFunc( player ) + } + } + + if ( player == GetLocalClientPlayer() ) + { + player.cv.lastSpawnTime = Time() + player.cv.roundSpawnCount++ + + foreach ( callbackFunc in clGlobal.onLocalClientPlayerSpawnedCallbacks ) + { + thread callbackFunc( player ) + } + } + + if ( player.IsTitan() ) + return + + if ( player.GetPlayerClass() == level.pilotClass ) + { + thread ClientPilotSpawned( player ) + } +} + + +void function ServerCallback_TitanReadyMessage() +{ + //thread TitanReadyMessage( 1.5, false ) //Delay was necessary at some point in time according to Brent, might no longer be true? + thread TitanReadyMessage( 0.0, false ) +} + + +void function ServerCallback_RewardReadyMessage( float timeSinceLastRespawn ) +{ + if ( timeSinceLastRespawn < 1.0 ) + thread RewardReadyMessage( 6.0, false ) + else + thread RewardReadyMessage( 0.0, false ) +} + + +void function RewardReadyMessage( float delay = 0.0, bool isQuick = false ) +{ + if ( delay > 0.0 ) + wait delay + + if ( !GamePlayingOrSuddenDeath() ) + return + + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) || IsSpectating() || IsWatchingKillReplay() ) + return + + if ( player.ContextAction_IsMeleeExecution() ) + return + + entity weapon = player.GetOffhandWeapon( OFFHAND_INVENTORY ) + if ( !IsValid( weapon ) ) + return + + file.lastEarnedReward = weapon + + if ( player.IsTitan() ) + { + EmitSoundOnEntity( player, "HUD_Boost_Card_Earned_1P" ) + + string rewardReadyMessage = expect string( GetWeaponInfoFileKeyField_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "readymessage" ) ) + string rewardReadyHint = expect string( GetWeaponInfoFileKeyField_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "readyhint" ) ) + asset rewardIcon = GetWeaponInfoFileKeyFieldAsset_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "hud_icon" ) + + AnnouncementData announcement = CreateAnnouncementMessageQuick( player, rewardReadyMessage, rewardReadyHint, <1, 0.5, 0>, rewardIcon ) + announcement.displayConditionCallback = LastEarnedRewardStillValid + AnnouncementFromClass( player, announcement ) + } + else + { + EmitSoundOnEntity( player, "HUD_Boost_Card_Earned_1P" ) + + string rewardReadyMessage = expect string( GetWeaponInfoFileKeyField_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "readymessage" ) ) + string rewardReadyHint = expect string( GetWeaponInfoFileKeyField_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "readyhint" ) ) + asset rewardIcon = GetWeaponInfoFileKeyFieldAsset_WithMods_Global( weapon.GetWeaponClassName(), weapon.GetMods(), "hud_icon" ) + + AnnouncementData announcement = CreateAnnouncementMessageQuick( player, rewardReadyMessage, rewardReadyHint, <1, 0.5, 0>, rewardIcon ) + announcement.displayConditionCallback = LastEarnedRewardStillValid + AnnouncementFromClass( player, announcement ) + } +} + +void function TitanReadyMessage( float delay = 0.0, bool isQuick = false ) +{ + if ( delay > 0.0 ) + wait delay + + if ( !GamePlayingOrSuddenDeath() ) + return + + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) || IsSpectating() || IsWatchingKillReplay() ) + return + + if ( player.ContextAction_IsMeleeExecution() ) + return + + if ( Riff_TitanAvailability() == eTitanAvailability.Never ) + return + + if ( !IsTitanAvailable( player ) && + (Riff_TitanAvailability() == eTitanAvailability.Custom) + ) + return + + int loadoutIndex = GetPersistentSpawnLoadoutIndex( player, "titan" ) + TitanLoadoutDef loadout = GetTitanLoadoutFromPersistentData( player, loadoutIndex ) + + string titanReadyMessage = GetTitanReadyMessageFromSetFile( loadout.setFile ) + string titanReadyHint = GetTitanReadyHintFromSetFile( loadout.setFile ) + + AnnouncementData announcement = CreateAnnouncementMessageQuick( player, titanReadyMessage, titanReadyHint, TEAM_COLOR_YOU, $"rui/hud/titanfall_marker_arrow_ready" ) + announcement.displayConditionCallback = ConditionNoTitan + AnnouncementFromClass( player, announcement ) + + #if FACTION_DIALOGUE_ENABLED + if ( !isQuick || CoinFlip() ) + PlayFactionDialogueOnLocalClientPlayer( "mp_titanReady" ) //Playing here as opposed to on the server since delay is normally not 0 + #endif + + if ( PlayerEarnMeter_GetMode( player ) == eEarnMeterMode.DEFAULT ) //Help stop spamming "Your Titan is Ready" + { + Cl_EarnMeter_SetLastHintTime( Time() ) + } +} + + +function CoreReadyMessage( entity player, bool isQuick = false ) +{ + if ( !GamePlayingOrSuddenDeath() ) + return + + if ( !IsAlive( player ) ) + return + + if ( GetDoomedState( player ) ) + return + + if ( !player.IsTitan() ) + return + + entity weapon = player.GetOffhandWeapon( OFFHAND_EQUIPMENT ) + + string coreOnlineMessage = expect string( weapon.GetWeaponInfoFileKeyField( "readymessage" ) ) + string coreOnlineHint = expect string( weapon.GetWeaponInfoFileKeyField( "readyhint" ) ) + + if ( isQuick ) + { + AnnouncementData announcement = CreateAnnouncementMessageQuick( player, coreOnlineMessage, coreOnlineHint, TEAM_COLOR_YOU ) + announcement.displayConditionCallback = ConditionPlayerIsTitan + AnnouncementFromClass( player, announcement ) + } + else + { + AnnouncementData announcement = CreateAnnouncementMessage( player, coreOnlineMessage, coreOnlineHint, TEAM_COLOR_YOU ) + announcement.displayConditionCallback = ConditionPlayerIsTitan + announcement.subText = coreOnlineHint + AnnouncementFromClass( player, announcement ) + } +} + + +bool function ConditionPlayerIsTitan() +{ + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) ) + return false + + return player.IsTitan() +} + + +bool function ConditionPlayerIsNotTitan() +{ + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) ) + return false + + return !player.IsTitan() +} + +bool function LastEarnedRewardStillValid() +{ + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) ) + return false + + entity weapon = player.GetOffhandWeapon( OFFHAND_INVENTORY ) + if ( !IsValid( weapon ) ) + return false + + return weapon == file.lastEarnedReward +} + + +bool function ConditionNoTitan() +{ + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) ) + return false + + if ( IsValid( player.GetPetTitan() ) ) + return false + + return !player.IsTitan() +} + + +function ClientPilotSpawned( entity player ) +{ + player.EndSignal( "SettingsChanged" ) + player.EndSignal( "OnDestroy" ) + player.EndSignal( "OnDeath" ) + + if ( (player != GetLocalViewPlayer()) ) + //Turning off for the time being since the front rodeo spot leaves persistent jumpjets in the face of the TItan + thread ParentedPlayerJets( player ) +} + +void function Player_AddClient( entity player ) +{ + if ( GetCurrentPlaylistVarInt( "titan_mode_change_allowed", 1 ) ) + RegisterConCommandTriggeredCallback( "+scriptCommand2", Pressed_TitanNextMode ) + + RegisterConCommandTriggeredCallback( "+scriptCommand2", Pressed_RequestTitanfall ) + RegisterConCommandTriggeredCallback( "+scriptCommand2", Pressed_ActivateMobilityGhost ) + + RegisterConCommandTriggeredCallback( "+use", Pressed_OfferRodeoBattery ) + RegisterConCommandTriggeredCallback( "+use", Pressed_RequestRodeoBattery ) + RegisterConCommandTriggeredCallback( "+useandreload", Pressed_OfferRodeoBattery ) + RegisterConCommandTriggeredCallback( "+useandreload", Pressed_RequestRodeoBattery ) + + #if MP + RegisterConCommandTriggeredCallback( "+use", Pressed_TryNukeGrenade ) + RegisterConCommandTriggeredCallback( "-use", Released_TryNukeGrenade ) + RegisterConCommandTriggeredCallback( "+useandreload", Pressed_TryNukeGrenade ) + RegisterConCommandTriggeredCallback( "-useandreload", Released_TryNukeGrenade ) + #endif + + Create_DamageIndicatorHUD() + + if ( !IsLobby() ) + { + player.EnableHealthChangedCallback() + + player.cv.deathTime <- 0.0 + player.cv.lastSpawnTime <- 0.0 + player.cv.deathOrigin <- <0.0, 0.0, 0.0> + player.cv.roundSpawnCount <- 0 + + thread CinematicIntroScreen() + } +} + +void function Player_AddPlayer( entity player ) +{ + player.s.weaponUpdateData <- {} + + player.s.trackedAttackers <- {} // for titans + player.classChanged = true +} + +function Pressed_RequestTitanfall( entity player ) +{ + if ( !IsTitanAvailable( player ) ) + return + + #if DEV + printt( player.GetEntIndex(), "Requested replacement Titan from eye pos " + player.EyePosition() + " view angles " + player.EyeAngles() + " player origin " + player.GetOrigin() + " map " + GetMapName() ) + #endif + + player.ClientCommand( "ClientCommand_RequestTitan" ) //Send client command regardless of whether we can call the titan in or not. Server decides + Rumble_Play( "rumble_titanfall_request", {} ) + + // + //if ( player.cv.announcementActive && player.cv.announcementActive.messageText == "#HUD_TITAN_READY" ) + //{ + // clGlobal.levelEnt.Signal( "AnnoucementPurge" ) + //} + // + ////PlayMusic( "Music_FR_Militia_TitanFall1" ) + //EmitSoundOnEntity( player, "titan_callin" ) + //return + //} +} + +function Pressed_TitanNextMode( entity player ) +{ + if ( player.IsTitan() ) + return + + if ( IsWatchingReplay() ) + return + + if ( !IsAlive( player ) ) + return + + if ( player.IsPhaseShifted() ) + return + + if ( !IsAlive( player.GetPetTitan() ) ) + return + + if ( !Flag( "EnableTitanModeChange" ) ) + return + + // cannot change modes while titan is incoming + if ( player.GetHotDropImpactTime() ) + return + + player.ClientCommand( "TitanNextMode" ) + + local newMode = player.GetPetTitanMode() + 1 + if ( newMode == eNPCTitanMode.MODE_COUNT ) + newMode = eNPCTitanMode.FOLLOW + + SetAutoTitanModeHudIndicator( player, newMode ) + + local guardModeAlias = GenerateTitanOSAlias( player, AUTO_TITAN_GUARD_MODE_DIAG_SUFFIX ) + local followModeAlias = GenerateTitanOSAlias( player, AUTO_TITAN_FOLLOW_MODE_DIAG_SUFFIX ) + + // prevent the sounds from stomping each other if button is pressed rapidly + StopSoundOnEntity( player, guardModeAlias ) + StopSoundOnEntity( player, AUTO_TITAN_GUARD_MODE_SOUND ) + StopSoundOnEntity( player, followModeAlias ) + StopSoundOnEntity( player, AUTO_TITAN_FOLLOW_MODE_SOUND ) + + if ( newMode == eNPCTitanMode.FOLLOW ) + { + EmitSoundOnEntity( player, followModeAlias ) + EmitSoundOnEntity( player, AUTO_TITAN_FOLLOW_MODE_SOUND ) + } + else if ( newMode == eNPCTitanMode.STAY ) + { + EmitSoundOnEntity( player, guardModeAlias ) + EmitSoundOnEntity( player, AUTO_TITAN_GUARD_MODE_SOUND ) + } +} + +/* +void function ClientCodeCallback_OnHudReloadScheme() +{ +} +*/ + +void function ClientCodeCallback_HUDThink() +{ + PerfStart( PerfIndexClient.ClientCodeCallback_HUDThink ) + + entity player = GetLocalViewPlayer() + + if ( !player.p.playerScriptsInitialized ) + { + PerfEnd( PerfIndexClient.ClientCodeCallback_HUDThink ) + return + } + + if ( !IsMenuLevel() ) + { + PerfStart( PerfIndexClient.ClientCodeCallback_HUDThink_4 ) + + ClGameState_Think() + PerfEnd( PerfIndexClient.ClientCodeCallback_HUDThink_4 ) + + PerfStart( PerfIndexClient.ClientCodeCallback_HUDThink_5 ) + UpdateVoiceHUD() + #if PC_PROG + UpdateChatHUDVisibility() + #endif // PC_PROG + PerfEnd( PerfIndexClient.ClientCodeCallback_HUDThink_5 ) + + UpdateScreenFade() + + entity clientPlayer = GetLocalClientPlayer() + if ( !IsWatchingKillReplay() && clientPlayer.classChanged ) + { + ClientPlayerClassChanged( clientPlayer, clientPlayer.GetPlayerClass() ) + } + + PerfStart( PerfIndexClient.ClientCodeCallback_HUDThink_6 ) + SmartAmmo_LockedOntoWarningHUD_Update() + WeaponFlyoutThink( player ) + PerfEnd( PerfIndexClient.ClientCodeCallback_HUDThink_6 ) + } + + PerfEnd( PerfIndexClient.ClientCodeCallback_HUDThink ) +} + +function ClientPlayerClassChanged( entity player, newClass ) +{ + //printl( "ClientPlayerClassChanged to " + player.GetPlayerClass() ) + player.classChanged = false + + level.vduOpen = false // vdu goes away when class changes + + Assert( !IsServer() ) + Assert( newClass, "No class " ) + + switch ( newClass ) + { + case "titan": + SetStandardAbilityBindingsForTitan( player ) + SetAbilityBinding( player, 6, "+offhand4", "-offhand4" ) // "+ability 6" + + LinkButtonPair( -1, -1, -1 ) + break + + case level.pilotClass: + SetStandardAbilityBindingsForPilot( player ) + SetAbilityBinding( player, 6, "+offhand4", "-offhand4" ) // "+ability 6" + + LinkButtonPair( IN_OFFHAND0, IN_OFFHAND1, IN_OFFHAND3 ) + + if ( clGlobal.isAnnouncementActive && (clGlobal.activeAnnouncement.messageText == "#HUD_CORE_ONLINE_STRYDER" || + clGlobal.activeAnnouncement.messageText == "#HUD_CORE_ONLINE_ATLAS" || + clGlobal.activeAnnouncement.messageText == "#HUD_CORE_ONLINE_OGRE" ) ) + { + clGlobal.levelEnt.Signal( "AnnoucementPurge" ) + } + break + + case "spectator": + LinkButtonPair( -1, -1, -1 ) + break + + default: + Assert( 0, "Unknown class " + newClass ) + } + + PlayActionMusic() +} + +function ShouldShowSpawnAsTitanHint( entity player ) +{ + if ( Time() - player.cv.deathTime < GetRespawnButtonCamTime( player ) ) + return false + + if ( GetGameState() < eGameState.Playing ) + return false + + if ( GetGameState() == eGameState.SwitchingSides ) + return false + + return !IsPlayerEliminated( player ) +} + +function ServerCallback_PlayerChangedTeams( player_eHandle, oldTeam, newTeam ) +{ + entity player = GetEntityFromEncodedEHandle( player_eHandle ) + if ( player == null ) + return + Assert( oldTeam != null ) + Assert( newTeam != null ) + + string playerName = player.GetPlayerNameWithClanTag() + vector playerNameColor = OBITUARY_COLOR_ENEMY + string teamString = "ENEMY" + if ( newTeam == GetLocalViewPlayer().GetTeam() ) + { + playerNameColor = OBITUARY_COLOR_FRIENDLY + teamString = "FRIENDLY" + } + + Obituary_Print( playerName, "CHANGED TEAMS TO", teamString, playerNameColor, OBITUARY_COLOR_WEAPON, playerNameColor ) + //"Switching " + player.GetPlayerNameWithClanTag() + " from " + GetTeamStr( team1 ) + " to " + GetTeamStr( team2 ) +} + +function ServerCallback_PlayerConnectedOrDisconnected( player_eHandle, state ) +{ + entity player = GetEntityFromEncodedEHandle( player_eHandle ) + PlayerConnectedOrDisconnected( player, state ) + + if ( !IsLobby() || !IsConnected() ) + UpdatePlayerStatusCounts() +} + +void function AddCallback_OnPlayerDisconnected( void functionref( entity ) callbackFunc ) +{ + Assert( !clGlobal.onPlayerDisconnectedFuncs.contains( callbackFunc ), "Already added " + string( callbackFunc ) + " with AddCallback_OnPlayerDisconnected" ) + + clGlobal.onPlayerDisconnectedFuncs.append( callbackFunc ) +} + +void function ClientCodeCallback_PlayerDisconnected( entity player, string cachedPlayerName ) +{ + PlayerConnectedOrDisconnected( player, 0, cachedPlayerName ) + + if ( ShouldUpdatePlayerStatusCounts() ) + UpdatePlayerStatusCounts() + + // Added via AddCallback_OnPlayerDisconnected + foreach ( callbackFunc in clGlobal.onPlayerDisconnectedFuncs ) + { + callbackFunc( player ) + } +} + +function ShouldUpdatePlayerStatusCounts() +{ + if ( GetGameState() < eGameState.WaitingForPlayers ) + return false + + if ( !IsLobby() ) + return true + + if ( !IsConnected() ) + return true + + return false +} + +function PlayerConnectedOrDisconnected( entity player, state, string disconnectingPlayerName = "" ) +{ + if ( IsLobby() || GetMapName() == "" ) + // HACK: If you are disconnecting GetMapName() in IsLobby() will return "" + return + + if ( !IsValid( player ) ) + return + + Assert( state == 0 || state == 1 ) + + if ( !IsValid( GetLocalViewPlayer() ) ) + return + + string playerName + if ( state == 0 ) + { + if ( disconnectingPlayerName == "" ) + return + + playerName = disconnectingPlayerName + Assert( typeof( playerName ) == "string" ) + } + else + { + playerName = player.GetPlayerNameWithClanTag() + Assert( typeof( playerName ) == "string" ) + } + + vector playerNameColor = player.GetTeam() == GetLocalViewPlayer().GetTeam() ? OBITUARY_COLOR_FRIENDLY : OBITUARY_COLOR_ENEMY + string connectionString = (state == 0) ? "#MP_PLAYER_DISCONNECTED" : "#MP_PLAYER_CONNECTED" + + Obituary_Print_Generic( connectionString, playerName, <255, 255, 255>, playerNameColor ) +} + +void function ClientCodeCallback_PlayerDidDamage( PlayerDidDamageParams params ) +{ + if ( IsWatchingThirdPersonKillReplay() ) + return + + entity attacker = GetLocalViewPlayer() + if ( !IsValid( attacker ) ) + return + + entity victim = params.victim + if ( !IsValid( victim ) ) + return + + vector damagePosition = params.damagePosition + int hitBox = params.hitBox + int damageType = params.damageType + float damageAmount = params.damageAmount + int damageFlags = params.damageFlags + int hitGroup = params.hitGroup + entity weapon = params.weapon + float distanceFromAttackOrigin = params.distanceFromAttackOrigin + + bool playHitSound = true + bool showCrosshairHitIndicator = true + bool hitIneffective = false + bool victimIsHeavyArmor = false + bool isCritShot = (damageType & DF_CRITICAL) ? true : false + bool isHeadShot = (damageType & DF_HEADSHOT) ? true : false + bool isKillShot = (damageType & DF_KILLSHOT) ? true : false + bool isMelee = (damageType & DF_MELEE) ? true : false + bool isExplosion = (damageType & DF_EXPLOSION) ? true : false + bool isBullet = (damageType & DF_BULLET) ? true : false + bool isShotgun = (damageType & DF_SHOTGUN) ? true : false + bool isDoomFatality = (damageType & DF_DOOM_FATALITY) ? true : false + bool isDoomProtected = ((damageType & DF_DOOM_PROTECTED) && !isDoomFatality) ? true : false + victimIsHeavyArmor = victim.GetArmorType() == ARMOR_TYPE_HEAVY + + isDoomFatality = false + isDoomProtected = false + + if ( isDoomProtected ) + RegisterDoomProtectionHintDamage( damageAmount ) + + bool playKillSound = isKillShot + + if ( !attacker.IsTitan() ) + { + if ( victimIsHeavyArmor ) + { + showCrosshairHitIndicator = true + if ( victim.IsTitan() ) + hitIneffective = false //!IsHitEffectiveVsTitan( victim, damageType ) + else + hitIneffective = isCritShot || isHeadShot || !IsHitEffectiveVsNonTitan( victim, damageType ) + } + else + { + switch ( victim.GetSignifierName() ) + { + case "npc_super_spectre": + //if ( !( damageType & DF_CRITICAL ) ) + // hitIneffective = true + + default: + if ( (damageType & DF_BULLET && damageType & DF_MAX_RANGE) ) + hitIneffective = true + break + } + } + } + else + { + if ( victim.IsTitan() && victim.IsPlayer() ) + { + if ( PlayerHasPassive( victim, ePassives.PAS_BERSERKER ) ) + hitIneffective = true + } + } + + if ( damageType & DF_MAX_RANGE && damageType & DF_BULLET ) + // TODO: this is crap; these damage types should just send DF_NO_HITBEEP + playHitSound = false + + if ( damageType & DF_TITAN_STEP ) + // TODO: this is crap; these damage types should just send DF_NO_HITBEEP + { + playHitSound = false + playKillSound = false + } + + if ( damageType & DF_MELEE ) + // TODO: this is crap; these damage types should just send DF_NO_HITBEEP + { + playHitSound = false + playKillSound = false + } + + if ( damageType & DF_NO_HITBEEP ) + { + playHitSound = false + playKillSound = false + } + + if ( damageFlags & DAMAGEFLAG_VICTIM_HAS_VORTEX ) + showCrosshairHitIndicator = false + + if ( damageType & DF_SHIELD_DAMAGE ) + { + PlayShieldHitEffect( params ) + showCrosshairHitIndicator = true + } + else if ( damageAmount <= 0 ) + { + playHitSound = false + playKillSound = false + showCrosshairHitIndicator = false + } + + if ( damageType & DF_NO_INDICATOR ) + { + playHitSound = false + playKillSound = false + showCrosshairHitIndicator = false + } + + if ( isDoomProtected ) + playHitSound = false + + if ( showCrosshairHitIndicator ) + { + Tracker_PlayerAttackedTarget( attacker, victim ) + + //if ( hitIneffective ) + // Crosshair_ShowHitIndicator( CROSSHAIR_HIT_INEFFECTIVE ) + //else + // Crosshair_ShowHitIndicator( CROSSHAIR_HIT_NORMAL ) + // + //if ( (isCritShot || isDoomFatality) && !isDoomProtected ) + // Crosshair_ShowHitIndicator( CROSSHAIR_HIT_CRITICAL ) + // + //if ( isHeadShot ) + // Crosshair_ShowHitIndicator( CROSSHAIR_HIT_HEADSHOT ) + + if ( IsMultiplayer() && !victim.IsTitan() && !victim.IsHologram() ) + PROTO_HitIndicatorEffect( attacker, victim, damagePosition, isHeadShot, isKillShot ) + + if ( isKillShot ) + KillShotBloodSpray( attacker, victim, damagePosition, isExplosion, isBullet, isShotgun ) + + if ( victim.IsTitan() && isKillShot ) + ClientScreenShake( 8, 10, 1, Vector( 0, 0, 0 ) ) + + BloodSprayDecals( attacker, victim, damagePosition, damageAmount, isHeadShot, isKillShot, isMelee, isExplosion, isBullet, isShotgun ) + + DamageFlyout( damageAmount, damagePosition, victim, isHeadShot || isCritShot, hitIneffective ) + } + + bool playedHitSound = false + if ( playHitSound ) + { + if ( isHeadShot ) + playedHitSound = PlayHeadshotConfirmSound( attacker, victim, isKillShot ) + else if ( playKillSound ) + playedHitSound = PlayKillshotConfirmSound( attacker, victim, damageType ) + } + + if ( IsSpectre( victim ) ) + { + if ( isHeadShot ) + victim.Signal( "SpectreGlowEYEGLOW" ) + } + + // Play a hit sound effect if we didn't play a kill shot sound, and other conditions are met + if ( playHitSound && IsAlive( victim ) && !playedHitSound ) + { + PlayHitSound( victim, attacker, damageFlags, isCritShot, victimIsHeavyArmor, isKillShot, hitGroup ) + } + + if ( PlayerHasPassive( attacker, ePassives.PAS_SMART_CORE ) && isKillShot ) + { + attacker.p.smartCoreKills++ + } + + foreach ( callback in clGlobal.onLocalPlayerDidDamageCallback ) + { + callback( attacker, victim, damagePosition, damageType ) + } +} + +void function PlayHitSound( entity victim, entity attacker, int damageFlags, bool isCritShot, bool victimIsHeavyArmor, bool isKillShot, int hitGroup ) +{ + if ( damageFlags & DAMAGEFLAG_VICTIM_INVINCIBLE ) + { + EmitSoundOnEntity( attacker, "Player.HitbeepInvincible" ) + } + else if ( damageFlags & DAMAGEFLAG_VICTIM_HAS_VORTEX ) + { + EmitSoundOnEntity( attacker, "Player.HitbeepVortex" ) + } + else if ( isCritShot && victimIsHeavyArmor ) + { + EmitSoundOnEntity( attacker, "titan_damage_crit" ) + } + else if ( isCritShot ) + { + EmitSoundOnEntity( attacker, "Player.Hitbeep_crit" ) + } + else + { + EmitSoundOnEntity( attacker, "Player.Hitbeep" ) + } +} + +function PROTO_HitIndicatorEffect( entity player, entity victim, vector damagePosition, bool isHeadShot, bool isKillShot ) +{ + int fxId + if ( isKillShot ) + fxId = GetParticleSystemIndex( $"P_ar_impact_pilot_kill" ) + else if ( isHeadShot && !isKillShot ) + return + // fxId = GetParticleSystemIndex( $"P_ar_impact_pilot_headshot" ) + else + return + // fxId = GetParticleSystemIndex( $"P_ar_impact_pilot" ) + + vector victimVelocity = victim.GetVelocity() + damagePosition += (Length( victimVelocity ) * 0.15) * Normalize( victimVelocity ) + vector fxOffset = damagePosition - victim.GetOrigin() + StartParticleEffectOnEntityWithPos( victim, fxId, FX_PATTACH_ABSORIGIN_FOLLOW, -1, damagePosition - victim.GetOrigin(), <0, 0, 0> ) +} + +void function KillShotBloodSpray( entity player, entity victim, vector damagePosition, bool isExplosion, bool isBullet, bool isShotgun ) +{ + if ( IsSoftenedLocale() ) + return + + if ( !victim.IsHuman() && !IsProwler( victim ) ) + return + + if ( victim.IsMechanical() ) + return + + if ( victim.IsHologram() ) + return + + if ( !isExplosion && !isBullet && !isShotgun ) + return + + int fxId = GetParticleSystemIndex( FX_KILLSHOT_BLOODSPRAY ) + + vector victimVelocity = victim.GetVelocity() + damagePosition += (Length( victimVelocity ) * 0.15) * Normalize( victimVelocity ) + StartParticleEffectOnEntityWithPos( victim, fxId, FX_PATTACH_ABSORIGIN_FOLLOW, -1, damagePosition - victim.GetOrigin(), <0, 0, 0> ) +} + +void function BloodSprayDecals( entity player, entity victim, vector damagePosition, float damageAmount, bool isHeadShot, bool isKillShot, bool isMelee, bool isExplosion, bool isBullet, bool isShotgun ) +{ + if ( IsSoftenedLocale() || !Flag( "EnableBloodSprayDecals" ) ) + return + + if ( !victim.IsHuman() && !IsProwler( victim ) ) + return + + if ( victim.IsMechanical() ) + return + + if ( victim.IsHologram() ) + return + + if ( !isMelee && !isExplosion && !isBullet && !isShotgun ) + return + + // in MP, too expensive to do on every shot + if ( IsMultiplayer() && !isKillShot ) + return + + thread BloodSprayDecals_Think( player, victim, damagePosition, damageAmount, isHeadShot, isKillShot, isMelee, isExplosion, isBullet, isShotgun ) +} + +void function BloodSprayDecals_Think( entity player, entity victim, vector damagePosition, float damageAmount, bool isHeadShot, bool isKillShot, bool isMelee, bool isExplosion, bool isBullet, bool isShotgun ) +{ + player.EndSignal( "OnDestroy" ) + victim.EndSignal( "OnDestroy" ) + + BloodDecalParams params = BloodDecal_GetParams( damageAmount, isHeadShot, isKillShot, isMelee, isExplosion, isBullet, isShotgun ) + float traceDist = params.traceDist + float secondaryTraceDist = params.secondaryTraceDist + asset fxType = params.fxType + asset secondaryFxType = params.secondaryFxType + + int fxId = GetParticleSystemIndex( fxType ) + + // PRIMARY TRACES + vector traceStart = damagePosition + vector traceFwd = player.GetViewVector() + + if ( isExplosion || isMelee ) + { + // for explosion/melee damage, use chest instead of actual damage position + int attachID = victim.LookupAttachment( "CHESTFOCUS" ) + traceStart = victim.GetAttachmentOrigin( attachID ) + + if ( isExplosion ) + traceFwd = AnglesToForward( victim.GetAngles() ) * -1 + } + + vector traceEnd = damagePosition + (traceFwd * traceDist) + //TraceResults traceResult = TraceLine( traceStart, traceEnd, victim, TRACE_MASK_SHOT, TRACE_COLLISION_GROUP_NONE ) + + var deferredTrace_primary = DeferredTraceLineHighDetail( traceStart, traceEnd, victim, TRACE_MASK_SHOT, TRACE_COLLISION_GROUP_NONE ) + + while( !IsDeferredTraceFinished( deferredTrace_primary ) ) + WaitFrame() + + TraceResults traceResult = GetDeferredTraceResult( deferredTrace_primary ) + + vector primaryTraceEndPos = traceResult.endPos + vector primaryTraceNormal = traceResult.surfaceNormal + //DebugDrawLine( traceStart, traceEnd, 255, 150, 0, true, 5 ) + //DebugDrawSphere( primaryTraceEndPos, 8.0, 255, 0, 0, true, 5 ) + + bool doGravitySplat = isMelee ? false : true + + if ( traceResult.fraction < 1.0 ) + { + vector normAng = VectorToAngles( traceResult.surfaceNormal ) + vector fxAng = AnglesCompose( normAng, < 90, 0, 0 > ) + + StartParticleEffectInWorld( fxId, primaryTraceEndPos, fxAng ) + //DebugDrawAngles( endPos, fxAng, 5 ) + } + else if ( doGravitySplat ) + { + // trace behind the guy on the ground and put a decal there + float gravitySplatBackTraceDist = 58.0 // how far behind the guy to put the gravity splat + float gravitySplatDownTraceDist = 100.0 // max dist vertically to try to trace and put a gravity splat + vector groundTraceStartPos = damagePosition + (traceFwd * gravitySplatBackTraceDist) + vector groundTraceEndPos = groundTraceStartPos - <0, 0, 100> + + var deferredTrace_gravitySplat = DeferredTraceLineHighDetail( groundTraceStartPos, groundTraceEndPos, victim, TRACE_MASK_SHOT, TRACE_COLLISION_GROUP_NONE ) + + while( !IsDeferredTraceFinished( deferredTrace_gravitySplat ) ) + WaitFrame() + + TraceResults downTraceResult = GetDeferredTraceResult( deferredTrace_gravitySplat ) + + if ( downTraceResult.fraction < 1.0 ) + { + //DebugDrawLine( groundTraceStartPos, downTraceResult.endPos, 255, 150, 0, true, 5 ) + //DebugDrawSphere( downTraceResult.endPos, 4.0, 255, 0, 0, true, 5 ) + + vector normAng = VectorToAngles( downTraceResult.surfaceNormal ) + vector fxAng = AnglesCompose( normAng, < 90, 0, 0 > ) + + //DebugDrawAngles( downTraceResult.endPos, fxAng, 5 ) + + StartParticleEffectInWorld( fxId, downTraceResult.endPos, fxAng ) + } + } + + // MP doesn't want secondaries, too expensive + if ( IsMultiplayer() ) + return + + // SECONDARY TRACES + array testVecs = [] + vector tempAng = VectorToAngles( traceFwd ) + + if ( isExplosion ) + { + // for explosions, different & more angles for secondary splatter + testVecs.append( AnglesToRight( tempAng ) ) + testVecs.append( AnglesToRight( tempAng ) * -1 ) + testVecs.append( traceFwd * -1 ) + testVecs.append( AnglesToUp( tempAng ) ) + testVecs.append( AnglesToUp( tempAng ) * -1 ) + } + else + { + // mostly to cover edge cases involving corners + vector traceRight = AnglesToRight( tempAng ) + vector traceLeft = traceRight * -1 + vector backLeft = (traceFwd + traceLeft) * 0.5 + vector backRight = (traceFwd + traceRight) * 0.5 + testVecs.append( backRight ) + testVecs.append( backLeft ) + + // add blood on the ground for these weapons too + if ( isBullet || isShotgun ) + testVecs.append( AnglesToUp( tempAng ) * -1 ) + } + + if ( !testVecs.len() ) + return + + array secondaryDeferredTraces = [] + foreach ( testVec in testVecs ) + { + vector secondaryTraceEnd = traceStart + (testVec * secondaryTraceDist) + var secondaryDeferredTrace = DeferredTraceLineHighDetail( traceStart, secondaryTraceEnd, victim, TRACE_MASK_SHOT, TRACE_COLLISION_GROUP_NONE ) + secondaryDeferredTraces.append( secondaryDeferredTrace ) + } + + int secondaryFxId = GetParticleSystemIndex( secondaryFxType ) + + float startTime = Time() + array processedResults = [] + while ( processedResults.len() < secondaryDeferredTraces.len() ) + { + WaitFrame() + + foreach ( deferredTrace in secondaryDeferredTraces ) + { + if ( processedResults.contains( deferredTrace ) ) + continue + + if ( !IsDeferredTraceFinished( deferredTrace ) ) + continue + + processedResults.append( deferredTrace ) + + TraceResults traceResult = GetDeferredTraceResult( deferredTrace ) + + if ( traceResult.fraction == 1.0 ) + continue + + // don't put secondaries on the same wall as the primary + vector secondaryTraceNormal = traceResult.surfaceNormal + if ( primaryTraceNormal == secondaryTraceNormal ) + continue + + vector normAng = VectorToAngles( secondaryTraceNormal ) + vector fxAng = AnglesCompose( normAng, < 90, 0, 0 > ) + + vector endPos = traceResult.endPos + //DebugDrawSphere( endPos, 4.0, 255, 0, 0, true, 5 ) + StartParticleEffectInWorld( secondaryFxId, endPos, fxAng ) + } + + // timeout if traces aren't returning + if ( Time() - startTime >= 0.3 ) + return + } +} + +BloodDecalParams function BloodDecal_GetParams( float damageAmount, bool isHeadShot, bool isKillShot, bool isMelee, bool isExplosion, bool isBullet, bool isShotgun ) +{ + // default: bullet damage + float traceDist = 175 + float secondaryTraceDist = 100 + asset fxType = FX_BLOODSPRAY_DECAL_SML + asset secondaryFxType = FX_BLOODSPRAY_DECAL_SML + + if ( isBullet ) + { + // HACK- shotguns report isBullet also + if ( isShotgun ) + { + //if ( isKillShot ) + // fxType = FX_BLOODSPRAY_DECAL_LRG + //else + fxType = FX_BLOODSPRAY_DECAL_MED + } + else + { + if ( isKillShot ) + fxType = FX_BLOODSPRAY_DECAL_MED + else + fxType = FX_BLOODSPRAY_DECAL_SML + + if ( damageAmount >= 200 ) + { + traceDist = 216 + fxType = FX_BLOODSPRAY_DECAL_LRG + secondaryFxType = FX_BLOODSPRAY_DECAL_MED + } + } + } + + else if ( isExplosion ) + { + secondaryTraceDist = traceDist + + float maxDmg = 100 + float medDmg = 75 + + if ( damageAmount >= maxDmg ) + { + fxType = FX_BLOODSPRAY_DECAL_LRG + secondaryFxType = FX_BLOODSPRAY_DECAL_LRG + } + else if ( damageAmount >= medDmg ) + { + fxType = FX_BLOODSPRAY_DECAL_LRG + secondaryFxType = FX_BLOODSPRAY_DECAL_MED + } + else if ( isKillShot ) + { + fxType = FX_BLOODSPRAY_DECAL_MED + secondaryFxType = FX_BLOODSPRAY_DECAL_MED + } + } + + else if ( isMelee ) + { + traceDist = 96 + + if ( isKillShot ) + fxType = FX_BLOODSPRAY_DECAL_MED + } + + // for kills, increase trace distance a bit + if ( isKillShot ) + { + traceDist = traceDist + (traceDist * 0.1) + secondaryTraceDist = secondaryTraceDist + (secondaryTraceDist * 0.1) + } + + BloodDecalParams params + params.traceDist = traceDist + params.secondaryTraceDist = secondaryTraceDist + params.fxType = fxType + params.secondaryFxType = secondaryFxType + return params +} + +#if DEV +string function BloodSprayDecals_Toggle() +{ + string returnStr = "" + + if ( Flag( "EnableBloodSprayDecals" ) ) + { + FlagClear( "EnableBloodSprayDecals" ) + returnStr = "Blood spray decals DISABLED" + } + else + { + FlagSet( "EnableBloodSprayDecals" ) + returnStr = "Blood spray decals ENABLED" + } + + return returnStr +} +#endif + +function ServerCallback_RodeoerEjectWarning( soulHandle, ejectTime ) +{ + entity soul = GetEntityFromEncodedEHandle( soulHandle ) + + if ( !IsValid( soul ) ) + return + + thread TitanEjectHatchSequence( soul, ejectTime ) +} + +function TitanEjectHatchSequence( soul, ejectTime ) +{ + expect entity( soul ) + + soul.EndSignal( "OnSoulTransfer" ) + soul.EndSignal( "OnTitanDeath" ) + soul.EndSignal( "OnDestroy" ) + + local effects = [] + + OnThreadEnd( + function() : ( effects ) + { + foreach ( effect in effects ) + { + if ( !EffectDoesExist( effect ) ) + continue + + EffectStop( effect, true, true ) + } + } + ) + + int boltCount = 6 + int fxID = GetParticleSystemIndex( $"xo_spark_bolt" ) + + for ( int index = 0; index < boltCount; index++ ) + { + entity titan = soul.GetTitan() + + WaitEndFrame() // so OnTitanDeath/Destroy can happen + + if ( !IsAlive( titan ) ) + return + + if ( !titan.IsTitan() ) + { + printt( "WARNING: " + titan + " is not a Titan!" ) + return + } + + int attachID = titan.LookupAttachment( "HATCH_BOLT" + (index + 1) ) + //printt( "attachID is " + attachID ) + vector boltOrgin = titan.GetAttachmentOrigin( attachID ) + vector boltAngles = titan.GetAttachmentAngles( attachID ) + vector launchVec = AnglesToForward( boltAngles ) * 500 + + CreateClientsideGib( $"models/industrial/bolt_tiny01.mdl", boltOrgin, boltAngles, launchVec, < 0, 0, 0 >, 3.0, 1000.0, 200.0 ) + int effect = PlayFXOnTag( titan, fxID, attachID ) + effects.append( effect ) + EmitSoundOnEntity( titan, "titan_bolt_loose" ) + + wait (ejectTime / boltCount) + } +} + +void function ServerCallback_OnEntityKilled( attackerEHandle, victimEHandle, int scriptDamageType, damageSourceId ) +{ + expect int( damageSourceId ) + + bool isHeadShot = (scriptDamageType & DF_HEADSHOT) > 0 + + entity victim = GetEntityFromEncodedEHandle( victimEHandle ) + entity attacker = attackerEHandle ? GetHeavyWeightEntityFromEncodedEHandle( attackerEHandle ) : null + entity localClientPlayer = GetLocalClientPlayer() + + if ( !IsValid( victim ) ) + return + + Signal( victim, "OnDeath" ) + + if ( victim == localClientPlayer ) + { + victim.cv.deathOrigin = victim.GetOrigin() + level.clientsLastKiller = attacker + } + + if ( damageSourceId == eDamageSourceId.indoor_inferno ) + { + if ( victim == localClientPlayer ) + thread PlayerFieryDeath( victim ) + } + + UpdatePlayerStatusCounts() + + if ( IsValid( attacker ) && attacker.IsPlayer() ) + { + PlayTargetEliminatedTitanVO( attacker, victim ) + + if ( attacker == GetLocalViewPlayer() ) + WeaponFlyoutRefresh() // refreshes to display xp gained from kills + } + else if ( victim.IsPlayer() ) + { + if ( ("latestAssistTime" in victim.s) && victim.s.latestAssistTime >= Time() - MAX_NPC_KILL_STEAL_PREVENTION_TIME ) + { + attacker = expect entity( victim.s.latestAssistPlayer ) + damageSourceId = expect int( victim.s.latestAssistDamageSource ) + } + } + + if ( victim.IsPlayer() && victim != attacker ) + { + if ( attacker == localClientPlayer ) + { + thread PlayKillConfirmedSound( "Pilot_Killed_Indicator" ) + } + else if ( IsValid( attacker ) && attacker.IsTitan() ) + { + entity bossPlayer = attacker.GetBossPlayer() + if ( bossPlayer && bossPlayer == localClientPlayer ) + thread PlayKillConfirmedSound( "Pilot_Killed_Indicator" ) + } + } + else if ( (IsGrunt( victim ) || IsSpectre( victim )) && attacker == localClientPlayer ) + { + thread PlayKillConfirmedSound( "HUD_Grunt_Killed_Indicator" ) + } + + //if it's an auto titan, the obit was already printed when doomed + if ( (victim.IsTitan()) && (!victim.IsPlayer()) ) + return + + Obituary( attacker, "", victim, scriptDamageType, damageSourceId, isHeadShot ) +} + + +const float KILL_CONFIRM_DEBOUNCE = 0.025 +void function PlayKillConfirmedSound( string sound ) +{ + while ( true ) + { + if ( Time() - clGlobal.lastKillConfirmTime > KILL_CONFIRM_DEBOUNCE ) + { + clGlobal.lastKillConfirmTime = Time() + EmitSoundOnEntity( GetLocalClientPlayer(), sound ) + return + } + + WaitFrame() + } +} + +void function ServerCallback_OnTitanKilled( int attackerEHandle, int victimEHandle, int scriptDamageType, int damageSourceId ) +{ + //Gets run on every client whenever a titan is doomed by another player + bool isHeadShot = false + entity attacker = attackerEHandle != -1 ? GetEntityFromEncodedEHandle( attackerEHandle ) : null + entity victim = GetEntityFromEncodedEHandle( victimEHandle ) + + if ( (!IsValid( victim )) || (!IsValid( attacker )) ) + return + + //Obit: titans get scored/obits when doomed, so we don't want to just see "Player" in the obit, we want to see "Player's Titan" + bool victimIsOwnedTitan = victim.IsPlayer() + Obituary( attacker, "", victim, scriptDamageType, damageSourceId, isHeadShot, victimIsOwnedTitan ) +} + +function PlayTargetEliminatedTitanVO( attacker, victim ) +{ + entity localPlayer = GetLocalViewPlayer() + + if ( attacker != localPlayer ) + return + + if ( !victim.IsPlayer() ) + return + + if ( victim.IsTitan() ) + { + // a bit more delay for a titan explosion to clear + thread TitanCockpit_PlayDialogDelayed( localPlayer, 1.3, "elimTarget" ) + } + else + { + thread TitanCockpit_PlayDialogDelayed( localPlayer, 0.8, "elimEnemyPilot" ) + } +} + +function ServerCallback_SetAssistInformation( damageSourceId, attackerEHandle, entityEHandle, assistTime ) +{ + local ent = GetHeavyWeightEntityFromEncodedEHandle( entityEHandle ) + if ( !ent ) + return + + local latestAssistPlayer = GetEntityFromEncodedEHandle ( attackerEHandle ) + if ( !("latestAssistPlayer" in ent.s) ) + { + ent.s.latestAssistPlayer <- latestAssistPlayer + ent.s.latestAssistDamageSource <- damageSourceId + ent.s.latestAssistTime <- assistTime + } + else + { + ent.s.latestAssistPlayer = latestAssistPlayer + ent.s.latestAssistDamageSource = damageSourceId + ent.s.latestAssistTime = assistTime + } +} + +void function ClientCodeCallback_OnModelChanged( entity ent ) +{ +/* + // OnModelChanged gets called for each model change, but gets processed after the model has done all switches + + if ( !IsValid( ent ) ) + return; + + if ( !("creationCount" in ent.s) ) + return; + + Assert( ent instanceof C_BaseAnimating ); +*/ +} + + +void function ClientCodeCallback_OnHealthChanged( entity ent, int oldHealth, int newHealth ) +{ + if ( IsLobby() ) + return + + entity player = GetLocalViewPlayer() + if ( !IsValid( player ) ) + return + + if ( !IsValid( ent ) ) + return + + ent.Signal( "HealthChanged", { oldHealth = oldHealth, newHealth = newHealth } ) +} + +void function ClientCodeCallback_OnCrosshairCurrentTargetChanged( entity player, entity newTarget ) +{ + if ( IsLobby() ) + return; + if ( !IsValid( player ) ) + return + + if ( IsValid( newTarget ) ) + TryOfferRodeoBatteryHint( newTarget ) +} + +void function SetupPlayerAnimEvents( entity player ) +{ + SetupPlayerJumpJetAnimEvents( player ) + AddAnimEvent( player, "WallHangAttachDataKnife", WallHangAttachDataKnife ) +} + +void function JumpRandomlyForever() +{ + for (;; ) + { + if ( IsWatchingReplay() ) + { + wait 1 + continue + } + + entity player = GetLocalClientPlayer() + if ( !IsAlive( player ) || player != GetLocalViewPlayer() ) + { + wait 1 + continue + } + + printt( "jump!" ) + player.ClientCommand( "+jump" ) + wait 0 + player.ClientCommand( "-jump" ) + + wait RandomFloatRange( 0.2, 1.1 ) + } +} + +void function RemoteTurretFadeoutAnimEvent( entity ent ) +{ + entity player = GetLocalViewPlayer() + ScreenFade( player, 0, 0, 0, 255, 0.1, 0.25, FFADE_OUT ); +} + +void function SetupFirstPersonProxyEvents( entity firstPersonProxy ) +{ + //printt( "SetupFirstPersonProxyEvents" ) + + AddAnimEvent( firstPersonProxy, "mantle_smallmantle", OnSmallMantle ) + AddAnimEvent( firstPersonProxy, "mantle_mediummantle", OnMediumMantle ) + AddAnimEvent( firstPersonProxy, "mantle_lowmantle", OnLowMantle ) + AddAnimEvent( firstPersonProxy, "mantle_extralowmantle", OnExtraLowMantle ) + AddAnimEvent( firstPersonProxy, "remoteturret_fadeout", RemoteTurretFadeoutAnimEvent ) +} + +void function OnSmallMantle( entity firstPersonProxy ) //Was set up in script instead of anim to be able to play quieter sounds with stealth passive. No longer needed, but more work to move inside of anim +{ + entity player = GetLocalViewPlayer() + EmitSoundOnEntity( firstPersonProxy, "mantle_smallmantle" ) +} + +void function OnMediumMantle( entity firstPersonProxy ) //Was set up in script instead of anim to be able to play quieter sounds with stealth passive. No longer needed, but more work to move inside of anim +{ + entity player = GetLocalViewPlayer() + EmitSoundOnEntity( firstPersonProxy, "mantle_mediummantle" ) +} + +void function OnLowMantle( entity firstPersonProxy ) //Was set up in script instead of anim to be able to play quieter sounds with stealth passive. No longer needed, but more work to move inside of anim +{ + entity player = GetLocalViewPlayer() + EmitSoundOnEntity( firstPersonProxy, "mantle_lowmantle" ) +} + +void function OnExtraLowMantle( entity firstPersonProxy ) //Was set up in script instead of anim to be able to play quieter sounds with stealth passive. No longer needed, but more work to move inside of anim +{ + entity player = GetLocalViewPlayer() + EmitSoundOnEntity( firstPersonProxy, "mantle_extralow" ) +} + +void function CreateCallback_TitanSoul( entity ent ) +{ +} + +bool function ShouldHideRespawnSelectionText( entity player ) +{ + if ( player != GetLocalClientPlayer() ) + return false + if ( player.GetPlayerClass() != "spectator" ) + return false + if ( IsWatchingReplay() ) + return false + + return true +} + + + +void function WallHangAttachDataKnife( entity player ) +{ + int attachIdx = player.LookupAttachment( "l_hand" ) + if ( attachIdx == 0 ) + // hack while i wait for the attachment to be fixed + return + + entity dataknife = CreateClientSidePropDynamic( player.GetAttachmentOrigin( attachIdx ), player.GetAttachmentAngles( attachIdx ), DATA_KNIFE_MODEL ) + dataknife.SetParent( player, "l_hand" ) + + thread DeleteDataKnifeAfterWallHang( player, dataknife ) +} + +void function DeleteDataKnifeAfterWallHang( entity player, entity dataknife ) +{ + OnThreadEnd( + function() : ( dataknife ) + { + if ( IsValid( dataknife ) ) + dataknife.Kill_Deprecated_UseDestroyInstead() + } + ) + + player.EndSignal( "OnDeath" ) + player.EndSignal( "OnDestroy" ) + + for (;; ) + { + Wait( 0.1 ) + if ( !player.IsWallHanging() ) + break + } +} + +bool function ClientCodeCallback_OnGib( entity victim, vector attackDir ) +{ + if ( !victim.IsMechanical() ) + return SpawnFleshGibs( victim, attackDir ) + + return false +} + +bool function SpawnFleshGibs( entity victim, vector attackDir ) +{ + asset modelName = $"models/gibs/human_gibs.mdl" + attackDir = Normalize( attackDir ) + + float cullDist = 2048.0 + if ( "gibDist" in victim.s ) + cullDist = expect float( victim.s.gibDist ) + + vector startOrigin = victim.GetWorldSpaceCenter() + (attackDir * -30) + + vector origin = victim.GetOrigin() + < RandomIntRange( 10, 20 ), RandomIntRange( 10, 20 ), RandomIntRange( 32, 64 ) > + vector angles = < 0, 0, 0 > + vector flingDir = attackDir * RandomIntRange( 80, 200 ) + + int fxID + bool isSoftenedLocale = IsSoftenedLocale() + + if ( isSoftenedLocale ) + { + if ( victim.GetModelName() == FLYER_MODEL ) + fxID = StartParticleEffectOnEntity( victim, GetParticleSystemIndex( $"death_pinkmist_LG_nochunk" ), FX_PATTACH_ABSORIGIN_FOLLOW, 0 ) + else + fxID = StartParticleEffectOnEntity( victim, GetParticleSystemIndex( $"death_pinkmist_nochunk" ), FX_PATTACH_ABSORIGIN_FOLLOW, 0 ) + } + else + { + if ( victim.GetModelName() == FLYER_MODEL ) + fxID = StartParticleEffectOnEntity( victim, GetParticleSystemIndex( $"death_pinkmist_LG" ), FX_PATTACH_ABSORIGIN_FOLLOW, 0 ) + else + fxID = StartParticleEffectOnEntity( victim, GetParticleSystemIndex( $"death_pinkmist" ), FX_PATTACH_ABSORIGIN_FOLLOW, 0 ) + } + + EffectSetControlPointVector( fxID, 1, flingDir ) + + if ( isSoftenedLocale ) + return true + + vector angularVel = < 0, 0, 0 > + float lifeTime = 10.0 + CreateClientsideGibWithBodyGroupGibs( modelName, victim.GetOrigin(), angles, attackDir, angularVel, lifeTime, cullDist, 1024 ) + + return true +} + +function ServerCallback_PlayScreenFXWarpJump() +{ + if ( IsWatchingReplay() ) + return false + + thread PlayScreenFXWarpJump( GetLocalClientPlayer() ) +} + +void function PlayScreenFXWarpJump( entity clientPlayer ) +{ + clientPlayer.EndSignal( "OnDeath" ) + clientPlayer.EndSignal( "OnDestroy" ) + + entity player = GetLocalViewPlayer() + int index = GetParticleSystemIndex( SCREENFX_WARPJUMP ) + int indexD = GetParticleSystemIndex( SCREENFX_WARPJUMPDLIGHT ) + int fxID = StartParticleEffectInWorldWithHandle( index, < 0, 0, 0 >, < 0, 0, 0 > ) + int fxID2 = -1 + if ( IsValid( player.GetCockpit() ) ) + { + fxID2 = StartParticleEffectOnEntity( player, indexD, FX_PATTACH_POINT_FOLLOW, player.GetCockpit().LookupAttachment( "CAMERA" ) ) + EffectSetIsWithCockpit( fxID2, true ) + } + + OnThreadEnd( + function() : ( clientPlayer, fxID, fxID2 ) + { + if ( IsValid( clientPlayer ) && !IsAlive( clientPlayer ) ) + { + EffectStop( fxID, true, false ) + if ( fxID2 > -1 ) + EffectStop( fxID2, true, false ) + } + } + ) + + wait 3.2 + if ( IsValid( player.GetCockpit() ) ) + thread TonemappingUpdateAfterWarpJump() +} + +const EXPOSURE_RAMPDOWN_DURATION = 2 +const EXPOSURE_RAMPDOWN_MAX = 20 +const EXPOSURE_RAMPDOWN_MIN = 0 +const MAX_RAMPDOWN_DURATION = 5 +const MAX_RAMPDOWN_MAX = 3 +const MAX_RAMPDOWN_MIN = 1 + +function TonemappingUpdateAfterWarpJump() +{ + // Turn cubemaps black inside drop ship, since it's pretty dark in there anyway and we don't have a great way to take a valid cubemap shot for that location. + SetConVarFloat( "mat_envmap_scale", 0 ); + + AutoExposureSetMaxExposureMultiplier( 500 ); // allow exposure to actually go bright, even if it's clamped in the level. + + // Start the exposure super bright behind the white FX, and ramp it down quickly to normal. + local startTime = Time() + while( 1 ) + { + local time = Time() - startTime + float factor = GraphCapped( time, 0, EXPOSURE_RAMPDOWN_DURATION, 1, 0 ) + local toneMapScale = EXPOSURE_RAMPDOWN_MIN + (EXPOSURE_RAMPDOWN_MAX - EXPOSURE_RAMPDOWN_MIN) * factor * factor * factor * factor + AutoExposureSetExposureCompensationBias( toneMapScale ) + AutoExposureSnap() + wait 0 + if ( factor == 0 ) + break; + } + + // Ramp the max exposure multiplier back down to 1 gently + startTime = Time() + while( 1 ) + { + local time = Time() - startTime + float factor = GraphCapped( time, 0, MAX_RAMPDOWN_DURATION, 1, 0 ) + local scale = MAX_RAMPDOWN_MIN + (MAX_RAMPDOWN_MAX - MAX_RAMPDOWN_MIN) * factor * factor + AutoExposureSetMaxExposureMultiplier( scale ); + wait 0 + if ( factor == 0 ) + break; + } +} + +function SetPanelAlphaOverTime( panel, alpha, duration ) +{ + // HACK this should be a code command - Mackey + Signal( panel, "PanelAlphaOverTime" ) + EndSignal( panel, "PanelAlphaOverTime" ) + EndSignal( panel, "OnDestroy" ) + + local startTime = Time() + local endTime = startTime + duration + local startAlpha = panel.GetPanelAlpha() + + while( Time() <= endTime ) + { + float a = GraphCapped( Time(), startTime, endTime, startAlpha, alpha ) + panel.SetPanelAlpha( a ) + WaitFrame() + } + + panel.SetPanelAlpha( alpha ) +} + + + +function HandleDoomedState( entity player, entity titan ) +{ + bool isDoomed = GetDoomedState( titan ) + if ( isDoomed ) + { + titan.Signal( "Doomed" ) + + if ( HasSoul( titan ) ) + { + entity soul = titan.GetTitanSoul() + soul.Signal( "Doomed" ) + } + } +} + +const asset SHIELD_BREAK_FX = $"P_xo_armor_break_CP" +function PlayShieldBreakEffect( entity ent ) +{ + entity shieldEnt = ent + if ( IsSoul( ent ) ) + { + shieldEnt = ent.GetTitan() + if ( !shieldEnt ) + return + } + + float shieldHealthFrac = GetShieldHealthFrac( shieldEnt ) + + int shieldBreakFX = GetParticleSystemIndex( SHIELD_BREAK_FX ) + + local attachID + if ( shieldEnt.IsTitan() ) + attachID = shieldEnt.LookupAttachment( "exp_torso_main" ) + else + attachID = shieldEnt.LookupAttachment( "ref" ) // TEMP + + local shieldFXHandle = StartParticleEffectOnEntity( shieldEnt, shieldBreakFX, FX_PATTACH_POINT_FOLLOW, attachID ) + EffectSetControlPointVector( shieldFXHandle, 1, GetShieldEffectCurrentColor( 1 - shieldHealthFrac ) ) +} + +function PlayShieldActivateEffect( entity ent ) +{ + entity shieldEnt = ent + if ( IsSoul( ent ) ) + { + shieldEnt = ent.GetTitan() + if ( !shieldEnt ) + return + } + + float shieldHealthFrac = GetShieldHealthFrac( shieldEnt ) + + int shieldBreakFX = GetParticleSystemIndex( SHIELD_BREAK_FX ) + + local attachID + if ( shieldEnt.IsTitan() ) + attachID = shieldEnt.LookupAttachment( "exp_torso_main" ) + else + attachID = shieldEnt.LookupAttachment( "ref" ) // TEMP + + local shieldFXHandle = StartParticleEffectOnEntity( shieldEnt, shieldBreakFX, FX_PATTACH_POINT_FOLLOW, attachID ) + EffectSetControlPointVector( shieldFXHandle, 1, GetShieldEffectCurrentColor( 1 - shieldHealthFrac ) ) +} + +function PlayIt( entity victim ) +{ + float shieldHealthFrac = GetShieldHealthFrac( victim ) + + int shieldbodyFX = GetParticleSystemIndex( SHIELD_BODY_FX ) + local attachID + if ( victim.IsTitan() ) + attachID = victim.LookupAttachment( "exp_torso_main" ) + else + attachID = victim.LookupAttachment( "ref" ) // TEMP + + local shieldFXHandle = StartParticleEffectOnEntity( victim, shieldbodyFX, FX_PATTACH_POINT_FOLLOW, attachID ) + + EffectSetControlPointVector( shieldFXHandle, 1, GetShieldEffectCurrentColor( 1 - shieldHealthFrac ) ) +} + +function PlayShieldHitEffect( PlayerDidDamageParams params ) +{ + entity player = GetLocalViewPlayer() + entity victim = params.victim + //vector damagePosition = params.damagePosition + //int hitBox = params.hitBox + //int damageType = params.damageType + //float damageAmount = params.damageAmount + //int damageFlags = params.damageFlags + //int hitGroup = params.hitGroup + //entity weapon = params.weapon + //float distanceFromAttackOrigin = params.distanceFromAttackOrigin + + //shieldFX <- GetParticleSystemIndex( SHIELD_FX ) + //StartParticleEffectInWorld( shieldFX, damagePosition, player.GetViewVector() * -1 ) + + float shieldHealthFrac = GetShieldHealthFrac( victim ) + + int shieldbodyFX = GetParticleSystemIndex( SHIELD_BODY_FX ) + local attachID + if ( victim.IsTitan() ) + attachID = victim.LookupAttachment( "exp_torso_main" ) + else + attachID = victim.LookupAttachment( "ref" ) // TEMP + + local shieldFXHandle = StartParticleEffectOnEntity( victim, shieldbodyFX, FX_PATTACH_POINT_FOLLOW, attachID ) + + EffectSetControlPointVector( shieldFXHandle, 1, GetShieldEffectCurrentColor( 1 - shieldHealthFrac ) ) +} + +const table SHIELD_COLOR_CHARGE_FULL = { r = 115, g = 247, b = 255 } // blue +const table SHIELD_COLOR_CHARGE_MED = { r = 200, g = 128, b = 80 } // orange +const table SHIELD_COLOR_CHARGE_EMPTY = { r = 200, g = 80, b = 80 } // red + +const SHIELD_COLOR_CROSSOVERFRAC_FULL2MED = 0.75 // from zero to this fraction, fade between full and medium charge colors +const SHIELD_COLOR_CROSSOVERFRAC_MED2EMPTY = 0.95 // from "full2med" to this fraction, fade between medium and empty charge colors + +function GetShieldEffectCurrentColor( shieldHealthFrac ) +{ + local color1 = SHIELD_COLOR_CHARGE_FULL + local color2 = SHIELD_COLOR_CHARGE_MED + local color3 = SHIELD_COLOR_CHARGE_EMPTY + + local crossover1 = SHIELD_COLOR_CROSSOVERFRAC_FULL2MED // from zero to this fraction, fade between color1 and color2 + local crossover2 = SHIELD_COLOR_CROSSOVERFRAC_MED2EMPTY // from crossover1 to this fraction, fade between color2 and color3 + + local colorVec = < 0, 0, 0 > + // 0 = full charge, 1 = no charge remaining + if ( shieldHealthFrac < crossover1 ) + { + colorVec.x = Graph( shieldHealthFrac, 0, crossover1, color1.r, color2.r ) + colorVec.y = Graph( shieldHealthFrac, 0, crossover1, color1.g, color2.g ) + colorVec.z = Graph( shieldHealthFrac, 0, crossover1, color1.b, color2.b ) + } + else if ( shieldHealthFrac < crossover2 ) + { + colorVec.x = Graph( shieldHealthFrac, crossover1, crossover2, color2.r, color3.r ) + colorVec.y = Graph( shieldHealthFrac, crossover1, crossover2, color2.g, color3.g ) + colorVec.z = Graph( shieldHealthFrac, crossover1, crossover2, color2.b, color3.b ) + } + else + { + // for the last bit of overload timer, keep it max danger color + colorVec.x = color3.r + colorVec.y = color3.g + colorVec.z = color3.b + } + + return colorVec +} + + + +void function PlayPlayerDeathSound( entity player ) +{ + if ( IsPlayerEliminated( player ) ) + EmitSoundOnEntity( player, "player_death_begin_elimination" ) + else + EmitSoundOnEntity( player, "Player_Death_Begin" ) +} + +void function StopPlayerDeathSound( entity player ) +{ + StopSoundOnEntity( player, "Player_Death_Begin" ) + EmitSoundOnEntity( player, "Player_Death_PrespawnTransition" ) +} + +function OnClientPlayerAlive( entity player ) +{ + player.Signal( "OnClientPlayerAlive" ) // TEMP; this should not be necessary, but IsWatchingKillReplay is wrong + player.EndSignal( "OnClientPlayerAlive" ) + + UpdateClientHudVisibility( player ) + + if ( IsWatchingReplay() ) + return + + if ( GetGameState() < eGameState.Playing ) + return +} + +function OnClientPlayerDying( entity player ) +{ + player.Signal( "OnClientPlayerDying" ) // TEMP; this should not be necessary, but IsWatchingKillReplay is wrong + player.EndSignal( "OnClientPlayerDying" ) + + entity player = GetLocalClientPlayer() + UpdateClientHudVisibility( player ) +// thread ShowDeathRecap( player ) + + if ( IsWatchingReplay() ) + return + + player.cv.deathTime = Time() + + thread DeathCamCheck( player ) +} + +void function ShowDeathRecap( entity player ) +{ + Assert( player == GetLocalClientPlayer() ) + + DisableCallingCardEvents() + + if ( player.e.recentDamageHistory.len() == 0 ) + return + + DamageHistoryStruct damageHistory = player.e.recentDamageHistory[ 0 ] + + entity attacker = damageHistory.attacker + + if ( !IsValid( attacker ) ) + return + + EndSignal( attacker, "OnDestroy" ) + + if ( !attacker.IsPlayer() ) + return + + if ( attacker.GetTeam() == player.GetTeam() ) + return + + wait( 1.0 ) + + CallsignEvent( eCallSignEvents.YOU, attacker, Localize( "#DEATH_SCREEN_KILLED_YOU" ) ) +} + +void function HideDeathRecap( entity player, var rui ) +{ + float minDisplayTime = 6.0 + float startTime = Time() + + waitthread DeathRecapHideDelay( player ) + wait( 0.5 ) + + float elapsedTime = Time() - startTime + if ( elapsedTime < minDisplayTime ) + wait( minDisplayTime - elapsedTime ) + + RuiSetBool( rui, "playOutro", true ) + RuiSetGameTime( rui, "outroStartTime", Time() ) + + EnableCallingCardEvents() +} + +void function DeathRecapHideDelay( entity player ) +{ + EndSignal( clGlobal.levelEnt, "LocalClientPlayerRespawned" ) + EndSignal( clGlobal.levelEnt, "OnSpectatorMode" ) + + WaitForever() +} + +void function DeathCamCheck( entity player ) +{ + wait GetRespawnButtonCamTime( player ) +} + +void function ServerCallback_ShowNextSpawnMessage( float nextSpawnTime ) +{ + entity player = GetLocalClientPlayer() + float camTime = GetRespawnButtonCamTime( player ) + + file.nextSpawnTime = nextSpawnTime + + if ( nextSpawnTime > Time() + camTime ) + thread ShowSpawnDelayMessage( nextSpawnTime ) +} + + +void function ShowSpawnDelayMessage( nextSpawnTime ) +{ + float waitTime = max( nextSpawnTime - Time(), 0 ) + + if ( waitTime < 1.0 ) + return + + entity player = GetLocalClientPlayer() + + //player.cv.nextSpawnTimeLabel.SetAlpha( 255 ) + //player.cv.nextSpawnTimeLabel.Show() + //player.cv.nextSpawnTimeLabel.SetAutoText( "#GAMEMODE_DEPLOYING_IN_N", HATT_GAME_COUNTDOWN_SECONDS, nextSpawnTime ) + // + //if ( !player.cv.nextSpawnTimeLabel.IsAutoText() ) + // player.cv.nextSpawnTimeLabel.EnableAutoText() + + while ( !IsAlive( player ) && waitTime > 0.0 ) + { + waitTime = max( nextSpawnTime - Time(), 0 ) + + AddPlayerHint( waitTime, 0.25, $"", "#GAMEMODE_DEPLOYING_IN_N", int( waitTime ) ) + + wait 1.0 + } +} +void function ServerCallback_HideNextSpawnMessage() +{ + entity player = GetLocalClientPlayer() + + HidePlayerHint( "#GAMEMODE_DEPLOYING_IN_N" ) +} + +float function GetWaveSpawnTime() +{ + return (file.nextSpawnTime) +} + +bool function IsPlayerEliminated( entity player ) +{ + return (player.GetPlayerGameStat( PGS_ELIMINATED ) > 0) +} + +function PlayerFieryDeath( player ) +{ + player.EndSignal( "OnDestroy" ) + player.EndSignal( "OnClientPlayerAlive" ) + clGlobal.levelEnt.EndSignal( "OnSpectatorMode" ) + + local offset = < 0, 0, 0 > + if ( player.IsTitan() ) + offset = < 0, 0, 96 > + + entity scriptRef = CreatePropDynamic( $"models/dev/empty_model.mdl", player.GetOrigin() + offset, player.GetAngles() ) + scriptRef.SetParent( player ) + + local fxHandle = StartParticleEffectOnEntity( scriptRef, GetParticleSystemIndex( $"P_burn_player" ), FX_PATTACH_ABSORIGIN_FOLLOW, -1 ) + + OnThreadEnd( + function () : ( fxHandle, scriptRef ) + { + EffectStop( fxHandle, false, false ) + if ( IsValid( scriptRef ) ) + scriptRef.Destroy() + } + ) + WaitForever() +} + + +function ServerCallback_GiveMatchLossProtection() +{ + clGlobal.showMatchLossProtection = true +} + +void function EnableDoDeathCallback( entity ent ) +{ + ent.DoDeathCallback( true ) +} + + + +int function UpdateSubText2ForRiffs( AnnouncementData announcement ) +{ + array riffTexts = [] + + if ( IsPilotEliminationBased() ) + riffTexts.append( "#GAMESTATE_NO_RESPAWNING" ) + + if ( Riff_FloorIsLava() ) + riffTexts.append( "#GAMEMODE_FLOOR_IS_LAVA_SUBTEXT2" ) + + if ( level.nv.minimapState == eMinimapState.Hidden ) + riffTexts.append( "#GAMESTATE_NO_MINIMAP" ) + + if ( level.nv.ammoLimit == eAmmoLimit.Limited ) + riffTexts.append( "#GAMESTATE_LIMITED_AMMUNITION" ) + + if ( level.nv.titanAvailability != eTitanAvailability.Default ) + { + switch ( level.nv.titanAvailability ) + { + case eTitanAvailability.Always: + riffTexts.append( "#GAMESTATE_UNLIMITED_TITANS" ) + break + case eTitanAvailability.Once: + riffTexts.append( "#GAMESTATE_ONE_TITAN" ) + break + case eTitanAvailability.Never: + riffTexts.append( "#GAMESTATE_NO_TITANS" ) + break + } + } + + if ( level.nv.allowNPCs != eAllowNPCs.Default ) + { + switch ( level.nv.allowNPCs ) + { + case eAllowNPCs.None: + //riffTexts.append( "#GAMESTATE_NO_MINIONS" ) + break + + case eAllowNPCs.GruntOnly: + riffTexts.append( "#GAMESTATE_GRUNTS_ONLY" ) + break + + case eAllowNPCs.SpectreOnly: + riffTexts.append( "#GAMESTATE_SPECTRES_ONLY" ) + break + } + } + + float pilotHealthMultiplier = GetCurrentPlaylistVarFloat( "pilot_health_multiplier", 0.0 ) + if ( pilotHealthMultiplier != 0.0 && pilotHealthMultiplier <= 1.5 ) + riffTexts.append( "#GAMESTATE_LOW_PILOT_HEALTH" ) + else if ( pilotHealthMultiplier > 1.5 ) + riffTexts.append( "#GAMESTATE_HIGH_PILOT_HEALTH" ) + + switch ( riffTexts.len() ) + { + case 1: + Announcement_SetSubText2( announcement, riffTexts[0] ) + break + case 2: + Announcement_SetSubText2( announcement, "#GAMEMODE_ANNOUNCEMENT_SUBTEXT_2", riffTexts[0], riffTexts[1] ) + break + case 3: + Announcement_SetSubText2( announcement, "#GAMEMODE_ANNOUNCEMENT_SUBTEXT_3", riffTexts[0], riffTexts[1], riffTexts[2] ) + break + case 4: + Announcement_SetSubText2( announcement, "#GAMEMODE_ANNOUNCEMENT_SUBTEXT_4", riffTexts[0], riffTexts[1], riffTexts[2], riffTexts[3] ) + break + case 5: + Announcement_SetSubText2( announcement, "#GAMEMODE_ANNOUNCEMENT_SUBTEXT_5", riffTexts[0], riffTexts[1], riffTexts[2], riffTexts[3], riffTexts[4] ) + break + + default: + Announcement_SetSubText2( announcement, "", "" ) + return 0 + } + + return riffTexts.len() +} + + +void function ServerCallback_GameModeAnnouncement() +{ + entity player = GetLocalClientPlayer() + string gameMode = GameRules_GetGameMode() + + if ( GameMode_GetCustomIntroAnnouncement( gameMode ) != null ) + { + void functionref(entity) func = GameMode_GetCustomIntroAnnouncement( gameMode ) + func(player) + return + } + + int team = player.GetTeam() + + local totalDuration = 0.0 + + AnnouncementData announcement + + if ( GetGameState() == eGameState.Epilogue ) + { + // never gets hit?? + announcement = Announcement_Create( "#GAMEMODE_EPILOGUE" ) + } + else + { + announcement = Announcement_Create( GAMETYPE_TEXT[gameMode] ) + announcement.announcementStyle = ANNOUNCEMENT_STYLE_BIG + + Announcement_SetIcon( announcement, GAMETYPE_ICON[gameMode] ) + Announcement_SetSubText( announcement, GAMEDESC_CURRENT ) + + if ( GameMode_IsDefined( gameMode ) ) + { + if ( GameMode_GetAttackDesc( gameMode ) != "" && team == level.nv.attackingTeam ) + Announcement_SetSubText( announcement, GameMode_GetAttackDesc( gameMode ) ) + + if ( GameMode_GetDefendDesc( gameMode ) != "" && team != level.nv.attackingTeam ) + Announcement_SetSubText( announcement, GameMode_GetDefendDesc( gameMode ) ) + } + } + + int numRiffs = UpdateSubText2ForRiffs( announcement ) + float announcementDuration = numRiffs + DEFAULT_GAMEMODE_ANNOUNCEMENT_DURATION + if ( gameMode == COLISEUM ) + announcementDuration = 2.3 //JFS: Make coliseum announcement disappear with the black bars. Note that the rui fade out sequence time is a floor on how low announcementDuration can be set to + + Announcement_SetDuration( announcement, announcementDuration ) + totalDuration += announcementDuration + + AnnouncementFromClass( player, announcement ) // TODO: team specific goals + + if ( clGlobal.showMatchLossProtection ) + { + announcementDuration = 2.0 + totalDuration += announcementDuration + delaythread( announcementDuration ) DeathHintDisplay( "#LATE_JOIN_NO_LOSS" ) + } + else if ( clGlobal.canShowLateJoinMessage ) + { + if ( level.nv.matchProgress > 5 || GetRoundsPlayed() > 0 ) + { + announcementDuration = 2.0 + totalDuration += announcementDuration + delaythread( announcementDuration ) DeathHintDisplay( "#LATE_JOIN" ) + } + } + clGlobal.showMatchLossProtection = false + clGlobal.canShowLateJoinMessage = false + + if ( Riff_FloorIsLava() ) + { + announcementDuration = 10.0 + totalDuration += announcementDuration + //printt( "Total duration delayed for lava announcement: " + totalDuration ) + delaythread( totalDuration ) PlayConversationToLocalClient( "floor_is_lava_announcement" ) + } +} + + +function MainHud_InitScoreBars( vgui, entity player, scoreGroup ) +{ + local hudScores = {} + vgui.s.scoreboardProgressBars <- hudScores + + local panel = vgui.GetPanel() + + hudScores.GameInfoBG <- scoreGroup.CreateElement( "GameInfoBG", panel ) + + string gameMode = GameRules_GetGameMode() + int friendlyTeam = player.GetTeam() + + #if HAS_GAMEMODES + if ( IsFFAGame() ) + { + return + } + #endif + + int enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC + + if ( IsRoundBased() ) + { + level.scoreLimit[TEAM_IMC] <- GetRoundScoreLimit_FromPlaylist() + level.scoreLimit[TEAM_MILITIA] <- GetRoundScoreLimit_FromPlaylist() + } + else + { + level.scoreLimit[TEAM_IMC] <- GetScoreLimit_FromPlaylist() + level.scoreLimit[TEAM_MILITIA] <- GetScoreLimit_FromPlaylist() + } + + #if HAS_GAMEMODES + Assert( gameMode == GameRules_GetGameMode() ) + switch ( gameMode ) + { + case CAPTURE_THE_FLAG: + vgui.s.friendlyFlag <- scoreGroup.CreateElement( "FriendlyFlag", panel ) + vgui.s.enemyFlag <- scoreGroup.CreateElement( "EnemyFlag", panel ) + + vgui.s.friendlyFlagLabel <- scoreGroup.CreateElement( "FriendlyFlagLabel", panel ) + vgui.s.enemyFlagLabel <- scoreGroup.CreateElement( "EnemyFlagLabel", panel ) + + thread CaptureTheFlagThink( vgui, player ) + break + + case MARKED_FOR_DEATH: + case MARKED_FOR_DEATH_PRO: + thread MarkedForDeathHudThink( vgui, player, scoreGroup ) + break + } + #endif + + thread TitanEliminationThink( vgui, player ) + + thread RoundScoreThink( vgui, scoreGroup, player ) + + vgui.s.scoreboardProgressGroup <- scoreGroup + + hudScores.GameInfoBG.Show() + + local scoreboardArrays = {} + vgui.s.scoreboardArrays <- scoreboardArrays + + //if ( ShouldUsePlayerStatusCount() ) //Can't just do PilotEliminationBased check here because it isn't set when first connecting + //{ + // //ToDo: Eventually turn it on for normal Titan count too. Need to make sure "Titan ready but not called in yet" icon doesn't get hidden by this element + // hudScores.Player_Status_BG <- scoreGroup.CreateElement( "Player_Status_BG", panel ) + // hudScores.Player_Status_BG.Show() + // + // CreatePlayerStatusElementsFriendly( scoreboardArrays, scoreGroup, panel ) + // CreatePlayerStatusElementsEnemy( scoreboardArrays, scoreGroup, panel ) + // + // thread ScoreBarsPlayerStatusThink( vgui, player, scoreboardArrays.FriendlyPlayerStatusCount, scoreboardArrays.EnemyPlayerStatusCount ) + //} + //else + //{ + // hudScores.Player_Status_BG <- scoreGroup.CreateElement( "Player_Status_BG", panel ) + // hudScores.Player_Status_BG.Show() + // thread ScoreBarsTitanCountThink( vgui, player, hudScores.FriendlyTitanCount, hudScores.FriendlyTitanReadyCount, hudScores.EnemyTitanCount ) + //} + + if ( IsWatchingReplay() ) + vgui.s.scoreboardProgressGroup.Hide() + + UpdatePlayerStatusCounts() + + if ( IsSuddenDeathGameMode() ) + thread SuddenDeathHUDThink( vgui, player ) +} + +function CaptureTheFlagThink( vgui, entity player ) +{ + vgui.EndSignal( "OnDestroy" ) + + if ( vgui instanceof C_VGuiScreen ) + player.EndSignal( "OnDestroy" ) + + vgui.s.friendlyFlag.Show() + vgui.s.enemyFlag.Show() + vgui.s.friendlyFlagLabel.Show() + vgui.s.enemyFlagLabel.Show() + + while ( GetGameState() < eGameState.Epilogue ) + { + if ( "friendlyFlagState" in player.s ) + { + switch ( player.s.friendlyFlagState ) + { + case eFlagState.None: + vgui.s.friendlyFlagLabel.SetText( "" ) + break + case eFlagState.Home: + vgui.s.friendlyFlagLabel.SetText( "#GAMEMODE_FLAG_HOME" ) + break + case eFlagState.Held: + vgui.s.friendlyFlagLabel.SetText( player.s.friendlyFlagCarrierName ) + break + case eFlagState.Away: + vgui.s.friendlyFlagLabel.SetText( "#GAMEMODE_FLAG_DROPPED" ) + break + } + + switch ( player.s.enemyFlagState ) + { + case eFlagState.None: + vgui.s.enemyFlagLabel.SetText( "" ) + break + case eFlagState.Home: + vgui.s.enemyFlagLabel.SetText( "#GAMEMODE_FLAG_HOME" ) + break + case eFlagState.Held: + vgui.s.enemyFlagLabel.SetText( player.s.enemyFlagCarrierName ) + break + case eFlagState.Away: + vgui.s.enemyFlagLabel.SetText( "#GAMEMODE_FLAG_DROPPED" ) + break + } + } + + clGlobal.levelEnt.WaitSignal( "FlagUpdate" ) + + WaitEndFrame() + } + + vgui.s.friendlyFlag.Hide() + vgui.s.enemyFlag.Hide() + vgui.s.friendlyFlagLabel.Hide() + vgui.s.enemyFlagLabel.Hide() +} + + + +function TitanEliminationThink( vgui, entity player ) +{ + vgui.EndSignal( "OnDestroy" ) + player.EndSignal( "OnDestroy" ) + + if ( player != GetLocalClientPlayer() ) + return + + OnThreadEnd( + function() : ( player ) + { + if ( !IsValid( player ) ) + return + + if ( player.cv.hud.s.lastEventNotificationText == "#GAMEMODE_CALLINTITAN_COUNTDOWN" ) + HideEventNotification() + } + ) + + while ( true ) + { + if ( Riff_EliminationMode() == eEliminationMode.Titans ) + { + if ( IsAlive( player ) && GamePlayingOrSuddenDeath() && level.nv.secondsTitanCheckTime > Time() && !player.IsTitan() && !IsValid( player.GetPetTitan() ) && player.GetNextTitanRespawnAvailable() >= 0 ) + { + SetTimedEventNotificationHATT( level.nv.secondsTitanCheckTime - Time(), "#GAMEMODE_CALLINTITAN_COUNTDOWN", HATT_GAME_COUNTDOWN_SECONDS_MILLISECONDS, level.nv.secondsTitanCheckTime ) + } + else if ( player.cv.hud.s.lastEventNotificationText == "#GAMEMODE_CALLINTITAN_COUNTDOWN" ) + { + HideEventNotification() + } + } + else if ( Riff_EliminationMode() == eEliminationMode.Pilots ) + { + + } + + WaitSignal( player, "UpdateLastTitanStanding", "PetTitanChanged", "OnDeath" ) + } +} + +function RoundScoreThink( var vgui, var scoreGroup, entity player ) +{ + vgui.EndSignal( "OnDestroy" ) + player.EndSignal( "OnDestroy" ) + + FlagWait( "EntitiesDidLoad" ) //Have to do this because the nv that determines if RoundBased or not might not get set yet + + int friendlyTeam = player.GetTeam() + int enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC + + local isRoundBased = IsRoundBased() + bool showRoundScore = true + int roundScoreLimit = GetRoundScoreLimit_FromPlaylist() + int scoreLimit = GetScoreLimit_FromPlaylist() + + if ( isRoundBased && showRoundScore ) + { + level.scoreLimit[TEAM_IMC] <- roundScoreLimit + level.scoreLimit[TEAM_MILITIA] <- roundScoreLimit + } + else + { + level.scoreLimit[TEAM_IMC] <- scoreLimit + level.scoreLimit[TEAM_MILITIA] <- scoreLimit + } + + local hudScores = vgui.s.scoreboardProgressBars + + while ( true ) + { + if ( isRoundBased && showRoundScore ) + { + hudScores.Friendly_Number.SetAutoText( "", HATT_FRIENDLY_TEAM_ROUND_SCORE, 0 ) + hudScores.Enemy_Number.SetAutoText( "", HATT_ENEMY_TEAM_ROUND_SCORE, 0 ) + } + + hudScores.ScoresFriendly.SetBarProgressRemap( 0, level.scoreLimit[friendlyTeam], 0.011, 0.96 ) + hudScores.ScoresEnemy.SetBarProgressRemap( 0, level.scoreLimit[enemyTeam], 0.011, 0.96 ) + wait 1.0 + } +} + +function CreatePlayerStatusElementsFriendly( scoreboardArrays, scoreGroup, panel ) +{ + scoreboardArrays.FriendlyPlayerStatusCount <- arrayofsize( 8 ) + + for ( int i = 0; i < 8; ++i ) + { + scoreboardArrays.FriendlyPlayerStatusCount[ i ] = scoreGroup.CreateElement( "Friendly_Player_Status_" + i, panel ) + } +} + +function CreatePlayerStatusElementsEnemy( scoreboardArrays, scoreGroup, panel ) +{ + scoreboardArrays.EnemyPlayerStatusCount <- arrayofsize( 8 ) + + for ( int i = 0; i < 8; ++i ) + { + scoreboardArrays.EnemyPlayerStatusCount[ i ] = scoreGroup.CreateElement( "Enemy_Player_Status_" + i, panel ) + } +} + + +function ScoreBarsPlayerStatusThink( vgui, entity player, friendlyPlayerStatusElem, enemyPlayerStatusElem ) +{ + int friendlyTeam = player.GetTeam() + int enemyTeam = friendlyTeam == TEAM_IMC ? TEAM_MILITIA : TEAM_IMC + + vgui.EndSignal( "OnDestroy" ) + + while( true ) + { + clGlobal.levelEnt.WaitSignal( "UpdatePlayerStatusCounts" ) + + if ( IsWatchingReplay() ) //Don't update visibility if the scoreboardgroup should be hidden + continue + + UpdatePlayerStatusForTeam( friendlyTeam, friendlyPlayerStatusElem, $"ui/icon_status_titan_friendly", $"ui/icon_status_pilot_friendly", $"ui/icon_status_burncard_friendly", $"ui/icon_status_burncard_friendly" ) + UpdatePlayerStatusForTeam( enemyTeam, enemyPlayerStatusElem, $"ui/icon_status_titan_enemy", $"ui/icon_status_pilot_enemy", $"ui/icon_status_burncard_enemy", $"ui/icon_status_burncard_enemy" ) + } +} + +function CountPlayerStatusTypes( array teamPlayers ) +{ + table resultTable = { + titanWithBurnCard = 0, + titan = 0, + pilotWithBurnCard = 0 + pilot = 0, + } + + foreach ( player in teamPlayers ) + { + entity playerPetTitan = player.GetPetTitan() + + if ( !IsAlive( player ) ) + { + if ( IsAlive( playerPetTitan ) ) + resultTable.titan++ + } + else + { + if ( player.IsTitan() ) + resultTable.titan++ + else if ( IsAlive( playerPetTitan ) ) + resultTable.titan++ + else + resultTable.pilot++ + } + + } + + return resultTable +} + + +function UpdatePlayerStatusForTeam( int team, teamStatusElem, titanImage, pilotImage, pilotBurnCardImage, titanBurnCardImage ) +{ + array teamPlayers = GetPlayerArrayOfTeam( team ) + local teamResultTable = CountPlayerStatusTypes( teamPlayers ) + + int maxElems = 8 + + int index = 0 + int currentElem = 0 + + for ( index = 0; index < teamResultTable.titanWithBurnCard && currentElem < maxElems; index++, currentElem++ ) + { + teamStatusElem[ currentElem ].Show() + teamStatusElem[ currentElem ].SetImage( titanBurnCardImage ) + } + + for ( index = 0; index < teamResultTable.titan && index < maxElems; index++, currentElem++ ) + { + teamStatusElem[ currentElem ].Show() + teamStatusElem[ currentElem ].SetImage( titanImage ) + } + + for ( index = 0; index < teamResultTable.pilotWithBurnCard && index < maxElems; index++, currentElem++ ) + { + teamStatusElem[ currentElem ].Show() + teamStatusElem[ currentElem ].SetImage( pilotBurnCardImage ) + } + + for ( index = 0; index < teamResultTable.pilot && index < maxElems; index++, currentElem++ ) + { + teamStatusElem[ currentElem ].Show() + teamStatusElem[ currentElem ].SetImage( pilotImage ) + } + + for( ; currentElem < maxElems; currentElem++ ) + { + teamStatusElem[ currentElem ].Hide() + } +} +function SuddenDeathHUDThink( vgui, entity player ) +{ + Signal( player, "SuddenDeathHUDThink" ) + player.EndSignal( "SuddenDeathHUDThink" ) + vgui.EndSignal( "OnDestroy" ) + + while ( GetGameState() != eGameState.SuddenDeath ) + WaitSignal( player, "GameStateChanged" ) + + EndSignal( player, "GameStateChanged" ) + + local hudScores = vgui.s.scoreboardProgressBars + + OnThreadEnd( + function() : ( hudScores, player ) + { + if ( !IsValid( hudScores ) ) + return + + hudScores.GameInfo_Label.SetColor( 255, 255, 255, 255 ) + + string restoredGameModeLabelText = GAMETYPE_TEXT[ GameRules_GetGameMode() ] + hudScores.GameModeLabel.SetText( restoredGameModeLabelText ) + + if ( player == GetLocalClientPlayer() ) + { + local scoreElemsClient = player.cv.clientHud.s.mainVGUI.s.scoreboardProgressGroup.elements + scoreElemsClient.GameModeLabel.SetText( restoredGameModeLabelText ) + } + } + ) + + string gameModeLabelText = "" + + switch ( GAMETYPE ) + { + case CAPTURE_THE_FLAG: + gameModeLabelText = "#GAMEMODE_CAPTURE_THE_FLAG_SUDDEN_DEATH" + break + + case TEAM_DEATHMATCH: + case HARDCORE_TDM: + gameModeLabelText = "#GAMEMODE_PILOT_HUNTER_SUDDEN_DEATH" + break + + default: + gameModeLabelText = GAMETYPE_TEXT[ GameRules_GetGameMode() ] + } + + hudScores.GameModeLabel.SetText( gameModeLabelText ) + + if ( player == GetLocalClientPlayer() ) + { + local scoreElemsClient = player.cv.clientHud.s.mainVGUI.s.scoreboardProgressGroup.elements + scoreElemsClient.GameModeLabel.SetText( gameModeLabelText ) + } + + float startTime = Time() + float pulseFrac = 0.0 + + while ( true ) + { + pulseFrac = Graph( GetPulseFrac( 1.0, startTime ), 0.0, 1.0, 0.05, 1.0 ) + hudScores.GameInfo_Label.SetColor( 255, 255, 255, 255 * pulseFrac ) + + wait( 0.0 ) + } +} From 316ec34133f264dc7d5bfc7a0a3eb0f622f83bed Mon Sep 17 00:00:00 2001 From: NachosChipeados <103285866+NachosChipeados@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:19:20 -0400 Subject: [PATCH 22/37] Fix UI error when leaving the lobby too quickly (#887) Adds a validity check for UIPlayer identity before fetching persistent spawn loadout index --- .../mod/scripts/vscripts/sh_progression.nut | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Northstar.CustomServers/mod/scripts/vscripts/sh_progression.nut b/Northstar.CustomServers/mod/scripts/vscripts/sh_progression.nut index 3297643ec..307548d7b 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/sh_progression.nut +++ b/Northstar.CustomServers/mod/scripts/vscripts/sh_progression.nut @@ -169,8 +169,13 @@ void function UpdateCachedLoadouts_Threaded() // below here is just making all the menu models update properly and such #if UI - uiGlobal.pilotSpawnLoadoutIndex = GetPersistentSpawnLoadoutIndex( GetUIPlayer(), "pilot" ) - uiGlobal.titanSpawnLoadoutIndex = GetPersistentSpawnLoadoutIndex( GetUIPlayer(), "titan" ) + entity UIPlayer = GetUIPlayer() + + if ( !IsValid( UIPlayer ) ) + return + + uiGlobal.pilotSpawnLoadoutIndex = GetPersistentSpawnLoadoutIndex( UIPlayer, "pilot" ) + uiGlobal.titanSpawnLoadoutIndex = GetPersistentSpawnLoadoutIndex( UIPlayer, "titan" ) #endif #if CLIENT From d35ce2d1076b57a4ad30fbfc7785a111c7416b82 Mon Sep 17 00:00:00 2001 From: eve <145144394+eve-v0@users.noreply.github.com> Date: Mon, 18 Nov 2024 14:21:38 +0100 Subject: [PATCH 23/37] Align the the text for the "Join" button (#877) by setting alignment property to "north" --- Northstar.Client/mod/resource/ui/menus/server_browser.menu | 1 + 1 file changed, 1 insertion(+) diff --git a/Northstar.Client/mod/resource/ui/menus/server_browser.menu b/Northstar.Client/mod/resource/ui/menus/server_browser.menu index 4a84a714a..03cdd0e8c 100644 --- a/Northstar.Client/mod/resource/ui/menus/server_browser.menu +++ b/Northstar.Client/mod/resource/ui/menus/server_browser.menu @@ -2554,6 +2554,7 @@ resource/ui/menus/mods_browse.menu xpos -17 ypos -57 zpos 90 + textAlignment north scriptID 999 From 0528f9fd73d174f4d7094ae99ee6b1b0f4f57e83 Mon Sep 17 00:00:00 2001 From: GalacticMoblin <100473309+GalacticMoblin@users.noreply.github.com> Date: Mon, 18 Nov 2024 13:23:34 +0000 Subject: [PATCH 24/37] Fix for the Triple Threat's world model not working properly when used by an AI opponent (#704) Edits the Triple Threat's world model to fix an unhandled animation event error --- .../w_titan_triple_threat_og.mdl | Bin 588501 -> 588200 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Northstar.Custom/mod/models/weapons/titan_triple_threat_og/w_titan_triple_threat_og.mdl b/Northstar.Custom/mod/models/weapons/titan_triple_threat_og/w_titan_triple_threat_og.mdl index b955e1c02f8fca2f1601b2472d8c61ce53e79df4..2394fdd2007a88fe89d3365cb1e8af2c6e5f0a14 100644 GIT binary patch literal 588200 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

-Qa!D?A2&AZ_=HZ~`67qW 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

  • M2co^TRp#y>>M69#IDx`jOfg673z=$xdN#^c1&*#4{!~ z5;is1h5{^ddCLEnc-GPxma-Ru5`bZEQ8Mc+*^DjKDpF{KI z)~=jQ&T~!oto6MrHq-A4o3}f`xzTFIf3-u6R3iWQ|KZ9w9@!KbKgw30up$EHsU}gqezrEjp#tNGmGr60@Pp`hC(7~d3P>&n$7oFuV z=||9~{=G+*@^!5TK%aJ_^Qpd+|6@{d?jbdyrU*BEkH zmZ#@`#rq@FzZ6gXbRm8yUnkTYf~TBAvH9MZ@=|^hxoL`>vw)-P+xFiuay&SZU%RS5 z_;qfJoRcdse#Qo*t9B5+GU0#JJHi{?9mCsQ`NPjQWb+3)&7Y#0c=I@CL3nZg$%@*G zk}{kqT*KyhM(Qm zl>6M?O~Z@xC3;m>BLDl23@_}D(EXaQkO%0N2ZH&Vbs%SIG&G&Xo<9=yYqa-wDBo}s zd%n`7+DOH`{qwn2rdzl{{Y;?Z*9R!@gFALD>5IM$VZTQx|HO#X@HI)kf49_Id}W&! z*vBGWlCKalMn(D7L_f&W2oLRhg*R#LtKoegv-#wdpIh!{;FYR4z~&t4HPct)M~bKG z2{k0vH*RHjLwmB>@2`Vo{p1;0e@oC>e{-oa0WGl)XU0Rip7WgWNrV@#r&YI|hb*76 z-(Pa;SL5o;L*v|nB=ujA^(g8`ydIVKEgt#(XwC3+z2#N;`jvS7C!w%2I_Jsi*W2c< zx@YXqJ*rs9MTd^$mlinyU2nvV_apx>@|)D!-?SWlPi4BJBKL&w-*8Q=KW`^8A^iT0 zYLqa1I>Ses{8k0L_E0<~ym)=jtEdDORblUU8{U7DDrW5`O!dX_T)y%V@+e^Q^Pm4- zQP68woQmq7T3P#0z2Ii}6Y;Y+@CBOwa~0z!d+}O@Y2IgzzIZ*S>xM_@j$${%hfVsX zm}ULPzj(b@x1Q9t_z#G=@pWFLk2Iq$k38K^ch`lFq0DdHzq z)WrYoqna?&Okc?EkIS|9=)^WK zR)VMgyDYfLjkq#XDQ@orI}Wa{XMc}!?Je#bD9H=oFAcQ5U*7v$f@0hTCjX6ok2sU> z7wzv6`(5PSId~*9-_=#^;k&)r!Z{NC7qzY)F0^yTfv*+dyu22)J($7p!uJK`#orfu zTiQWvwhqI~eZRasL~6H4_&GPYqNYA=@Z!cw_g(sUkWUaS>63{ZE0cN%9U__WN3YpE zO}*K^r(Ki=JN01*;Wzio~;`J7ar)<^BwM5#nO_3>iDe~l=O8@eXJ9bIWYaL^$}f6(G&i0v!Q=R4(dE5aN7<;R`eUGOuT-5;TTkVP)T-&l|U zkL`y_`lo*Ok7@Xq{(?8jFwB76FB9UU&1ZB-gw(#$JdICs^}qGs?Mi|MDwgm1)lro> z{Q~!u-@%E`4=x*`3ptmrG5z_6XGc|fmBZXOE#4A-p}@(H8GcmVwQzgkwf|XvW50(5 zy6rbJ{Nxwzl9?sCzZxO!_JmSWI<-o2CKjp9;7vE&Oh8MrTwagg?%i6Qw7iVww;?mDLYWO#m zt>7|0AI*}c~|Ge%DbZep`9`L{m zUncR<>D-)|Ppez?QByw^2>^`x64t=Yq7W|0cC*6pjd#71H z`wEt-{L1~zUpSWcC+8i8tntIK#E+sE>xc4<%Ac?J{dpnb^8-vD|C#W62tSpK=O*?iP@_U8eCwza)F6CHB>Vm#jOT~Rc%Jb5D4K6|!`nJ_7};wj z@xRILw^DsNep3BSbx)uVMEg{s6YSbCURIxu=UHStH-I8km^BoZbZ(cM*gRggy;Of6 zY43sy~dY4?ZZExtY!Q~!IT*!^poe@+r2L>gZ2n&Rb0O-~@_aMbE^~Nw@f0+{eKoq!|kv6J@tbRc>VTf^eKPnOAZ(J$o((AKJN|3 zH%s$Yr*?5yT5IaZ{*!Nc*w!1I=Ck==RDVj=9!9_EIB(e3(^JwbJqW?v(_9vFGJ7c z?B8SwmWy4;y(aH?x$`)br{{NClJh=27FmKXIbYN8=sP5L-bdgckn=cV-q^2;bc|9cemr>r5?tq5fKu1DfF5jkF)>Ra{ zhpj&^mv7@+@e*pkljY^|XYRK=iKg^m@1vK?pZTObiCkZ^`(JMdMHf`KK9dXFw_i1L zxBemZ**)%dikYmG(p9qs=cc^@Zqu^6}9g57T3O;hPKF|9g&Z zz?r-p$F;f9o^$IT16uh)!boA^>IvmQpkQpo2B7gG0~r2 z_e*}mD-*Hx;6M7WB=QMYBz{!1G9AdZCH`;pZHXP7Uh|iimTL52Gn-$RaOH)9`oBo@ zpL!(V>w%ql%Z8xwA6%6^Z~JxUC&kp?lQr%29}d-_!KG6ZAAcb~Fik5zP_DhhbMzEjGiIsh&r9Xp z;y74bVvpO5X@>geID_I&KI305KG!Cj!n@^%8D8%Bo^D?aEHhbNE+21Y)d{d-Qw;Na z>=hARAmj(qd0MFN_pa|mFxuCh;pOrP+t?;T<=reV=pP{YhhqIb{U^f3qwIc}T>jx* zRXl82%kDP``ZT{$tbZtGB3Ld9lk{IfA|G->P9oe}&GLdDq?K=}b7CBfSjV1sD{5_} z>XtiDwK2(BA+CpJReca#yV8>JBX_=Rv(0F-f5A!eQs>Kl^^b)!Wo*8d?OI*cquhdk z@P0Om@Nf>7Y#EIzlYF5CWNmWSXn#h3TB~oE@;3DhRD%lb@SK@-pu?z7{EgWoVPUv5 z-?Hr*1?4@@x5M-qcucXu14fO6{u9{zw0M)xAovmQFPs<{1A}c?|1_Rq67dY35(9%? zu-k}&M7{&fxx*5l) zg!75}n*89OU1^0YlJki*K7U3f66X^Ip5}+NFbKtaD_r28Rlb01gTA3{66YT&PwS(; zjdbI@uLF)&SI4C%SMdvb=z?h^oBuDTZ?LKnLKWHX9pQYX_IXU__wcX$6|M7__ZuLj zL~Oo+;D_?!`0VZ51i8uZQtj<|!vz)fVb3GW9w@?mIxi#Q+V z=p`exVRbCS*9*&3?Y-VrQ%@M-S%f%ktE}I3H%(Gb3cbkmYU5^KGJu zzN)?{FAt2+nYJu1_A6FgM&ox4y?g!zAT{@u9n=DWL)FSy&Cd9uu zKdSVm5gN0X^+Ugp8u#7H)zJ6)YdwdqN3EAxk6P`vpPMk?Z~iP^%&>n5@55msx+K?cL%2_j;NqS&vf5tVdD* z+B}f;s2qv)C>l>1pP);BukURn>tn$Z>tg|SfAYa-|EaK2H{Z0_3s?1Y$I%DcBZu=O z$5*RA%qhC{5ul;*pc&0sy7|-&z8`R`G z-yf|u-gugu)uj;_m}m1g^BUu!nXl16iT+IaFbRIC?;G?go_$|Elxm_{m$*<}qUWT% zy)Fo!?Wu!HrfuOLZe5F1_Q#q1Bg)hJ5HAznaeWXj?5P7QQn&DJPRxf zo-X{mza2Jc4q=zs^#{t2Ke3d{(R#k8v)y1!BWa%MkJ4KIJn8Ept3UP1Le90<-|MSO zOFbZDB)gtK{ZQU1=;hepWa`&<~pwa<@@r^B$Q6r*XyzDE(?_CnC8d$j{mqzXrsgPL#8T`1( zhd$^Jr>922q2cWM+hoG;eu%h6ME`ad2lOl62;bZrrs1XZPbXF89&F0uW)uA?Jzd}} zcE-PI=AmAfexQ5%4l?_v*B!`x+{>16a|oZ_!W`+lbi~OjOL$eK9uyro!tg;!pH<4o zvo!im#_UJgpRDnQOi#!rxh_67Y`r7e-a(|j>00gmW@HbyCb%*28Rp}tzPe?C#*gy7 zKIGhS#M}2(g+3oVAsq}EKGwdQIT$cC-h@8kT>)rJs7=n%0{0H5rfU<7#{kTGG@Nuiw%he9T$@1Gc6F zjHkEt@H_lvbQZ$cyzU3x&HncDd&2S_Q*u=kl2>wx>#Hh* zMmEAqumvvfJc{`^0)FW2V*HHN+pAi7faF&6mz>fl)AF|BS?SFmFUm@!J!aj zAI0dKerT=^d@_}*Li}uV)4{%@$l~Yns*uupBIJCY#qfQ%z`q41rn`H>2qL{dw1e9bro~ zc77T3Ww(O1S4sT%*(~ED^!visPduvps4F<%WaD#%=+ochty3Sl))VbOzluNHBhM{o zKtIT_VD(1^o>wT7_G`{-n0tBh{j9o!89B2=&uiqif6Bx&o$$Vdr{`0;gnIICYiW4R z`4K6;c;gmDxaD?@e(r!E{Hv`R1v9HQSm!VKR!nTwXJL$c>(C{NGVQ2m~SR~^qqUh9$U zc^1JBjn98MUn9l){KxY+QoLTbcbK-9##6h!6D7_E3A|K$rFfWq1=Ht6{cArjsps3b zjt-XVZ|%>q`;|Ye$rvTm-=uizrzi14?_2y|`rGMezZ5jzmFAb0gt+7OB)630?BZbx z2jsSt&3C1|kiWY9N*T|SnleWcqj5?}4fNs;J6}^?$nP!q-VE0qpbN97>*0(+Rb=&x z%JX~0=h1Ah8t6gX2)xChSS|O{LW_IkWq6#+>_iJSsYaf>exp! z{9Id=!hV#qhHp3Oa>1iZ{c!7cPxv#LmBBf_J;R?L9In`W&`-mQ&vzup8^G+kJ`6AX z-nGY{Z`?;D#aB=?=9c))(dduXZ3V$850Gh%*L>*L&!|W9VT`^oUTOaxbF$x}&8Dpw zUT!=ObbgF>UF^v4a^tgpSQ&aTu{Fc1CK++Ucql$ULj5$}!@eKh<8(Qx^N)Q;Jw;D5 zdoud>&ikvU`Hj-V=UH?=T;OfsbJ^fEUpQL_`bUmt_?+ua)j~Wymj~d)Pvji_=7+NJ z>{;7HP5smHL42NQwv7K(YYo*>^B0ZJ0TjXb*|y=eN@{$g@&8iRnc?Nmhtl{QuGf~~ zNMev`&W zs=o>6N&naWPkG_@wR2&Of)pbcT%xDIa=$P7e06l%YT8@2BmhtSqJsx)d&sNn=!4Yn zF#sSt#)UT7PH%RN_?USgFCztO>>+da*sMkmR(0X)sTJ`Ae&Txc< z67}(D{-IFsPMm*Ofz-P@AfZq516v+V<4Tvs(Dg}7_t)qjeo%dA8_MQ44wlJ3r1b`+ z{8N6>@-bZVw7>OREVqMO?OA>5hw>K(DE{(Ow$u*xd}QB;GJt=IK$ zeG76opz1NJFZaIsZ{wlV`;6Rpc!P{@Qs=eh#y2{C()Tg?zI1;_O}P7hFLIer)^26S zA7T90eqWXQJqq)Y_WPvVd?d_wloy}>lKVXh^C{)0xnC>DdLM-id%i+)^QkbuQ+`Hq z1RUa<@f~)*M{@JKFh5e><#$W?GV1|4RsA)Rn;(Vu0m_Ts2aw$Rz}nYmz|{2$NAnMJ zLa!i~HAZlxv;};RFG6qjw_(QH^<8`wJ0~6IdI=N~dF_NFdnEPc_IILN z=AmX^+4b-k)qC9I=Sl9T+d%Hp!PkQ+lc3l0V-*izKayHqGo~;hW2h|6Vw-;M~SU6v=y}#zO3Zq|{?0WB`mn#%@ z%T{arFMRz4b&k}B2Fu;?8$J__Uc=U_5%&A&euQ{`Fh6%Gif!P+_@C%oq8M{_D))oL z=f!9@&_8L7E=RiK>)~l=&*c^jFPz`k-tUOHIT)QvW9$FW{hBZ2{C($f`J)h{Lbv}{$ zk>aVJ)8*$A#or@T-((uQ-Y$2Zk?OxlWqGPUj(kti^Nix}DXK4Z-=d(eeLj)uSGi}v zJYV5^O8a}0>Pzu|p4Xr6JMsBSsxRk9>inqzsWCM4jkF)B@4PJeS^7TpoPax-E#p?-_m(sULGf>d|#8<9O zlugzL!6~wz7@4{S-JCHR1-xRJ*lYVKpY^Rk~({QWiS=T9_c zA-ldod2iqA9OcF9=PB28L5iQWc(X>|F?Qfz=dGxI$uRbOH07y2<$Ev8LcLa5L+>+w zK=q|~-JBVk`{*OwqLrS<{qRCkW9`20ReqnZK4f=DXXaDNe=NApQC{r-WVecv{K`=q zHT;EBF@O1?eEa0dj6UV#$$j^fzd3yiawE^H3VCkSj}$*^=mpj3pc9-;e22g4=X`A2 z8ID-8`QiMIhpJPAuS0loeUdEp}ka}^4jr~ zYwyb@If^0W^}cfZ0l3Z7hd1#T(cQ0wC}RX$?~C%Tq@I`^sVBytQ$p6#bp@+0Igs;% zr_hQZww~B?!qa+X*GauH$6Ef7M(SaXp0o++&nQHL9LkvfbE&2m#CO@uJ*d4*xx#P~ z1e@+Ad#pM-{@3b3=>}_NexZB<;j5AL4KaV}wy7jvF)9itzWt-WKz9-@eYLkh&_A$~ z)M(Jk_YiohFXpMf6i@F9t4{6+enMa@0>@-iXm}OzsQIC-;RJ^f>v~e&vdx zl~JQKHXl#m>3v?}`c70|iWlzxszmf}Pp~F==WF=qr2YxjuVu{E+oAlHX|+`|weAa} z`ck}b9~spbuOCwVso#^C_HLHB?~Lj{TQy3SuT1pC=Y^@h6fgLp{>Aw@RA0)^zwwiw zv*$YmUc0?Li61Fm?mjZ==V{tlroGF`??(o;Bai>-BuaH*;+ODP`tNev!bxIdGb5wrVJBbuZ%S?^nY&S;O#l z`%DyLy8Koc68$f&pP>dw31Qt|@!uD?f#NZ%FYvF4epcNdDDQk9AZvXsD4!yszc+EL zs@L#hjeqfaY(sLFgp|I(Q~ztyyI`yRCL|_0I+T~v7uSmr^Kn7GPqg{Risb-Ki}+U15u9d~TfdfVC3mtpt6_ zi}fl0Z~C;oVtwjIN?-6J#iypQ`MLrxtkFXIT%+A>7I^`4)qh7I);f4 z<$DpH>Wg{W-qTZAp4J1oL+XK0UfiGMo|nLXA@LFOv_DLh=nr!JE&03$Sk3Ck_!oE@ zPjP>4)REM-oWt@${i04<^^sPU`Gf1Ko{T=_>3LYnkGl}5={t9(e?gSbj9|yl3Z$MA z~H3V|NhN~Z1j}nX?-N^`b(6T@GCMvrCi;};SGH1C99{{}tsC!e@6{7_6aLL6R)0Rx?=?fk zIj&YJxAdrsXOQ}?!;?*L(K3MB`&oTC|2N3lv}MzWGyNx(_}N9;yQgPE<(>V`ICQ1~ z+&)|d+Y^4(Ubg;*93R|90m%#4^CLohtZOw^e!BRRZ#D3u|7G7kFbVrZ$3blWe_7{G ze7-t0RGv#Q#03cv{(7yudZ#stDhe7a3$_2tfY z%bj1Q=dY#iBiNXE5+xmE*9YXzYX_&CMA>TgeD{*8&YTU|52g3PRVwHM%SmmmjZr^P z>GVdD^>W4ac*XTb{%bwnjIZvJ`f~SsUi9M8#2=TL?-#utdibgTT&_*G8X&IszI6qU zRA<xPa(>t`kNL0-A&n?8FUv*_G+o}QOqSyZGt)T5Y> z9~KQy_V?t&2B?r>?mK z&QJG*{ixw^_IbUWRE(aL_s^lp`154%=41#pNn&Mp`v#zPk%4;d2Q6{{{#2$Lbs~2&r9z2 z_3HU9TUK-l&fCn@TqaJ`05zFf-}$KVaRuu7wUu2`d8xmU?oI9<1?GT zs@oz%(W_j)U*TrdWcMgM-zwaj>Pzw4i|n}wy@#sp#El(Rz3LqYJHA*k z{@uEb*3^Ha`r`YKwh{eA37+~%ign^B-zp&nQhwY<1^zY#l>Zv!#OTxZO4Xw??Gp!9 z9a(;|Ouf6Ls5oe~hCNRwS5L2STpT>NA@Ar~>th?q^9}4C&uu0C8+tYZ&Jn@(>3`yB zA)!zE&%T7kn)bGvvJr?1Uiz*+H;Cl(f6rdR@7gv7d#*Zv zAU^sn+I8kM)BoSxOM@lle8RdVD46i1&fq#NUrp zUy2v%X;a?BsV%OtlCCl8=*amOcv=r!yuRIw_>pR_P~V&K;`-il{-@qpt)ls6)Q>oS zMlL>retCPb@I5ZqUK$@-Kb-Q@It4*>QXgq8$%&L}ufS{9KbLDSeZDTr)!bmBZ%LkS z#I`Yz|1Zy%_8(`$Q$OPS8sz-T)t9h+zXd&x+Q{@Dx%weBop&Rzit8DE`bi_zo6ITd z$hm8|T3sS=%+7hdar$+1dd+@xWlkEy(|R5B{J3_#jss&Xq4D-ahL@|aVm-)2lBa&Q zmDlU&AIIS{m+bMtB>8$Ba^nN;9|sogy_xYr?)Pq98V^=MEKldV#-!dOt*Uq z95j*`-{^d&BI5}if5sfh;VZ8FGoGj)$Aba6Pe^;bqV*nA%IklM>pj}^BL2U!<9Vrp zgSrP9-{|v*ZmaJ zpXKU{a)cid!tPH!BF{_ozJX)Ddf~*uhCbB)diy{OhA&{t>o5NtnqCO+6D@|KwDm9a(d( z15Tt~N<6o}+$!4!XaA!QrQ+=VninyMV`>a^_K9A-je%t@)Z_ncVseN(0+*DB`kd( z5YF;c<@fK%l@VU|TrWPdaspmr6`r?gv9IL)J8Nzjs3ONGxI4s8^VkP`)PYvG(6)DO`I6LKH%hsdYMLhU2zhxP|!^HlB@;cc%iE2z7*7VOFTbDzlJZZVR|n#UKCf{``gm?9l9SNwspkGBDSg@>nv(WDC+#&a?!_xBCqScqwg;>> zO1GEhTdq5n!>#cht@Q5{j_dv!#^)b+&6gybq0|sIf3ok2MDFd@D~iU~IOUE@wI z_p{Y7s>|Vl?^p9JS|>s)FLu1`^VO6S@gU}N`!!?wC*_|m+08A3F3Q$ttHCPWY~IM4 z0|%32km83BKa^iicu(SI*@xBqFPlHSoFCKodECHPVaj$y->EJK^WU#VC8R!>ls;{* zz$XxWUBb^P=cV-J`1rs?I4BbzL0{~L@&VD(@sWyWHBx^}j$a$HpX;pZq>1OGcdJo9 z^33{~CQI^zNPE{1K9ulXNPEKxA6d>z`IqYt)Q=P&Qhpx|-5;N@F#((*gr{R@+Zz6$ z+VO$eUlw?JAC36_8gIg<7+z+0x%+EY40i%meF>i2Uz0%Yuc3Yl9s0tHUGLGsUp2hj z>}n3GBdnh>gr7iodcTkOypk8;v+X7H%kR^n`r_|#jh|zzzHlE9<+l|!$fI-1FMVAf zy#GP_8yP2dPfv0}N_46$# z|1W;1zPLXeCVuYiWaA^;$3%JY{&;nn_y|1pBfh^$!%O%P;;$V~x%klgp8Amcp6LBk z;`;n@?G^5aqW)F7&bW62?qB06_@TVGKgh*L=>L=#_cyuzBk;7n;`<%s`j2_}{aKV3 zpLdgs551r3KDnQZ`VoIWYT_f&pPkBisxSUNm5Zm~hw2+I?~TKo(lhBgI&$%m%MTeH z8UWeN*!&iOr~4h^{1eKn-m&>D<{tj4Iu|2==EIEp|0uiiu$sCroRBoANHT{?RFo!B zd*5?QDnqFxWQ@p|=`&{vA%u{5%sgZYsk84j51HpVnUX2<%x|xw^F7Di=k)X4=jrL6 z_j#Xpuf6s@Yfo$Kwj?j!HY8E>K8(ryCW?4xiii6uQhxxvoF1j~7pqouet5;|5%IeB zc>piRuas{#qd`+)Nejc9~rtO{ME8$S1F+`Rb+o z5gj_o;!DaGomPdtFC_XW8x!9ujV~KhH~hqh#dj|D{{X6A>i>}M`idD_zo}ZFueO}U3T`^B zXJPQ!gEZRVf-C$m;+HgX#|5psGJ4XH16bRpM2oA3b?@7hhCU&O<_eEPz8Vlu9*fFHh$<%jwplOB%bj`r&V`)~i& zgSe(&4=1l=_v-+^pxG#HVG{lWpY^3K?(56$7YX%BDo^8@Py7>K=AjL)=qZnX^?53{ za@e1Gz7^Quv1?g9O7B&_b*hJ_{bKo*-rIgovcaR&%KR=m?`MHOyO}&5-t*ScdEW~B zUyE2hEsdIUVt;LU<$=Gqb0Nt$EAqtO9e?c3_U~1_2LIxv{R{Y}E7<-8e$hYMJo3Pe zM!8^{W9EETkUK6^$@7c&lb-oLi<%|in&g?He=4n)=cwGV_5_+IhXB%$&fnLvCn#Tz7_F(?48xp z^~>?wRWz2jl;(e;Goa?MGaV_jn7SdQ#`{t0cUm&f2i&v2^0 znvVVnRX(CSA@>-3-)>{I33NY%qx_||tI0e}Uu~w>BfsjF!CTI6XYisub?sm6jy`_x z$=**Wbeo~7Gz z_q;zx9p{WGUiyCX-j*Y1uNC{AS9~vQLh;i2Xb%!jBI}jxd*R!9rM1H{7jw|RW^3z{ zujXo$+qyZqOz*SBU$JK5D{1`^X}yw5kA|X&>ORbR8StfPeHN&P;&7o7sZ4WBuQsnt zJjT+uP3vwlc%}L*m1niY-TNgnc;FZ7xk&53{CpFMSG!_nd`b07>!%Do+7*v^pq9nU z@y~n~j3>tLY_5AgrKCS(I46sT`=932AKKFTo@e)TA>cn|dU_;|=4(~DFADcR0WYlw z3V6BupHOcU_@N%C^gf;vzj)tOw|=M+ztVY1+MNuf$z;c)czyxrr!Y>Sz3_Wca0Q*KgH8 z&^D8L41UPgc=G5{w$R?L@2~QCxBXGOkQg%D?h?8(vo?cQvVXAu1>`iE)erC4htc=! z5Z_AQvpas?j?9yT8GDL&$PXaJKTJwTHm8Fay!aj;>?wVZUyb4~e8^$&tIB$*S}srH z&fHORHV>NMP3NzmJd?`g-KpJ3wc`qdKitn&wea8uVSU_jy64TL$X4#m$I%ASvi_|Ju#IVrx$<8Md~FX{ojR1e_) zi=O|dUrvu4|F~scRoyRi5!zd~-iTy^AU|JW$>aNz)ST2UQSO*_RL<)>JjmB{vd}x@^p!+qN|ze z;jj#D7Og4ME4)!NyAO|Z+S>m_Gk>w?*DEG2QHA!<7|xV$a{D`!iC0 zyDslglW2LoxIZJs|LpM&HT=oy5%-HMXuf4>{ky$B7!{6Z@8f+4wAWnQ;i_%?`UH3M zOe{HKu?`J>w-E7btD`5?+505o{uS^`yXFMvic#P>O7dX~lZSB~-5Xs(V10C5Xn2%si($~`~Rg#{bciHxe{GeaT5A7|9U(TL#{H{OSYYP_ap)tyCE`EG}ys@OpS?U+;UAw#a?2 z>fpB>+>;%qc)`ORIkl`Kh^DJAzH+e?gID7JVbuZ`bn#*E?m-dSOEU-iW>Ws6ovPy0 zp%?g+$u6XE9({{E#EZdio7+R%{<9lDi0TjBRK)jt7eRW~T+A=88ibbzdouWOXDewN z_Ug{9r1);uqwu%EQ+?-58^*V5V~4vtZeqscuW`+^wD>kRgW`{-hvC}u?(vOd5AkFB zJK@mBdl~%b6|vf075A&ao?plJC9bzCpjj5D`5}*e@aI?87`*$(K<(?(p4@bbPi!7a zZoj&Rs*OL!clqprZF09W_$w=7v~S`wRr{!Y0tOlpKie(7HmxGbfinn4rG8=XO7`hh zE(o_?z@Cr%T-Q~b)$eD{9?E}x&K5r8wH5i^#fQA!(GoAe?atU!)C2wXH+q!pbLW~G zC&m~s{7Uw}80CgjxN}TRYxP2khk+x@fylO@}-26j3esQV$Xx*8y z%zS&pqTC_P#c4u)rE~sK&9iT{z~MvdlD75Vpi}xo8GLB7d0Fowlex~FlTbFzRm}N} z!JR8d@h{)rMIohGyi$EAXzyiLww|U^y(j-KZ&B^+SVqsFi)os^Q%7*0X?t7NG$i>A z!thzg_IwlC-iB5CGI*tURVn^|W6=?>d)m1 z>|5U5nOsb#K z9{-O6PMNfg!K>#Pa97`IIK3QqLBEJElhP26YLOy~hy7Sx{yCIi4i9>i_~rEI;?vG} zA6VoEy!1UC@UKWrVCEC0 z_tcfQHIRMp4DYF(qdf#Y((%6ejyv8i!>^>rKEkC$ysmu!FK3^ZRL>OyFX26S7M;%> z_VpyCF1fubVtTu;+k6d4DKf?~CTy&s6RPZEwKh z1l~8NJsuqU4Z(fs;O^{w?@3=*Ynqjt$K9lO%Pm`xWnvg^9rIkcFD+-ElJ0NI;ep?q z@?WF=Ak7bupV3sdzu-Q$Grf-u_w%Lqv169W`%l-^_S%)lCJO$!`cpVLd4C#u9{&Ty z6gkQIkCJ`LS96oa8&P{Mh+8P=m%d-?In_;8|A7(pwX3L}8&tn^KQKMcNfw`JSyMZt zOB?Pw#osND$l+;@#HDxlW=ivkh==?PVO4F(q5Mi@e790qX?|0(kJ9|3v>yoZ%!YEx z`-i&wfe@d_;g#NBgwg($o8QVU)oQ-)Z!Yxj$(otIl{~u3-P^h(2l`4q5H~xDQj!vJ0;6%)SQ%yw8#o3_kB;REhYzm%9DI5BPrl*!@pYk1ihc$l=9& zm{$9Gs88HeqdSjk0_)o~R4W&zXBalz25QTOwXJe|DNXayrh$#6ZFX8A-`x-nf#(hXns+f17jF|rTnGe41S`L@LIDT>bn-x5Y4CL z>1Q#L0DkDnX$-$o{#C&9gOeHjq+(tSMZ0ArmUWl{8O&IQ}^{ybx*m=l{!63 zUCE*%_B|Yg_2UPi5!>72Tk~mcJDvT{3ay+qB0kNcB3Vmg8QWn4km=z-S^VB-Mw*Cu zx4A*rW~vufsECKyB%+&XElH{SLD(lfoZ)X6fmI^@l5s^6R5KCvTGo;bNr{lf!}$X2 z|6jjaz)AD%c!ioH%_w&L+q?L@;3~yCqON#h=zQdG>^!==D-djM_WBfaXoNIU+z2FUOCm{h!J3gFlG+rTukV8;Dz>zi+P}^*1>@_>ZVZ>YwNC1Dd|63S|#hxO8&nmp`|Qd$^S`@09ied-&o9tEY1I*ln=Q&%?~W*6aE{#(tD_T zHvRB5Pdmnc0ROc3y_@v?THA($@Zp*DWbxvAG3k4>;DiCV=cL-QczDkhrt_Zb`S89t z*0~OYhxd0Pzw|vC@XP5}dfx}_mD2-wvAxpweb8PdJ)(ZVi|^M!znp!P-h=G8>>~SK zN$Gu%(t8$>U-$jXO5m4yPbBig`xNPWC8hT%(J3w(@jdv8n+?dLHVyD3+dX`e%NSh6 zj9uR;z1RMHWGtRx@51!2();nuLu2vILN;Hw())BJJyZR^lE;}jzVJT1?=c%Po4!wP zMc=0@@dI9bZ|-qEh`?Tg`{bHLNk8Ow67#c3^E<^2;gPj5dp@p|Z)#m|6lXlKz^QnRvIRL z5cA>4<X zAUS?9zmRVJA|*W~<%5#bQ&RpPrF=?|zXPSzL6uSsb z4rSwKrTX%TH_GFpwe0;sOIlz48m%v%p;KS}wp(dzIM0dkXQ)R!nckn#tw+56t3KY8 zwuLzl66*!u)~OeqaO4Vd2xag803Pnc0RFtiXXNm?BXOVI2AM6risCCDW%$K<$H_YN zj?L-a$7hPYl-7c$1(iD=S;N;p7E;1 zR8Q_OL)>qPNzTRrQKZgOdfwfgtII8PoeP%G#9Ty4=h(NSj2;#8tp7_+sWrp{2?!)p0XT1|4AyAtFH(Ao!&fV?9=jT zD)tJ?;3`u79hcD73wbE*1bhGa$mpn zIfLKuD~j~&P{_y9`mMQp+4VLhJdaTxah;!2Bau@AxUL=WA&e$nZDMd!Pw8Q;`o zHT?*S&xYI4Iw{(^nJ(0f&^N>n9Wy)d#qH2ex1Z^ zKM~9&`WxZ#gX^KkGr~z|)d?v7iHhNe_Zq1(?==<-S&s5M_%ryW^gT#`%zF^N@;v0! zxCMh3?=O{!+NFt&@+VJw_d+KOs*!`=obdW1?EDY+yEf7LU4WO~?+U6|0~;P?@h$6Y z&iOC>3;6%izkvTQ{j2m|W~1*}bX}&thS*;_bo#67r*p_=e}BfFa9^%a=DwUk-v#LB zF81KIC5+ABs6iU5e|LZkeT0ld#=^M`Uvo~dM)7tdsid2DqrlMUKWqC zJIt&XCM{~K+5Hd+_`4Cd=;tV7a(ho0{*_T4H}$^5;FZpUPWRKN`M25g2=V+&_dId& zsWRAPADbUT#Ot0{0{*lfdmpUe>^Dun3NF9v%S-OtEDyEDw?o+bNFpBXivQz&&Mb<5 z+BAgeU#0Vu-Sm89{(m@6*+kD@*2&9MO zA>3M)AMy)9z97g)B+W1MY~L4ja>O!byeQ=_+WYuBDoowU;Fap9d^qHTADFQ7r-;|B zM+5jzh|QM*c)9vA2}dzrSzZ~hTWF zUr1>`B%J$zd}^}mDRF%V`zPbN&fweXbtGJeLX;P1h;4SU>pOA126*Xvv1W9=CdV(X z2LXSoY<(2Dsv9|UsSu5#>%kf$+4Z2(e#OfAPtc>w?D_@PM;$D;alqfSPisPFMbyW> z2qm;DM4Rff>m#N8nOpG%Xqz#+-VxV>y6qiL+bg#o6xVk9#$h3 zQ&uDWF3oW=?Jqg|6m{980lcn10DhAh>km6_Hqz2;r2>CZSzmH<>35#=d5*L-%Hk;3 z0nGOl@Qa$y7V!EMpS%1!+R*noYWL+6lEden_tC=n7wA9txfi+L$^F3kuaD5NWIf!g z+fasI%(wQSQiM8cfhBI1&;U0)@)lXqd}}8!vH8}-{MCTpxWJNlQ2dy~Z;>9&w`|uI$ZNX)Ki14Z-RQt^)T&Zf(mi|?8r|Fqhkjw-fA!c* z-vZL}2*5{wNklKp`QXhHZ15%P@;K0bBNNX9UgWp@n207D`jCwjzl-8Cp0oT)=NC3( z^l?Tod%mD_ezCrqK0fe*zt{Nq{EP@V4%WQV;wPTSysqgv-O_$o*AI58j5oO7#@X`ulb z+#r~Yo!%0E{xqM#M+ENEKz-_4v_5sqDn6t(txtU}aU(izZHa4bs>FOxq5d`CZ|l^v zer9fohaIXfi-&sIb#&@w7ml*VZL(QB=vi1?U;ElwHEBC`U5@QlTbw!38h@721NF6g z)B4>*>Hf2{es}#_HE~dmJU`%vQG8)fOdchd#hr#+Lhm2c#P2t=?S=ic$r-DK{YmM1 zr13p7d`+Ld&*M$;Qz#zlcT4eWX#H+Ee4UD?G^>ra2zY5dQ^1e;R-Lh@h=+RIQatGS zFZe84zdKE)euu~p`lb9%RF51!s^&}0xc)nZ`s333`M^KsXAMR_;Kx!t@JsQ)FNZIw z{&@Bd*8U8px-;d|7wdJ#AINh%ti-xpUrvKS4I?t&ef_%Yw>-diU6 z4yAbGu6pVl9gd@z&GZiNgp+*w`)F*f*Nnl_J2k$A^!vE#_Al;Z_#-r^b88Y8aGtl` z(-9vnVDkyg4cjApAA#T8<23*9Z3MR5dVBYZAj~O z*Z6Xj|He8N4|?Fd9@^__u?cPPjUknz(^2i5j_2#Lvf5 zQ1^Nr8T*U*24i*dH%{Kx5`CY<<||YBKHki2hg3$*nEL<&M$XMy9OI*fdJucYzRfb2 zQiVi!Y)h=BPDP;?doX(LS8Kw(rTG|VQ@owwFVwpKJHG6CZ=!##88RP%8T^FedK0sB z>P;9`td3HA4>9&vvd@)6t5NFQHVnU*k40VS&wMWzUbe?=&)s0~x%9pVo`BDrYx5o~*+52X}<34HBPi6`H&cpYi)gP;q^rapc__wTD z#pt!8XrP?zki;^;9d2qX}cCo6!dSYAA-+S zIm0)5b{ECo?SLP-u=~$S@#n-A33$gRmVdzu&TQn7hq;j=)R96QLxtjC%a!=AC=qX>H)@o0^nZf8+idQeSPrz9Ldl)?M zm!?!9Duzo3`{;9iuv6~l% z?e*CEfiQnQqj;EarStjL^SyCci;IkYm=9sRtk#*In;-9udJksXgP-XBms`*iXz+1k_Z%WJm2t(fl!@-<2GBh{=CjmIr#^(cK` z!c)898+Tayh~KY3o$tlzq;6RMT@hnX>3IL9=6p9LOdthW4SbdQSE(M8W_K7`QpB#W zkJIq3`9zJ#cpA zH)!v(QK)+Xd%mpn-uzco3L18cJzo&tkL$h%zmZAvcXa8%=vhtmH*64ecF~+mX>D)}MlUPty8R9M!Wqk+r8%e;wK{-(O1l0WYUt={ zemVaSQn*jJXC+9tX2Du@TpUopdB9W8S@%@4=^t=nPiA{M_Q>WwC2 zupu{_;%h!_hW$F;;P;O$kB`&&IpttoX1u?o_bpZQz9rmml-{?zxFZ-xXR&yt^X22~ zL-6WdAq>CL{o9!-!T3Ab&ES>JyAzj(;3uV7ywZMS(X4W~X!U4@U&O4FPLtVh1pZNn*!QFliuWgh|5;2=lH+C2^s2#YfnN>}dKSv;e*(YH zayA|i_en_ z&uYScI{`g%_%?LEUGDxE;FGU!WB8T!=RuDgUg`V@@cQ-FG5jJP?D^xTJ!(zQn<`!@ z6zn617tg=8(f*R2e*u5bfy){Gv-G@X5Ir9O`%CXbLVM-#a6Yo}U~{2=ch0xUnP}XA zTq&ax?D9^Fy@# zFhxAHS9;z7{Bn5E1NH~~daCVwVS{$0X4&8KgPb17|8s@rNBWiR{>S~~v?NFD5}d^7 z;b=Z03I5;rK^N2wY5q^vo=W*Jw>amZ8?O79?-AsmjH3BAb@O5FXm9`(Tx9dPMbrG2 z4QYN$51sszz@OKn6T=Vp&5Y=M$cH-j&E^<{qQsu;{b%#zRXC$*Zo+xc&cGhd~Y6a!s227XOYbQPtjd_-vfrJjQ1q^TydAzYm&KdCHc~C1{D7CI2RyBw1zt1ZyWsy7+}1Pvc@z)l*XC4@ z^gRgpj~t#%Fy<<6c6Xo&|YbMN#K`@H%h6TI5ECz z@XHT>o|TVISAH$%uOSm(=~FzMN5l7VsJ=gLJ24-bS^b`$ zZ_Kya^?Uv~J#Y$RpOWUEUZvRYi--sNNaia+za0Jr)$^L_0sFVV7>#q*HRc2Myc6a( zIXxAp8>rI9&ey(jafbIP|GpnN&#y(@NmXWk27KMr0PRbPcV6EbpYEuKyCrT$?zd;l z;`2xQYQID*;%?-+{_*`f)yy4-U3F*17vM*pSj<&UcKZXr_>nsf9qcKK2mW@gJpRA~ zf4A~YW${z4&F50ec>aMuv$_d(-lL3PTIo;yfFJHCuiqeQE~6*gz*SKX;C1Z-cqRKx ze>|J9&#Pz`S^G4q*+d)HBtaN2T6*`h$1$jJpr<#oPi0)b9eW?liQ;1^UbvsBgRk67 zX8+`MF0SBmjq|c>uHMn^8fvh{7$1J*jV~Hz`c~Xv$k-q1`%_ZhdeG`gS8 z;-P-f_6f%Y{)bN+;EKxzqI@Gy98CG6f0!`*fd5774MF`NX}uwD%75=Cix>BMU(o$( z>3%O49D$=61~TJUd)`jFOK&9RZbwLN5oEF63#r<&Lm+puE zm=b~CyLmA9CY*)V^yFM&|M_g&mgLpmSLj>S>&UWP6dvA)#l!x2U77v!784?H_Y3TO zZ*jkOjLv><*3EF7QYM@k@3qa$wJNU^VSoPPf&lWqMJx0px+)&1ABDRgWBJ`DXKF@| zU%`!|{H+H&5;d-kx&7zS0Zi9npZyqqrTy*YmSK4H_q)t_(8w}-G>Z=`=c+fXq4uBa zNW34`#+|~>@^L>S@aj(o7DJ2nZ}vN@8dr?JH?#(RO7VFCzws5^ zS^d!7)B*E^_BN&Mt+r$?Kh90Ly`X=&W~QM3OqaLFulHMiUJ3d^PZYI(G`0WPVKuN@ zyaVZ0f}Yyco^?V~1pXpw&wa6aB)J58LViogzgi*mAN2`SH!|x%p=ahtPrTt(TZ~fJ z`RelLajKSsCJX$1f7HQiQvCTMBNbkp(h9#H#J)!ZeAbdK0{%J0*O=vxZkK@HuCn1& z+P;E43zpC2O&WK{Upb6g{3|5^B~BKMN|58&;o?f;?v z)3XHoEBQ~2*KINXm2K~|X0QJB|L%>u)BF!}(G2SUV9&`%*!AN@e|_!-^?%S~l4wF! zQU9Mx`%B55mKHU+1`S3F{=9NqLo(aF7Kx6ysyH4iQ+$;+aRR>KPzQ24z6QP%sO-=8 zs6QC|2Y(o4(inf~oTh^J4m+!d;QFJj=or+~vn`s7vgdta<`dXIzjtMt>d};)9N^#w z@1BjhX(;m`JKjZpuFW1Ur%7Y%pZXI8PBSEVt!AK&^Of;(dgSn1mPTXH19-@Fy)^t( zCTIfvZCbJM0O+~1te=3lsS$!_kFp{n{$1&E%>0vP*$u6D6QMGp{7t=9qOqff{fi%& zU6#Q&jM&cu9`uxIx{~iG!8aPg`rFE)Fammj|3~!@!b|iVc4qzUES^Xt?Il}}ZTz>r zeV>$K^Z>uuzY{3`07?J;T*;n4D)kpn`|H2>L($=BXoJaj#(%(`Ph8ds_WA6-5?voP z3}<;w+Xwv>Z^Pojo{uQrh}vhp$4Wk%;>G?7*vY<9y1k9T+RA}=x@M3s@&Cm>R#m1W>)c;VdzJLB{yr6D8?yeXgn#vN8gjVI`kOdjFx9WU zHkGeN+q<$@ztVX5MCU7LZ=7pmqF($Hr4{4l{8=0?V9#-LqDXpj)BUrH@p9uuNxzof z-FmO&XIQ3x4vE#r$&Pw|cMdLOxi?*E%lFsOg(quDE=ira1X+6gFtc z=8ru*rVI!9W&!U_^Rv-E0{>5#b-^D;vg=vk7x6GoR;%2|qobYzUWp&_(*pmwk>)r9 zRl|m3%mqCq@k9Pw;GawRKOFTWS?{8-L!-afzmOb8|C(T7+=$PN1WlviD>nM&7b(Hp>DWslmY3yZwHA>qqm%xjw5+Du&)fbqC4gMLk{BrSPa~ zp}6O=RJ8BdS#+R))g!GxwMP?!b9*K6W%F}*rTSB@F%jDKeOmBPzbPhB4}X~xMjquS z@$<|AaG4pt%zW-ww~N-1-zC(aB2gE!kIfuTT0dUIm){hKU(EDo@X~rr4}Dz7-3paS z@SwYj^{SNg9NZLu?_{ug8kOm&9n`-$-_>&`H@9p!x?Zm(>GGutair_hU#Xtd4@o_#l%@Kl?$!Hzy%oNS^`w;gOQ{~2TXDUxy|n&I*uqA5PnCAO z*=aY$dSUae+H0?#s>2PX{o86)B-vh_px3?6@D=WO;DQ!xy)9||ni2jB`E@CsvFV)~ ziuIeWUiHzI&uzu6p#1mDX#RXFBmBJY8Q$%_Gd^jY!t8I{t<+0v7W!1E7q%*-AE`B^ z16p`{C!aa#XnZ2CDcjlC5`s+xI9$F{U zC#wAvZ*5zi1UWtPo#Glv-hXY5lZ^8ieyG3W9TqFptNQf18{WF?3a#HXf$wZ&i){*5 z%HqX(YSQtgRIle-k7nBIrGtffRc-I*^X;y#M_U_5l6rldag;S%KXFC7Fs<(#8v%df z!!JIl_hh7g7EUbfJh1st_Px@ys3^fcQ2%a`!5|zpbYb@1=GpwUhY06QvS944?{?((=Ix*}UHfHynDBt&b+HuO#g+rTTYI zce-jP?DpfbsC}-qEI{RtY~l+(gp;agoUm#!`@U=ut;e*A)?+$B@zU|ARF7$}Z)0u8 z=bYegPd}SRz>Tvp|4OM>f9SET>G&Jt{zc^ zbac1F@y$~iewTe!|E<^7aN=9k{&{>&D+lwm47i zqgYR^QvEo=-{AXl`C~t_twD-Ui0K)A>p3;f@MP=XDd{=+vL1Grk<92(8o!yO9!}F= z!r+zS^Yt6(S}a_7y$|tuf49bX>HMF(V{v>gx88^Sga>rKg7reuoG46lFnNqA#>?#| z%+0mecIY0Bp+2M3KbzC-th@p582w%DH_+b5t{~v0-|M(jemFzLjz=Z@vmX99X#>lD zU{w?CsGjE#=#hTkXP#(*Gi+Wmdd~dv)W$WdBah3;d7H z_j*6ovwF!>2Ct;2j7#jQ?S41BsCmc3>1w-Z_jdZgdG_G@i%MyHMpUOlr&<8y)I z&g;x?d6xFL`{+;xUt_R?*671o75Idw`zu~-_cJQh?80uq6<5k<&{c5^{pFe? zjz7wtC)&>Wsacv9#DRY4_si%#wLfXX@K65YBlsu8x6oLv=86jVQEqQ?sk0vnpz-tDJrG|FWblgzSZNPFY|Nde z{L*-GS5+sR;^)cWmFBk#Z|tyn#p(<`GTTWz67a`{^7vK0D(#TjKQw@^-eWa? zuI4b36`O!9)54hbKIH!oO>3@=`>|4EdO3l-cGCJB{gsomsN#g)5$Q>+&N{5b=^Y66xF`-A`B@nN{DEBl@W@CTyGYszsQH775RAQxsW z^=-3Y27jvdaC|6+WAvv}J>KIqni_{M{DDu)8HI!1vF|l11gSOVU216e9eGTqRvAfN z4UO_$U^4{`H;l)3_q1jBOHF-5>O85fJs97MSSRQaf7>IzS1qFPr;Y=0x!o+@i1OzJ z_R+LB_yp(n7(~2k7UZ1lvkN`k7>5J3ehfdf*LqQ`W<35xwvC@a2Du;1N;8|3<2F4W z@7*Skm$lE+A^7ofcK<|4|JS{-c+bmFMi1zRdJxB54K%KUBT2%!vKWu7%m3^Zk8=yz z{mG=M=Y;wTMu+S*5%D+p5AUq-BPSP9xN8VLTfo+j06f%R0Q}+9H$3=gt;`;zRQeFS zV5l3TM_a0r2I@PsuXu(uz8yxQo|MIJyLIPpB@f2)JF)pWb10sp{9P&DBzOb?{uRmd z`QAeY<6fg#ey|Vd*|OYEB|R@5_$U?|FJbYb9;?t-c*vtJWb~PrD9orCn%5%^XAEWa z06*vl{$qM|Ntp%y=v_G#CdPfR@pu*w{GbQ;4Ni;^^p82&28A|@!`eBl9;NYOd2twC zexLORas2A(j9<65!*JMAwtqqY(RzI~pg(Y(K54vhIR9*XIBqvN7WaL@`lnCGH7t&o zw+VW}<#MFU)V@^Fy@jx7eznuSV>@5(Z@<${*=okG{dY?fFuhhSj zx(vkLMeKYC_#7E~`o8UhqdP}1_J{f};{2B1VHnl~r~A%HTB11rL;s5N?TH?PaABQ- zoJl3jw?%C=f<0mWN#5}eZ9i7utDl|n`~!Hf58zkTIgK_}u8LRBYoa*6fgW-G3>p%N zRe!f4$87e-LSWr!an%>^bPpP^{wF z`2qS%&L5QKt6NWuRe*>2%IHxSd@T1RiZ)iB50(5`X}$%1$$UutMNhA!`4I5p{BM~t z3{S91JoNbXa>e;y)DPc_yEntIQ9)U}Bu4rB0`sk0y!3IxKltMdc76kVX1`$V^pNeE zx^0J(#QbvnK#Li?vE4|#xotS(|FyoIAggKoHk`(9Aya?yn$QG(&D97pddFCtw@N-9 zJ2%}!3-Ql-?;#|;nQcy(%ND-!(NVa37^_Dq{ygG18XL4^>jRE%uGS1)*oA}lu+sTK z={}EHW@XKt7p=Lw6#qB(+0JgON=h%l+{C}UUsvt!P4s}?XX`}okNwU4H{*sI$l^1c zp#N{~<2}1*PV)c5eL2{FgZybR^u8J08`}>#%HiIP(tWdS)SegOCkuN1=Drz6?fL2G zOu?RibH8r!_NwH~ka>bV|K|Q4*mEJhj|cYroBNPlgAHVT`xNdz?ccw-j|cVyez zH~0NSd-nWGdzM@D9Et7K(EDjOmd)jtmT+IOr1r|*hxGGSiT!o>R~^!Co%KTzp@EVMU~j+ejf-;&0=Tz`T6#qln^f2ef-cFaIy zjoq%d1nTSQpPtH3M)k;)N#5lAq{qlVc`F|35OXqe|3$vVN-tvA z=^09?%)Sq;YhbBMdN5AtTzWWPMuWoA@{GKsps_!1p zg!W4F$IeHOQLNiW2EY5=7*+p(LIK}nffH|Lia&RSC)ERnT9f`z%Lq!fl8pZSRgo*U^Er{S2Nz{Yh20yRr)WVal23XgEC+ zT}b;kbMiGbXGa!;f8h2*RX;II1$vflu*SCrjYX$u|F*Tej83*>^Z(SWou}$NW~`tm zwGjX1DRq;@qrtzQubgs91V4-Fc0jO91f-=!M6(~txE^h+%AeKNK&u1VWl zG*g56-DLe|iorycZFVIA-?Yz5)P0IR?n3*w$eKro2eSUT>3Fc}gN37j-yZ6SJvVek z_^AiE@ah0^8oPyQuXjSAYDBoVfH%?C!$k&Js1yn!_9ynCSDje=&M_5Kv)3S@y$@4N z`RzV+aHXw&WXaOKsD>RozP4K)z_+cM2>kbF?%}U%s^SZ8y@+j({pe^X_C4S~n>_iA z=Nk(616~H1{pz^ku@5~-!jA)}=bDv_{`{eNq=k(;2mZY2;$_q?)dIVf@+4bdW}ERcTJl=Z|zwHN6bTrF<<>Cy@$4M4~o{HD5^E>7m z<3Y54%PrVZ0RmvL}u2{lm|o{_Grm9NoFd;(H{V(^QVwD2(^J-JQtVhE@pXs~Z8iC^3$G zpMH7qGtH8lLj?Vi?e)lrGoR1|+TN~l7txhCR)3|~@0y;Itpt2p;X6KW>OH;|ZLjml zYskJm`@XW%Z9T1Zbhx1B;lj#9H9Ha6(fJKmy^NCS*HZU=%4_pmnqJRJ3;e2S8GO-- zYGg3&-?a(X(cU_2d)KG!(Nr22gJFK~XjFsbS*_;>!2Fzk8^y=4`M#{CZ_yx3>)cTM zuyP)x)}CR$)w{Zryh#sGWG}XUx?$=vO*N0--xsa#&K#T7^~hH`-}c%61YI$n!{~pu zFXqPgaDvOb`7W|F!xkysP*EOxKHLAnR87AOEoVvjt$MkU1tuEb zK_(t}O8R_s!y%F3zxH^QCb8yJu96OZ?}`2>W5r+w-zOnKGv6SWGo|>oMvmlK)o!Sz zjVInWdogkena<#if@*3$kUN|S@V`3C+h47OZ{~U68VRdVR8RK)Qb3P%;yv*JSApW+ z_3FwGv~t7-)IQ6}8g#)bgW>PiE>op{;s#fp;`=RGj%F{Yi-#@pz!R6PK#6tP`$D^a z>T{+1a=985Uu9K3s$ozLzexASaa$InTw@!izua5-a+mgP6!<$(?siL;qd}Bk6*>(a zJ;2__GrroITR&-@fM5HnF&;3+1}&oaoLM7LVpTSur(?yo+;iV9f<2R3IN&=SM)3O! zJ+b3}Nc4Rti@!5c&9$-%67VK%%H#B}k9ob9p7{8K)~LW4G5YW3SK~egHxcaL>s%#t z{F5_TTDK|gY^X-9V;mWL^BtwRPZSURyXHY2KvP00fI-QvPnF${z z;@Vc*1b)8`lTkpA`eZ_1PcnAeM5LC%d-PaAM7(r;VZ3-Ys&<&wf2F&zCX?!c_GVKp zCJ8@yJF4gVh7@F0fwfPEmu{Mj;`U0vFWb{okhclDAG@NVTGOA}a}4F*ysrtFNblUA zYVAePg4t+qR4~(C&{N0zlA!0{l%M?5J7w_l(oKl%go&u&8=G$d+Pgpax`1C)JB4pj z#TGv}>q)kMj7O`#vv{!QL5c_azppU^<&U?+>C_*Bu12DhomoB5Uv-Q11ho5so<;sZ z$rRsbUnsg_#bCX5*Y75x>;>%k=9F8jG_W59`laVt_U@xmo3#N<{{sKOYi$KR zTlMRZ`ew^`;LqRISC+qs>W|^v1pdok^7wA`%aY;ao8w*mJIm@n+i5;o{I;IJFP$HT znMWWw`+)rc5B(*be*iCMf9T(yR1e@IZr?*?GmXi+HePrT)g#xx^OI()2GI5bey4sN z+={lha&de0bJ+PIh2q;5+h01LgZ<_3()!xc^BS=KkR5Ek!7D53=S-pf1$w0Whk)Fdi-cTYrC4Z*m}nbwC$rCF&WVpxy$Gm+Y5N<`tF4`Q5G-S6Y6EZ{+NgQIg}-- z4h-@&73JGx!_erSTr>4Em1qvH|yOP{@qxFzLre@|}$c)9k@A8D;hXmo+I z8~K!*y0ju*`~4h>olno>met0ZL8qDb@=vQ0QZ?o}SD)hDZ8!1-^J`)2dGRcNgWYP4VZ|&#k9P|P@`%O*zi2!# zI)lcRTO*nHXZjs;P4K7;fxpqDAN(cyeW`iO6W`of2`7DG*YJjeks!T4C#V3mE>|AG1*Pb(;mebo@pPs)pkyEM)Nh8}wD62khD0pu~6K)eKqvJ*bKYAu)*<$H5fe? zHf&aj^;JzI>r<%z@*<%H6aRdes8v-=*(>A&k@{P9$`h1)Jea{hr}Yzu^vx9V;Yio- z+sR{eVf)1ke^2yUqO8$xq3RsE$^zX%(WBj4|>G+dND5y@ryjx z{*X^eKO7)Mro7i$QzBKrj9hfCG@ZEc$BNhWZnOV2F4@cb;qOJc!7E-|7ARO zZGT+g2Y=Qbk8rG3?;|_)TQ>)FOUEPd=j~>{zq6Me#p3r}Iv;}mr2g#p9rVC> z1b(n5{9ry@LC2$Zs%+bjD2BKmzye#qJ%>Kn>^AAw)4em(F{m+}A4)c@u9#rQ!S zFQR?AsXw3so2Jb7QLMM9>(5|+IXz;&P-w5zo*Ei&$nisbCDsS@T5X3%RGWbeY5c4d zUoE2X8+?x--{9_ov#87UN_alq&s2)vARddM@gd-)`4E)iLx)LPl_lke{L<3>1f}>B z;#*Pw(RuaAtJ+i0vt8bTe!1@v=qW}0AM{Aqr%K-=hzH<%1bS||-b1x$JP`e^GgkT@ ziSYp7yNv&VPEGlNGHHGWrSFj#&ww7O{gu8)V!Q-+>3Ur0dnCqVfS0Z>l)gt|ya)Ku z2|wuh;}5epYeryRaHjju$1mimLzdTkVq-{5-zdUVI5T>J*{*nb(1Px}3i zKf(UG<54dDg!nd+eoq0fJ09iYThOCV$0O*M_LtIl6u<9aPu=k-*I#1%Ao|n|}r z0X=`yUt+ujcwPUO(<8=XqMrZf|6;rccwPUOi}%EM67bUf5T)@e#;bsr?zbq-4`MtF z?UnAwD$PG)dj!kU+OQjsHA@r~Gdt^@I!@T>f{l)kb@Y3<9R8Jh{6NqoYo>Kiv z<57$!cT&96{zGXzDW^w_x1qhd-y^yB8RB{Hf6y=Wf2DfdP1YJ{2c_@fI=DEh2efx2 z-8~_PlAd0>;MTawyspgoOMh2A0U!9)S-rWDn)Fe=NwPf_tVHNYQ9 z`KR1*#?eok<6FmT9|Hd2J$fKRP=J)#5D#C{nXo66yNqkp$o zPLJ4Lf6D(i?d`n#FiyC9RkJ657k5m%9c8R-h8sItllgXD*yTEV-WSfDArp)7kNNHV z5sELQ__Y+D*@r#9d(-eCIe+%HW-sNJ=3g>D?S*e0ZNu0T@GA|%Ht2UQP9b9%()+&~H43eV+w*(LU0AP+%W9{L)b;a4o-E zni^D(U&JYNlRJyrUJfVaHC{OO7TaH-zXruuqxkP_PVw#(|NhEvyqtdEH>2$ZyjlEt zWHIGD|KoH!p}lhaV9(im{4~3D{O81*#`vFmtRCnuz=M6H{sZ{$gIIflKQ!DF!uU_X zA{Y98P2PW!DlHZCNd3p9$Xyl>dU8!yi~j$w|Ljclkkte274cI40lZv$!JdOxF4I)i zv8UHpcf9QZYaj3jXfN1D>JQM~ut}`{0RP$ft%d%T`a_Ro7g>Jr2N5sz2f!ci&)OgK zfIW5n8SE*i2l$83_JaRN#|yMqjz4%zYrM>O2{*G$9kulSK-L$8XZww3=7(1cs;R<8 z%@^>}_{a3P3Rlk>&ESu`PFCe=rwI6@h6B*2n)Ps7KObzF>yKT#k6`fo59h09+)EVj zrEVAacAn&dU)1)(-UDCp~f=^o4Aam7e3ILG2Qe^EL7 zd}9H+XYGZxPa^QJoE{8*_{%u%&4HUL(2o{7lJT0;&_8@4F1l87!LBs z&Y*bddOv1)H(cQsi|$WX^z-6t1xHM;pTYE=3aQpSN40_k?Lr?yZ&0D1b{;_#`P_v?H zBOu1LkSY((wrVfz<}^*|qCo;}XWB4}PkdSv(${ ze--51ne2kKHI>KX>lw6uE*+0xACD#Z{20S>7|!37#$*3v7wx&?@hDvnDvie-y*#zg z=y(MEHOg6$yCyr)7Bl7XI4Lwr8$`z==o#^*9MNtrK+#o{$KzVZ0a|f9u3YR)_;c@l zKNpY3?lR-i(k505;}P^o*VjtpaS<1y-ATtIj9RH6l0+EFvl{UBLF zl*m%q3lT}m5|U&~k|j&_eT_o8=XqqyzVEzv?Yq~Ot$uSJ-S6+NnaA~hU045oe6G)& zIdkUB{mh&Ldfq+G7T3MAAn)(FV*@Sgaq+fF>Q7bkGJPMJ;He9=PzyRv55NrtJ3u-zrUevJ;Hmgm!<1bejbGN=+I;u zv);ez1d=Bd5B8DsYg@lNvJ8cpsT+mx3gH489ZW|3{Q@nyo*+&eSr51LjbrX_bkR2z zihFDkMpC@Jvn_ES*BajsP7;50t&gpD4QBA2Cz%M&zMF*W2SS9JIS%AtiUIaGQiXi3 zQ4d>RVe9R94y!Nxys=fI2Va?iwiZR=%Tx~;+5m^nuweMd-Y^qZ6mAi&Qhr05=A!-~ zgjZWNCPprn_(6@<4F2zYTj3Yg5919PXNCN=o!<%r>fnSutbg`sQ%$Hy=NJ6Ju2Bb)NBgCA>S0T| zdeC=8i6M+0STB-2N3Cv1s=sMNx=?=xdp>XrWAL!wLH=2(PhpvQQ)6*^eDrG!v)*C< zT~7C31By>n)f9`rI$<+gPtx@V!i19#t7-i4r};48<@ID>|1IF;!`k$$zR(_z4P*0R zY5y&+M{intoXUxx(*6s0`R~_fXg(a+lFf%lmF~ZQm;XL~k> ze5|<}xtMy9Co~^!9meLvu>bnf{TKNA8tIV))nl}AmKSOKEC7GwVTG*SmJ&@4wRi4tP1gGtIZZA7am&f8wvh+25u79Qft$g)O>I#&
    ^(&nh%Ja9Q`cHE7Yvb?Pek#7M%brILl%99M{_^+KBWZs1m=ho1 zJXK8dH_#)$FP%*N=RC)Mr1Ki!uRh5}XXttD$X#~={+Y`0Pw6}ec=`KfZT>HvHvuod zA2^q;ujicjAf0EyKkw1=?7OWm^9$(u4X5k(IcNP!=VjoR-&chAFo+W$#?$loJ9-`m zy!<`#LmGd+aPoiYybpN!duMI&EvEE)0?e0LzB%r>Y7Hvt=B6U52a62a@GFXSY$7YEKU5AoeXZ?|)Y8xgW zv&{-uFZ^Px!OQDQKi$~|HCw{gw=a1Yqt?5gq!>o|<^FtoTL3a0l~DUyb9Uh`)2>@sGe=RLIwO20;*#phbt(4s5@EdJ{KiU>BsOdJ>5ZZeCsly zq^gZlKEG35#$waEeHeVVRRxM!=Tqr77n?Hgo4PF@j|2YkXYl)O7zrKC6E%3b{=e0c zxbkry2JgStMHt#-mO71@~Qt6u>WE@24LQ#>uz8F!?0lt%~dw zV4o!VO?XX2dj6MiPXhSZ`llH@=ox(Zs|fa&`w!@OKA3$UI**RGc3~eC;N|f%j*d6W zcqGH$o7!{9Hc3Lk6#+^EI}gt{U)JF_%z86H~I_oCoF<+w$+P0}8sS;!E*nMtb5V zLuZm$&5ay;5sMS-S$tmIQ>yP&59pWYCmKELSv~J+o2sSp?l^c+9J1MjJfrh!>|d2U&YwJ4);G)A<5D@_Y~c^Fd8^z5=60sKFlqFV9z(P=9#9 zc`v-9!gzI4>Tlo=`WY?Bs+9D6L+bxOslP3=X8jHD;LpG>e{T->2iIAD?oIU^rRxRo z^86q4oa)4`7Z~plx*h>9&;RGr@%rYn>v1u)=cv;4F3}$FBG1biO*%cmm^< zpI@@*e7!%)#uM;|w9P18SJ{vQ8K)@`Kv5yjxA_M9%jegyjE z-}7g+`wJ=dlrZb}?BZzQ6Rs%${&RL| zJhh_=_yI3pzuhvIqZ!Xx{z>~5EBcK8gk28p72<3sqhPy4ajwG{A~*)47)!REN$&+~ zRnwOpR_y(`O^CQ@PRv@lp$^@A$@c>r(LOu2-a`Evs}#``zmMWyuQkJC7QFUOzu%Qa zwdsq#JF@t@2@CW8E|@{UKEJb{-}%qR+q2P*b8LN{T_yz>>;u2Q%kf9oPeDn&So>`3 zlA$oMJEhSRpJ9q;{%C+(TN#oEH~OGK5o|q&x6aE|$Ma8W@W=Lw;+|rA{HfTU^nbn% zO&!DHmHn5h#vVJbNa(yr=+MiQ)Qhmg(7uo7wk4H;Rs8zyrU$9!p8^RHPWl;#)pWQ#@*TS>ZH$k0AQRpxF4~ z=;)>>5|JE?9y_smpdVSfLymBGejjC<{rY5+YY>@`X)PZ3(HPA;#Euv6C2bB0vl4@p zvk&N#0qNFaGx~pQXEj7c(eoMq1iVdaBE*{ZRm$rFCtNi{ukWXD@h%=GH2euv&!kLi zG>P)xvo+Mpzpc|Ljs6Q%kG)F}j@x7{cG+1;tNv51jtgh2^;dche=IhrHxysAt8~Qb zRyE}Ha28h&@IRazqI^#IyHI|wb=C;@Usg`w;z7UZl2BzT)!!w}8r^jb!k}M~Ihl)} zpg5$_(=O_{XjFFy0l$8D!CI>xuxH~cAxc{BRCILQlS}KJVzB3kzxjG#enCH>`uDg5 zkrHZCm|t!BVSYh>WvajXGHdY#)erN_(|_PnjJlHIcRUR5>q`cA$Uy7oRKw%7#KY*Q z8Jheb;-~!g8pHPdc)P);mm1=EGm4kjOYvXJkLTe<=4xrb$gBTQ{Qk5CY5uS!PS>(u zXxqOw(*20He?2>ECnS!XCUm^rS*Z2E7b_;Kk@t!p;^O1=agh_-zrePag>ZGoEDheX z(nZv-BnZ2vXNxtuH^f~#v-M$?OsXObKAxn(e;el`?itV*Z_4~32K2VY^GfP5{xkK& z7e$31(=~W`f2-~>RycHpGlO6L&uhi<$Vd%-Q2%gZw7Rvp^PeN4<8w1yc~ct(U%0?Z zc(Xf1ga5ju0uG38MRs-9CC#c;$Cds5VfNG0bsPkVU*2Ei_DM5bWO$vyuhB17Nc^E^ zE0SOO&crPFr?~mKDZaR)8KY;8uZgg6W3WaKtdnrPC~{%#4$(u$1aHZz!Qd?(EK?0H z$Pn6AP7#(5Tp@1PalsX7ZvlLw8jcHM`}1x*y;SwO*K(oF`I*A$U30~EonkcoTdRIG z#@lgK=6kp{{_S?vu)#sLUytw9OqE?)sxWosJi&7n?R(eR+S@E+H13EDansob4F9Uc zEvlYo8N%QHBnzKnP03}21zr|oibqc{!v9od`EOs{qk7jXU8wgXNw9N|Br}&~qN;)Z zXkRB|9OlaQ|9#nNjVkowY|VJ(@dw8HyyJe4jOwp zT+?Ipk4(r`Syose)TesF-6xThu9x$Zy7{95s>i>G?GL-8$v)Mrri+BDU6SeVcjL+3 z>gTsje2K3hipm6)rp4kV(p9?|RLAaNmv9@W7g^eo4;=hj_u|?E}%5 z+H--90|}~91CQj`Q*E?grQAPHGhg*@O(y!StVLJ{1;b77*)vFK5vueBRGL3zN%xYx%^FVy$nc~P5 zs%P6xc0Ee|^R#4w@MdMcI7_hhZkjQg{79{dmvQ_@n?G#XQUjmk_~+fy^&UX&uSeJW zhvk`Qe6Qd3@4;E``%2eKgI-h0^z+r}QymvtvHk<|l|NQ9@G6x9-mD@tK(dI*59zz9M#{xd7AOc_umn8f8^;o;F_Z9eej@A z-rw?QJm-zqdD?o_1nX>Oe}Q;Xz=@x)u5M7-7VQ=+%k5uRw8S^bAIh(H*iU)!$NkoF zRa?V@f^|86UOd(aKds2F7j5H(e1;dVf*seXZusU1<>SLuy8rUxL!Ut#Re0+zjs4~O zi$cqKZ%OSLP3;N(@L%G&Hv7!e5}&(J|B0pkV^c0(6^B&ExAj^3X!C#APkHu{=C^mb z{R`%oXCD~vcskxT<>DduPd;Zq`mDE7b??nSp?rJ;d@^Uhkmk31zS^A5FE9Q`^9%kd z&-b+DSD@!U)zhI|e&R981Q+#U_xD$sYgGr9=4$*wzW-{=$E5i!pWlN2^Wvel@j^bv zi-)jYyy$v)R4yM5)spYk{IpE9#PP63zkI)rqxl#w-}qDf;qBJ}z6Vr|a%-q!zWXW@ zXx+W6HqA*hGb@ypQh=`adC8nd0Pl7CF;O)2Q`-B{y4wd0N$Sn}$g=85q`3E-i?{d| zN;X#Sp|k{iolNnWt_^;>rx2x8c*?~a#?L^R7XD?<*RKjrBmJI_xOl(Ad+`R!A4>a= z2Rm&+if-2UuQ`P%=iq$?-<#^MS*@l5^f#e;7929fRj%DfS6ZD!^H$$s@GxHI-Y$v> z)IN3;uWHjA>s7Wwt6$N2yw7ei_%}|w6o3bNzMys7zIissdkw76k>~={%;Yu~FX?fh zb>hzD7~&taZrn)2lc@brRuAyQc)^|v^xd$N{T8&dyER_^Pa#TmXU7ZpYo+#-e;;;x za~gU1v-W&N@i1RtPfx1nJe{vKbiNYa7oy^h?0f+~_yeZ)bfWl&wBB7l)o&Pb5~YrQ z!5uI78`u-ZdzAW{x{?(t*;jxRcUXT*Fs`C{ZG2rQ5_guVN9Xmu0`~2Fo#AitSgG^{DT!EfL58Nc%1`JegE?Q~Tvrux5g?31zg1H*sWzmr0n zeR$&qekI5L+UyDX-_ZHx>EX>6*yp0z9qxEXaQxxjE(b;PgEs0aZc1f8^8ysvc2nNP zU8Beqbx&Nm5xag{Y)~o^b~IGay3|f7@7FVRK`&f1_7Y^SyW*p(SpKBP?y4gZGc|guRyZ#%?Q%MQPVop5Yu^QxyG~vHH_* z^-zs2wf}m<5HgM0|3K6^@zQ|KSg$F|5B3?6nxV1(uZnsHbHhfG;oS>G+i%@)+7uOI zPvB1}^@qs|`jCzDJagwKRVHtycgDV7ZZdeGsh=uRyp%uEUli{2s7-#(b0J$!T|(22 zE=LJTZ2yQX=k^K-Kln;*?D^H1)D5_d7XCGoi}x2DNX+*DML6YmezF5O+Ac)_=Z9dp zA2RT5CZnfn{Vc^~heis}bCKSs3b~$*f=Alp_`E=Lwo?{^*YU7WWL&IBMp1musIIs# z3H7$0P#13>Fdmt|VSkUS(ZW^*c;G)$G=^Mkk>VZnVHfINA%lwtJu8>wY4qHrdPZE& z7X7K74o3n}8t3;H81M3C>os`K!r3S~Y_v$0j?s*__`)Ja|Cez_g7^Nz!r^XBl&ePi z;e%CfB6E|QV*i~J@$~>v7qutonL@{V-1H`@PyhB%d;Uq!xNFUnQ!TpS8~%ZL$=B*( z(4)A+zBdp5+e!VS`7Ys0iN8|*{WiV(NbIwp_6XNW(C7n=dOA9~fHyh3TQIZjp{z=O zKf2>;MLs!Ok=Fl=z{3tT;^I}~vxS8Nx|jL=Zr<17*s^~^E`Eknu7=;1^4E5@!h76) z^Q()kxcHUy{0{o%zsG@oeSJP2^k2Q(OX)=Ums9=rE>_rd=jcD`@3$_X%|5gf_ASYx_fzmF1NQwL;QjIrYy9oU zxshmp1GuBBqvO(jDt>A+lCh6A{t-*2;KVRK|3vD~u3efaN7EYq6*_#(t!p)j{Ih2= zwpX$E?X66Op!nt^e(N7w&;Z}N?2BpL zQ+L}LQ*hiv_Wt~z#``Oaj|Y3swrHk&bF4q|-Q$WKNHYxfTz({+YoE=Qxf=W!?>IE` zLsRm>&;_S=iN^`FhiiHN2R&dP{fK7D8y7~R`43;_E~j%)wdG`dUysFueIP!JS2R<$ zJ>CF+JzL{o^d(=MGGJuOR>gyKs7veoe}=kY6{l3 z=G%v-ALf^*AN1^;lB4mrQRU&e!claaf!EdG?(DK8|aD@P~;(xdP}PGS?cP z98itutTn=>yW_d~HF#>zW6@2N}q&;KR;X4LN2gYml ze{J^Hw%&Q;1^e^j$-r+W0>o#CZ@+ebM0Im7eO|C0DYza_Pg58WFxO7-*Ne`ZuY^+^A%LZ~8KDX(XKsqFx~ z?jqZ7V(dn1wN>TK8oYJ&(_%z@1)h4a5~+^{;A-RgG4X0S<&U8J4{HXLdC%+7BLGk5 z@OOMuLv6Nbr?9r3Uzz<>*UcZVn%CQh(3Dlk`*d1mEpDav zg|yj6x<9s;;ulhEJ8C1~*EU}1ep)8gQ$n@qEd9-|&7RVIvvHS3;4f!uc&>VSRWzsf zsd)AQd&2#zbJRY07f0Y@FRqFaUz;8T`{=)5@27n}|J(j>e@uQ}06dSs$K$c85f=)u zA#JI*_>BiSwyq*M9{ft|y5T4Ka*gd5d1YoL)#KW}2=E_^&Wqd4yO6a;FT|lIzo59< zY=5`+&hu5uAK41PU-0Zh_Dr9LYW065F8WxEvLbdc=ev|eJyg+uz1H9d+nbXSuN<&2 z=#}{G#&_gO*nWIH>wi(@j5;P1#Wht5TVwJ&Egp&M>7Nk)sw?2isqA?$hvKhoq2B}T znkcuFjL)yAdkD4nh$Olr6d1i=&ueKlzo;ByvxUX$mCB9RmgYP7#QTgaiwbq3_?D~K^K9rC9res9lwYT*GCOn{dA%R* zBgUw~h)tWf9*#_2_sl%$q6S)lA5rdUT)oK6nfsH4)=^Ls>nM!*tY+ z)Sih{&yFe6h}3`Fk9grHlUY5I{p(Twy?guS8!bQ7df@tLcpAm~jbQoTSpJ?bm|yvP z-4MO-y$n{reuFP6yRB;BL1ug9$+yw@&EMsrfc2yCJYNM?Z;NF1qh{29z#qg_?aS!d zOa0+JJ+qb1=L?7a9`AvD?UWM^Pb0N&{_RyW*v$JV#h*Dcn!yh&^=DnLcFN=p`T0i{ zN8sa=PNIeu0=~VK#cR|5VYmV>3}p4>MCz!|#;Jt$<@97xe-H`FUou=rJ!9KZ!GD*s zjQ;j>6}Xmy#cR`ld%S>`C9!zmPoew+4Vsnl&y^_(Z2yh*2W{)!hVrk@X7R(9byP_4 zB)*vqUfkRU?>BiN-qaFL_O02D4?nIfK)iBFoQKYN_Q7juJhYwp37x*p-rx3lHC!RZ zPmebqSh2n$xmX%MuX5t&!A|oOsWU@0@$GHHFr2c|ScLdFqHhUOJY@TC9#3mXVv&qcr=$VpQT&L1omRrki3ZyREh1AP3~ z;L2Fy@0w8;kBmb&IynP5y}HijAG>5X0(>^*_pBI>>b>#8*Vi`0eb@8xz<L=05|9}STkNZzSfKDXmY2I%y>Z$@WXhYJ8eeuFVsK$_G^?z50{_f zttdYa&*KMsf*!!{@ZK&$?0hUlY3#|v!+hPQdSJe&ej?>RFkd`9z<;Myzns4noi839 z_+|F_mp_2=^Yn;C4OM;DZzIW1b_+GCx{x_TbV*96EM3T^I7G#b>0~S|xhav8DZn*!MMKKGak7owb_;ESN7e^BF}Zwa5_ncufQ*lyp5NM+Y}*qc)TU9s-D5<0X*n=5(3VEX7(hDKerWU=2szR-y7kaFMNDM!(vq+#eaKTm&{l{ z0Ihx7o~)$!*Rz*#^)#aRqp8aUxxY0XZNtTD+fP5|dEtlE*!@((m(PCy{}r+E9P%Ga zPX3cW7jyBzA58O^S>^Jd9=|YlyUON2sik;_a`_M7*H7f@2R)EK$nz7>!yB)*`~k+R zYsT&`4MLu)+-QDv{dYctrF>@ISBza}uz1KnuXFNGA3>p&|H!7JLVulRkT3nq|2;v0 zYwNP()wVzG`=G$_gwI5U+w0EW3(v0i0{($M?EFH$VNdg=hvo96 zAgVvAHJfihK9EcE^YZx&=&7E<@@vbl!2Udb(Ep6)GduURE2IDO7mSx3WBFUCcayqa z#;POw4He20E~HLHHzH2o>OFB?I?|iQ_P_g?vKCAD^ph@lO9eNwYR+%`>Z@It{B3%b zR8stKjbcZqbVa;*69W5%ZcmIWZa9E;8MFL=2mXx|-!8<6+zB=&?iH-CqSi_-{@A7I z82AA%zwZJ3|FrMQ=+UMh_#aPwFUz@bT7232U zr;7{G#5LU+{BC6=5pVqFm%mqiyN{sxm%1@{1KMBs3+*pFi1N$p3r%@_0u8*&evew> z`;x3KKCc5nSEY{}rIe#C&6zppQ}8HA!&I5K#t-!b6j^+tS_L?P!1_6*+I=a!<^+lj(Y>Teyk zw8F+G+jv#z>Pa%5O-FjeTQhj6|1$7zSkMX^n%JP_UtP%ViwjZ9>n#8M<`)#I^>a1r zMP3i#$GLfEaQik4|DZ2>6esqt(BS3u8F~dTMYkV&F?bi+Kl;*v%^H7@_xC)xat+!Y z+l0Xz&9_!ey>vt~UU|KRitBcxu(@o%U8$cn_=CLP<=U=!XoMa+zoVZdD<;Qp(D<8I zlhx?(N(&rk=0!%?u11Cf6^xz>vui6>Z~pE7a{JU8kc$fSd>B0RL))1ox>+oARe#JI)Vz3|RNh<6F}@Ap6W{aVOO zR;+vCBdnl!`Tg_PwcBvIeR{ls_;2c$xkYz@L)N`h%or0Oc>Q zhsUoIy<2hVWozLu<(I#gZB60_nN{8@ z)O5bUA7=lp6h%5;3+Q~s-*v%%(gXe}ug?H_c>aIzNgcAPwuca0&L8koK7SCkKdfKi zm-kl!`}6q0KH&dg&+_)+>4$nsy+^tUAIkaLsF$wX`R&(u7giUw*5Kv*u)cWyAjPY* zRR7lFn{$wQzSy960)}|S)8A!pBSpzOAK|ZZeqjW=xh?|3((HdqzP$FFfdAauRrQs(~cronBneyTg8=b)mRV0JrOuo>&B9O=>m zuShEvo6`H1t@^jdSzlRv4#oHFk}V9P~e3ygYlJU+`ypmgh$?9)GmYq@nK0?0q6y+pExhWBO=(j@HEI*$2j3o7!jnDK{nk zUWcC!(j`uVbg|OjQ>%Tz{v{^vW$MGUdFFu~2e9@8f6&pV_ur^}K2SX>T0ex^2!sCh zec5~r@W9X0->r#ue(<+*lz%1V&Zlz#{=?&k@dEz|2iG$7)>^M@tyRA^f77O?@K~;9 zy=?hZfZS({qIW1ex!y_uq_$TP8H#bMvK<(dv?vI(i z^N57MOZCh14Z!pCcRSxhU2oe0!D>i^@=!o1iF43JEvvsp1HVS%sO^=R^;plpn_yXr zza0>YKiTV|Gp4`so%gZl)9#etevh*-dzOdt+0^dDzx6KhV~tPZQ85a?zN5?VgC4+l zvm2n?tviy$RVox8zZ#N1Ejf&fUy_a0gP+?7-6>vStr9z(9Ysden4rO1%xB*VOL)+; zd2APP$+IHy)$P6n^ziV5-Mt0i2mG=jUC`l|MdG1S{E_VDjDAaMA8EW9Q@i7Hp1Z^m zwSJHH=8#qlen=^Q52`=fQiW=r8%3NZiGsP@H2jR5M;4KaAJE zW0sIa_3zKwCvFMz!!194)!3gmUYIZAwM#YQm4Cm|HeV7y=-IZZK-^|b9>Ee6{)k{p!I=^6_o>V{B=kvu2Xq*_1=XPwU!Sn1hh~j&cj`vvXPBb{X zJD&C8qh`E3Jj@r27xe2{N8;vGPlHlDJbOxb@Q2*~Hh9HfW0Bo3Z;k)(@Q^=$GEJ0! zub@7lqqB3Z7k(MTey@OhbyC56;XRGd^8M(GA?-`X!9%`niqnO66ffUTA%EcEA%8x* zXNe~N@9|i3zQbMU`L0f`8*VqBjVF+w@1S_d&*|GrqIa@7Zf5!#IZ*tvp6q!a^q5dR zw`u&5_ZtE|Cz9CjArcz8)l(bmJLI{r7i-&OXmEnK7XJFn2G zOg-4a?~Z$4tu~4Iy;!PO33}x9DvRn&=i>JlbrWE|fL~tE7Wlsi?C;m>O6yw!zr4OB z@bmE6{PUJUq<3PcFh;*N{|wCk*>-F-7C+he0a-fOOJkn_YewdG{%l5Ww&_NDK3#Y!QneNBS#F=zZ+%$#%*qVJlEt z=n7P4;c#Ld(i`jaWY5=;X1z7|S_!twNY85cY?2YKS71#ZwCIf+erL}wqb~X>j7#}j zRk|DeQgq^)7V< zxSy}0czHefW#9d<=>_(FzJzZ-wWU(t&#vy%_Bfh@m-Muw_&}TMsDR#|-;id2Z63GB zc5_)h5) zuW@K)N+|dKKk$#D_W7IM|Cf(zqfZHLFL$H+^wZ zCEwpqg*wcp2*SJcTP^!K^K2PITrrDYQ2vk81KWY`&G}oMxizX zqHyirQE1YcbLe^l77ycHNcB5XJspc%;{}z5Ag^#ca(dK7lvsnscWU`dl=!E1PZXQA ziNg3}U$j;{hgLUb$E&TrWu;0kxaABs|A+dSuW9{EA6hR|UO%%F{Y|UaUba7r+M>45 zacQt{C1QjSa5@0J>JUf9w5yoE;FUcNd&u@Tk?LUrKb%9PdYHifcG5T|zf#0h5qv2B zMau6v*F$`NE}q1ftT_Vw5jDm#c&N__`k~&bygn!JZ)(TB*UKIKPO(fJAzY^Xwdik^ zar8G!&;|VJ=wS>$!Y>uh=Fu9w{JuKi?`&l6Q$hXG6|{b7C#pwYzZCSGsy2k-*H$0Z zoX(fq)&30Li}o)A{g%nav$?uH*!%F;T& z+UnB+f6+GfewT{+XXe=?4ZqLj+4S8}3@)tro1fSX!H9jN^X79VX}jqIiRfq$!Crf9xUz~S`WaM7l%sHG2! zm-OUbYvz5@h`w8%dmHT!G$XziJCNO37C-J@J%#`O-zWd~_bF}n$t$PTQb_m74>azA z@3s1j>UnCvPwsHNmO{EuUd3k=PH@T)z1nHNPd>3X>r-W+eD>&5k+_VqG)m%c(;kDgE4 z;=FrKWUrBJp0@P}{CDa4YEIXSoL}4eiYny?yqsU#`U3oR8XsVNE&QUye??l8B{j6K zuNqWO2fAL4(e?5%#uZ-}VT)(>Sgm!v03Oz3H@Y6pP5trl0Rd?2gDOPZdIbAaP*hRF zd@Z->hIjlph1RG2jZRIr#L9$~%=%inu@8p(@Bx(nlWlGMW8@;V`=e6peR%K(xDOBa z`5&D82R+Ikg)YVQ#Y-r^ehPbkUh*G!FVN%7NNl@nyl7HE`+EVvOYa5b_iwem7XbZm z{~zx2rnR5btg8wJ-CA9+=c zi-&l!-e{XJnbwN_;LiYaX z-~Hmb_>=2z5TAMW2Y#OYrFg!soc#gMvp?X${(zU;AMkfL_P-u^j||;4K>gkEvMQ+6 zFL6~t6{0%aoCJS~#eubg82cD&sSn^o-}0XL$>xXJ>H~QHGaUEt7r^jqt8ZW!HX6q_ zXYZ?n9@7Dq>H`H&$gDaO$=h*#ycb)~L}4Cd@zAmCdxZX}Emb|1wN;1zTCFm=GL^h* zruI5klAlkDgyHWB_C7h_4@PuW&+fic)v#MMNqkgE99?~m7;YJZS6Z<8wbfe~m>7;H z=FxACEL+m5Im{ftx|pI$3e;YjgSDE^C5 z!0ELT!~w19;eDdO#X~%V^$Ymy6RBcBQg1Ty<6D#+=7hTRRWkg>)So>{@v(IlqG1nv zlm2_(qKEc~i=z|Y6C+6C`3)lQD-rws5XKAo4THJ}Z$G$^dj)mL()x+~FmGRZx$*GIZIDN!A?*T`{(EA@ZnEe#+9ox*--~%qYktge%$)Pi1 z{zaqFsENT%F5an6kh;gQVnNOyvZ5!le9yjz1^(glBh~&CFXwO8X(0Nk_YcD_^?QQ; zP4a$E>MeKC{+D$ae};ZiM>+kZqBCxx*|gtz`Ss(qEL%i?{0R*$hkkuA5QCS22g)CqVZ7v zUZ&%j7pT!y_IxejeX0Ksp5lqW-x9=$N1EV)NB%;|9Q;tqpHu4pa{QLZSJ7oRw*Lt5 ze>~n&+)K3ul-^u$4 zMjrctRFhe})bG!^T))35Hb0T>clQ30w*GyhlMdb#%Gw|NA(qxhh55>85sw{W8j0WHyusoh}I;o3WN)`8{Mw%--G)}&{7{{Hy2bU&4UKlD_Ya`D>s-%oR^a`Ejq=_xwL z?h))JJ`>tjdy7Wc>65t)>D|?#uaHjbaZG<$3Gbe8iNU{bSdIDpx;WldQKiOV!HwdR zJ2>FGK@-H>m+pA#qxa}f_{LOEc|1?gq3*2}+0%{-fOk3G19uIyKo1Q~aAy5)T>YKj zwop7x)`^+ARWJwK#*(zkZLYqVd-Y8vL9*H+;Tz3ED`C#r`{V zFb|(L(OfaD`9+OAXRWA#*Zn+?hNZdV(G<_qpBtA$5~ttL@K-dsD*8Ee!V8^WiIpoF zVc&FC&$GIO)ERt3!|&Q?v-mu%0X9G3j?F1vrxQD0o2t!MU5fJ%9I1bb2HYDJQv7l_9@RmC^IKVtAh-Pfrgo&)|$ zY+G^S?jxeIXE<(8d&R^yKFZ)<)>yCDd|si!H;8t^^KYez=R%xtuV+=Tm#HI@|GYHY zuNXbSPlLZDD$pRS3FH(BL86}_ZgiFH*EXod4)UT$Ck=j<1@bni{zx4)2U$Ph06 z@}{kdezkT8fS2Eg1pJYue>39+d>@JjJ;xT=lDAef(TlyUHF{QX@GcR-icqqy*-KQI@(X8hliK+fPT=^^GyLdOy9|YJ$ZT-&p)Ng9#vPUU9v{`jnc{c8HFpdb%0vG4cN~#Y_D1?_+m;g0MC`=!brk^7Bq*OMkBZ%TA5dgO<$}uHU>V z7^}?0{MLPNQ9%X#D>(>P4(Y?pm)Uu9b!yOb!Rz5I;c1``*1fb+Y`DS*?-&z+y9z-J zzKe4`wbP^oVa2$6g3*C^eEWqe-}I>!`WO>{9SZyz{O%}wwN7}FP|@|C5IXmr_p86+ zu}OSY^m$bfZh4i(+fjah%D-(_UFE5H@p#A#b$;eLTM_upO?ETu@zHpDb-NKs!h;8O zmA>!ZcpDv$$6K9@#pP>)aPstB4E_kU&v(6L z@ZWwlP^ZVu5%Tw2D&_sxypkyYi4_d~!#Q*HE^5!fku}05dDcRx;Rb71X9}m)LND%Ik z*N4F$i2te@^K`C;-zaT0y4s}{sc0aO2Q>n4*1j+XZ>+ap)i`{y1~2db9@?iTRxSO( z^pBo8|A^|$=1h$qRB~PPe%t`Z&2S{4Z33~%<|=~^xv*Tdv{#1EZEG#%n!u#|!l-G) zWME#~oaX*m<&nhT=WJcC(*3wv=#^hfDbHsr>rs0~`7roV@mp1)g{y?PHT9IQt$UHx z5AL9c!;gqzM+0!^nN)_FY)KWp%C)F#0TJ)@c$)V0YB*fuki}-|4aO7;fGYUYOD~f+u15> zkM=-Q-ghS<^^Ec1;f=B9_T!Adt?AoUwXy$t!G_|qCMm>c`aQ6}w-I(f(-=E=9$@gD z(rEv$&@~$V4HYhl4GsKp4|-3hg`Xq7>2rj^gTF1K{s#Ov2W>&M&jpaKF;CF4O%AwE z*Ru@%S?PKK{qYa7QJeP`B>BEO9(c_O`yRc|;7)HD1@C$Jn!$T{HdZ@to21bnG`A*h z>Dq?m=80&)C}+H7%r^!fYjmBwqw6u=#6a14U0>8_MGUd{Y>y_jHN!o=ys-Bk0}40)1L+N)^icr5=|~1f9k!#LJuE&&EkPS zs=-E$9-}#aXkt-cyrOy$x=i_f?KU%dfFJO{A5gR&nc0lRD+((i>o`5Ur}I_@A3N}i zLh|STk`KgD{Qt5ZO%4?(r1kY*_G`dPdgS>4#0TE~4*36NeSv;S&wp9(aGt74&r=@d z&QmM>2vQt4%-9poYn|x%4)F5xU9M3cdcTw1e}8>Gj4ao0)!@H*J@w98T#1bF3c`~r z9Yhb_EoJx@)=wr&ytfH(9_-j4N^G*BF)7*D8b9uG5IxVH$>3+-HC4fR6Y%o)aiC{U z_)rG#v`?v$&X27-IFQHm{8&QIk1$@-;O-25n^TZt!d{iIv7^ z+flqs&%gL@Umfv~5Vk(B#J}P9c>l!%|J5n%cw+-ksHF4GzUSxAfEzV&+8@q4155F6 ze%W&A3W`Xtj$L%!HRlE1`KWFDE>&-Oe%V3ue~+xjc!I?oRQb5O*7FPC`<9-MT&Fe0 zDQ0ufmcM`V^Ug=_2W(ME=aE~j?xO~$Qc(Yo+Rr0vKMqmB`RKo%MK>?KcGY(4Zk2b3LlJS>oad#>M2;EMZ(9+sb${pAN@KGD^j*``PVot5C&{pRHk0R_0+L= z*(UaW0_dqwHB*C^zt75P5sMF=*~I0)ZNFRyIhR)EJ$v!ci8$uhItCB=!JY>vrIvYb z9uyjlzwF=6;6V@YgFWT%+3m#`t@h;2m%)u_?tFos@!yte>?wcW{p!>Nt@hMrA8q#J z=?DAp=65UA6E<+U#{Tm6Yi7g z<^6vRjX%8k1^|usABa~x`@neH(0F@_>X*mc;WXaz{B2dVtuQ)$zo42kOZnwk4Lm%kHm>VilhB{b zan?!pK3=ctzZC0_?Gla+oK)11N|Ua{ww;c6&w1W z7KS8;mwA8PqLwvE9d62;FSOwgjBLoo4|$fS;rIDDT$y&$34h+X06o0rgsrlgqCNJy zT>iex&j}8u;mQN_J>!`>jd45OcC6YCsNLgOb4Ug9sW2ga*f zR)N7w_DuXbP?K+Wn6V65ghdmur%sdk%p1?_#^y1y4pTAvwKo4Zr+Bk( z`CL5kzumU1%z4UxSOFUJ2Y$fIfA0o-9EZP209I^ld|CL=C#g(7?sVF=$hs+eKL_vu zi|z=K*He^NY3<~B&9;cOyIYeP0X|&3?W`V()52fEgU>0N`3+e%7_S}vQvCVIN7K8f z{C%WZ2f`GgsrLlk({s!8%T9{wh-Y}S_Xz>N-0q?fGIW-*f`J=e-eikt>t{_;X}xG3 z9`u;edcRi_XO+=YZATs(}oHfOwr4Fa)+TM!dJ<18#yfWK1CK7lGB+Q4)-^bNOE#>EZcZuQ!T089wtzS2U<}+Qlv-vaNrSpiq9@GSyFWs)g=I7e@ zN6~!1>j#^E0v_@)IIkVwD~dahZ+5>z>(}k4`9}XjHXn|h-Bu0x%&Fh!mw)?Bq|$sK z?FpL?1HW{hUHzdzyg}=;!FQC$*Q4=~KsG-FymX#DM)mBW_2oWM8-31?!A*{``R7=w z2lT`FNdEoSjpiG7bJ+Y=;)nB*{Chswr~f!M-~N+*yf(1;wzl!YeDTH$`la)48+zaM zE3HL0o&JG6AJ1mG}%bcBRu;6Ka3Z?FNL>iL6l32>AUgDR zN89=WJbb^}dcc_^&^ITAT|G!GdS27!&%E)%{90&P@6!2Ez8-_=dF@kI{(9u$9bb*t zikHs6^7S>#U>shV$F5(=-{8C;_qSGI(Rjx$zP|xKoOk5@{3b63Pv-DT{$C#deb7Wa zW3=}54(D09Kj$>%`?KV4a2}M$a~SW6{o3O>obTlE9PDXr%f@r?H}D5rdY+a0!}R_! zxavWEd;>gB|836qRY^bCN4{RbK52T|*H?Kw*q=9EX}t`j=STT^d3SOGUhtCLFQoMj z_L1L*0e^^4^YuvQS-CyIpLzC#@q&Hedy#ySsC{_)wdL~@Xny;@ynVJZI9}+tr=XtEAXG|R(z(1O3 z%kWoo87AZ|HWomSy#GQ8)uSKF;^!s$3wbbpS0JgeUg4!!8=5MEZOgZ?TYh8q4O@?Xs%k;mX{OBzE-a&QNRjB4U zT-ZVRKQ%)5wQEy6mew;lOZlsD@C%O_3yQo%jUIXZinkPRPTxzHKfh$(FcLbNCkndM zKJwo~a|eybT{!q|s|pme&Zlbh%lp?Hj~S0&)o1G&HhFSPk&(1WGhfyXuhTb-BQVtK zFnt}18(XvZC1HiCx}KJ5nBO(F7sa7sI2qsm_jsrJpJu)%;hRx=T2T9dKkTr* zhz3*p#FyG9Yb{%UsRx}e$v*9ZW+0z1dopc=I{`gByqfyM*nYYi{aG=WP(%|`vf!Kt z0sGvGW9!p`zeTRq)7aE zH;=1SFkX2*0k97b59{&!+kPtWp9ge3R=igt2A1l1dY=7W3hTXgVILLDm%M&pcHDUE zc!9-_qVdhD$X*lQk}_K2H4*9gU&1}fTN+O?Y}xva5U;xItw10?`2HM^bM!Jrh*$Th z{tA=W_v}VAUJbtdRRsU+xuiMHuH!G7oOU6D>3TdE$Ksu7{M_2z{@?id>&vx#h@VF& z{}7HIsb9I0)>{KVcG~+9Wz(MY!3n{**KYPbrc`gOe0{dTVG69|;GzB-^jimhc|EkT z*$N!-mE~Vi+MgZp`5p%D+p7I7ZW%um`!x^7@f^Ii?=!HUI&!`*Y5N`p`!x@*?fW6@ zzb850$FzN)f&Gz(*Y>^WKK;Iwq~-e(@B3H*{k}ATgV(0#BK@9oV*~rWNZbDYh<;z< z;iF3X-9!C4dB1xD>OV(zvGXhW&x3OH?o6ov@bKV2P)`r|<^E$y{pZRTmLL2F>JtLq zvXU9OS8X@iX5xjvIR$g^4=XCw27ML^H_x_GR^9bcyyI#`J~>;F87I7OPkXlhmEv9- zS_@>pP=KHGDU+Lyxg#GUhW%g6xm+3QvT+PhBN$+D8GbvqWYIp{q`uJJ5eRuf&p9{YM&@o`p zU(Y9;;eSB+0iR0o^gW~K=(s00qH&mppNAJH|F?h)!Jq1v*Ovf(iysjTKiEgY+fe>f zRQr!o{X9JIPdvF)Zhy+DqoYkf@JskdwROql8Ur+Vu#YzVFy0k4TWRbM+%U)5<`?ux z{sY*BbiO_xb0^>Fc%wP~BiRT1?VyK2PK1pMj;Hs*w9T(%AHdsE`_y)}!h77Th_?9! zyrlnV`UlP4(jX^{X!Ey?sHythtJ#`*=Ab{!&WkKx=0totxZ>!{P-ea?e7*n0r>@W= z4X^zr+OG1};9G?ZWbnWra$$}zcbdEMS4F*pxnU#8@a~18!52RNw){5#;)kzuAl6O| z$guNwH28D7S$=JL#(8+*3v1c>d)q00DAhBM>XGw@?xuaA+e9(?K@Vz^sll(G??663 zZ-DLJ-V!(7Qs9xzSUl*dRDG4kp7MT(H#-P;2K@$IKHv81*;AOYb)KfbfT>~*I=rkg zR?+qTs&!*LwsLg_pX1*{m`U+aU%ioQ3VQ9;07vV1lb;lC`T8@HPfqO7Rq*?%$8aZ`{m~(GUFfX@3N3+D}2= zAE7VR!y7N)p`Su|{G*DEar<6u{?nb>6YK+cxjjSE8{xknvi5|20Y7yHXzV}YmknN< z+FpELRe}AA>ffdb!jZn|)#5Q@c}q`ki0n`H%9?aI&VRCCeILcsUACj);^$rj8nW2 z)NO=v1J$pyeJ1MP*McnavB9W{Dc7DWnkQ=TjkYRqP0Oj`g~pa7ZhJ%QQ;Ed`|1Ubf zuwGOvhhh5CO4MJNB@UqTd;1l;UcldY{V86&se`Xp=Hn%PWUvl(kIfPfx(+3ic3N`z zwfS2(#UJCWchF;3+V4Z&&*B!I=DO@_mh5Zxoybo7=6UJ7en)f8>+}A0 zySe%2etX;=^E}U)GuND%c^>2V{RQJW#z#J$3znn(D=p!9%xCF&$@}lGHzWMho*v=! z)$)H+V@v-r`8<#HT(BMr_7{15kWmv>``5j9iqn_sn;Q$dpX&Uwq#{3%>ErvtjlEx*wI$Tn*bZKnixE+O{=UbY{;2}}YrXnu zZ(5qr<MQZ6kK=78Hr~Dq5$L9k)5&W#-acgdUI|Y*{WDDeXY+}|;k*5{ z5${c?UFufy*e{Txz7mh^y?cA6fPMlGn9$bgfz-lgi@{ISmzSJA##4GyZVh@hb|(f43Kn>0sAU;;~aTD8}b$75=_%^k4b$bc6q$UyW%b+l2c%w}rvK z65rgcu^`Qd<@J}<=99=v^F8_c?a=@MLKhC>#-E#$eFU5j7tB9Fn%}C;KW{J|=bt!# z-aD^0JT91j_PnKmX3oPo{i{ZG{^fB#|B9VW@Avwsxa6Y;SS9oG`D;wypXtXH((m`h z0|q4W^KI0Z+S{k0=CFC9FF3Y$rRUi11top8_#6uKU^i9s`Y|1*3dYxFYOo%M{JhvF z=M|(=<{d77d@ZIJc&zs^Ak7m-`y4uazl8_A*n1nfqrjhCJWBWoR)+KG$D0L0o%TzK zeM56V{m?!9`fx(s5ke%Zw}Sfe?**vuu$SjESUnM}hl1mqnbrlWfE(nN8%^w2Y#w*6lUxn41DDm4G$_6$S6EC%(!>drr;Tsbso;=@#EPKeOu()OF3iW#BvK?G>HQ2SM>> z9|-d0n*ZYX?a^_%`!BKubLQvZ^k3q$J0`HQs5@=8q9|F^h1Va-&Np>o`pC=QFUY$L z<@KNLiHE5#ZW#Q?=l_>Vr298X;MbES-i+zXzh6vDE=sP=y_fh|OCeQcT?yh+obk?9RKVR08>Cb=0|DHnr9pf#S zzI;EhFVlahz(4vSXa=!*_dcwi$mH6d5Sf0~-@81kbQNfQ=`E6vmUY zuC~PJE`R1kYm{@T<*6S?YNEE1tk2auNGFg()AMW%_CKckFLwMv2&JXg!q;vx>AOAOA zX{N~Q7_VhK*58qj|Nk(4N)O=t94bE*MwH!V$Y=R^gi}i$VdBIH?tMD>(-g3?-X=sh zt*VuOFB4tt;GzP5cFHP>`qQFCop~a_evk8PZao@;pV!1 zwRQ^=8Gm?2zGxAXFFLaI#y!qd2g@BF5rZb#+;Lws_7JJAOB#)xzBys01aqr|VOtJUH7gZ}0Ff4;H1 zemlgB;q+}g{^43d;O@44lGU>+ZLw&x&-@mGs|A~=diahFLK8vis$oIpb{!Cl` z{#evU9{ZQPzo7my1-^a8K^SZrAQ*Sqt;_mS6Z+?$7h^})qOEo~!RuB*T>L-B+@!rj zry2M!VMA!E&*@}f%_o@=*KHws7QerGV3AV>-qie(u7qC;TG=Oo%nK+@Q*X0%N=JUb z_wqh{GG{K1HR$7f6~9H`|1EymL&7v(e}=_I8e72kXZr!L-sMd8ee>vbJ8+HVc}XAr z$mgrhFYF<=JnyGy)@q7=iZWh4-x!x}2j?5}yjpvGqwS#gJAQvS@_Mz8&?BL$K_FVjtm!8+WCQfujYbu(?)u9iZ>|l}!|GcohL)h~*Vb6CttKA*9 zJ5Nk@=tY};uMQu7^7n^Lwqov^7^np zYC1sTfAkmRF+Ng%Y?xmIJZA9z)#6|Bdri1=nD>MAwy+*qLA@|~znjN_4c{LVwfbe9 z`kEVftY3C&wJV*z_?&obrh5G{)W6Bsw*HzoKmX$N5IH^H#L~c`Gnx|IfNFK)VY3{72&P{tbCOLFA`+x^eTLXW@r6 zsE_+{Vkmg`h5Me{ErPak&MUrwtPN+knIUL6UFoBUz)GV>x(U6@wq&V zpU z4pRN8=Kaf%k?UCf@iE6p&6G6K{B%(+J~nfbK&n4=aP=+!r8$wX#^sn8|9dO(QsC9< zN!fneN@9GBIQ@omv&oBs`cpwGHj##`{?w5gWogAccJ`vOF~_UblR8y$D|udz*T;H@ zQa!Acw+&$M1beb{sV6v0P9r|I`2CRk7XRU~UX|9u6+W|iRUw_N=^Tr#WZz?+FFWKu zNiV2}MV(fV=tKb)jxP@pYtl%1Y2JVKo@JT^t40dO7FEQofn{Oi{dREp{T=_od)pUo>_pNc!^qKd2wsKbO<*vvfICP=FVSZ0<_hPSpV}v9 zh{67@tR|~7G_0T{B}VbzFKTW})~#PL(!gJvREC~rbG*hkZu_U~aU;R@w>f>{*k334 z8FC}jKYL*$q)q-4ACpn{Ilg;n@66ofY5K7FDS`>ByV;~zdm35f5_x=WA6Xj8#~=AH zcE5T!<3k5}(XjL1{qt_S0`fLN>`v!G=Sh)2&hAUsB`p7oFL!4bNgT@0Pq1DO*2mE^ zUOxXxV!ST>9;c7>>?Hp$E?Ch(HkTQ9#tP1^+t1cNXDRaNAKP2s%a7LiW=Xo~>%g@I z`$_KVct!ps^M8c-$=hR110Njnw^-8#p7h#HHjG@#@mT*(qfjqzZ}=9nVbFYzNB`Ad zSn9F8Cx(X6sxQ})5pI;MblpunX7cBi)Z(+qZa3*Rg+Cu^TyC@>o>&j-+vCb~+WH=3 z-P@+rE^jk=8qV`-^Hr-A*U7Lwd_Jhv=WSFpo3z}?^HTjFtp6pi2RDA470mS=$Hhmj zp551B6`;J`WR92g3)hE2{qoBcp6~W5hI%w_X3Z0*(&+cBgnPRs-mWuu*enX*pNysbtk?NOW{WW?0vXfIS;bMfIYcD=utpA04 z{E7~A@u$Y(^vsg3X2)hxi4Puj zL;RFy4Ug-)s`9Acq{TW7>dWi1d_5WsbDUf`Kd3M9^8K`GJhs<&qE1)!$VJ`5&LctB zGSz?n?B!xo<~Rt>)bR3B|l#j)_7 z)khn}>Z6S+F%0hR<<|p|-&4J>zF*s1aO~g(x3fe1^E?}ZTKzJ$eDhSP2Z#Q#{@S2F z_1FIOzdU<1e6{BD0r~WT`fG!OM!~{+#l`Mr=7@*Zj)9bY{CR{LCl11zf_#(L=Ni8w z8gka~`WXMLS)O`~e}?aH=+Mw1^FxCzVufSlpkxPreGl`$AFG##{Y9St70Zr?RA)Z_ z4}D&$YcO=IP|wN*VuOB$`Q+}3*3hBKO8@lW9?&%Cm*^c_pUh3+ z=aZEtWYLI-xk4-31`zkwSL_&J2flZ;^x%;yr1SxPemlYE&-@wny%N2D zy$wZPN&jn9U4#Ca7Au9p<)h*GvF75MTAedG7A*;B-t{>WV%kgL)r);KN%jxOq-W*m z&HJwK!`~6YP3v>|YWx!mM;MjFKVMpJpdsH-e^6vGSkqu<=Cfm6An&0Ac;Dy!EIQj? z^OO0(_*kQI? z={Hs2F`heE{vcnW?_fxc2s!j_$}v`}$_e(3<>Qa~=h*W_{*+56m{#QwIe7XKt3Ble zPaE^kHbJL;0l*&J|#Ea@Z)o-I5!=R57-~GJzG+*vZX|~AC-W9 z$RS;Z@V}R@1Ps$*doliGKrw3PxHGfQi7s$8D~EWUxy6mQ(L$_dXFM3bXL-Nz2F-d? zda>Ipv0u4r5VV&cZ%6yj)=B*0H{SGEiYYzL_?18EDe|FbR_W|hI~eqx9GcM#?_xfI z?P}7T`p)1oo%bf(4U*D!;wM!`|kY0)AVun zAKq*KVll3AQ}D91qMI7mf-?hoenQS-jdiI%erhgyPj0QgNqXy>(V!+(!LKy$rzeX~ zb%pp$ubfA^bmHgpXEdq02L}fWWgDFmf7b6q&kxKY;jwQrUzEuq*>3##JGJ;czVU%P zt!q;1=bCqybb2?6(^q@G!`ee=M}VfBFC%c&pP(J@=o%+)A2SMztALM$H|t0U)|N@&`KMa zVC_fUpJtIgv3z^4OlqZBp0G?P;!1?%$EQe2?SVkI6cwv3IZNJ5=lRUMSsM4w3k~}6 z{lop=WRW>B!#V%`PfgK~yad7beR*L)UTG*kqdl}aXC|iK7D-p9Mkrm%m1{)~-`ikL+vX;|fLA$!++&6&=g@bjW8z{m39)gJ3emNn0B z+MTB9U1GSwf3q|9;*;2X_$iAgj_2cI+rZi5ZN;atmh=OQ=gmv) zxcE2TQB?Tc(p~7y;xE6Sq-RP?Qsp{-p3aZ)Ul?DS`B`zKu1Le`)1*E=U~geTmR{z0 z-$gdUSH?#$eGlP>|CZh!wBrkRIv}ehaXD$u`MLYh#-Lw{>G#R9A}78$(_~gp6ZLZr z^8D?wTA`I=pg~`Lo?_9tmLzm6|9w#6QQx9XNl5+vL^OKC_Me+ukhIx6kM+B;{&L~^ z-Gh?fk^a~C-|zib-hyH+E%kd@z1QDGJ)wU@O#s^4#(~aT_=Kl)wuk^g)A9jV)Vi7|;<-cb)9IFf6-nHfO z8F{7lz8+KuoVKX*=wJSOygu{4xC7sRQU4V4W3y+MuwlL%m|IpS%fB?Fr+3v=>+bKA@lBJNW%n$jjRMZ#^JvZ<~S2JnCcq4z=>XlU2{VPR3)c!kO(SXh5m}_i&RxD`Ojy0+;{16!iU0a? z^IyFClOIHhZ&78cPU|;Z=*INf^ZmEIsBe}ja=%AVzwfjVgP-rI{pe=Ldm_HCt22K7 zhy$uT`jPYKM~RpGATRfWypkWxXRG8by29g6onrN&!4JNF;dmnP^6@8hM13%Mt~{P7 z@u)wX)wwD>-$VWWrPdn!$n$M&2WRk7(MKNhUq1fm8Ly__gKpGezRAa*fyb2nV0Okn<%c{4t*L@dy2v(JGHW=m-0+eEb=D&_$8Q@kEM`e0)It zgipa-{va=F@4x*K+k3hTKb}bXnETg2M?W|cCJ`Z#{d$Df|ezmgxd{{CO%4~`E? z{atDNDe}F#ZbASEU2uFmR)yBA-HPIPqBj1RGCrE|hVf0ttBns*z4h9xV1)dB`*ZJY z$lJI4`Scu@nmVce`^Rx*=w*!!B#kKpoyrnLzAvj6|HE~f&WzQwme+Gf{Yu5oapR#> zFTO0}3;PLAyutD18r0M+y=Y32FYHH&m;9rjo2gMWE@B$-*fgD>ero5pWq8I5;M%BrFx>`K{sfCj+mFeds*U{3o5%i?pTaneN^+bJLm3&Sg`I<~0`33Bpz;1T` zo5=1ZGUzMtYVlF)UlNb;k;fC`qtw6F@93?WSn$5ixHtfgy|^MqeyMjr?fD-3HBp1} z0o0d|w`$K<;_>;)d9~+@eqxxPZ%kkANA3BVMqPylT{`RA9s4DGzT^p-b?)GPR`ee+ zrz5F*;yu@2kncAyO5dLGpBUe6ojWx@C1wU(=%LCtZ!}9kAfu{Q&ilU|L@dr;SJV%I zu?Al5XJA?{MSgj&&Vcn&jcjfTtD4mSZAEXoK)00aUDg$*G|_YC>296!g?_C5Y0TOi zf&<$NUv*OpcdCj;7Lf8mvFwbiWd$d!;-Hd;}Y757spGVBk*QYtc zqCK@iGq53jdM#eO%KWS?y_MtNd{_tlnIF4tzr4x?6+sIl%bqJA=g|q!YDDEn?u;K6=UZ zueMf43_QlOMr3um=d2g)d};+Lp41gIni?GM(C)Yf`2IR2=wdE~^kS9-pvKVkAnaa^bm?RDG9;KyFz<0Czr&e zdqTM%BKo<~KTl{dJBR!@69yNihL9P|Pw;1TKC=DKzsAocjL*5u`%$Y$pFSW2G?UM9 z`L9;*{<2pG2=Dub<1JvjZgA{s;eOrH+PZDL>3p^ZSn}#U(&0lVNOk^z*D9I`a4Jt?Ai~Mlf+r z4LEJm1umZ2#PQWE%jh-U2||5SGp&5SI>fjOgdgX}!=Q;@bUmKN3zeAu_#|r*(Y*=n zXHy;K#RS8YTWOrW`!Q2}b?t1ynduK5eKPZ%$!Hpz9#5K0X8teo`sfFkpXDR&3OD1% z(W!Q=Np+_ZWS&_U(6#69D{w2&PiB0__Ksr7@)PKoBug@DRxmW}%<};w%jxg1`$!u< zxG6js*q#;{v6)Q1n@i$~c7Yr-A1?p9)GndV>^;lC$DHZy|E_T;_0K2*Go}Q?hB7>F zI<$&@_mFtO>FagjXD4&Ia&S#p5Nr<3Pj`mg&l*nOKe~*5dyg5y%YHY6xvk%k{bw4` zn{!IT<9@;LxEjx2c6QK5B+U}8-MAr?)>(_0zFpw!(W0<*ac7vD6v*jYXI0WCbe<~s zvGzU<34kJ(R*E%}OM%cb7`oJL!SQDc>dVi4byC>SyadEQYeU=DnMJy1|0Fs44sy>| zD1D9McoNU}g*Lam!(E2ZX4`cnZ%kEC;x9DVMz@b{Bg|oZtPSxmR`#J-tao2%Hl+$A zo~z6GNoYfKpUNf+=tsUjZ{6A+4upxEpRE^`>&A9mYT%t~4JT3S9qDUU-@NS}M=^xn#EuKyX=hXGfv$rw?W}*H=sED1 z=3?MC%r>E8tp=05uR6eF*QSuxnjg5CHph>6V{YIvALjZug1z=tGOfZJKuBvh zMZOi|Tl?5(u)oOft3iIpO@6<(+V8vHMUCL83BUd<@r8ds#y$Q)lz99-m|L*EeL1xs z1UlU#huH6H)IWBRUw_8mzh9FU8h)P+J8BDeFSh`8@2?l?$3*e#&k~QnPvt!7EAf&a z^e^{=`bvJT6^vK6&wLUp`Nk8PHi}+6{?y+x`6?M!;TYE+k;nN7^1)x%6YJ{3Ao+B0 z5_9wlsojpBpMR>iT5~qEnNYjfJ|St19aOC`UnG?q(}rng@YSawmk%G}c5D85+Sb4? zt{P5q=R6S~-R(iImM97JOV#K2lzk61Hy9uIe6Jv{rx3vIwr!eKkK>zEd!m`f{4YJf zM`-ifjeLo{PfmUBMYqS9faV_WKgz>cn8Em)@AnI*7kwcm?)U<9`z~&eECNX#H*@hh z8e$||Vty(y%c>^F^imt zYea87C2(v(b*{Y?>O9juTV!qEug|c6P3O*w&DJ!grT5TGglI)pvJWNnI>>$P!rBi#cAgH&uMyt{@t1N z;N9kznMaQ_rk0c4;9SN8j(1O)qNfM)G}zv|;q_@sU28Ik)f3rtApjCr4B+^Q$))v+ z*?5Tgw&I}+1SOQsteDY=nwz^r+;RRq-TIj6`m6$8ejm>AtIc5p<@x6GOY29yt7z~q zzmF@Rq&w7Zz>kOjOh~6Qrd~J1$JFwQ*rs+MEO37%Rx+&yQx^B+^5NA}TU~{M{K-1( zNvr$(Ch3{K#90;XA?K0E@oM80uGcB8?@2t4SMu>qZ9P!Ue|lt5&@Eod<)@ne&}~MF z{IklGR_uLUa2oqe@Nn29K3`-Dl}>oU38ru4JA%7EA#b~rZjj4G!GZB3t?_tgqy!m-e}4g2fTR>y?+`KKw>s z$3xk?P;$o8kxaDa`)|zg1**L6+Gwu7pnmhTqr!;hf9ffex-toNRWc=YmbfbFBd?D< zD(EY_{B=Ku<0}pMdZ8nyKZW^0{gDd#N`8<>{Ue3+^$RsbiAO)}njH~@OU_uYB>kTY z56PiveJO0$D*DIxsPRhr`27gy4>%uKSi+VriU@>#PbwV7{-yMN`MRjF%BSNgusNwV#PJDf5r&3#WyyxC4y zW9kfj)sR+NU4w9XW5oh7x#4MYJKh5`^-|KU=5#F3`# zEL3q*CptJaT)b^$1U|DGLg~0)iu@UyRGQhW z=U@EW#SOvi;7dh5q2*~ZY-De(c&RfzU;Uw&c9aoVdRo#`3&d&ex?8D=-A2j64(`>XR#=Yo`P0ZXcaKg+k$ebw`=!3M2H$~Pa^ zaIjgvK%Dp=`G))}mOs5%{%ZNamNL6?9=)NLU{hG6>M5nd#9ROHK#Yoys6nj^TLjMI*61+d(?0#r{} zFS;IX2?>3a^<_Mjc+^+oQU5W$BfO{^r@bFh1R91q_y?wiQq)iB&YyQi|4;sZo=QCG zEAi79KllB0Auc;ko8Ph)wSRM;e5hqhk#}6=$Hiy;=m^cc;g^IOcV}zm_1xdD4TKh6 z!0{OW)77(uN9$&5Hx<1kTAG_eo$4Bj@vnQDDDsm2m7<<>Zv8Z|LR)(SucVKDPBHz5 zfAoo@kA9T&F`n~Sd*fMqAM|yE`^Gm&(W^D69gC+@dy$v&r$Vn};`7@bezSbQ_$%cP z`jL3~_iOa?|H7YL$NYQp@kBp11^F!ZW0u)ckw-t5f7}#G9GR<~#qPyhUH=Y=INpNY z#}Wt@rnFV|n@Gku9~mhzcATYlWXb^))XuV?zHKTZiRzP8f3 zE%_o&xa|v5yM7l#cXUwImw5U574k~@7$0drN$^Ea`Xt4j9y}{%y0G|fPy9kyO7U;ni6Xa~t`&A0IP1-13YOUA7s>IVP& zLRv3vS!liVN_rdUS(ev7$-XyjRruayZqWk{4dL(4d}+N;6UF#?xPMR7kO;fc^b`#v z^_c&QN#D5nRRq(2(JoM^%Xs1 z;`*n2y?S*lfk;PpyLeONIBt41V4TtRH>k@kwBKx7LO1A=%JaB?4Ebt>_K!I@vHc=qpkrbf+_=O4{=Mb9$FRR8fbqREdy8Mo`ooI1HQ>zbFfh*Jrnby%+rNDM`QZ{v6Yp;jlr^>)Wa954qTTFzkDl z%=y9nCs}O&3GQ!^?>||+ED9QJUc>R|e-iT_&Ej+IZg25y;&?d3eoyHW20~CC@4vLl z{v3VqQ0R7fH>cl)?YEhsu;0dfX%wvV-of$G_aGdvA`oA~%lT9m4@4_{;8;|K2&kN6LRVSy(P zuVL}AZoik)w=H;HxF1Hof2QZBE)e;Ee_qYmewe##Ka78&{V-%#XV{XxoYTksEqfLA zx17Dz3Ce^n;rLy{Yw3*!&J>Dy+!ey(-}%3~9}Sk#W~B1TF7Uni0*+VP-?AsK6XaH2 z$ng(H*3vf_FjL6MsjO}B?u~z`U5J-SkbLO&82q|0)t{LK{2^gw=hvkSWb#V8@qu&d=9;TYch$ zIYQ>Xs@n5rsbbzFXE^IthnjvH4+rcQbNmUG53gB1*fIUPJ2OP@c{L!!+65w7$3UkQ zd_GvXo9H8a78~^M$L$rb>ng*=58l)%e>}`h;rUi9e>5zAsx$o!?DubtV(p<_@k``# zNDLeb;PVIf*BR%n7J@U&Yvt!zmRpX3gkwA(Gw-nO9NYhc?IpjjiT;mmVZyXJRA({) zYUlF(YjE^tU9Z!tgb8b^XkXiRq^omolL!3|i!qJIgVE7FTzv5Rg7kfa?Qj40JkGCh z4cW)`pckG`A}@U(k@ITbUuq6GtXn?3gz&8BaUr+kl1zvGZqR+TH;sGj4Mr8Na_c`5 zU%bm{VXF7F%qdBDCf&$r1>^10KXUxz9XE6XyPF9m81K{nv1nVRFI;pge%Q56Bgom! z^FqDnx)J%`G*6kI$?qNLx>L6f7vJ23dRzO!6f@or>JMQ0j~QR)>=JRoODkAax(T&s z`nu9QFX^NI)h8#@=(}|?(SHl3uiMW1@r`Mr8QsxWc*688jEx|-*dbDc1X7QdwLn*s z*WWpzv}WEqBB1|A38lpCe$~NhYZGd+kktWJ;3a+Zv$INDs5Rc&5Kn{tG2V})kG%YS zVbE9Lx0gQvx2)X-Ci63-|qX{>5dKhlRulN zG1V+OO{`fyug-Q=^e^$~e{z+!bZ|jF>_A?@|Mg3Abf2e|HTai*zY8ax5Pq1?pA(fk z>jL-JGQ?9}Pcw6_J4~_T^I6h=&e~h<+I4Zq0&|FB`z6{keNAPam-I2;qQ;G+G2W}$ z7-eLX#q`(ecs~ys=4)!r=wRsY$r~%dt*B^nI!(R5OFZh!@3&X$zt!w=G@U0z8}#M( zv8as?5|8865;CI5TYY=r}lO9*Dnzw?Z_AU8@ou@TxWl5wFC$9sCvbB_90`4yi}Oz3>}>krDDr`gI>`b;~2tg|FiF zzwS5q)}j%toyFg`My?4Sr0fA%kvfAhfw2|X$IantGgIhVgg-i)9s&I zr#+zl^fAoa6oWtXi1$q)Uxe}KN6yb~-bj&;s#Fb7{~O~6>j#mMcH=2Kuj++-e}(!i z$QNaN5c4nR(T@_pb=N0&)qcCdzx=!^@+p&X?)tZXiAO(j9{nis=eK)k5?MUij?%xz zXXHC6_?LK$zkEDLKT7=N_JNw=tbPjmk)Ll>i>Jh+zMNNkUg$^r>zvS<@$&t~$VboM z?~g)WU_APf^XR8vEYD*+UzfgSh`)S)pjy63JnGANwS2~WxM+Rb;OEErL1dpT`yIvp z2DNMiW9IPnYa|}yBj*pF^MJ{-cz#Ohk~+!1e10|Qf(O{d^Y@iWJo=aO_1ds+(erp7 z`)`Yac*^%{oo&?!8preZ8A?3*m-7}`9uP8z=d)*Z)?xk>YgIsAsa|;^^Yeq%XCG+? z+NZ@#AiZHK`Qh9Ous*vIkAC9&&oJoA?<>Rl=}Pt7k=GubB~%a5Xp=$&nEcU(_C7Pk zQ14!;zC6aK605g9g86ylYzlSGZxqW`ZfWqNrZ3fh_pBqp_$(W`efBg%z54@Aj&kc2 zsE_sKJFn1aZMCM*_eLPCb9@s~t9LK)SdYHd0TbxO>d|km{HGqhlD>R@seC+C+g~c} zU&Z~Ua$aryM9ojw>ypqdm*4M)@mGq^HFj^-Y6TwiL8^DZlHHf)eQB52#XOJ>WBQlN zzu@AD`pGUcgw8<&v<{m!U{y6nyx>@set&Jju6qXR0R^YL{O8qhDjRhR@Q_eS~{(g+`eT_+0-c#>LmQu)Vi-@9`s0}bKV4XV z>7X^Gomqc5aqLfj*|Cq0C+g2F7#~K-?r&5ZA5b6rJB~jMT})}2QyazH|LE@+A1R*l z^>5-B^mC#LpP$G}&o`!sK+V{AYjR>5$$F$b-lBhL z{47)4gbrlm=ez$HKL^}Q(oEZvCOjGE_}6~CD$RZ1!VFvP{dKlm==-JEaD0CGCYs(tLty~>UK4!#9x+Wfr+IC> zVO;O`WY@W~T>q8$rk0z9cb{`eWNlNLIH@u1zW0+Nzi9S6P1Lm@VIb4rX~@ws?r?m4dP(7o}l);UbkzvqaQ z@n0r3rfSdYzv8df-nJL#7}~2VQk{M*w}Sj%?L{8jD?k6G)?T&vs6F55x7O&Se3RGX zR(rmZzS8qjYA?p8wswu7y~$xtV%&UZ@Sd&SAMtr*B`-6ySH8Zg7Ju}k6d$$rqW*cN zkN&OSo)?|2TEWd6Pt|;o^pP+8yp-CD`H%jQuejzRsamW!;Cb`^>W@-;i=Mwrgykh+ zke7NsV}HbW;`rm&!HLXT;0(nJ;;EF+{}q2F|Nk}qDD_7i52bwWytoFmPhLr)SiMNK z{E^~=`7Cd*+VevFAeR4481Gok0V?fSMYerzsM;STeWmy-wO6e^pvkb}@Qt14EW93q z^`Uwe)CZKGH+SD!6f!26aXjivyu6+u>MQY5Jw&YcS6ILHJ`+w~s`rQW6Xo>~%U>{s zwJG1Z_XYZ~SEwh5ewK#u`>BvW!Ri~LA9;O4ep2YUq`pKmU! zr-}73<@Gc%f0Xh~t)9-3k2&N}o@EcebEDi|vdMn)m%MvCF+gkbmUC*JnW<>-Atg zqlwen&=W)UlhtvbMD%l6fxpdosa}swo+Tar@nz-!u?uTAsk6r&ETK60fAY&~Bgp6Cbb0bxBFk5!ShS;?AWgAW-7 zeI?%FS(Hwyzmr$IA&uBrhqkRXhYV%$`Pz}s2ete;MjYYeFP>MchqZdQH>|qm#`Q<^ zuhiZ#gFIn=*SZ{!`p9GbEO|YwevDVrM;_a2etD<{*WYkW5dXjZ#Q`QN_$gaZe+TPN zvF|%n`o2@mq$E6d<=czAtX|c>>yyYgug2G_!hCLCP(Mqa|HaK4L!+_E`qY zkLNw{yq^5Lrz2?$0a<6b@e_Ha^QUi05tzA{zdsgvJik`bQ>z_*t3P$p?aH`c>ZUk# zS)i&PJP#`tIuDzF6JQryQuK3$oqsHR-gfLN0d(2?`Ud)m+g3v#d#Qf0y4C%hxRmL;uIKmn zs-3?sWfK6km-9THXY8M_)Zjng)cC+Zy#~?#ZBL7yW`Urc#MfWI^R`6_&Ueet+p6hX z4}1;Y%s<8_GO8rB4<>Yx>p3x2#Xp`W?Oza2vtKeZWA6>PSU!u`|01$Ey>vD%|@E`A3YmirfAdf99^G zB7b~TU;5B(yMdSAhm8E-qIR6VYpd?G{O%0~Ka+0-(}#^p8{T*5r+lbA$D{rurvHff zm+K?{U;5}@u8)3{^rd=64-3^ZN`BFkba}|u>kECqPG$9*A{6R3{hU9XY>U%yynVn; zP4L^XLi1ZK1$n(E`@JJc$C~{4Q>p&c_CociJU&b%C+70{_gpS$bnD{{`ttoMf@Lgm ztikK6)z8|yJB~zt`fyPhL19=?)1?9B5W>RzX4bg$?D56*j07NN21inYJ4gNn?okJc@a)i`JUesz@Drt9z zzweIuf!@r|9Hwt^_Z(?Fu?K8Ank?=!-A8F=1D zN>+aJ5*GyNG~c>cny3Yt}$P8#&(`5DOcb9&X~^yj*nX@W9N2oD{- zg$fpt5JMBll4XhFX%iNoFrHU?zWWD#AXlusIDNJJN&5PTTztd(U-r9#E^5Rd|MLBu z!$*D~2j=j8$T@pm!nRC9{){Z{Np1Iz^smy>gVKo~$eom`oS*c*vuXXA8i+YioQi8MlN($4`-(qYnhg^t{oxmVI7fEQ25=u!oZ2rvPI8v=e5rZ%nwU$6 z4e^)npIkR3m6XxgaDJwBw$;q=TrLz{=_AO$C${^spXjDt;qF6F8z25j+DY2o;(4jR z2e9!_-rucf?;r_vzH<75p3K%vjNV}I?fa9fnYf)&tdgYZvh6VBY)?(ui@lZ{+H=pH$e7(A5(~G43c>aDr98ZEQP8#xO zq-&J}A2-@U_=^_wNy&5M;{q4X59((yeattxelMR3WW$7d96x;PF#7oNVFT~vZA}-n z%kytpstq0Gc$r*@v*Y+jY|bv}%hzKM-8n^0P2%+1W*2c zdwkzf_P)dMSw5abGT#2eXfA*5sJtJmSneQetBvLO8U^p`Urb;AzMedr^_Sz-I3C~c z9oYLF^I6U}ez2WP`Ns3H`+I4^6YdH{&ctiyn|OkAtu(T|tv&4d46w+bufK-;a;J+z zSl`&c?xRQ>-W=8|@O6Vh6TI-Y5Opn1E5BbN-AVx0dR@5pFY>95mxcFTW@^J(y{c}` zX+#rb4;zA65f%mh+LJZ98P#Hia;)B*b)SZGv4ze*%EA+hT`?!O+w%Jx2R(?@MY8=- zIDOS8!T-qcE_B?oR>X5Z&-adr(Jd-=PQdziDQ5NP zwaQ_nxxE({-!vx;fAIBpkYCJr)NixFl^*Edk36sHO52ocMTQjN>*<&UR?~f9_l=;w z{QFMN+va51e7?R?F~)ypd@rUSJnV+}DbE@n*LS7GU$-O^(s(|gS1R?M^1$FHR39e3 zwseD{ja=!}S1pP4r$Fv`A@9R@^pn@8r#QsA9u#BsF(dDolMXj{KCFGZrs&BVLKVhG zE?-IJv2Q9P+4q!J56p?nC{Iqm7vqf?kMVhPZ5jz*Tm)|4>p%(fGoU-q@A+jc6lrqK zpfCSEW%AgZ46NqN=}SE7%f|=Q?^c%Q8@BQnF7MwY*f9U{??FSJnUjOVs&e`s1w87@ zzwcl?=d(Mb3(x0EUTrOGn7YuQpYpZ=44z<5ma_Pae{N1z+LY&bivk|&OUmm*;q#5F z!SnUX1qm}Iv$4!h6rA9kN%>@P6>V9i{tx&MoT*wfpk-|KR;CGXCHDf~+!H zD)Oj5bV82ccrRY-(YpxUHxJ;s$sL0Fbwc_3f7I@)LH)xD_xYf{bYG49{ub0%;!!`U zz)wowA`mqnV9U?j1of5tL>`&WE+bD68ngPsHKvuNTdmuH*vnYlnKYI7i37R(S@CI> zZbIxL;WvA~2981(r1OPJgYCfci((X>1c22c;5v|?Y9*B zR$4=@RUXRetJUMKTr`8cUpB<|4KlLjIF849>sZeh>#@q~ts_6yWg^Gp zdNS6-?aJ~^UJuu(QEPJJI=??0^|2l?)`z{r?h9=;I$PYu#{yojF=|1c}EnMglsx@Zs z-?nL+$-$R)w5Qc&(#6z;(>FeS^k3epm?tzz-AvqG*wNahFDmk=?;CtppeIAM4>o@h zE4OP1L0yU&^yjYR$6M6*Dd3l-eId<*8bV0-Vg`LB9`%PEdnBY*n5zxa7NK9Owu80v z5()ZuI#Ev1e-z`_Grp&`2#m972N5e0NipVMiC3#9-ZgR+dA-4y(^vcbl38szxtzv- z?^gT$QnlA|vW}fCD*V1st5?1!U=_JGm)BSGQzRvcth{H+=?`S}%AsI9k=H9Xv0G2X zS>_zC_It2a*@a|VwNf09zc-x~es7)}5KGDw<@q9Qv*6T}1ffUHIF0d}zGUj4(ct#R zT{NDaNH#|B>xVA3S#YAqTw#rE1CXEJgsO?e>AnN!N3DLkOUP!jtsDP+AM2s#DAcbX z(rG*Cr||tZd(Se>f>k30V~Z+c*1)o`@qRlv{QizVow$XJ{aB0h6Og}HQ*6Xo;bb`% z7{Si5Cz!N{tdf_+AO4$3&BJ(BaSHqQ=MT^03}EBGKYLz{3XT6S-t|>{UPX6j(Mqui zLWe8kG!w3bi8^sKY@gmxOfNT$yikZ|r3qOyB4V!4ip4YTt*_WI!VY}zYU$qSX(Uo1 zo;9~6>(;LrDV$^Ny*8-~Jw2;EG`?}$|59jYV)mJDFTP(YD7;^0F6v6O>^{W8?Zx-Y zLl*zCjZTR_>-VAO2j-CQ*f*K2wzeldZ}H#L4}D&$a~(QXsAuH@ZY+*vOxuHbu}k9E z>s^U!CLd3=dX8DCEl6~KBhHUh4-xA>%Iha?Xjq2S@5l3~|M9r1{@T^&f7NH~yt@VY zyhG3Zp2d29^t8MF2IJ-WgTu;@q;|@DI@{lJo$;2Fd}!_|K{ONVLV!?)JYSo^>7$zxkK`&ZcF^*UFnXeXL*Ef$_~5FV|m^ z-hw1m<$3fITu>iezFuUO(SjtK^7o}DBXzE)DQ(Er&>wI@)+l8djmP4HXon~jiJgK~JZv6hg_#;6J$n5(!n%KlA-IHDmf`nZBHlu$-i*uja>g)t&<4-OMR}y)D@;IQet_vy zZoNgVUYmyTIm7w&Kmmh{c%KjA(mDh(_P2oG&c!(1f9Q1Gl&ERKEvA3ucXb-Mu&Ma0ga(!+w1SUO z{QRWSp&I(-`T++2$5$>OJsX6>7LU_J&42M}_IkJE9tJ@-G;_k@0@JhiMD*^L_bx z_xVw_LcpQ~gMayb7w$#ND(Z(0w-TC>M1e4U`F%bI=URf2KHm2$#Z!KNtXe#gm!6mW zepj{UrFMVpfANwZ`TewNey(~u>DM3IA*^dOLObhH6y204W`1_uBVL(QhRkS3xcQ9Q z{j^_MzSV5a=Ns~pA9;MVFFQc}TYSD^sSI*`tsj9^Ajt;U=@9g zXG)=Xu03uIA4B;4eyc{+6ow@J(a#!N26hn}C^4Z7?3msgT;l6+{So~u`9Z$!CVsx8 z7N5~$A{6=6%+CglKWne|T1OadGl!I5^@EUC@?+KSr!Hcewc$RZq?dVOPV7C=mfbg1 zLFN82iO2hPezvfZ!tNhah|hJ8y}E>3SqA;duGOgRY)`T2lcuWo z5nV0dG5!&4#?ttXGep#1rgHySiNqB;8&69e-bbhR-Ko*(dcTvzWBi}*Y);b3MAPoNR(@*t zM@<-Fu5;Y|fuf&vxkp9w>4Ob^)b1;jczj;QXJW-^q$Zut&OfT%KQ`fLUmAFg=rEr0 z^=-BL2_+umS+Q*yI`*GSVzd9a|In(QCB40Vr0)MC?JJwvV__4k5InvRO-c5D9EFao_zf4NU=J84o(kNLz{K5(Tw97dDe)ayrj=%Bfm(xw& z+Q);w+JtOAVm$EwTBa%184bLZFOWYG@cRLe{P;gS_dtFbe%6!yx_&m_ zAmTH3=kqONduQA5)nI?)g|{0$2KoO{j|hJN@DD2;RQB9$Y-aP1AwFO0PeT0$-lm=6 zpQuNMNBybChMI>)r1yV&tvpRv(4Qi{N5daHKj<;=9iVP{#-YKeLz3kobGYVoJF1$dc1Bfs-d z-v5!`#bKZB50!d9A(?Ww*T)y~=NlmQX9JJ=jrTIhFT~sQ+mA=&7wO4z+C^Dk;U{McX9*%4IN+eEys^~s0|;t&5<6S=T0m>p%nF`7vRzU1p_ptXu4JyAJh^hw(Nra zMx8(7alRfwX5e=Rd||-Ddrx{htitYK(Z%DGdtiSJ?777|R7;FavgfCk{C+;_G4Si5znWDD z)jj|o^@#AOr=MvLoR5T?!QWKF-_ZU8mhk&U2LIlvP0g{;-bB#jFwb2@{&aWv{Ws)C zJ&3Oe?OhFe`o+4d$S=Y>gMLE~o39M{MS6_grj8*+|1h61@TiAf56b2zh91PT>kHZZ1n;*P z_ifnwEjdTmqTi|nz_)dT{(Z$h!ShYoeH+Ag%;GP^-~Ye*T)*pi{d2sAlwVY@3h^@j zwSszN&DPYUpW=A^#{3QYi=7|J@oo(9^MCffmMs7C_Q6?9KYX5Q=|GP^jkL|6ps0OK0vy_&jub(Dc z-)(z8*wnS^GkrbPW_D>ci>s#=3gbmze+lxP8h9M=5z{l1`7egE}oFZyUO6+5Zr44LsVD zo$txwE#BW_;>quNf7u~EJQc(%#2fL1t@nrcfr5A?yMH(W>H&%3q3k{(;${3yy!u@a zasTR?^r0YL)jL(+nt9ngW&Bt_GyC4e?NTwi`}s$1euel%hgQpL56L@b zL_!w8mn+SmAFV%G*IMWMG@ZXd{J8mm~~T>3824)_awCpDL|(r25CnF#QdX9H?ocfyc_Um zST{-ibg%&ZcVG}*3wRMfwl|+Z&oHN=v_nJwzS(FSe?dF`jL}8thr7If%;$#r(8@tR zy(;yHRv@JteU>ds4Ork#Z`91fwHNWT0DrcF$;{?Ydo~a5^nc{nce4C!shSt0)hF}s zml0ptmQRw+UzaVSFtt1q^G}6*bd4b&W?x0oHoA^bPkZI1Cw4*ZiU~YF>K_I69|!%# zzJKwXRz&Czh&S>dmVX+kbt~6bJ$R&$*7To3G&GH~&^|qF`43+=R zecDl*vTd>2_x1v{#h3hau4H`u06h99d!8P#F&|wn@PG8rpEmwutzy*NZDQ0~(>rN{ z059V&w#7@=^Ej%W780;YeV^@v`t)T^x+AT4yn6t?E{ylhDY|Nd(;QVFJa31FTmSamHAKq)9q^x$@W1zG5HI6LJr{2@G<$;n1)#qe>=!+a9V+B+1^S%eD6xSZW`=&&A--P@T0{mR1o^|u7 z_Y~KUsmGVnE^mF7FkpY6hWr(e)Z_T)+3=Hrztp%=+N=}L687v5)cHmDsr8#$%Z@9f zA)d`YiF)$SZp`sdx8ZR;xNfJHHUiEJj@I_m^@#A_&epS9HrKPDe)jwn^-mq%oa6s) z!=s-3t8;04s&7$0LHpYXc6!kQ1+==6lw&BsA+5DxtKM3$a^s%MFlayA}^Q~q& zZDZm?_3MiyJr&)%bNq<+20Zcy)k&uXe|xC@eBrCxzk~q)WlCYo)4T<&Xn*_ha@Kti z$G?8$D$Den`E)(i3iMV>t}Lo0+Uy^dhkp-+{Lg@2G`?i~Q-L4#v*)L19})k}@LpO> zh6M`pv-wNW{^9GfHd*rhHv^CUImY6m{`%}mT?_l`_7UO#1^o>M&eH3VvF}e&&#h?w zKEHuSJ?#5d)FZ+d>NeAI!a7>7hqb>!EA=)hLhqP^bUi_r+&TU3fIkj+^tbAHx~cJQ zg=vOLK{Rje1A!uZMev7-x5nu8dhFZlwv5kThyF7O@TlK2@kzpsQRS#Lzn?z7MEF+| z^H^J&2J7}=-@l`MLdKNl^uM;@QNPcEd+Ok{X{g~pB0P@AlZ%?@`q}k6@|&Z)IR36S zJo2;mdC>k11o#c@eXWlNm(tstFO92qGvj8mK1-0^-U>DN{n(9we*$cGO?vb0tpyavL7)zj&Ufrk?r`{KYoDMEFqjd-K3lYBNx}F+d@SH` zd@1cbNF~T8TzNuL{1@SG-fgEC-$(ZSEb1?^oBuuL!YmC zLT=?svcCvFz@vhK{)YUn3At#4MN7z+y1{yUc;mzSr-4WQC?{8XFw16A%{j@RMfl=% z%P0q6d?9~@;YH~r*NJ2;8X@Th-%v2J8!fx zVe{Lgp7MhEGveRa=I8AB2=a^Y*xnZ~e?Wh*$1f4gPY`d+H|+In5#S3tEi)PO4g2|z z>2@D3eipXjvAv$fdXpY2ifWiY9KXLJ{7&%CI=1;+#yaWfDwvNsy!6%aEwl6UH}p@$ zqy5?QEc7=KzH2up!-h4=dX%$ws% z(bwyqB^BFVO!*{2grkh(87V<@Y{I7-?I7iTGvp^$N}*bZJ?> zzM+A~`i5-%KEzwz@%0DaculpKzi&6ah5CJL{nG=Pf`t4A9{ErEH`TU`oIC^@esmhkgB;Zf)hl@b$&*n2ee1>{lPtHNp4ahvM*mVD-*BW0Q+a8<8{H!9ch=zeA8ngVM?bxy&Q2__Ym`PzA-WZSh0MCx!DG9GhR3H96=gYx4tp_G#u$l@NF)v&EO08MU zR~xe^HM}`|OVUo~>z!@&4Y3AHT4O={oG3SKTf$?tPyNDL!I{5E)!kP)JrjObvyLwu zW5NDq>!Z!?{ey&gUg7YiOO4dWFYS(pJ;%NA;8v zsdp%|^R*^#CO%Z}-)y0o7u2L)Pj+zlXRbR;-TT#1O8Op9uBs-|)~%m*L~BLHEUYKQ ze=N1wbSk`x&d=79IzPT9Ju+_#&!26DY4s_SQUdr3^!21uug+3Ww(_LNALF)}!*}pq zZn*~U-%-!`fr09P&GD+aK?FUtvL0Q!wH}AhQR1=X@hn$mF4UvB4E0jhoH(ggSrVwd z-&B)^7xCoqwJzPWba%+1OnrV>*}0`8&5}E{mT6ZSdZ*wP5pIl3{Tuu0FnhgAGdy#)kT^^rvR0iv(wN{;JigD%4Au;=KR*TVQ-Ukf?e2LKTw0f<^J|CDE955k zUVdmyX6tOgqdjBqm7#TKWKGDqucDT5V@+DW29K`|{I&h_=={Tr!yAOS8kU*|N<1AaE1ocyOI-F=bAUw24lEfBOw!SC1RFDbPyZ?~y0-c;Al zYeBTvgzgG62*C*;TW8hT=p^Y;Ep#38XOH(n5Lj4yWn*<}^@e+qv5o(6yW z_8-QVVb9kYe3JRIrAQsx>qu&0{4wmw_V3m%wW%q!17{zD-+sIxzX*^1iTp1?59^=E zFVchdH}I_gS6Et?wl2%-H}Duw*zt&XhsxhM`^)steO%{{czb&yUZiJ=+cb+)?+c1w z_CT!v`#b;M&2(|WnX7-}zK`sDo5fd&O+}hE;qhgyo3-3QnJw{-g-qr{-dav4A59&( zE_hY;g(P|czaAW!Zie;?>hEl*5p5chtE7fwAVmX8yR6(va#pX+tsfDO{Hp+8sZ}QJ zdRS)77wQ}!zX*?dkRSDo4owjxz}>-KwFlf6e6xU)F@7Tbu^ zW8l@Bn-#WR&$F~*{DBhpb$-ON{&N-ZlOFQqV^hi)PL%&D|Lgq&UqW<)MV{7^dP=R(0p>Pa2y$YuB|3(FWR$H zrll79_WsHKh_|=@w?Ek5!2hlNMSA{Ze*^!w_BZsf_LS*I`^)%6{e|{7`2WWK3wr0Z zb`4pln4`*>*PA@FurM@ap<1=5CEkX{~*6568h_{N$vJ%QKVX5A-i;Ex&${Qm|5CbLeCj zTCPGxZPz}PjHnVtH+`PW;d7;Ru}hAgvu95_eWS1hl2-r8R3#0M?3B|dl6s6e=jbYL5YZ*h8oWnRO%iW}&; z(snJ$ak7zCyZ=LSu5lFITNP^9*xmmrTZdS(XN%GG=jiT7hP|n$waS~BUJH$)x1RF( z0|#chq`k5EbHMUuq)1GEEziedr0C2D>fvyhL z`SG}*O(@0uexDxQNj82r%m|}RS6$%vYvtddVvK3@KIe0Bb^)r97WO}ES?T82>Ce>rdej?iA@S6nVC zgNH||1H=8bHrG99+J}v4@#}p2IRWiOJnl!Wtd^Eeeq2WjDKVa4JeiY`Z?Dn6$j|0` zJoB@;p0ipQ@N}&AzlUDy{bHFT$QFcyHG6@lZkG7--N!&&Bv?YA`~nVN z{-Be!ka>bq+9|!cXTQS^Ib{X=9RRLc?#0S^Lo&V>-hMF@#-zatJ@_rn~x2x zrZ$UiqivdbgIF8&q+#c_a(Y_X;#J*s+09EDk4re(d$^XR<-WiPS^Cl$2l;rF5#nb~ zh@YtEardIcyv19KnOmObo7;mf^yA~FlKGN`{yYi#cV?bzeyz)N*Q#u^=>8^(SEV2x ze#{!9f3MkmIMx{vwC;O89@Yi>R08{;KmQw*ik7)qMY|2(BlMs3OL+VI1MM9E@frP% zy)S|IV>S8q&aml0e)c{#;zfFLfu1&?XE4k+LLD6FitQ~li(hKrlMtUPui^C!0X^eD z&rrbEczb|69hH>NX9={|HH6nATkkiTUYiEhczf;w{vW`P`7`bLQ^)dn zgCFxH#+UHX+Alqx5a!}dQU9dqikyDrNBxK|GxDc;F6yV6AM%@_ei7dN=Q~T~G=9pg z*$2(lDwd&{k7U)Tx2xgpEjb&9 zDfjL4G>8on@*DW(&|X%5JHU(VW8iOqKdgh=7sNVME%2)!MShV#+z0*WKQ{mT{eB$v zi}j*|QfcTE;200pP_@e%n`}lmD$UiD}n}Yms^hhkficzpBMgASl z_wG`9`FCQKt>|ey!+qzBfFLr+t{qy)JzP+eN)W0~s{?xyy|0MM9Lg?EB z7&AD&Wc`KyV2{W4iu}RoFKlmuS6Ny)`WLBgYpc;5iyeduoSc+b#yA2;5Y#rx4QS;YP(v(L8@ ze0$L!5MS7?e~&K;pd}>Z5%t*n8}`@hP+kx67rU`nA78A$q5b2mJRbY&L6?1s2Hzug zd|ij}RdXbdNBfKPp#5d`5!oO6S7v{-kNx+e47|}2+0)QtAD?~u`bq8M0rp8;>uqM^ zXD1JTp?%Pv{TA-h{fGTNqJ7c^i2V)6m;Lt${YU1XBL7GK6!|~K2eglUJpcaCPwGE1 zdy2*{w$}s3ul@HI?Xyraenss?`-|eqxQee#(NO;)+OGbEto}k`p_is6P>%rTt8D!O zS$_Mol~XE(AV2&*m>;tBGGz4{mOag;EQEaci2s{<8Mmt5G&w>3_Dqo9o_#MYt4FZW z#uTW#)Sb2H9jO$T&Dv(kmIUX#s->-61himMW> z+lPHGDVuK}d=h5*;5_>5ZA)22nu@g)Uk4#lGz;7M?Q(ZFp zC;4(fKL0;z<7d_{Fo$$-kgZ<~{#aNavHALB>nTJ3zyG(M`pqv|e^Hx$od4VNi{}5! z-WOGlg@oz$Y*NC99#@Yi_`~{T%l%?P`^>#uTxox`v)*6Lps)5rpQTIxg5=mxLb!f0 z__4h^Mt7q`v+jO|_g z_JDdB=Kp9P^kh0Beq0RUw?hnZ9 zACzs3g8jwTYmn_P8TuCj-d?|me{{N6rURfK+gtyEzMiGEZ2KFc_8Rub{$kfhxZfh; zZ~8Tt(iFxo>SyNHCvB!({TMRvDe|tS5{pg<^7ADo-*$aKu8@(?deZiQ&$WrqS8VXlF0)w~G;J{Lxv@HFoo8V1z+H1L-AN3C{ zUPR|V1NLckX*&t~gMAD<^3N?hgck2#M6GPTE^Y5!C$sfyqq)kJ6XlcTw>es|0&Q@S zUtb`8z~OmHjw#;edpS~QL$kHe03%{pYac; z>h@vZue}N{C$!JW4Y{>cv#Bxy=2vVzFV~e{iTa*@UpDt;PHkllKV`1nes!DmUrE!) ze7!K2lB=}^#}(xkj7PTqSJlFw$+zu1|0-9DX8jVN+yp$kzg;8Z6B!xJ^Jj_6VY&ID zw$9JiI}7Uco-FCh*OPs{&eQVqbyXeD?$6K6@{aU#=k*K7dQD!w7vnQ!9i!vf`5xjctl;y9ZvZ`KdX3WY zok7pC8I{#HHa%BbeBt7i0`~cQaFVW{tyhKiIkk*G??(HKJup@0XXle>pCUEibNur* z=GNZ!o~io}Ti@!#imznG3jTawDY05x*?5L>8|=f@pF)4gRhX||gZ_|(Mk}~~&d#5U zfj^{g%b%wgf1Oj?uw{3HK$)z&#p5`B%hn5fY>rZk1sd}NeNd~je2%h zKo9HBE<1ma>bZHm?0n~Gr9|?)A@85Y`3s&OvHqX;(|2+xk>`I0^~f4Py+7Q~XZ^q7 zi!a3MpG2;`c)o_`1<23(|KQ1=N$PRDf6D3=?z#Vw z|3v!S<7pHw0SWMM;I zkE~uK#y63F;(5mtnC~G!J0GSJ|1s)IVtd*3a#4vtr|z`F@&xAR=s)cIT;|VMkMAU` zud%<_^|fsL;(5?ynE&8-Vdp=x@hhueiSbPoPcA}y%Lwrb+xs{13h{WpW`F)Ai-)ME zjIG`!TMtndZ_z#t!T-@dY`sER{Fj}V$>M){s8?7P>J_4Yvh@mO-!J3567{g>YuLY{ z@0YB8qU`%CJCBone`WqG+pjSE6Wh!BC!V*8_8-umQw07dJAcIQBl-{e1M5Gs{S5;j z4(kPs!MFy-KM^llj~IC7Joh(Vw4O4?3$90!t*8EQ-iqzLYQJ6syy!gLh;Qf*Ym+u|YneV5&5!0)LMpV{xb?7oEI&$wP@ z*T3k`BK>%N{Tkvw`UAV(mz`f1g8L7MM}BsH1NDgb(f(~<{fqWt>rLQ#R%9Q%FA)s; zA&5si8vZZa55e|61$&}@vhBtF84>?_m=DYYe@6af`)`u{2kbB8$NLrR{)udV1M&F1 zL;Kj{MfO<-dgg*2w70ORqrY(cy0-V$W@oen_sHlYz5ip_6XPd4f0pe(82o4-dw&qM_vgpG zB=3rKipPM*$?m@e)jdmwU#rf|R}H-Hh_lMqphv;`W~b4528GfRX|46tXSog8=`8 z=Rcl#)$jJQ`0k*mq6g2<+Q$}8H2ibNQ6F00D?g`))t@tb!`_=-xwPAt>uAw+E6}0y z`23cv9(#U=wLG5fUwi%wW?m0#f0jRSW&kaJCO4=51!I4f|5F-YI{zB42kk!^{4)jk z!^cKx0&mAw(it{H*`5_~1(Zbi_qozpTBZVDIYFDZYQ%@xr$E7PR+7 z%K}_`WqL+r@~2Zq@c8wfq5Auyh-1F`_oczh17t6pdkpJeoX!}zfm?r>XQtNguiE3M z0e)bW8A5#Dtroc3o}9mDhY~_O>XG3^dJMep8E;*Gp;rgUbg02uzEUZve&iS7W%}{H zZm&AY`3rlMmg<+`W%_@{S@ri{*uT%g_8ngwQ0q4;Db+8-%k;DDHTcm!BD}plS-ea? z+h3DFKZQQP{uSZTe`I)(9>lZlHTcm!B0TDs;YE7zJoiFsKmGh7+5KDf35oum!1?p# zE+qn~l7eB+$%sc~hW;15@@YRof2!Jd$+7P5Ny+9s zUe;d3ufKAJvyZI3s3(uc<7MZw(GvS3{s!#-pgr01Q^bqxiT43=)``&jt7Mw20yz#lKF$|zRI8cQ=|v&De7O@ z{S8@v8Ryq%A6CE2o;ZGu`#J1>_@DYq6eW!nLTCxkNhX#yb0~|H}MnOI|uILA^vaTC$?9!@w4$q z)?U*Wctw`jPo+~yhApAW$l&ugG`Ui|IvSp^F#}b_bai})fjL2c$b|=%k<0q zN2XuqpR(~KJ5QI5UztD1_+|be(=R&@mDxvjo-5NI-Qt|(B*Y*5KK@Po!Tr_J@IDCf ze-lq+=N&Trvhx&~{=GTg{nr0C@dw|#8T$Vw{>a)Zi$5}Z%EoV>Np99rFuz56Htb!T zuI`uHgv|c3^J1C(W&5!*{&%o{i}%e?KfB*6(~tI< z1NVUue{f?-I?20$w!Yy-eZ3}{AEN#)aNl@4+=scobUFzv(^@;>D~~_Mc>(g<$A8iK z3;hk_Gvfay{-eK%&KG3yAN|MR|C{(PJ0FzUU&b$sS2Fv^`b&0RFY_N+{}zJvX_xE# zdQ;~A-_E`v0|)TyUzxul{)d(4myJi%ld&bwFS{Qiv%f6<$m}VLZ?f;N>^_Xl{xW~g z((*a6^x@kp^XJj~pOB>jyzIOW@t2^+r2YPRnCE-TzwkZ+$1l77%Czno*_)NeU-a{^ zt~j_!Syr)+dHmTP+L~xJ;ZxCV>h7oYg3s(J#qobWOclJZ_+*w(vU-T$+7a5fSbJ_i zw&xQ6-}s^Mj{WVm@-$sRe>&<=5N#mA;wSCR;e&cq*e{p!`*9P#W8yz_Qub>C< z9)M@-Ctd+PAp$(=Ndxx}Q9tfC8ujVw1Am#Bd_4$kFWy%~JXir>qp6^{aenUUv*?OJG|6lNb z>R*wb|JA?cnwQu0V;j&$vi?Q=qo9Aw0-mk6DC=LtKe4@R{l~+9=r8o=K7eQQ&C2|t z7ubIw+`nb|7i=!?Uzz{^slV`kFY>eXG-du^wAX$-%KG=paDS!M>50nZ;lAch%ZpQY z&jMPK)bj{TH?7_%8z9;72>Q@d(lu%=grgUxYXE!`s(ukkv0R@S=JUqIw5LzIWvB*C;E^ zRQx;{(!p25dJsV!`20K*ZTaDmpUn@i*J}{qCzOuR^Z#Q$($M$YRgaT(X__kUNUzh^ zNl;Hd|390*ls!+sY`H}ahVc3SZ*H4RM?(I8U*LB(O(c8gLmdvd|6erh7SYH*%&eheAyPevztpCq`AQZ?x^74BURMhY67PV=H8XD?9=p@FYeUQJ_Zb#ZCu7Aro&;#2fZ$`_@r&TlEil5L81$`^fM{|6a}Fs4am0 zeP#6TPBFjXKPkc;wX)zpiw*zj!TU4nG5o)Q*+~lp|37rl=Kp`dqd(Nx?WolTf5@1} z<_{7*hW|UKanvHf|6kkuKiZWaFNQsFe0i5~(wvX1R^Qmhmk2ML56Ir*AYL@zkiD-l z`0eLcviC}e$N4$V_t^QH?7b4=jrk-yUzNRAGVu2EbJ=?$Ly!G>LH0ff@uK;;>^;@{k+F$(=yB&&8|_hnLO{TuFkH@(M7Emxx?eDRXk6ZYKdLQi`h zR10ptOj;l2-)kK2kkazB>tvnZJ?k;GOMVlL+MPyo?R=SBd&IxL%QJC4HTd@|z7{<9 zP8YhQOcMW&b^Lo1?)Jhm%Eks;lfA!qGdT@inJ`C{LfS;{Dj{GA0ozp?qv2ec^^|SByk$>R6aU8#aNB!*l z1o=hyDxjx*uJJlQTb~#Cmo}Kn@uPmkBR^aJ7x_hawC9nQvvq!UK8gI-9?s_Y4Lr^_ z*!ok*FT#iA&TMToD^}+>-@d7S9Xf?v-QS!dzehhlpJX!|9`(PtcT=4ZIfe8*&|L3d z5q|OV^wzNK8-(pGerXw}AMv4p-vIq(Z%+~aQJ0?B{cL?|)bBfEHOHT;YZ4yy zv-O?PJ|cV|%n#dlj??w9`yt5hzH=SN-?H%`T@UiJ_34m*%4Pn38uIrBe)MN{J&Sk| z|3Di*`ZHTE74?YtJDp!ZH(Z^nY-r+2t95cFk;@|JK{!l4&6sg*#m^Qp~Qv4L*k7U1Tx-h+{vI+bF=X=Kf z81knL7|+@N5a7=N9`z&M*pEVg6XBbdTwy}}$X~5MZ?)vgq8ipWM}9}AX&gV|4gGAr zd*m14Pe+8A4EvXE>*gO<^r*U|OIMx$m5E=!8+g>8Wp|l@ULq+vJ^Q_>aB)MS2W8 z^4r^AgkJ^q4cEc<9sBoh>~G-FK7V8XS1s0BWcC;NgMml=_Wm!zx2%58g7*Jg|2Oa= z`-}YlPxBekcsKB(`H~193Exv$|BA-Dffx0!2>)?})r8+i#M^)GMBfXKkx6*eZ~r|N z;c>l*-$%sTe;a8S{K`==rk6oBvfA!&Xk!sGYoD9jI$pWP2c{ksM8Lj#ZeZ2eHwFTyX6tf1h075VM$6D646 z8hEt7y?sRZioO*Ue1C`i%hsDl{Y?b(bHw9(9_P1gJv-Dd!W-XfBm3_RM$ z{`)S%F9Z8DgY^i0UnW#3PH%+vQ+GY{)xTf)1nZX-fXDR?+9!SG;`C?xe(JAhN#A!7 z-fMYkYmZgil_up%C97Z4FJ(nqZgDeie+=Onj^-$T4e&(S51EU2e*$KuKM6DoUE5b_iCs*Z1*r2lvRs1|wrr1vnRF}`F#P;&R1pqWrFr1 zzUr(>f2H5BPZhvJ|Nc+=7Vf3%6(Mn5wk*J-zQc*U6h`$t8o5r;HTVl zOZJ{|vyzHdugBwqa^|xX_>rI>zHOZW+T?~~bQ@U!U-fJyj^Dud1U)Q16!e@q!{b-p z&15q8o7EXW&)N8iDHRPXQ;p+Ce16b_{4D<9$)ZAh)Q>c#3}BzBpr6fWRS)>XH&o{M z5uXn5$j{=DUxdf|3E3;`P+qSXo9sPo&T3o*eLUqch5N zBX_GbzvS`Gz<;#-zskvs;pTIzI?@^*x5!?)gl;&B-|=rN(@Njn|ss~C53(>qi{{?1K)asG_eMEi{9{V@Cc${vZ zSkRvc+8yR4*=OJ>e!mO(4SYq=zZ$gni%qhR2#@ypRdKg64(ziP>^~iBUkUyW+GlYk zet!)44g7epe~V~$wY1GXBK&#B#ikDlSCyd^JDKAYev$B+6EU*<=rWcS$+Um!2v-tbaWb^Qm5 zv`rTO{{{U|vQOdoQU52<|4E?#Tb79&9{I7o`+=XWr-SWHpF_-#_7~Yx#BVA*LT@kP z+4Tap_tZw-{)qRh$m<_*B_$Q%7u=s<@(29!*fz=ZBi?rauYVrk(f-E(&z`@a9uZ#V zZ)pE_yZQaqi_pKQr!4d@>(8i1)W02WZ8CiX`xj~6F=nSPI- zpWyrl@i_m{mbTRnyS-8^@V#hpZy@NTb9PgX+)}zI2@e1)l8t& zHy^KL@$Gx+U*u2tqcFbM{S(B0dC1#SHXaeL_TqOOe)o)Ste(PPdjphONpOul1hlodiKzwAmyt_ZFE_+AE9y=szNU>@SQD7~fcb#{L!AAKU8#_}ySnw!NrF zW>2(FSAl(s)Zp!J__JtyEv`0}8(*^i!uHDeFu1l3k!@{0(Od<|D%VLTtWD%r7*e8Xs>B zJmxQA@tD6zgrA;&f;KmJy;2nT+4CUef48d!*IvX&1KtPtSv>NK@PEp`bT6emUy~@m zlL+6a`c6xcUD+)CzEwAmsO_gMtyo4Y?dnFZ<#VAw*0^x`UwUpb8TjIL{4gKBW=-Qp zGUsri4fYii;)AX|&`hQ3m^}f1H!g#gaQzm!kTC~cEx@B5#4CU=R>w~(y*q<89mW1|B+mnH&yLgLSY>}US zknkg(0v`MKWLyUN9r`P6ll;^_fww2>@oM62>JR?&w5}h8H^6jjYB#c>mm8fTz&8PV zA|CzC1N2y+o4?X zm^)lNMEtvmb*A(_W^?aroiq>2mVLJ~T~%WpYSEg74{>O?VstsIv}!xrc@6T;&;rp z61Sz(lwB7~2b(jNqn{>UBaK5{wXt(ok?gJc{L&uXzo`cPaHeuvG~jnMcGa#_Sw?cT z<{^Oa8RiU!Xc?@w#LtE85gTvGcqZxyNj@h8{6$p6%aA2Qxw`|zNW8aSn- zR-@W7vh53xNB-Djv5M20Q|iU%zBGHYvRa0-S=EUPR*{mS{C)`Hk6(*XR<}>5`n~j{ zrWH=wnXu=oHXrak`TWVK$H32i>8BlB?xg(-c$ezSNX1Ao-q5qgjo3lmNZ?iwx+`$3yWg779HSl=;$l_6t2p<{t#WE4>kL_jm zTM+;6dj3APfxi#-Wbvp+gfCaCxt4wF$|U}4jkJ3eGi#{p81Tn$;{C_KqkV=m_#ogH z;UiL(r+1?_==Lf9B$U3Ll1{e|;un75{in2NAkCD0rH*IUvxu)8!rK%1?*l*Dhvi58 zf8s|x%a3?(0e>%Bd~RimFthiEFG%8ZB*fJb1K0fak#ODRJ z_}m)s<-g|Dx{X^%Jn9BY<8$oHLna)*_Wsic#>*6e{SCa{zs&yLN3g#Lf9R>zgyZ)v z_ye0y_yOR12*$gCM?EYa^@#8XJiqAt_VEGvKZm(<@y);^KO0Yw|G(fv0AFtl@BaqB zy`BT0M}$v5?!5`eFXGvFh4}D)`0gg`P%lZrX%YNg>mw~tU2jmywrTJSR zUvZ_WeEsWU7R(q;H@fJgf$%ZChjkv)z4{Gxp6qV^j4MfuW2{HP!GVE!U|JtBTt zJ|9_q5LrGVS^b6PMK@9OH?%*SuU=M9!RjAPvHl3wXZf3Y4T};ony`Kf_SfIkU#PmZ zh-nbm2kYIi_s3-Q7Xm5;n6RD;;`b*O)Vj>9tUgYgR9{9^f5E7)XI~#sRxic}_jSy?kX&ayI}zqag37t;N4 zG1?$*3pw&`6Sv;M^@xFAkmzo(wk-Qj;_Pve<4667PvNu9!tQq+PuN1j zbH{UdV?CG(@a%rqg7-Vflk7a+;K%hNyIz}qYYTZ&QmjX`{ypcblBgeYJihN(JkL{8 zPkjjf0{8#dFNE6YCoXgPQO`5M`q%H^ZlWF#^WWVUtG^#9?Hi<(_?m@;SxeAw!*&t> z#bW-48y73bM;s^X`c%|f^mm{k&tH-54|kFcH!lhGh}OTp19y>@Z~1&LsQ*KbrAly? z9`Wpc(aHQf$%C?D{f0lV_HXq%j+9$@UZ`iGz#rmI#gQWM2|_&T2{^aIlJGu2a~tYG z2kmI5mj1YdR4pm?hm1V*%c*!Dt)PD*iA(sU2L9Md@?7El8QXga#!DN!@!}D( zi;!Vr{=Ic$mE4~WTh6}>)N-WiLn1yG(xwgAMb6#bBh-)ap~TbV_y!#;Bz>G1zY+W= z9O45z-WM;}P44X6C*`+~SKHHB$l?J!UY0LQRv${1?@Ly{DLd4Y8UgirvHn7Z&JJ|I z=#1LwGNtGRNj<4ww)z@ae}S#nAgd>p2=%kDz7o#&*!pO)`dLPO2h_vP-(>Z(Wci5x zR9~za)L%yZY<)CYeKDiH#$~{>^Ho{BFj+n&Sv@l2dxZX0?NK_ ziTlpuvAy^`!tcxSS7m9p!R}=4TpzkUMkSL@^6?+>#{Me1AKP~CZnE;InE#&b`?77W zADvOTIQiPflPVo|kr!*k{KogCeq=>@a)1N%f_K_W{@F=ZzvI6zsK@xeu=}y2d+Z`z zzVY7|#2eoWcK#6XB96pwhPsINP9=#9}sW&8|$B0kL)CCkMsV9c;@@^dwvyH4Zaus#r(#2 zWXD$=d@t$>z8A=Ee2-Xsx}LkpwcGsn1@XrBg`Iyo&e~0WZR5Weh!@RoJ>mOOQSf~U z-C9AfCx!WB79Sq24Y^q&0rxX+-*lzvLiqg$#N&Gw%-6x<-vB;GMLwTQ>WO8oYof>M z?_Wl(?4TX0dJkd_+_8A$BIGyl$j{=lymb-sV|$J9&iY%!!791+>x3}A8F+TS)TrTJ z67-eFBfn^T4I8MEzL$>)`3*cf-#ZC&`7>vEJo4WWjQ8Q4RnjNtQ6ax*{&}e9Uh*a@ zkC(kiz8J2O2W_kzzwCXq^US?ubvTd5?~xG?+4=UA6?@6OV>}+)Yv9@VS-OTwex2s= z-d(~>m`?!TH=*Ac^+%etZ%_TZ@bSdJ1pLd_*9|L$Jp8)%Q4f#d*lpSl*Y_|83?E69Fzf$uF z$KSJkO={#HVBaSqzX*@}llcA-?a$sPM}9TrImeIqc7R9wu=m@MUxZItt%qjlVc&1c z^c=V0vA@{&p|bYUDVH=+J_nio5#JQvOXB-MHlKsc{*Lh88T|+C!{(Pjevv;cgZIlu zevH5IPlF%d>#_MRP|u(E|8~4Q@cM44dfZ9zyrP)XWboEHe)ZLcKpxGW?HbYo|CZ#P(D5|FK}#_@BaQgO`ti=5R@#5@H^l!Je?$C#@i$pLk@?HMl3&aC_Xx83 zCSO*6CB=90`8wPj<4gr%y@~$7t~YxZ{7l9bATq!2lX7$AK3L~&JLeQuI7Ax z5+!zmsUg&JQ~}Sfmm8#iN4{0!^Pg+z6|@5z-VAGmlf+Yb*+d_^iR z`OM+Ze;I132Kx!vUbcRE;^Q~uQy70=1^KTE_QR3?(_8-j2J-I%e?xw@UOe*Wi{|lY zA7gy6_Z87Tv2OhROtcSGNnLT|pFxU9Yv`h(+RJ|4>IPoclXyy5kv1b;B% z6Hvlh1A~2-*>|A*A|EmsE0j|Q{H|j=Nx$dl-0YL4*N9OoAdSVW%YWTX(IX3i06+; zaYXCpR8>jYbgN}*B@eAnZB2EWR6=XA(1YHnRhOGToP+OaA&7@KzS#4@id%k=4taPz z$gkvYt2kviYiS%&Qj0lKNu9UOU+Z|K2z8zn!tsBKx~jDcAEoR0+^V})>r)(wDEu(t zR09wCPxHn?Jo2OdDG|f8j}G}0cAm?i4sPN>M@{DWQ4jK?p0q*LwcP$Q$keKtwaAM_ z=z?}Uf8h-=mKCv)@IEoGdTE%mc659Q4ZLza_-6C+r2YCUod4|oG}ltL=K!UYOBq@| z-C5PyDTHQ7eO67AzBH*Ac$LGGqMa}leH>C&} z_>j}ne(nOz(8JFEyOu6bo<;KbmM(KC;!zLF-^igfS$q2>$3JVpT>914UY5UeP=**5ZW|5kKgZ?NtyLzztV#=N|wJpZlpKuGLGN>M10~hP1!%AVX}N6BNbm-m7e3; zi};Ss<8^*Ezi8SN0aAV!hkeT4yN#3O=bu;v@}D?elk%q?8>;I!!5jYm@NNwGGmpJ3 z#AACA-(mZEQn$Ptjf8jk*j^d_VWoq*9yULG)s|jTJ!qeuUQLtb8$tWLI)0bavmsTa zwbYklCWj0K&5m=+X^SRBCuHd2uelG4q(_GE@xOm`U+eyQ#Z3Pc^fV9aAEiD2a4}&{ zRi}jJ&j!+60({Jy2y3mask9A%A5=S1bE&dKjmS}XPc6W|SI30KmN9lb^`HmUz0_99O17u z0DRlk{Qld)lv%AkmZh|!eGasD)s`mK)moX8>@!M$pVQ{3CAWV*EB5b_!e`VDYJ?V9 zISJpT0k5az!-J-|<7O&|cQ15_T%XXH-hli$vG)hkf(7~eV|5oDFpWJmL&5fb$TyMP z8&;IAy6>yi?-5C#=jZYBj#V)oTsL3GcNz00_|cHEH2-@)jWmy>75i7<<_~*vS2LaK zu|UE8s&=dqc~NCBt*baCjC(MUW*@-gTV|_oxdHff*xqgJ)ZHBh(KQwGC)9d0kY+4g zg5z&=pswW*=t%+k$5>p{U!OgxYhi!wY|}{UUWmtI|IUW?B7Uyh4Am=V5qkHeuNL1d zk`^6UnBzzLudvy(6WG6x8bQZ_zxh5MND~G4C*Th?bB)pM!|uPW35%q;PVx6M{{?@j zvu}*vUz@-m{zXype*(hCB7V~AJQ*_n0wu=#j9wTYy&PG#iy7eG9$?wm!}-(z5; z7Uj1XVw8i!JJ1tzhR4g^hql|1lIDw^!NoV(`^xJ%9qIh;(>c8Cy>r7MPC|YIZ~xvI z@z)B@<@ja!8N3R@`_r)59Ny56`6Af-52!z=`aBY}X*lgaxwd{L26GP$ZHMoJ@lWID z|Me&4z1nHXv7NzDx6LVcvOo8Eb#{mGGvc@8Z}R(R`2XpdgSm7({x0d?b{K*9|Bs(h zKV|;D{xkl6Hh$sH_IUfB|Ks0h_2a(>c1`y0b3Zfx-U!6o|IGY-{rCLO4kK+Q78K|gV*iD@aaD@ca{`cSQ zXZQD6{{hPX?SJ_1B8P2!+O+&0pZd@Ed)s*b{rkwI@%{T}+xVxC!IozR-rhUng?|9r zFaFDLx@%USpr?C}>_t5{;pZc#v&R>kMB?%1hJ8+vs+GIYPIs$UM0_Loxf=ZZreO{J z=UrL|J-p(qI%mL1jCEQA_U3#){q3sevNdIV^YbtEdH+Zne}TV_>>c#a!M#^)f>L&%-9;|ScUZvDt4sM$^^2qr z`BF`|S)h$|Kig7ybZ!CRWi8>_Df-hK9u*k&TD^r!_eY8gvYPi z$ipT^fm!-hVNXbbJ2P&u#5HC7kg^Z)+y9~+p1Z0Ai!!wc4{I2o?-?F6KFhx+WA_%b zWDWYnUq9?X$nzI|U!Cz;QQkXqr@)Sn`Rri7vTPB*yOPgpc9gKGxBNiF>c5cbzcJ$> ziIWHm^>J!5YoRUiCk1xBaz+o~UCCEvZAkx}N>15*e$WvIEbdS8Tq`qy%(%Bqd#MiL z&6B3Uwp(quLEUN6mxQS+ypO53GLJj}1?E zTeu&d~`}SE>0!?r^0mwBm+@#r{qe`g{Bz{Z*^6=j%U6{S6lS zqbBsnW_l9`vF(Qb!PBK0WN#{}#e8z(VxF%?u}^&8w3t6{RLtH8eG$gczg|9OwxNi@=lvJH zPJaUnZa0+h%JeVnb3iSFSu!f0zjYR{07HK8q8GKlf9ou?3^nAtkT3+Nf8kq&^5If> zfaNVPL$eQ*4x+cvadrAbcGTJv43|*s62JNGW`*U$*y^$=#6M$JFn=^bTTwS8mhifx z*Lmk2?m|vlBa-J`MHzqZ;)3bbQtW){0So*Y)>W9qnPeaH&#B;zl&^W+&yS|^QFFiZ zsjXe}5^jzooHFM-?~*YzFYSheUH$8r=^?*7_v`>_?{&Hg?pTtUXZ~2Kul9z)-hSas z&64zk<8C#E!y}r@7kc_r`SjMIEOb^3k2o}g@Lp7bs}H{CHIdrKpi~PO+uaz}X4CqI zP1_HEQn!3Xpfo4;uDX7_3RfUDMxAx9XmGXrS6@WLuz>~D68_qbXq>Kkmg zyk%eHEphm^USfUNVLF5t*IR<`3M=AwAi5EHWGLb0dYiJ4{c@)T-SM8U3mdpl`|7hhYtnhiDqWkID)Ltp8 zV}{FB6s9{ReMKsHqo?;FUaDV9`X4;&GGFk$n1zj$?9cFMG3)oal)vocEy?FK6mO5I z;R=T|>QBFEOZfS~dPRrT(ZoM^+7k9#z`7E~y}~^GG0epIk+M43{}PR-T;-S@*6-IK z`D`3lG1MD}NsfiY@14&I9@TvmYK?j&V(c614W+_6w)$#E2`?Ibg%=tZvzif-eA8By zvZ$6N{DOfb-$&(ve!Ogb2qw#O*AGn8fcshtq6OWuP?PM+9G{X_NlBr|((N{?+(gdpOi% zFcuxirSr%Ji{nhSriMN7r~MDEd|0e_+9wLx>21`%P}6n%TYe=Q_G~2SbIQDNQ00D< zm!8NZdiB5z7N1kbKK2_y@^6ft0QJ#Vn6<`iCXVN+{Oyi2*CwEOV-v#fT|4nDH3>N4 z>^QM~kR8wD9WU5o`oIoU-y`;ke8taTYq6QRz3Xyo?p*txf7&~iaPF}*ndM_;Mc)$9Z%u))N5BkRhQR@Mdba=f<7?g zSQ~MCAbF1!I<7W`gGbT{SC|O4_gxp*?(>9CYB}N5UOnJ+@0MbH@a@wH{esIC!2$h5 z{;<|N5$n2p%3WnBd15hiWO0M^MES8p z*TI;QK98@t)Rge%M~+baZ6DhUlKoqH)bP~i4BljXCw^O(xMKg31oo*H(c$MwOXv_8 z%HK)+;mY7d$vc63g)y~vac&*EbI<@% zT&4Dw_iW0{)I(sXKKYxdU7U>aJBMWvUM17sYSOPd0Ez>Ah~_}WzLyW*_FS%h zfb~D zH@A8*Kkw*~NU?pKaPnH7^2OZ@(;@|4DLC`xPu?lSgmts>C+s@O1OkT3Aa9Ee)n6Pk z9CGKbWnLqtw{BHG=tD*P0C2OKDvm$6^&7)Z3;j`E-H75FJAO2URuhD`74Eha+Y|mM zDG6&O>q2uP*O}CnjVU=+r9c!GTp;^2GQy(~!@Z;$dAT<2D zqUnAyPd^1)-mKswVzLwm?gpcX@3hY3BVSI1D_Wn)ewXU2z@ST`A?)=u>fbKcOt~y{ zFRKbA{}OCGuCV)K3fWi<$v^+@mc#O68$rhAej-1(vbRyVFplVuW`?|VSw(KY=yGmbWA&A*PK`mIm<%V*w*#wgcy z)c>8nci3mob=-b|7{d_!g_s&i>NvuCr&p1{115{_OvhRs|zoam|B82E3_;nysr@^3@6 zvDGPcoS#qo4XkP38a`jGWj2!}e=U9a2w8f(47ONXQ2ngFZ}N8UbwX%mNx1K>o?zId zmOozHg7CLTI_MVphABRp5*~Ci2^VxaCf7Yamh`b!Hwaz5G}$Q27u5ex=9Nql+KL-` z2T^(VMw<9tb+@8=4Ed8#;}(yy=B|8i+h#O=qvdfJsHw+CgtiyQADnvmbEUq&_zOG9 ze=AII#AjRD;JcyH{`}#$oIUKLf(O12BmOr>4#fNbeP}wNTwEV`6_=im*iTPqm&NlD853+f4K8)W54W zwz9`dWVpPW1&H;JcbmtTWdvdJ?90^OS7D!Q#eXjp-i{XjhUb^26B7Yapzn+1!o0>A;cdMzqYR_a`WxH7MsgWJYzvcC0 zy!(i=EBujMZ0Fm}1Uyw*DsSHJGhuQ4`0tOjp8ON1j`l>)js{>opgHv?Bg&r*>O2AV z31yz~eM{pV63qlJusC{2H8X6Y~Z(mwwi*%ga^-JF9!p-cA zU9_kVDEcyw>y%A`m?3E*Km4xoME2msdHI&}Nu;k;feA)V*lVf*_wFgpx9K-;^K!@QY+bUnUM|roW?4Urcqk>651DHJS0z5{0&z0#~V7VlIRyRJaNuc3qI(Tj;L>p{y7-;YY*i6?$G*!x(DO1 z+Y2vluB}D(wER>eCVXkaS6qyw`95Ev$!8cQDYkq|pz*pJ*p64eInQ@|nyZ( z$2|^km#2Tk_TlP+;aqL;VE7(E=PS$_Yk^zG$nfQcc=5gr9May(^7pu+X@3)v=bcSO zUc}p^zvnmM-;|U-esfTCRY?9{WP5$MzsFUs<2{ht+t{fIi+&jbZx>Lm4qkf{jcFTw z`KXJMKRV(-6#J6Z4Lij-5dWe-QLyGi5>x2*BKdTldc&s28gP1%tEfL%9pMRMTeX1+ z;n9R$1b^U^;14KGCw~Cfv|pZ=7?2Dq{>x}S>#Z8b1)moZ_vn(odgt#|q*Wz>rLrB- zU-di8TU^~HUmY`@+K;>e=Dv;0aA9C%ZM%I_L^ zl+47FAsqCA)s77v}Ai8H@EKFot+|SdR>K}`XgqOx!`1E%*)E~E#pV(P# z2i(w3^5^uDW<&MInfx}IkUhL#R3YDRFA;BdUPt^=?+EdP`K{$0&)pFHBhYFV1*ZF_ zvGZ9YME=mJO%hrczf(9Y)uHma1vA0rM|+PbwPR5`brrWO zC;I|7OyHLaV^DVTD#^dTcp5g}DC5)OQbqajX~%7fGYgWyXy-Q4-@9jf<$j-%;C!e# z;YocPxCa;51WQS@#M86@7t{G+$+D_^E`e^^R?qw4OsZd7jC`NCHVr()7jDP z)4^_cDd}VB+akp^+c3D=QChEl&avZ~%fjH;(euPFZ0IJ1Pqq^j>i4Afb}ioStfoEy zZrF7s98snPIjN3N(Ji0K$CpoLCN?oJ_Y3(q7%@XQSIrUbM2skYfa(VtvHGczQ1gXy z3vj(~H)7E)7UCB>P<=zEboQ=q1mtR{5&l~4D(|&C8SHzu5#@y#FByyeH6HB3pK=km zC`|^FOReSYS4i_A)GZ8}4ZX`}js8IK_UR$hAaBnOZnvVJSRU7Gw}MP>dtmF2%0xVV z#AGP(Jfp4cQoPo8+<89ra90dmY=&a}eNFRO zkb76?6fI$gbt7bl1b=gDgTJ}vkMLG(P$SS^EX5N(1u{6aM~|(}CVvc`*Y05JpP0je zL<^B0#DChsqn?`M>ISSC$k6qW9=AR#mH!tVHHG?@h584j^61)kBU7H(6J1ZxevF-$ zJ7I5SYZfq9lCS+TCusJ^il@($utv`jvg3lhnjNm@Sw$XUcsf6&sd=Bqrxs_0_oGExCxXeF_1lw;vI(hu6VoEerD>@n&?AK zTH@%NXPNpMAY4B#o`;#uMt=G-%{Mo%B*mMN@z`#^J&k9L|3+?`6^;3qsz|1>=+v5D-%qGg%l^tL3_8@Z9{>&NTk9j!ukd4zO6n5k(1WlueD(*kM!w5dGFRkANJ zTsB&4A5I*1Ra6fhg?G3b;W=|X@af1(xyf215b3gS({X`8Z}w=`dQl!o%}+)PU z*iPbnhTu7EKyhagyZy2c^~Yp;9GIMC>{yG#q_3V9G0^yF8}9aG8ue$`^CZ~tDM{{n zbA?zRwO1v9RoQ99ihEP2{Q0)3`1s;B#pn|0ytXH%H5>9|wBkln>HJliQNk{yjf1ON z3%FQ+V!;5&?a+t!>f4s&&uNh?n`qH8Z)2^req1j|gxymbv)m&OrS66(QYVza2c^ZRyk%ZiyeHDU$n z<4IbzV$FysJejeMaA{4bJap|Stn4J|bBNPNwk~D>bonmDZ#8dLvw|Yw9bFspf8k@t z>&(g93Gdo!lD^9~81TA*kuWG{HMO4+ZNPqD5NJGqOxQEEK;dAP1hd^F|G`!(oc$;W zht*~WxTue|x8BRz&PWCw??}>TV})&=aGrrx-DrN|SVbe|qcXSDpKc8{3V5uuZ}}t1!O19n~tuT9OAJ~?*Nu*w5qUANx~m z54|j_xz{8wG?PpEQZiG6x$gaOO@`FJ`KD^<<xgSF2J%j!l7Iek!e&-xx7OKQY7ZZ*@P?^Z3fUX&GU~sRkPji|udF_>lh!*ipGC}H ziPG-rB(#qYZ!nlIoCQv3A@#SVK<^^ZL)#eB`sZF34I$Oh{HWZN_}PDm2AiLuJms(x z;h{&O;l!Q|{5UqH`MiH+FjziY%rmy1BKm>VE)B6{$$uNaM4y}Yk;CwJCNy5APS@r2 z*W#e@7Aq=0YwUH!MggmDmhb_cZro(qY$#k~L-fIo=CkxJlc3gi9~b5S0%qAwjU3>^ zeHtH33DxDirwpKvw4d$BSjszUOoY`pr2Fu;bLO29yS0`AsC!p`*}_<6$)p1NWywePj8BU&D^M_Z!rQ?X7@WO{=1-EYR@+}3g*^$^X|hYkvw8- z^vCjZXMR7sO#D8ZwuOr1QEcSu{?wjO4Q6H6cPT#2#}~1e9$|Pem@}kfkq-9^;_WjB#L)PO_}%N44tCB;VtKKTuyx-{A$CUP@wZIKllHM-^~p9g z{x)x2!1B*9Hg2hbSQeF&r-N3t7tf7aNpvLvW3?Acj9Mx7A8(&%#0`Tq;qEeuzu;r- zNBrQJ_ISKSPpaQ|+!WlNdQ$#Aj@ApjSUMITeaMq{F#kpMr+gcMw=H+Fww<34&Mp~- zAIhGxt{n~%e)nbo){iP?gIAHh(NDNX2~#=47kN~1vHgMfwQ!5aET`KUQv2sj3{k$) zfw%K^6ZMUs+781f`&RR5UA_>%(ZcTn8en;p8&5k-c-Hl3>^P_w|KJ%(_`vUEtUJ5Y z`LNPrXR-dA=1~}!-j}_2oIvee>EnQ3tuxrnp%gF1r;(E|>tkOQ-j2?nqQ0>HjTi3} zP5Oe_Z(T6*_b{d>=@azWZ1n79!M-mdeS=Duk4|%6zsR{NjFZ^jks?*a?e~oo$+;5F z95J(ZY)|K$pAGa|={d4F$6fMfR1qEO^m@oGx0=cqtd#Kf*!W{TpBac_FY<%>b+MpP zGl8A+S!yrxSKbf{F83#}Qw{jh`dCP-n7~dq;G*@h82fMn7clX7BH(Qm6L?kwoMPm<#9G($ zWkas9h@KLb3FVKPtYtHErSg%h+hX+^4}_Yf;&?#9a6c@2QNsJpyF~o@33(PVPfFO{ z1(%3^;fD`?y`m2B$$be|Uu%Pn&$+|RG&;{hwUBRBE#yoIe~3QhkO7{^3sk6WCw~)8 zpVbrYn4ig){_0QisR(h#Y#~ONEyV|+ckeHJr@a-d^;f6yd92vU2P8y7ER*{0suzJ< zeS_Gu9Ll9f4b$=H`|~wx^{T7b9zJdVg$;1F0?i$n`r;*q!$63 z`UJ7(=T>o%zR7GnxPN=i((iO7{Mjl3g2o21C#@y^!4Bh~H0eEC(5Nl(-(LHXJso8S zDfd)JzIJ-MSj?127?&i;r(qX?ucrht&2Q5D-5nB$;qRZYw~2PdKh^ph-;!hjD!<4- z!N4xN_=IpFhi|VWU;Mr@-eL3&?l0uXiSo^p+vC^FB3b!4FT$Uy*7D;g&M3N>O7y_dYuN<1i*kjwgeL^F&kXtg(s}G}$=*YSxa*#u zMXaJBUoBvN9$W9VlHb&uK>X?+R>_ZQjN_vWW)pTSJJ}<_XDs#e-u{%@uS`qElWwEs^R}NN|L(bv z4{Ff1UEcY8xp;md9_?g~_Dc`j()`Ff^O@@%pT{~593j%c$~O_WeYmEux^airZ`GFS zFemjPpM2Pn>KZ^I)c$%Wzq<1j&7Y0Jybj#f&3Ri$XY!w7O~N5-ekNP|We|<;BQs?j zG*}r{yOKW(0sC@z_OlAM$yK@^^6Oc}>wH33cb73Jw%_UVFLr#+Szfzm0O2{kG(Z#I zvhF{u2v?;yg>^GawLX4x- z|HiErDV8VN!DfYIKg(@m*r3*-;8v7H{hfX`pG{921uLeWB|PndIo7IvV{3-B7Ujpu zt~R`&%RopsXh(R&k@;-Zm4UFlX>-CiJT&B&-zGs^_EFOBt3g?^Ej7t-*4v2ApQVbW z{P@9%aO>>@gon&_#JyXD`S7id`g1I)UeQ|~52m0^bo+-6;5M|U z;FA3y{%OCv@F0g-a4o@`=vxDP*>3IeaJT&vF3P*~kpp@NO`to#vK0sTd zTPSyB6NLH~vP@@d~-30gL{j=s9GlD3SdqUh0k;=f?AFUFp1)drJ?#_Uq5| z*Gut;#BcZ5wa5GTl_evoy|8Jw*(y}REBbDP)3!E&6MBttl(q%oh5kM8g6&e~?9hv_ z^4-a7?ib)^qv(8u3(5-l=q+7glvOE0q? z*v@?jJ0`^8MEdoSJ;1-)Og>nW7n~pT;M;j?nD%oJ(I@=Tl&g7cXNjp%gtZJO@x&=+ z*x|lZf8qQ2{KrExNNwPMSz{WLJvK$ZZxa38z(;&{f&n_M?Iza8O2N;ywYbG^XWk}z zNH4cR)n2yPazQ!kxx>p?^p<+0Xjhv5@`#isJaaeuTqLP68v1T=r(Qbbk6F zteXqN*K+-7Qhv%VlkspY^%H+~4#~dQ_*ihV4Cb+ymB@bov%z6Y!l+AeS9Qb zif@F|D?5@rqE3Y2OmVQ8MgBp1fnFZp2u3{bNadrh%?2yYaQ^maIPt$I{O;ZAjL&?) z5b_VOgOIzVK0zD!mi_{t6!7nD3T2m$veQF*5I)nPgbj6r_7mU?j%#Lht zM%ZzQ84lgBm`8x*A75>`mHp|ErP!erMf5F;vslfPV#R&MRKl;!@_F(fE^j`I)^{+_ zy_Q=WH_CZ}w0}VVbB4}AWpr535E(lF-EzEXSlcV{}w_MCQZ+#qj@VbkS3z8SG24f32znx#0^ zX9XX)ZYGNMGi-qaTd-Ql`8+X+u!a0p-Uss?eD-3pPb>|;oTpavS(bT=;%%_H(M4J3 zYqheo4Y=?A77ESji}OxO7#;kZ%jUZ4D*oaLUyQlk>_v*$?g=7)cy6W)!-ptCp^G%1 zUmeO}jfHnA0Q{)^1j{P+bZ7`W47A^%%Chggy!<%7SxoZ>ho?8iCNoOq@1*?&b1gJ* z-lez9QrdrT!r?Dmb-{Rk;sV7Nv8`(h>|R(Z&$%!0H`>2RK6GrP;^RGO{fVC(0BW;W zv$KPW$R6E<-`zg(Y8z-;(gsBR1fBMRrH2A}&Tl$DVXC(t__Y1Sjf{+lo;chOgV#v=#Rv2U)M+M+rAK?toW0H z`EPEsoT4!3ADBnyG1+@%c<$i_+Ha-)W%{;({K+fX)h8aJd{FpxjO@qnk+S|@B>!Hg zW*3{d`5Mo9J%;FZhqPeaXidd}H1f~Dq+JEeHM+y|%jy0HCac=QR%Kzmsa7KYMSMR_ z{J!AI6E*QZ5kxF}KLJLgbO`Sk*0HWlt+8T#XNo_ReYJyl0k4A|g!g>1gRv^scr%Z;&S;?OD`sHxz`$SP*+*%Qdp)Gzp`cf9=!Y$dojk7=$+>$@j;l(-mQ-y9J62+vth@$ zOIjG=*UdZPz54|$r@Is%8P-i1N!R84A6SvVU^{m1tdzr!yu zcaO(x*h4A4Xv`U!mFMw4u9AI?|JfSf->KlQeoFl2c4z|LRkiHca9Y3cg4s;wH1(Qd zs{1TzFZaeB_TrBg*PR(mc&*9eW-e2wRcxm@qrDSkAN#uMkfy2G-6HDlRa zDnDf9C8i;KGov@skLtH?vz0G7=&ra_O6wyY+4#_TxA)!LcJ-3~`Y5(B?zwfGg%6_j z7@ukCV~57Gep5;N>R*2%D=`a_`j}`J<$fDB8pNwQbq+_R(zlZCZa| zy)b^>ZBFN$`#zEA<5P>+gsH{+sc^0m%fA_Qp9h*5VWRN1kchM1{Nmf~T4PLWGs3O@ zbb>~E+bT9s@g)2uatdF&W(uEBJA?4Rs4lEo%y0R%Lve(U*W|E~0WbMHA@5S;mlxdu z0j0eT!zOZx4>_Y2FmGFK-dsStq-K_;;{biG?nCf0n(0_D?+OzA` zlj~ipW*gMT5nbQ9Cvz*PW``T_X2HMzCG4FMYvdH~4G{MGGv-e@OqTqQWmUdVk*fhF zRvn1nQh{H0f#0%*`eg#YFoEBu2E0Y!S10iM@!`Mx8g+llZ%>l=B@6tX3;a$t@OzLG zfc7>yY-Z>okv|MnPeyBvbqe3wzM?+^r-bwR_IFR^33dHxJdQVd$lY$-;vJm^i~RxR zvaUEbB}um?tjTUsiFT11o@r{@})G$H%`z; zwxAD}27QcIU8ZO`Dj60eWzu*(*nCmZ%`ObOJ)nFboYi%a+$ty;CSN#4^wUolvP0uK z!VVwdURxL+mtdD;E(Kcl;y8-(_m!Qqs83(}pYH|KgA96nxBC1ypBlFM6%g&PjWV6b zwh36Y3AF+9X#Ez>XA~z*U`vTU{D&&)hqi&=g@%$oqMZ1h{V_09qd)1_Is1~luzeKd zW=r=?&bw{FPx%MCxT29*9<|apvlZ3hz>^lzcwawU&mIo+hY7)L2q%8?hCcBvV1RKC z!fk}|-K)cK${eZuBmo~2aCqWEF7oR=uPY>bx#N|C=AwM~G^d{Z>f;Z~m$V`Jor9a1 zrO@8eIZ}Du`(5EoBX>BG;X(HOg84#Nr3QTdWJ2YY1bG)}{9w*Y8j(Ir>P_){#WF58 zvL-zEh$;NIw48-B_%ou8<9}>Ev(eX2oIj)!dz;iVR|A2t!x`_~vls1fsEf3oFU)T( z!~vC*$|QdhAHANAZN?vB*H6qA?UCA8^LUN@fDk8|kH5Ot@Fw5h@t!?gMc#Pz+8chL zLIv;ta-g!}Slzs^+&*WX2lZdXu|0NXDg31Py(m+A#~WvoVv=nC%BOPs%$bQJbLre| zI`opgaq(L|@pKUJn}7A0osocp8?e8g2b}18jZMC#Ozm%2!l18^PZ)n!I)9v4?hU)r zgnYO`B{W`-A_|$RTR3bEZ!OvN-#pj7yswN(aV zVb{|{u|LrII=_R?MR%TXJqljT ziW2P!nyTz&JUJ5Hy0w&v_`6eI7{1exwSG_MWfl7 zbN;~w5|4Kf+rw=d70lmzG`z3gME2_c?J2kWH3qCz;z|FCii14gP#xox`=Qt#yM2}W z-U;BBZcHRxc(ah@Z~O0gcc!UuKKA<0c@{gj>ke-c=J0+xlD!As_QIy^=JUb3n~C-D zXlh%0npn!$?~>^Ax|qZMO$*p6nS`4P@iy_>(SnBj#~00{{KHPdH=|gk8FofzM!GJUbi7!>9-~LNZ%8}HTP8t zz4bP5ZmkXV@0Nh|1$@2%drsLPH(Fu?e2GLK^gl7$)L!GyTD@gCp9WC>RCOA$<$6{y zzMjgXqjn>fCg5=m_{(@TeAJ>HwEWPC$|p9<;=Sz6LDS5Xu#O<#AK`mP?}qOkJM2Bf z2X^iRgH0v_C;hN<$q&-+Y^!kj zSi^AkqF^@3TW~Q6BUKm3=l0x4^K<^WNtp0pn|zwCP)+)?Wzs+9s^4;!lcL9*(W4ar6uC z<5=HtzOOT}z!yQY*&ucD$Kj_CA2~X0EgvMK_y~jx@srk{a+p;u`5W-z?JzjLsW}+M z*OPy?y<;#OoLI?1nk*rls5KUzwNr+H`%cjM9Q?qUndj#4d(!zEeABzYk`ukz;VRm{ zp%8s=PjwNCwJIcii{Gk$|5U_(3wg_;ev}@^In8`-2f;?tezGyoSn#WqQX1sPwHbQY z_IwRz9m)U1@SYplg_;&n5Jc+%{#40j(Py1_>WN9Dubai@FlyLAmeIaD;h&u=SdVW* z*b19K3Gc07uWk%t#SM5s8)ddC_P*RRA%XPQx1&0$PSIzd(uWc@6#5l$Jcs-1$VlD= z0)8vYW$W)dQh!EH?~UJlhOiELw0@$CfRFfj^2=L$qu9UV{K4=m>n8s!y-kT~fxfUj z`XbwM=q}Y4?rR|ONeNG1Af2DZ^SE%I!}`vX&f}_qzL*?+k?%fqS8N|j@&{v^GdJ1e zPZeT)xH&lhH_lqk)1>n`Gz$;FQ$jo-*pJT3@bQlhCR-ijt?oOD^1w|cUEF7NjQNyP zyctY)3;B@GmT_HI+HWB2Wk-zjTFCtB2abBpw~G5oZhcW4!By_w=o zXjh+%`h|7Qy%z5y{s)EplUws-LS6AE1#0ZaqFrLTJXFe0LBn>B`QAbO*qZNj-Vt;n zeV--%Ew*5b6KMu8(eIl`mUOKBY(>8W{*bAE~pS zt6!76Uk@9@o4DR^zSS|piD~UX^LRVBq|%D)<4@up=dSGrvjgYpyoGYbQTet((cIZUc3XA0k3dQVtO z`*RP2MY3s4lTm&9F>yVF14Ts&XM-p-+P;a2SnPGry-65-riAE8S+DY9j>h28E{ln- z1?!!<3iPQB^kBh0#`!E1azx2Ku$y2%M?Wm%(MMtGRw>p&jxU6?=|u-)4M+6KlX({*n}N~hro4tolt+-CaMny z0v@uW!ig}+=8IS#roYW+S@WjA2wg+5JUCg*mkIeLFw|lm+3(+Y6tgZpBhocejQF_^ z)@Zs)n%^6J-^j7wcs90;wEyU(oMmYbJ3(y|x=+Gkv8VWvmIheURoXA_dS~brY5+v%we`+I&uU$+3eY8~?JQPk(Z>AA|T zcH>SBCEbbiCcgr+w{!`_B_}?UJ?!{tmTe>C2>43&2oDpFF^!4h0L``>TlHPFnp7g$=9C?A^u(RLU6lAJcsfu!g`x$;3|g& ztZQ>0l9%V(p{jZtwmH&L)CVkkXoLnQzi@5c4x;{G=!g-RIyawRYIad9kK>hQ;gH{b z*=KWGkso@wt!C}k-r}me0!W_+R<-BtQoZFp?@_!MHKvDQa;sA;Vz`t)w6bk9jxElT zk4joc{KRwZiN4o`v#GSkg!2eoo)gT!)Gs0a`em_rXYJ8MF!Qs@_g>8)Ph-mzn{mnx^A|u zyD0r<{fm76&c@+>qrc~K{CD}t^V`^B$BuA2+)0!V{I9oU7E@G(W>OjFzwKo(xYmQTzvvch_cppCrJp!r?^!cYD!7`;J2UqU`i%P&_IJDf62H zwYbQCK!O>b>|D)kQ`=Mf#a{7ne1&D~z7RO0H4nqBZ%ohw1?0m0K|AnyUiSp=a*g~T^8?>ERPy5y1 z_mi@E*NgTo#>e2tFB_~4{qrBX@II0-7UE9|R^;wHyL&`?$A)+ae#;ARO73RsoGsXq zNZ-(14Sy`s%+qf?n(&0~YOn+}^IRHm)v>{H?aP*+eVF_KAv|5pE>2y@QyoVMZKQ~p z{}YG)klqh^$#eeBPw{;r@GQS9t{LKdrT2yms^V#l? zJPHdnNEzQUuS{9O#~uxq-@IrE?T$$DWGko1pZsx#s*O^9<~-YK78$XSpKFkBu5C4+ zAz*C4(XFj9(|VqHc`)9uY=^xp zD8Cz4o^n;#Wd~z=I^|cv3L&2IVY3nV47pGBlXa~XXNweUe9}}=Kk)Oin_|ya7hY@} zPq@SDEIzg19rrVr?(b%q_r#5tTSL9G^nK69L%mpSb_;C1#+%AFJsioag?yQeSPQ~B z3(xRlQw?BXGs&M?^yM3G6QluieJMT%j%kYgk`(_3hsHzmiUN+x%BpEUfQ!u{ z6rsi~A!(xIuSV3@Zx^zcZe6W&?EKZ8em2C1;^H#S77SS=+OH@NTDc$0F>-#Nd1AQw~R!)#OYR2zGTk3BC#LnVmlLE z>OaJOV2QJYZF<{a*_mva+c{fm|3~{qY{fs$*Wp&3d563iP4|x~|f`FG+f@(+Ixy&Tu){KLP)Av>PP z7T=FSpVv}+a_i6=@>P*hxT11{I3I9Z>Y}{1Ld;ov6#0{QC%lOwOYk?thm*gF-zqHe zVVe@3x|IA;+~zqF&6{qP*Qb%c3gN=q*(u>+*2-g&f8d^Ih=on8f!#Vz@_xu`gTvdl z2R@JdW5GuLhkp((+dE_z3jTSRi6UGkIDGmy)mTE^M}_v2kkP$ZMi_W ze)q;)e*tfoFvh%Kw$FZel8uP`%%=3S{r%y;_}s#;vRQ3ALnq5VVtou8xnI5{D;Bi& zlmCHjI$q}=lLNt-%_sf#)vx2xz1^Y3>pO&%EhA(}kL++!2l5ZWb^CL^P-{CIy=#P^ zn-mByDCcSBIb7R(D9Kl;bBcSLcg3VM3&M9y)X~?ymJd}XdxFL1%yHG`K(@=qj_CRW zKjaNuYy`S7eF^7oeIp0E@vOh(&%&-ogK=QzX3#a9zQ2QUFCW{9@zs!qc=y#Jl=F<8O?j!m-7aKZ&;y&3sOz_(%o9xyL)wW3V z{=-bz@=Pm8lI$P!=UH&sFe{wVfOYOQgWcKh*tIIDKgZpgW1adtzDZrevTt@!(Yr9G zQwyp6U@IHUZ*}VLe1-H)!{t#YFDUX8l1RR&?RG4uM=OOxUOeF`&02wNtTyZ5?oC)% zIL|=oe%{tajc|2EcRW8Qj$=c9Olf0V)bpt1XN2FwB93o~fa_f=*&5;ZNQrpJM+Pag zn!|)q=gGePrcZ@VEjd$6u_gayRlq*B;a*RClx0HvSM@o|DwmqWkdNKO`Vjlu8-^EM z=N%o$9^lANZzu@4$5yW_Abyvdg@bWyZ|1)!SF{&c=R6p^%da!zJ<@*me&8cEE6D(2 zS4;eI8a-sof10AvgpSnS_Ihs^sCk!P{~&#z;qyWGHq6`nBR;Ia zp0K!XdtKx9^FyZ49NIk31#I-X!IzhB#s1*A&!N!F@*eYV`dr*^g?m3YIJ{IFLzhYU znTskSL0|j1Q@^S-QGSv^XHZA`tdn+jBJR`A1I&K5hOdpKc<`UZ%WT|wUzn{_M&viq>z6#Vz_6Fj7&hRRqlj+`c#43> zUDcrbKdVdq_@%b-xNX#WS_9OVgn``n4!^&&6P3@~nGE-<$11)gh&kmcs1Wc20mtR3 zkdLaLc%HS0_XKUJeXuiEgFzns;rT&oAJS#jT$DG+g5)KeXg9jgndj9PsJ(ZF_xW0H zFBsV6KFL2@)fR<(2KbZI;6J*2VXo6h!_pn(4`J5znJ}dND)y;XikDOg?{y9k-s>!G zW=s0NB;;Qxg#3#lo2Il6it(wTl_h-s94S7P;p7Dmf;cl!rS%)d`y^LE1dd{x>fD&NKAKKnA*3v{La!e9T{zPa=+tPnrL>^CL6b27;b zz2shaFo3hBO45E)c`noOU}Fbd#ie+|1{r;y1@V%8v2l_xPX&9Zd?MLHnz>{TV-HLA z;P>4V59o~MpI)~m`}!c{vyDnJz>TY=_+8wSyMI0*TfV!q|hhWt#m2p#D1 zY!!1oDxLQZm?&`_c|7QAwj=x3aO{gS_ZTwyN4np^!}E7>uXa)3xJFYZ+VkIhP}PQf z%xB-d@MD|tirgF>n%kiRH67Id`#lky7v2wb65bDWmEI421h6mM6fwRr}~W7SW!ncPzGlR=0rcU#uhU_nB@h2xn&m3vZJ?!%k73uq$U0+BZ>GoH3_-C^)=X_+I?cL&YCqpAhN4UKBFB^<7cO zzXTE2y(r}N0v^?XMSteMKT`bdpSV`Yw|Oq);tP5CVtrh;dj)s#I4|!k<=^28A%CdL zKk|p(Okc~?Z1UwO#P!AUPn0dt>cV)w$Vj?R8D7uuj>By3a!I<6acUKhdew%kNv*VA z$IKXn+SXIqqw~`KCFWxev%AGV9+K`uuX@>I;E|5m2L+#2*<$_QLTLBM|}N6eWLfeSXn$O^=q%rMDVOXuBq$lZR`ipr*7PU-yW-=pty(XhFsO=fj_F|Z+cT2+ zU1@%%% zT^xRVe^jQs(wp$Y!8=TZ*@QUU`hSzj=#kww2D?V}_S8ZO`Q;Cj@NoNE#IJUBb8gpaJKND`2FY*e-wOKO>B29Lq4Os$yUO|E zwOOoO}p8HwbM}4&)A29G0W)%pQE>wQfky&6o^^e>vAdvdI>B?5t!N*D-cQK0SPhPi!f;=x)sVCJx6B7mpRkFFv zehkTbQ+Ut&neZ0z`;LW#Gu~RtUPEGTZo~Oj`c;az;)o$;ysr@7&Fmq?cTIvW z(7JD?cS-yk3rCu>%SYlMpjxtD?_hU?hgnSXwmQkP)MYd-^SIA!indaF4>tMZ+>^Jt z`7h~v!X1}gF~|EncUaaGM1CF248iV|JFDC-#jovzcSVop@096pr}+m%g5BX!Sr(sj zN1e(?Ty}-Z=@*z<*QV5-xc(0m*8jZ?>wmVDV2?+Nx#x%nq%WgqTDW;;M&8ZMK2%<- z+arF$s2eK(F(7QA*@)Q=s*;B~ClLQ3hf16W7#BK^Xo&9)->xH{>u^%`1=fcZGC5#)T8T^A2U_I`3?Vm)BQs&9yqOEVFH>-@)Lnlk27PPIns0zg?q}*IMPM z^ZPo9-?R!_`H@?l<&{e%e9!JBAK-A3ZQS5X@))0=rl=I+3n@~3LHJh4NBCw)T%U@m ze`5aPlu@S~3Z?uv+#}%0qfTYtXvk+&72Xm$BjgO{2=7#j`Y!KL%|GAtWW5W<68{+w zHnOtYe^{SIlKnr}HHkZHX^X4$J&C?|pE8UrSk1pJmgwSI`Tjx@X4@8s^Is_Qf8&n= zJ?9_vf8*u}s{DFUBJmgN|Nr3YdCQN9K5$;c`|~#hEXtv1!2cWFrsXrIJvyqawlon% zecbC%fA)lcTi%xN^bgj#edfGV6uZ*-1a+DW$+Z?RZ@{HHJ##wu7>-kA(t0i5lqvhs zX*k}pmazT?@f`pqrDng9sDJU(T@U-|Y82u~a{tmIi?|`uvVo(kBF`#K2HY)UIyZa`R|2kg4jRm~- z|4{ZGP*v?f+b}jjdY7u8C}2bB<(v#6SSWTBMMS^`SP{fRQ;NLlJ_h3Ag`%+ke>KcJ=ABVU{*D zEboi`Q!$RxyQ7wnjbgqI3uz#1hu3UM#Pyi#B_Vk7e7E*l>$6vTw2L&^}tp@koxJA4x%ezCU37Kc1qOe4LQ~ zr5sOtKMe6>Hw~6_dl+bB-*Oamdm_h8&*%NUZs7ae9Y!=W5%x>ag!g8PSdH8Ed_O=N zUfvMwJ7~hG?pKBSh35_YdGoO;{QTco_?tj^+UJp-@VhWx1bk>?v7irBasT9X?w{0N zZI1XN$2U1{F2^_d`1s+lm6!z>I0^hWIR4JD(y$JQ`QP|+R8W{>a1_fo;ZXI5I3CM* zfARgC^n&pKp+BGrk7;=f@eSTz+j#$x8RwCoe;?&{gOU=E(70j*AA&z??_!e+Aw?^4NPTV!AB}?(+SmNq{Dn z=k14UoStZYQqZ4q{cu0}JL?PLi9v~EMga|KW&#A{B77OvHo7mD5_jpV{(S z+z)->`CN`h<^-;VB6lEkbTj;i1SCgqoHiA!Ys#A86Od|1yO8$`z&dX&Sy|Q zk7u)sZuL%$d15?q^oN;jXUr_>tsF76g_i%|@4BYW$r0Ydod~Lk`QmI=kcb9 z@uI&#n2&|;d92GHiu)}yPH*7!{CABQkLtHK0y4i*8hN=h_V3c!g~xe(7dp%1WgBia zP__BxWX)XBUw_AGiL)JlMuX(>vYj{hxZysRd2;$EB}WF_U$Md?5#_J%tH%^B>%xIS zy7;`#a=JgK=Wbez^u1MArS(R9P8cuxhl;CLkvQ8Juv&geum_mekOL&0>ys_U+u)~P z8ksY=FP!b7gZ*#D<8f)6ewN3fh39p4t|<)7?+u+F4n|yQa+}n1|H52b+%LdD!>dlh zoU+Y2T6mvehnxBFbv&MzE{_Lhw)sKQe5=SJH*r0sehsAC;nQ@|LlIBDG+&4(0*@zR ze|4?VVUu-zKx6b+#Orv!Wpa9T_8xp+*K^F{=TKTF#xQyQGS)vdZVl3H<`}ReCIi9z zfL%t#flo(%|I0gdXb|(G;B2$=#iq~hx;Eug6~;U&Zg${QvA7N= zv+SoQOWnhAN*jNR>-n+t`^90hTg5ylUFa`X=#vCz6mv?KJ;3wQ@Nv6p{x8jIZZC13 z<$FDw6?UF)0!#UK1MqnnH`gx=81qDO;<<=7RK^yxPj{CTi18@)a@?hY;J7W4r*eBD zIe2S9)b1IQdt!WwJyU5`=uvlCqWxAZf7*X@flcyMiKg7X72dl{lWOPP>!tY4JmC4Z zLwNqJ?jAAU_!+0~ufFRRR;XPf=%4j;IvX%2mt0O4^KtpJWbLE+=D)UA#Td4be|(we z=MIqP=khlvS$KQo?>Fy*e{2=(4}r#ilAGRt5sG_V{%7bKcCY8mu_tVWdN^j=NSf2i zH4`10@IJ2Z-m$qfu1eJBA;-hG{y%d>{hx4sYvXe1`*|W3^!MZXD=ifHpYwd-`@h~1 znLJ-u&_D7)OLp&v3)ZJs)XG`ZNt|!~#&UgyCLsSp=jBfS;b(k32fm)Onb{-x-+8={ z<7C9Rz5`#M7+>k(AE4q&slsxc+EETO;up*#4`6~-&%y$N7uThy3Ic|5NF zb4zX5cXxeAjQb#rf5<(v=csW0A+!+BKfoeRujlk3f6;FSi1gWVdg@>F=vyK^V?|rL z%q{2LUW?-qPOfZcxA|$M+Z#DH9&7I~)!?aQoj5*0$M=eTx8doM9`!ihKx?px!==PC zlF$51w4h($OJ?6gDMnH(kDnTQ*Vx}vOOuR}^Iz8eVgEj8tK@_@o*}`)l|7vMQ?{XH zcPxKpV>c+`-%_4zgZ>CO=d^-$tk+t0cDE2!a)SmxRlaK2r-T8&Lf@5k0VWg`7sD-(F9>dVaUr(*d-<-I}e zrUiRZ_6PY(jvV59@9C_n;X3;FtcqUK=yu^uW2AVVXK%YQQqwDxRZ7ME`=8FKvP{cF z7Ju?GmcO$}2h^$tv#uldmkIjXdp{y(6UMXdy{2P*<`+ER2hW9HK1Ut(=@b-C1D4NZ z$r35zb>GgBp9jV=X`dBTD4(z@gWS-KVKzJVqWtE2qui$sO<--->LS0#OeeNlp{-=h zN{lD5Nt)NlLdYYn_l>~!$D-9WA_*}d{mR66^jiZ}Mti0c`)+S;C6 z+aAmBN6@#<>xWl)&x?|-s{FJ52VLwf`{9}dwUu*GAD@Lb(&76mFDiv)=B(;8`zoTpQLJC%^%Fdj}cq$vT+loQ38vWx*kiTk{H`_Wr zhPo}K2>q^en ziTUmdmRXXFOmpdmlj8gv*zJY1Yo{a9-eKbY`bF5#lNBtVXJsve>LVYTsXKF{-bUq-TX>vAVp?Iq+0@%>=95k$0f zgtne1gz*cv)@&;f?3YW~jly~dv+D>m8Jtnte5H6_*4l|dtnH><^pU0LpWDiP3-dDz z$nL2(aC{lw(PM@BZP>gZO+h}JG;uQ9Vl!SAG5RFZYxp{M$jX?{E#ewDd3PxL(Iv-y z`Q?vDA0yF*ol%2f=K6AcKP@)gAuSsHA=U}c*MMiR3oO_y`2K~TWLU1%5jvK5u%d}d zSiZxNB$yd%A{`dfi0}JjM*I7#FmD)b@@+!u%O~P z>7fiqIBO>QueF_&Xct~SMqa)lIs~q@tvJ@~_7AMDqR`w$nfK=^u|HW8|IEMYvzOPW zWp+tAX~k4{KRX}G2h=B#HcnT`r50m(o06G|MIWjk*$v9`@O@&mZX?O8mB5}Q#@L_g zJA+m! z^&USWtFMNkyivuGR4pq2#*b7$oX{~>wmRINgj>!-?6A%qTA#@#HDP{ZkL)7h{q#jrtv6Lzf7e#AJjcV2s=XMFIJIRg z>{#MY7c~SBf&b%?C`f&rDYf=JjaaecQquEkFbf(j=2ut^T~7OT8_A{*t`q2Bpm|Z| z&@F+DOL-vZ0|#Y3q-~TpTlmaa=nwFj7II9f+==n=fw*qMK+^MeG+T3XwopGrF6|^6 zv(brVv=!Hj@P~7xNi}{Wc}V0k_z2E$R9l>m?hP%B`~@c>v!v{$IRkJ z(myNvqke*&I{uf2^M37S!kUBrk*K&9F2>cW`2O_yG#a#*XOg?$u{`VlNEb}2Q|Ls0 z%m-n*8owo1j=n5weHQH@{#~poWwpv9B(ZY)y*_yp-Cb8qERsV7eOUjrO{8{C33Ut= zvG$`5r3KPqpl^xu2h8&uLVuQYU~#*o$p5j+Rccq9FSCC+5pk@&DOJv1Pg7lH2>P=l z(n-`WN{41=i|a?b&#l?atDmX#u`p-w?|HnmX1_Z~S&EMu_Gjgk%Ca_sQ*z9#DL-aiR4nUl1)S}gK6u1kc96ANS;9_~Xtrh(rTG-aDqOS1>o|32Oe zwzjCJ=L~P6yw2a^U~fzi*`(17@viPOVBz&ldVH}J>eGIiCXDWUj*M^Xj{O^C_KbX~NHe)FjtIdGNepN4^eh zEgkV1*I$UzsV9Zsb9u@N&bJVxR6w@=iG*I~L68rRcC>+p10CR7%U^;%uqm=DGZ^g( z&H;vqE5>#Q9XD6VYj`TO7bbe^F&3o<{QHnX|G>jEZ3w%d3k%f@5HI8VapAtF)X`PA z-*I$2?=<2T|DNt%H7u{u@4VAMo~!Q~c~F=SA$LTD(@vHMFFY!R_CWTsw`6}x7+kit zMgFY3;V@%WE4Vz=9QEzN#*>X@5ioEfo)>|EHk|_eog4lj~GsxHJYT4BUnC>6Hhun(1|?i6o)u+z8ZUGbVGWUf0s}wzrj?IMUGa0 zn|*o+817BYrF~EN(p%r65D)IH0PcRjscnU5kGd?q!|z+NWk*#+|6j8sEm@1!#?WGo z3Cc5m=fJ9>?n;dm#QC}LdSCW^|7YnB9W#_yH0nKhYNE+B2HJv9-;9=uCC!Gv75p8D zw>&!|jVlOXil@ce5@zZGcT`lciD2g^tl+XgOdE7 z#O(Ay@T%4j=xn}`6KQ+;iBvLRE@H1im9jva;b8woj7Q#m8BW^$o&nE>#0cYo>07AD z#^k<~e4$t$bN>=Tbe!B^e2Tcf`__3&#}x4Ua(|u|_Tx1z0$^^UvCct>3vvj}bARJ%AI!}OYac9YbVPbsTXHice0~XNyWn#V-F;j(0-vj7^ z4w!$(Op>mV_th&%+n8XKcisFR(YrC9s$~SDKHB4R$rwIfHhstO!rYhLkqYDEusA;0 z(nmc=Kt~t){3VV*SYPe|Svz}@Rts=_g*l$4WNwcSWXYj1f_xb8A%&*QA3(MEcW?w8 z(Dn~0{xk|Y9@G}}hgTN@Aw9Pxj2SPU9~$(21n918!L(b6?{7XB!-ol8tf*(G@H}7v zzsKlNbg7%|wHt!}5;TS;!o_Pc>B9oFkKn>nN4WN|kv`kei2Uc(99iF=4lq|A@1w!{ zGkAQA-S-sZTTS`(ZBJdmJ>#rDs!(t(i7Kt~!~UT3E9pArm~3D~2x8@!L)6E@l_d6< zjCf{VGZwpt>l=7~l)&mW=H$DAH52p? zxorkXrU&RW;)K|%P|DQ$l#&!HEyOFVx`3XyGqF5}{wO%trVm?K{hI#SeINVJBF2e@ z|5ld_75CFHRML~*4eki*r)XjOZ}c*U)ND^kJ=PQX=MQ~O$C-wL&)arL@3r*0(~=5v?qoi)Pv_69+R+_-G%;P-?nHo^MtmfW#s_u zukTy5AuqlyX)R(l`cSQ-W~%^Z_)8u6haA*n=Xv?5VtFte8Ox4Yt)XE()X|6Vbb1oI z72+#Vxhwix%HK_5CeyFb{mB;CK4alrbjS>{Xp*fk{#d}tacqVCQ@S;D6w<8+j$x7C zi|8rUBiP=-iHx?+*hQTR#rHugg^}Sab`g-{*!e~<{M>C)=h6-J?^N*m=&L=RknM%} zZxEoYd3dj;u*UW~wlkt6F z3OX01_T3WTc=7|(FFMsk`mi(!=I^_N&(A-0J~8y@2dO8uv3~;Umecon{?O@(BI1I! z?di}Kb6`hdH!8IEjMfBl^4&D3Ux?=!S%+io9k~7e&;IV>SS7Z^v^zGuB2a|w+Df~N4*v6s%*@* z_clR1=F%{x=&!-FUX`K0ugyXi7W!%xb@(CXv$pi@PnBQwWn64-kjV24D}t`ThHz13OCkv0Ir8@#l0o;&XbX> zbGzqAZ@8N&d$cx@>Hge^<)eQ0Ctd&aW~)w!_4%m=llN<;vyC#*pZLII2;5ohOm^m| z2>QS`ejiEo8fRLwS6olsq(gvpRbxe7mV$opKr#drx~akbewIRgu!P@V(DlvQvXEbq z*q+n%l_aE)Fr(nsh&z9)q{H(GOCBrY0beRf!TYskIdcBw4dY?ep)}H^;wb8$dTa#r zZk0yw&lBU36J91k!@%Wbp`CX~g#Ore&I)WVE~W4Ki1tj{{88Ywa0YpC@2#L8OR=<} z0haTLzd;Pvf5+N}p0S!w_v(u{Q{RT@cAZaO%kfSN8-A9X|off5@((Nvi9JP7ATVj1!6n_XqC(hrcfUoRjU*1Zdc#jO|P3 zxS%KjHsy+VFvrt5j>#ACUXJf`oV{Db=Qvj6<(0RKSasn!r_mg%t`o5m$AKI>$Z;o* zlQ_P;Mx@JlJo?%FaB?-VJ?=lBacslyS1wEtu~z0BHsDq`T@>G5Sl?iD<{bESC7cA# z73uYw@vQ!Z9X0a7m@4q{%z@v(T$~{CFMKwanMV84Mbiwi{Ir|1*}?Yh$V^)Yp}mmW zdjcC{ynuwXI*QnIjvv2^YZO_dC9Yo(@5Gj#>rnP0O|&0X(tTOH=|mdYL8MDxk7oxq zrqGUgV)^Ddv)G{4F7*9iUz9hfV_z7}zo%Pfi2DUrdTBgp&=lHWc?|n|(Zbn~s$@aG zOceKTx-Vygn||hcNG z*o9pgX$u<;t`_Ux6vbLW1-bgw7VX2TC0$tUR9jfBwg$`F28B8c{zS7Yc!xGy!#}2S z`b-2EBzj=^^>2B8W3MT&xfa)JHbp&4<}fV|Y)ZuYTq@@}6D8$HIBQXY{GqK~$seUi zaAd`ZZE~bE!($>u8=gfxde&2^n|~aX%cc@R|HP;fbZ^gz;CzrFJ+5y#joKOkWuMFu zM@e#t<O@OKF#g{iVOxv*>hcy=)+aFWV`{S*tyZtS8mWROI-`LeHYipn92`99x!T zld*wCBsc~AA>j9Y2lf0`KzoIYc!JJ$I(SDBm5mc|(8;@GQsHc}HD(M5<8?Z}52EII zEs0$q=1=?y911J$)zV2~K0e-OFE~zf6nEkK^po40?K~6RuNbA^etId#10wdhu@=`6 zf9LW2C?4PcIM@}(OL){UHe{nZI0UT6@vt{<81tW`&cAmre!nHEwLQt}a*BjZn1uaT z9cV{s!%0#!Tg3j7a`!uFC&|tWlaXHBsvXc&Pg*AT*SGXblFD8kmKiS<`!lw}v*`W7 zdfE53BCgEyELy#yUKS(o|DQRYMWa*dW!ZAve!FMUyLt7pGC7{G!Lz7MbiM4E9IuP< zEb{5ipQpUPOV)c9ks1HerSm+Cm~Xvoww&H&%2zsKOBxxwV7Qh8GU6`3f2jW=Tj`Sl;s$%`@%&l{zlPpWt@q@VDra87EsZmd5 zhn>XuO4S1$wteUJvT0jTK7{$|@*Jf#rANjN20`E8z1^U0LPzG+u0VL-z>&`lW6f8) zzf4gP#v7!*9t{ysY8KujqyCBd-C#?Q9&LdqS*=OE0LQ z{?NPq5@KRJfyNe0L;A7;eWtY0k>u_2LA<-Jkj$E~ho+7d{YMFjX3%Ehn6l_f(SLf# zz!IceGGsTl^cMJ;q(qBl)}%|r5{6*;cG{L~Yv5X0U=Gru+TH+`q`62Q^c#r$`nLzO zAIE1+5}8Fbx__UWN1HG6^jv&R$MSewQeGHaS8@;7U5PeVRbltum!>8AV~pFvc6 zaJVKD<~O*c(~@1R-XW1mgRp*;oo!g)!48nq;up?;fgeifZGNZEVen8j7612Y{h2NcVV*4@rFh$%i9J$h+?eZBGC5A?BEP9tN)_+9PiG97?o;(|1 zi&&|sFN{@prtK1p5O*)%L4DtMfZRs0{*XzYMdkMOvTO4BV{n{j(aApbvSo5?u+_6j zV|Kmlf_y%Du-mif>->6IjvOnb@%7<9>&e5Zo<)ihzTU{o_v7?bPVXznmu7etod8~5 zjvMc+b@y$l`-QZNgi>m@u7xMA~_zT|jQte5b7VOjC$ z!=3?ZLcS2zziH6?yu7KF7;6*cJ*{!FJrwr>*B$|57!Us=+Ow{1mU%O;R13BkmXBZF z(e~zo+JE?CFZMnBT(j|bll*A)$h`PVdjH5@=`)?@?D6k$UKh`wmRyQt77YdT>nA|{ zei%fvev(}jPL34j6PVL}4!e9If;tsF6YP7inam-*tq%I zvAt^}64=L%uVvrjbFsWv7{7mG`ef?2cQMi%J|wV)rDJ8?vtJ_pi1jG;{csiEV;(~K z-Ig}&n`QITBySI)eXuUfjrA|TD~sm$d5Tk}x)%HsWL31A9D8y9$jg8IBg~QG7aVUB z{UvNT_m^zu{*t?*zl5#k@+?08E3cl*)B9LOZRPS-nBJn7`uwYp=AfHW&HuEgcE(Lv zw=e~mByXRd$t^O?kAJU1uD@P(4bkL#Lz&t-Vf?azFP{ndh3rhkF(KcJ{TN(Lr}~d( zGoNgx0yZ=n&zxpFrOSSQLi;g$UO3p@ctuk$hv7RKva5!cHxFhTltpYs? zT8HI#ba%$wS%VfW@txmz&WM&f#Iw7{#Q4(cHi}GTdw14tOLO7*FzesGBxm$n>fK88 z?}iM}{U82`v`y_?HvOl+K8BQ&;aTHZ^n)m@FD`#Hy=F0uJuDRWGwX*hqi-*&FwNn< z_M=Yc7c>N6lSU;F+y&#>q ze04rXh4O!rzLMS>b=j;S8=?JRIxUmBy8od5XNDl27@kPBdqgt(BRi14`}O<9Li_K? z{cGJT6s5J`!RR$>Ia%&N|$5<#9vI~8)0`zoJr6ZeD3`=?XmuM=RIow(o1 zyE}qSI@=P`s?h(+_Gtbgds_#>=uf^vd1gPt9(wF`;`fR6M*o{IwI_^Cg7^z7WCFcz z&U;#QI}~>94ie@^-p2|GLayl}y@z-nRluDuCc#2K3#6|qeMEv_9Ml$E!SVvV!{vF< zb)k#UK1QRKQLAbd_Ei4;>(CuJR8eaR>wc~`w#O~?1xbE1guUV4P~iOVl!X(SX;!dO?vBgk=0Cdh36qyjnhAe6zQA zj=25`aSr!yU0)Y1+;=bZA5-J}tvCOs-fKku!5kl6^_$$`e-r52<@3$NOWV+fXvyij zH~c0ic^v}%ccBxU=JgkB5cwb2J|IWNPk`4d1CZZ>>zB8$f$m6dM0v}3`Q(H~vf@w! zmapjYfRv1zz^tyn$LBNEWIS}3@|0ZkU4{74TzBxf^qux_{et|xUc17dl5gZeGtu4_ z^tsCQSu58kxyJ+YCh&XlBCbP|ez&=Po8#tCs&6`$|IhGFOiTB@nECE)?{K4VjMc>aZP{JBjD#7B$xdqqWUp=rqh%gSWH1C?p5N zP;2ymLX=rDJ?{|-AHIq9QpMU-^2#?7q`F(NKMw1zAqV%nz=mZw-dVuZ)in9NggD=y zj_t4Bypq~K?+W{%| zXS+$8{GVJV{``}_P51P(pVmX;ANrr|Z>gG_2BdH5!G!+maLWafYMRr#n%xoK=-|Yz zj=Va!UGIjwfvU!(%&2aPo>M z@9NK8B;?~Xi0O>}Ti9=3L3(VBf-9pA;CZb~gFxncUKxtV;r$>`a(N8f+O~llFnNvR z)s%nVliBrQd!pOm_%kljU^^BKW7j4I34IO^Vr|`8?OovZiH~89S-+)rZg)PX{)3D2 ze2Q%vxBY{|e%Ta{?w0QMRnEV!GOfgHR7=Sf`FU6Q^A+;WqI~C;LPybH$-!nTpt0n}; z+o(T(NQ811$Cia?4}o&~4U(tHd1T}ae7_+7hCkDvlSl4|gkXOZe_k&cl9)$tisczwa*6D_GXh$CE)wcz53DW9YWUgUT#Ko=e&5wQ z=I+FE-;WNC!u5aMiyAt!WdN9PlSANdJW@lN)s2AgHu;F(I@FM)s*&LBwvPyO!^5IEe7EjvGqMql>C{)rjoLwhBck#!lOKP=!*iEP{2d7$vZ63d_A{%l3= z&wj0b!%>hwct9dEZ<8Q_JsEhfU7rb+cm*!hKVi?-9 zZ1B$=#FhI_dtBX)`hLw{K&>9zG9_!=@3O?i?WIZ^Tgd|Mitn$dbUEo$V9my~w?}9(nv4uw{?E$d+z5J+WYYACvrbmon`skBHm`$8Fr1`MWv^^BDRV9 zEa|mraM|H|BLAwHPN2BLu#D&TBYi-p7Sc`Ltz0ME7wPRk8c6GFdrK}{67lKTUE!!? zH+gQ`8Tl8Sc}IqaXo2f&QUBM=l1c0Kw$NP6FJe)yRgxbE4oVE=^;LX5mpyTSW5r4g@;F^I|_R;p*^>cYq9M&pOXz&aXn&YAN(BJCMG*H@&9N3 zLVn+u25`~u4pkc}&fk;Mb-}C06Y}7Qh@1EY+2X(ddEUwPpt*D8mQPMi@;eu+G2fvN zX)8U^-fPV8@40rxvZnQty|!9ZJS%9N8=vn`-aIcg)^E&Kn((6!aQWc+CX0NGT_oG5 zB<|-=Ts}`uKCvWAcVNCJ9FiJ>-&-mBu|~8fVkCyp=A9Jk)^5e|VJK-utzw_bhKc@Y zXxl%YIIgjU6Jop?98K?)76e&b zni4$ujN<_o53nv9>b^wcDCV=md6RDZY<(8-ZxrcotdBb%h8#YdRBkga{1No!Rr&3vhE%Ok^JLGSF zN9RUpvg2}nl{>4Kx>~Ed=gZ|Ebzfe#BISA6K=FNm@T(i?OZx&+T_47T{@oVPoVD5X zgH&cZB97c|#TFjr{?4hmpMV}5YaVrjpxHh`e}ZmzH`cPX32YA8jo8y_H$Bs%8{HZ? zRVdH$cOIbo-sjPv(6NZW+ZjTYg&t9f_dz`Vo(`MTs9g4J|6s)J7J9Mz40Ujk?Iwc! zEx+Sg%xV*A^m?f4E6G?7EYGH1 z2w(-bRoJ2jB?3R|&Gpr(4x(ze@8f=AQX&6d%))Xq<%pQ?(|3z9beXF_t{4x;{umnR z!scv!ETjFz_pSLCJ5sRFmgqTQe1{pVOQQ<>&aMZi#P!*9aSE}uzDI0_h&Ywsl`<_p zRrb~t?Om4nr<(NS__Z8ctF|SP@1w!8W|`1_Hc6!|sa_QfUH*JVyh5#pwlOt=X-mcV zB3!M8IB^^*$8QyC=+jxL(tV~8sIPvr8loGQD%~!}Q-r%ZOpKVpG90h0&37|m{E6q| zo?1qQ`doPZp{s-0mxj-Xf2q`v-JIW7&Tj>S=+E`)wwi#DF6jX9ZeONbo_Km7iH$EC#NCcj_notdC7j2IUO zU;27b^(Xcy|M4k*Sen*`eLF463$f}2<;|^`R|Ba{axBbYu?Bgw3cE<+s=|oy8tMM9<0fzibrA;-6liIUB|LMs-(U z>KlUDo7tHtpWD~4ebF#j9UFlDxw6H-NLg|a)Lt+Z^kvmNPj@tQfKB0Oud^{$y%=k5 z4FT0lv41U|J*TfegtF-!(cWjd_7$}I)~KfbV6K)ja{0kn81A+S<#|uvFFSZE5fib1>`I{GH^30JS;7!K&NVA#hpqDJJC%aaAvW8}>$vm09 zKnJI+X8i0#B-MB{jMvG(cd*TqU2U;n`uYvpLqfcp%`9o*{L2yVV+Eb3-fY&bg>+sj z#&SszKy7U(|`>R_L=`y8F%BHr&hWw=asxc^~^f&BZ5 zmn&b>b|K$nk2_#Im^o%2lZEz zdZWyz*&Q0aZUWZj?qVqQUe}HW9TDTJ9osK+cb)oBmLG%mE!+NHLprU}l8l}&k6-S) z?Wi8#id?8p!2W3ZzEzl4u`r%l)Ay{}Kk9C^Ww4<4*uaDkL zS)9Rh*^M_M9$Du?Zz|i+NSE2XF8)2DUEXBrAbT2SCHm)ueC?J8{>|4;dh5WpF1;%? zmgjRv)~m9%4^-LM$?dUzTNP#Idf_WoI4H*JV)^~(Wfn_Hw(Ps-F6bA*Ls`^YF&-+|HE&~L`C20U z2=`&eu(zvENo8fCf9{2n2UGq+NH4iQDLlXExW)pKua5aa?5h^Ql7P07_oLAt!-V{d zk*P`U5WfKZOT%ss0_))?NMid(sLw=;+thxbAAGgGjkq@X3_bp!maGdLDzum1{kiw( z&S$Dk_L-0$!gziN<@q7VuP~C|f5^Y*N#9Esl5gB}`AL+hH^xp`*u%&LjBOgQ9Ut69e z5fVF%Ojt4u9%Q zn~CAH;fOn3*-fpUWlN_9i~gXO_r|gB_m4>3)gGZd*;rFHb&xd}-xhI~F1BpREMw}N zgYyv_ZLno$ELCaMb`e)(|DfBfo3Y495!Xpuvwpp&(l{_Lhhp6C20} znK$eC`~vom#lzNRHtF$f;Abnu1GFcUbd6dg_!k6z{!g^u#ozzMP4@f$#@|H$yS$B7 zM(L72huysXmCsp(A3-+CN7PilGv{B*`TNNE|E}+ETvG5zw$zi*#b4%#?ag>5Q)xd; z7NsKY?_2kICObMfSGqDuoG%>zqBrvVr{z5VX`=i-(#ebN5v?K{$cr=uK|dj1D)Uk; z8Mav*|KlTWkZt?AuzgXcsDJqbRcLN!4t5K~@$=PMnYnFIg8_dmvApXjcQ9M>fOPxZ z3i;>WG=mWqpUJ^;bHp=O@b9B)wSz%>^#u%_Z0*>v)cYiDkPg!O&QoL`OpRgvCnFH( zhC9EN-8kpLI`zi=HEd5Zg?*+k=mm{VSiac@b=gphVAlVT0%C!_pVKeO>55eb>~-N2 z+P9=D%2(k0gE@ack)J7X`WsH~C#M_p`fl?2ti<|QV#{IFg@1!;`)562{4mw8KWSdW zG1|o!<54{KM33Db=)s~Rw;?@Z#9?~G!IQ;jstfuv-S4if)vOL|i^&3{7aUP%*Df!Y zn0F39`n7$t>BG2#(uLvNC&Bsc`uh`ai=l8kL>6qwbVhc)KgOq-j<*KcqU{5Y zM%X_rwXO||aU!fLQQZISG;B?`)TUFnwYXnoQLWoEt>q8t`XL>#zUVzm=&y>&@NCs0 zBGfl>Q3>65*q``SiSpao{-)Zqg4vRc1Hyd5TpB2~9Q>-Re$o`wXNk7ItjFL4e(!<` zwrA3gK;{}=O#RwdATE3!&(th*WJX!Wh_${eai8Q+rd{JBf>B}x6FspWor|Cv$t7drUJP5NEi8|!bWWi3ATtbK|3?2PB*GM;DPFwZClVC5G$YdYmygZpcyFc1@hi50T z(4k+-N`Fp5`BoVLtkPB$=5-MF!-n0W*tQ!dNx17Rq_4Oe2hm&oNLPJh)bH@EDKOkh zMvcQ3<9^;EYYdpQETY4==~mGGnbugI@0UTlI*9bLoq_wapYyMh?0uoI zbQSs=A)?iI(7Ikho>~U+K1v4Tk+C4NT0_>I=};`-Sst6noKG|1Q1}wOKW6@q&a82! z6#BaEkP7q`pI*{0UkAaRUxldO{Ck5)a_KD4x@n8@#D4$x{+@klrwRu=Zi~KOp?~;& zfxzzzq+=D9;eO}b*;v@He-Nqk$NVR@)+`bpjhRohPi+_Evuzs_;hfK9>72V4h4wSQ zs|hf^RWoTnqh>;VY;$mLsIOFGR;A*8Vr8c;kh?+3vS%(9^kor+t-yP3Io(t!<_|X6 z=c1nf+UHI9|BGI39L6TQJte)n=%ap%T{NjRkMF(w+5(@ygvaj)kKfG_<9Cd1*-5hl zec;1+aXlOBOPI7(d&oQyjQTGar+kd-2}7=27XHr^Ep>&y0u^Oc}o;|`4B~MKL7oqf)wqs2JgY*dhE{6i=5%-MP`fVMc93QUPOzZ z7omMc|Nd8gz9f9DGd(4qFJX`P`IGPb{K*dS{0UR-0`UI*1>*cmNzezjm^G5}s^3(V zpF(1-%`fjZx_kWS!;aepc@MWz88G7C zhw$@9@J)Lc_HWnpIYf!$Gg=~E8|6tAR1@h#+nLxN^_w;@qvjY%Q^))f_G*SFNmfjx zx8(HCH*MJA%g2a;oW5s@C#`CoNN>vN8>e}aS4#iNGpe;=t?wKoFSSH@FS-23yu6OQ z{7CMvQ04v#=UdCsU!k_c!QF*_Ydpk9^jAh{?WR91rm}N;M1M|`KPF;b2J%07-~?S0 zZjd4EG@0=H8t&?_`+Yx`RvZxhkp~lcu?mG;a%eW%+ic1MCpIts2I+2&{H%O+FX+B8 zm!$R(?eP!u&7k3Sr2D-~{ZZb~Aq6DqmkldyXM=d$$O2NA*AWVab`$yw{5u0o{9ehw z9<7Xc%m9EFi!M`x3yR1e(xx}$U24r5U5*Ry7fdYKK@WCU2m2YgzQc4r57@q1XK(?g!0UBUY`#A@~{8jhsPf-@c4tOJpS;veEV@mOoQJ~bH(EXj?cgDvtj-Arr>=xP4}-j zt=We6)|l_W`)inDyc4+ZeCWP;k-gCWY}55qe% zLs?Det5S=z9}u@FvL)e%`jQP!qCItR?FH#9UpuN&DcW1DDq^T{%oF#CYeakJR8cw^ zF?u!)QJaSSnZf|1*COQsx_h!+*|Se&gpW z5ApMrPvz$;o%ngp?)rMMo4SsKa(b0WXGRt8Xti%T@%9eH_6{2A#Pa(NlWlaeM_kbN6Vc@L zJBszQ63cq`^5l5dKG_@JX2H%}qvKN~Sxvu zg5%t_er!IC**2~e>WBMN<`M}+vS^Q8h$Hvr&?7wGFaAPr#G_-ye8UriaDN5%=`VOL z%n&BIg876X?Avp$SUJ1Txr_Fh4G zt9HizNlo*h3j*f>GZF7k+wp8Dy{tbMe%%r8Z;Mo|qftEq;bPue!ppNgeM)GbUX$RY ziFp32mA56cNnAvOja`KL*zG}tm|q2p|49u$88GeqQ(<9aC1d zXLCa@2=+8$;d^y{p+;zLx}I@{C4sf1h{xrH{;+<=&-&T>fr*ibSFgJ!-M)V~9C?cK zJ=>(vo!|AW3&W%@1pU}hp4W7i=WCtXisOUb+C2v(W4_CN?~!8vZ{+s)FK&-F|8Wg% z&?fslyKWKUZ=Wkk&(~|qj>*rjp5o_UQ~CMU2>JQet^B;}$DeD<+RN#S`FYsc{5-6x z{5{QPv$!v~g#z^p_#l zpZh?zZ#JJKIwcAH!}P)jvAi#ziA+CN&>#A>=*s3>X|RQ_ej*+bmM9&PoCGSFCk6j1 zs5%akE=o&+md{mW0zMe8OAE{Uz*qTw8%|v$(%$R3!PN8kd?8}ZHkr%5MCj|iP_PGK z&2vTBtgT5fOVbX^+YQ=D=M~nGgzo5HfS&q=vW2%hK->hhpCOQ+Q?opk2tK1ykRJvp z%6yLUZw~hp?_b#*x`mE98^yBpVo~22wR5D}{Qjj~Ch5pOan(*)mR%yNv%z>H|9<;G z^5s@E+x0-)&-bu0bNkNELz{^4Sk~pZ4;jesf1=NfaeTaeX)e=>aAWJcit~wTz$iMT zEnyz1?FBldrR$a5+wI97dUis7+xw=F>f4fS(=cM3&b}-hEsg)`!8~|eR=~NNi)7>Z zov%+DLlDzR%cwQae~lRIi{A`AO zit=m}qKNC%DE6@1P8@#+yNA+2eEza(wFfi=b0ty-Z^!*gKY2XISsu?(=Xk@qkF;+KoNw7FzFx=j_;Iy7ew@ki z^_L&1;dOESZlyVtZENp9TNk4J4o}RZnaTMi>Bf%Oe{kp(&sBMsDE0pFSg0QolQo#% zmR>}y%|PM#z`n8VnBhh{YU9@%@$#%-cFFz>ZFhI4pg-jE^CGtSRrFOe><@TSFpC}g zvZD*X?ryl*q%HbpVu|TgVN<* zJs>O01@YUPIre&IQ|+4Uy}xmj{nlh}c8Fe+zq!TsfBZ>*(IIXBPP^>S1qDt1o+Qmh z#YX?yhwwKR>JcG{-5?OSROrB*yq~H zqjGt?&%~c5Y&d>s(G@Vny)2jUH=Tu-w6q&;%l{?EX{CnGF1x@<;E8DYIC0EEu z5A+AKnBgicuUHLY_&5Iq9i5Cj!sI!j!19VWyF?`GlW;C zMf-2&FAFF*`!cOb3egLwW6m zvQZf|WW~G)q(>`Sk*nhs!RMwp-rYW1!(!u~lK8G30v&pP+fJ?RUy=^WB7NK9GqgpZ z54oH_0n2ytqSRnkE%{<3(zouuLdK37NjDr4^@(p?Q?{#D9d#QZ>i_8Y63Y5?0{sV$ zSbj#k;nJhSt`e_R;`?_!=x9mY$`JRa@2}M6eUi-^x0ZzWor(OEhLLs(hiHDIsDBR& zLSJ+|K{w77%b#u~r88$6@f`oY$ls`%D^t{yko$Bl;$NvuTHPXp<~$SS#Z|1A>DsQR z=MIT@x0yEW5tc~`t)r2DzDJGJ*kUcoy(rQXJ&I&YEDfboYZ8&3-;du-mgyu@EQuA? zKXxy8GTeKgOAIE6^KrnrB={yZkbMr!M*kL%2a-I$8P1BbF-+jEPxOcMh4rMz88N@} z+rm-cUGs?M++Qw?Cnnq%XI{KOmiSye&m%mOXG?ONYyV6T>@}9MY!tJ(_K1uvLw-2Y zkDoQV;3RFf8tc?8s@6K49Z`w!ZmEGI&vhFy63D zCOy?$8|GxAJ@}iK|37rSc|eZM_XnI7*+sSrDWyeGwAVG0lrLKkUje@OSV#Ei7X-Bxz604=lOl#_r3qX$C){E=FFKhGiR=uS#e>RFy|4^ z?^WzYw?;lE^QUG)dYiEcw7Swl+M_+xAD9UR*{-xCc;CAEroxcV_u_UtWfkWcgBocKCJdX=fk?hX<_AC z<)p96P@wl`=fP~)d9drU^I&}=9!L%UUH{P}+4;D?=f}RXso|J^*N@bQtuHPAy$^`4 zpL%w=)k)74O%f5E-7hpff25t|1$@aQdK#&d4yh2Ia_b;Wfd+?{`);e|H6r|URW0Ihur(m$D0wKPgN_~ zON8mZ_rQGq^~3y=lOiO&72j;ecNR+lYQePre~Ni zjQ--9umEZBo<>rX!`u6&?lj?LQ7y8VH4D<~GJQN``p}o{=iO%YS7P;_$Mr$CG5rKE z{hXI!19slvGdmxkC;OiN?#Vr9pV>VWHo{ZnhmX{@kkMKSbXbEKVD~Z8>|Rfqh}$If z1{~-&OOhzDplbH89>?lOl#BJH=CC#p^LOa^=;XW7?*HKNrw`aYU2I~rwh7_`^ndaH zoVUc)|Mz?%wn(Aq{;GfPm#Sp;mdfnSN*1qZ-mHlaI7`uaZxfL3V!jsrFut7h=Jt%c z%U?&%C=`A55Xn}`ZKOWC66BKi~h-QXRnW#^;KqhY?rWP-U1&R9J_Tu%ZP^_1U!tV~B@ibVV! z$-{hAL?V`x+X(ON{KW_M=lmaBY$q?9qj3J3nFGZ5=Rf>|m0^E}2C(->E7|*_dSAD~ zd5oD1pJ6z&Wi8;(S})Pb!K!$fJm`;}Lm!F3nXYtY4EGmq4+dk&xG=PWpO>e}EkkIp z#Q|glKW|TKZu}6ktEXaND4!o&SdFD|dTmhUdvzvDB7W4*hklV0OQ9 z;1lkjPdob1huV#T!@%ESdaChh4sCn5-maI)1F<~1PN$YE4H-%v9-RT@ofOK^{%j4T z>ogDe9r1aNz7@5>krxEO({*Z)%1jO1UyFawvoK*P(UO;&4a2#BXPcD~u?|&B zd3~ENSWs&POKEG(FrdpM7r!yXqP~w!am2gF>9Bu`KX#u+-A%M_>JgM3JPqg{hDVuI zbtx40S^=+{u;Sp?j_~#o;7yuQmUr6}ihTpH_6jGfu|A2gM*O(>$P8|VMB0Nqy<=UU>A#hVkI%%-WQh~MV} zJ$q1UQMYM_kN?HnPw8UcKBDdN^yV|Vl6i~8*cZnip6?bMoZI12b}yO8&#Wbc6t%{P z=@UgfP&k(iE~-;$L@0oXYZ?@Z1+$85nFxe z{U>eyq4#!OP1;>}PxOAdv;Sk~Np4;tPQOp0kq(?+`(4Ux&C(!*>vDPaJV>Bh8#)Vr z`Aanw=mR$=GG`>uuYX+0N?FT_eyBDDe&RcT>`g%SF5pe*Pohw@XD#SXK7LU4J~3kN z6I1p+G4wyaZu<9|rN4Q_Hw8uc#P>(lOs*68V|Qfy{%uo{zVM?B`7p@=NB@BJ5v^kH z463O4pqp1NLjK8L&FGR=1 zXljq1)IaySC=dSK{0YUESkSN+ke*JoiATR!dZ%NMp1OpYVfj8iX^t19r|pklC4L1?KOoe+{DBBi)F`P8+D-sisbJh?ktOU^QRgOb!@BJB(7H zIy(IOh1gS`^w**nWN~f|=tm)UE`7WBn)Ll{US1F#Lw-j*B%K}kdgx?Qe>y7a7O@&T z82DSsHIUJTbwpvOqgY?s$*MPvnQTS%6U#xqCllMTIiV%J6jKNMAAO6U?p=41(4Z8E zUvz0>K=Zbm&{19UfIeD!kx1HhxJd4F9ZtQB)PUdGXnh)Vbudl4bC`(rEm0m$yKWy$ zGe0f`{A;r!J*8<&ix<5FoZjv_Ib!cl^Bzh7FYAHnp+;T0W-b4IC}X1rCAOxtX21oY zJ6a5){V$l)kIAb5uWxdoz369h%=|gvh$D)0ivMPE;IK2u^TXGeI<{3sK~gS1R`;R< z9er@BiBkmGQ~GD(KQ|-ru8iPLhDYVESnj>~GM(m2R{=p(B;g z`pA4lB2~8>Mi04nqwZgyArbdlK8cD51&uKhF$(zn|8rwcqs(|eO1L4RrJR!dG)4yGe!z>dPkxfup@vn{3}!Q6k0sToQ8rS_m3eyj$%t?e38+TWVeKLen= z&Q9H^htn8(A$d6x%lEE3OOlgE(>IQ-fY;R+&_P$({=_VP-|TAlIke!yMRL~61o(BH zq(HBRjHTmCk3jmC+nRL$Nk_U>Q3dd(KH4}JpY63%JrD}`Snni3cflRWhB>g_!Bgs%A^NO0smqE2`i@{`Gz*$3ns#lX^{TT_i5BJPAajNC<9*U>x*;m zc9hnQkrOd3VC@q>eX8xG?4z*WX*e_-JL%;}uY{We{f3t-9{8>vEvh^s)`$AdiNV3w zuS=%eE(F|F-4j=(@01M42LANbM+^FVK$1k2#ZkrjE^e~G{q>S0vCQv^`Io(Qq<_v> zN&6TL1p2pkj@b0DmDI`rF#V9^g&Vp(6qas)_M+)?{V=Uy@xFvqDDTthJmTEYA{lN8 z?ZeI)9!CYwimi_~LVMCBn*LOH6D-j!{0!-b=;%`cSL0lQxvjDJO^qBToQ0oSk5!832OJ7@R9`hr?%)Szd98aRJ|Y`tU5)<;bm$Wyky z7{b;+n5};zW$T}hlb<7}vNl*zwq6?EemN?%DnqTZ^?~Cs>$0EBhN3i6A?C7xm3RHl zO`^@q!vlKMpxC(@bR91b?>8z(>py6aJYF7t6Tg%g%1cQcFAux8K1Tz}+E97fdg%!( zZ;fRc=_gxH=@{CI<!ea^A+NwWs>k<~}F82Di=W6%cyA}*gh3#ll0(!lw!9;cHx2a-ue?v!fs^>6L76-3@GkS<6q zhV)0%&B=UwMCAwb{fO#m{n65Gb~G$wp7e->-$1@A7DdOOn7|Y^jXOdY;GpLn%74Y90G!I=~J)7RT&*IW7 z{rfgK)ad9>8+)$s|KJ z2oE#mcwSHs!RK@Wb{&0DB9@=5w?eS2iN|lk(xALK<|_nqh7AHZ?oi$b6+Dc^ZaaB< zJ}k^ZljJ7j7kl{l6?$hhVq4C5$4)+e#FIo)Po1#pI6lABWcyiv;ytl@QXSO4wQdp_ zS`mpeePI8Au5zi7n%#@Tv(oCI{5Beckm0Hrygkbd6y|oM^8BTC}qIB9#APj6WT?sgbNoc_xVZ@hEnqCS5{F59c<(zxbmOb+pbS1Imp6 zcUz`RZ*6WzH&pZfUG`Rq8ebhk)wAS*ZWcX?x*H6jT@M@wer`^F)FhBA4KaYi0UdF-wh*A?%AOC;mM_L8uxk9BPNp zj^tQH);<~qynW^!az-axBJolsu5bVQTf}h!w+uQ`EY?qBpEGg!5sCHx%mw{UZL^Y0 z-{Xa)KCd`l&h>jlrr+v%uKx)#{cjkUgBq8+W5n)l5c$dPb4Ftszil#p7v4-F#;m>d zJbC#J;p!z~>?*mfI>c|gl?EOc<&j$Q@oV97H&nbjl4i*9^e2+7h%WO_4+WWjQd&tW zc6-t7GWj&*SE7M?*c#54%WLjC1sSsbq|ll7r*p1jh#!fhp4nm0-qv0jbGo@D;_>@4eBHP2{`7R zJwDVjl_aL~_(|t^)A69FY+~ig*WaVA#^A}x1BiPgoIj?=*;yG2xhi4T%X`rN&-cv4 zpDv}NFSAcW`NJ7M=O0tig>+3S>T|7r4?L2+KQ=sPEZ|;OxqlP3a{m@HHG@23^;tEV z*Joz5LUA1PpYvt@b4U0Zw1fH2H3i&%zHYHZgZD0^qsESh^2%C1$o6XZ`Ze6DRr=L< zAsu^aG0>lN9bl2Yd_KFctrD<@$tIf(J%i~!r|U?RuOX3-pIfr|_$hMv!s1m~_QS#c zcOie`Q#69+Z0GT#4KdloFqnORBGXUIz(K?-J%$!+F?q>& zF7MmIdNG#Cbiw0$J<$&#Gk77bJ+lbp^R&xGy%$ZV3!QEN&I=q!{MdN#MBhZjc%E!L zSjNW#{6G4_0l{2f=l6rYu$HFq?7ubA7Rz8ljZ$l0qg7(7tGfMfs#p7$@-#GW9E{mtdP~8hKzTkjG+33@}>2$C& z*bm0>zNm)HPpY|onNGQWv$=lpFnO-uZ@YOs?ZCB(;&*EQ$k*#&sm*%UUOBwI@GXas zvaEmG6YE`U795!V(gt$*yUE5+Pdl93DEWp0-I^!_p zVcJ%+DyKo`U|>Y{BQt0S-TeG**7sGmC)k!`j=0^@qVzczfT` z;^iM5%FB;)?Ip(IX<3*45ThTfF^K4|ilLraW?)}07iE(WmVbgP*gIai-I)wB9ZBQU z`!O3}@10&*bK({2k2_@hkEgddqg0cTG>+XPCel^DeT4pWO?IB2IJHVQv-atJYca@2 z=MS=|VEUW#t`cyw;{K8y!SiT|?j#iI`nZEw)1AWoQ$CRwv zGkrD5;@hqJxxPm4;dIAeL&z|uuL09WLVlNcgNlo+zN(v7fZc4m+AJWZuSo4!pzmY$ zTgK#Z%oOmtcO1GAuhtd4St|EWK%+vJQ^u=?-j^{0vpvr!rA zZ=EJ`f1%FiA9_r`tGIsY_QVSyNB=n~(2g(aJfVM8bA8b*(~OA+lmEvhXm2_=HkToU)uQq*Vi>}KmRX%`R>XgY`#UqWc03X#$+lh zuk|V~&#HQvXcu%NzrTU5k~o$~{%tS%li7PJ)8C6zU~jas^mOrm_0@d`x0fhxFQUHW z{;RJoJN?kNK_h9!H$K0%Fv_sIm(r)8yClD2bg2!mU-5=cD5qorUDNph*k5IxF8a`DNI%Hi zU{PK-rA+BLVG!-`d<0-ywK;aFZRgNqQI8@0hxMJvC6+&`6VD$|yI06({1dD=f76IT zf`{5%dQss%5&2!Z^Fca`-ANMZaUSsXDbJ*_Q-Y|zN)_;%@tiI=2c{zXU+hdMh64S?NnLhdksv+qR zI~w3*0Qxf8$Nj5&A@>I}9Y&(62~N~zw+7H{_C67U=37&f$wL4iJd%OfdV+3C;`<|H zfEC)w{LeuX-k+2`ywD(a|FC9t8tCilv2^wX-Yj~gsvPkBk$Z*52JtlNKA(?o>^F#r z{oN`P{3*p#w@C+1il;Be9D@0okT?STZ~dm%(Eo?j`jHu4VN_>e8njQ)nKaVv@^~89 zt|JxOZ+~nS=`_NdW_^1C^pwu&B)@bPHT+Nl*tEcz=rI4(ypsE;+(ZpD*h!!d-}87@ z({c^O)-!ak41Wt%BW!+8=}6EQKDm$k&)wXA;-^+4iJP+%y;A`C!Ub2KNPh-f(vTZu%6Xksk&i2 zRlfrI!mrf^Ap@qbec62cDVniOcH)y=wgB;cAY zotp#kGiDS2$6w*TZ`u*IKBP!S@4sXtdevbH9(d;q65HpQeiAC$u83#aOa^=MT6YW? zKAwh;%HHeFD?KCa+#v_un-B%`g&nsDvo{-H=Q9ZK1-zGdILYI^uf_xZF=#mncOJ;r zr`CW+EbT8evbTL*OA}yyy@cu#m7Gv~aOw^y|C7!vq#fplb-(lVo|ferq0wg%K09|Q z*vF>Mo6%soj`+|rzMo=oa*r@?dKQ}gg2!8x&&)x8zUt$snU++n&xgX*#K*`5{|Hb7 z9JHiBx}n4X*QOxA7Ry(XyLwac^dH}V|IDE#cI96a@Z3jJKt8GOeDb#UPt-}9$6Es& zGl^HwNb0|muiuTHwj)ECKD(^}ebcS|kCGp`6Y0QPUx435cN>!C>qt!!xjif9wj)DW z`g`kS=_m5}W7>GWK3R7~i!5XF@uRZ!OXD0b5|9%{B@cLiQfWvcQb(36HR7#DXe;qjG#&oG~% zUGAiy6)gT@8NlN&AurNk{iqYh*N^4O=}5}@tK4TEZ}2(D*Eh#9)S!J$V$Deii|?5m z@%Wx-f8u&)wQRjp9meB-7iIL%+HNKPq2p5L{wSWs16>j!UVz8FT}5t=73id7K7Z{o z;I`o8ZAV)@2aDygb4=!B9xLzWP$&;aURgopSiEu9I*2!7kH$1u51*L_^5aX_)5xw% zWAZOc>HkP6Nn#T?d!`SzNno6>nq&JW}9?6)8EPQpg(M3Fo;ZJ>oLEzW=Jf5 z+?G*-5{nmBS3$fGf0o4)8%-ddi2Fp1K}sl+j){m7+Y4{{#OMDnU0}V2w=#ddl*I?9 zKZW=pCbM1$?^yh>ekjBb@d5jh$dmc|_q$Owyas|I;@tT#cWfdTZyw}*h^4aQMyJa0gJ3`b0|pod4V5)M5b z2J{irtf}eBOsQ(oP{1v=wsiP62V%Gz#sj>x+a&s;#|qN31^PGsI&K;*P|YTJ@9IJR zgLy&p{lp~F>(Xw(ce5AKfr1Ii?qLsj;Hx-#Vdx|2oC6SF!xP^v#f~1uQr|fK9<-ds zA{=u&{|g>-|z@?!G>l_ zQEQuaz|S$s2lxG$il+KLh4QR*=3;Ut2`!2}2)JcWG(H+*k0!5i2Rz($DOP`eS$J5@ z<0%q$b|c_!w)Blp7WjiR4Euh`7QAh;U_3wF7>FO;%R&l6`FWOJTU>FJ&Kji7_Q}Qi zIDfNXXE>*p4C&0{&xcI=<0MRpod)dZ(9XCMRSRrDj%ztRaBBjs^WGsTsG1Dr{W=gt zUq-D$XYOrABELB^qp91x?ZP=0cMx$8U-mY6m=e)4=!r$#@%Ka;|7pMQRfGH6AZGhY zE$M7;R{V+Ucy?#|&TGu4@p#7=hbi=h-$P_pOn~2xwIOu+rhf|8Q6g)tsd+-24#<*yqm#Y`Uid9o(0% zSJtjC6pZi2(RPR0@%+|TEXA`Z#_Qm|NjfC0P+EH@j@~Y72lJ~`N*n1alt5(2xQ`$0tj%RcuH_rd}mO|+W#(!HO=ifzb7IqA;C+~umf*&_8sE75} zyYsJMUh$}90zS&_BG~W2`O9r66ckwg6~}n_TYNO>wKo!CaRlP~xcI9DO?q5ge1W$o zw%z1PwOIVFC*l4i@?9Y9ekTiUHU@jZ%zmh2YqpSM2KIt;baoSK#SmQc%o*w*nW{~{ z&1sJ#ow`8#`S#z1ifojzByKF=WR=fICEEk<9k3kIUr8HGMxI%M^`2&e{oNn^9u-Wr z!UNC3{vjRl&H}ABT7q+1)&u?HXgNCZnLa? zB{NqIxAkk`^OLVOsx*JyE$Nd=7f63d>dMZ4Wl1FLI|$L1t@i}eS(nX;aVVb;zuCzi ztknn?^gk-p4Xj1GGIkq*@7^5yT^Be_|$ z)9y}f0;J!3)&%)09O21mpNZb95_=%dccT1qWGs+ZAq9f%4zS zx+3}0ZzRSteLAtbb?A{_!V|eEKri{Y65aYRx?GaR%bPTfy-i-DM^X)Vey=~E1y8I>Z zN7{Z4xaF}99s3RL!=bSSzSzFzInkuykp7vs12%o8Ll>!?g7i6z?!o98(r~cfzwcvj zA8-%)pVRC=C^z4mj^Fwd?Da}$DE(Hof|NZD1%6wuO{XudT1Z?qfB$gi$otYCYvbw5 zQ`XRrGsayIu5OK|hsO4R{KZj6N#36Y)VLFuw{$bR@8Y^0{qtOj*Jo9CTBACQ{F`lm8wio7qOU8FYW0^j>$X$Z+ zK58i7d{a;AE8iaKcO(4)TEg^qPwh3}OLiB8VkV!VqzCAuY3^?6OTz>@7r%n@TI?lBK_PHPeb=k06aP3 z8gX$9rVdUQVLdseqKITqT0mDWy$15#yyH*r-D)IqsVAX)XJs9Fbf`UzKB5EsKfj$y zM{Mgvjq6+3;738~JFwmElKN33asS`Y3#9^`gD@zX|eaB2B7d0F3nPaLr z(Jm3?wjB+a`A2-<*d#0F9|8Yb)*U}IUPi*!ar$PhlSsZXi8L+b`L|nK7JAS~ z^RMfEOgbjHJvmqm82cLJlP}Smh@l0f$C($p&{t|}$htJ(hsS@jpx)1>i{qXGguQ?JADqkZ-}GHr`iO`B(yvaMfU2%X(mM;a#5fkNVDI1dsRD(H~lH&VOXz09|tJHe3Z_b zHVH|SN8p%oeE;aK-$zsu8--f8ctU$zG8~1KzAZu8Q}}!#Rx=vs4cjLOF|18l`>tVo zX|`tG6>?o9U=PuQqcPGhlKRi!^Ns!9!MOTk2;q__U`MecRrKgeAuHG}TGR*!DQ z>H!`c znpRDRMd033IR9Q-9*grw?ELrw^k4bwU&)npV_e;v&sRKFD9|zHQ}BcOFyI$-V>?ld zjlkwpH-JC9r5lRBPMV1l7x4PnY5Ui-ipRZhaQ>-qO8vu}>UF6a8=MpS6kYk!+H$F0(3?Vp)?8X4dJMHFQ8 z^oc{L#?y3!42A&z>6?;BUCMj3pbPgWQ`voLo3CyqiVns=pKvY0ZbX|jyK^77JTXBl z(6#(}(&sEs|4Pr7#^RS1-QUZJ`obYchSMDL9BJP$bHMMtTgKoD;wC#+Af|7)7iM0k^G-Zp0yz8U1R6gwmITStZ{Arb)nNQ?%lO6p znn0`VV$o%`rV;aK<`qf{j2RP}`1*lLYMJpb7Qy0WN+ z?0u`9@v!bmBAxbVo?X#_*+y%(RPZO^k1wd7 zQYr9nH+&+wpfn#h`RxO2UwO5>l$H1CsV0;c(hb>`F#PWEWSHNyTb)-?!tPj(znup3 zZs7;)%(NC@rThvamcKX9wLlKcdNzVO=i82-qUeNl&AI8DExl2JdLT50G_P75Es7*C7b0{0k2RQhTC@T zfG2h5{c~~QXEc4qYP2tRs@Pt%%};G?>@geNyJH9VzS2Cr+i9`XX!S+Nzb8xw-=7;y z`e0ko|AnS#{C(Ln>8)|;M9eR~$97maWcl|!wml4=HeUY^Zu%CEYdf?leQUfI(tl() zbX|4v8yT)05su4J-kmrk9N^`#{6{QTmN0%GPaUKC1PwPo{2%(Bh1vhm_iEiBCZ{)& zPIW$_e0ZUM6&kT7O6m|63^>;(6}cBlDt;?10?gvD^w^6zHnv(GG7D!<12GtR!fRoq{}byLekd&8YubFEVtew!C7+8f^S zFc3Y=oQqS|o#67_Ux0u8-YMu`ECT!^I||2OcVYdTwW7Z8+{z=UW~3j!m2ezzdR8j% zdtA!-g@qindBpg)HN7F)E55i-g?i_Wz*A}pA^k1wG@B}B?=_{B6(ZfjK8AWs))4C2 zECTuktKrguQwi9_a}~(9b$=Hs^>x6CeGU>aeQ`@PU8S+t&T(lb;3~uZrDFXKH1yT)$yU4Kd%7xu?&i5zo7;hm>e$#Pt%>}W(w0_JgV%%#ao;tsmn4iw4MR`6fHk^y%B?5t_y%q zI&?<Qx1al%0X-JVO!IV-cUJ8-lH_}g< z?wf$~ZCDJ0;T<@ge0l1D3%(;t_bf6`uSL|O_Zu*@vneBK)35^OfE`& z@bA!Oz^tuVz2xNlZkLGjjeqXf8ZfvU;J@^)P1=Bqx|-0)GHZNbJltP~=koixu$**- zIEG>A=x}y*D7v_Vw6Z*e|K9ugT?%jT7rjUorlUjDM2+1X16# zq}mea?!H8>KL&l%GxAHYs=hv{eg^ucOh1_2w}#&yt_FU;Wb#hzISIz+Mc1QA;+`t$ zKy&ctG*a#lanWu-eH(fF>fIF=S}?gzkd}b{=xWW`^zqCP^wOQjk26~3sHOT8bY0>u z>X&+L>uXil&HA73DdgMyVefA>5P2EDJvXD#guPY54>Mj~))f~#b!wf|pp^43=syQ9 z9vVVwm+}6$#s4en5aB@D_w)w-vvVx)zF(I<8Hd(&p&I0Sw%em3(YzBeD4r6 zCYk5AxamS&+SEz&WpwR{W;9T_)OJG|%s(laJ)3&R&nLuDDz-m;FO5cF8>^)L7F<3P z^bEcKv6cf=c;K==qJ2aE z-OBjwIt2Cv{SC^Coe2Jc*`FwnT=m5PfH#NtruW=N;q=^Dz^`Srppf7AesonNme<3@aW4k-Mk@^0y zcw;!67r-CbzLfgGvG|P)5A6J$?D=YkZno$A=G>=}uPgk8wX*zf8edp!Ay*hL<3IMk z6MEzGk_7(n1A7@b*ceyf7&4(fw;#<~Y8NwhwscA=luwT?p&6UwKmZ68X$oxCgUAxke8!OoV3C6feOBgp@^zb$D$9@=wd zdvok1XHJLwt_N(%`t!c#N@At75yt1wrxxRmSQ}~V=j}J-ktNfLx^9KzEVb$WvSOut4tv2Oyz z{@2%4f!(e?2C@6p0RQwcBkywUP+$h{kEUH8kdPBSu!SkKA1>Zxa`S@`VuV z3Ap%RZ^)nG^HloljS1Cd=ln!|M^bi3_j{Y+-Z`)ziRW!A6*jFmrBxp|eevz#)Ni;2 zy|HEs`1kMM?n-~EMbhKrAf83<^o+vMj+N3)(Q8C~({n@I@wka)L_6UYV54I}_;r0b z+Bb}^SMob7#F;HSgc&(2h?w60jy`_A{4+YK#N%yZdwz59IUy-f6a4|*+Ak2Fn)M1r zCZt07-uBB;jq*FR(-PL>__mQg9(Df^Dt9x&VtsyX8b~#lmyzR#VLgv?uVxU{6}7}y z!qe|?U5?uPZbUh<{0+nO@f~^y70L1^s45U219##$GzR$D_8Ul}EGtOk5zcStt`%hK z(t7fP#{=*VwjMFeaR%?P=`F>I5OpL~cYGC~n+@8*R3&i=g2Ck0c_^aArGWod=nkqZb`_^hb zy5&0p8z}UG^0MDvBj>ENa1^^ITP*)rqKrH}5(HR!xR-#( zg`!s#F@Oi%tRi<7Yt!9XJb#BFj%DMs{n5zcSfF2Av5lApXQIW85Ffy&d{fEAZ%>f% zF&Iyhy|MEk3YHHS^JCw!>ul@qY_?nYnfu2>8hJ=--6eGA z*mR%|-v7O66%9PxCEfq#JGq z0)C}%!S1yXCR|y<)9+MbwwRSIJW*I6(rGVqt%|X7%H@|ie;Rf21*x<1BAQ>IeEMX? zIEimmj3k=NM+aZmAT3vRk|UB($iL-wYK8LgEs`i1edge2!m6=fNJ%r#AM<^^u)F^# z;k+C#U!_Mr+WaA!v~Ps_=Cm`b**f8^8F06yK?!@56X| zJbaOhtWT?urr8ldPmoSL~?ClTYPyg-+x>5>Mim+A|a=abALBZ_Xax8*4w>np?rFLMinW^ zjgrpe>us9omr8mrkW_5s>up-H)f8`K>+J%*-ln?E7fET@7`qpIy-o9C`=TM;D}@_e zA9TW~@QOs=J!Kg({XL9UL4yLTg&tf#G+^+%@{k8LHdQiu?SZx^?fw<1E!Piq{<(&{ zaAJ4drGP$YT|h_L*+5CEknIljJ8N(it@!4M9AxKBzq$^m){8cht5>MAm-~B1^`waQ8 zsU<^syn&`qHNnws-<9-O5Aim7w`Lw*8ZAc}-Ff^+w3#;*Q6*SWAN;F`9VVHTstj5K z^Lr8d513PO;vjrqPam{LxXLY`V7!S*715O0@$6^=a)q*@?h`gi1sG>cjKm~7UQ~X{HMHKV**P$bZ-yq0kQnv&8{a$ z-&Qdf)4v(e2_Ia47X_8`@i2P3HSxOtg4kEi5X;Al+1~5eAuo`NQ>w@xyLs7DY4}To z@3a68Gh0UFi~0%1{QV$IcJC1ER-Pn|so)Q=R#7^twZ2keIDaAV8>=&zo^DA(rl0wE zOkU~X58=6F`0im?lt=!h9v&N(iwp~ZPUmDsHFW?k1m~AN$Y-XWnw4`46u_`qN)x@cP9wP-~x^;(V8y zA2!25d(`mUqEoYOKcM)CheuKG$07@HlsSy$3le; zUt|jSJbQ=k(z9DcgT31&rtj>%2&LRAmu{Q92=Kk&!>I3+hmx!fVSv3q?Hm@`cM*Go zECKMP(iZZ_JByq=G=;MK7)jjdIa*I5^>&Nxfd#gIVJ$zP!uRlJz|tW-@Tt3-N#TCz zuXu?`4?OPrW|S|(+LvbwJ#Rg+yOF^Cvq7F2?H8IUjatj+R~z#N;(k_+AmxLe4Hk=CAgX56&=NW7RP~Nvethj$O?8^(>u3ANR~b z!M6DzpK9z#I!ir{DBkJ=_1RgrQJAJTid>(+7_g$pIb_}aHli~AiKqMETaUtptu-)T z!G_np*!k6H_Duqe_hP(7T))$zj*TUvet$Ci3h5xumBk-BFWJ$Ye*bBPwWfpp(N_xw z;?6n_*z$B+u-94{wvgfLkws|qsZbo2(jN9Bz55(O3mU_4Rn9tF;HTG%EPWP-Lr=L& zMLg?A0;$A{Fipz<91`1`?$n!z7g(zSKCjV{?mXy@o33jDrZuxEp74Nln^Y!<`Blt9 z=*y}Svf^ef(5GmbA#XMpd|k=?>sj>%;i|0{HrvL}r}m6nD-HY^f+PNvg8Uj%7nFgb zaq3nVzy{2IRrlqh;6vQM1|?S5kz;|_qLS_TvGOurUnf4OCzjKP_Mso&y+Fgxbf+Wv z{GFYg!IN1WNu;l|nlIey8j92D36MwDez;XSAN;Ao7boxwlM9Aei|KcV z$XlLa`Hf}ghdxH;if=#Sjvl4ppT+o%c)z_{sWJHH$7xfjvb#0%U)c`ixv6JFd^{1Z zIjoCCe&2qt7OF?b;o$WCP=3YTC3FY-R?gDtE9n2AXR@$McL{Fk!Pf)Laf|8V{7xvb zvLB>ht?5aJofptd4St_M&K7lA_3Q$=^Md#HX(5lKZ$jO0q-iH8-=CZ!dv9vvst6;% zF1^|JS%$61me1GezN&t-OY&FLak(bYV>Rt*^U({aaUGYx$Ja;Xdubc|!Grs+E$(kf zY%djIKxhEe=agF_8m_Yh*^^Mf-P-q-=2dFol#k;8A8w4I!xy$e=Le^P{F^N13)h(b z_y3Rn7s~WMZOm@a@5!foLBG3SjDhy3Ty6^Ov3Hq*WhHBmA+q-P+y7QPwgvqwK3+n7 z;(C*_)z?J(#?L~R&`5ht(q;GqQNMWJ@gQpcshkuv+Yk{?KNC)+7Hi4-JDQ?=c;?|y zYLY#de6WM~9d0mQKxg(&Bt=73Li*wX-t^wH&%~^L0^mrq$@JpbCc<9p!$aoi9ZcOu7_YhW|D&%JJ|U(b{-C| z8h-=QA5@3)hWLx@JpS~dZ-=g3Q1s8-WxHmYvHeMxf95v#j@2I-l6K5WEL+t7-}_%3 z4p@o)^dJ0POI4hY{e!dTw2C~j^x1V3VBZrvaesoXHSdw^p{jI}vTQtgu8+T;U4`Oh z=NYem(WeU(GS~&9qK{_Z6J^@q$L$-?rC;)ZMSoGw?2DZjBqE)`#Q*pk+&#mF?(Nn< zT7U5L5uX>K`NJ1si?q|Cy-}qyJM5*^Am*o^Z@A#ZqVD*1Pkvv)Vl4&SIMfrr zdBDFvt?fM<_t`A~FuUAfJ1)eRTg_e6Ib(U#{oly9<|`!WG{Iz1TH z`yb{1kY-liv%U?W|0_z-M5?_A&$xL9{E0?ZE!nH-i;paw2lS)8X48lH1dabbA8@zp z?7Pe2?)YurI*>o7y*YK2GsoWD%fUYU+WsLajDM;+ug}pri%F;Eg?Rgqi;&)EOarlE z-+W6u&ja~2Z@FOCm*@LD5YU;jCa(XY=7@f+FqdhLJx zM)Tg;;WsR%E$V+m>pZ(dEWf)j2l6L>{Z0C@{KbQKea1yBCQdBBmID8t@G#Sl@-Bj& zf8+XB8{a_MvHHDK zF~i3@1&aFzw1kyEgq1&P5SK6acN7^pa1oBI;_YSgd=WZjwg~IQa(mMG`5TR6^_i-} z0h12)7_bU-caTBX=V0k#O(25Bd>o>+n?yzJ1<;qYy|Bq`diWejGLPe^Bv!p z`$>#sBJTF}yT~6O^oY0Xz`hNMvPu*6jnC)nk%GL1_|`8^pzlzQ!e^gY zn_l!+1^Gtkx#131lxW&#XTYWT=J-g57P38!&tFRNqwrw)Z1P0P-yiX0=~uDzml~Z# z`KXMJ7#-vh>)_SF%(7?OWfmg+!FPRnrFqp~|3P;}T_aiQx5$-%$)c=u67x5c&aXmC zW%qA7q@P0$FK(eTd_GB+vGs_fULnewIDq+ zL&==>8B&N^oH_luf;qlvScqa>{=d_^GyY+N3dxU&13;eT3}d50Iu8sqStX3%6Woqhg(O>ap&C zFZZ8ARZT*OoNWKdDEB>ScL{%%l3D^GXHEepn){W_H)XQSWuft zf9a@;e7)K{b}|h%Rzw*GyF&h91Ln|mJws3wi%d6!TC1p3Ops$JL+kgFy-WxWcS2Fp%a-&gwM3ppIrk|lhexUmNdFXkB2b5pN z_QxLRhoHg)&VR3xB{pB{FX)Ex`W|Ebe=zf1(~fibHk3po?KM@xW0}5QZj2_Wu~kwf z8UG#z3UtHWCUjI*zssuEEZgn51btJK@2KJ*l-{?2#K`0ubBaXoA0V zy3C$pHRsU7+9Bwf%syw0W_|)IBBvwVzSc7Pd0k_S;$`;3`a6zc{r5ZXzgX;F<5_=2 zvi{SJ_1DCI`zsdvXI#5dv-?Me{k18Et<3KqISyFtUpXwlBJW?g^I9{!o2(YtdRxp( zyQU}#F~ersvhxmrwRV`;wALzDJd~~flZg?Y`6~c9Yw`4X$276o!ct_L#n&76z3S}N zD5l!E$nsb9=!A6^zDF7Dc|2&)=yP^$t%~d>%IIDGc-TGIyTESRXI@@!wYx~NS``mg z=KSC0Wulaw`uOL7;UG`y>nz)wsm3UP#u7Q@7KxdRpI=%!8PVH_mIRwX`hAfK zWLF3FCU`67H*A}l%^A6#Wqe;Qk&g7&L@OJI(dr^DpVzPMc3(r}q}nomyQ`kvnzZBH>q5;j=#^nk0eu!dhd(dAdJb%;iOuH$uFC+tH`PY?o#&s*-5QPq$K7E3Q z&C>p(DvrtIf7auv-A|vj5`9_vf=&If)A35OQYQaVcS}4?bGvkiOuuKAs9QhL`)tkj ziJ^XmV~lXro(ZH#umJozQ%UILva-CtjGx%1an(sB0Wa^t9DBsdxioplVbuL0e2+xa zLS1NY^QEZ2LOaMWruWJ+FELp&8PfmHcz{LwdBgnoKJMSa9*;ABy`S47{-5y%v+<42 zA6Q7%$nIxVVfOmKppZDp#uw4P{~yxcJ1VQ4i5mq(v0woOR0KhgB1L+CGAcz-1T5Ga zMMOlACQZbKC}M9Y*s-C41?f+sf?~sh1q*foMFo37k(-@t&Ux=y>)!8=kF_|*A2XRu zX76MtnaSjY(Gk2;#8f^}pzm{z$lp0Nn9SRigFoDh;oozrzv8|ew7L3U{q1ZM(K9)& z|FrquB*-=q@0aK6)wML}qy3Z{t+rrOF2kfe}*_mzv{(5XY1?w~I(U`m5aQ>tc z)8*0Mvo^E6ub={&lS8OWXOFLBPXCV3DQF_Yb}bP&%Pt5usIdKMQ1y}{EyFw@CE^UT z=fX4v7@F%2IV}g7ea0+EK}c>EXhpF7Ah>KFLGIMDI$FMS!_kuU&q=eR<_R!=7X;fKRm{z(|1OKg7zMj|iN{$UJs zaqi9JopJb!PMjVNkKSEi1|=b_qY4jX$)l8`k6UYUMlSa!&Iw3gO4=?kwf_#KvP zQ;7uG(K{G@ZSWL)!^s2Y%pw$mUM-QJp9I9)RWNDWuP_8L0K$dq%fBy9`b9o&}ndi?PtY z_n+3{lQe$NeFBdkG>evlDrXO9`g5Am!wxBs{2X@}e~k4%^69LbbmFNpyw53=2>Pyn zl_vFCNOM4cWAjm%IvYxIX$ob!0_T&5CBdCAuMY6=+MD&m4TUrsd zsvIZBbJhYs`70*}=$9J`doZ41B@bg_vvv;7>Cg9X?QiR%oqMd&;V7wO^CWyvfzSu$Cq|9Wfy+Ry)8ubq@JB=tA`UEeJjZw?xxDkO70GX2TMtyZLq z^SU;F1&M5)MF!6)Ltdw+v-Uouxj1_SopK849KiZt>r9%PO3_W4F>n-n-wo;c`>WPT zc!lO6#$VsVhlG4xf$NsFXYHw-X+>O?oh_AaN0wZn-6&+Uy7&P zs$=CJ;Rq7mcaQYTv0V&z*o#Qd72WZ%9{M0Wzy6(RF87UFq$iA&7#>!lLmqlQLR#lo zd^O3vtjE4vCqH);{!jGGRycK|>-QOhmb3km(Pd6W!TyS;oK50Zu=Cb)1cpA$RZBJR^Ka|a%APsgEN=`Qm-!>*sXIpXM z7dyYU`3ncaE*PL@H~X`-mt<^(0t3_^d{ zbWp2M><`dr)CY#7uE9@V4H4v#Ma@NM^Vs>2F-46%PYcr~H0LW$>=fL`nH_^-*WyW7i?`vDoGfQ$yCY90e4VVwVUlpMG^*b3oBR~Tjum3^% z;Tl9JPp<=jF~4;1hPm9ozBFqX^jfwHZ;j;Zolt6rLE#aOoyz3cexM}X1)SC%MU9gc znZEBo*h1RZ&yKcTnf*xE_S+Kw0tZQOz+y)CJ)wwXvUWRJtxROt;q`pjW0HgC?)$*> zn@@AUTntNbdOds{lYfGq$8f(m7#F9wG5+Zzi_s*r`DD;!OUD26=o6F~9!L&tkwb$1 zubwBt8ylO_wNu`)_o*&o4qVuO3tx&E&f4pf#qD){+eB7A;7%xfn0OA~p6So?-oFsoiPp5dGS~;iou%CwB4<17yS^4jWQt-+HGNecD7=~~5_+2u~z=ycV zsxX|h#smWPPC{yi{ClMzb`9tGzQr@%jAZn+Wy8=sKSfB3@nJaGY7}v6*9(m6)LDP_ z{x}hNcdSG?c7cq(_{?G)J=*~^mhtg(p3|~In%@y%;UHf~^B4YutCSa^p41mQ zZyO)KW2;BO%U(Spb5lPizjOCVxRX*PdS%7s>ohqawNJ&U;WYQ>H;gich&@fx_Nv^U zT1avGBTZ5{5pSmPa&J?vI1ur?Pio|Stnlthz;I6k4;Xvh z7$5cR&9G!%6FxFxpd?DspJCg8Q|PUCcl<4C9>ZI|yhaL5i<};O3S{`sNg%y7oX|Z5 z9fsw7?8%FR<)~MYvVh6{Gxj9p9Gwe4;p5YDi7TXq^&ykSOlSQqu|gfzJ?~Fijy5wa zd^bEtpDMV%;~x9|{JEqKD$n~v=<#M|pT4yG+y#B$84_DO!_$ZP13oOF`4sds zaQ{Axp9Il3ICnLjQYDiKj#MAAYw9GTbLI((|GZO>M^;+RB~t=dAP3Cm$HYn|7;dGl zMK4Pau=?)Pd-xVV+vM1A;tS*7d)5!$OjzmY$k&^ovwH`IhlZtJ&7uVRkzO;T(#&kX z(m&4^Gn`Yu4E>rB~TKFe8K3aD3qO4M~l*J4s35{QGGCc$lF?o)+->KI@y|_%wPZ;2W2}a_-*}G$kH< za(tQntgS~#2GkD&{UrW9m;FfW-q10j&VtRyiTd=hCAZ&cIUE$@^B$d61&!fV(t|Fe zSbLTgeV6uzFnAVn3<>tUc6kR*dm09cc{U7NtnQgBzq5q(4S}xPQAK(xcoD=`viFS~ zUVj=*+<}p^8Q;%za8n}Z%}q%+{|`*RA-T`->tJVWaD_jQc{9Cz zU-#ULiq`S=CETq>`*jqF9goK*yQ*}-e#tRBT7%nT)oL&BShos)`q6>uuW)xIdQ|s7 zdMY-W;pd){;A+1;rDH*X;gS!Cpb|#iB zpILhiDZbySGvxMV{(9o!qeJd4?^LL#>k5MXDvfo?&4z+f?FlYSKVNHqqTm&bD^J~K z_MY>H`tP?yqR$3{n7nlw(d6pHQ2f)uoYAZ3`TZ4j!6@d?9Y&9_*8smoso3|LgvtB1 zip3w1@-?54WxWQ;d8ftbnN{`D1`l7!C|TYgjF(uTo-Q;#KXNpqcX!%} zm)uc@mvxQ|UtXAr-fdHdo(DJ{_eUFFUeXlrdU)R3kvSgc%s64r=;a%pOX8K?BsuzgzB*e`7Yq-jmM%(gVf4q-FbWP##hH`1zwC3xGBjps zE4FMI%ji{d?HugJS~;}Mr%w6yBq2ukQQ~V$Mpx6(Bv*~yq4PNIkGzsShZub*N1a~N zc`?;5?R^9}f0>?k;jlMi&hUNn7}Q#?0Rg|Df?^FShXUZO@0VQmHGAS?tT_ zM=3tV$;b#DiVaIED|t91OaBjp4HXT86!nvhvT#B!JR*F0cQu49N|pFql-&&Igm9 zNlR^ax5mTmP)-le-B%>PsGG1JW%h}nxIM*!uKf4kyB7cda9ep{?I`R7x0P2sImJ#& z?O!3zz)_{_~AgL0z!Fl-qx&Oa-&Qy4b%ex zyHoyf%70wsUqt!uQU2i~|MC$<*sD>Wgl%B+QSzrr)A7yy;iXN@y#Aj(``Ip;<66+B zZ*5&~+X?T7|MR{6FMq%KeJJ0J-p6x;?f1df(Z}&h8gr}W$^9D_`!^!I*PrA%C<@~d zoIdphZ=iFwc}jN#8^C|-`w^mIn|y+wH5J;^u9s%vutO=r{!QEaDwy*hd-fTTb^JiR z&p-D3FaQ01=8!$pmYjOb;z{90KXbB&V!sC*|D<>~#mA~SzDM~_Q0!a7aj!g0__4+U z<|;A&0a=zll+;IR!Yju~%>K^?Sd)Y`I?(>$PWF7(`|87yZ8qS)fxrJxjI;6m1YL-v zaoR$ARu12eW{23o`ZohudpbF$;9<30KsSo7_kR4*ATt{+U{}W?CQnVp9Mt#dLg~;W z3#i>>X_Zr9sz)`bl*sZ_wM? ziaHNv>l3o@g9j<=pa}c6tQX{wO7B#hE@uN})_Tl7C&IU&V26QFUeCYBj)!-ka(^2r z@aOhBTYU(hOVNc3i=$^M-p*t4aul6luEu?I{%S{N|7^`M zVhDM%`T)8#F-mA3T<@EWtz3G8-7Gf0fq~w%+`3le*IierA7-bi; z2c(h{4%;iz1bsmHye847KHQ9#28=)d?|gE0m?K(xV;7TuGQ$BWCB{M7#`cWg;BG9r zHQ53AkK+EGpna*5hkd8RV8=gW$k$wvk#B{ z)PUj-j$?GIU_-L#+fG!HKA6!rj2q)rU*iY+-hX8E_sO3~o+ikWw7-T73**Fg8M(sy zHlGFmEcg{Ak(*PGl>UtvBoXkb(TOCX*EQ*)TlX2p*JFwPYAyVO=0FkX)$0?;PPwa6 zSE9u*IXH!cy?KvU%;4vFzt4{*_w)N>w+QZki=gqWRrE||(DIdxUvic1KYwb%)9-y| zIPv^_T=-@%*<7Q>^cVCAP(4yQVFlNxus!vk)O5pdhqYp%{&wz8#Lztj?rk{?b`B%?8_QVN)mOYkG|To@-tpo5r;0< zB^xHQ`5XNk|7jaf+c2$L(2vMJ3b(%T@r{rZgW>$RL)OMys;t{^A;qQ?|9|m&9B6e~ zL7qs{r}O!@$737G*mJECEh(QrJLtF*Pq%4!LMeNH$4`zELi=y>uY!wW^&u-!*0WsV3Qw-J$o3x2Ev z_&XBx3262uot)O-MfzV^{aXgOlafDkFugRH@z=DBASH&e_;Wu#|10i@h^^%d=_xDz zJxg$wkX+ercuOwpKVz))liFo=tQqr$? zd-SD>y&us0aF}Fobyu>kY#if%qI9mLFQtDH=~HW`N}gToO5UI1^qVu+Nj7{9B*^)t z@O)sg-R1nEWwS{BO^(;~EON|#@UCP?3xA*gPxH_J@=sVn*Rkuaq2DKDm_FG*K4TyE zGw7w%i(w~vF4S*Klr($DS+@RYaOp};4V;D!T66kd*(9>E@}P8oQdef5KV7M}{m3m4AoKYaN*U^vXywZHNWFV8`Z{@V4tGEZ3?Db7yNY zy33qUl2p?ZyZk=O+kZ=)Sf5zsG@>W_euMgWN0NKP6h*x?VEmI-xWIz7*N{aHYY#d9 z?K3(z>V;=mHNv#-KaAeWb4IC!|mHcjfw%Ng1;6i?+AL00m(Up`Q94OeEjHLdKsUiMYxpp+e5Bm=yZ>0Kgs-b}4 z#}wB~^~u?W0wnOq)=nj1YtA`!23g^GFuXDKTq(sM;N6#o67R9+v3Dw;AJF(!vcdQW zZYRe3%%SHoY+L5x^Y{3EmJkmcLF0@1iScd%ePYWzRB-PYtAF$?XJYgyAF1B!#OkY8 zi6U!4{gFb$Xr|9E+MdW4UEwazUqb}kM6sEeZ>5g%AEf+m-g5qX)Ni!MbSf&pbeWaE zMX{>sRIE(zR2KC2r1r3*_HY#KA=pd#WmnQ^Kety0TPp~*vm#{GIiWw0N8c@>na-su zyt0Jxgb4I)l>R&MU;0l<|0dFVb>1hjlyQRaZN{uUcRFn?xE;P2c80uQS$$LPPC zDgAK*rz=o;4EAmeJ@5M+yBKy zSK`RH-1E|5b|VD)fz?S5a#i*c)(ZZ{aQO2@#8CO2R6DJjjUSQei^)&N`%Iuf7sN@+JGR?__sjy$T^G!$=>R6L(>hGaIkc zuph~Z{DiY^O%wLJp=QMlGB@oP{?K(GqhE#tl5?9ZiIKOp@P5Lf$TBqhtIo&x#l>&tLhX0~L(=yXZfAhsU`ucmfHJy8ty@41lCXTE$Z zJ>nUJJ{86={3`FARI$A$-lZMKaL}P=67_~q)DX|IB%jk0&Kaz5AB=~0i;B^vT2 zUff>^z0Gsb;ZAGttJol>-`&L*(Z(U&sUOgh;YwRo(%1S4(i}6GVLh6M`kq!G)Of!V z`X^MWcP?&r-`5t;3F@1IOD)rnI!$_)#Q1l*wnzG9PfK-+xjixmJVRl#t#OxnKSuBO zs|fYjc@qcW@eC)w>gP0Svm#E|!1>eGTBGtU&A8Ln$&8+PvbuDNoid8?;B>2_7o?iQ z-=G8cxxY*&Sr6UnyA}T)AI|0N-Gi;YR3Ng$5QcXr97osf)yVl%ynQMg3-IEQ{@~5y zLm_aVKiX1t5;w*&e;=$F6Y2<(*^Wlse+nBd590Y@y}&6Mn7n7pw_)Q4bJ3jmc?>I# zk2@3NfSk7Q{0JoMdhD6F+Y+aA5s!CIBI$`sq(M!3!gvBnw7(_U-k08=yF%Ebf@Fo13XZpYzk=a8_l4b0x!xnqg!)~@8|v0JSF#Xm8WWL6{*&(b_r{@@w9 zU-!w2%=j>o`JdK(9Spaj1zQ^Ncud1MRXC~cP4;%uVc(mpTjIz)njd*n_XM_{NmQOj zUaH8Fyrmif9hxcbLa}P@Vqs4NGB+$Hch2mTEJ|VdRzbQaiPXHCCK)^9H{+kVU?ges zP^b5u7PIld!OF!1W=s*v$xw9q-cC{Av)1c#x<2bQ-0XeOu$mkJQ#*p2+ zdJsLwY23cHyKz`-Bze0nfYJATu!1Asx1i3#nx1|S$|hj6xNH{LdMQG%FPWM;5JKIY z$>YtP1%5Jk`9N6g=}huxrZAkIy;#yTA&IQFQWES>>=$)HnK_9Br|n?$i*N5@>8)UL ztm9aQHG99thrR`pzGDV5evevBY4(jI@*T6kSzuTK)>*vP!%3WD%b;N+8{F5 z*NBV=TF2h6-jQm>H_$GJkGwyUOE-TMl^tB-@J+-Iu9@U-z2M8SehjNgFZZ^w!kmG8F~+Yi0394k)U`7hp5b)sb9iLZ`yJ;K_z zKCHataO2B1O!K2paVXid#-UMczjo6!2hWk~9GXOYJ*@uJqD?2;>LrXlC`WMgr z(jMJY@gm9t`1({X_@;e_ab{%2c6%b&uXbOMquTp2ES%94aPhVok|ggAM2FsCCg3ow zDUfOZ1?&Fx5&Ap1-@^csT208>rH2`|T5142s+VB91J;cH`RFNdbFeqIXyE?APS5pW z|KD^ZlgRdyNNce^=x-bh&9?hl`H_1kgRlB%^y4pIPn*1?`7m}`Lyg@E*1uIZO{RBy z{6zYfhB1B`FAA?|yy$~TeEw;m=zHdLq(bQhzMg{}8(J-@6ZSh=@cjx{N%`;8eL*ji zIRE`ReNbOu3JK#5G5G^Br@)$x(@{t$J6}xn=si)%KbFxo5S!nS&_aE1op}g1?%?@1 zBTr6)=)GR}t6KvrU-i%szP&Odm)`OHxwH{epkDeJuZj0zbO%!d$Otkgj@@{Cz~^35 zp#A$F*fh$atvxLMRY#0}O?j?Qwq{y`DQ`baFV-g`)(?i=!?#(dVbdpC1$_8IZ6iOK=Q-Ua+x;0cn&m zB_|iL=Lr`^Pa(1rZ~UO1JwK?uxlf1xxX z^dsgR7jJ)!HhFa?(Rmi^{aDrf2?siKhsQK;w(ve((H{t5UH9OzB0ZhnmH5m&9jz|r zbb5aQY*h8MZOeD#<86*d{jngmqQ7o7l^0IsJrw2LSLlO2X;_hQqQ6c`>)%4_j}hh9 z=?^3Zv_4l6$Jpz_&eY?`P0XJ#uH_T%X5XE(it?iVd_tG(y2A=@uFpzZ{|H)toml@j zy@8~=(jL?%Z|xj?(3L%cZ!hKiOQ`%PD&JLx*I%k zF=O^#68Q$_TJ<1u#T>hIGD3Y5Ea0YC-!xi(B&~msh=q7g^lZ9qTYU4^9Xg=8eHW6A zv|{p-sJt91Pga!YZaaX)KF+|0m3VwgUs}Hpt^cW5e>?fnB&*A9RH<-Vc>h7z&&i)#P|=> zxs*nSRnknpp9r0vnvl9$M-pvgRwBsruQMXXCnRue_b|4e`7iD$^6xVm%=l-%8Ay~< zoJeK9o6w&@=j}iep5g?354$n_ZD{n-#(O%j=K+s*dl5akRrq)_i}!#>-jm3wj~S&g zjx4?d62g_>Vpmg=@ArY#pT9l_$J6aDbeqMaK(^62?9|l|`6bR__K4W~99u8iu?=T&I?417$L~tAP#P~!O81rF+aFpa*TR@Q@~(m)GygBrBfLIRRx1lm zR6lR7A4z$fiNkZV9rmAO?I(6eexQe^Wbq8%K63u>4-`b(KV8IMt=6D(50vmuZZA@I zw3X&FoM(UhI$kJh|H0yXZb=(|H|b~VY43ynp?6F+J9AoPg(WS^ zZ!NZw!j!plj(KB0`ymc{Ho?g!8*SUA{q)Yu4gPH0&hMU#G@auuGkl$~Y zFyAFZ$426cpD|E%b_>JH{4U|z&wg;obCvLZl5}f%(rf($=)bl7Po)P`TM%}Db3Z|gXeg2JT5&2*FP~NuKhWG&~G_>&OQwf=@7-r=k@r7bK7?y z`;|CdIVcck#7@EI!+H4&vV+K0rDeETj*a(V*^-JQ58RV3Y~tnZjwzDAG{-@bnF-ML z!l<|yJj%}73=|_ zHDgHO8a;{AwH{1A3wrNg^pX40hK0QTw{Ldf89^!1Z=qN`H>+Qu=3wi%{HMxpi z%UtmKzq43*-=Fz7K1i2nW^nu6dXj=)>=`3j6uXe=vuDaiyshR{5oUnceOWj~HIbbQa zJb#?Er(2yTNqn(FqOq|zEALzqL?#uiKv(lmVSzubt_%76vJpq{cp_*VVMMAYL}O<) z-rg&RjYzF>I96BZxXIRzOn7y+^vf|m-`hIEjtr4JD!FljW8pmMc6wfPpqRfv*e}+j z_^r5KO!tQ&jP4(A_tYY^ej%R%d0}z{-x0BPxFtE4a!wM%pvrpw{sf-Xhg!D@IQ<&`9$4?Yj(5&fg-kuJ|AoJ|kj%rb zjy>mF;nm-ZS*O|c7S6rU%+?~jEsxG_<=jAVTyMT-B9m&UmN`n57 z8ulLf59|&D`1}G+?|zFPmUJh#ium_*N2v~USJ;JqMey>rKeb8xi%h(V&rd*MFpZ~> z?~l%k^qPRdq++Z#-q(Z8U!bMh2v+9B9)@A0E;D{|4$0$l?9~7*6;9anN&o^BMQ&{AWKN1b@N= zx_{o6@1Mh?S5t}WyywX5=@KSSJLQNZee7jvKwToMKRdBA9Kx5dy9_X#;qzYdYuyoP zPza|V-dZh*I6YjN?8^MH;7;=mA2l;A*41@o{CGA-MdMS^u1Nt5-!RoVBloNPpYgH_ z&1Za|*FX7;!Tv=z;uP@NX_osq#@}SI`*dtzxZ`?pypDHGvtLx^U(_}pKUuF_6Om8yiMQNU5Ae%jd%S8dE`X5nPjTfCESv5C_ZK{0i&bzWBz2gIr!5I&_L{X^7iy!rl8|Q# zLVeJCsvF%iypFfXv-@EnFE|7~IufkdyEo%^snh|L{w`$9`dDFnhLWjc!F_%YGVR1s zHb0#EFc=Q1Ud287wrBi~-XRb)6{BI7H3fa({(?AA$O^>S_zBy8$=n_VE`PRR#V-@t z{IiRN6-=i-c`w_oOn%F`dYZq+pKLSx#&CnaJK%XeiF6~6-*8M0fCr-*@Q$MoSosT4 zW9a>2N`Mnwr9yoLWpNOHU3C8%thF&Mw#@|HLiV~36Ec$zDl50afzU(mIrEOD)nu>Rws`3z48 zR41La+4_iF-l|J%@NN9{#6U*Bm#U5qqhe&i%Y)@9S$I741@gSY%0o(^I(TY4LuR}@ zJXEVhA-Mr4axEVpmiD}Y;w_^j#Z7#Es{29(oE&pd>U2K8F4f3G=?U|&+n`{fK8T7> zMCV&d(V4OQ`~1SP2pv^gjxHo}yhwRDeq&RFJ8(>r5)x7MpHh66^AqV7U1EiAqu)79 zf7nd<A=^|p1RMlg1c~)R?_X-KduL=J zirWj?PmhvR^}2%H#P;lQ%0X|QsSwKj4B^~5?fr73l9u42_tJ0bN-BkDCKILo@{YK-Y`$FletQYMfRijAyV`TZ8IB50zO)fAy$=KEeKfenEQ;|P z9|(fs)~?qqg9 z6XWM)d3j-9fA^Sk1yj{41fK)xL-`;09LF&3IC~!iTr>ALcCu#}1pW_UkwwuR9a($m zJO;LRPbo^a=J`xI(E9&uI9Ak>%l30Xu<^#bOAEEK7Z(cu7W8X$IF3H}b9qAf|Ir7! z(0nRG!{4Bfs-BErDD%H`W2#RUwO0>rFPQaiGHi&HBbU$f^R!+Kli_2O9JJo$=WVqp zy?W;biSRd}edzsU7;^4{)Hp(p2w2F!qP9Pp70uztbfhazHm9H_kC-xZi6UPp3H)W?8fK0BIVOK+lgG!`~5XeN1G| z$rMi1{f=J6&1C%LnZ4j$sxyQHb9;Oh`_pgLRAIb^joWE#_gfcuxpWu9Pbe;b;{xha z^VxWm5E}{h)W`UvX1vh9KoayO=6`ytyI z|FQ8gFtH*GIY#mJ-%eW$HAf#x2E3ZW>RU7-6J=G73^ejjBrL~#Jj$T= zy9#}%`tl6+JYtvlJLNYf!DF;dn18_~+CIe=ZwR#I&u3prM`#J12<{Dhd}_-t9B282 zmEX~<3iDoiLZAxQM=dA>Dz98e5#?Nep+60y{mDC)(@JQen>vc9-aYflWTv4r9*?#`|g%uB182JQuO&0gKz0NKzli zz<^cr5iL&=9#FY7-;T69%eO-+q?1vf@p0helfk}6$;bm`td4^%vJV+ncJYJNF&|Ob zLYB{mxTr@$+K_bAFOYw~Mq0j>Z2y`Fzf}2sK<(50P}(hb$er7Z2=#4V-wU+Xxx>-x z0j&OB*VUlQq>*p|6xjIXJ<9`iXpMo{HGLU2h|wYtJsdu*e=9s6^2yf=A9)Z19>#2a zL$35VgqEs=L)?OV;d?`TKMlaii(=uzVLMhnVBrXq5kT|t%rRi~?djHmtZepxp=+}k zJ!zvOQc+t7q+$%i4<^&Gvw8tIs_C-!jg67+{1ZD1g3D}yNZ&Jk91W8& z(EL3gTjN>z+gcU)ligfMRbcsfh;v*h9=&Ie^x*JVq5V*_C>>XvTU9!HVid!dCp^L3 zoed4QvhR+AP9a2W=Iy}p>6B9)I?B;A?g z>T!V*^PD%O8A;rq`^z^_GBNj!QyYF^7%E9>Hie(V9a#B7hfs+c{r805e0(S{HO0BE z!{FivEkQpLXc{W{9FYV)s#@9lBw$FW=vsL6ESI;O`s*U8zs{Ze+hF-cEuxZLgzt*`OC&HK{W#wrl*Iar_Y~lt z12u_?KHu*#qW(h->OcI${fF>_`VTi!|6wxsA40u@B0Uq?fQ!Zbqq`DC*jd|v&Wc#$ zKlbSUIT7bZnUbqw{ngaJ`H}iJ$BOo`&PhYshmF8g)OY&-+kXcmn|mWYnrrCx1HNAT zJhBpPH|}?qB~Q?3xmRXap=d8OQfaoivuy=q+qNk$k;l12ewJpzFMTve8$OBs}?mcZ%mjtu(s8XthT4sDaf_eqGil zyT|9^U*mYZ>W#1guqjQ7R`K?cnKVDH%8xY|#QaL5o*RJV+CTZXNqg!~o%lcgTAkF&~tGztR4@Uc_Ulf83k;$LmG^ zxcvchR5i!~YW#TpGxwXLrxZUDvFT`YJotb7>FRpkxb@%hfJlBPqKlEHp2(Y;Uj_5AaCz-zzWtj#R5Ul9^&WKu~4@+NG~aV)a;mB__KI zu>3$x7-hh*;+=k^gUKc2A=>j+g%ySAJ_;rz#|iT*GGU-4)L|t^Dzm+y<>kH#G z6wmsAZ}wCplT8g-|EYCtz@}TfkXbkRcsJ#i5k7Un6bG%3W&D4Z+akAx_V{;N48tnO zgS_r&Rv6)^DU>IR{vgti<}Xv?`OAnNwde1Tg-*`gp3s@*JKI3>o#pdK2Lp>x;r=S&`%KdB#*x}n6%xHS!x{GRpGPdM z)zM(*T!sansLn-nZp?koo$A6!nCuQb^^_fxXQn-!C_y?l_;!t9k3$QI*E?HuefCIJ z{&ehgVr9Dl84tU~@KbMRvT9^7>i4TJYhSpJ4Qc1FMpFHhzwg5==a2`3Hldh!9{)4_ z+DxKmvjgSo6DI#xl^c=GN=7frlv(>KvZs;>C$^*1J-j_aK7|goHw)>or@Y? zvgbvDx()*WUYWS1kk3C1W&4vFNh&%u$%&PJw(c+LSmO+4D{r&%OZzIrq@s6tb`Q?4 zmU;(U_s<-6t{rA6|o?_R~&WR>bLfdi}|Qb*qv3WG?U62|Ji`TmdJ`ak|k;BXWFp z9~7s}=R@+{2a{nThLW*~94|?8fW&fnX{_d8CcjX@lI%HbDz!ao!*G(P6>Qv=CE2#o zis2zcTxbq;`aCN75aC(Raxatore_wsqBgPTHRwb!@*U$#CS1JBaO=c=NDtJlGk>amm@~u-W4$nu-e8df`IWKoq(x5>~I|bfLbrhVC}Gcjef5nfp|q(&1&& zaiTs#eZg1!Yy$hVXZE1^z+hABEj(0{w@+xl3~m2svHgO*%Dl=XI-!1y~Y{2;kT&-_a?qZyw4%Mzt4=#T~z zZm$6Sa=bylE6lkqVf07$<EsmuPM-9wn9Q(CTDtVb@N&sq^~DUw zzwM8`QbO>_A6&kJ-V2H2?o4FbCxX#eckhi)XD1_j(x&!18)S1N2Cfg#9r@V|uep=w`1wVyV-K-^AM-N9v%4EZpQ*e(8v`nw zq`S|d8U46^lb@U_@$H73_B8YUQrR>XAKtbbRczw)O(z!PlmJtp^I;}`m$+QU^c=pPSp7a~B1Ze*xUar6M6PF)mSS`kv7+9)fwHMr<9!KxS?!{us zg^_9rX}e!)_fG}3zf1G~Ae#S&j0#)Fuz24(G5I28{avFz4>dUk(>rbFu>RKXy#ox( zHzoJivGZ)?!9!b+JAMUCd8|wX`F-o7U<|#FJ|(Ih7O>#op!a=a#np4!_fCOgdS5q| zv2_>DGmt8J-+SaB1N7={4f}r4ztJ|z$S5jH*!TVoy&u}0-WUJATQ7!%`*%9gGa2VK z)tNluTOjby8h?)I&&OdIna}AejQ`I#HFz292E&fCcmvXQe@}GS9#%ejwYr}s(*fUGBS>8$J#4-WD7NWuHX*O_SH0QY)O!@gH_RKMZEefB+#g?J<4 zvn?9yFT5rlA>J>s?89ID-0UrC-{{2bQ~u#Ex@Si3>k#h)iQ0P8R_$F`flyZX9kVqW z`9@!pOcBc;ruR!Ajd?gvyuabo?GMOCG7T?$JcaQeqW48qDAh?b#QPgo6h)(ot=FU{ z#rrPGE4{(eq)rl6z@JZfr&g4p_7?ew_gN%R`Gfk;L*GUDJ?Q;98Fx+4`H7R6`~@d% zpv2Wrda1&K;Yh6@a(K)iR(MUQl7NB zAT(5l%X3JM#;vojNmn_ZEr0;`^n11-~lFYlq-ZyAkrH(&47UNr@|K2Sk z2XC4dkIRC1{K8WjTcJ#22INJ5{jUeMq#M0&KJF>+ulr{#AP0`^#tJ`sv;Mqvl`8r3 z(~S&upT+P4B{MR&z@GT}-e>!{bUdMY$jDUhIL5{Y!5 z0i|2X&u09G>W$Gp%SF&*6W@mtVCklw^D= z!+UF@*?5#Emq2{=4bam%K3?&0Mn)#=_#HOir|}7x#wUPzkba>+tET05)AAX4@oYYK zkd{}}H^5o%xIQ+Ne&lNzTI^lN{JnMbeA;h%KJA628q+_IVsm=mn!$HlHl~?V{)3di zr@?qecd#-*;k12Qs<=KU=(poNwU28Je_ng2K9N)(Lnn8p|FFBscr_i9tz-FkypVo- zs^2-lv}^_Tz1Tmz7d%*)fphqMtRybb3fyuu$oGkP%s%FBkrMX@!<@2H*!Tmr|4(aI z9@g{H_A5m>is~dv$&!>7?dxwQMWsYZhl3nZWG^I1RCZai9s7E+W+~DBn^6);Qk2NP zi#WC%g!i7AZ+N`Vb3NC4UGMJ?+-A9#nYm}?p3ip%Rilkjc|@U4Fzau$OJ8$5^3V3T zPwGRKAHQ|4Mq6j(A$512j?{QXj z`&09K7}tlL<@O9oDnxa$KKSnSCN59!3=?J-JhovA?=RtN3W)-wYgCDJrG zQC~{!#v z#N8A+k>4UTc>2K+@p!>uEmEwugrE0#&kMy<{F2C}@C#f%4S4%-_S_T_J>U}8XQhi5 zZp<J0m(jl%b<6Ce63O-b0QuuK7@-p{MSkamP#or&gu=&& z`sYCXQ)Z-~rvajVE0DiL(*#{N6Y{??3dB9W=%bU8y!kET@kxjmeX6wQcj?*#^v=jC#$7v+Nn?e+D?dU02Vp2UU)V!!WIW!yM~gTVE#mrn zf&Rt| z+_Pdo5PLlk?+B|;_2v7?MRHub2gr_!odgRx{WdEF+k{d$e*8e-z37a! ze7(l;9^j4>e&5@f%P+0(5@KD}vhjndnmsmAu%}(GerDqV6QFwnz47<^oYtu`CmrnO z;xV<{ALGdfO3`HSHzC3w;|Z`9{R(Ti#-Zh0A9f!mtd}vH16X~1VQqRB{FOr`_kZ}v z8UBtdj>+rG>;C}ycpTb+Oy70j?V|(h;r9DW$>*EgALHIoH~2piDVxRo89o4Yxq&}k zU(fv?J`S`V_*bhZqW;0tFCxHS;Sa9CY&?M+d_A1-cvAz5cVK&{5Bx9bv#gHm-+Vu% z**P=j&jF`68H4{uM;Tc9R60M~G)7b2MII#&3lsaTF}0fV$h1g# zw{Stv+pa0^Zx}s2_?ZXgyA3Gwr-mjSSX12FJD>< z`vL`pLn&f^J;Qf2T6*7yZjAbsmmidUMs{|7XFBJk*q_?hgt{#1Z$#C$dGqvpYw}Rc zX-vr;bxuDI2?0N#pwL3vf0CkWZb42))N+N$&(eN+-&LUi`ft$p_g?>NdJ63Sx{CLw zfv1AP|CJsG-zz`kdraO}6(WFc_<{a!=?E~9%YVrKf1y8HyhMIe2jjpq`&j>^2Kvf0 zE8QKR4HEI%u0~3@ygnb@nkMXZs4|h{u;I=zqMeW~LyRqT1z z9iP8l%*Hbfg6}GVf%d5s^r`AbQ~~)<>=F4(rVfVh-Cm;oC4ztKi+r-8rxIQ`LGbHy z%$=%eDbqHQLY{Ux(R9kCL^A4~;NLWDFs(FsNwx|3@v|I66Ft=Mddo8IPqZO_U`-O|BY+Ut)Cg5S8VO0)#pbKF!R&mkzU0yYel>|bW4M3;lSA0mYP zgW4%$7tpUrvcGXfB60xvlN*KoYkDeUhYWYz$4c^fbeCFg4|*E#(#9!c#7@|Hq-trqgq zp|Bs?*N{&}ofP_q7%Af#&|k?*^gsF4MAR4b_c$c8&MwLZ21ylkZ z(Vtd8`Ap#d*DPVbc6!QqKeYFb-$eN)110(p+Sffw*gFlzh641Diu0m;9*hM&;2$p+ z<=37Rjid(b?|wkgi_*pTwzwhks{n5c7y~ya3;s7B=c76k zCA@f&;1A;)-lu(uBF_r`y1;uX_z;_Cg1>s?VC)AnYDoRh;AuWO1>^Iv7@u@&Ho{k3 z)o@}zKA!3P>}ae4eY(XPVZVstMp6as`)a>v-%!x!6}11GGSR-nK%cdct}FDx8$o_H zeock^cmnWNg8pw@CfctT*b~MNT`KHJ=Nl@~yD%P}MT+*U2i_iF|Aaij|Kp`wvgOZNPy#2wed_}zI;*st3BCGrIuDG2+}Q9YFK z9%#QBVLw`>txTtYjjhLv{*wd#1KJ<2y)XD*0Dt{E^q;gr!u|`v-wXwLlO%t06~9Dl zq5pUv680Z=ArZdMjHb44h5Z5Fj%HNMB6%k{-i&qtd~S+0+$lWcF!$eVjT3!F!`V#P z1?FuYW5b!VE;y}s;&@@I0{Gjz+H;)02)r<5`TJ{XWtI17%lE$wFT7^RVdU5Udwpz< z6hHVL0Pv0Oupeuto8ynov<1i$2Y6v;317|d*28TMqu}Y^@z!&#dgPWib!F>Y&cAAG zHLU&EFM&<~{<~k!%x%U8#{>Niu+dL_zL(#yUNcMGbuX8f$e?-cQETpcXRPkTqMf}cc+gJJX^Z|I{*!D~|y2V=CY25es z7U|u!zPX#=ea6rpZan=i;8_xWz_Vn8G?0JVf5R(Koi*B2DWZmC@8);~I-L9^!Q<`Bu)m(D;pdys-cU|K!DpAabCvDS8NNen zdZ#O_;H)Df938P%;fz>4_tMT?=R$&Jc(Z2 zG~D~?239||cb1_AR#Di5|xlBhNvxAfrl!M^JX(ME{11jYKW_M%so zmOJi9D`S{uP7hyHNVe8Ck?T@=1l%2&skAkF+0i#lUb+P0EBUoeNO_JZe`IzcioM%J z^d*{oKj5_HVvh9v097rC%x*LCUDmhy4df_mg9%=Ejh_eN&BvxA-6Lga)1xumR*@bL z(H0w1Jh+!0r+0svN8ax%L+9Iybcg9hBy*z)b{%ZO(?2}APVAC<;J{->oSrXJq<(Jj zrk{l0dMQ)H2`-9wY#%XR{s4UCiM8MGl{6Lbmj&(SBLxX>#ro@mn8(fim9qYQ5b%`E z_<{hy_tgTv&rRU_Xt!P#xC+lEgCu-hM^{Cv3p_VS{1W>%qI0VhD7-&Mnf(@}In&54 z&yeB37Mxy@?u<`qKO^1z1?>d&6{Fe2U#ia^_&o=HGKpW>qY82m@Qq(h1YS=Q@QDtm zzTp$;G~c#P?7gX1*R6T|+Tc%0!JiD2@NtsaLKFNVkmHeQ zx5!=S^7u*=J6^=QZCw?y7qroE$v!7t6ln(7Yl1|ZG{vKIz{fS;@6s=1A(`{h6z|<3 z+Ar#~(#c1F*V`ktZz9kPuP5Pe>1V)~Zv2ifr51oE?fxB4N_Q>GbJ_{_w`Lia^8P#{ z;EZdlUnk;L-W8nI0{$64@b?1#@xcFp#GmQT@Voy3FNhxj|1ID7V+Y{h8TiBdhs=I> z1MuGs{IdmrJQMh%hCH-#*d>;1vSN-u%{5kytUJ*Y7TP8t&hxZjZzXY)L02mMB zguVW&d-l6ssoo`a&@;j|`p`X;Bk}n?xtpNSU z1u5c-Qu(F;MS3Ghk&ckcGkhujjxWWbP=6c1pElRe&S%_H#x>u+gzW&YcOmyXUe6us zcLke`knEQS{WA@08X?ivfS;WP_}SLd_w!u=U+b}J4l0uH+O49l%GKKz$*)cl=jj36 zy{#U;&~1)IQRYt_GT%5#{uH0q4?#txYV_{P0BB3TUZF{o{&s@(3h$4_!Eek5ofLP| zvHlbO?xH-vr9|cw$Lq&`W{pGCQU$BrgEb_iga4(M18N<>{~|_1WpsJhKV=SPXE?p3 z@uGZ+Yl+NKDxW?2MX%YbHnRKBdHEI(qv&;=#VFsXKj#ncNz>(HUfCC~f5pnv@Sq9Q z{rxHV8hE3Q(f8GiEgY_VV()2i`NPLumB*?S$@L}+{cm1R%l)|bloPyHPMJLBPttO` zTYRVQTL(DiCVS*a^8+3@w5Ox;K!b1e-E+&1cRiJmDb@)Iw0&~x%q`K1&G)C!%gV{w zL(f0^HovSkNY0L{tN%u`cpaQC;lp)L`Fbq|zVF`SdKv9B;r5_;orCbi@*+}+Yq-Ap z;{&nfpoheyI*04GC~LdT_`2lgwIRKDy$MClFC-hJ`L2)3r<0z6KHuIG=>v1)3^=n$ zlhSLy#=5D%`>E?AmP1^Otxpvc;ClfI_+oA^$Ab1*Ka3yhZ(2_N*gly0MG5@aHNaoh zs|3=I5`K)?xhA|i`yYCo>r>lS3umA0PeZLIbNQK#Effwp#C6x?>!tc_KDel>K0W&Q z7oOe;zE>OJuSDA!mGbzFDtym&V~Y~@oml{JH~3z*`z;imI*vM>xy9rAVFuyYAr!u; z3%SGTmQdbci4tvs-Fx#;NC&98bU+-3s18VYW$!`>t03UGKGqug798|BCZ!24I&Sx;*{Z+n($# z7C2w~h1nPH`C!TOU2zomYu_Jv7_m3qi{1JD0lQq%!s|4B@s@?ELIBJ$J>{1}fU9J9Ow&p!jc6}1L^;C*_oKkcGSJ>FBIEa7v#>wBCm&H2Njd3>|BVn4}W zz*`R=$X>59)Wc2ekHd>J=;SJ2Y`P(y=}-5--Y6C1Jp}iVGkU+oPcHb;mFX?%6OeC~ z_8!KcuGDEq=LC4+cH7o*`e<|~s&>*7uY4QGX_vi^vKa4&1KpXusIH}WpLmA3c%Qhv z%>_r6ZnP|)*$Z@JKfb49e^ae~aQiyw8zB56)v4@&_8j!W*Kc>iEZs~Eqc)v zj~+BxztHDmRs(q$Gzi#dW*O}&qKJ~%x_8Id0?l_eA zefGqgi}`w%Ci}$`k7vHP&wdS_9su&#f;@qeJX644e}TQ~BzryYGDCjJpa=~R@10@; z^X;f=;BB&N1>axdK@aT6;vw6SYv?q}^vszWBkOgiki<`&%;}%k!?R&-3x@T;cxnAq z3hR~a-`6YjXIdtmKXef1547Z8zt^E<9rR?XYBDr&VjS1U)KgD(R%HQsrr6O0 zPd(9x*@I3Sq$jgFpo^y~59IXK`yFLoN-|V8F^<#P{q$tkEf*m#l^9Ncou`UzqYf3s zCJB3IYg|J+h7=T-pA+|`9sTnws%R>6E6NMO%>I98Z$qjX5i(cr8JrH?F&XzXtaj7? zho5J%|D*kLl(W8uPvHJ}-lmE4UC@4Hc})24=qP_WId}>}qz&iK@~^U@I+ROY7&v*m}=7^ez3T@}NWWkC*@dpc7b)&GIeX zV4b=7?zj8XsB??8SxLPg^0r|zhvnXMC>;{Sd=FZ+qtOAJVCs&M#T{5B4|LM~^0NaHzRb{%!qq zY4duA7fUXDqkoc*o;qotIilm7Z|$cuIF7c1Z*AX>h~?w6S*Pn`471q3YXQ%)6Yw#& z#}sgz9Rhqzw;nywsRn^(xpmEvJ~~>8hFsSI-2mSR`57K3N#@1QM`_>CNUE}T2SN1$ zkF+>SmqrD9(fi2)pV;5rf!@1jOLufH=j)Yb{Lw7a51hZSgMvcv_J^Dn>rw@UWm%Kh z{7hlJNTUFcbj!|}%eSfK0eRit1bGU41s?Fxj6Tl~BiU4(&s+76qrUP!$m`ryw!XuW z`a#q--3##Ys=R%^&JU&j9!W?&>;fA<*cjq%uF)yzs=$X}b!RWCT5N<&1>S?}+;v=r z7QOyEOs$ZczE z7Zi<(Ax6pM84C2igOQ|zq9xZa{Jkw+wxKiXp340T9t`&#Mb&zd5r??{!Pcq0@t!5B zw8e^#%->)gpq2B~aMRQG+#XuskEWir!H@6h@$@)&Cul~L4IOmYgwuOYz+JA2wz#Ou zfamWE{-|`UExl;hmeWg1HWF*U@lK8p?^JoTKc}^qThRzd7n-r`Dx4!H zVC_~`xI)u~dKE0<^^LZ$z_Z<4>FDBg*5C2s-;HR%bPqavsV$c$|D zVQmB2b!Y^Y`-gJ6yZumtX3nM;HoW5Hch>t5y#ur9m9=U-{m;b?X!z?nbf%Sfzt-_= zds5Ll7T#rcM2uhgx@i1hQw-9I(c$^`)CFQ|zdB-iP|P)QSbcf?MxB+4-Z!-D(kCkCOdU)Gl|CMH}e(X8X3P;^kqv4vLn0)vK(1xb1 zaQ8?B(Z3>Wu(hi_nO86TgXUrjeA4V!)MJ?wPxo$|fv;)JCWTX6c=@(}106pTnQg|r z{!TsI@b70X%gopG;`tXeI^&UYL!vic+;;%;Q3AW`z4H(Fiy!eEZV*3u@k9K`72-=b zAih*8#h0c)e5efKPckWf6a?|3?hrqkFU6OtyVZ~f5WfnL;#UVDzBTEG_}0#QDGu=v zPn|5v{~UkC#t=WN{T@G~D!5&?NJ!m-0XDtEmpEyIE&nKz9Ey)1QD17YjdT!qb zE~oh2|Cvo$93Qs4?g1GuGa-%w4~RQ_Hlw*W!cdYlo*hTV(}UZ!$QE~w|HI%9sGngc z(o^yWt}y?c`z?vkQDVOP6XvIi*c8%An(uyFA5ABv#E|k?!e1@A4zUfu`$g^-{%Yto zI~o&kKrV-OlURSU9vwov=^iDiE^^*Kn)R9eAM{D9qgta0RGa+D+#S1 z&GqBwgN`$=XAQKC;OmEf0KYkNkrB%Ko6pyj=@9JFFL!U8KTlr;>179v$SVmC%J8B| zaVf;mU)0a=lp|e|NP48G-yGyUdM6Bhk?@y+w;rIhaVCVl*#&h|^*%$6P3PyE6j`j28D1$y^AAko>C;o~<$=DR$(-J!IIWZ! z>1O5Kn>KEC=Jb<&16*3d`O8b`{N?!!U$>|IdsF8vBK@MJnoFx6(wD9?M+ff=ar+P; z_$xfIk^s6dJu1GEDCZ+qy+R`I){~?RNi1}w) z^ePh9zZbnGLL;FbbZ1PPjsQz@Jz*s83vLU&kc;>@`+#5okwfd*>el;4& z?vv&6nT}kBauQAP3U~vU$*a-kt;~45Jq~Iu)@S99zPetVswnFx)pw_7b$(TEec7rC zQC_390a^Xn7EiAg_9$Jjj%@Zc!I6%lzOqSU3Obsym6T804e{HTw8iJYKE+Lnmye82pCl0Dwf_Q5++ z3Q@6y=VvxC4B74YFuj=fFU>hV_{*|FGU|%xU!H*VzXS33v|FM-HOE_@w+ofxe+hW_ N`~}%pOiy$Ae*h(Mp$-55 literal 588501 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≠KcuJ!<1!IQ!I} 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 Date: Mon, 18 Nov 2024 17:48:43 -0500 Subject: [PATCH 25/37] Fix client crash during final killcam (#900) By adding a sanity check to see if the passed string is empty or not. --- .../mod/scripts/vscripts/client/cl_screenfade.gnut | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut b/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut index 9844b65b3..deccbac28 100644 --- a/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut +++ b/Northstar.Client/mod/scripts/vscripts/client/cl_screenfade.gnut @@ -247,8 +247,10 @@ void function PlayerPainSoundThread() ourPlayer = localViewPlayer; soundLayer2Start = GetPainSound( ourPlayer, "sound_pain_layer2_start" ) soundLayer2Loop = GetPainSound( ourPlayer, "sound_pain_layer2_loop" ) - EmitSoundOnEntity( ourPlayer, soundLayer2Start ) - EmitSoundOnEntity( ourPlayer, soundLayer2Loop ) + if ( soundLayer2Start != "" ) + EmitSoundOnEntity( ourPlayer, soundLayer2Start ) + if ( soundLayer2Loop != "" ) + EmitSoundOnEntity( ourPlayer, soundLayer2Loop ) } else { @@ -274,7 +276,8 @@ void function PlayerPainSoundThread() ourPlayer = localViewPlayer soundLayer3Loop = GetPainSound( ourPlayer, "sound_pain_layer3_loop" ) soundLayer3End = GetPainSound( ourPlayer, "sound_pain_layer3_end" ) - EmitSoundOnEntity( ourPlayer, soundLayer3Loop ) + if ( soundLayer3Loop != "" ) + EmitSoundOnEntity( ourPlayer, soundLayer3Loop ) } else { From c1649d1e1d719b2859041afa1cbff32ee090a885 Mon Sep 17 00:00:00 2001 From: Respawn Date: Thu, 21 Nov 2024 23:37:35 +0100 Subject: [PATCH 26/37] Add cl_damage_indicator.gnut from englishclient_mp_common --- .../vscripts/client/cl_damage_indicator.gnut | 951 ++++++++++++++++++ 1 file changed, 951 insertions(+) create mode 100644 Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut diff --git a/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut b/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut new file mode 100644 index 000000000..4857c109d --- /dev/null +++ b/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut @@ -0,0 +1,951 @@ +untyped + +global function ClDamageIndicator_Init +global function Create_DamageIndicatorHUD +global function DamageIndicators +global function GrenadeArrowThink +global function RumbleForTitanDamage + +global function ServerCallback_TitanTookDamage +global function ServerCallback_PilotTookDamage +//global function ClientCodeCallback_OnMissileCreation +global function ClientCodeCallback_CreateGrenadeIndicator + +global function DamageIndicatorRui + +global function ShowGrenadeArrow + +global function SCB_AddGrenadeIndicatorForEntity + +const DAMAGEARROW_FADEANIM = "damage_fade" +const DAMAGEARROW_DURATION = 2.5 +const DAMAGEARROW_SMALL = 0 +const DAMAGEARROW_MEDIUM = 1 +const DAMAGEARROW_LARGE = 2 + +const float DAMAGEHUD_GRENADE_DEBOUNCE_TIME = 0.4 +const float DAMAGEHUD_GRENADE_DEBOUNCE_TIME_LOWSPEED = 0.15 +const float DAMAGEHUD_GRENADE_DEBOUNCE_TIME_LOWSPEED_VELOCITYCUTOFF = 500.0 + + +struct { + array damageArrows + int currentDamageArrow = 0 + int numDamageArrows = 16 + float damageArrowFadeDuration = 1.0 + float damageArrowTime = 0.0 + vector damageArrowAngles = < 0.0, 0.0, 0.0 > + vector damageArrowPointCenter = < 0.0, 0.0, 0.0 > + + table whizByFX = { + small = null, + large = null, + titan = null, + } + + array
    arrowIncomingAnims = [ + { anim = "damage_incoming_small", duration = 1.5 }, + { anim = "damage_incoming", duration = 1.75 }, + { anim = "damage_incoming_large", duration = 2.00 }, + ] + + int damageIndicatorCount = 0 +} file + +function ClDamageIndicator_Init() +{ + RegisterSignal( "CriticalHitReceived" ) + + AddCreateCallback( "titan_cockpit", DamageArrow_CockpitInit ) + + PrecacheParticleSystem( $"P_wpn_grenade_frag_icon" ) + PrecacheParticleSystem( $"P_wpn_grenade_frag_blue_icon" ) + PrecacheParticleSystem( $"P_wpn_grenade_smoke_icon" ) + + if ( !IsLobby() ) + AddCallback_EntitiesDidLoad( InitDamageArrows ) +} + +function ServerCallback_TitanTookDamage( damage, x, y, z, damageType, damageSourceId, attackerEHandle, eModId, doomedNow, doomedDamage ) +{ + expect float( damage ) + expect int( damageType ) + expect int( damageSourceId ) + expect bool( doomedNow ) + expect int( doomedDamage ) + + if ( IsWatchingThirdPersonKillReplay() ) + return + + if ( DebugVictimClientDamageFeedbackIsEnabled() && (damage > 0.0) ) + { + entity attacker = attackerEHandle ? GetHeavyWeightEntityFromEncodedEHandle( attackerEHandle ) : null + entity localViewPlayer = GetLocalViewPlayer() + bool isHeadShot = (damageType & DF_HEADSHOT) ? true : false + bool isKillShot = (damageType & DF_KILLSHOT) ? true : false + bool isCritical = (damageType & DF_CRITICAL) ? true : false + bool isDoomProtected = (damageType & DF_DOOM_PROTECTED) ? true : false + bool isDoomFatality = (damageType & DF_DOOM_FATALITY) ? true : false + + local weaponMods = [] + if ( eModId != null && eModId in modNameStrings ) + weaponMods.append( modNameStrings[eModId] ) + + string modDesc = ((eModId != null && eModId in modNameStrings) ? (expect string( modNameStrings[eModId] )) : "") + DebugTookDamagePrint( localViewPlayer, attacker, damage, damageSourceId, modDesc, isHeadShot, isKillShot, isCritical, doomedNow, doomedDamage, isDoomProtected, isDoomFatality ) + } + + // It appears to be faster here to create a new thread so other functions called can wait until the frame ends before running. + thread TitanTookDamageThread( damage, x, y, z, damageType, damageSourceId, attackerEHandle, eModId, doomedNow, doomedDamage ) + + vector damageOrigin = < x, y, z > + entity attacker = attackerEHandle ? GetHeavyWeightEntityFromEncodedEHandle( attackerEHandle ) : null + + if ( damageSourceId in clGlobal.onLocalPlayerTookDamageCallback ) + { + foreach ( callback in clGlobal.onLocalPlayerTookDamageCallback[ damageSourceId ] ) + callback( damage, damageOrigin, damageType, damageSourceId, attacker ) + } +} + +function TitanTookDamageThread( float damage, x, y, z, int damageType, int damageSourceId, attackerEHandle, eModId, bool doomedNow, int doomedDamage ) +{ + WaitEndFrame() + + entity attacker = attackerEHandle ? GetHeavyWeightEntityFromEncodedEHandle( attackerEHandle ) : null + entity localViewPlayer = GetLocalViewPlayer() + entity cockpit = localViewPlayer.GetCockpit() + + if ( cockpit && IsTitanCockpitModelName( cockpit.GetModelName() ) ) + TitanCockpit_DamageFeedback( localViewPlayer, cockpit, damage, damageType, < x, y, z >, damageSourceId, doomedNow, doomedDamage ) + + if ( damage >= DAMAGE_BREAK_MELEE_ASSIST ) + localViewPlayer.Lunge_ClearTarget() + + if ( damageSourceId != eDamageSourceId.bubble_shield ) //Don't play Betty OS dialogue if we took damage by bubble shield. We don't have appropriate dialogue for it. + Tracker_PlayerAttackedByTarget( localViewPlayer, attacker ) + + array weaponMods + if ( eModId != null && eModId in modNameStrings ) + weaponMods.append( expect string( modNameStrings[ eModId ] ) ) + + if ( (damage > 0.0) || doomedDamage ) + { + vector damageOrigin = < x, y, z > + DamageHistoryStruct damageHistory = StoreDamageHistoryAndUpdate( localViewPlayer, MAX_DAMAGE_HISTORY_TIME, damage, damageOrigin, damageType, damageSourceId, attacker, weaponMods ) + DamageIndicators( damageHistory, true ) + } + + entity soul = localViewPlayer.GetTitanSoul() + if ( PlayerHasPassive( localViewPlayer, ePassives.PAS_AUTO_EJECT ) ) //TODO: Handle nuclear eject if we ever allow nuclear + auto eject combo again + { + if ( ShouldPlayAutoEjectAnim( localViewPlayer, soul, doomedNow ) ) + thread PlayerEjects( localViewPlayer, cockpit ) + + } + + if ( damageType & DF_CRITICAL ) + { + localViewPlayer.Signal( "CriticalHitReceived" ) + EmitSoundOnEntity( localViewPlayer, "titan_damage_crit_3p_vs_1p" ) + } +} + +bool function ShouldPlayAutoEjectAnim( entity player, entity titanSoul, bool doomedNow ) +{ + if ( !titanSoul.IsDoomed() ) + return false + + if ( player.ContextAction_IsActive() && !player.ContextAction_IsBusy() ) //Some other context action, e.g. melee instead of eject. Then again + return false + + return true +} + +string function DevBuildAttackerDesc( entity localViewPlayer, entity ent ) +{ + if ( ent == null ) + return "" + + if ( localViewPlayer == ent ) + return ("") + + if ( ent.IsPlayer() ) + return ("'" + ent.GetPlayerName() + "' " + ent.GetPlayerSettings()) + + entity bossPlayer = ent.GetBossPlayer() + string ownerString = ((bossPlayer != null) ? (bossPlayer.GetPlayerName() + "'s ") : "") + + var sigName = ent.GetSignifierName() + string debugName = (sigName != null) ? expect string( sigName ) : ent.GetClassName() + return (ownerString + debugName) +} + +void function DebugTookDamagePrint( entity ornull localViewPlayer, entity attacker, float damage, int damageSourceId, string modDesc, bool isHeadShot, bool isKillShot, bool isCritical, bool isDoomShot, int doomShotDamage, bool isDoomProtected, bool isDoomFatality ) +{ + Assert( localViewPlayer ) + string attackerDesc = DevBuildAttackerDesc( expect entity( localViewPlayer ), attacker ) + string timePrint = format( "%d:%.2f", FrameCount(), PlatformTime() ) + printt( + "{"+timePrint+"} TOOK DAMAGE: " + damage + + (isHeadShot ? " (headshot)" : "") + + (isCritical ? " (critical)" : "") + + (isKillShot ? " (KILLED)" : "") + + (isDoomShot ? " (DOOMED dmg:" + doomShotDamage + ")" : "") + + (isDoomProtected ? " (DOOM PROTECTION)" : "") + + (isDoomFatality ? " (DOOM FATALITY)" : "") + + " " + attackerDesc + + " w/ " + GetObitFromDamageSourceID( damageSourceId ) + modDesc + ) +} + +void function PlayVictimHeadshotConfirmation( bool isKillShot ) +{ + entity localViewPlayer = GetLocalViewPlayer() + if ( localViewPlayer == null ) + return + + if ( isKillShot ) + EmitSoundOnEntity( localViewPlayer, "Player.Hitbeep_headshot.Kill.Human_3P_vs_1P" ) + else + EmitSoundOnEntity( localViewPlayer, "Player.Hitbeep_headshot.Human_3P_vs_1P" ) +} + +void function RumbleForPilotDamage( float damageAmount ) +{ + Rumble_Play( "rumble_pilot_hurt", {} ) +} + +void function RumbleForTitanDamage( float damageAmount ) +{ + string rumbleName; + if ( damageAmount < 500 ) + rumbleName = "titan_damaged_small" + else if ( damageAmount < 1000 ) + rumbleName = "titan_damaged_med" + else + rumbleName = "titan_damaged_big" + + Rumble_Play( rumbleName, {} ) +} + +function ServerCallback_PilotTookDamage( damage, x, y, z, damageType, damageSourceId, attackerEHandle, eModId ) +{ + expect float( damage ) + expect int( damageType ) + expect int( damageSourceId ) + + if ( IsWatchingThirdPersonKillReplay() ) + return + + entity attacker = attackerEHandle ? GetHeavyWeightEntityFromEncodedEHandle( attackerEHandle ) : null + entity localViewPlayer = GetLocalViewPlayer() + vector damageOrigin = < x, y, z > + + bool isHeadShot = (damageType & DF_HEADSHOT) ? true : false + bool isKillShot = (damageType & DF_KILLSHOT) ? true : false + + if ( isHeadShot ) + PlayVictimHeadshotConfirmation( isKillShot ); + + //Jolt view if player is getting meleed + if ( damageSourceId == eDamageSourceId.human_melee ) + { + vector joltDir = Normalize( localViewPlayer.CameraPosition() - damageOrigin ) + //clear melee assist when you get meleed + localViewPlayer.Lunge_ClearTarget() + } + + array weaponMods + if ( eModId != null && eModId in modNameStrings ) + weaponMods.append( expect string( modNameStrings[ eModId ] ) ) + + if ( DebugVictimClientDamageFeedbackIsEnabled() && !IsWatchingReplay() ) + { + string modDesc = (weaponMods.len() > 0 ? (" +" + weaponMods[0]) : "") + bool isCritical = (damageType & DF_CRITICAL) ? true : false + + DebugTookDamagePrint( localViewPlayer, attacker, damage, damageSourceId, modDesc, isHeadShot, isKillShot, isCritical, false, 0, false, false ) + } + + RumbleForPilotDamage( damage ) + + DamageHistoryStruct damageTable = StoreDamageHistoryAndUpdate( localViewPlayer, MAX_DAMAGE_HISTORY_TIME, damage, damageOrigin, damageType, damageSourceId, attacker, weaponMods ) + + DamageIndicators( damageTable, false ) + + if ( damageSourceId in clGlobal.onLocalPlayerTookDamageCallback ) + { + foreach ( callback in clGlobal.onLocalPlayerTookDamageCallback[ damageSourceId ] ) + callback( damage, damageOrigin, damageType, damageSourceId, attacker ) + } +} + +/* +void function ClientCodeCallback_OnMissileCreation( entity missileEnt, string weaponName, bool firstTime ) +{ + +} +*/ + +void function ClientCodeCallback_CreateGrenadeIndicator( entity missileEnt, string weaponName ) +{ + if ( !IsValid( missileEnt ) ) + return + + //Called for all projectiles, not just missiles. + TryAddGrenadeIndicator( missileEnt, weaponName ) +} + + +void function DamageIndicators( DamageHistoryStruct damageHistory, bool playerIsTitan ) +{ + if ( damageHistory.damageType & DF_NO_INDICATOR ) + return + if ( !level.clientScriptInitialized ) + return + if ( IsWatchingThirdPersonKillReplay() ) + return + + entity localViewPlayer = GetLocalViewPlayer() + + int arrowType = DAMAGEARROW_MEDIUM + + if ( IsValid( damageHistory.attacker ) ) + { + if ( damageHistory.attacker == localViewPlayer ) + return + + if ( damageHistory.attacker.IsTitan() ) + arrowType = DAMAGEARROW_MEDIUM + else if ( damageHistory.attacker.IsPlayer() ) + arrowType = DAMAGEARROW_SMALL + else + arrowType = DAMAGEARROW_SMALL + + //if ( damageHistory.attacker.IsTitan() ) + // arrowType = DAMAGEARROW_LARGE + //else if ( damageHistory.attacker.IsPlayer() ) + // arrowType = DAMAGEARROW_MEDIUM + //else + // arrowType = DAMAGEARROW_SMALL + } + + if ( playerIsTitan ) + { + entity cockpit = localViewPlayer.GetCockpit() + + if ( !cockpit ) + return + + vector dirToDamage = damageHistory.origin - localViewPlayer.GetOrigin() + dirToDamage.z = 0 + dirToDamage = Normalize( dirToDamage ) + + vector playerViewForward = localViewPlayer.GetViewVector() + playerViewForward.z = 0.0 + playerViewForward = Normalize( playerViewForward ) + + float damageFrontDot = DotProduct( dirToDamage, playerViewForward ) + + if ( damageFrontDot >= 0.707107 ) + cockpit.AddToTitanHudDamageHistory( COCKPIT_PANEL_TOP, damageHistory.damage ) + else if ( damageFrontDot <= -0.707107 ) + cockpit.AddToTitanHudDamageHistory( COCKPIT_PANEL_BOTTOM, damageHistory.damage ) + else + { + vector playerViewRight = localViewPlayer.GetViewRight() + playerViewRight.z = 0.0 + playerViewRight = Normalize( playerViewRight ) + + float damageRightDot = DotProduct( dirToDamage, playerViewRight ) + + if ( damageRightDot >= 0.707107 ) + cockpit.AddToTitanHudDamageHistory( COCKPIT_PANEL_RIGHT, damageHistory.damage ) + else + cockpit.AddToTitanHudDamageHistory( COCKPIT_PANEL_LEFT, damageHistory.damage ) + } + + if ( damageHistory.attacker && damageHistory.attacker.GetParent() == localViewPlayer ) + { + damageHistory.rodeoDamage = true + return + } + } + + #if SP + if ( IsValid( damageHistory.attacker ) && damageHistory.attacker.IsTitan() ) + arrowType = DAMAGEARROW_LARGE + else if ( playerIsTitan && damageHistory.damage < 50 ) + return + else if ( !playerIsTitan && damageHistory.damage < 15 ) + arrowType = DAMAGEARROW_SMALL + else + arrowType = DAMAGEARROW_MEDIUM + + thread DamageIndicatorRui( damageHistory.origin, arrowType, playerIsTitan ) + #else + bool show2DIndicator = true + bool show3DIndicator = false + + const int DAMAGE_INDICATOR_STYLE_2D_ONLY = 0 + const int DAMAGE_INDICATOR_STYLE_BOTH = 1 + const int DAMAGE_INDICATOR_STYLE_3D_ONLY = 2 + + if ( playerIsTitan ) + { + show2DIndicator = GetConVarInt( "damage_indicator_style_titan" ) != DAMAGE_INDICATOR_STYLE_3D_ONLY + show3DIndicator = GetConVarInt( "damage_indicator_style_titan" ) != DAMAGE_INDICATOR_STYLE_2D_ONLY + } + else + { + show2DIndicator = GetConVarInt( "damage_indicator_style_pilot" ) != DAMAGE_INDICATOR_STYLE_3D_ONLY + show3DIndicator = GetConVarInt( "damage_indicator_style_pilot" ) != DAMAGE_INDICATOR_STYLE_2D_ONLY + } + + if ( show2DIndicator ) + thread DamageIndicatorRui( damageHistory.origin, arrowType, playerIsTitan ) + + if ( show3DIndicator ) + ShowDamageArrow( localViewPlayer, damageHistory.origin, arrowType, playerIsTitan, damageHistory.attacker ) + #endif +} + +const float DAMAGE_INDICATOR_DURATION = 4.0 + +void function DamageIndicatorRui( vector damageOrigin, int arrowType, bool playerIsTitan ) +{ + clGlobal.levelEnt.EndSignal( "KillReplayStarted" ) + clGlobal.levelEnt.EndSignal( "KillReplayEnded" ) + + // slop + float distance = Length( damageOrigin - GetLocalViewPlayer().CameraPosition() ) + float randomRange = GraphCapped( distance, 0.0, 2048, 0.0, 256.0 ) + damageOrigin = + + float startTime = Time() + + var rui = RuiCreate( $"ui/damage_indicator.rpak", clGlobal.topoFullScreen, RUI_DRAW_HUD, 0 ) + RuiSetResolutionToScreenSize( rui ) + RuiSetGameTime( rui, "startTime", startTime ) + RuiSetFloat( rui, "duration", DAMAGE_INDICATOR_DURATION ) + RuiSetInt( rui, "attackerType", arrowType ) + + file.damageIndicatorCount++ + int damageIndicatorThreshold = file.damageIndicatorCount + 8 + + OnThreadEnd( + function() : ( rui ) + { + RuiDestroy( rui ) + } + ) + + while ( Time() - startTime < DAMAGE_INDICATOR_DURATION && file.damageIndicatorCount < damageIndicatorThreshold ) + { + vector vecToDamage = damageOrigin - GetLocalViewPlayer().CameraPosition() + vecToDamage.z = 0 + vecToDamage = Normalize( vecToDamage ) + RuiSetFloat3( rui, "vecToDamage2D", vecToDamage ) + RuiSetFloat3( rui, "camVec2D", Normalize( AnglesToForward( < 0, GetLocalViewPlayer().CameraAngles().y, 0 > ) ) ) + RuiSetFloat( rui, "sideDot", vecToDamage.Dot( CrossProduct( <0, 0, 1>, Normalize( AnglesToForward( < 0, GetLocalViewPlayer().CameraAngles().y, 0 > ) ) ) ) ) + WaitFrame() + } +} + +void function ShowGrenadeArrow( entity player, entity grenade, float damageRadius, float startDelay, bool requireLos = true ) +{ + thread GrenadeArrowThink( player, grenade, damageRadius, startDelay, requireLos ) +} + +vector function GetRandomOriginWithinBounds( entity ent ) +{ + vector boundingMins = ent.GetBoundingMins() + vector boundingMaxs = ent.GetBoundingMaxs() + + vector randomOffset = < RandomFloatRange( boundingMins.x, boundingMaxs.x ), RandomFloatRange( boundingMins.y, boundingMaxs.y ), RandomFloatRange( boundingMins.z, boundingMaxs.z ) > + + return ent.GetOrigin() + randomOffset +} + +void function GrenadeArrowThink( entity player, entity grenade, float damageRadius, float startDelay, bool requireLos, string requiredPlayerState = "any" ) +{ + EndSignal( grenade, "OnDeath" ) //On death added primarily for frag_drones + EndSignal( grenade, "OnDestroy" ) + EndSignal( player, "OnDeath" ) + + wait startDelay + + asset grenadeModel = GRENADE_INDICATOR_FRAG_MODEL + vector grenadeOffset = < -5, 0, 0 > + if ( grenade instanceof C_Projectile ) + { + if ( grenade.ProjectileGetWeaponClassName() == "mp_weapon_grenade_sonar" ) + { + grenadeModel = GRENADE_INDICATOR_SONAR_MODEL + grenadeOffset = < -5, 0, 0 > + requireLos = false + } + } + else if ( grenade.IsNPC() ) + { + switch ( grenade.GetSignifierName() ) + { + #if MP + case "npc_stalker": + grenadeModel = GRENADE_INDICATOR_STALKER_MODEL + break + #endif + + case "npc_frag_drone": + grenadeModel = GRENADE_INDICATOR_TICK_MODEL + break + } + } + + entity arrow = CreateClientSidePropDynamic( < 0, 0, 0 >, < 0, 0, 0 >, GRENADE_INDICATOR_ARROW_MODEL ) + entity mdl = CreateClientSidePropDynamic( < 0, 0, 0 >, < 0, 0, 0 >, grenadeModel ) + + OnThreadEnd( + function() : ( arrow, mdl ) + { + if ( IsValid( arrow ) ) + arrow.Destroy() + if ( IsValid( mdl ) ) + mdl.Destroy() + } + ) + + entity cockpit = player.GetCockpit() + if ( !cockpit ) + return + + EndSignal( cockpit, "OnDestroy" ) + + arrow.SetParent( cockpit, "CAMERA_BASE" ) + arrow.SetAttachOffsetOrigin( < 25.0, 0.0, -4.0 > ) + + mdl.SetParent( arrow, "BACK" ) + mdl.SetAttachOffsetOrigin( grenadeOffset ) + + float lastVisibleTime = 0 + bool shouldBeVisible = true + + while ( true ) + { + cockpit = player.GetCockpit() + + switch ( requiredPlayerState ) + { + case "any": + shouldBeVisible = true + break + case "pilot": + shouldBeVisible = !player.IsTitan() + break + case "titan": + shouldBeVisible = player.IsTitan() + break + default: + Assert( false, "Invalid player state! Allower states: 'any' 'pilot' 'titan'" ) + + } + + if ( shouldBeVisible ) + { + if ( Distance( player.GetOrigin(), grenade.GetOrigin() ) > damageRadius || !cockpit ) + { + shouldBeVisible = false + } + else + { + bool tracePassed = false + + if ( requireLos ) + { + TraceResults result = TraceLine( grenade.GetOrigin(), GetRandomOriginWithinBounds( player ), grenade, TRACE_MASK_SHOT, TRACE_COLLISION_GROUP_NONE ) + + if ( result.fraction == 1.0 ) + tracePassed = true + } + + if ( requireLos && !tracePassed ) + { + shouldBeVisible = false + } + else + { + shouldBeVisible = true + lastVisibleTime = Time() + } + } + } + + if ( shouldBeVisible || Time() - lastVisibleTime < 0.25 ) + { + arrow.EnableDraw() + mdl.EnableDraw() + + arrow.DisableRenderWithViewModelsNoZoom() + arrow.EnableRenderWithCockpit() + arrow.EnableRenderWithHud() + mdl.DisableRenderWithViewModelsNoZoom() + mdl.EnableRenderWithCockpit() + mdl.EnableRenderWithHud() + + vector damageArrowAngles = AnglesInverse( player.EyeAngles() ) + vector vecToDamage = grenade.GetOrigin() - (player.EyePosition() + (player.GetViewVector() * 20.0)) + + // reparent for embark/disembark + if ( arrow.GetParent() == null ) + arrow.SetParent( cockpit, "CAMERA_BASE", true ) + + arrow.SetAttachOffsetAngles( damageArrowAngles.AnglesCompose( vecToDamage.VectorToAngles() ) ) + } + else + { + mdl.DisableDraw() + arrow.DisableDraw() + } + + WaitFrame() + } + +} + + +function Create_DamageIndicatorHUD() +{ +} + + +void function SCB_AddGrenadeIndicatorForEntity( int team, int ownerHandle, int eHandle, float damageRadius ) +{ + if ( !level.grenadeIndicatorEnabled ) + return + + #if DEV + if ( !level.clientScriptInitialized ) + return + #endif + + entity player = GetLocalViewPlayer() + entity owner = GetEntityFromEncodedEHandle( ownerHandle ) + + entity ent = GetEntityFromEncodedEHandle( eHandle ) + if ( !IsValid( ent ) ) + return + + if ( team == player.GetTeam() && owner != player ) + return + + //TryAddGrenadeIndicator( ent, "" ) // TODO: make function handle non-grenade ents +} + + +function TryAddGrenadeIndicator( grenade, weaponName ) +{ + #if DEV + if ( !level.clientScriptInitialized ) + return + #endif + + if ( !level.grenadeIndicatorEnabled ) + return + + expect entity( grenade ) + entity player = GetLocalViewPlayer() + + // view player may be null when dead + if ( !IsValid( player ) ) + return + + var className = grenade.GetClassName() + float damageRadius = 0.0 + + if ( className == "grenade" ) + { + damageRadius = grenade.GetDamageRadius() + } + else if ( grenade.ProjectileGetWeaponClassName() == "mp_titanweapon_arc_ball" ) + { + // arc ball doesn't arc to pilots so no need to show the warning + if ( !player.IsTitan() ) + return + + damageRadius = BALL_LIGHTNING_ZAP_RADIUS + } + else + { + return + } + + float radius = grenade.GetExplosionRadius() + + if ( player.IsPhaseShifted() ) + return + + + float startDelay = 0.0 + if ( grenade.GetOwner() == player ) + { + if ( !grenade.GetProjectileWeaponSettingBool( eWeaponVar.projectile_damages_owner ) && !grenade.GetProjectileWeaponSettingBool( eWeaponVar.explosion_damages_owner ) ) + return + + float relVelocity = Length( grenade.GetVelocity() - player.GetVelocity() ) + if ( relVelocity < DAMAGEHUD_GRENADE_DEBOUNCE_TIME_LOWSPEED_VELOCITYCUTOFF ) + startDelay = DAMAGEHUD_GRENADE_DEBOUNCE_TIME_LOWSPEED + else + startDelay = DAMAGEHUD_GRENADE_DEBOUNCE_TIME + } + else if ( grenade.GetTeam() == player.GetTeam() ) + { + return + } + + float padding = player.IsTitan() ? 204.0 : 65.0 + + //AddGrenadeIndicator( grenade, radius + padding, startDelay, false ) + ShowGrenadeArrow( player, grenade, radius + padding, startDelay ) + + //thread ShowRuiGrenadeThreatIndicator( grenade, float( radius ) + padding ) +} + +void function ShowRuiGrenadeThreatIndicator( entity grenade, float radius ) +{ + var rui = RuiCreate( $"ui/grenade_threat_indicator.rpak", clGlobal.topoCockpitHudPermanent, RUI_DRAW_COCKPIT, 0 ) + //var rui = CreateCockpitRui( $"ui/grenade_threat_indicator.rpak", 0 ) + RuiSetGameTime( rui, "startTime", Time() ) + RuiSetFloat( rui, "damageRadius", radius ) + //RuiTrackFloat3( rui, "pos", grenade, RUI_TRACK_ABSORIGIN_FOLLOW )` + RuiTrackFloat3( rui, "pos", grenade, RUI_TRACK_POINT_FOLLOW, grenade.LookupAttachment( "BACK" ) ) + + OnThreadEnd( + function() : ( rui ) + { + RuiDestroy( rui ) + } + ) + + grenade.WaitSignal( "OnDestroy" ) +} + + + +void function InitDamageArrows() +{ + for ( int i = 0; i < file.numDamageArrows; i++ ) + { + table arrowData = { + grenade = null + grenadeRadius = 0.0 + damageOrigin = < 0.0, 0.0, 0.0 >, + damageDirection = < 0.0, 0.0, 0.0 >, + endTime = -99.0 + DAMAGEARROW_DURATION, + startTime = -99.0, + isDying = false, + isVisible = false, + whizby = false, // hack until we get a new model/shader for the whizby indicator - Roger + attacker = null, + randomAngle = 0 // Repeated shots from the same attacker randomize the angle of the arrow. + } + + entity arrow = CreateClientSidePropDynamic( < 0, 0, 0 >, < 0, 0, 0 >, DAMAGEARROW_MODEL ) + arrow.SetCanCloak( false ) + arrow.SetVisibleForLocalPlayer( 0 ) + arrow.DisableDraw() + + arrowData.arrow <- arrow + arrow.s.arrowData <- arrowData + + file.damageArrows.append( arrowData ) + } + + entity arrow = CreateClientSidePropDynamic( < 0, 0, 0 >, < 0, 0, 0 >, DAMAGEARROW_MODEL ) + file.damageArrowFadeDuration = arrow.GetSequenceDuration( DAMAGEARROW_FADEANIM ) // 0.266 + arrow.Destroy() +} + + +void function DamageArrow_CockpitInit( entity cockpit ) +{ + entity localViewPlayer = GetLocalViewPlayer() + thread UpdateDamageArrows( localViewPlayer, cockpit ) +} + +function RefreshExistingDamageArrow( entity player, arrowData, int arrowType, damageOrigin ) +{ + //Hack - 10 tick rate is making damage feedback bunch up. If we improve that then shouldn't be threaded. + player.EndSignal( "OnDestroy" ) + entity cockpit = player.GetCockpit() + if ( IsValid( cockpit ) ) + cockpit.EndSignal( "OnDestroy" ) + + float time = Time() + + if ( arrowData.startTime == time ) + wait 0.05 + + if ( !arrowData.isVisible || arrowData.isDying ) + return + + time = Time() + arrowData.endTime = time + file.arrowIncomingAnims[ arrowType ].duration + arrowData.startTime = time + arrowData.damageOrigin = damageOrigin + arrowData.randomAngle = RandomIntRange( -3, 3 ) + PulseDamageArrow( expect entity( arrowData.arrow ), arrowType ) + UpdateDamageArrowVars( player ) + UpdateDamageArrowAngle( arrowData ) +} + +function ShowDamageArrow( entity player, damageOrigin, int arrowType, playerIsTitan, attacker ) +{ + if ( file.damageArrows.len() == 0 ) // not yet initialized + return + + table arrowData = file.damageArrows[file.currentDamageArrow] + entity arrow = expect entity( arrowData.arrow ) + + file.currentDamageArrow++ + if ( file.currentDamageArrow >= file.numDamageArrows ) + file.currentDamageArrow = 0 + + float time = Time() + + arrow.s.arrowData.damageOrigin = damageOrigin + arrow.s.arrowData.grenade = null + arrow.s.arrowData.grenadeRadius = 0.0 + arrow.s.arrowData.endTime = time + file.arrowIncomingAnims[ arrowType ].duration + arrow.s.arrowData.startTime = time + arrow.s.arrowData.isDying = false + arrow.s.arrowData.whizby = false // hack until we get a new model/shader for the whizby indicator + arrow.s.arrowData.attacker = attacker + + if ( !arrow.s.arrowData.isVisible ) + { + entity cockpit = player.GetCockpit() + + if ( !cockpit ) + return + + arrow.s.arrowData.isVisible = true + arrow.EnableDraw() + + arrow.DisableRenderWithViewModelsNoZoom() + arrow.EnableRenderWithCockpit() + + arrow.EnableRenderWithHud() + + arrow.SetParent( cockpit, "CAMERA_BASE" ) + arrow.SetAttachOffsetOrigin( < 20.0, 0.0, -2.0 > ) + } + + + PulseDamageArrow( arrow, arrowType ) + UpdateDamageArrowVars( player ) + UpdateDamageArrowAngle( arrowData ) +} + + +function PulseDamageArrow( entity arrow, int arrowType ) +{ + arrow.Anim_NonScriptedPlay( file.arrowIncomingAnims[ arrowType ].anim ) +} + +function UpdateDamageArrowVars( entity localViewPlayer ) +{ + file.damageArrowTime = Time() + file.damageArrowAngles = AnglesInverse( localViewPlayer.EyeAngles() ) + file.damageArrowPointCenter = localViewPlayer.EyePosition() + ( localViewPlayer.GetViewVector() * 20.0 ) +} + +function UpdateDamageArrowAngle( arrowData ) +{ + if ( IsValid( arrowData.grenade ) ) + arrowData.damageOrigin = arrowData.grenade.GetOrigin() + + vector vecToDamage = expect vector( arrowData.damageOrigin ) - file.damageArrowPointCenter + vector anglesToDamage = VectorToAngles( vecToDamage ) + vector eyeAngles = GetLocalViewPlayer().EyeAngles() + + float roll = sin( DegToRad( eyeAngles.y - anglesToDamage.y ) ) + + arrowData.arrow.SetAttachOffsetAngles( AnglesCompose( file.damageArrowAngles, anglesToDamage ) + < arrowData.randomAngle, 0, roll * 90.0 > ) + arrowData.damageDirection = Normalize( vecToDamage ) +} + +function UpdateDamageArrows( entity localViewPlayer, entity cockpit ) +{ + localViewPlayer.EndSignal( "OnDestroy" ) + cockpit.EndSignal( "OnDestroy" ) + + OnThreadEnd( + function() : ( localViewPlayer ) + { + foreach ( arrowData in file.damageArrows ) + { + if ( IsValid( arrowData.arrow ) ) + { + arrowData.arrow.DisableDraw() + arrowData.arrow.ClearParent() + arrowData.attacker = null + arrowData.isVisible = false + arrowData.randomAngle = 0 + } + } + } + ) + + bool varsUpdated = false + + while ( true ) + { + WaitEndFrame() + + vector playerOrigin = localViewPlayer.GetOrigin() + + varsUpdated = false + bool inPhaseShift = localViewPlayer.IsPhaseShifted() + + foreach ( arrowData in file.damageArrows ) + { + if ( !arrowData.isVisible ) + { + continue + } + + if ( arrowData.grenade != null ) + { + if ( !IsValid( arrowData.grenade ) ) + arrowData.endTime = 0.0 + } + + if ( (file.damageArrowTime >= arrowData.endTime) || inPhaseShift ) + { + arrowData.arrow.DisableDraw() + arrowData.arrow.ClearParent() + arrowData.attacker = null + arrowData.isVisible = false + arrowData.randomAngle = 0 + continue + } + + if ( !varsUpdated ) // only call UpdateDamageArrowVars if one or more of the file.damageArrows is visible + { + varsUpdated = true + UpdateDamageArrowVars( localViewPlayer ) + } + + UpdateDamageArrowAngle( arrowData ) + + if ( !arrowData.isDying && ( ( arrowData.endTime - file.damageArrowTime ) <= file.damageArrowFadeDuration ) ) + { + arrowData.isDying = true + arrowData.arrow.Anim_NonScriptedPlay( DAMAGEARROW_FADEANIM ) + } + } + + wait( 0.0 ) + } +} From e7aa1c2a3459c9a4ad63d89b5da577bf10e8366c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Raes?= Date: Fri, 22 Nov 2024 00:50:19 +0100 Subject: [PATCH 27/37] Refactor getting mod information (#899) Mod counterpart to the launcher PR. Adds a struct containing mod information instead of getting every field with its own dedicated function --- .github/nativefuncs.json | 148 +------------ .../vscripts/cl_northstar_client_init.nut | 13 ++ .../scripts/vscripts/ui/menu_ns_modmenu.nut | 194 ++++++++++-------- .../vscripts/ui/menu_ns_serverbrowser.nut | 122 ++++++----- .../vscripts/ui/menu_ns_setversionlabel.nut | 2 +- .../scripts/vscripts/ui/panel_mainmenu.nut | 4 +- 6 files changed, 203 insertions(+), 280 deletions(-) diff --git a/.github/nativefuncs.json b/.github/nativefuncs.json index 110429031..abc213caf 100644 --- a/.github/nativefuncs.json +++ b/.github/nativefuncs.json @@ -7,10 +7,10 @@ "argTypes":"" }, { - "name":"NSIsModEnabled", + "name":"NSGetModsInformation", "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" + "returnTypeString":"array", + "argTypes":"" }, { "name":"NSSetModEnabled", @@ -18,48 +18,6 @@ "returnTypeString":"void", "argTypes":"string modName, bool enabled" }, - { - "name":"NSIsModRemote", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSGetModDescriptionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModVersionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModDownloadLinkByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModLoadPriority", - "helpText":"", - "returnTypeString":"int", - "argTypes":"string modName" - }, - { - "name":"NSIsModRequiredOnClient", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSGetModConvarsByModName", - "helpText":"", - "returnTypeString":"array", - "argTypes":"string modName" - }, { "name":"DecodeJSON", "helpText":"converts a json string to a squirrel table", @@ -260,60 +218,12 @@ "returnTypeString":"array", "argTypes":"" }, - { - "name":"NSIsModEnabled", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, { "name":"NSSetModEnabled", "helpText":"", "returnTypeString":"void", "argTypes":"string modName, bool enabled" }, - { - "name":"NSIsModRemote", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSGetModDescriptionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModVersionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModDownloadLinkByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModLoadPriority", - "helpText":"", - "returnTypeString":"int", - "argTypes":"string modName" - }, - { - "name":"NSIsModRequiredOnClient", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSGetModConvarsByModName", - "helpText":"", - "returnTypeString":"array", - "argTypes":"string modName" - }, { "name":"DecodeJSON", "helpText":"converts a json string to a squirrel table", @@ -467,58 +377,22 @@ "argTypes":"" }, { - "name":"NSIsModEnabled", - "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSSetModEnabled", - "helpText":"", - "returnTypeString":"void", - "argTypes":"string modName, bool enabled" - }, - { - "name":"NSIsModRemote", + "name":"NSGetModsInformation", "helpText":"", - "returnTypeString":"bool", - "argTypes":"string modName" - }, - { - "name":"NSGetModDescriptionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModVersionByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModDownloadLinkByModName", - "helpText":"", - "returnTypeString":"string", - "argTypes":"string modName" - }, - { - "name":"NSGetModLoadPriority", - "helpText":"", - "returnTypeString":"int", - "argTypes":"string modName" + "returnTypeString":"array", + "argTypes":"" }, { - "name":"NSIsModRequiredOnClient", + "name":"NSGetModInformation", "helpText":"", - "returnTypeString":"bool", + "returnTypeString":"array", "argTypes":"string modName" }, { - "name":"NSGetModConvarsByModName", + "name":"NSSetModEnabled", "helpText":"", - "returnTypeString":"array", - "argTypes":"string modName" + "returnTypeString":"void", + "argTypes":"string modName, bool enabled" }, { "name": "NSFetchVerifiedModsManifesto", diff --git a/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut b/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut index 9e683a869..e4e44d51e 100644 --- a/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut +++ b/Northstar.Client/mod/scripts/vscripts/cl_northstar_client_init.nut @@ -29,6 +29,19 @@ global struct UIPresenceStruct { int gameState } +global struct ModInfo +{ + string name = "" + string description = "" + string version = "" + string downloadLink = "" + int loadPriority = 0 + bool enabled = false + bool requiredOnClient = false + bool isRemote + array conVars = [] +} + global struct RequiredModInfo { string name diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_modmenu.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_modmenu.nut index f08d69a72..67a184312 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_modmenu.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_modmenu.nut @@ -5,17 +5,8 @@ global function AddNorthstarModMenu_MainMenuFooter global function ReloadMods -struct modData { - string name = "" - string version = "" - string link = "" - int loadPriority = 0 - bool enabled = false - array conVars = [] -} - struct panelContent { - modData& mod + ModInfo& mod bool isHeader = false } @@ -37,10 +28,10 @@ struct { var menu array panels int scrollOffset = 0 - array enabledMods + array enabledMods var currentButton string searchTerm - modData& lastMod + ModInfo& lastMod } file const int PANELS_LEN = 15 @@ -150,11 +141,22 @@ void function OnModMenuClosed() } catch ( ex ) {} - array current = GetEnabledModsArray() + array current = GetEnabledModsArray() bool reload - foreach ( string mod in current ) + foreach ( ModInfo mod in current ) { - if ( file.enabledMods.find(mod) == -1 ) + bool notFound = true + + foreach ( ModInfo enMod in file.enabledMods ) + { + if ( mod.name == enMod.name ) + { + notFound = false + break + } + } + + if ( notFound ) { reload = true break @@ -176,10 +178,10 @@ void function OnModButtonFocused( var button ) RuiSetGameTime( rui, "startTime", -99999.99 ) // make sure it skips the whole animation for showing this RuiSetString( rui, "headerText", modName ) - RuiSetString( rui, "messageText", FormatModDescription( modName ) ) + RuiSetString( rui, "messageText", FormatModDescription() ) // Add a button to open the link with if required - string link = NSGetModDownloadLinkByModName( modName ) + string link = file.lastMod.downloadLink var linkButton = Hud_GetChild( file.menu, "ModPageButton" ) if ( link.len() ) { @@ -193,28 +195,44 @@ void function OnModButtonFocused( var button ) Hud_SetVisible( linkButton, false ) } - SetControlBarColor( modName ) + SetControlBarColor( file.lastMod ) - bool required = NSIsModRequiredOnClient( modName ) + bool required = file.lastMod.requiredOnClient Hud_SetVisible( Hud_GetChild( file.menu, "WarningLegendLabel" ), required ) Hud_SetVisible( Hud_GetChild( file.menu, "WarningLegendImage" ), required ) } void function OnModButtonPressed( var button ) { - string modName = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( button ) ) ) + file.scrollOffset - 1 ].mod.name - if ( StaticFind( modName ) && NSIsModEnabled( modName ) ) + ModInfo mod = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( button ) ) ) + file.scrollOffset - 1 ].mod + string modName = mod.name + if ( StaticFind( modName ) && mod.enabled ) CoreModToggleDialog( modName ) else { - NSSetModEnabled( modName, !NSIsModEnabled( modName ) ) - var panel = file.panels[ int ( Hud_GetScriptID( Hud_GetParent( button ) ) ) - 1 ] - SetControlBoxColor( Hud_GetChild( panel, "ControlBox" ), modName ) - SetControlBarColor( modName ) - SetModEnabledHelperImageAsset( Hud_GetChild( panel, "EnabledImage" ), modName ) - // RefreshMods() - UpdateListSliderPosition() - UpdateListSliderHeight() + NSSetModEnabled( modName, !mod.enabled ) + + // retrieve state of the mod that just got toggled + array infos = NSGetModInformation( mod.name ) + foreach ( modInfo in infos ) + { + if ( modInfo.name != modName || modInfo.version != mod.version ) + { + continue + } + + // Update UI mod state + file.mods[ int ( Hud_GetScriptID( Hud_GetParent( button ) ) ) + file.scrollOffset - 1 ].mod = modInfo + + var panel = file.panels[ int ( Hud_GetScriptID( Hud_GetParent( button ) ) ) - 1 ] + SetControlBoxColor( Hud_GetChild( panel, "ControlBox" ), modInfo ) + SetControlBarColor( modInfo ) + SetModEnabledHelperImageAsset( Hud_GetChild( panel, "EnabledImage" ), modInfo ) + // RefreshMods() + UpdateListSliderPosition() + UpdateListSliderHeight() + break + } } } @@ -230,8 +248,8 @@ void function OnAuthenticationAgreementButtonPressed( var button ) void function OnModLinkButtonPressed( var button ) { - string modName = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) + file.scrollOffset - 1 ].mod.name - string link = NSGetModDownloadLinkByModName( modName ) + ModInfo mod = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) + file.scrollOffset - 1 ].mod + string link = mod.downloadLink if ( link.find("http://") != 0 && link.find("https://") != 0 ) link = "http://" + link // links without the http or https protocol get opened in the internal browser LaunchExternalWebBrowser( link, WEBBROWSER_FLAG_FORCEEXTERNAL ) @@ -261,7 +279,7 @@ void function OnHideConVarsChange( var n ) if ( modName == "" ) return var rui = Hud_GetRui( Hud_GetChild( file.menu, "LabelDetails" ) ) - RuiSetString( rui, "messageText", FormatModDescription( modName ) ) + RuiSetString( rui, "messageText", FormatModDescription() ) } // LIST LOGIC @@ -284,23 +302,35 @@ void function CoreModToggleDialog( string mod ) void function DisableMod() { - string modName = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) + file.scrollOffset - 1 ].mod.name + ModInfo mod = file.mods[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) + file.scrollOffset - 1 ].mod + string modName = mod.name NSSetModEnabled( modName, false ) - var panel = file.panels[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) - 1] - SetControlBoxColor( Hud_GetChild( panel, "ControlBox" ), modName ) - SetControlBarColor( modName ) - SetModEnabledHelperImageAsset( Hud_GetChild( panel, "EnabledImage" ), modName ) + // retrieve state of the mod that just got toggled + array infos = NSGetModInformation( mod.name ) + foreach ( modInfo in infos ) + { + if ( modInfo.name != modName || modInfo.version != mod.version ) + { + continue + } + + var panel = file.panels[ int ( Hud_GetScriptID( Hud_GetParent( file.currentButton ) ) ) - 1] + SetControlBoxColor( Hud_GetChild( panel, "ControlBox" ), modInfo ) + SetControlBarColor( modInfo ) + SetModEnabledHelperImageAsset( Hud_GetChild( panel, "EnabledImage" ), modInfo ) - RefreshMods() + RefreshMods() + break + } } -array function GetEnabledModsArray() +array function GetEnabledModsArray() { - array enabledMods - foreach ( string mod in NSGetModNames() ) + array enabledMods + foreach ( ModInfo mod in NSGetModsInformation() ) { - if ( NSIsModEnabled( mod ) ) + if ( mod.enabled ) enabledMods.append( mod ) } return enabledMods @@ -324,29 +354,30 @@ void function UpdateList() void function RefreshMods() { - array modNames = NSGetModNames() + array mods = NSGetModsInformation() file.mods.clear() bool reverse = GetConVarBool( "modlist_reverse" ) - int lastLoadPriority = reverse ? NSGetModLoadPriority( modNames[ modNames.len() - 1 ] ) + 1 : -1 + int lastLoadPriority = reverse ? mods.top().loadPriority + 1 : -1 string searchTerm = Hud_GetUTF8Text( Hud_GetChild( file.menu, "BtnModsSearch" ) ).tolower() - for ( int i = reverse ? modNames.len() - 1 : 0; - reverse ? ( i >= 0 ) : ( i < modNames.len() ); + for ( int i = reverse ? mods.len() - 1 : 0; + reverse ? ( i >= 0 ) : ( i < mods.len() ); i += ( reverse ? -1 : 1) ) { - string mod = modNames[i] + ModInfo mod = mods[i] + string modName = mod.name // Do not display remote mods - if ( NSIsModRemote( mod ) ) + if ( mod.isRemote ) continue - if ( searchTerm.len() && mod.tolower().find( searchTerm ) == null ) + if ( searchTerm.len() && modName.tolower().find( searchTerm ) == null ) continue - bool enabled = NSIsModEnabled( mod ) - bool required = NSIsModRequiredOnClient( mod ) + bool enabled = mod.enabled + bool required = mod.requiredOnClient switch ( GetConVarInt( "filter_mods" ) ) { case filterShow.ONLY_ENABLED: @@ -367,11 +398,11 @@ void function RefreshMods() break } - int pr = NSGetModLoadPriority( mod ) + int pr = mod.loadPriority if ( reverse ? pr < lastLoadPriority : pr > lastLoadPriority ) { - modData m + ModInfo m m.name = pr.tostring() panelContent c @@ -381,16 +412,8 @@ void function RefreshMods() lastLoadPriority = pr } - modData m - m.name = mod - m.version = NSGetModVersionByModName( mod ) - m.link = NSGetModDownloadLinkByModName( mod ) - m.loadPriority = NSGetModLoadPriority( mod ) - m.enabled = enabled - m.conVars = NSGetModConvarsByModName( mod ) - panelContent c - c.mod = m + c.mod = mod file.mods.append( c ) } @@ -404,7 +427,7 @@ void function DisplayModPanels() break panelContent c = file.mods[ file.scrollOffset + i ] - modData mod = c.mod + ModInfo mod = c.mod var btn = Hud_GetChild( panel, "BtnMod" ) var headerLabel = Hud_GetChild( panel, "Header" ) var box = Hud_GetChild( panel, "ControlBox" ) @@ -434,53 +457,45 @@ void function DisplayModPanels() Hud_SetVisible( headerLabel, false ) - SetControlBoxColor( box, mod.name ) + SetControlBoxColor( box, mod ) Hud_SetVisible( box, true ) Hud_SetVisible( line, false ) - Hud_SetVisible( warning, NSIsModRequiredOnClient( c.mod.name ) ) + Hud_SetVisible( warning, mod.requiredOnClient ) - SetModEnabledHelperImageAsset( enabledImage, c.mod.name ) + SetModEnabledHelperImageAsset( enabledImage, c.mod ) } Hud_SetVisible( panel, true ) } } -void function SetModEnabledHelperImageAsset( var panel, string modName ) +void function SetModEnabledHelperImageAsset( var panel, ModInfo mod ) { - if( NSIsModEnabled( modName ) ) + if( mod.enabled ) RuiSetImage( Hud_GetRui( panel ), "basicImage", $"rui/menu/common/merit_state_success" ) else RuiSetImage( Hud_GetRui( panel ), "basicImage", $"rui/menu/common/merit_state_failure" ) - RuiSetFloat3(Hud_GetRui( panel ), "basicImageColor", GetControlColorForMod( modName ) ) + RuiSetFloat3(Hud_GetRui( panel ), "basicImageColor", GetControlColorForMod( mod ) ) Hud_SetVisible( panel, true ) } -void function SetControlBoxColor( var box, string modName ) +void function SetControlBoxColor( var box, ModInfo mod ) { var rui = Hud_GetRui( box ) - // if ( NSIsModEnabled( modName ) ) - // RuiSetFloat3(rui, "basicImageColor", <0,1,0>) - // else - // RuiSetFloat3(rui, "basicImageColor", <1,0,0>) - RuiSetFloat3(rui, "basicImageColor", GetControlColorForMod( modName ) ) + RuiSetFloat3(rui, "basicImageColor", GetControlColorForMod( mod ) ) } -void function SetControlBarColor( string modName ) +void function SetControlBarColor( ModInfo mod ) { var bar_element = Hud_GetChild( file.menu, "ModEnabledBar" ) var bar = Hud_GetRui( bar_element ) - // if ( NSIsModEnabled( modName ) ) - // RuiSetFloat3(bar, "basicImageColor", <0,1,0>) - // else - // RuiSetFloat3(bar, "basicImageColor", <1,0,0>) - RuiSetFloat3(bar, "basicImageColor", GetControlColorForMod( modName ) ) + RuiSetFloat3(bar, "basicImageColor", GetControlColorForMod( mod ) ) Hud_SetVisible( bar_element, true ) } -vector function GetControlColorForMod( string modName ) +vector function GetControlColorForMod( ModInfo mod ) { - if ( NSIsModEnabled( modName ) ) + if ( mod.enabled ) switch ( GetConVarInt( "colorblind_mode" ) ) { case 1: @@ -502,17 +517,20 @@ vector function GetControlColorForMod( string modName ) unreachable } -string function FormatModDescription( string modName ) +string function FormatModDescription() { + ModInfo mod = file.lastMod + string modName = mod.name + string ret // version - ret += format( "Version %s\n", NSGetModVersionByModName( modName ) ) + ret += format( "Version %s\n", mod.version ) // load priority - ret += format( "Load Priority: %i\n", NSGetModLoadPriority( modName ) ) + ret += format( "Load Priority: %i\n", mod.loadPriority ) // convars - array modCvars = NSGetModConvarsByModName( modName ) + array modCvars = mod.conVars if ( modCvars.len() != 0 && GetConVarBool( "modlist_show_convars" ) ) { ret += "ConVars: " @@ -529,7 +547,7 @@ string function FormatModDescription( string modName ) } // description - ret += format( "\n%s\n", NSGetModDescriptionByModName( modName ) ) + ret += format( "\n%s\n", mod.description ) return ret } diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut index cdeb8b3e0..f2effd128 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_serverbrowser.nut @@ -973,18 +973,27 @@ void function OnServerSelected_Threaded( var button ) foreach ( requiredModInfo in server.requiredMods ) { // Tolerate core mods having different versions - if ( requiredModInfo.name.len() > 10 && requiredModInfo.name.slice(0, 10) == "Northstar." ) + if ( IsCoreMod( requiredModInfo.name ) ) continue if ( !modNames.contains( requiredModInfo.name ) ) { - print( format ( "\"%s\" was not found locally, triggering manifesto fetching.", requiredModInfo.name ) ) - uninstalledModFound = true - break - } else if ( NSGetModVersionByModName( requiredModInfo.name ) != requiredModInfo.version ) { - print( format ( "\"%s\" was found locally but has version \"%s\" while server requires \"%s\", triggering manifesto fetching.", requiredModInfo.name, NSGetModVersionByModName( requiredModInfo.name ), requiredModInfo.version ) ) + print( format ( "\"%s\" was not found locally" + ( autoDownloadAllowed ? ", triggering manifesto fetching." : "." ), requiredModInfo.name ) ) uninstalledModFound = true break + } else { + array modVersions = GetModVersions( requiredModInfo.name ) + + if ( !modVersions.contains( requiredModInfo.version ) ) { + print( format ( "\"%s\" was found locally but has versions:", requiredModInfo.name ) ) + foreach ( string version in modVersions ) + { + print(" - " + version) + } + print( format ( "while server requires \"%s\"" + ( autoDownloadAllowed ? ", triggering manifesto fetching." : "." ), requiredModInfo.version ) ) + uninstalledModFound = true + break + } } } @@ -992,17 +1001,16 @@ void function OnServerSelected_Threaded( var button ) // mods can be installed through auto-download if ( uninstalledModFound && autoDownloadAllowed ) { - print("Auto-download is allowed, checking if missing mods can be installed automatically.") FetchVerifiedModsManifesto() } foreach ( RequiredModInfo mod in server.requiredMods ) { // Tolerate core mods having different versions - if ( mod.name.len() > 10 && mod.name.slice(0, 10) == "Northstar." ) + if ( IsCoreMod( mod.name ) ) continue - if ( !NSGetModNames().contains( mod.name ) || NSGetModVersionByModName( mod.name ) != mod.version ) + if ( !NSGetModNames().contains( mod.name ) || !GetModVersions( mod.name ).contains( mod.version ) ) { // Auto-download mod if ( autoDownloadAllowed ) @@ -1055,43 +1063,8 @@ void function OnServerSelected_Threaded( var button ) return } } - else - { - // this uses semver https://semver.org - array serverModVersion = split( mod.name, "." ) - array clientModVersion = split( NSGetModVersionByModName( mod.name ), "." ) - - bool semverFail = false - // if server has invalid semver don't bother checking - if ( serverModVersion.len() == 3 ) - { - // bad client semver - if ( clientModVersion.len() != serverModVersion.len() ) - semverFail = true - // major version, don't think we should need to check other versions - else if ( clientModVersion[ 0 ] != serverModVersion[ 0 ] ) - semverFail = true - } - - if ( semverFail ) - { - DialogData dialogData - dialogData.header = "#ERROR" - dialogData.message = Localize( "#WRONG_MOD_VERSION", mod.name, mod.version, NSGetModVersionByModName( mod.name ) ) - dialogData.image = $"ui/menu/common/dialog_error" - - #if PC_PROG - AddDialogButton( dialogData, "#DISMISS" ) - AddDialogFooter( dialogData, "#A_BUTTON_SELECT" ) - #endif // PC_PROG - AddDialogFooter( dialogData, "#B_BUTTON_DISMISS_RUI" ) - - OpenDialog( dialogData ) - - return - } - } + // If we get here, means that mod version exists locally => we good } if ( server.requiresPassword ) @@ -1136,25 +1109,31 @@ void function ThreadedAuthAndConnectToServer( string password = "", bool modsCha if ( NSWasAuthSuccessful() ) { // disable all RequiredOnClient mods that are not required by the server and are currently enabled - foreach ( string modName in NSGetModNames() ) + foreach ( ModInfo mod in NSGetModsInformation() ) { - if ( NSIsModRequiredOnClient( modName ) && NSIsModEnabled( modName ) ) + string modName = mod.name + string modVersion = mod.version + + if ( mod.requiredOnClient && mod.enabled ) { // find the mod name in the list of server required mods bool found = false foreach ( RequiredModInfo mod in file.lastSelectedServer.requiredMods ) { - if (mod.name == modName) + // this tolerates a version difference for requiredOnClient core mods (only Northstar.Custom for now) + if (mod.name == modName && ( IsCoreMod( modName ) || mod.version == modVersion )) { found = true + print(format("\"%s\" (v%s) is required and already enabled.", modName, modVersion)) break } } - // if we didnt find the mod name, disable the mod + // if we didn't find the mod name, disable the mod if (!found) { modsChanged = true NSSetModEnabled( modName, false ) + print(format("Disabled \"%s\" (v%s) since it's not required on server.", modName, modVersion)) } } } @@ -1162,10 +1141,33 @@ void function ThreadedAuthAndConnectToServer( string password = "", bool modsCha // enable all RequiredOnClient mods that are required by the server and are currently disabled foreach ( RequiredModInfo mod in file.lastSelectedServer.requiredMods ) { - if ( NSIsModRequiredOnClient( mod.name ) && !NSIsModEnabled( mod.name )) + string modName = mod.name + string modVersion = mod.version + array localModInfos = NSGetModInformation( modName ) + + // Tolerate core mods (only Northstar.Custom for now) having a different version than server + if ( IsCoreMod(modName) ) + { + if ( !localModInfos[0].enabled ) + { + modsChanged = true + NSSetModEnabled( modName, true ) + print(format("Enabled \"%s\" (v%s) to join server.", modName, localModInfos[0].version)) + } + } + + else { - modsChanged = true - NSSetModEnabled( mod.name, true ) + foreach( localMod in localModInfos ) + { + if ( localMod.version == mod.version ) + { + modsChanged = true + NSSetModEnabled( mod.name, true ) + print(format("Enabled \"%s\" (v%s) to join server.", modName, modVersion)) + break + } + } } } @@ -1361,3 +1363,19 @@ void function TriggerConnectToServerCallbacks( ServerInfo ornull targetServer = callback( expect ServerInfo( targetServer ) ) } } + +const array CORE_MODS = ["Northstar.Client", "Northstar.Coop", "Northstar.CustomServers", "Northstar.Custom"] +bool function IsCoreMod( string modName ) +{ + return CORE_MODS.find( modName ) != -1 +} + +array function GetModVersions( string modName ) +{ + array versions = [] + foreach ( ModInfo mod in NSGetModInformation( modName ) ) + { + versions.append( mod.version ) + } + return versions +} diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_setversionlabel.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_setversionlabel.nut index 6dbafde96..afba8a70d 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_setversionlabel.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_setversionlabel.nut @@ -5,6 +5,6 @@ void function NS_SetVersionLabel() { var mainMenu = GetMenu( "MainMenu" ) //Gets main menu element var versionLabel = GetElementsByClassname( mainMenu, "nsVersionClass" )[0] //Gets the label from the mainMenu element. - Hud_SetText( versionLabel, "v" + NSGetModVersionByModName("Northstar.Client")) //Sets the label text (Getting Northstar version from Northstar.Client) + Hud_SetText( versionLabel, "v" + NSGetModInformation( "Northstar.Client" )[0].version ) //Sets the label text (Getting Northstar version from Northstar.Client) } diff --git a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut index 2f1bcf025..330cd0d6a 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/panel_mainmenu.nut @@ -431,9 +431,9 @@ void function UpdatePlayButton( var button ) { // restrict non-vanilla players from accessing official servers bool hasNonVanillaMods = false - foreach ( string modName in NSGetModNames() ) + foreach ( ModInfo mod in NSGetModsInformation() ) { - if ( NSIsModEnabled( modName ) && NSIsModRequiredOnClient( modName ) ) + if ( mod.enabled && mod.requiredOnClient ) { hasNonVanillaMods = true break From aba62bfaf4556c3b6285066b43a6063976a8d4f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Raes?= Date: Fri, 22 Nov 2024 15:19:07 +0100 Subject: [PATCH 28/37] Make MAD process cancellable (#865) Mod counterpart to the launcher PR that makes a mod download via MAD cancellable. --- .github/nativefuncs.json | 6 ++++++ .../vscripts/ui/menu_ns_moddownload.nut | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/.github/nativefuncs.json b/.github/nativefuncs.json index abc213caf..10ceebd5d 100644 --- a/.github/nativefuncs.json +++ b/.github/nativefuncs.json @@ -414,6 +414,12 @@ "returnTypeString": "void", "argTypes": "string name, string version" }, + { + "name": "NSCancelModDownload", + "helpText": "prevents installation of the mod currently being installed", + "returnTypeString": "void", + "argTypes": "" + }, { "name": "NSGetModInstallState", "helpText": "get status of the mod currently being installed", diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut index 4968714c7..09001f57b 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ns_moddownload.nut @@ -9,6 +9,7 @@ global enum eModInstallStatus CHECKSUMING, EXTRACTING, DONE, + ABORTED, FAILED, FAILED_READING_ARCHIVE, FAILED_WRITING_TO_DISK, @@ -57,6 +58,11 @@ bool function DownloadMod( RequiredModInfo mod ) dialogData.message = Localize( "#DOWNLOADING_MOD_TEXT", mod.name, mod.version ) dialogData.showSpinner = true; + // Prevent download button + AddDialogButton( dialogData, "#CANCEL", void function() { + NSCancelModDownload() + }) + // Prevent user from closing dialog dialogData.forceChoice = true; OpenDialog( dialogData ) @@ -77,6 +83,13 @@ bool function DownloadMod( RequiredModInfo mod ) WaitFrame() } + // If download was aborted, don't close UI since it was closed by clicking cancel button + if ( state.status == eModInstallStatus.ABORTED ) + { + print("Mod download was cancelled by the user.") + return false; + } + printt( "Mod status:", state.status ) // Close loading dialog @@ -114,6 +127,12 @@ void function DisplayModDownloadErrorDialog( string modName ) { ModInstallState state = NSGetModInstallState() + // If user cancelled download, no need to display an error message + if ( state.status == eModInstallStatus.ABORTED ) + { + return + } + DialogData dialogData dialogData.header = Localize( "#FAILED_DOWNLOADING", modName ) dialogData.image = $"ui/menu/common/dialog_error" From 13211e9037d3c2d6bf5e0c1c2ff00fb9a7b3c36b Mon Sep 17 00:00:00 2001 From: William Miller Date: Fri, 22 Nov 2024 11:23:21 -0300 Subject: [PATCH 29/37] Add button to allow players to change teams (#872) Adds button and logic to allow players to switch teams. This is a feature used in FSU and popular on many servers. Team switch is disabled via script for some gamemodes where switching teams does not make sense. --- .../northstar_client_localisation_english.txt | 6 +++ .../mod/scripts/vscripts/ui/menu_ingame.nut | 21 ++++++++ .../vscripts/gamemodes/_gamemode_hidden.nut | 1 + .../vscripts/gamemodes/_gamemode_inf.gnut | 1 + Northstar.CustomServers/mod.json | 5 ++ .../vscripts/mp/_base_gametype_mp.gnut | 49 +++++++++++++++++++ 6 files changed, 83 insertions(+) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt index f7c5ee2d1..76e4fce1f 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_english.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_english.txt @@ -312,6 +312,12 @@ Press Yes if you agree to this. This choice can be changed in the mods menu at a // In-game chat "HUD_CHAT_WHISPER_PREFIX" "[WHISPER]" "HUD_CHAT_SERVER_PREFIX" "[SERVER]" + + // Team Switching + "TEAMSWITCH_GAMEMODE" "Gamemode does not allow Team Switching" + "TEAMSWITCH_BUFFER" "Team Switching is on Cooldown" + "TEAMSWITCH_GAMEPLAY" "Team change not allowed outside playing phase" + "TEAMSWITCH_DISABLED" "Current gamemode doesn't support team change" "NO_GAMESERVER_RESPONSE" "Couldn't reach game server" "BAD_GAMESERVER_RESPONSE" "Game server gave an invalid response" diff --git a/Northstar.Client/mod/scripts/vscripts/ui/menu_ingame.nut b/Northstar.Client/mod/scripts/vscripts/ui/menu_ingame.nut index 35c9e9bae..ac617a9c7 100644 --- a/Northstar.Client/mod/scripts/vscripts/ui/menu_ingame.nut +++ b/Northstar.Client/mod/scripts/vscripts/ui/menu_ingame.nut @@ -85,6 +85,9 @@ void function InitInGameMPMenu() var gameHeader = AddComboButtonHeader( comboStruct, headerIndex, "#MENU_HEADER_GAME" ) var leaveButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#LEAVE_MATCH" ) Hud_AddEventHandler( leaveButton, UIE_CLICK, OnLeaveButton_Activate ) + var teamChangeButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "#SWITCH_TEAMS" ) + Hud_AddEventHandler( teamChangeButton, UIE_CLICK, OnRequestTeamSwitch ) + thread UpdateTeamSwitchButton_Threaded( teamChangeButton ) #if DEV var devButton = AddComboButton( comboStruct, headerIndex, buttonIndex++, "Dev" ) Hud_AddEventHandler( devButton, UIE_CLICK, AdvanceMenuEventHandler( GetMenu( "DevMenu" ) ) ) @@ -700,3 +703,21 @@ void function SetTitanSelectButtonVisibleState( bool state ) Hud_Hide( file.titanSelectButton ) } } + +void function UpdateTeamSwitchButton_Threaded( var button ) +{ + while ( true ) + { + Hud_SetLocked( button, !GetConVarBool( "ns_allow_team_change" ) ) + wait 0.5 + } +} + +void function OnRequestTeamSwitch( var button ) +{ + if ( !Hud_IsLocked( button ) ) + { + ClientCommand( "changeteam" ) + CloseAllMenus() + } +} diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_hidden.nut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_hidden.nut index 6729ff975..c3bdd4849 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_hidden.nut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_hidden.nut @@ -11,6 +11,7 @@ void function GamemodeHidden_Init() SetLoadoutGracePeriodEnabled( false ) // prevent modifying loadouts with grace period SetWeaponDropsEnabled( false ) SetRespawnsEnabled( false ) + SetGamemodeAllowsTeamSwitch( false ) Riff_ForceTitanAvailability( eTitanAvailability.Never ) Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) Riff_ForceSetEliminationMode( eEliminationMode.Pilots ) diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut index 02f0799a1..e03f01adf 100644 --- a/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_inf.gnut @@ -11,6 +11,7 @@ void function GamemodeInfection_Init() SetSpawnpointGamemodeOverride( FFA ) SetLoadoutGracePeriodEnabled( false ) // prevent modifying loadouts with grace period SetWeaponDropsEnabled( false ) + SetGamemodeAllowsTeamSwitch( false ) SetShouldUseRoundWinningKillReplay( true ) Riff_ForceTitanAvailability( eTitanAvailability.Never ) Riff_ForceBoostAvailability( eBoostAvailability.Disabled ) diff --git a/Northstar.CustomServers/mod.json b/Northstar.CustomServers/mod.json index fa51f4d41..6735306e6 100644 --- a/Northstar.CustomServers/mod.json +++ b/Northstar.CustomServers/mod.json @@ -49,6 +49,11 @@ "Name": "ns_progression_enabled", "DefaultValue": "0", "Flags": "ARCHIVE_PLAYERPROFILE" + }, + { + "Name": "ns_allow_team_change", + "DefaultValue": "1", + "Flags": "REPLICATED" } ], "Scripts": [ diff --git a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut index b77a37b2a..6b4e82d68 100644 --- a/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut +++ b/Northstar.CustomServers/mod/scripts/vscripts/mp/_base_gametype_mp.gnut @@ -18,6 +18,7 @@ global function TrackTitanDamageInPlayerGameStat global function ShouldEntTakeDamage_SPMP global function GetTitanBuildTime global function TitanPlayerHotDropsIntoLevel +global function SetGamemodeAllowsTeamSwitch global function SetRecalculateRespawnAsTitanStartPointCallback @@ -30,10 +31,13 @@ struct { array specCams entity functionref( entity player, entity basePoint ) recalculateRespawnAsTitanStartPointCallback + table playerChangeTeamTimeBuffer + bool gamemodeTeamSwitchEnabled = true } file void function BaseGametype_Init_MPSP() { + AddClientCommandCallback( "changeteam", ClientCommandCallbackChangeTeam ) AddSpawnCallback( "info_intermission", SetIntermissionCamera ) AddPostDamageCallback( "player", AddToTitanDamageStat ) @@ -630,6 +634,51 @@ void function SetRecalculateRespawnAsTitanStartPointCallback( entity functionref file.recalculateRespawnAsTitanStartPointCallback = callbackFunc } +void function SetGamemodeAllowsTeamSwitch( bool enabled ) +{ + file.gamemodeTeamSwitchEnabled = enabled +} + +bool function ClientCommandCallbackChangeTeam( entity player, array args ) +{ + if ( !GetConVarBool( "ns_allow_team_change" ) || IsPrivateMatchSpectator( player ) ) + return true + + if ( !file.gamemodeTeamSwitchEnabled ) + { + SendHudMessage( player, "#TEAMSWITCH_GAMEMODE", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 ) + return true + } + + if ( !( player in file.playerChangeTeamTimeBuffer ) ) + { + file.playerChangeTeamTimeBuffer[ player ] <- Time() + 5.0 + } + else + { + if ( file.playerChangeTeamTimeBuffer[ player ] > Time() ) + { + SendHudMessage( player, "#TEAMSWITCH_BUFFER", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 ) + return true + } + } + + if ( player in file.playerChangeTeamTimeBuffer && file.playerChangeTeamTimeBuffer[ player ] < Time() ) + file.playerChangeTeamTimeBuffer[ player ] = Time() + 5.0 + + if ( !GamePlaying() ) + { + SendHudMessage( player, "#TEAMSWITCH_GAMEPLAY", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 ) + return true + } + if ( GetCurrentPlaylistVarInt( "max_teams", 0 ) > 1 && !IsFFAGame() ) + SetTeam( player, GetOtherTeam( player.GetTeam() ) ) + else + SendHudMessage( player, "#TEAMSWITCH_DISABLED", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 ) + + return true +} + // stuff to change later bool function ShouldEntTakeDamage_SPMP( entity ent, var damageInfo ) From c568cf23d590877f648d53297880060e6ca0f469 Mon Sep 17 00:00:00 2001 From: Gazyi Date: Fri, 22 Nov 2024 17:25:41 +0300 Subject: [PATCH 30/37] Optional icons for server-side RUI announcements (#883) Adds optional icon support for server-side RUI announcements. --- Northstar.Custom/mod/scripts/vscripts/sh_message_utils.gnut | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/sh_message_utils.gnut b/Northstar.Custom/mod/scripts/vscripts/sh_message_utils.gnut index 4cfdc6fba..6bc1718a9 100644 --- a/Northstar.Custom/mod/scripts/vscripts/sh_message_utils.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/sh_message_utils.gnut @@ -185,13 +185,14 @@ void function NSSendPopUpMessageToPlayer( entity player, string text ) ServerToClientStringCommand( player, "ServerHUDMessageShow " + eMessageType.POPUP ) } -void function NSSendAnnouncementMessageToPlayer( entity player, string title, string description, vector color, int priority, int style ) +void function NSSendAnnouncementMessageToPlayer( entity player, string title, string description, vector color, int priority, int style, string image = "" ) { ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.TITLE + " " + title ) ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.DESC + " " + description ) ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.COLOR + " " + color.x + " " + color.y + " " + color.z ) ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.PRIORITY + " " + priority ) ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.STYLE + " " + style ) + ServerToClientStringCommand( player, "ServerHUDMessagePut " + eDataType.ASSET + " " + image ) ServerToClientStringCommand( player, "ServerHUDMessageShow " + eMessageType.ANNOUNCEMENT ) } @@ -453,6 +454,7 @@ void function AnnouncementMessageHandler_Threaded() Announcement_SetPriority( announcement, client.announcementQueue[0].priority ) Announcement_SetSoundAlias( announcement, SFX_HUD_ANNOUNCE_QUICK ) Announcement_SetStyle( announcement, client.announcementQueue[0].style ) + Announcement_SetIcon( announcement, StringToAsset( strip( client.announcementQueue[0].image ) ) ) AnnouncementFromClass( GetLocalViewPlayer(), announcement ) wait 5 From 1c485749406c93123ac6ac5579b3502d9457ab5e Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:30:28 +0100 Subject: [PATCH 31/37] Translations update from Weblate (#902) Translated using Weblate (Japanese) Currently translated at 95.9% (310 of 323 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/ja/ Co-authored-by: Akinasu333 --- .../mod/resource/northstar_client_localisation_japanese.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt b/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt index 798d603e0..47507c001 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_japanese.txt @@ -404,6 +404,7 @@ "PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000進行システムが開放されました!^\n\nNorthstarはバニラの進行システム、つまり武器、スキン、タイタン等をレベルアップやチャレンジ達成で解除する機能をサポートしています。\n\nこの進行システムは、ロビー画面下のボタンから有効にできます。\n\nこの設定はいつでも変更可能です。" "MOD_NOT_VERIFIED" "(Modが検証されていないため、自動ダウンロードできませんでした)" "WRONG_MOD_VERSION" "サーバーはMod\"%s1\"v%s2 を要求していますが、あなたのModバージョンは%s3です" + "MODE_MENU_PVPVE" "PvPvE" // Translation done by Zetryox and CYakigasi } From 2721e3c34af5ba106aabd5d85aa4c180f2f3eb2f Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Sat, 23 Nov 2024 12:04:00 +0100 Subject: [PATCH 32/37] Translations update from Weblate (#904) Translated using Weblate (Russian) Currently translated at 92.9% (304 of 327 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/ru/ Co-authored-by: WofWca --- .../northstar_client_localisation_russian.txt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt index a0f751ff1..bce3897d5 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt @@ -32,7 +32,7 @@ "PRIVATE_MATCH_SINGLEPLAYER_LEVEL" "%s1 (Одиночная игра)" // fra hint for private match menu, because fra only has PL_fra_desc in vanilla - "PL_fra_hint" "Ты один. Уничтожь противников, чтобы победить. Собери 3 батареи для вызова титана." + "PL_fra_hint" "Все против всех. Уничтожай противников, чтобы победить. Собери 3 батареи для вызова титана." // mode settings "MODE_SETTING_CATEGORY_PILOT" "Пилот" @@ -41,7 +41,7 @@ "MODE_SETTING_CATEGORY_MATCH" "Матч" "classic_mp" "Классический мультиплеер" - "run_epilogue" "Показывать эпилог" + "run_epilogue" "Запускать эпилог" "scorelimit" "Лимит очков" "roundscorelimit" "Лимит очков (по раундам)" "timelimit" "Лимит времени" @@ -86,12 +86,12 @@ "PL_gg_abbr" "ГВ" "GAMEMODE_GG" "Гонка вооружений" - "PL_tt" "Разборки Титанов" - "PL_tt_lobby" "Лобби разборок титанов" - "PL_tt_desc" "Зарабатывайте очки, пока вы находитесь в своём титане. Уничтожьте титана чтобы получить своего." - "PL_tt_hint" "Зарабатывайте очки, пока вы находитесь в своём титане. Уничтожьте титана чтобы получить своего." - "PL_tt_abbr" "TT" - "GAMEMODE_TT" "Разборки титанов" + "PL_tt" "Салочки" + "PL_tt_lobby" "Лобби салочек" + "PL_tt_desc" "Зарабатывайте очки будучи в титане. Уничтожьте титана чтобы получить собственного." + "PL_tt_hint" "Зарабатывайте очки будучи в титане. Уничтожьте титана чтобы получить собственного." + "PL_tt_abbr" "СЛ" + "GAMEMODE_TT" "Салочки" "PL_inf" "Заражение" "PL_inf_lobby" "Лобби Заражения" @@ -374,5 +374,9 @@ "MODE_MENU_UNKNOWN" "Неизвестный" "MODE_MENU_SWITCH" "Фильтр" "MODE_MENU_TITAN_ONLY" "Только титаны" + "TEAMSWITCH_BUFFER" "Нельзя сменять команду так часто" + "TEAMSWITCH_GAMEMODE" "Невозможно сменить команду в текущем режиме игры" + "TEAMSWITCH_DISABLED" "Нельзя сменить команду в текущем режиме игры" + "TEAMSWITCH_GAMEPLAY" "Команду можно сменять только в игровой стадии" } } From 2fa37b49918760217b572a66132d81dfa6ea4dbd Mon Sep 17 00:00:00 2001 From: Harmony Weblate <96563367+harmony-weblate@users.noreply.github.com> Date: Sun, 24 Nov 2024 11:58:19 +0100 Subject: [PATCH 33/37] Translations update from Weblate (#905) Translated using Weblate (Russian) Currently translated at 92.9% (304 of 327 strings) Translation: Northstar/Northstar Client Localisation Translate-URL: https://translate.harmony.tf/projects/northstar/client/ru/ Co-authored-by: WofWca --- .../northstar_client_localisation_russian.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt index bce3897d5..7742e768b 100644 --- a/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt +++ b/Northstar.Client/mod/resource/northstar_client_localisation_russian.txt @@ -97,7 +97,7 @@ "PL_inf_lobby" "Лобби Заражения" "PL_inf_desc" "Переживите инфекцию. Выжившие становятся заражёнными при убийстве." "PL_inf_hint" "Переживите инфекцию. Выжившие становятся заражёнными при убийстве." - "PL_inf_abbr" "INF" + "PL_inf_abbr" "ЗРЖ" "GAMEMODE_INF" "Заражение" "INFECTION_YOU_ARE_INFECTED" "Вас заразили!" "INFECTION_KILL_SURVIVORS" "Заразите всех оставшихся выживших." @@ -111,7 +111,7 @@ "PL_hs_lobby" "Лобби пряток" "PL_hs_desc" "Игра со стандартными правилами пряток." "PL_hs_hint" "Игра со стандартными правилами пряток." - "PL_hs_abbr" "HS" + "PL_hs_abbr" "ПРЯТ" "GAMEMODE_hs" "Прятки" "HIDEANDSEEK_YOU_ARE_SEEKER" "ВЫ ИЩЕТЕ" "HIDEANDSEEK_SEEKER_DESC" "Найдите прячущихся и ударьте их.\nВы появитесь через %s1 секунд(у)" @@ -280,7 +280,7 @@ "NO_RESULTS" "Нет результатов." "NO_MODS" "Нечего настраивать! Загрузите моды с ^5588FF00northstar.thunderstore.io^0." "respawnprotection" "Длит. защиты после возрождения" - "SNS_BANKRUPT_SUB" "Вас обнулил %s1" + "SNS_BANKRUPT_SUB" "Ваши очки сбросил %s1" "PL_hidden" "Невидимка" "PL_hidden_lobby" "Невидимка — лобби" "GAMEMODE_HIDDEN" "Невидимка" @@ -300,7 +300,7 @@ "PL_hidden_abbr" "НЕВИД" "SCOREBOARD_BANKRUPTS" "Врагов обанкрочено" "SNS_LEADER_BANKRUPT" "Лидер обанкрочен!" - "SNS_LEADER_BANKRUPT_SUB" "%s1 был обнулён игроком %s2" + "SNS_LEADER_BANKRUPT_SUB" "%s1 был сброшен игроком %s2" "gg_kill_reward" "Множитель награды за убийство" "gg_execution_reward" "Множитель награды за казнь" "PL_tffa" "Все против всех на титанах" @@ -322,8 +322,8 @@ "GAMEMODE_TFFA" "Все против всех на титанах" "SHOW_ONLY_DISABLED" "Только выключенные" "HIDE_LOCKED" "Скрыть недоступные" - "PL_chamber_desc" "Один выстрел — один труп. Заработайте ещё один патрон, убив врага первым." - "PL_chamber_hint" "Один выстрел — один труп. Заработайте ещё один патрон, убив врага первым." + "PL_chamber_desc" "Один выстрел — один труп. Один труп — ещё один выстрел." + "PL_chamber_hint" "Один выстрел — один труп. Один труп — ещё один выстрел." "PL_hidden_desc" "Один из игроков невидим." "PL_tffa_hint" "Каждый пилот сам за себя. Уничтожьте всех вражеских титанов." "sns_softball_kill_value" "Очков за убийство Софтболом" From a422da8a5f0f4f652be5f5c6f12fa61dab2333eb Mon Sep 17 00:00:00 2001 From: NachosChipeados <103285866+NachosChipeados@users.noreply.github.com> Date: Sun, 24 Nov 2024 18:30:14 -0400 Subject: [PATCH 34/37] Arc Cannon charge effect fixes (#862) Fixes the Arc Cannon's charge effect disappearing if you tried fanning it while using the "capacitor" mod, by making the effect turn off when its not charging. Additionally adds an unused extra charge effect. --- .../mod/scripts/weapons/mp_titanweapon_arc_cannon.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Northstar.Custom/mod/scripts/weapons/mp_titanweapon_arc_cannon.txt b/Northstar.Custom/mod/scripts/weapons/mp_titanweapon_arc_cannon.txt index 2672dca9c..0ef3ed33b 100644 --- a/Northstar.Custom/mod/scripts/weapons/mp_titanweapon_arc_cannon.txt +++ b/Northstar.Custom/mod/scripts/weapons/mp_titanweapon_arc_cannon.txt @@ -103,8 +103,11 @@ WeaponData "charge_effect_1p" "wpn_arc_cannon_charge_fp" "charge_effect_3p" "wpn_arc_cannon_charge" "charge_effect_attachment" "muzzle_flash" + "charge_effect2_1p" "wpn_ARC_knob_FP" + "charge_effect2_3p" "wpn_ARC_knob" + "charge_effect2_attachment" "SPINNING_KNOB" - + "charge_effect_show_during_drain" "0" // Spread "spread_stand_hip" "10" From 49791ea2edeb7192ef1d4d4659c485040b8da776 Mon Sep 17 00:00:00 2001 From: William Miller Date: Wed, 27 Nov 2024 06:56:21 -0300 Subject: [PATCH 35/37] Fix Thunderbolt crashing clients when owner is invalid (#906) Hacky fix that adds an extra check if the weapon in question is a thunderbolt --- .../mod/scripts/vscripts/client/cl_damage_indicator.gnut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut b/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut index 4857c109d..421bd097d 100644 --- a/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut +++ b/Northstar.Client/mod/scripts/vscripts/client/cl_damage_indicator.gnut @@ -366,7 +366,7 @@ void function DamageIndicators( DamageHistoryStruct damageHistory, bool playerIs cockpit.AddToTitanHudDamageHistory( COCKPIT_PANEL_LEFT, damageHistory.damage ) } - if ( damageHistory.attacker && damageHistory.attacker.GetParent() == localViewPlayer ) + if ( damageHistory.damageSourceId != eDamageSourceId.mp_weapon_arc_launcher && damageHistory.attacker && damageHistory.attacker.GetParent() == localViewPlayer ) { damageHistory.rodeoDamage = true return From c3c2535cc4142dd8871cdeeafc31d588b4e642ee Mon Sep 17 00:00:00 2001 From: Gazyi Date: Wed, 27 Nov 2024 12:57:11 +0300 Subject: [PATCH 36/37] Fix transferring active Stim ability to Titan and endless stim effects (#864) Fix endless Stim ability not playing loop sound and visual effects. Fix transferring active Pilot Stim ability to Titan when embarking it. Fix transferring active timed Stim ability to Titan. --- .../mod/scripts/vscripts/weapons/sh_stim.gnut | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut b/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut index 50e030eeb..fd8196267 100644 --- a/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut +++ b/Northstar.Custom/mod/scripts/vscripts/weapons/sh_stim.gnut @@ -40,20 +40,23 @@ void function StimPlayer( entity player, float duration, float severity = STIM_E void function StimPlayer_Internal( entity player, float duration, float effectSeverity ) { - int endlessStatusEffectHandle = 0 + // Handles for tracking status effects + int statusEffectHandle_SpeedBoost = 0 + int statusEffectHandle_StimVFX = 0 if ( duration == USE_TIME_INFINITE ) { - endlessStatusEffectHandle = StatusEffect_AddEndless( player, eStatusEffect.speed_boost, effectSeverity ) + statusEffectHandle_SpeedBoost = StatusEffect_AddEndless( player, eStatusEffect.speed_boost, effectSeverity ) + statusEffectHandle_StimVFX = StatusEffect_AddEndless( player, eStatusEffect.stim_visual_effect, 1.0 ) } else { - StatusEffect_AddTimed( player, eStatusEffect.speed_boost, effectSeverity, duration + 0.5, 0.25 ) // sound is slightly off - StatusEffect_AddTimed( player, eStatusEffect.stim_visual_effect, 1.0, duration, duration ) + statusEffectHandle_SpeedBoost = StatusEffect_AddTimed( player, eStatusEffect.speed_boost, effectSeverity, duration + 0.5, 0.25 ) // sound is slightly off + statusEffectHandle_StimVFX = StatusEffect_AddTimed( player, eStatusEffect.stim_visual_effect, 1.0, duration, duration ) } #if SERVER - thread StimThink( player, duration, endlessStatusEffectHandle ) -#else + thread StimThink( player, duration, statusEffectHandle_SpeedBoost, statusEffectHandle_StimVFX ) +#else // CLIENT entity cockpit = player.GetCockpit() if ( !IsValid( cockpit ) ) return @@ -63,15 +66,25 @@ void function StimPlayer_Internal( entity player, float duration, float effectSe } #if SERVER -void function StimThink( entity player, float duration, int endlessStatusEffectHandle ) +void function StimThink( entity player, float duration, int statusEffectHandle_SpeedBoost, int statusEffectHandle_StimVFX ) { player.EndSignal( "OnDeath" ) player.EndSignal( "OnChangedPlayerClass" ) - if ( endlessStatusEffectHandle != 0 ) - player.EndSignal( "StopEndlessStim" ) + player.EndSignal( "player_embarks_titan" ) // Prevent transferring active Stim ability to Titan. - EmitSoundOnEntityOnlyToPlayer( player, player, "pilot_stimpack_loop_1P" ) - EmitSoundOnEntityExceptToPlayer( player, player, "pilot_stimpack_loop_3P" ) + if ( duration == USE_TIME_INFINITE ) + { + player.EndSignal( "StopEndlessStim" ) + // TF|2 stim loop sounds don't actually loop, use TF|1 loop sound. + // TF|1 sound is very quiet, is there a way to boost its volume (it has 300% volume in TF|1), except playing 3 sounds at once? + // BUG: It still stops playing sometimes for whatever reason ( Too many sounds? ) + EmitSoundOnEntity( player, "Pilot_Stimpack_Loop" ) + } + else + { + EmitSoundOnEntityOnlyToPlayer( player, player, "pilot_stimpack_loop_1P" ) + EmitSoundOnEntityExceptToPlayer( player, player, "pilot_stimpack_loop_3P" ) + } int attachmentIndex = player.LookupAttachment( "CHESTFOCUS" ) @@ -82,7 +95,7 @@ void function StimThink( entity player, float duration, int endlessStatusEffectH //thread StimSlowmoAim( player, duration ) OnThreadEnd( - function() : ( player, stimFX, endlessStatusEffectHandle ) + function() : ( player, duration, stimFX, statusEffectHandle_SpeedBoost, statusEffectHandle_StimVFX ) { if ( !IsValid( player ) ) return @@ -90,11 +103,21 @@ void function StimThink( entity player, float duration, int endlessStatusEffectH if ( IsValid( stimFX ) ) EffectStop( stimFX ) - StopSoundOnEntity( player, "pilot_stimpack_loop_1P" ) - StopSoundOnEntity( player, "pilot_stimpack_loop_3P" ) - - if ( endlessStatusEffectHandle != 0 ) - StatusEffect_Stop( player, endlessStatusEffectHandle ) + if ( duration == USE_TIME_INFINITE ) + { + StopSoundOnEntity( player, "Pilot_Stimpack_Loop" ) + } + else + { + StopSoundOnEntity( player, "pilot_stimpack_loop_1P" ) + StopSoundOnEntity( player, "pilot_stimpack_loop_3P" ) + } + + if ( statusEffectHandle_SpeedBoost != 0 ) + StatusEffect_Stop( player, statusEffectHandle_SpeedBoost ) + + if ( statusEffectHandle_StimVFX != 0 ) + StatusEffect_Stop( player, statusEffectHandle_StimVFX ) player.Signal( "EndStim" ) } @@ -111,7 +134,7 @@ void function StimThink( entity player, float duration, int endlessStatusEffectH wait 2.0 } -#else // #if SERVER +#else // CLIENT void function StimVisualsEnabled( entity ent, int statusEffect, bool actuallyChanged ) { if ( ent != GetLocalViewPlayer() ) @@ -164,4 +187,4 @@ void function StimScreenFXThink( entity player, int fxHandle, entity cockpit ) } } -#endif // #else // #if SERVER +#endif \ No newline at end of file From 037760a29f4957082caccc791b978270bf78029b Mon Sep 17 00:00:00 2001 From: Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> Date: Thu, 5 Dec 2024 21:02:50 +0000 Subject: [PATCH 37/37] Run compile check on vanilla as well (#911) --- .github/workflows/compile-check.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/compile-check.yml b/.github/workflows/compile-check.yml index 8803f4f4c..c0fe8687a 100644 --- a/.github/workflows/compile-check.yml +++ b/.github/workflows/compile-check.yml @@ -17,6 +17,14 @@ jobs: with: mods-directory: "${{ github.workspace }}/mods" native-json: "${{ github.workspace }}/mods/.github/nativefuncs.json" + vanilla: false + + - name: Compile Scripts (Vanilla) + uses: ASpoonPlaysGames/squirrel-re-compiler@v3 + with: + mods-directory: "${{ github.workspace }}/mods" + native-json: "${{ github.workspace }}/mods/.github/nativefuncs.json" + vanilla: true # It's important that scripts compile when Northstar.Custom isn't enabled/installed, so run again without it - name: Remove Northstar.Custom @@ -28,3 +36,11 @@ jobs: with: mods-directory: "${{ github.workspace }}/mods" native-json: "${{ github.workspace }}/mods/.github/nativefuncs.json" + vanilla: false + + - name: Compile Scripts (Vanilla, No Northstar.Custom) + uses: ASpoonPlaysGames/squirrel-re-compiler@v3 + with: + mods-directory: "${{ github.workspace }}/mods" + native-json: "${{ github.workspace }}/mods/.github/nativefuncs.json" + vanilla: true