Commit a88e11af authored by Sven Neumann's avatar Sven Neumann Committed by Sven Neumann
Browse files

app/widgets/gimpdocked.[ch] renamed GimpDockedIface to

2003-10-11  Sven Neumann  <sven@gimp.org>

	* app/widgets/gimpdocked.[ch]
	* app/widgets/widgets-types.h: renamed GimpDockedIface to
	GimpDockedInterface.

	* app/display/gimpnavigationview.c
	* app/widgets/gimpcoloreditor.c
	* app/widgets/gimpcontainereditor.c
	* app/widgets/gimpcontainerview.c
	* app/widgets/gimpeditor.c
	* app/widgets/gimpimageeditor.c
	* app/widgets/gimpitemtreeview.c
	* app/widgets/gimptooloptionseditor.c: changed accordingly.

	* app/config/config-types.h
	* app/config/gimpconfig.[ch]
	* app/config/gimpconfig-deserialize.[ch]
	* app/config/gimpconfig-serialize.[ch]
	* app/config/gimpconfig-utils.[ch]: added a GimpConfig typedef and
	changed the GimpConfig API to take GimpConfig instead of GObject
	pointers.

	* app/config/gimpconfig-dump.c
	* app/config/gimprc.c
	* app/config/test-config.c
	* app/core/gimp-documents.c
	* app/core/gimp-parasites.c
	* app/core/gimp-templates.c
	* app/core/gimp.[ch]
	* app/core/gimpcontainer.c
	* app/core/gimpcontext.c
	* app/core/gimpdocumentlist.c
	* app/core/gimpgrid.c
	* app/core/gimpimage-duplicate.c
	* app/core/gimpimage-new.c
	* app/core/gimpimage.c
	* app/core/gimpparasitelist.c
	* app/core/gimptemplate.c
	* app/core/gimptooloptions.c
	* app/core/gimpviewable.c
	* app/gui/grid-dialog.c
	* app/gui/preferences-dialog.c
	* app/gui/stroke-dialog.c
	* app/gui/templates-commands.c
	* app/gui/tool-options-commands.c
	* app/paint/gimppaintcore.c
	* app/pdb/gimprc_cmds.c
	* app/text/gimptext-parasite.c
	* app/text/gimptext.c
	* app/text/gimptextlayer.c
	* app/tools/gimp-tools.c
	* app/tools/gimptexttool.c
	* app/widgets/gimpdevices.c
	* app/widgets/gimptemplateeditor.c
	* app/widgets/gimptemplateview.c
	* tools/pdbgen/pdb/gimprc.pdb: changed accordingly.
parent 99746e1d
2003-10-11 Sven Neumann <sven@gimp.org>
* app/widgets/gimpdocked.[ch]
* app/widgets/widgets-types.h: renamed GimpDockedIface to
GimpDockedInterface.
* app/display/gimpnavigationview.c
* app/widgets/gimpcoloreditor.c
* app/widgets/gimpcontainereditor.c
* app/widgets/gimpcontainerview.c
* app/widgets/gimpeditor.c
* app/widgets/gimpimageeditor.c
* app/widgets/gimpitemtreeview.c
* app/widgets/gimptooloptionseditor.c: changed accordingly.
* app/config/config-types.h
* app/config/gimpconfig.[ch]
* app/config/gimpconfig-deserialize.[ch]
* app/config/gimpconfig-serialize.[ch]
* app/config/gimpconfig-utils.[ch]: added a GimpConfig typedef and
changed the GimpConfig API to take GimpConfig instead of GObject
pointers.
* app/config/gimpconfig-dump.c
* app/config/gimprc.c
* app/config/test-config.c
* app/core/gimp-documents.c
* app/core/gimp-parasites.c
* app/core/gimp-templates.c
* app/core/gimp.[ch]
* app/core/gimpcontainer.c
* app/core/gimpcontext.c
* app/core/gimpdocumentlist.c
* app/core/gimpgrid.c
* app/core/gimpimage-duplicate.c
* app/core/gimpimage-new.c
* app/core/gimpimage.c
* app/core/gimpparasitelist.c
* app/core/gimptemplate.c
* app/core/gimptooloptions.c
* app/core/gimpviewable.c
* app/gui/grid-dialog.c
* app/gui/preferences-dialog.c
* app/gui/stroke-dialog.c
* app/gui/templates-commands.c
* app/gui/tool-options-commands.c
* app/paint/gimppaintcore.c
* app/pdb/gimprc_cmds.c
* app/text/gimptext-parasite.c
* app/text/gimptext.c
* app/text/gimptextlayer.c
* app/tools/gimp-tools.c
* app/tools/gimptexttool.c
* app/widgets/gimpdevices.c
* app/widgets/gimptemplateeditor.c
* app/widgets/gimptemplateview.c
* tools/pdbgen/pdb/gimprc.pdb: changed accordingly.
2003-10-10 Michael Natterer <mitch@gimp.org>
 
