/* SerializableGeeDualKeyMap.c generated by valac 0.28.1, the Vala compiler
 * generated from SerializableGeeDualKeyMap.vala, do not modify */

/* -*- Mode: vala; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/* SerializableGeeTreeModel.vala
 *
 * Copyright (C) 2013-2015  Daniel Espinosa <esodan@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *      Daniel Espinosa <esodan@gmail.com>
 */

#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <stdlib.h>
#include <string.h>
#include <gio/gio.h>
#include <glib/gi18n-lib.h>


#define GXML_TYPE_SERIALIZABLE (gxml_serializable_get_type ())
#define GXML_SERIALIZABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE, GXmlSerializable))
#define GXML_IS_SERIALIZABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE))
#define GXML_SERIALIZABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE, GXmlSerializableIface))

typedef struct _GXmlSerializable GXmlSerializable;
typedef struct _GXmlSerializableIface GXmlSerializableIface;

#define GXML_TYPE_NODE (gxml_node_get_type ())
#define GXML_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_NODE, GXmlNode))
#define GXML_IS_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_NODE))
#define GXML_NODE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_NODE, GXmlNodeIface))

typedef struct _GXmlNode GXmlNode;
typedef struct _GXmlNodeIface GXmlNodeIface;

#define GXML_TYPE_ELEMENT_LIST (gxml_element_list_get_type ())
#define GXML_ELEMENT_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ELEMENT_LIST, GXmlElementList))
#define GXML_ELEMENT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GXML_TYPE_ELEMENT_LIST, GXmlElementListClass))
#define GXML_IS_ELEMENT_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ELEMENT_LIST))
#define GXML_IS_ELEMENT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GXML_TYPE_ELEMENT_LIST))
#define GXML_ELEMENT_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GXML_TYPE_ELEMENT_LIST, GXmlElementListClass))

typedef struct _GXmlElementList GXmlElementList;
typedef struct _GXmlElementListClass GXmlElementListClass;

#define GXML_TYPE_NAMESPACE (gxml_namespace_get_type ())
#define GXML_NAMESPACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_NAMESPACE, GXmlNamespace))
#define GXML_IS_NAMESPACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_NAMESPACE))
#define GXML_NAMESPACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_NAMESPACE, GXmlNamespaceIface))

typedef struct _GXmlNamespace GXmlNamespace;
typedef struct _GXmlNamespaceIface GXmlNamespaceIface;

#define GXML_TYPE_NODE_TYPE (gxml_node_type_get_type ())

#define GXML_TYPE_DOCUMENT (gxml_document_get_type ())
#define GXML_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_DOCUMENT, GXmlDocument))
#define GXML_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_DOCUMENT))
#define GXML_DOCUMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_DOCUMENT, GXmlDocumentIface))

typedef struct _GXmlDocument GXmlDocument;
typedef struct _GXmlDocumentIface GXmlDocumentIface;

#define GXML_TYPE_ATTRIBUTE (gxml_attribute_get_type ())
#define GXML_ATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ATTRIBUTE, GXmlAttribute))
#define GXML_IS_ATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ATTRIBUTE))
#define GXML_ATTRIBUTE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_ATTRIBUTE, GXmlAttributeIface))

typedef struct _GXmlAttribute GXmlAttribute;
typedef struct _GXmlAttributeIface GXmlAttributeIface;

#define GXML_TYPE_SERIALIZABLE_COLLECTION (gxml_serializable_collection_get_type ())
#define GXML_SERIALIZABLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION, GXmlSerializableCollection))
#define GXML_IS_SERIALIZABLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION))
#define GXML_SERIALIZABLE_COLLECTION_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION, GXmlSerializableCollectionIface))

typedef struct _GXmlSerializableCollection GXmlSerializableCollection;
typedef struct _GXmlSerializableCollectionIface GXmlSerializableCollectionIface;

#define GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP (gxml_serializable_dual_key_map_get_type ())
#define GXML_SERIALIZABLE_DUAL_KEY_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap))
#define GXML_SERIALIZABLE_DUAL_KEY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMapClass))
#define GXML_IS_SERIALIZABLE_DUAL_KEY_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP))
#define GXML_IS_SERIALIZABLE_DUAL_KEY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP))
#define GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMapClass))

typedef struct _GXmlSerializableDualKeyMap GXmlSerializableDualKeyMap;
typedef struct _GXmlSerializableDualKeyMapClass GXmlSerializableDualKeyMapClass;
typedef struct _GXmlSerializableDualKeyMapPrivate GXmlSerializableDualKeyMapPrivate;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
#define _g_free0(var) (var = (g_free (var), NULL))

#define GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY (gxml_serializable_map_dual_key_get_type ())
#define GXML_SERIALIZABLE_MAP_DUAL_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKey))
#define GXML_IS_SERIALIZABLE_MAP_DUAL_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY))
#define GXML_SERIALIZABLE_MAP_DUAL_KEY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKeyIface))

typedef struct _GXmlSerializableMapDualKey GXmlSerializableMapDualKey;
typedef struct _GXmlSerializableMapDualKeyIface GXmlSerializableMapDualKeyIface;

#define GXML_TYPE_ELEMENT (gxml_element_get_type ())
#define GXML_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ELEMENT, GXmlElement))
#define GXML_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ELEMENT))
#define GXML_ELEMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_ELEMENT, GXmlElementIface))

typedef struct _GXmlElement GXmlElement;
typedef struct _GXmlElementIface GXmlElementIface;
#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

struct _GXmlNamespaceIface {
	GTypeInterface parent_iface;
	gchar* (*get_uri) (GXmlNamespace* self);
	gchar* (*get_prefix) (GXmlNamespace* self);
};

typedef enum  {
	GXML_NODE_TYPE_X_UNKNOWN = 0,
	GXML_NODE_TYPE_ELEMENT = 1,
	GXML_NODE_TYPE_ATTRIBUTE,
	GXML_NODE_TYPE_TEXT,
	GXML_NODE_TYPE_CDATA_SECTION,
	GXML_NODE_TYPE_ENTITY_REFERENCE,
	GXML_NODE_TYPE_ENTITY,
	GXML_NODE_TYPE_PROCESSING_INSTRUCTION,
	GXML_NODE_TYPE_COMMENT,
	GXML_NODE_TYPE_DOCUMENT,
	GXML_NODE_TYPE_DOCUMENT_TYPE,
	GXML_NODE_TYPE_DOCUMENT_FRAGMENT,
	GXML_NODE_TYPE_NOTATION
} GXmlNodeType;

struct _GXmlDocumentIface {
	GTypeInterface parent_iface;
	GXmlNode* (*create_element) (GXmlDocument* self, const gchar* name, GError** error);
	GXmlNode* (*create_text) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_comment) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_cdata) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_pi) (GXmlDocument* self, const gchar* target, const gchar* data);
	gboolean (*save) (GXmlDocument* self, GCancellable* cancellable, GError** error);
	gboolean (*save_as) (GXmlDocument* self, GFile* f, GCancellable* cancellable, GError** error);
	gboolean (*get_indent) (GXmlDocument* self);
	void (*set_indent) (GXmlDocument* self, gboolean value);
	gboolean (*get_ns_top) (GXmlDocument* self);
	void (*set_ns_top) (GXmlDocument* self, gboolean value);
	gboolean (*get_prefix_default_ns) (GXmlDocument* self);
	void (*set_prefix_default_ns) (GXmlDocument* self, gboolean value);
	gboolean (*get_backup) (GXmlDocument* self);
	void (*set_backup) (GXmlDocument* self, gboolean value);
	GXmlNode* (*get_root) (GXmlDocument* self);
	GFile* (*get_file) (GXmlDocument* self);
	void (*set_file) (GXmlDocument* self, GFile* value);
};

struct _GXmlNodeIface {
	GTypeInterface parent_iface;
	GXmlNode* (*get) (GXmlNode* self, const gchar* key);
	GXmlElementList* (*get_elements_by_property_value) (GXmlNode* self, const gchar* property, const gchar* value);
	gchar* (*to_string) (GXmlNode* self);
	gboolean (*set_namespace) (GXmlNode* self, const gchar* uri, const gchar* prefix);
	gchar* (*ns_prefix) (GXmlNode* self);
	gchar* (*ns_uri) (GXmlNode* self);
	GeeList* (*get_namespaces) (GXmlNode* self);
	GeeBidirList* (*get_childs) (GXmlNode* self);
	GeeBidirList* (*get_children) (GXmlNode* self);
	GeeMap* (*get_attrs) (GXmlNode* self);
	gchar* (*get_name) (GXmlNode* self);
	gchar* (*get_value) (GXmlNode* self);
	void (*set_value) (GXmlNode* self, const gchar* value);
	GXmlNodeType (*get_type_node) (GXmlNode* self);
	GXmlDocument* (*get_document) (GXmlNode* self);
	GXmlNode* (*get_parent) (GXmlNode* self);
};

struct _GXmlAttributeIface {
	GTypeInterface parent_iface;
	GXmlNamespace* (*get_namespace) (GXmlAttribute* self);
	void (*set_namespace) (GXmlAttribute* self, GXmlNamespace* value);
	gchar* (*get_prefix) (GXmlAttribute* self);
};

