/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.diseasemodels.vector.provider;


import java.util.Collection;
import java.util.List;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.common.util.ResourceLocator;

import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ViewerNotification;

import org.eclipse.stem.diseasemodels.standard.provider.StandardDiseaseModelLabelValueItemProvider;

import org.eclipse.stem.diseasemodels.vector.DengueModelHostLabelValue;
import org.eclipse.stem.diseasemodels.vector.VectorPackage;

/**
 * This is the item provider adapter for a {@link org.eclipse.stem.diseasemodels.vector.DengueModelHostLabelValue} object.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 * @generated
 */
public class DengueModelHostLabelValueItemProvider
	extends StandardDiseaseModelLabelValueItemProvider
	implements
		IEditingDomainItemProvider,
		IStructuredItemContentProvider,
		ITreeItemContentProvider,
		IItemLabelProvider,
		IItemPropertySource {
	/**
	 * This constructs an instance from a factory and a notifier.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DengueModelHostLabelValueItemProvider(AdapterFactory adapterFactory) {
		super(adapterFactory);
	}

	/**
	 * This returns the property descriptors for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
		if (itemPropertyDescriptors == null) {
			super.getPropertyDescriptors(object);

			addE1PropertyDescriptor(object);
			addE2PropertyDescriptor(object);
			addE3PropertyDescriptor(object);
			addE4PropertyDescriptor(object);
			addI1PropertyDescriptor(object);
			addI2PropertyDescriptor(object);
			addI3PropertyDescriptor(object);
			addI4PropertyDescriptor(object);
			addT1PropertyDescriptor(object);
			addT2PropertyDescriptor(object);
			addT3PropertyDescriptor(object);
			addT4PropertyDescriptor(object);
			addR1PropertyDescriptor(object);
			addR2PropertyDescriptor(object);
			addR3PropertyDescriptor(object);
			addR4PropertyDescriptor(object);
			addE12PropertyDescriptor(object);
			addE13PropertyDescriptor(object);
			addE14PropertyDescriptor(object);
			addE21PropertyDescriptor(object);
			addE23PropertyDescriptor(object);
			addE24PropertyDescriptor(object);
			addE31PropertyDescriptor(object);
			addE32PropertyDescriptor(object);
			addE34PropertyDescriptor(object);
			addE41PropertyDescriptor(object);
			addE42PropertyDescriptor(object);
			addE43PropertyDescriptor(object);
			addI12PropertyDescriptor(object);
			addI13PropertyDescriptor(object);
			addI14PropertyDescriptor(object);
			addI21PropertyDescriptor(object);
			addI23PropertyDescriptor(object);
			addI24PropertyDescriptor(object);
			addI31PropertyDescriptor(object);
			addI32PropertyDescriptor(object);
			addI34PropertyDescriptor(object);
			addI41PropertyDescriptor(object);
			addI42PropertyDescriptor(object);
			addI43PropertyDescriptor(object);
			addRPropertyDescriptor(object);
			addIncidence1PropertyDescriptor(object);
			addIncidence2PropertyDescriptor(object);
			addIncidence3PropertyDescriptor(object);
			addIncidence4PropertyDescriptor(object);
			addIncidence12PropertyDescriptor(object);
			addIncidence21PropertyDescriptor(object);
			addIncidence31PropertyDescriptor(object);
			addIncidence41PropertyDescriptor(object);
			addIncidence13PropertyDescriptor(object);
			addIncidence23PropertyDescriptor(object);
			addIncidence32PropertyDescriptor(object);
			addIncidence42PropertyDescriptor(object);
			addIncidence14PropertyDescriptor(object);
			addIncidence24PropertyDescriptor(object);
			addIncidence34PropertyDescriptor(object);
			addIncidence43PropertyDescriptor(object);
			addDeaths1PropertyDescriptor(object);
			addDeaths2PropertyDescriptor(object);
			addDeaths3PropertyDescriptor(object);
			addDeaths4PropertyDescriptor(object);
			addDeaths12PropertyDescriptor(object);
			addDeaths21PropertyDescriptor(object);
			addDeaths31PropertyDescriptor(object);
			addDeaths41PropertyDescriptor(object);
			addDeaths13PropertyDescriptor(object);
			addDeaths23PropertyDescriptor(object);
			addDeaths32PropertyDescriptor(object);
			addDeaths42PropertyDescriptor(object);
			addDeaths14PropertyDescriptor(object);
			addDeaths24PropertyDescriptor(object);
			addDeaths34PropertyDescriptor(object);
			addDeaths43PropertyDescriptor(object);
		}
		return itemPropertyDescriptors;
	}

	/**
	 * This adds a property descriptor for the E1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the T1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addT1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_T1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_T1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__T1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the T2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addT2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_T2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_T2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__T2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the T3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addT3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_T3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_T3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__T3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the T4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addT4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_T4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_T4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__T4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the R1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addR1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_R1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_R1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__R1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the R2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addR2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_R2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_R2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__R2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the R3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addR3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_R3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_R3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__R3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the R4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addR4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_R4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_R4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__R4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E12 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE12PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E12_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E12_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E12,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E13 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE13PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E13_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E13_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E13,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E14 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE14PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E14_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E14_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E14,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E21 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE21PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E21_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E21_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E21,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E23 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE23PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E23_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E23_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E23,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E24 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE24PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E24_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E24_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E24,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E31 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE31PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E31_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E31_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E31,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E32 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE32PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E32_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E32_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E32,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E34 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE34PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E34_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E34_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E34,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E41 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE41PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E41_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E41_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E41,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E42 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE42PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E42_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E42_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E42,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the E43 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addE43PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_E43_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_E43_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__E43,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I12 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI12PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I12_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I12_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I12,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I13 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI13PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I13_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I13_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I13,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I14 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI14PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I14_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I14_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I14,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I21 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI21PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I21_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I21_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I21,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I23 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI23PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I23_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I23_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I23,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I24 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI24PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I24_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I24_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I24,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I31 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI31PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I31_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I31_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I31,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I32 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI32PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I32_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I32_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I32,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I34 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI34PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I34_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I34_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I34,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I41 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI41PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I41_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I41_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I41,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I42 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI42PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I42_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I42_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I42,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the I43 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addI43PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_I43_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_I43_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__I43,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the R feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addRPropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_R_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_R_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__R,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence12 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence12PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence12_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence12_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE12,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence21 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence21PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence21_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence21_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE21,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence31 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence31PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence31_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence31_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE31,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence41 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence41PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence41_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence41_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE41,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence13 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence13PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence13_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence13_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE13,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence23 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence23PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence23_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence23_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE23,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence32 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence32PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence32_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence32_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE32,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence42 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence42PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence42_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence42_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE42,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence14 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence14PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence14_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence14_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE14,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence24 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence24PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence24_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence24_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE24,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence34 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence34PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence34_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence34_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE34,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Incidence43 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addIncidence43PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_incidence43_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_incidence43_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE43,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths1 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths1PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths1_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths1_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS1,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths2 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths2PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths2_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths2_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS2,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths3 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths3PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths3_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths3_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS3,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths4 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths4PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths4_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths4_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS4,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths12 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths12PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths12_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths12_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS12,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths21 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths21PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths21_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths21_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS21,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths31 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths31PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths31_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths31_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS31,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths41 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths41PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths41_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths41_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS41,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths13 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths13PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths13_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths13_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS13,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths23 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths23PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths23_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths23_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS23,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths32 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths32PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths32_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths32_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS32,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths42 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths42PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths42_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths42_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS42,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths14 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths14PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths14_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths14_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS14,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths24 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths24PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths24_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths24_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS24,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths34 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths34PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths34_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths34_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS34,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This adds a property descriptor for the Deaths43 feature.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void addDeaths43PropertyDescriptor(Object object) {
		itemPropertyDescriptors.add
			(createItemPropertyDescriptor
				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
				 getResourceLocator(),
				 getString("_UI_DengueModelHostLabelValue_deaths43_feature"),
				 getString("_UI_PropertyDescriptor_description", "_UI_DengueModelHostLabelValue_deaths43_feature", "_UI_DengueModelHostLabelValue_type"),
				 VectorPackage.Literals.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS43,
				 true,
				 false,
				 false,
				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
				 null,
				 null));
	}

	/**
	 * This returns DengueModelHostLabelValue.gif.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object getImage(Object object) {
		return overlayImage(object, getResourceLocator().getImage("full/obj16/DengueModelHostLabelValue"));
	}

	/**
	 * This returns the label text for the adapted class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getText(Object object) {
		DengueModelHostLabelValue dengueModelHostLabelValue = (DengueModelHostLabelValue)object;
		return getString("_UI_DengueModelHostLabelValue_type") + " " + dengueModelHostLabelValue.getPopulationCount();
	}

	/**
	 * This handles model notifications by calling {@link #updateChildren} to update any cached
	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void notifyChanged(Notification notification) {
		updateChildren(notification);

		switch (notification.getFeatureID(DengueModelHostLabelValue.class)) {
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__T1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__T2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__T3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__T4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__R1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__R2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__R3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__R4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E12:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E13:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E14:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E21:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E23:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E24:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E31:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E32:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E34:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E41:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E42:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__E43:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I12:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I13:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I14:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I21:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I23:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I24:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I31:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I32:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I34:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I41:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I42:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__I43:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__R:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE12:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE21:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE31:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE41:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE13:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE23:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE32:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE42:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE14:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE24:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE34:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__INCIDENCE43:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS1:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS2:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS3:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS4:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS12:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS21:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS31:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS41:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS13:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS23:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS32:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS42:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS14:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS24:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS34:
			case VectorPackage.DENGUE_MODEL_HOST_LABEL_VALUE__DEATHS43:
				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
				return;
		}
		super.notifyChanged(notification);
	}

	/**
	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
	 * that can be created under this object.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
		super.collectNewChildDescriptors(newChildDescriptors, object);
	}

	/**
	 * Return the resource locator for this item provider's resources.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public ResourceLocator getResourceLocator() {
		return VectorEditPlugin.INSTANCE;
	}

}