* app/widgets/Makefile.am
......@@ -24,6 +24,7 @@
#include "gui-types.h"
#include "config/gimpconfig.h"
#include "config/gimpconfig-utils.h"
#include "core/gimp.h"
......@@ -103,8 +104,8 @@ templates_new_template_ok_callback (GtkWidget *widget,
template = g_object_get_data (G_OBJECT (dialog), "gimp-template");
gimp = g_object_get_data (G_OBJECT (dialog), "gimp");
gimp_config_copy_properties (G_OBJECT (editor->template),
G_OBJECT (template));
gimp_config_copy_properties (GIMP_CONFIG (editor->template),
GIMP_CONFIG (template));
gimp_list_uniquefy_name (GIMP_LIST (gimp->templates),
GIMP_OBJECT (template), TRUE);
......@@ -181,8 +182,8 @@ templates_edit_template_ok_callback (GtkWidget *widget,
template = g_object_get_data (G_OBJECT (dialog), "gimp-template");
gimp = g_object_get_data (G_OBJECT (dialog), "gimp");
gimp_config_copy_properties (G_OBJECT (editor->template),
G_OBJECT (template));
gimp_config_copy_properties (GIMP_CONFIG (editor->template),
GIMP_CONFIG (template));
gimp_list_uniquefy_name (GIMP_LIST (gimp->templates),
GIMP_OBJECT (template), TRUE);
......
......@@ -66,8 +66,8 @@ tool_options_save_to_cmd_callback (GtkWidget *widget,
name = g_strdup (gimp_object_get_name (GIMP_OBJECT (options)));
gimp_config_copy_properties (G_OBJECT (options->tool_info->tool_options),
G_OBJECT (options));
gimp_config_copy_properties (GIMP_CONFIG (options->tool_info->tool_options),
GIMP_CONFIG (options));
gimp_object_set_name (GIMP_OBJECT (options), name);
g_free (name);
......@@ -105,8 +105,8 @@ tool_options_restore_from_cmd_callback (GtkWidget *widget,
{
GimpToolOptions *options = GIMP_TOOL_OPTIONS (data);
gimp_config_copy_properties (G_OBJECT (options),
G_OBJECT (options->tool_info->tool_options));
gimp_config_copy_properties (GIMP_CONFIG (options),
GIMP_CONFIG (options->tool_info->tool_options));
}
void
......@@ -170,12 +170,12 @@ tool_options_save_callback (GtkWidget *widget,
gpointer data)
{
GimpToolInfo *tool_info = GIMP_TOOL_INFO (data);
GObject *copy;
GimpConfig *copy;
if (! name || ! strlen (name))
name = _("Saved Options");
copy = gimp_config_duplicate (G_OBJECT (tool_info->tool_options));
copy = gimp_config_duplicate (GIMP_CONFIG (tool_info->tool_options));
gimp_object_set_name (GIMP_OBJECT (copy), name);
gimp_list_uniquefy_name (GIMP_LIST (tool_info->options_presets),
......
......@@ -23,6 +23,9 @@
#define __CONFIG_TYPES_H__
typedef struct _GimpConfig GimpConfig; /* dummy typedef */
typedef struct _GimpConfigInterface GimpConfigInterface;
typedef struct _GimpBaseConfig GimpBaseConfig;
typedef struct _GimpCoreConfig GimpCoreConfig;
typedef struct _GimpDisplayConfig GimpDisplayConfig;
......
......@@ -54,13 +54,13 @@
* couldn't parse it.
*/
static GTokenType gimp_config_deserialize_unknown (GObject *object,
static GTokenType gimp_config_deserialize_unknown (GimpConfig *object,
GScanner *scanner);
static GTokenType gimp_config_deserialize_property (GObject *object,
static GTokenType gimp_config_deserialize_property (GimpConfig *object,
GScanner *scanner,
gint nest_level);
static GTokenType gimp_config_deserialize_value (GValue *value,
GObject *object,
GimpConfig *object,
GParamSpec *prop_spec,
GScanner *scanner);
static GTokenType gimp_config_deserialize_fundamental (GValue *value,
......@@ -82,12 +82,12 @@ static GTokenType gimp_config_deserialize_matrix2 (GValue *value,
GParamSpec *prop_spec,
GScanner *scanner);
static GTokenType gimp_config_deserialize_object (GValue *value,
GObject *object,
GimpConfig *object,
GParamSpec *prop_spec,
GScanner *scanner,
gint nest_level);
static GTokenType gimp_config_deserialize_value_array (GValue *value,
GObject *object,
GimpConfig *object,
GParamSpec *prop_spec,
GScanner *scanner);
static GTokenType gimp_config_deserialize_any (GValue *value,
......@@ -100,7 +100,7 @@ static inline gboolean scanner_string_utf8_valid (GScanner *scanner,
/**
* gimp_config_deserialize_properties:
* @object: a #GObject.
* @object: a #GimpConfig.
* @scanner: a #GScanner.
* @nest_level:
* @store_unknown_tokens: %TRUE if you want to store unknown tokens.
......@@ -116,10 +116,10 @@ static inline gboolean scanner_string_utf8_valid (GScanner *scanner,
* Return value:
**/
gboolean
gimp_config_deserialize_properties (GObject *object,
GScanner *scanner,
gint nest_level,
gboolean store_unknown_tokens)
gimp_config_deserialize_properties (GimpConfig *config,
GScanner *scanner,
gint nest_level,
gboolean store_unknown_tokens)
{
GObjectClass *klass;
GParamSpec **property_specs;
......@@ -130,15 +130,15 @@ gimp_config_deserialize_properties (GObject *object,
GTokenType token;
GTokenType next;
g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
g_return_val_if_fail (GIMP_IS_CONFIG (config), FALSE);
klass = G_OBJECT_GET_CLASS (object);
klass = G_OBJECT_GET_CLASS (config);
property_specs = g_object_class_list_properties (klass, &n_property_specs);
if (!property_specs)
return TRUE;
scope_id = g_type_qname (G_TYPE_FROM_INSTANCE (object));
scope_id = g_type_qname (G_TYPE_FROM_INSTANCE (config));
old_scope_id = g_scanner_set_scope (scanner, scope_id);
for (i = 0; i < n_property_specs; i++)
......@@ -154,7 +154,7 @@ gimp_config_deserialize_properties (GObject *object,
g_free (property_specs);
g_object_freeze_notify (object);
g_object_freeze_notify (G_OBJECT (config));
token = G_TOKEN_LEFT_PAREN;
......@@ -178,11 +178,11 @@ gimp_config_deserialize_properties (GObject *object,
break;
case G_TOKEN_IDENTIFIER:
token = gimp_config_deserialize_unknown (object, scanner);
token = gimp_config_deserialize_unknown (config, scanner);
break;
case G_TOKEN_SYMBOL:
token = gimp_config_deserialize_property (object,
token = gimp_config_deserialize_property (config,
scanner, nest_level);
break;
......@@ -197,7 +197,7 @@ gimp_config_deserialize_properties (GObject *object,
g_scanner_set_scope (scanner, old_scope_id);
g_object_thaw_notify (object);
g_object_thaw_notify (G_OBJECT (config));
/* If store_unknown_tokens is TRUE but the unknown token value couldn't
be parsed the default error message is rather confusing.
......@@ -214,8 +214,8 @@ gimp_config_deserialize_properties (GObject *object,
}
static GTokenType
gimp_config_deserialize_unknown (GObject *object,
GScanner *scanner)
gimp_config_deserialize_unknown (GimpConfig *object,
GScanner *scanner)
{
gchar *key;
......@@ -239,12 +239,12 @@ gimp_config_deserialize_unknown (GObject *object,
}
static GTokenType
gimp_config_deserialize_property (GObject *object,
gimp_config_deserialize_property (GimpConfig *config,
GScanner *scanner,
gint nest_level)
{
GTypeClass *owner_class;
GimpConfigInterface *gimp_config_iface;
GimpConfigInterface *config_iface;
GimpConfigInterface *parent_iface;
GParamSpec *prop_spec;
GTokenType token = G_TOKEN_RIGHT_PAREN;
......@@ -256,8 +256,7 @@ gimp_config_deserialize_property (GObject *object,
owner_class = g_type_class_peek (prop_spec->owner_type);
gimp_config_iface = g_type_interface_peek (owner_class,
GIMP_TYPE_CONFIG_INTERFACE);
config_iface = g_type_interface_peek (owner_class, GIMP_TYPE_CONFIG);
/* We must call deserialize_property() *only* if the *exact* class
* which implements it is param_spec->owner_type's class.
......@@ -269,25 +268,25 @@ gimp_config_deserialize_property (GObject *object,
* GimpConfigInterface is inherited from one of it's parent classes
* and thus not able to handle param_spec->owner_type's properties).
*/
if (gimp_config_iface)
if (config_iface)
{
GTypeClass *owner_parent_class;
owner_parent_class = g_type_class_peek_parent (owner_class),
parent_iface = g_type_interface_peek (owner_parent_class,
GIMP_TYPE_CONFIG_INTERFACE);
GIMP_TYPE_CONFIG);
}
if (gimp_config_iface &&
gimp_config_iface != parent_iface && /* see comment above */
gimp_config_iface->deserialize_property &&
gimp_config_iface->deserialize_property (object,
prop_spec->param_id,
&value,
prop_spec,
scanner,
&token))
if (config_iface &&
config_iface != parent_iface && /* see comment above */
config_iface->deserialize_property &&
config_iface->deserialize_property (config,
prop_spec->param_id,
&value,
prop_spec,
scanner,
&token))
{
/* nop */
}
......@@ -295,11 +294,11 @@ gimp_config_deserialize_property (GObject *object,
{
if (G_VALUE_HOLDS_OBJECT (&value))
token = gimp_config_deserialize_object (&value,
object, prop_spec,
config, prop_spec,
scanner, nest_level);
else
token = gimp_config_deserialize_value (&value,
object, prop_spec, scanner);
config, prop_spec, scanner);
}
if (token == G_TOKEN_RIGHT_PAREN &&
......@@ -307,13 +306,13 @@ gimp_config_deserialize_property (GObject *object,
{
if (! (G_VALUE_HOLDS_OBJECT (&value) &&
(prop_spec->flags & GIMP_PARAM_AGGREGATE)))
g_object_set_property (object, prop_spec->name, &value);
g_object_set_property (G_OBJECT (config), prop_spec->name, &value);
}
#ifdef CONFIG_DEBUG
else
{
g_warning ("couldn't deserialize property %s::%s of type %s",
g_type_name (G_TYPE_FROM_INSTANCE (object)),
g_type_name (G_TYPE_FROM_INSTANCE (config)),
prop_spec->name,
g_type_name (prop_spec->value_type));
}
......@@ -326,7 +325,7 @@ gimp_config_deserialize_property (GObject *object,
static GTokenType
gimp_config_deserialize_value (GValue *value,
GObject *object,
GimpConfig *object,
GParamSpec *prop_spec,
GScanner *scanner)
{
......@@ -625,28 +624,27 @@ gimp_config_deserialize_matrix2 (GValue *value,
static GTokenType
gimp_config_deserialize_object (GValue *value,
GObject *object,
GimpConfig *config,
GParamSpec *prop_spec,
GScanner *scanner,
gint nest_level)
{
GimpConfigInterface *gimp_config_iface;
GObject *prop_object;
GimpConfigInterface *config_iface;
GimpConfig *prop_object;
g_object_get_property (object, prop_spec->name, value);
g_object_get_property (G_OBJECT (config), prop_spec->name, value);
prop_object = g_value_get_object (value);
if (! prop_object)
return G_TOKEN_RIGHT_PAREN;
gimp_config_iface = GIMP_GET_CONFIG_INTERFACE (prop_object);
config_iface = GIMP_CONFIG_GET_INTERFACE (prop_object);
if (! gimp_config_iface)
if (! config_iface)
return gimp_config_deserialize_any (value, prop_spec, scanner);
if (! gimp_config_iface->deserialize (prop_object,
scanner, nest_level + 1, NULL))
if (! config_iface->deserialize (prop_object, scanner, nest_level + 1, NULL))
return G_TOKEN_NONE;
return G_TOKEN_RIGHT_PAREN;
......@@ -654,7 +652,7 @@ gimp_config_deserialize_object (GValue *value,
static GTokenType
gimp_config_deserialize_value_array (GValue *value,
GObject *object,
GimpConfig *config,
GParamSpec *prop_spec,
GScanner *scanner)
{
......@@ -677,7 +675,7 @@ gimp_config_deserialize_value_array (GValue *value,
g_value_init (&array_value, array_spec->element_spec->value_type);
token = gimp_config_deserialize_value (&array_value,
object,
config,
array_spec->element_spec,
scanner);
......
......@@ -23,10 +23,10 @@
#define __GIMP_CONFIG_DESERIALIZE_H__
gboolean gimp_config_deserialize_properties (GObject *object,
GScanner *scanner,
gint nest_level,
gboolean store_unknown_tokens);
gboolean gimp_config_deserialize_properties (GimpConfig *config,
GScanner *scanner,
gint nest_level,
gboolean store_unknown_tokens);
#endif /* __GIMP_CONFIG_DESERIALIZE_H__ */
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* GimpConfig object property dumper.
* GimpConfig object property dumper.
* Copyright (C) 2001-2003 Sven Neumann <sven@gimp.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
......@@ -54,10 +54,10 @@ typedef enum
static gint dump_gimprc (DumpFormat format);
static void dump_gimprc_system (GObject *rc,
static void dump_gimprc_system (GimpConfig *rc,
GimpConfigWriter *writer,
gint fd);
static void dump_gimprc_manpage (GObject *rc,
static void dump_gimprc_manpage (GimpConfig *rc,
GimpConfigWriter *writer,
gint fd);
static gchar * dump_describe_param (GParamSpec *param_spec);
......@@ -70,7 +70,7 @@ main (int argc,
char *argv[])
{
DumpFormat format = DUMP_DEFAULT;
if (argc > 1)
{
if (strcmp (argv[1], "--system-gimprc") == 0)
......@@ -111,7 +111,7 @@ static gint
dump_gimprc (DumpFormat format)
{
GimpConfigWriter *writer;
GObject *rc;
GimpConfig *rc;
gint fd = 1;
if (format == DUMP_NONE)
......@@ -159,7 +159,7 @@ static const gchar *system_gimprc_header =
"Lines that start with a '#' are comments. Blank lines are ignored.\n"
"\n"
"By default everything in this file is commented out. The file then "
"documents the default values and shows what changes are possible.\n"
"documents the default values and shows what changes are possible.\n"
"\n"
"The variable ${gimp_dir} is set to the value of the environment "
"variable GIMP2_DIRECTORY or, if that is not set, the compiled-in "
......@@ -167,7 +167,7 @@ static const gchar *system_gimprc_header =
"it is interpreted relative to your home directory.";
static void
dump_gimprc_system (GObject *rc,
dump_gimprc_system (GimpConfig *rc,
GimpConfigWriter *writer,
gint fd)
{
......@@ -296,7 +296,7 @@ static const gchar *man_page_footer =
static void
dump_gimprc_manpage (GObject *rc,
dump_gimprc_manpage (GimpConfig *rc,
GimpConfigWriter *writer,
gint fd)
{
......@@ -340,7 +340,7 @@ dump_gimprc_manpage (GObject *rc,
}
static const gchar * display_format_description =
static const gchar * display_format_description =
"This is a format string; certain % character sequences are recognised and "
"expanded as follows:\n"
"\n"
......@@ -425,7 +425,7 @@ dump_describe_param (GParamSpec *param_spec)
case GIMP_PARAM_PATH_DIR:
values = "This is a single folder.";
break;
case GIMP_PARAM_PATH_DIR_LIST:
switch (G_SEARCHPATH_SEPARATOR)
{
......@@ -484,9 +484,9 @@ dump_describe_param (GParamSpec *param_spec)
GEnumValue *enum_value;
GString *str;
gint i;
enum_class = g_type_class_peek (type);
str = g_string_new (blurb);
g_string_append (str, " Possible values are ");
......
......@@ -54,7 +54,7 @@ static void serialize_unknown_token (const gchar *key,
/**
* gimp_config_serialize_properties:
* @object: a #GObject.
* @config: a #GimpConfig.
* @writer: a #GimpConfigWriter.
*
* This function writes all object properties to the @writer.
......@@ -62,7 +62,7 @@ static void serialize_unknown_token (const gchar *key,
* Returns: %TRUE if serialization succeeded, %FALSE otherwise
**/
gboolean
gimp_config_serialize_properties (GObject *object,
gimp_config_serialize_properties (GimpConfig *config,
GimpConfigWriter *writer)
{
GObjectClass *klass;
......@@ -70,9 +70,9 @@ gimp_config_serialize_properties (GObject *object,
guint n_property_specs;
guint i;
g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
g_return_val_if_fail (G_IS_OBJECT (config), FALSE);
klass = G_OBJECT_GET_CLASS (object);
klass = G_OBJECT_GET_CLASS (config);
property_specs = g_object_class_list_properties (klass, &n_property_specs);
......@@ -86,7 +86,7 @@ gimp_config_serialize_properties (GObject *object,
if (! (prop_spec->flags & GIMP_PARAM_SERIALIZE))
continue;
if (! gimp_config_serialize_property (object, prop_spec, writer))
if (! gimp_config_serialize_property (config, prop_spec, writer))
return FALSE;
}
......@@ -97,7 +97,7 @@ gimp_config_serialize_properties (GObject *object,
/**
* gimp_config_serialize_changed_properties:
* @object: a #GObject.
* @config: a #GimpConfig.
* @writer: a #GimpConfigWriter.
*
* This function writes all object properties that have been changed from
......@@ -106,7 +106,7 @@ gimp_config_serialize_properties (GObject *object,
* Returns: %TRUE if serialization succeeded, %FALSE otherwise
**/
gboolean
gimp_config_serialize_changed_properties (GObject *object,
gimp_config_serialize_changed_properties (GimpConfig *config,
GimpConfigWriter *writer)
{
GObjectClass *klass;
......@@ -115,9 +115,9 @@ gimp_config_serialize_changed_properties (GObject *object,
guint i;
GValue value = { 0, };
g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
g_return_val_if_fail (G_IS_OBJECT (config), FALSE);
klass = G_OBJECT_GET_CLASS (object);
klass = G_OBJECT_GET_CLASS (config);
property_specs = g_object_class_list_properties (klass, &n_property_specs);
......@@ -132,11 +132,11 @@ gimp_config_serialize_changed_properties (GObject *object,
continue;
g_value_init (&value, prop_spec->value_type);
g_object_get_property (object, prop_spec->name, &value);
g_object_get_property (G_OBJECT (config), prop_spec->name, &value);
if (! g_param_value_defaults (prop_spec, &value))
{
if (! gimp_config_serialize_property (object, prop_spec, writer))
if (! gimp_config_serialize_property (config, prop_spec, writer))
return FALSE;
}
......@@ -150,33 +150,33 @@ gimp_config_serialize_changed_properties (GObject *object,
/**
* gimp_config_serialize_properties_diff:
* @object: a #GObject.
* @compare: a #GObject of the same type as @object.
* @config: a #GimpConfig.
* @compare: a #GimpConfig of the same type as @config.
* @writer: a #GimpConfigWriter.
*
* This function compares @object and @compare and writes all
* properties of @object that have different values than @compare to
* This function compares @config and @compare and writes all
* properties of @config that have different values than @compare to
* the @writer.
*
* Returns: %TRUE if serialization succeeded, %FALSE otherwise
**/
gboolean
gimp_config_serialize_properties_diff (GObject *object,
GObject *compare,
gimp_config_serialize_properties_diff (GimpConfig *config,
GimpConfig *compare,
GimpConfigWriter *writer)
{
GObjectClass *klass;