struct _GXmlSerializableIface {
	GTypeInterface parent_iface;
	gboolean (*get_enable_unknown_serializable_property) (GXmlSerializable* self);
	gboolean (*set_default_namespace) (GXmlSerializable* self, GXmlNode* node);
	gboolean (*serialize_use_xml_node_value) (GXmlSerializable* self);
	gchar* (*node_name) (GXmlSerializable* self);
	gboolean (*property_use_nick) (GXmlSerializable* self);
	GXmlNode* (*serialize) (GXmlSerializable* self, GXmlNode* node, GError** error);
	GXmlNode* (*serialize_property) (GXmlSerializable* self, GXmlNode* element, GParamSpec* prop, GError** error);
	gboolean (*deserialize) (GXmlSerializable* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_property) (GXmlSerializable* self, GXmlNode* property_node, GError** error);
	GParamSpec* (*find_property_spec) (GXmlSerializable* self, const gchar* property_name);
	GParamSpec* (*default_find_property_spec) (GXmlSerializable* self, const gchar* property_name);
	GParamSpec** (*list_serializable_properties) (GXmlSerializable* self, int* result_length1);
	GParamSpec** (*default_list_serializable_properties) (GXmlSerializable* self, int* result_length1);
	GeeMap* (*get_unknown_serializable_properties) (GXmlSerializable* self);
	GeeCollection* (*get_unknown_serializable_nodes) (GXmlSerializable* self);
	gchar* (*get_serialized_xml_node_value) (GXmlSerializable* self);
	void (*set_serialized_xml_node_value) (GXmlSerializable* self, const gchar* value);
};

struct _GXmlSerializableCollectionIface {
	GTypeInterface parent_iface;
	gboolean (*deserialize_proceed) (GXmlSerializableCollection* self);
	gboolean (*deserialized) (GXmlSerializableCollection* self);
	gboolean (*deserialize_node) (GXmlSerializableCollection* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_children) (GXmlSerializableCollection* self, GError** error);
	gboolean (*is_collection) (GXmlSerializableCollection* self);
};

struct _GXmlSerializableDualKeyMap {
	GObject parent_instance;
	GXmlSerializableDualKeyMapPrivate * priv;
	GeeHashMultiMap* storage;
	GXmlNode* _node;
	gboolean _deserialized;
};

struct _GXmlSerializableDualKeyMapClass {
	GObjectClass parent_class;
	gboolean (*deserialize_proceed) (GXmlSerializableDualKeyMap* self);
	gboolean (*deserialized) (GXmlSerializableDualKeyMap* self);
	gboolean (*deserialize_node) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_children) (GXmlSerializableDualKeyMap* self, GError** error);
	gboolean (*set_default_namespace) (GXmlSerializableDualKeyMap* self, GXmlNode* node);
	gboolean (*get_enable_unknown_serializable_property) (GXmlSerializableDualKeyMap* self);
	gboolean (*serialize_use_xml_node_value) (GXmlSerializableDualKeyMap* self);
	gboolean (*property_use_nick) (GXmlSerializableDualKeyMap* self);
	gchar* (*node_name) (GXmlSerializableDualKeyMap* self);
	GParamSpec* (*find_property_spec) (GXmlSerializableDualKeyMap* self, const gchar* property_name);
	GParamSpec** (*list_serializable_properties) (GXmlSerializableDualKeyMap* self, int* result_length1);
	GXmlNode* (*serialize) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	GXmlNode* (*serialize_property) (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error);
	gboolean (*deserialize) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_property) (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error);
};

struct _GXmlSerializableDualKeyMapPrivate {
	GType p_type;
	GBoxedCopyFunc p_dup_func;
	GDestroyNotify p_destroy_func;
	GType s_type;
	GBoxedCopyFunc s_dup_func;
	GDestroyNotify s_destroy_func;
	GType v_type;
	GBoxedCopyFunc v_dup_func;
	GDestroyNotify v_destroy_func;
	GParamSpec** _properties;
	gint _properties_length1;
	gint __properties_size_;
	GHashTable* _ignored_serializable_properties;
	gchar* _serialized_xml_node_value;
};

struct _GXmlSerializableMapDualKeyIface {
	GTypeInterface parent_iface;
	gpointer (*get_map_primary_key) (GXmlSerializableMapDualKey* self);
	gpointer (*get_map_secondary_key) (GXmlSerializableMapDualKey* self);
};

typedef enum  {
	GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR,
	GXML_SERIALIZABLE_ERROR_STR_TO_VALUE_ERROR
} GXmlSerializableError;
#define GXML_SERIALIZABLE_ERROR gxml_serializable_error_quark ()
struct _GXmlElementIface {
	GTypeInterface parent_iface;
	void (*normalize) (GXmlElement* self);
	void (*set_attr) (GXmlElement* self, const gchar* name, const gchar* value);
	GXmlNode* (*get_attr) (GXmlElement* self, const gchar* name);
	void (*remove_attr) (GXmlElement* self, const gchar* name);
	void (*set_ns_attr) (GXmlElement* self, GXmlNamespace* ns, const gchar* name, const gchar* value);
	GXmlNode* (*get_ns_attr) (GXmlElement* self, const gchar* name, const gchar* uri);
	gchar* (*get_tag_name) (GXmlElement* self);
	gchar* (*get_content) (GXmlElement* self);
	void (*set_content) (GXmlElement* self, const gchar* value);
};


static gpointer gxml_serializable_dual_key_map_parent_class = NULL;
static GeeTraversableIface* gxml_serializable_dual_key_map_gee_traversable_parent_iface = NULL;
static GXmlSerializableIface* gxml_serializable_dual_key_map_gxml_serializable_parent_iface = NULL;
static GXmlSerializableCollectionIface* gxml_serializable_dual_key_map_gxml_serializable_collection_parent_iface = NULL;

