Merge branch 'diabolik/pyriaplayermodel' of ssh://git.xonotic.org/xonotic-data.pk3dir...
authorFruitieX <rasse@rasse-lappy.localdomain>
Thu, 13 May 2010 07:01:08 +0000 (10:01 +0300)
committerFruitieX <rasse@rasse-lappy.localdomain>
Thu, 13 May 2010 07:01:08 +0000 (10:01 +0300)
1  2 
defaultXonotic.cfg
qcsrc/client/Main.qc

diff --combined defaultXonotic.cfg
index 1c824e5b1cfd37ffbe34920e6782564ace0a2204,0008735b6e2e9e1e5e823c66433f7def8af24d83..bf36d94bb6e8c145c9b1feb331f9b5dd2b7718a5
@@@ -907,7 -907,7 +907,7 @@@ alias +zoom +button
  alias -zoom -button4
  alias +crouch +button5
  alias -crouch -button5
 -alias weapnext "_weapnext_${_supports_weaponpriority}${sbar_hudselector}${cl_weaponpriority_useforcycling}"
 +alias weapnext "_weapnext_${_supports_weaponpriority}${hud_hudselector}${cl_weaponpriority_useforcycling}"
  alias _weapnext_000 "impulse 10"
  alias _weapnext_001 "impulse 10"
  alias _weapnext_010 "impulse 10"
@@@ -921,7 -921,7 +921,7 @@@ alias _weapnext_111 "impulse 15
  alias _weapnext_120 "impulse 18"
  alias _weapnext_121 "impulse 15"
  alias weaplast "impulse 11"
 -alias weapprev "_weapprev_${_supports_weaponpriority}${sbar_hudselector}${cl_weaponpriority_useforcycling}"
 +alias weapprev "_weapprev_${_supports_weaponpriority}${hud_hudselector}${cl_weaponpriority_useforcycling}"
  alias _weapprev_000 "impulse 12"
  alias _weapprev_001 "impulse 12"
  alias _weapprev_010 "impulse 12"
