private static string[] ExtractArgs(ConsoleSystem.Arg arg) { if (arg == null) return new string[0]; var argsList = new List<string>(); var i = 0; while (arg.HasArgs(++i)) argsList.Add(arg.GetString(i - 1)); return argsList.ToArray(); }
public static void bind(ref ConsoleSystem.Arg args) { if (!args.HasArgs(3)) { return; } string str = args.Args[0]; string str1 = args.Args[1]; string str2 = args.Args[2]; GameInput.GameButton button = GameInput.GetButton(str); if (button != null) { button.Bind(str1, str2); } }
void cmdConsoleKitGui(ConsoleSystem.Arg arg) { if (arg.connection == null) { SendReply(arg, "You can't use this command from the server console"); return; } if (!arg.HasArgs()) { SendReply(arg, "You are not allowed to use manually this command"); return; } var player = arg.Player(); var kitname = arg.Args[0].Substring(1, arg.Args[0].Length - 2); TryGiveKit(player, kitname); RefreshKitPanel(player, PlayerGUI[player.userID].guiid, PlayerGUI[player.userID].page); }
private void cmdShow(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs()) { var reply = "Syntax: show <group|user> <name>\n"; reply += "Syntax: show <groups|perms>"; arg.ReplyWith(reply); return; } var mode = arg.GetString(0); var name = arg.GetString(1); if (mode.Equals("perms")) { var result = "Permissions:\n"; result += string.Join(", ", permission.GetPermissions()); arg.ReplyWith(result); } else if (mode.Equals("user")) { var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { arg.ReplyWith("User '" + name + "' not found"); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); name += $"({userId})"; } var result = "User '" + name + "' permissions:\n"; result += string.Join(", ", permission.GetUserPermissions(userId)); result += "\nUser '" + name + "' groups:\n"; result += string.Join(", ", permission.GetUserGroups(userId)); arg.ReplyWith(result); } else if (mode.Equals("group")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } var result = "Group '" + name + "' users:\n"; result += string.Join(", ", permission.GetUsersInGroup(name)); result += "\nGroup '" + name + "' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(name)); var parent = permission.GetGroupParent(name); while (permission.GroupExists(parent)) { result = "\nParent group '" + parent + "' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(parent)); parent = permission.GetGroupParent(name); } arg.ReplyWith(result); } else if (mode.Equals("groups")) { var result = "Groups:\n"; result += string.Join(", ", permission.GetGroups()); arg.ReplyWith(result); } }
private void cmdRevoke(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(3)) { arg.ReplyWith("Usage: revoke <group|user> <name|id> <permission>"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var perm = arg.GetString(2); if (mode.Equals("group")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.RevokeGroupPermission(name, perm); arg.ReplyWith("Group '" + name + "' revoked permission: " + perm); } else if (mode.Equals("user")) { var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { arg.ReplyWith("User '" + name + "' not found"); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); } permission.RevokeUserPermission(userId, perm); arg.ReplyWith("User '" + name + "' revoked permission: " + perm); } }
private void CmdShow(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs()) { ReplyWith(arg.connection, "CommandUsageShow"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); if (mode.Equals("perms")) { var result = "Permissions:\n"; result += string.Join(", ", permission.GetPermissions()); arg.ReplyWith(result); } else if (mode.Equals("user")) { var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { ReplyWith(arg.connection, "UserNotFound"); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); name += $" ({userId})"; } var result = "User '" + name + "' permissions:\n"; result += string.Join(", ", permission.GetUserPermissions(userId)); result += "\nUser '" + name + "' groups:\n"; result += string.Join(", ", permission.GetUserGroups(userId)); arg.ReplyWith(result); } else if (mode.Equals("group")) { if (!permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } var result = "Group '" + name + "' users:\n"; result += string.Join(", ", permission.GetUsersInGroup(name)); result += "\nGroup '" + name + "' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(name)); var parent = permission.GetGroupParent(name); while (permission.GroupExists(parent)) { result = "\nParent group '" + parent + "' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(parent)); parent = permission.GetGroupParent(parent); } arg.ReplyWith(result); } else if (mode.Equals("groups")) { var result = "Groups:\n"; result += string.Join(", ", permission.GetGroups()); arg.ReplyWith(result); } }
private void CmdUserGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(3)) { ReplyWith(arg.connection, "CommandUsageUserGroup"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var group = arg.GetString(2); var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { ReplyWith(arg.connection, "UserNotFound", name); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); name += $"({userId})"; } if (!permission.GroupExists(group)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } if (mode.Equals("add")) { permission.AddUserGroup(userId, group); ReplyWith(arg.connection, "UserAddedToGroup", name, group); } else if (mode.Equals("remove")) { permission.RemoveUserGroup(userId, group); ReplyWith(arg.connection, "UserRemovedFromGroup", name, group); } }
private void CmdLang(ConsoleSystem.Arg arg) { if (!IsAdmin(arg)) return; if (arg.HasArgs()) lang.SetServerLanguage(arg.GetString(0)); ReplyWith(arg.connection, "ServerLanguage", lang.GetServerLanguage()); }
private void cmdGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (arg.Player() != null && !arg.Player().IsAdmin()) return; // Check 2 args exists if (!arg.HasArgs(2)) { var reply = "Syntax: oxide.group <add|set> <name> [title] [rank]\n"; reply += "Syntax: oxide.group <remove|show> <name>\n"; reply += "Syntax: oxide.group <parent> <name> <parentName>"; arg.ReplyWith(reply); return; } var mode = arg.GetString(0); var name = arg.GetString(1); if (mode.Equals("add")) { if (permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' already exist"); return; } permission.CreateGroup(name, arg.GetString(2), arg.GetInt(3)); arg.ReplyWith("Group '" + name + "' created"); } else if (mode.Equals("remove")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.RemoveGroup(name); arg.ReplyWith("Group '" + name + "' deleted"); } else if (mode.Equals("set")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.SetGroupTitle(name, arg.GetString(2)); permission.SetGroupRank(name, arg.GetInt(3)); arg.ReplyWith("Group '" + name + "' changed"); } else if (mode.Equals("parent")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } var parent = arg.GetString(2); if (!string.IsNullOrEmpty(parent) && !permission.GroupExists(parent)) { arg.ReplyWith("Parent group '" + parent + "' doesn't exist"); return; } if (permission.SetGroupParent(name, parent)) arg.ReplyWith("Group '" + name + "' changed"); else arg.ReplyWith("Group '" + name + "' failed to change"); } else if (mode.Equals("show")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } var result = "Group '" + name + "' permissions:\n"; result += string.Join(",", permission.GetGroupPermissions(name)); arg.ReplyWith(result); } }
private void cmdGrant(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (arg.Player() != null && !arg.Player().IsAdmin()) return; // Check 3 args exists if (!arg.HasArgs(3)) { arg.ReplyWith("Syntax: oxide.grant <group|user> <name|id> <permission>"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var perm = arg.GetString(2); if (mode.Equals("group")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.GrantGroupPermission(name, perm, null); arg.ReplyWith("Group '" + name + "' granted permission: " + perm); } else if (mode.Equals("user")) { var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { arg.ReplyWith("User '" + name + "' not found"); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.GetUserData(name).LastSeenNickname = name; } permission.GrantUserPermission(userId, perm, null); arg.ReplyWith("User '" + name + "' granted permission: " + perm); } }
private void cmdLoad(ConsoleSystem.Arg arg) { if (arg.argUser != null && !arg.argUser.admin) return; // Check arg 1 exists if (!arg.HasArgs()) { arg.ReplyWith("Syntax: oxide.load *|<pluginname>+"); return; } if (arg.GetString(0).Equals("*")) { Interface.Oxide.LoadAllPlugins(); return; } foreach (var name in arg.Args) { if (string.IsNullOrEmpty(name)) continue; // Load Interface.Oxide.LoadPlugin(name); pluginmanager.GetPlugin(name); } }
private void cmdGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (arg.argUser != null && !arg.argUser.CanAdmin()) return; // Check 2 args exists if (!arg.HasArgs(2)) { arg.ReplyWith("Syntax: oxide.group <add|remove|set> <name> [title] [rank]"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var title = arg.GetString(2); var rank = arg.GetInt(3); if (mode.Equals("add")) { if (permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' already exist"); return; } permission.CreateGroup(name, title, rank); arg.ReplyWith("Group '" + name + "' created"); } else if (mode.Equals("remove")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.RemoveGroup(name); arg.ReplyWith("Group '" + name + "' deleted"); } else if (mode.Equals("set")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.SetGroupTitle(name, title); permission.SetGroupRank(name, rank); arg.ReplyWith("Group '" + name + "' changed"); } }
private void ccmdZone(ConsoleSystem.Arg arg) { var player = arg.Player(); if (!hasPermission(player, PermZone)) { SendMessage(player, "You don't have access to this command"); return; } var zoneId = arg.GetString(0); ZoneDefinition zoneDefinition; if (!arg.HasArgs(3) || !ZoneDefinitions.TryGetValue(zoneId, out zoneDefinition)) { SendMessage(player, "Zone Id not found or Too few arguments: zone <zoneid> <arg> <value>"); return; } var args = new string[arg.Args.Length - 1]; Array.Copy(arg.Args, 1, args, 0, args.Length); UpdateZoneDefinition(zoneDefinition, args, player); RefreshZone(zoneId); //SaveData(); //ShowZone(player, zoneId); }
private void ConsoleLoad(ConsoleSystem.Arg arg) { if (!IsAdmin(arg.Player())) return; if (!arg.HasArgs()) { Reply(arg.connection, "CommandUsageLoad"); return; } if (arg.GetString(0).Equals("*")) { Interface.Oxide.LoadAllPlugins(); return; } foreach (var name in arg.Args) { if (string.IsNullOrEmpty(name)) continue; Interface.Oxide.LoadPlugin(name); pluginManager.GetPlugin(name); } }
private void ConsoleShow(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg.Player())) return; if (!arg.HasArgs()) { Reply(arg.connection, "CommandUsageShow"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); if (mode.Equals("perms")) { arg.ReplyWith("Permissions:\n" + string.Join(", ", permission.GetPermissions())); } else if (mode.Equals("perm")) { if (string.IsNullOrEmpty(name)) { Reply(arg.connection, "CommandUsageShow"); return; } var result = $"Permission '{name}' Users:\n"; result += string.Join(", ", permission.GetPermissionUsers(name)); result += $"\nPermission '{name}' Groups:\n"; result += string.Join(", ", permission.GetPermissionGroups(name)); arg.ReplyWith(result); } else if (mode.Equals("user")) { if (string.IsNullOrEmpty(name)) { Reply(arg.connection, "CommandUsageShow"); return; } var target = FindPlayer(name); if (target == null && !permission.UserIdValid(name)) { Reply(arg.connection, "UserNotFound", name); return; } var userId = name; if (target != null) { userId = target.UserIDString; name = target.displayName; permission.UpdateNickname(userId, name); name += $" ({userId})"; } var result = $"User '{name}' permissions:\n"; result += string.Join(", ", permission.GetUserPermissions(userId)); result += $"\nUser '{name}' groups:\n"; result += string.Join(", ", permission.GetUserGroups(userId)); arg.ReplyWith(result); } else if (mode.Equals("group")) { if (string.IsNullOrEmpty(name)) { Reply(arg.connection, "CommandUsageShow"); return; } if (!permission.GroupExists(name)) { Reply(arg.connection, "GroupNotFound", name); return; } var result = $"Group '{name}' users:\n"; result += string.Join(", ", permission.GetUsersInGroup(name)); result += $"\nGroup '{name}' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(name)); var parent = permission.GetGroupParent(name); while (permission.GroupExists(parent)) { result += $"\nParent group '{parent}' permissions:\n"; result += string.Join(", ", permission.GetGroupPermissions(parent)); parent = permission.GetGroupParent(parent); } arg.ReplyWith(result); } else if (mode.Equals("groups")) { arg.ReplyWith("Groups:\n" + string.Join(", ", permission.GetGroups())); } }
void cmdConsoleKitShow(ConsoleSystem.Arg arg) { if (arg.connection == null) { SendReply(arg, "You can't use this command from the server console"); return; } if (!arg.HasArgs()) { SendReply(arg, "You are not allowed to use manually this command"); return; } var player = arg.Player(); PLayerGUI playerGUI; if (!PlayerGUI.TryGetValue(player.userID, out playerGUI)) return; RefreshKitPanel(player, playerGUI.guiid, arg.GetInt(0)); }
private void CmdUnload(ConsoleSystem.Arg arg) { if (!IsAdmin(arg)) return; if (!arg.HasArgs()) { ReplyWith(arg.connection, "CommandUsageUnload"); return; } if (arg.GetString(0).Equals("*")) { Interface.Oxide.UnloadAllPlugins(); return; } foreach (var name in arg.Args) if (!string.IsNullOrEmpty(name)) Interface.Oxide.UnloadPlugin(name); }
private void cmdUnload(ConsoleSystem.Arg arg) { if (arg.Player() != null && !arg.Player().IsAdmin()) return; // Check arg 1 exists if (!arg.HasArgs()) { arg.ReplyWith("Syntax: oxide.unload *|<pluginname>+"); return; } if (arg.GetString(0).Equals("*")) { Interface.Oxide.UnloadAllPlugins(); return; } foreach (var name in arg.Args) { if (string.IsNullOrEmpty(name)) continue; // Unload Interface.Oxide.UnloadPlugin(name); } }
private void CmdGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(2)) { ReplyWith(arg.connection, "CommandUsageGroup"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); if (mode.Equals("add")) { if (permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupAlreadyExists", name); return; } permission.CreateGroup(name, arg.GetString(2), arg.GetInt(3)); ReplyWith(arg.connection, "GroupCreated", name); } else if (mode.Equals("remove")) { if (!permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } permission.RemoveGroup(name); ReplyWith(arg.connection, "GroupDeleted", name); } else if (mode.Equals("set")) { if (!permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } permission.SetGroupTitle(name, arg.GetString(2)); permission.SetGroupRank(name, arg.GetInt(3)); ReplyWith(arg.connection, "GroupChanged", name); } else if (mode.Equals("parent")) { if (!permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } var parent = arg.GetString(2); if (!string.IsNullOrEmpty(parent) && !permission.GroupExists(parent)) { ReplyWith(arg.connection, "GroupParentNotFound", parent); return; } if (permission.SetGroupParent(name, parent)) ReplyWith(arg.connection, "GroupParentChanged", name, parent); else ReplyWith(arg.connection, "GroupParentNotChanged", name); } }
private void cmdReload(ConsoleSystem.Arg arg) { if (arg.argUser != null && !arg.argUser.admin) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs()) { arg.ReplyWith("Usage: reload *|<pluginname>+"); return; } if (arg.GetString(0).Equals("*")) { Interface.Oxide.ReloadAllPlugins(); return; } foreach (var name in arg.Args) if (!string.IsNullOrEmpty(name)) Interface.Oxide.ReloadPlugin(name); }
private void CmdRevoke(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(3)) { ReplyWith(arg.connection, "CommandUsageRevoke"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var perm = arg.GetString(2); if (!permission.PermissionExists(perm)) { ReplyWith(arg.connection, "PermissionNotFound", perm); return; } if (mode.Equals("group")) { if (!permission.GroupExists(name)) { ReplyWith(arg.connection, "GroupNotFound", name); return; } permission.RevokeGroupPermission(name, perm); ReplyWith(arg.connection, "GroupPermissionRevoked", name, perm); } else if (mode.Equals("user")) { var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { ReplyWith(arg.connection, "UserNotFound", name); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); } permission.RevokeUserPermission(userId, perm); ReplyWith(arg.connection, "UserPermissionRevoked", $"{name} ({userId})", perm); } }
private void cmdGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(2)) { var reply = "Syntax: group <add|set> <name> [title] [rank]"; reply += "Syntax: group <remove> <name>\n"; reply += "Syntax: group <parent> <name> <parentName>"; arg.ReplyWith(reply); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var title = arg.GetString(2); var rank = arg.GetInt(3); if (mode.Equals("add")) { if (permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' already exist"); return; } permission.CreateGroup(name, title, rank); arg.ReplyWith("Group '" + name + "' created"); } else if (mode.Equals("remove")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.RemoveGroup(name); arg.ReplyWith("Group '" + name + "' deleted"); } else if (mode.Equals("set")) { if (!permission.GroupExists(name)) { arg.ReplyWith("Group '" + name + "' doesn't exist"); return; } permission.SetGroupTitle(name, title); permission.SetGroupRank(name, rank); arg.ReplyWith("Group '" + name + "' changed"); } }
public static void find(ref ConsoleSystem.Arg arg) { string str; if (!arg.HasArgs(1)) { return; } string args = arg.Args[0]; string empty = string.Empty; Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < (int)assemblies.Length; i++) { Type[] types = assemblies[i].GetTypes(); for (int j = 0; j < (int)types.Length; j++) { if (types[j].IsSubclassOf(typeof(ConsoleSystem))) { MethodInfo[] methods = types[j].GetMethods(); for (int k = 0; k < (int)methods.Length; k++) { if (methods[k].IsStatic) { if (!(args != "*") || types[j].Name.Contains(args) || methods[k].Name.Contains(args)) { if (arg.CheckPermissions(methods[k].GetCustomAttributes(true))) { str = empty; empty = string.Concat(new string[] { str, types[j].Name, ".", global.BuildMethodString(ref methods[k]), "\n" }); } } } } FieldInfo[] fields = types[j].GetFields(); for (int l = 0; l < (int)fields.Length; l++) { if (fields[l].IsStatic) { if (!(args != "*") || types[j].Name.Contains(args) || fields[l].Name.Contains(args)) { if (arg.CheckPermissions(fields[l].GetCustomAttributes(true))) { str = empty; empty = string.Concat(new string[] { str, types[j].Name, ".", global.BuildFieldsString(ref fields[l]), "\n" }); } } } } PropertyInfo[] properties = types[j].GetProperties(); for (int m = 0; m < (int)properties.Length; m++) { if (!(args != "*") || types[j].Name.Contains(args) || properties[m].Name.Contains(args)) { if (arg.CheckPermissions(properties[m].GetCustomAttributes(true))) { str = empty; empty = string.Concat(new string[] { str, types[j].Name, ".", global.BuildPropertyString(ref properties[m]), "\n" }); } } } } } } arg.ReplyWith(string.Concat("Finding ", args, ":\n", empty)); }
private void cmdUserGroup(ConsoleSystem.Arg arg) { if (!PermissionsLoaded(arg)) return; if (!IsAdmin(arg)) return; if (!arg.HasArgs(3)) { arg.ReplyWith("Usage: usergroup <add|remove> <username> <groupname>"); return; } var mode = arg.GetString(0); var name = arg.GetString(1); var group = arg.GetString(2); var player = FindPlayer(name); if (player == null && !permission.UserExists(name)) { arg.ReplyWith("User '" + name + "' not found"); return; } var userId = name; if (player != null) { userId = player.userID.ToString(); name = player.displayName; permission.UpdateNickname(userId, name); } if (!permission.GroupExists(group)) { arg.ReplyWith("Group '" + group + "' doesn't exist"); return; } if (mode.Equals("add")) { permission.AddUserGroup(userId, group); if (player != null) { arg.ReplyWith("User '" + player.displayName + "' assigned group: " + @group); } } else if (mode.Equals("remove")) { permission.RemoveUserGroup(userId, group); if (player != null) { arg.ReplyWith("User '" + player.displayName + "' removed from group: " + @group); } } }