GType gxml_element_list_get_type (void) G_GNUC_CONST;
GType gxml_namespace_get_type (void) G_GNUC_CONST;
GType gxml_node_type_get_type (void) G_GNUC_CONST;
GType gxml_document_get_type (void) G_GNUC_CONST;
GType gxml_node_get_type (void) G_GNUC_CONST;
GType gxml_attribute_get_type (void) G_GNUC_CONST;
GType gxml_serializable_get_type (void) G_GNUC_CONST;
GType gxml_serializable_collection_get_type (void) G_GNUC_CONST;
GType gxml_serializable_dual_key_map_get_type (void) G_GNUC_CONST;
#define GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMapPrivate))
enum  {
	GXML_SERIALIZABLE_DUAL_KEY_MAP_DUMMY_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE
};
gboolean gxml_serializable_dual_key_map_deserialize_proceed (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_deserialize_proceed (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_deserialized (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_deserialized (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_deserialize_node (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_node (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
GType gxml_serializable_dual_key_map_get_value_type (GXmlSerializableDualKeyMap* self);
GType gxml_serializable_map_dual_key_get_type (void) G_GNUC_CONST;
GQuark gxml_serializable_error_quark (void);
GType gxml_element_get_type (void) G_GNUC_CONST;
gchar* gxml_node_get_name (GXmlNode* self);
gchar* gxml_serializable_node_name (GXmlSerializable* self);
gboolean gxml_serializable_collection_deserialize_children (GXmlSerializableCollection* self, GError** error);
gboolean gxml_serializable_deserialize (GXmlSerializable* self, GXmlNode* node, GError** error);
void gxml_serializable_dual_key_map_set (GXmlSerializableDualKeyMap* self, gconstpointer primary_key, gconstpointer secundary_key, gconstpointer val);
gpointer gxml_serializable_map_dual_key_get_map_primary_key (GXmlSerializableMapDualKey* self);
gpointer gxml_serializable_map_dual_key_get_map_secondary_key (GXmlSerializableMapDualKey* self);
gboolean gxml_serializable_dual_key_map_deserialize_children (GXmlSerializableDualKeyMap* self, GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_children (GXmlSerializableDualKeyMap* self, GError** error);
GeeBidirList* gxml_node_get_children (GXmlNode* self);
GeeCollection* gxml_serializable_dual_key_map_secondary_keys (GXmlSerializableDualKeyMap* self, gconstpointer key);
static void gxml_serializable_dual_key_map_init (GXmlSerializableDualKeyMap* self);
GeeCollection* gxml_serializable_dual_key_map_values_for_key (GXmlSerializableDualKeyMap* self, gconstpointer primary_key);
GeeCollection* gxml_serializable_dual_key_map_values (GXmlSerializableDualKeyMap* self);
gpointer gxml_serializable_dual_key_map_get (GXmlSerializableDualKeyMap* self, gconstpointer primary_key, gconstpointer secondary_key);
gboolean gxml_serializable_dual_key_map_set_default_namespace (GXmlSerializableDualKeyMap* self, GXmlNode* node);
static gboolean gxml_serializable_dual_key_map_real_set_default_namespace (GXmlSerializableDualKeyMap* self, GXmlNode* node);
gboolean gxml_serializable_dual_key_map_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_property_use_nick (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_property_use_nick (GXmlSerializableDualKeyMap* self);
gchar* gxml_serializable_dual_key_map_node_name (GXmlSerializableDualKeyMap* self);
static gchar* gxml_serializable_dual_key_map_real_node_name (GXmlSerializableDualKeyMap* self);
GParamSpec* gxml_serializable_dual_key_map_find_property_spec (GXmlSerializableDualKeyMap* self, const gchar* property_name);
static GParamSpec* gxml_serializable_dual_key_map_real_find_property_spec (GXmlSerializableDualKeyMap* self, const gchar* property_name);
GParamSpec* gxml_serializable_default_find_property_spec (GXmlSerializable* self, const gchar* property_name);
GParamSpec** gxml_serializable_dual_key_map_list_serializable_properties (GXmlSerializableDualKeyMap* self, int* result_length1);
static GParamSpec** gxml_serializable_dual_key_map_real_list_serializable_properties (GXmlSerializableDualKeyMap* self, int* result_length1);
GParamSpec** gxml_serializable_default_list_serializable_properties (GXmlSerializable* self, int* result_length1);
GXmlNode* gxml_serializable_dual_key_map_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
static GXmlNode* gxml_serializable_dual_key_map_real_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
GXmlNode* gxml_serializable_dual_key_map_default_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
GXmlNode* gxml_serializable_serialize (GXmlSerializable* self, GXmlNode* node, GError** error);
GXmlNode* gxml_serializable_dual_key_map_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error);
static GXmlNode* gxml_serializable_dual_key_map_real_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error);
GXmlNode* gxml_serializable_dual_key_map_default_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error);
gboolean gxml_serializable_dual_key_map_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
gboolean gxml_serializable_dual_key_map_default_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
gboolean gxml_serializable_dual_key_map_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error);
gboolean gxml_serializable_dual_key_map_default_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error);
static gboolean gxml_serializable_dual_key_map_real_foreach (GeeTraversable* base, GeeForallFunc f, void* f_target);
GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_new (GType p_type, GBoxedCopyFunc p_dup_func, GDestroyNotify p_destroy_func, GType s_type, GBoxedCopyFunc s_dup_func, GDestroyNotify s_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func);
GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_construct (GType object_type, GType p_type, GBoxedCopyFunc p_dup_func, GDestroyNotify p_destroy_func, GType s_type, GBoxedCopyFunc s_dup_func, GDestroyNotify s_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func);
GType gxml_serializable_dual_key_map_get_primary_key_type (GXmlSerializableDualKeyMap* self);
GType gxml_serializable_dual_key_map_get_secondary_key_type (GXmlSerializableDualKeyMap* self);
GeeCollection* gxml_serializable_dual_key_map_get_primary_keys (GXmlSerializableDualKeyMap* self);
gint gxml_serializable_dual_key_map_get_size (GXmlSerializableDualKeyMap* self);
GParamSpec** gxml_serializable_dual_key_map_get_properties (GXmlSerializableDualKeyMap* self, int* result_length1);
void gxml_serializable_dual_key_map_set_properties (GXmlSerializableDualKeyMap* self, GParamSpec** value, int value_length1);
static GParamSpec** _vala_array_dup7 (GParamSpec** self, int length);
GHashTable* gxml_serializable_dual_key_map_get_ignored_serializable_properties (GXmlSerializableDualKeyMap* self);
void gxml_serializable_dual_key_map_set_ignored_serializable_properties (GXmlSerializableDualKeyMap* self, GHashTable* value);
static GObject * gxml_serializable_dual_key_map_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
void gxml_init_init (void);
static void gxml_serializable_dual_key_map_finalize (GObject* obj);
GeeMap* gxml_serializable_get_unknown_serializable_properties (GXmlSerializable* self);
GeeCollection* gxml_serializable_get_unknown_serializable_nodes (GXmlSerializable* self);
gchar* gxml_serializable_get_serialized_xml_node_value (GXmlSerializable* self);
static void _vala_gxml_serializable_dual_key_map_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
void gxml_serializable_set_serialized_xml_node_value (GXmlSerializable* self, const gchar* value);
static void _vala_gxml_serializable_dual_key_map_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);


static gboolean gxml_serializable_dual_key_map_real_deserialize_proceed (GXmlSerializableDualKeyMap* self) {
	gboolean result = FALSE;
	result = TRUE;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialize_proceed (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_proceed (self);
}


static gboolean gxml_serializable_dual_key_map_real_deserialized (GXmlSerializableDualKeyMap* self) {
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	_tmp0_ = self->_deserialized;
	result = _tmp0_;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialized (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialized (self);
}


static gboolean gxml_serializable_dual_key_map_real_deserialize_node (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GType _tmp1_ = 0UL;
	GType _tmp2_ = 0UL;
	gboolean _tmp3_ = FALSE;
	GXmlNode* _tmp14_ = NULL;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (node != NULL, FALSE);
	_tmp1_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp2_ = _tmp1_;
	_tmp3_ = g_type_is_a (_tmp2_, GXML_TYPE_SERIALIZABLE);
	if (_tmp3_) {
		GType _tmp4_ = 0UL;
		GType _tmp5_ = 0UL;
		gboolean _tmp6_ = FALSE;
		_tmp4_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp5_ = _tmp4_;
		_tmp6_ = g_type_is_a (_tmp5_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY);
		_tmp0_ = _tmp6_;
	} else {
		_tmp0_ = FALSE;
	}
	if (!_tmp0_) {
		const gchar* _tmp7_ = NULL;
		GType _tmp8_ = 0UL;
		const gchar* _tmp9_ = NULL;
		GType _tmp10_ = 0UL;
		GType _tmp11_ = 0UL;
		const gchar* _tmp12_ = NULL;
		GError* _tmp13_ = NULL;
		_tmp7_ = _ ("%s: Value type '%s' is unsupported");
		_tmp8_ = G_TYPE_FROM_INSTANCE ((GObject*) self);
		_tmp9_ = g_type_name (_tmp8_);
		_tmp10_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp11_ = _tmp10_;
		_tmp12_ = g_type_name (_tmp11_);
		_tmp13_ = g_error_new (GXML_SERIALIZABLE_ERROR, GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR, _tmp7_, _tmp9_, _tmp12_);
		_inner_error_ = _tmp13_;
		g_propagate_error (error, _inner_error_);
		return FALSE;
	}
	_tmp14_ = node;
	if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp14_, GXML_TYPE_ELEMENT)) {
		GXmlSerializableMapDualKey* obj = NULL;
		GType _tmp15_ = 0UL;
		GType _tmp16_ = 0UL;
		GObject* _tmp17_ = NULL;
		GObject* _tmp18_ = NULL;
		GXmlNode* _tmp19_ = NULL;
		gchar* _tmp20_ = NULL;
		gchar* _tmp21_ = NULL;
		gchar* _tmp22_ = NULL;
		gchar* _tmp23_ = NULL;
		gchar* _tmp24_ = NULL;
		GXmlSerializableMapDualKey* _tmp25_ = NULL;
		gchar* _tmp26_ = NULL;
		gchar* _tmp27_ = NULL;
		gchar* _tmp28_ = NULL;
		gchar* _tmp29_ = NULL;
		gboolean _tmp30_ = FALSE;
		_tmp15_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp16_ = _tmp15_;
		_tmp17_ = g_object_new (_tmp16_, NULL);
		_tmp18_ = G_IS_INITIALLY_UNOWNED (_tmp17_) ? g_object_ref_sink (_tmp17_) : _tmp17_;
		obj = G_TYPE_CHECK_INSTANCE_CAST (_tmp18_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKey);
		_tmp19_ = node;
		_tmp20_ = gxml_node_get_name (_tmp19_);
		_tmp21_ = _tmp20_;
		_tmp22_ = _tmp21_;
		_tmp23_ = g_utf8_strdown (_tmp22_, (gssize) (-1));
		_tmp24_ = _tmp23_;
		_tmp25_ = obj;
		_tmp26_ = gxml_serializable_node_name (G_TYPE_CHECK_INSTANCE_CAST (_tmp25_, GXML_TYPE_SERIALIZABLE, GXmlSerializable));
		_tmp27_ = _tmp26_;
		_tmp28_ = g_utf8_strdown (_tmp27_, (gssize) (-1));
		_tmp29_ = _tmp28_;
		_tmp30_ = g_strcmp0 (_tmp24_, _tmp29_) == 0;
		_g_free0 (_tmp29_);
		_g_free0 (_tmp27_);
		_g_free0 (_tmp24_);
		_g_free0 (_tmp22_);
		if (_tmp30_) {
			GXmlSerializableMapDualKey* _tmp31_ = NULL;
			_tmp31_ = obj;
			if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp31_, GXML_TYPE_SERIALIZABLE_COLLECTION)) {
				GXmlSerializableMapDualKey* _tmp32_ = NULL;
				_tmp32_ = obj;
				gxml_serializable_collection_deserialize_children (G_TYPE_CHECK_INSTANCE_TYPE (_tmp32_, GXML_TYPE_SERIALIZABLE_COLLECTION) ? ((GXmlSerializableCollection*) _tmp32_) : NULL, &_inner_error_);
				if (G_UNLIKELY (_inner_error_ != NULL)) {
					g_propagate_error (error, _inner_error_);
					_g_object_unref0 (obj);
					return FALSE;
				}
			} else {
				GXmlSerializableMapDualKey* _tmp33_ = NULL;
				GXmlNode* _tmp34_ = NULL;
				GXmlSerializableMapDualKey* _tmp35_ = NULL;
				gpointer _tmp36_ = NULL;
				gpointer _tmp37_ = NULL;
				GXmlSerializableMapDualKey* _tmp38_ = NULL;
				gpointer _tmp39_ = NULL;
				gpointer _tmp40_ = NULL;
				GXmlSerializableMapDualKey* _tmp41_ = NULL;
				_tmp33_ = obj;
				_tmp34_ = node;
				gxml_serializable_deserialize (G_TYPE_CHECK_INSTANCE_CAST (_tmp33_, GXML_TYPE_SERIALIZABLE, GXmlSerializable), _tmp34_, &_inner_error_);
				if (G_UNLIKELY (_inner_error_ != NULL)) {
					g_propagate_error (error, _inner_error_);
					_g_object_unref0 (obj);
					return FALSE;
				}
				_tmp35_ = obj;
				_tmp36_ = gxml_serializable_map_dual_key_get_map_primary_key (_tmp35_);
				_tmp37_ = _tmp36_;
				_tmp38_ = obj;
				_tmp39_ = gxml_serializable_map_dual_key_get_map_secondary_key (_tmp38_);
				_tmp40_ = _tmp39_;
				_tmp41_ = obj;
				gxml_serializable_dual_key_map_set (self, _tmp37_, _tmp40_, _tmp41_);
				((_tmp40_ == NULL) || (self->priv->s_destroy_func == NULL)) ? NULL : (_tmp40_ = (self->priv->s_destroy_func (_tmp40_), NULL));
				((_tmp37_ == NULL) || (self->priv->p_destroy_func == NULL)) ? NULL : (_tmp37_ = (self->priv->p_destroy_func (_tmp37_), NULL));
			}
		}
		_g_object_unref0 (obj);
	}
	result = TRUE;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialize_node (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_node (self, node, error);
}


static gboolean gxml_serializable_dual_key_map_real_deserialize_children (GXmlSerializableDualKeyMap* self, GError** error) {
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GXmlNode* _tmp1_ = NULL;
	gboolean _tmp2_ = FALSE;
	GType _tmp3_ = 0UL;
	GType _tmp4_ = 0UL;
	gboolean _tmp5_ = FALSE;
	GError * _inner_error_ = NULL;
	_tmp0_ = self->_deserialized;
	if (_tmp0_) {
		result = FALSE;
		return result;
	}
	_tmp1_ = self->_node;
	if (_tmp1_ == NULL) {
		result = FALSE;
		return result;
	}
	_tmp3_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp4_ = _tmp3_;
	_tmp5_ = g_type_is_a (_tmp4_, GXML_TYPE_SERIALIZABLE);
	if (_tmp5_) {
		GType _tmp6_ = 0UL;
		GType _tmp7_ = 0UL;
		gboolean _tmp8_ = FALSE;
		_tmp6_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp7_ = _tmp6_;
		_tmp8_ = g_type_is_a (_tmp7_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY);
		_tmp2_ = _tmp8_;
	} else {
		_tmp2_ = FALSE;
	}
	if (!_tmp2_) {
		const gchar* _tmp9_ = NULL;
		GType _tmp10_ = 0UL;
		const gchar* _tmp11_ = NULL;
		GType _tmp12_ = 0UL;
		GType _tmp13_ = 0UL;
		const gchar* _tmp14_ = NULL;
		GError* _tmp15_ = NULL;
		_tmp9_ = _ ("%s: Value type '%s' is unsupported");
		_tmp10_ = G_TYPE_FROM_INSTANCE ((GObject*) self);
		_tmp11_ = g_type_name (_tmp10_);
		_tmp12_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp13_ = _tmp12_;
		_tmp14_ = g_type_name (_tmp13_);
		_tmp15_ = g_error_new (GXML_SERIALIZABLE_ERROR, GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR, _tmp9_, _tmp11_, _tmp14_);
		_inner_error_ = _tmp15_;
		g_propagate_error (error, _inner_error_);
		return FALSE;
	}
	{
		GeeBidirList* _n_list = NULL;
		GXmlNode* _tmp16_ = NULL;
		GeeBidirList* _tmp17_ = NULL;
		GeeBidirList* _tmp18_ = NULL;
		gint _n_size = 0;
		GeeBidirList* _tmp19_ = NULL;
		gint _tmp20_ = 0;
		gint _tmp21_ = 0;
		gint _n_index = 0;
		_tmp16_ = self->_node;
		_tmp17_ = gxml_node_get_children (_tmp16_);
		_tmp18_ = _tmp17_;
		_n_list = _tmp18_;
		_tmp19_ = _n_list;
		_tmp20_ = gee_collection_get_size ((GeeCollection*) _tmp19_);
		_tmp21_ = _tmp20_;
		_n_size = _tmp21_;
		_n_index = -1;
		while (TRUE) {
			gint _tmp22_ = 0;
			gint _tmp23_ = 0;
			gint _tmp24_ = 0;
			GXmlNode* n = NULL;
			GeeBidirList* _tmp25_ = NULL;
			gint _tmp26_ = 0;
			gpointer _tmp27_ = NULL;
			GXmlNode* _tmp28_ = NULL;
			_tmp22_ = _n_index;
			_n_index = _tmp22_ + 1;
			_tmp23_ = _n_index;
			_tmp24_ = _n_size;
			if (!(_tmp23_ < _tmp24_)) {
				break;
			}
			_tmp25_ = _n_list;
			_tmp26_ = _n_index;
			_tmp27_ = gee_list_get ((GeeList*) _tmp25_, _tmp26_);
			n = (GXmlNode*) _tmp27_;
			_tmp28_ = n;
			gxml_serializable_dual_key_map_deserialize_node (self, _tmp28_, &_inner_error_);
			if (G_UNLIKELY (_inner_error_ != NULL)) {
				g_propagate_error (error, _inner_error_);
				_g_object_unref0 (n);
				_g_object_unref0 (_n_list);
				return FALSE;
			}
			_g_object_unref0 (n);
		}
		_g_object_unref0 (_n_list);
	}
	self->_deserialized = TRUE;
	result = TRUE;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialize_children (GXmlSerializableDualKeyMap* self, GError** error) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_children (self, error);
}


GeeCollection* gxml_serializable_dual_key_map_secondary_keys (GXmlSerializableDualKeyMap* self, gconstpointer key) {
	GeeCollection* result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_ = NULL;
	gconstpointer _tmp1_ = NULL;
	GeeCollection* _tmp2_ = NULL;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp3_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = key;
	_tmp2_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, _tmp1_);
	hs = _tmp2_;
	_tmp3_ = gee_hash_set_new (self->priv->s_type, (GBoxedCopyFunc) self->priv->s_dup_func, self->priv->s_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp3_;
	{
		GeeIterator* _hm_it = NULL;
		GeeCollection* _tmp4_ = NULL;
		GeeIterator* _tmp5_ = NULL;
		_tmp4_ = hs;
		_tmp5_ = gee_iterable_iterator ((GeeIterable*) _tmp4_);
		_hm_it = _tmp5_;
		while (TRUE) {
			GeeIterator* _tmp6_ = NULL;
			gboolean _tmp7_ = FALSE;
			GeeHashMap* hm = NULL;
			GeeIterator* _tmp8_ = NULL;
			gpointer _tmp9_ = NULL;
			GeeHashSet* _tmp10_ = NULL;
			GeeHashMap* _tmp11_ = NULL;
			GeeSet* _tmp12_ = NULL;
			GeeSet* _tmp13_ = NULL;
			GeeSet* _tmp14_ = NULL;
			_tmp6_ = _hm_it;
			_tmp7_ = gee_iterator_next (_tmp6_);
			if (!_tmp7_) {
				break;
			}
			_tmp8_ = _hm_it;
			_tmp9_ = gee_iterator_get (_tmp8_);
			hm = (GeeHashMap*) _tmp9_;
			_tmp10_ = s;
			_tmp11_ = hm;
			_tmp12_ = gee_abstract_map_get_keys ((GeeMap*) _tmp11_);
			_tmp13_ = _tmp12_;
			_tmp14_ = _tmp13_;
			gee_collection_add_all ((GeeCollection*) _tmp10_, (GeeCollection*) _tmp14_);
			_g_object_unref0 (_tmp14_);
			_g_object_unref0 (hm);
		}
		_g_object_unref0 (_hm_it);
	}
	result = (GeeCollection*) s;
	_g_object_unref0 (hs);
	return result;
}


GeeCollection* gxml_serializable_dual_key_map_values_for_key (GXmlSerializableDualKeyMap* self, gconstpointer primary_key) {
	GeeCollection* result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_ = NULL;
	gconstpointer _tmp1_ = NULL;
	GeeCollection* _tmp2_ = NULL;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp3_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = primary_key;
	_tmp2_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, _tmp1_);
	hs = _tmp2_;
	_tmp3_ = gee_hash_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp3_;
	{
		GeeIterator* _hm_it = NULL;
		GeeCollection* _tmp4_ = NULL;
		GeeIterator* _tmp5_ = NULL;
		_tmp4_ = hs;
		_tmp5_ = gee_iterable_iterator ((GeeIterable*) _tmp4_);
		_hm_it = _tmp5_;
		while (TRUE) {
			GeeIterator* _tmp6_ = NULL;
			gboolean _tmp7_ = FALSE;
			GeeHashMap* hm = NULL;
			GeeIterator* _tmp8_ = NULL;
			gpointer _tmp9_ = NULL;
			GeeHashSet* _tmp10_ = NULL;
			GeeHashMap* _tmp11_ = NULL;
			GeeCollection* _tmp12_ = NULL;
			GeeCollection* _tmp13_ = NULL;
			GeeCollection* _tmp14_ = NULL;
			_tmp6_ = _hm_it;
			_tmp7_ = gee_iterator_next (_tmp6_);
			if (!_tmp7_) {
				break;
			}
			_tmp8_ = _hm_it;
			_tmp9_ = gee_iterator_get (_tmp8_);
			hm = (GeeHashMap*) _tmp9_;
			_tmp10_ = s;
			_tmp11_ = hm;
			_tmp12_ = gee_abstract_map_get_values ((GeeMap*) _tmp11_);
			_tmp13_ = _tmp12_;
			_tmp14_ = _tmp13_;
			gee_collection_add_all ((GeeCollection*) _tmp10_, _tmp14_);
			_g_object_unref0 (_tmp14_);
			_g_object_unref0 (hm);
		}
		_g_object_unref0 (_hm_it);
	}
	result = (GeeCollection*) s;
	_g_object_unref0 (hs);
	return result;
}