@@@ -1326,139 -1326,34 +1326,139 @@@ con_chatwidth 0.
  con_notifysize 10
  con_notifyalign 0
  
 -sbar_info_pos 50
 -seta sbar_alpha_bg 0.8 "alpha value of the HUD background"
 -seta sbar_alpha_fg 1 "alpha value of the HUD foreground items"
 -seta sbar_border_thickness 1 "scoreboard border thickness"
 -seta sbar_accuracy_border_thickness 1 "accuracy stats border thickness"
 -seta sbar_accuracy_doublerows 0 "use two rows instead of one"
 -seta sbar_accuracy_yellow 40 "percentage at which the accuracy color is yellow"
 -seta sbar_accuracy 1 "0 = no weapon accuracy stats panel on scoreboard"
 -seta sbar_accuracy_hud 1 "0 = no weapon accuracy bar on the weapon icons"
 -seta sbar_color_bg_r 0 "red color component of the HUD background"
 -seta sbar_color_bg_g 0.25 "green color component of the HUD background"
 -seta sbar_color_bg_b 0.17 "blue color component of the HUD background"
 -seta sbar_color_bg_team 0.5 "team color multiplier of the HUD background"
 -seta sbar_scoreboard_alpha_bg 0.6 "scoreboard background alpha"
 -seta sbar_scoreboard_alpha_fg 1 "scoreboard foreground alpha"
 -seta sbar_scoreboard_alpha_name 0.9 "alpha of player text in scoreboard list other than self"
 -seta sbar_scoreboard_alpha_name_self 1 "alpha of player text in scoreboard list of self" 
 -seta sbar_scoreboard_fadeinspeed 10 "speed at which scoreboard fades in, higher is faster (0 = instant)"
 -seta sbar_scoreboard_fadeoutspeed 5 "speed at which scoreboard fades out, higher is faster (0 = instant)"
 -seta sbar_scoreboard_highlight 1 "enable highlighting for rows and columns in the scoreboard"
 -seta sbar_scoreboard_highlight_alpha 0.10 "highlight alpha value (depends on sbar_scoreboard_highlight 1)"
 -seta sbar_scoreboard_highlight_alpha_self 0.25 "self highlight alpha value"
 -seta sbar_hudselector 1       "0 = health/armor positions flipped, 1 = default hud layout, 2 = combined health and armor display"
 -seta sbar_showcurrentammo 0 "0 = show all ammo types, 1 = show only the ammo type of the current weapon"
 -seta sbar_showweaponicons 1 "1 = show icons of weapons that you have"
 -seta sbar_timer_increment 0 "1 = show elapsed time on the timer"
 -seta sbar_timer_scale 1 "scale multiplier of the timer"
 -seta sbar_vote_alreadyvoted_alpha 0.75 "alpha of the vote dialog after you have voted"
 +// hud variables
 +set _hud_configure 0 "1 = configure the HUD"
 +seta hud_accuracy_yellow 40 "percentage at which the accuracy color is yellow"
 +seta hud_progressbar_alpha "0.5" "alpha of progressbars"
 +seta hud_bg "border" "sets the default background for the panels, file must exist in data/gfx/hud/. 0 = disable background by default"
 +seta hud_bg_color "0 0.7 0.8" "sets the default background color for the panels"
 +seta hud_bg_alpha 0.8 "alpha of the background"
 +seta hud_bg_border 10 "sets the default border size for the panels"
 +seta hud_fg_alpha 1 "alpha of the foreground"
 +
 +seta sbar_info_pos 50
 +
 +seta hud_hudselector 1        "0 = health/armor positions flipped, 1 = default hud layout, 2 = combined health and armor display"
 +seta hud_showcurrentammo 0 "0 = show all ammo types, 1 = show only the ammo type of the current weapon"
 +
 +seta hud_weaponicons 1 "enable/disable this panel"
 +seta hud_weaponicons_pos "157 -55" "position of this panel"
 +seta hud_weaponicons_size "175 55" "size of this panel"
 +seta hud_weaponicons_number 1 "show number of weapon"
 +seta hud_weaponicons_accuracybar_height 3 "height of accuracy bar"
 +seta hud_weaponicons_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_weaponicons_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_weaponicons_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_weaponicons_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_inventory 1 "enable/disable this panel"
 +seta hud_inventory_pos "0 -55" "position of this panel"
 +seta hud_inventory_size "150 55" "size of this panel"
 +seta hud_inventory_onlycurrent 0 "1 = show only current ammo type"
 +seta hud_inventory_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_inventory_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_inventory_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_inventory_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_powerups 1 "enable/disable this panel"
 +seta hud_powerups_pos "-130 47.5" "position of this panel"
 +seta hud_powerups_size "130 30" "size of this panel"
 +seta hud_powerups_flip 1 "flip strength/shield positions"
 +seta hud_powerups_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_powerups_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_powerups_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_powerups_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +seta hud_progressbar_strength_color "0 0 0.6" "R G B vector of the progress bar background color"
 +seta hud_progressbar_shield_color "0.6 0 0.6" "R G B vector of the progress bar background color"
 +
 +seta hud_healtharmor 1 "enable/disable this panel"
 +seta hud_healtharmor_pos "0 -92.5" "position of this panel"
 +seta hud_healtharmor_size "332 30" "size of this panel"
 +seta hud_healtharmor_flip 1 "flip health/armor positions"
 +seta hud_healtharmor_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_healtharmor_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_healtharmor_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_healtharmor_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +seta hud_progressbar_health_color "0.6 0 0" "R G B vector of the progress bar background color"
 +seta hud_progressbar_armor_color "0 0.6 0" "R G B vector of the progress bar background color"
 +seta hud_progressbar_fuel_color "0.6 0.6 0" "R G B vector of the progress bar background color"
 +
 +seta hud_notify 0 "enable/disable this panel"
 +seta hud_notify_pos "-300 -37.5" "position of this base of the panel"
 +seta hud_notify_size "200 37.5" "size of this panel with all notifications on"
 +seta hud_notify_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_notify_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_notify_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_notify_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_timer 1 "enable/disable this panel"
 +seta hud_timer_pos "-210 0" "position of this base of the panel"
 +seta hud_timer_size "210 40" "size of this panel"
 +seta hud_timer_increment 0 "show elapsed time instead of remaining time"
 +seta hud_timer_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_timer_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_timer_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_timer_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_radar 1 "enable/disable this panel"
 +seta hud_radar_pos "0 0" "position of this base of the panel"
 +seta hud_radar_size "180 150" "size of this panel"
 +seta hud_radar_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_radar_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_radar_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_radar_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_score 1 "enable/disable this panel"
 +seta hud_score_pos "-300 -37.5" "position of this base of the panel"
 +seta hud_score_size "200 37.5" "size of this panel"
 +seta hud_score_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_score_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_score_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_score_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_racetimer 1 "enable/disable this panel"
 +seta hud_racetimer_pos "280 0" "position of this base of the panel"
 +seta hud_racetimer_size "240 60" "size of this panel"
 +seta hud_racetimer_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_racetimer_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_racetimer_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_racetimer_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_vote 1 "enable/disable this panel"
 +seta hud_vote_pos "-240 -60" "position of this base of the panel"
 +seta hud_vote_size "240 60" "size of this panel"
 +seta hud_vote_alreadyvoted_alpha 0.75 "alpha of the vote dialog after you have voted"
 +seta hud_vote_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_vote_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_vote_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_vote_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +seta hud_pressedkeys 1 "enable/disable this panel"
 +seta hud_pressedkeys_pos "-150 -155.97" "position of this base of the panel"
 +seta hud_pressedkeys_size "150 88.47" "size of this panel"
 +seta hud_pressedkeys_bg "" "if set to something else than \"\" = override default background, if set to 0 = disable background"
 +seta hud_pressedkeys_bg_color "" "optional R G B string of the background color, otherwise use hud default"
 +seta hud_pressedkeys_bg_alpha 0 "if set to something else than 0 = override default alpha"
 +seta hud_pressedkeys_bg_border 0 "if set to something else than 0 = override size of border around the background"
 +
 +// scoreboard
 +seta scoreboard_border_thickness 1 "scoreboard border thickness"
 +seta scoreboard_accuracy_border_thickness 1 "accuracy stats border thickness"
 +seta scoreboard_accuracy_doublerows 0 "use two rows instead of one"
 +seta scoreboard_accuracy 1 "0 = no weapon accuracy stats panel on scoreboard"
 +seta scoreboard_color_bg_r 0 "red color component of the HUD background"
 +seta scoreboard_color_bg_g 0.25 "green color component of the HUD background"
 +seta scoreboard_color_bg_b 0.17 "blue color component of the HUD background"
 +seta scoreboard_color_bg_team 0.5 "team color multiplier of the HUD background"
 +seta scoreboard_alpha_bg 0.6 "scoreboard background alpha"
 +seta scoreboard_alpha_fg 1 "scoreboard foreground alpha"
 +seta scoreboard_alpha_name 0.9 "alpha of player text in scoreboard list other than self"
 +seta scoreboard_alpha_name_self 1 "alpha of player text in scoreboard list of self" 
 +seta scoreboard_fadeinspeed 10 "speed at which scoreboard fades in, higher is faster (0 = instant)"
 +seta scoreboard_fadeoutspeed 5 "speed at which scoreboard fades out, higher is faster (0 = instant)"
 +seta scoreboard_highlight 1 "enable highlighting for rows and columns in the scoreboard"
 +seta scoreboard_highlight_alpha 0.10 "highlight alpha value (depends on hud_scoreboard_highlight 1)"
 +seta scoreboard_highlight_alpha_self 0.25 "self highlight alpha value"
  
  // for menu server list (eventually make them have engine support?)
  seta menu_slist_showfull 1 "show servers even if they are full and have no slots to join"