GeeCollection* gxml_serializable_dual_key_map_values (GXmlSerializableDualKeyMap* self) {
	GeeCollection* result = NULL;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp0_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = gee_hash_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp0_;
	{
		GeeIterator* _h_it = NULL;
		GeeHashMultiMap* _tmp1_ = NULL;
		GeeCollection* _tmp2_ = NULL;
		GeeCollection* _tmp3_ = NULL;
		GeeIterator* _tmp4_ = NULL;
		GeeIterator* _tmp5_ = NULL;
		_tmp1_ = self->storage;
		_tmp2_ = gee_multi_map_get_values ((GeeMultiMap*) _tmp1_);
		_tmp3_ = _tmp2_;
		_tmp4_ = gee_iterable_iterator ((GeeIterable*) _tmp3_);
		_tmp5_ = _tmp4_;
		_g_object_unref0 (_tmp3_);
		_h_it = _tmp5_;
		while (TRUE) {
			GeeIterator* _tmp6_ = NULL;
			gboolean _tmp7_ = FALSE;
			GeeHashMap* h = NULL;
			GeeIterator* _tmp8_ = NULL;
			gpointer _tmp9_ = NULL;
			GeeHashSet* _tmp10_ = NULL;
			GeeHashMap* _tmp11_ = NULL;
			GeeCollection* _tmp12_ = NULL;
			GeeCollection* _tmp13_ = NULL;
			GeeCollection* _tmp14_ = NULL;
			_tmp6_ = _h_it;
			_tmp7_ = gee_iterator_next (_tmp6_);
			if (!_tmp7_) {
				break;
			}
			_tmp8_ = _h_it;
			_tmp9_ = gee_iterator_get (_tmp8_);
			h = (GeeHashMap*) _tmp9_;
			_tmp10_ = s;
			_tmp11_ = h;
			_tmp12_ = gee_abstract_map_get_values ((GeeMap*) _tmp11_);
			_tmp13_ = _tmp12_;
			_tmp14_ = _tmp13_;
			gee_collection_add_all ((GeeCollection*) _tmp10_, _tmp14_);
			_g_object_unref0 (_tmp14_);
			_g_object_unref0 (h);
		}
		_g_object_unref0 (_h_it);
	}
	result = (GeeCollection*) s;
	return result;
}


void gxml_serializable_dual_key_map_set (GXmlSerializableDualKeyMap* self, gconstpointer primary_key, gconstpointer secundary_key, gconstpointer val) {
	GeeHashMap* h = NULL;
	GeeHashMap* _tmp0_ = NULL;
	gconstpointer _tmp1_ = NULL;
	gconstpointer _tmp2_ = NULL;
	GeeHashMultiMap* _tmp3_ = NULL;
	gconstpointer _tmp4_ = NULL;
	g_return_if_fail (self != NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = gee_hash_map_new (self->priv->s_type, (GBoxedCopyFunc) self->priv->s_dup_func, self->priv->s_destroy_func, self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
	h = _tmp0_;
	_tmp1_ = secundary_key;
	_tmp2_ = val;
	gee_abstract_map_set ((GeeAbstractMap*) h, _tmp1_, _tmp2_);
	_tmp3_ = self->storage;
	_tmp4_ = primary_key;
	gee_multi_map_set ((GeeMultiMap*) _tmp3_, _tmp4_, h);
	_g_object_unref0 (h);
}


gpointer gxml_serializable_dual_key_map_get (GXmlSerializableDualKeyMap* self, gconstpointer primary_key, gconstpointer secondary_key) {
	gpointer result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_ = NULL;
	gconstpointer _tmp1_ = NULL;
	GeeCollection* _tmp2_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = primary_key;
	_tmp2_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, _tmp1_);
	hs = _tmp2_;
	{
		GeeIterator* _h_it = NULL;
		GeeCollection* _tmp3_ = NULL;
		GeeIterator* _tmp4_ = NULL;
		_tmp3_ = hs;
		_tmp4_ = gee_iterable_iterator ((GeeIterable*) _tmp3_);
		_h_it = _tmp4_;
		while (TRUE) {
			GeeIterator* _tmp5_ = NULL;
			gboolean _tmp6_ = FALSE;
			GeeHashMap* h = NULL;
			GeeIterator* _tmp7_ = NULL;
			gpointer _tmp8_ = NULL;
			GeeHashMap* _tmp9_ = NULL;
			gconstpointer _tmp10_ = NULL;
			gboolean _tmp11_ = FALSE;
			_tmp5_ = _h_it;
			_tmp6_ = gee_iterator_next (_tmp5_);
			if (!_tmp6_) {
				break;
			}
			_tmp7_ = _h_it;
			_tmp8_ = gee_iterator_get (_tmp7_);
			h = (GeeHashMap*) _tmp8_;
			_tmp9_ = h;
			_tmp10_ = secondary_key;
			_tmp11_ = gee_abstract_map_has_key ((GeeAbstractMap*) _tmp9_, _tmp10_);
			if (_tmp11_) {
				GeeHashMap* _tmp12_ = NULL;
				gconstpointer _tmp13_ = NULL;
				gpointer _tmp14_ = NULL;
				_tmp12_ = h;
				_tmp13_ = secondary_key;
				_tmp14_ = gee_abstract_map_get ((GeeAbstractMap*) _tmp12_, _tmp13_);
				result = _tmp14_;
				_g_object_unref0 (h);
				_g_object_unref0 (_h_it);
				_g_object_unref0 (hs);
				return result;
			}
			_g_object_unref0 (h);
		}
		_g_object_unref0 (_h_it);
	}
	result = NULL;
	_g_object_unref0 (hs);
	return result;
}


static void gxml_serializable_dual_key_map_init (GXmlSerializableDualKeyMap* self) {
	GeeHashMultiMap* _tmp0_ = NULL;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->storage;
	if (_tmp0_ == NULL) {
		GeeHashMultiMap* _tmp1_ = NULL;
		_tmp1_ = gee_hash_multi_map_new (self->priv->p_type, (GBoxedCopyFunc) self->priv->p_dup_func, self->priv->p_destroy_func, GEE_TYPE_HASH_MAP, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
		_g_object_unref0 (self->storage);
		self->storage = _tmp1_;
	}
}


static gboolean gxml_serializable_dual_key_map_real_set_default_namespace (GXmlSerializableDualKeyMap* self, GXmlNode* node) {
	gboolean result = FALSE;
	g_return_val_if_fail (node != NULL, FALSE);
	result = TRUE;
	return result;
}


gboolean gxml_serializable_dual_key_map_set_default_namespace (GXmlSerializableDualKeyMap* self, GXmlNode* node) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->set_default_namespace (self, node);
}


static gboolean gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self) {
	gboolean result = FALSE;
	result = FALSE;
	return result;
}


gboolean gxml_serializable_dual_key_map_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->get_enable_unknown_serializable_property (self);
}


static gboolean gxml_serializable_dual_key_map_real_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self) {
	gboolean result = FALSE;
	result = FALSE;
	return result;
}


gboolean gxml_serializable_dual_key_map_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize_use_xml_node_value (self);
}


static gboolean gxml_serializable_dual_key_map_real_property_use_nick (GXmlSerializableDualKeyMap* self) {
	gboolean result = FALSE;
	result = FALSE;
	return result;
}


gboolean gxml_serializable_dual_key_map_property_use_nick (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->property_use_nick (self);
}


static gchar* gxml_serializable_dual_key_map_real_node_name (GXmlSerializableDualKeyMap* self) {
	gchar* result = NULL;
	GType _tmp0_ = 0UL;
	GType _tmp1_ = 0UL;
	GObject* _tmp2_ = NULL;
	GObject* _tmp3_ = NULL;
	GXmlSerializable* _tmp4_ = NULL;
	gchar* _tmp5_ = NULL;
	gchar* _tmp6_ = NULL;
	_tmp0_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp1_ = _tmp0_;
	_tmp2_ = g_object_new (_tmp1_, NULL);
	_tmp3_ = G_IS_INITIALLY_UNOWNED (_tmp2_) ? g_object_ref_sink (_tmp2_) : _tmp2_;
	_tmp4_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp3_, GXML_TYPE_SERIALIZABLE, GXmlSerializable);
	_tmp5_ = gxml_serializable_node_name (_tmp4_);
	_tmp6_ = _tmp5_;
	_g_object_unref0 (_tmp4_);
	result = _tmp6_;
	return result;
}


gchar* gxml_serializable_dual_key_map_node_name (GXmlSerializableDualKeyMap* self) {
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->node_name (self);
}


static GParamSpec* gxml_serializable_dual_key_map_real_find_property_spec (GXmlSerializableDualKeyMap* self, const gchar* property_name) {
	GParamSpec* result = NULL;
	const gchar* _tmp0_ = NULL;
	GParamSpec* _tmp1_ = NULL;
	g_return_val_if_fail (property_name != NULL, NULL);
	_tmp0_ = property_name;
	_tmp1_ = gxml_serializable_default_find_property_spec ((GXmlSerializable*) self, _tmp0_);
	result = _tmp1_;
	return result;
}


GParamSpec* gxml_serializable_dual_key_map_find_property_spec (GXmlSerializableDualKeyMap* self, const gchar* property_name) {
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->find_property_spec (self, property_name);
}


static GParamSpec** gxml_serializable_dual_key_map_real_list_serializable_properties (GXmlSerializableDualKeyMap* self, int* result_length1) {
	GParamSpec** result = NULL;
	gint _tmp0_ = 0;
	GParamSpec** _tmp1_ = NULL;
	GParamSpec** _tmp2_ = NULL;
	gint _tmp2__length1 = 0;
	_tmp1_ = gxml_serializable_default_list_serializable_properties ((GXmlSerializable*) self, &_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp2__length1 = _tmp0_;
	if (result_length1) {
		*result_length1 = _tmp2__length1;
	}
	result = _tmp2_;
	return result;
}


GParamSpec** gxml_serializable_dual_key_map_list_serializable_properties (GXmlSerializableDualKeyMap* self, int* result_length1) {
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->list_serializable_properties (self, result_length1);
}


static GXmlNode* gxml_serializable_dual_key_map_real_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_ = NULL;
	GXmlNode* _tmp2_ = NULL;
	GXmlNode* _tmp3_ = NULL;
	GXmlNode* _tmp4_ = NULL;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (node != NULL, NULL);
	_tmp0_ = node;
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	_tmp2_ = node;
	_tmp3_ = gxml_serializable_dual_key_map_default_serialize (self, _tmp2_, &_inner_error_);
	_tmp1_ = _tmp3_;
	if (G_UNLIKELY (_inner_error_ != NULL)) {
		g_propagate_error (error, _inner_error_);
		return NULL;
	}
	_tmp4_ = _tmp1_;
	_tmp1_ = NULL;
	result = _tmp4_;
	_g_object_unref0 (_tmp1_);
	return result;
}