@@@ -1570,17 -1465,17 +1570,17 @@@ set sv_maxidle_spectatorsareidle 
  // CTF capture limit placeholder cvar
  set capturelimit 0
  
 -// sbar: font size
 -seta sbar_fontsize 11
 -seta sbar_fontsize_spec 16
 +// hud: font size
 +seta hud_fontsize 11
 +seta hud_fontsize_spec 16
  seta scr_centersize 11
 -seta sbar_width 560
 -// alias sbar_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; sbar_columns_set"
 +seta hud_width 560
 +// alias hud_font "loadfont user1 ${1},gfx/fallback ${2-}; loadfont user2 ${1}-big ${2-}; hud_columns_set"
  alias sbar_font "set _requested_sbar_font \"${*}\""
 -seta sbar_columns default
 +seta hud_columns default
  sbar_font gfx/vera-sans 8 12 16 24 32
 -seta sbar_showbinds 1 "display actions / bound keys in the strings shown during the game. 0 displays only actions, 1 displays only bound keys, 2 displays both"
 -seta sbar_showbinds_limit 2   "maximum number of bound keys to show for an action. 0 for unlimited"
 +seta hud_showbinds 1  "display actions / bound keys in the strings shown during the game. 0 displays only actions, 1 displays only bound keys, 2 displays both"
 +seta hud_showbinds_limit 2    "maximum number of bound keys to show for an action. 0 for unlimited"
  
  // these entities are not referenced by anything directly, they just represent
  // teams and are found by find() when needed