GXmlNode* gxml_serializable_dual_key_map_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	GXmlNode* _tmp0_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = node;
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize (self, node, error);
}


static gpointer _g_object_ref0 (gpointer self) {
	return self ? g_object_ref (self) : NULL;
}


GXmlNode* gxml_serializable_dual_key_map_default_serialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp14_ = NULL;
	GXmlNode* _tmp15_ = NULL;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (node != NULL, NULL);
	_tmp0_ = node;
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	{
		GeeIterator* _v_it = NULL;
		GeeCollection* _tmp1_ = NULL;
		GeeCollection* _tmp2_ = NULL;
		GeeIterator* _tmp3_ = NULL;
		GeeIterator* _tmp4_ = NULL;
		_tmp1_ = gxml_serializable_dual_key_map_values (self);
		_tmp2_ = _tmp1_;
		_tmp3_ = gee_iterable_iterator ((GeeIterable*) _tmp2_);
		_tmp4_ = _tmp3_;
		_g_object_unref0 (_tmp2_);
		_v_it = _tmp4_;
		while (TRUE) {
			GeeIterator* _tmp5_ = NULL;
			gboolean _tmp6_ = FALSE;
			gpointer v = NULL;
			GeeIterator* _tmp7_ = NULL;
			gpointer _tmp8_ = NULL;
			gconstpointer _tmp9_ = NULL;
			_tmp5_ = _v_it;
			_tmp6_ = gee_iterator_next (_tmp5_);
			if (!_tmp6_) {
				break;
			}
			_tmp7_ = _v_it;
			_tmp8_ = gee_iterator_get (_tmp7_);
			v = _tmp8_;
			_tmp9_ = v;
			if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp9_, GXML_TYPE_SERIALIZABLE)) {
				gconstpointer _tmp10_ = NULL;
				GXmlNode* _tmp11_ = NULL;
				GXmlNode* _tmp12_ = NULL;
				GXmlNode* _tmp13_ = NULL;
				_tmp10_ = v;
				_tmp11_ = node;
				_tmp12_ = gxml_serializable_serialize (G_TYPE_CHECK_INSTANCE_CAST (_tmp10_, GXML_TYPE_SERIALIZABLE, GXmlSerializable), _tmp11_, &_inner_error_);
				_tmp13_ = _tmp12_;
				_g_object_unref0 (_tmp13_);
				if (G_UNLIKELY (_inner_error_ != NULL)) {
					g_propagate_error (error, _inner_error_);
					((v == NULL) || (self->priv->v_destroy_func == NULL)) ? NULL : (v = (self->priv->v_destroy_func (v), NULL));
					_g_object_unref0 (_v_it);
					return NULL;
				}
			}
			((v == NULL) || (self->priv->v_destroy_func == NULL)) ? NULL : (v = (self->priv->v_destroy_func (v), NULL));
		}
		_g_object_unref0 (_v_it);
	}
	_tmp14_ = node;
	_tmp15_ = _g_object_ref0 (_tmp14_);
	result = _tmp15_;
	return result;
}


static GXmlNode* gxml_serializable_dual_key_map_real_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error) {
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_ = NULL;
	GParamSpec* _tmp2_ = NULL;
	GXmlNode* _tmp3_ = NULL;
	GXmlNode* _tmp4_ = NULL;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (element != NULL, NULL);
	g_return_val_if_fail (prop != NULL, NULL);
	_tmp1_ = element;
	_tmp2_ = prop;
	_tmp3_ = gxml_serializable_dual_key_map_default_serialize_property (self, _tmp1_, _tmp2_, &_inner_error_);
	_tmp0_ = _tmp3_;
	if (G_UNLIKELY (_inner_error_ != NULL)) {
		g_propagate_error (error, _inner_error_);
		return NULL;
	}
	_tmp4_ = _tmp0_;
	_tmp0_ = NULL;
	result = _tmp4_;
	_g_object_unref0 (_tmp0_);
	return result;
}


GXmlNode* gxml_serializable_dual_key_map_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error) {
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize_property (self, element, prop, error);
}


GXmlNode* gxml_serializable_dual_key_map_default_serialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error) {
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (element != NULL, NULL);
	g_return_val_if_fail (prop != NULL, NULL);
	_tmp0_ = element;
	_tmp1_ = _g_object_ref0 (_tmp0_);
	result = _tmp1_;
	return result;
}


static gboolean gxml_serializable_dual_key_map_real_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	gboolean result = FALSE;
	gchar* _tmp0_ = NULL;
	gchar* _tmp1_ = NULL;
	gboolean _tmp2_ = FALSE;
	GXmlNode* _tmp3_ = NULL;
	gboolean _tmp4_ = FALSE;
	gboolean _tmp5_ = FALSE;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (node != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_node_name (self);
	_tmp1_ = _tmp0_;
	_vala_return_val_if_fail (_tmp1_ != NULL, "node_name () != null", FALSE);
	_tmp3_ = node;
	_tmp4_ = gxml_serializable_dual_key_map_default_deserialize (self, _tmp3_, &_inner_error_);
	_tmp5_ = _tmp4_;
	_g_free0 (_tmp1_);
	_tmp2_ = _tmp5_;
	if (G_UNLIKELY (_inner_error_ != NULL)) {
		g_propagate_error (error, _inner_error_);
		return FALSE;
	}
	result = _tmp2_;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	gchar* _tmp0_ = NULL;
	gchar* _tmp1_ = NULL;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_node_name (self);
	_tmp1_ = _tmp0_;
	_vala_return_val_if_fail (_tmp1_ != NULL, "node_name () != null", FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize (self, node, error);
}


gboolean gxml_serializable_dual_key_map_default_deserialize (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error) {
	gboolean result = FALSE;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_ = NULL;
	GXmlNode* _tmp2_ = NULL;
	gboolean _tmp3_ = FALSE;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (self != NULL, FALSE);
	g_return_val_if_fail (node != NULL, FALSE);
	_tmp0_ = node;
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (_tmp0_, GXML_TYPE_ELEMENT), "node is Element", FALSE);
	_tmp1_ = node;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_g_object_unref0 (self->_node);
	self->_node = _tmp2_;
	self->_deserialized = FALSE;
	_tmp3_ = gxml_serializable_dual_key_map_deserialize_proceed (self);
	if (_tmp3_) {
		gboolean _tmp4_ = FALSE;
		gboolean _tmp5_ = FALSE;
		_tmp5_ = gxml_serializable_dual_key_map_deserialize_children (self, &_inner_error_);
		_tmp4_ = _tmp5_;
		if (G_UNLIKELY (_inner_error_ != NULL)) {
			g_propagate_error (error, _inner_error_);
			return FALSE;
		}
		result = _tmp4_;
		return result;
	}
	result = FALSE;
	return result;
}


static gboolean gxml_serializable_dual_key_map_real_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error) {
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GXmlNode* _tmp1_ = NULL;
	gboolean _tmp2_ = FALSE;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (property_node != NULL, FALSE);
	_tmp1_ = property_node;
	_tmp2_ = gxml_serializable_dual_key_map_default_deserialize_property (self, _tmp1_, &_inner_error_);
	_tmp0_ = _tmp2_;
	if (G_UNLIKELY (_inner_error_ != NULL)) {
		g_propagate_error (error, _inner_error_);
		return FALSE;
	}
	result = _tmp0_;
	return result;
}


gboolean gxml_serializable_dual_key_map_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error) {
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_property (self, property_node, error);
}


gboolean gxml_serializable_dual_key_map_default_deserialize_property (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error) {
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GXmlNode* _tmp1_ = NULL;
	gboolean _tmp2_ = FALSE;
	GError * _inner_error_ = NULL;
	g_return_val_if_fail (self != NULL, FALSE);
	g_return_val_if_fail (property_node != NULL, FALSE);
	_tmp1_ = property_node;
	_tmp2_ = gxml_serializable_dual_key_map_deserialize_node (self, _tmp1_, &_inner_error_);
	_tmp0_ = _tmp2_;
	if (G_UNLIKELY (_inner_error_ != NULL)) {
		g_propagate_error (error, _inner_error_);
		return FALSE;
	}
	result = _tmp0_;
	return result;
}


static gboolean gxml_serializable_dual_key_map_real_foreach (GeeTraversable* base, GeeForallFunc f, void* f_target) {
	GXmlSerializableDualKeyMap * self;
	gboolean result = FALSE;
	GeeCollection* _tmp0_ = NULL;
	GeeCollection* _tmp1_ = NULL;
	GeeForallFunc _tmp2_ = NULL;
	void* _tmp2__target = NULL;
	gboolean _tmp3_ = FALSE;
	gboolean _tmp4_ = FALSE;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gxml_serializable_dual_key_map_values (self);
	_tmp1_ = _tmp0_;
	_tmp2_ = f;
	_tmp2__target = f_target;
	_tmp3_ = gee_traversable_foreach ((GeeTraversable*) _tmp1_, _tmp2_, _tmp2__target);
	_tmp4_ = _tmp3_;
	_g_object_unref0 (_tmp1_);
	result = _tmp4_;
	return result;
}


GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_construct (GType object_type, GType p_type, GBoxedCopyFunc p_dup_func, GDestroyNotify p_destroy_func, GType s_type, GBoxedCopyFunc s_dup_func, GDestroyNotify s_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func) {
	GXmlSerializableDualKeyMap * self = NULL;
	self = (GXmlSerializableDualKeyMap*) g_object_new (object_type, NULL);
	self->priv->p_type = p_type;
	self->priv->p_dup_func = p_dup_func;
	self->priv->p_destroy_func = p_destroy_func;
	self->priv->s_type = s_type;
	self->priv->s_dup_func = s_dup_func;
	self->priv->s_destroy_func = s_destroy_func;
	self->priv->v_type = v_type;
	self->priv->v_dup_func = v_dup_func;
	self->priv->v_destroy_func = v_destroy_func;
	return self;
}


GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_new (GType p_type, GBoxedCopyFunc p_dup_func, GDestroyNotify p_destroy_func, GType s_type, GBoxedCopyFunc s_dup_func, GDestroyNotify s_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func) {
	return gxml_serializable_dual_key_map_construct (GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, p_type, p_dup_func, p_destroy_func, s_type, s_dup_func, s_destroy_func, v_type, v_dup_func, v_destroy_func);
}


GType gxml_serializable_dual_key_map_get_value_type (GXmlSerializableDualKeyMap* self) {
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->v_type;
	return result;
}


GType gxml_serializable_dual_key_map_get_primary_key_type (GXmlSerializableDualKeyMap* self) {
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->p_type;
	return result;
}


GType gxml_serializable_dual_key_map_get_secondary_key_type (GXmlSerializableDualKeyMap* self) {
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->s_type;
	return result;
}


GeeCollection* gxml_serializable_dual_key_map_get_primary_keys (GXmlSerializableDualKeyMap* self) {
	GeeCollection* result;
	GeeHashMultiMap* _tmp0_ = NULL;
	GeeSet* _tmp1_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get_keys ((GeeMultiMap*) _tmp0_);
	result = (GeeCollection*) _tmp1_;
	return result;
}


gint gxml_serializable_dual_key_map_get_size (GXmlSerializableDualKeyMap* self) {
	gint result;
	GeeHashMultiMap* _tmp0_ = NULL;
	gint _tmp1_ = 0;
	gint _tmp2_ = 0;
	g_return_val_if_fail (self != NULL, 0);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get_size ((GeeMultiMap*) _tmp0_);
	_tmp2_ = _tmp1_;
	result = _tmp2_;
	return result;
}


static GeeMap* gxml_serializable_dual_key_map_real_get_unknown_serializable_properties (GXmlSerializable* base) {
	GeeMap* result;
	GXmlSerializableDualKeyMap* self;
	GeeHashMap* _tmp0_ = NULL;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, GXML_TYPE_ATTRIBUTE, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
	result = (GeeMap*) _tmp0_;
	return result;
}


static GeeCollection* gxml_serializable_dual_key_map_real_get_unknown_serializable_nodes (GXmlSerializable* base) {
	GeeCollection* result;
	GXmlSerializableDualKeyMap* self;
	GeeArrayList* _tmp0_ = NULL;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gee_array_list_new (GXML_TYPE_NODE, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL);
	result = (GeeCollection*) _tmp0_;
	return result;
}


GParamSpec** gxml_serializable_dual_key_map_get_properties (GXmlSerializableDualKeyMap* self, int* result_length1) {
	GParamSpec** result;
	GParamSpec** _tmp0_ = NULL;
	gint _tmp0__length1 = 0;
	GParamSpec** _tmp1_ = NULL;
	gint _tmp1__length1 = 0;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_properties;
	_tmp0__length1 = self->priv->_properties_length1;
	_tmp1_ = _tmp0_;
	_tmp1__length1 = _tmp0__length1;
	if (result_length1) {
		*result_length1 = _tmp1__length1;
	}
	result = _tmp1_;
	return result;
}


static gpointer _g_param_spec_ref0 (gpointer self) {
	return self ? g_param_spec_ref (self) : NULL;
}


static GParamSpec** _vala_array_dup7 (GParamSpec** self, int length) {
	GParamSpec** result;
	int i;
	result = g_new0 (GParamSpec*, length + 1);
	for (i = 0; i < length; i++) {
		GParamSpec* _tmp0_ = NULL;
		_tmp0_ = _g_param_spec_ref0 (self[i]);
		result[i] = _tmp0_;
	}
	return result;
}


void gxml_serializable_dual_key_map_set_properties (GXmlSerializableDualKeyMap* self, GParamSpec** value, int value_length1) {
	GParamSpec** _tmp0_ = NULL;
	gint _tmp0__length1 = 0;
	GParamSpec** _tmp1_ = NULL;
	gint _tmp1__length1 = 0;
	g_return_if_fail (self != NULL);
	_tmp0_ = value;
	_tmp0__length1 = value_length1;
	_tmp1_ = (_tmp0_ != NULL) ? _vala_array_dup7 (_tmp0_, _tmp0__length1) : ((gpointer) _tmp0_);
	_tmp1__length1 = _tmp0__length1;
	self->priv->_properties = (_vala_array_free (self->priv->_properties, self->priv->_properties_length1, (GDestroyNotify) g_param_spec_unref), NULL);
	self->priv->_properties = _tmp1_;
	self->priv->_properties_length1 = _tmp1__length1;
	self->priv->__properties_size_ = self->priv->_properties_length1;
}


GHashTable* gxml_serializable_dual_key_map_get_ignored_serializable_properties (GXmlSerializableDualKeyMap* self) {
	GHashTable* result;
	GHashTable* _tmp0_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_ignored_serializable_properties;
	result = _tmp0_;
	return result;
}


static gpointer _g_hash_table_ref0 (gpointer self) {
	return self ? g_hash_table_ref (self) : NULL;
}


void gxml_serializable_dual_key_map_set_ignored_serializable_properties (GXmlSerializableDualKeyMap* self, GHashTable* value) {
	GHashTable* _tmp0_ = NULL;
	GHashTable* _tmp1_ = NULL;
	g_return_if_fail (self != NULL);
	_tmp0_ = value;
	_tmp1_ = _g_hash_table_ref0 (_tmp0_);
	_g_hash_table_unref0 (self->priv->_ignored_serializable_properties);
	self->priv->_ignored_serializable_properties = _tmp1_;
	g_object_notify ((GObject *) self, "ignored-serializable-properties");
}


static gchar* gxml_serializable_dual_key_map_real_get_serialized_xml_node_value (GXmlSerializable* base) {
	gchar* result;
	GXmlSerializableDualKeyMap* self;
	const gchar* _tmp0_ = NULL;
	gchar* _tmp1_ = NULL;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = self->priv->_serialized_xml_node_value;
	_tmp1_ = g_strdup (_tmp0_);
	result = _tmp1_;
	return result;
}


static void gxml_serializable_dual_key_map_real_set_serialized_xml_node_value (GXmlSerializable* base, const gchar* value) {
	GXmlSerializableDualKeyMap* self;
	const gchar* _tmp0_ = NULL;
	gchar* _tmp1_ = NULL;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = value;
	_tmp1_ = g_strdup (_tmp0_);
	_g_free0 (self->priv->_serialized_xml_node_value);
	self->priv->_serialized_xml_node_value = _tmp1_;
	g_object_notify ((GObject *) self, "serialized-xml-node-value");
}


static GObject * gxml_serializable_dual_key_map_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) {
	GObject * obj;
	GObjectClass * parent_class;
	GXmlSerializableDualKeyMap * self;
	parent_class = G_OBJECT_CLASS (gxml_serializable_dual_key_map_parent_class);
	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	gxml_init_init ();
	return obj;
}