@@@ -1628,8 -1523,8 +1628,8 @@@ seta g_start_delay 0    "delay before the 
  
  alias ons_map           "cl_cmd radar" // legacy alias
  alias radar             "cl_cmd radar"
 -alias sbar_columns_set  "cl_cmd sbar_columns_set $*"
 -alias sbar_columns_help "cl_cmd sbar_columns_help $*"
 +alias hud_columns_set  "cl_cmd hud_columns_set $*"
 +alias hud_columns_help "cl_cmd hud_columns_help $*"
  
  alias _gl_flashblend_update_00 "gl_flashblend 1"
  alias _gl_flashblend_update_10 "gl_flashblend 0"
@@@ -1935,3 -1830,6 +1935,6 @@@ set cl_lockview 0 "when 1, the camera d
  
  // we now use mastervolume
  volume 1
+ // sucks less than the old one
+ cl_decals_newsystem 1
diff --combined qcsrc/client/Main.qc
index c47d1388f198af483684f3e874ce79d2e5ac3e09,9c1af7d5fa903352dd8c0feed74ae03ef87b909a..8891586c1e781873fa063b784d44efc85c1d4d47
@@@ -105,14 -105,14 +105,14 @@@ void CSQC_Init(void
  #ifndef CAMERATEST
        }
  #endif
 -      registercvar("sbar_usecsqc", "1");
 -      registercvar("sbar_columns", "default", CVAR_SAVE);
 +      registercvar("hud_usecsqc", "1");
 +      registercvar("hud_columns", "default", CVAR_SAVE);
  
        gametype = 0;
  
 -      // sbar_fields uses strunzone on the titles!
 -      for(i = 0; i < MAX_SBAR_FIELDS; ++i)
 -              sbar_title[i] = strzone("(null)");
 +      // hud_fields uses strunzone on the titles!
 +      for(i = 0; i < MAX_HUD_FIELDS; ++i)
 +              hud_title[i] = strzone("(null)");
  
        postinit = false;
  
@@@ -321,9 -321,9 +321,9 @@@ void Playerchecker_Think(
                                e.ping_packetloss = 0;
                                e.ping_movementloss = 0;
                                //e.gotscores = 0; // we might already have the scores...
 -                              SetTeam(e, GetPlayerColor(i)); // will not hurt; later updates come with Sbar_UpdatePlayerTeams
 +                              SetTeam(e, GetPlayerColor(i)); // will not hurt; later updates come with HUD_UpdatePlayerTeams
                                RegisterPlayer(e);
 -                              Sbar_UpdatePlayerPos(e);
 +                              HUD_UpdatePlayerPos(e);
                        }
                }
        }
@@@ -335,7 -335,7 +335,7 @@@ void TrueAim_Init()
  void PostInit(void)
  {
        print(strcat("PostInit\n    maxclients = ", ftos(maxclients), "\n"));
 -      localcmd(strcat("\nsbar_columns_set ", cvar_string("sbar_columns"), ";\n"));
 +      localcmd(strcat("\nhud_columns_set ", cvar_string("hud_columns"), ";\n"));
  
        entity playerchecker;
        playerchecker = spawn();
  // CSQC_ConsoleCommand : Used to parse commands in the console that have been registered with the "registercmd" function
  // Return value should be 1 if CSQC handled the command, otherwise return 0 to have the engine handle it.
  float button_zoom;
 -void Cmd_Sbar_SetFields(float);
 -void Cmd_Sbar_Help(float);
 +void Cmd_HUD_SetFields(float);
 +void Cmd_HUD_Help(float);
  float CSQC_ConsoleCommand(string strMessage)
  {
        float argc;
@@@ -506,8 -506,8 +506,8 @@@ void GameCommand(string msg
                print("Usage: cl_cmd COMMAND..., where possible commands are:\n");
                print("  settemp cvar value\n");
                print("  radar\n");
 -              print("  sbar_columns_set ...\n");
 -              print("  sbar_columns_help\n");
 +              print("  hud_columns_set ...\n");
 +              print("  hud_columns_help\n");
                GameCommand_Generic("help");
                return;
        }
        else if(cmd == "radar") {
                ons_showmap = !ons_showmap;
        }
 -      else if(cmd == "sbar_columns_set") {
 -              Cmd_Sbar_SetFields(argc);
 +      else if(cmd == "hud_columns_set") {
 +              Cmd_HUD_SetFields(argc);
        }
 -      else if(cmd == "sbar_columns_help") {
 -              Cmd_Sbar_Help(argc);
 +      else if(cmd == "hud_columns_help") {
 +              Cmd_HUD_Help(argc);
        }
  #ifdef BLURTEST
        else if(cmd == "blurtest") {
                localcmd("sv_cmd debug_shotorg\n");
        }
        else if(cmd == "sendcvar") {
-               s = cvar_string(argv(1));
-               if(argv(1) == "cl_weaponpriority")
+               // W_FixWeaponOrder will trash argv, so save what we need.
+               string cvar;
+               cvar = strzone(argv(1));
+               s = cvar_string(cvar);
+               if(cvar == "cl_weaponpriority")
                        s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
-               else if(substring(argv(1), 0, 17) == "cl_weaponpriority" && strlen(argv(1)) == 18)
+               else if(substring(cvar, 0, 17) == "cl_weaponpriority" && strlen(cvar) == 18)
                        s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
-               localcmd("cmd sentcvar ", argv(1), " \"", s, "\"\n");
+               localcmd("cmd sentcvar ", cvar, " \"", s, "\"\n");
+               strunzone(cvar);
        }
        else if(cmd == "spawn") {
                s = argv(1);
  // bInputType = 0 is key pressed, 1 is key released, 2 is mouse input.
  // In the case of keyboard input, nPrimary is the ascii code, and nSecondary is 0.
  // In the case of mouse input, nPrimary is xdelta, nSecondary is ydelta.
 +float hudconf_active;
  float CSQC_InputEvent(float bInputType, float nPrimary, float nSecondary)
  {
        local float bSkipKey;
        bSkipKey = false;
  
 +      if(hudconf_active)
 +              if (HUD_Panel_InputEvent(bInputType, nPrimary, nSecondary))
 +                      return true;
 +
        if (MapVote_InputEvent(bInputType, nPrimary, nSecondary))
                return true;
  
@@@ -675,7 -674,7 +679,7 @@@ void Ent_ReadPlayerScore(
        float isNew;
        entity o;
  
 -      // damnit -.- don't want to go change every single .sv_entnum in sbar.qc AGAIN
 +      // damnit -.- don't want to go change every single .sv_entnum in hud.qc AGAIN
        // (no I've never heard of M-x replace-string, sed, or anything like that)
        isNew = !self.owner; // workaround for DP bug
        n = ReadByte()-1;
                }
  
        if(o.sort_prev)
 -              Sbar_UpdatePlayerPos(o); // if not registered, we cannot do this yet!
 +              HUD_UpdatePlayerPos(o); // if not registered, we cannot do this yet!
  
        self.entremove = Ent_RemovePlayerScore;
  }
@@@ -752,7 -751,7 +756,7 @@@ void Ent_ReadTeamScore(
                                o.(teamscores[i]) = ReadChar();
                }
  
 -      Sbar_UpdateTeamPos(o);
 +      HUD_UpdateTeamPos(o);
  }
  
  void Net_Reset()
@@@ -1000,7 -999,7 +1004,7 @@@ void Ent_ScoresInfo(
                teamscores_label[i] = strzone(ReadString());
                teamscores_flags[i] = ReadByte();
        }
 -      Sbar_InitScores();
 +      HUD_InitScores();
        Gamemode_Init();
  }
  
@@@ -1306,7 -1305,7 +1310,7 @@@ string getcommandkey(string text, strin
        string keys;
        float n, j, k, l;
  
 -      if (!sbar_showbinds)
 +      if (!hud_showbinds)
                return text;
  
        keys = db_get(binddb, command);
                                        keys = strcat(keys, ", ", keynumtostring(k));
  
                                ++l;
 -                              if (sbar_showbinds_limit > 0 && sbar_showbinds_limit >= l) break;
 +                              if (hud_showbinds_limit > 0 && hud_showbinds_limit >= l) break;
                        }
  
                }
        }
  
        if ("" == keys) {
 -              if (sbar_showbinds > 1)
 +              if (hud_showbinds > 1)
                        return strcat(text, " (not bound)");
                else
                        return text;
        }
 -      else if (sbar_showbinds > 1)
 +      else if (hud_showbinds > 1)
                return strcat(text, " (", keys, ")");
        else
                return keys;