static void gxml_serializable_dual_key_map_class_init (GXmlSerializableDualKeyMapClass * klass) {
	gxml_serializable_dual_key_map_parent_class = g_type_class_peek_parent (klass);
	g_type_class_add_private (klass, sizeof (GXmlSerializableDualKeyMapPrivate));
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_proceed = gxml_serializable_dual_key_map_real_deserialize_proceed;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialized = gxml_serializable_dual_key_map_real_deserialized;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_node = gxml_serializable_dual_key_map_real_deserialize_node;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_children = gxml_serializable_dual_key_map_real_deserialize_children;
	((GXmlSerializableDualKeyMapClass *) klass)->set_default_namespace = gxml_serializable_dual_key_map_real_set_default_namespace;
	((GXmlSerializableDualKeyMapClass *) klass)->get_enable_unknown_serializable_property = gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize_use_xml_node_value = gxml_serializable_dual_key_map_real_serialize_use_xml_node_value;
	((GXmlSerializableDualKeyMapClass *) klass)->property_use_nick = gxml_serializable_dual_key_map_real_property_use_nick;
	((GXmlSerializableDualKeyMapClass *) klass)->node_name = gxml_serializable_dual_key_map_real_node_name;
	((GXmlSerializableDualKeyMapClass *) klass)->find_property_spec = gxml_serializable_dual_key_map_real_find_property_spec;
	((GXmlSerializableDualKeyMapClass *) klass)->list_serializable_properties = gxml_serializable_dual_key_map_real_list_serializable_properties;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize = gxml_serializable_dual_key_map_real_serialize;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize_property = gxml_serializable_dual_key_map_real_serialize_property;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize = gxml_serializable_dual_key_map_real_deserialize;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_property = gxml_serializable_dual_key_map_real_deserialize_property;
	G_OBJECT_CLASS (klass)->get_property = _vala_gxml_serializable_dual_key_map_get_property;
	G_OBJECT_CLASS (klass)->set_property = _vala_gxml_serializable_dual_key_map_set_property;
	G_OBJECT_CLASS (klass)->constructor = gxml_serializable_dual_key_map_constructor;
	G_OBJECT_CLASS (klass)->finalize = gxml_serializable_dual_key_map_finalize;
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE, g_param_spec_gtype ("p-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC, g_param_spec_pointer ("p-dup-func", "dup func", "dup func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC, g_param_spec_pointer ("p-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE, g_param_spec_gtype ("s-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC, g_param_spec_pointer ("s-dup-func", "dup func", "dup func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC, g_param_spec_pointer ("s-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE, g_param_spec_gtype ("v-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC, g_param_spec_pointer ("v-dup-func", "dup func", "dup func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC, g_param_spec_pointer ("v-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE, g_param_spec_gtype ("value-type", "value-type", "value-type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE, g_param_spec_gtype ("primary-key-type", "primary-key-type", "primary-key-type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE, g_param_spec_gtype ("secondary-key-type", "secondary-key-type", "secondary-key-type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS, g_param_spec_object ("primary-keys", "primary-keys", "primary-keys", GEE_TYPE_COLLECTION, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE, g_param_spec_int ("size", "size", "size", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES, g_param_spec_object ("unknown-serializable-properties", "unknown-serializable-properties", "unknown-serializable-properties", GEE_TYPE_MAP, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES, g_param_spec_object ("unknown-serializable-nodes", "unknown-serializable-nodes", "unknown-serializable-nodes", GEE_TYPE_COLLECTION, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES, g_param_spec_boxed ("ignored-serializable-properties", "ignored-serializable-properties", "ignored-serializable-properties", G_TYPE_HASH_TABLE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE, g_param_spec_string ("serialized-xml-node-value", "serialized-xml-node-value", "serialized-xml-node-value", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
}


static GType gxml_serializable_dual_key_map_gee_traversable_get_g_type (GXmlSerializableDualKeyMap* self) {
	return self->priv->v_type;
}


static GBoxedCopyFunc gxml_serializable_dual_key_map_gee_traversable_get_g_dup_func (GXmlSerializableDualKeyMap* self) {
	return self->priv->v_dup_func;
}


static GDestroyNotify gxml_serializable_dual_key_map_gee_traversable_get_g_destroy_func (GXmlSerializableDualKeyMap* self) {
	return self->priv->v_destroy_func;
}


static void gxml_serializable_dual_key_map_gee_traversable_interface_init (GeeTraversableIface * iface) {
	gxml_serializable_dual_key_map_gee_traversable_parent_iface = g_type_interface_peek_parent (iface);
	iface->foreach = (gboolean (*)(GeeTraversable*, GeeForallFunc, void*)) gxml_serializable_dual_key_map_real_foreach;
	iface->get_g_type = (GType(*)(GeeTraversable*)) gxml_serializable_dual_key_map_gee_traversable_get_g_type;
	iface->get_g_dup_func = (GBoxedCopyFunc(*)(GeeTraversable*)) gxml_serializable_dual_key_map_gee_traversable_get_g_dup_func;
	iface->get_g_destroy_func = (GDestroyNotify(*)(GeeTraversable*)) gxml_serializable_dual_key_map_gee_traversable_get_g_destroy_func;
}


static void gxml_serializable_dual_key_map_gxml_serializable_interface_init (GXmlSerializableIface * iface) {
	gxml_serializable_dual_key_map_gxml_serializable_parent_iface = g_type_interface_peek_parent (iface);
	iface->set_default_namespace = (gboolean (*)(GXmlSerializable*, GXmlNode*)) gxml_serializable_dual_key_map_set_default_namespace;
	iface->get_enable_unknown_serializable_property = (gboolean (*)(GXmlSerializable*)) gxml_serializable_dual_key_map_get_enable_unknown_serializable_property;
	iface->serialize_use_xml_node_value = (gboolean (*)(GXmlSerializable*)) gxml_serializable_dual_key_map_serialize_use_xml_node_value;
	iface->property_use_nick = (gboolean (*)(GXmlSerializable*)) gxml_serializable_dual_key_map_property_use_nick;
	iface->node_name = (gchar* (*)(GXmlSerializable*)) gxml_serializable_dual_key_map_node_name;
	iface->find_property_spec = (GParamSpec* (*)(GXmlSerializable*, const gchar*)) gxml_serializable_dual_key_map_find_property_spec;
	iface->list_serializable_properties = (GParamSpec** (*)(GXmlSerializable*, int*)) gxml_serializable_dual_key_map_list_serializable_properties;
	iface->serialize = (GXmlNode* (*)(GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_serialize;
	iface->serialize_property = (GXmlNode* (*)(GXmlSerializable*, GXmlNode*, GParamSpec*, GError**)) gxml_serializable_dual_key_map_serialize_property;
	iface->deserialize = (gboolean (*)(GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize;
	iface->deserialize_property = (gboolean (*)(GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize_property;
	iface->get_unknown_serializable_properties = gxml_serializable_dual_key_map_real_get_unknown_serializable_properties;
	iface->get_unknown_serializable_nodes = gxml_serializable_dual_key_map_real_get_unknown_serializable_nodes;
	iface->get_serialized_xml_node_value = gxml_serializable_dual_key_map_real_get_serialized_xml_node_value;
	iface->set_serialized_xml_node_value = gxml_serializable_dual_key_map_real_set_serialized_xml_node_value;
}


static void gxml_serializable_dual_key_map_gxml_serializable_collection_interface_init (GXmlSerializableCollectionIface * iface) {
	gxml_serializable_dual_key_map_gxml_serializable_collection_parent_iface = g_type_interface_peek_parent (iface);
	iface->deserialize_proceed = (gboolean (*)(GXmlSerializableCollection*)) gxml_serializable_dual_key_map_deserialize_proceed;
	iface->deserialized = (gboolean (*)(GXmlSerializableCollection*)) gxml_serializable_dual_key_map_deserialized;
	iface->deserialize_node = (gboolean (*)(GXmlSerializableCollection*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize_node;
	iface->deserialize_children = (gboolean (*)(GXmlSerializableCollection*, GError**)) gxml_serializable_dual_key_map_deserialize_children;
}


static void gxml_serializable_dual_key_map_instance_init (GXmlSerializableDualKeyMap * self) {
	self->priv = GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_PRIVATE (self);
	self->_deserialized = FALSE;
	self->priv->_serialized_xml_node_value = NULL;
}


static void gxml_serializable_dual_key_map_finalize (GObject* obj) {
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	_g_object_unref0 (self->storage);
	_g_object_unref0 (self->_node);
	self->priv->_properties = (_vala_array_free (self->priv->_properties, self->priv->_properties_length1, (GDestroyNotify) g_param_spec_unref), NULL);
	_g_hash_table_unref0 (self->priv->_ignored_serializable_properties);
	_g_free0 (self->priv->_serialized_xml_node_value);
	G_OBJECT_CLASS (gxml_serializable_dual_key_map_parent_class)->finalize (obj);
}


/**
 * Serializable Framework. A {@link Serializable} objects container based on Gee interfaces with dual key.
 * 
 * It implements {@link Serializable} and {@link SerializableCollection} interfaces, it is iterable as
 * other Gee collections.
 */
GType gxml_serializable_dual_key_map_get_type (void) {
	static volatile gsize gxml_serializable_dual_key_map_type_id__volatile = 0;
	if (g_once_init_enter (&gxml_serializable_dual_key_map_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (GXmlSerializableDualKeyMapClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gxml_serializable_dual_key_map_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GXmlSerializableDualKeyMap), 0, (GInstanceInitFunc) gxml_serializable_dual_key_map_instance_init, NULL };
		static const GInterfaceInfo gee_traversable_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gee_traversable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		static const GInterfaceInfo gxml_serializable_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gxml_serializable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		static const GInterfaceInfo gxml_serializable_collection_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gxml_serializable_collection_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		GType gxml_serializable_dual_key_map_type_id;
		gxml_serializable_dual_key_map_type_id = g_type_register_static (G_TYPE_OBJECT, "GXmlSerializableDualKeyMap", &g_define_type_info, 0);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GEE_TYPE_TRAVERSABLE, &gee_traversable_info);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GXML_TYPE_SERIALIZABLE, &gxml_serializable_info);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GXML_TYPE_SERIALIZABLE_COLLECTION, &gxml_serializable_collection_info);
		g_once_init_leave (&gxml_serializable_dual_key_map_type_id__volatile, gxml_serializable_dual_key_map_type_id);
	}
	return gxml_serializable_dual_key_map_type_id__volatile;
}


static void _vala_gxml_serializable_dual_key_map_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	switch (property_id) {
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_value_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_primary_key_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_secondary_key_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS:
		g_value_take_object (value, gxml_serializable_dual_key_map_get_primary_keys (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE:
		g_value_set_int (value, gxml_serializable_dual_key_map_get_size (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES:
		g_value_take_object (value, gxml_serializable_get_unknown_serializable_properties ((GXmlSerializable*) self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES:
		g_value_take_object (value, gxml_serializable_get_unknown_serializable_nodes ((GXmlSerializable*) self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES:
		g_value_set_boxed (value, gxml_serializable_dual_key_map_get_ignored_serializable_properties (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE:
		g_value_take_string (value, gxml_serializable_get_serialized_xml_node_value ((GXmlSerializable*) self));
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}


static void _vala_gxml_serializable_dual_key_map_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	switch (property_id) {
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES:
		gxml_serializable_dual_key_map_set_ignored_serializable_properties (self, g_value_get_boxed (value));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE:
		gxml_serializable_set_serialized_xml_node_value ((GXmlSerializable*) self, g_value_get_string (value));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE:
		self->priv->p_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC:
		self->priv->p_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC:
		self->priv->p_destroy_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE:
		self->priv->s_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC:
		self->priv->s_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC:
		self->priv->s_destroy_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE:
		self->priv->v_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC:
		self->priv->v_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC:
		self->priv->v_destroy_func = g_value_get_pointer (value);
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}


static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
	if ((array != NULL) && (destroy_func != NULL)) {
		int i;
		for (i = 0; i < array_length; i = i + 1) {
			if (((gpointer*) array)[i] != NULL) {
				destroy_func (((gpointer*) array)[i]);
			}
		}
	}
}


static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
	_vala_array_destroy (array, array_length, destroy_func);
	g_free (array);
}



