/**
 *  Copyright (c)2020 CEA LIST, Committer Name, and others.
 * 
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *  CEA LIST - Initial API and implementation
 *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr 
 *  Gabriel Pedroza (CEA LIST) gabriel.pedroza@cea.fr 
 * 
 */
package org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.papyrus.pdp4eng.common.profile.pdp4engCommonGDPR.Pdp4engCommonGDPRPackage;

import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Accuracy;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.AnanomityRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.AvailableAt;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.AvailableInformation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.AvailableInformationContainer;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.CollectionMethod;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Controlers;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataFlowRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataMinimisation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataRecordRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataRequirements;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataSubjects;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataUnlinkabilityRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DerivedFrom;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Duration;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Fairly;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.FunctionalRequirements;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.GDPRPrinciple;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.GeneratedRequirements;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByConsent;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByLegalObligation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByLegitimateInterest;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByPublicInterest;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByVitalInterest;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Link;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Linkability;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Linkable;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.NonFunctionalRequirements;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PersonalDataRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PersonalInformation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PersonalInformationContainer;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PrivacyRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.ProcessPrinciple;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.ProcessRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PseudonimityRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PseudonymKind;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PurposeLimitation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PurposePersonalDataPrinciple;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.RelatedTo;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.SecuritySafety;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Stakeholder;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.StorageLimitation;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Transparency;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.UndectabilityRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.UnlinkabilityRequirement;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRFactory;
import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage;

import org.eclipse.uml2.types.TypesPackage;

import org.eclipse.uml2.uml.UMLPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class pdp4engReqGDPRPackageImpl extends EPackageImpl implements pdp4engReqGDPRPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass processRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass stakeholderEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass personalDataRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass gdprPrincipleEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass processPrincipleEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass purposePersonalDataPrincipleEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataMinimisationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass purposeLimitationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass accuracyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass storageLimitationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass fairlyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass transparencyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass securitySafetyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass relatedToEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass availableAtEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass derivedFromEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass linkableEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass generatedRequirementsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataFlowRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataSubjectsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataRequirementsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass availableInformationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass personalInformationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass availableInformationContainerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass personalInformationContainerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass unlinkabilityRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass privacyRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataUnlinkabilityRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass controlersEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass linkEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass undectabilityRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass pseudonimityRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass ananomityRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dataRecordRequirementEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass functionalRequirementsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass nonFunctionalRequirementsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByConsentEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByContractEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByPublicInterestEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByLegitimateInterestEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByLegalObligationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass lawfulByVitalInterestEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum linkabilityEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum collectionMethodEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum durationEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum pseudonymKindEEnum = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.pdp4engReqGDPRPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private pdp4engReqGDPRPackageImpl() {
		super(eNS_URI, pdp4engReqGDPRFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 *
	 * <p>This method is used to initialize {@link pdp4engReqGDPRPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static pdp4engReqGDPRPackage init() {
		if (isInited) return (pdp4engReqGDPRPackage)EPackage.Registry.INSTANCE.getEPackage(pdp4engReqGDPRPackage.eNS_URI);

		// Obtain or create and register package
		Object registeredpdp4engReqGDPRPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
		pdp4engReqGDPRPackageImpl thepdp4engReqGDPRPackage = registeredpdp4engReqGDPRPackage instanceof pdp4engReqGDPRPackageImpl ? (pdp4engReqGDPRPackageImpl)registeredpdp4engReqGDPRPackage : new pdp4engReqGDPRPackageImpl();

		isInited = true;

		// Initialize simple dependencies
		EcorePackage.eINSTANCE.eClass();
		Pdp4engCommonGDPRPackage.eINSTANCE.eClass();
		TypesPackage.eINSTANCE.eClass();
		UMLPackage.eINSTANCE.eClass();

		// Create package meta-data objects
		thepdp4engReqGDPRPackage.createPackageContents();

		// Initialize created meta-data
		thepdp4engReqGDPRPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		thepdp4engReqGDPRPackage.freeze();

		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(pdp4engReqGDPRPackage.eNS_URI, thepdp4engReqGDPRPackage);
		return thepdp4engReqGDPRPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getProcessRequirement() {
		return processRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getProcessRequirement_Requester() {
		return (EReference)processRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getStakeholder() {
		return stakeholderEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getStakeholder_Base_NamedElement() {
		return (EReference)stakeholderEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPersonalDataRequirement() {
		return personalDataRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPersonalDataRequirement_Source() {
		return (EReference)personalDataRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getGDPRPrinciple() {
		return gdprPrincipleEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getGDPRPrinciple_Base_NamedElement() {
		return (EReference)gdprPrincipleEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getProcessPrinciple() {
		return processPrincipleEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getProcessPrinciple_Process() {
		return (EReference)processPrincipleEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getProcessPrinciple_DataSubject() {
		return (EReference)processPrincipleEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getProcessPrinciple_PersonalData() {
		return (EReference)processPrincipleEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPurposePersonalDataPrinciple() {
		return purposePersonalDataPrincipleEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPurposePersonalDataPrinciple_Purpose() {
		return (EReference)purposePersonalDataPrincipleEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPurposePersonalDataPrinciple_PersonalData() {
		return (EReference)purposePersonalDataPrincipleEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataMinimisation() {
		return dataMinimisationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPurposeLimitation() {
		return purposeLimitationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getAccuracy() {
		return accuracyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getStorageLimitation() {
		return storageLimitationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawful() {
		return lawfulEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getFairly() {
		return fairlyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getTransparency() {
		return transparencyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getSecuritySafety() {
		return securitySafetyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getRelatedTo() {
		return relatedToEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getRelatedTo_Sensitive() {
		return (EAttribute)relatedToEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getRelatedTo_Linkability() {
		return (EAttribute)relatedToEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getRelatedTo_Collection() {
		return (EAttribute)relatedToEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getRelatedTo_Base_Element() {
		return (EReference)relatedToEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getAvailableAt() {
		return availableAtEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getAvailableAt_Duration() {
		return (EAttribute)availableAtEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getAvailableAt_Base_Element() {
		return (EReference)availableAtEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDerivedFrom() {
		return derivedFromEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDerivedFrom_Base_Element() {
		return (EReference)derivedFromEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataRequirement() {
		return dataRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLinkable() {
		return linkableEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getLinkable_Duration() {
		return (EAttribute)linkableEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getLinkable_Linkability() {
		return (EAttribute)linkableEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLinkable_Base_Element() {
		return (EReference)linkableEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getGeneratedRequirements() {
		return generatedRequirementsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getGeneratedRequirements_Base_Package() {
		return (EReference)generatedRequirementsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataFlowRequirement() {
		return dataFlowRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataFlowRequirement_Base_Activity() {
		return (EReference)dataFlowRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataSubjects() {
		return dataSubjectsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataSubjects_Base_Package() {
		return (EReference)dataSubjectsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataRequirements() {
		return dataRequirementsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataRequirements_Base_Package() {
		return (EReference)dataRequirementsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getAvailableInformation() {
		return availableInformationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getAvailableInformation_Base_Package() {
		return (EReference)availableInformationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getAvailableInformation_Concerns() {
		return (EReference)availableInformationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPersonalInformation() {
		return personalInformationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPersonalInformation_Base_Package() {
		return (EReference)personalInformationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPersonalInformation_Concerns() {
		return (EReference)personalInformationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getAvailableInformationContainer() {
		return availableInformationContainerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getAvailableInformationContainer_Base_Package() {
		return (EReference)availableInformationContainerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPersonalInformationContainer() {
		return personalInformationContainerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPersonalInformationContainer_Base_Package() {
		return (EReference)personalInformationContainerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getUnlinkabilityRequirement() {
		return unlinkabilityRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getUnlinkabilityRequirement_Linkability() {
		return (EAttribute)unlinkabilityRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPrivacyRequirement() {
		return privacyRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPrivacyRequirement_Base_NamedElement() {
		return (EReference)privacyRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPrivacyRequirement_DataSubject() {
		return (EReference)privacyRequirementEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPrivacyRequirement_Counterstakeholders() {
		return (EReference)privacyRequirementEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getPrivacyRequirement_PersonalData() {
		return (EReference)privacyRequirementEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataUnlinkabilityRequirement() {
		return dataUnlinkabilityRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataUnlinkabilityRequirement_Links() {
		return (EReference)dataUnlinkabilityRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getControlers() {
		return controlersEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getControlers_Base_Package() {
		return (EReference)controlersEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLink() {
		return linkEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLink_Base_NamedElement() {
		return (EReference)linkEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getLink_Linkability() {
		return (EAttribute)linkEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getUndectabilityRequirement() {
		return undectabilityRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getPseudonimityRequirement() {
		return pseudonimityRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EAttribute getPseudonimityRequirement_Kind() {
		return (EAttribute)pseudonimityRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getAnanomityRequirement() {
		return ananomityRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getDataRecordRequirement() {
		return dataRecordRequirementEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataRecordRequirement_Base_DataStoreNode() {
		return (EReference)dataRecordRequirementEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getDataRecordRequirement_DataList() {
		return (EReference)dataRecordRequirementEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getFunctionalRequirements() {
		return functionalRequirementsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getFunctionalRequirements_Base_Package() {
		return (EReference)functionalRequirementsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getNonFunctionalRequirements() {
		return nonFunctionalRequirementsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getNonFunctionalRequirements_Base_Package() {
		return (EReference)nonFunctionalRequirementsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByConsent() {
		return lawfulByConsentEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByConsent_Consent() {
		return (EReference)lawfulByConsentEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByContract() {
		return lawfulByContractEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByContract_Contract() {
		return (EReference)lawfulByContractEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByPublicInterest() {
		return lawfulByPublicInterestEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByPublicInterest_PublicInterest() {
		return (EReference)lawfulByPublicInterestEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByLegitimateInterest() {
		return lawfulByLegitimateInterestEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByLegitimateInterest_LegitimateInterest() {
		return (EReference)lawfulByLegitimateInterestEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByLegalObligation() {
		return lawfulByLegalObligationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByLegalObligation_LegalObligation() {
		return (EReference)lawfulByLegalObligationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EClass getLawfulByVitalInterest() {
		return lawfulByVitalInterestEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EReference getLawfulByVitalInterest_VitalInterest() {
		return (EReference)lawfulByVitalInterestEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EEnum getLinkability() {
		return linkabilityEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EEnum getCollectionMethod() {
		return collectionMethodEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EEnum getDuration() {
		return durationEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EEnum getPseudonymKind() {
		return pseudonymKindEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public pdp4engReqGDPRFactory getpdp4engReqGDPRFactory() {
		return (pdp4engReqGDPRFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		processRequirementEClass = createEClass(PROCESS_REQUIREMENT);
		createEReference(processRequirementEClass, PROCESS_REQUIREMENT__REQUESTER);

		stakeholderEClass = createEClass(STAKEHOLDER);
		createEReference(stakeholderEClass, STAKEHOLDER__BASE_NAMED_ELEMENT);

		personalDataRequirementEClass = createEClass(PERSONAL_DATA_REQUIREMENT);
		createEReference(personalDataRequirementEClass, PERSONAL_DATA_REQUIREMENT__SOURCE);

		gdprPrincipleEClass = createEClass(GDPR_PRINCIPLE);
		createEReference(gdprPrincipleEClass, GDPR_PRINCIPLE__BASE_NAMED_ELEMENT);

		processPrincipleEClass = createEClass(PROCESS_PRINCIPLE);
		createEReference(processPrincipleEClass, PROCESS_PRINCIPLE__PROCESS);
		createEReference(processPrincipleEClass, PROCESS_PRINCIPLE__DATA_SUBJECT);
		createEReference(processPrincipleEClass, PROCESS_PRINCIPLE__PERSONAL_DATA);

		purposePersonalDataPrincipleEClass = createEClass(PURPOSE_PERSONAL_DATA_PRINCIPLE);
		createEReference(purposePersonalDataPrincipleEClass, PURPOSE_PERSONAL_DATA_PRINCIPLE__PURPOSE);
		createEReference(purposePersonalDataPrincipleEClass, PURPOSE_PERSONAL_DATA_PRINCIPLE__PERSONAL_DATA);

		dataMinimisationEClass = createEClass(DATA_MINIMISATION);

		purposeLimitationEClass = createEClass(PURPOSE_LIMITATION);

		accuracyEClass = createEClass(ACCURACY);

		storageLimitationEClass = createEClass(STORAGE_LIMITATION);

		lawfulEClass = createEClass(LAWFUL);

		fairlyEClass = createEClass(FAIRLY);

		transparencyEClass = createEClass(TRANSPARENCY);

		securitySafetyEClass = createEClass(SECURITY_SAFETY);

		relatedToEClass = createEClass(RELATED_TO);
		createEAttribute(relatedToEClass, RELATED_TO__SENSITIVE);
		createEAttribute(relatedToEClass, RELATED_TO__LINKABILITY);
		createEAttribute(relatedToEClass, RELATED_TO__COLLECTION);
		createEReference(relatedToEClass, RELATED_TO__BASE_ELEMENT);

		availableAtEClass = createEClass(AVAILABLE_AT);
		createEAttribute(availableAtEClass, AVAILABLE_AT__DURATION);
		createEReference(availableAtEClass, AVAILABLE_AT__BASE_ELEMENT);

		derivedFromEClass = createEClass(DERIVED_FROM);
		createEReference(derivedFromEClass, DERIVED_FROM__BASE_ELEMENT);

		dataRequirementEClass = createEClass(DATA_REQUIREMENT);

		linkableEClass = createEClass(LINKABLE);
		createEAttribute(linkableEClass, LINKABLE__DURATION);
		createEAttribute(linkableEClass, LINKABLE__LINKABILITY);
		createEReference(linkableEClass, LINKABLE__BASE_ELEMENT);

		generatedRequirementsEClass = createEClass(GENERATED_REQUIREMENTS);
		createEReference(generatedRequirementsEClass, GENERATED_REQUIREMENTS__BASE_PACKAGE);

		dataFlowRequirementEClass = createEClass(DATA_FLOW_REQUIREMENT);
		createEReference(dataFlowRequirementEClass, DATA_FLOW_REQUIREMENT__BASE_ACTIVITY);

		dataSubjectsEClass = createEClass(DATA_SUBJECTS);
		createEReference(dataSubjectsEClass, DATA_SUBJECTS__BASE_PACKAGE);

		dataRequirementsEClass = createEClass(DATA_REQUIREMENTS);
		createEReference(dataRequirementsEClass, DATA_REQUIREMENTS__BASE_PACKAGE);

		availableInformationEClass = createEClass(AVAILABLE_INFORMATION);
		createEReference(availableInformationEClass, AVAILABLE_INFORMATION__BASE_PACKAGE);
		createEReference(availableInformationEClass, AVAILABLE_INFORMATION__CONCERNS);

		personalInformationEClass = createEClass(PERSONAL_INFORMATION);
		createEReference(personalInformationEClass, PERSONAL_INFORMATION__BASE_PACKAGE);
		createEReference(personalInformationEClass, PERSONAL_INFORMATION__CONCERNS);

		availableInformationContainerEClass = createEClass(AVAILABLE_INFORMATION_CONTAINER);
		createEReference(availableInformationContainerEClass, AVAILABLE_INFORMATION_CONTAINER__BASE_PACKAGE);

		personalInformationContainerEClass = createEClass(PERSONAL_INFORMATION_CONTAINER);
		createEReference(personalInformationContainerEClass, PERSONAL_INFORMATION_CONTAINER__BASE_PACKAGE);

		unlinkabilityRequirementEClass = createEClass(UNLINKABILITY_REQUIREMENT);
		createEAttribute(unlinkabilityRequirementEClass, UNLINKABILITY_REQUIREMENT__LINKABILITY);

		privacyRequirementEClass = createEClass(PRIVACY_REQUIREMENT);
		createEReference(privacyRequirementEClass, PRIVACY_REQUIREMENT__BASE_NAMED_ELEMENT);
		createEReference(privacyRequirementEClass, PRIVACY_REQUIREMENT__DATA_SUBJECT);
		createEReference(privacyRequirementEClass, PRIVACY_REQUIREMENT__COUNTERSTAKEHOLDERS);
		createEReference(privacyRequirementEClass, PRIVACY_REQUIREMENT__PERSONAL_DATA);

		dataUnlinkabilityRequirementEClass = createEClass(DATA_UNLINKABILITY_REQUIREMENT);
		createEReference(dataUnlinkabilityRequirementEClass, DATA_UNLINKABILITY_REQUIREMENT__LINKS);

		controlersEClass = createEClass(CONTROLERS);
		createEReference(controlersEClass, CONTROLERS__BASE_PACKAGE);

		linkEClass = createEClass(LINK);
		createEReference(linkEClass, LINK__BASE_NAMED_ELEMENT);
		createEAttribute(linkEClass, LINK__LINKABILITY);

		undectabilityRequirementEClass = createEClass(UNDECTABILITY_REQUIREMENT);

		pseudonimityRequirementEClass = createEClass(PSEUDONIMITY_REQUIREMENT);
		createEAttribute(pseudonimityRequirementEClass, PSEUDONIMITY_REQUIREMENT__KIND);

		ananomityRequirementEClass = createEClass(ANANOMITY_REQUIREMENT);

		dataRecordRequirementEClass = createEClass(DATA_RECORD_REQUIREMENT);
		createEReference(dataRecordRequirementEClass, DATA_RECORD_REQUIREMENT__BASE_DATA_STORE_NODE);
		createEReference(dataRecordRequirementEClass, DATA_RECORD_REQUIREMENT__DATA_LIST);

		functionalRequirementsEClass = createEClass(FUNCTIONAL_REQUIREMENTS);
		createEReference(functionalRequirementsEClass, FUNCTIONAL_REQUIREMENTS__BASE_PACKAGE);

		nonFunctionalRequirementsEClass = createEClass(NON_FUNCTIONAL_REQUIREMENTS);
		createEReference(nonFunctionalRequirementsEClass, NON_FUNCTIONAL_REQUIREMENTS__BASE_PACKAGE);

		lawfulByConsentEClass = createEClass(LAWFUL_BY_CONSENT);
		createEReference(lawfulByConsentEClass, LAWFUL_BY_CONSENT__CONSENT);

		lawfulByContractEClass = createEClass(LAWFUL_BY_CONTRACT);
		createEReference(lawfulByContractEClass, LAWFUL_BY_CONTRACT__CONTRACT);

		lawfulByPublicInterestEClass = createEClass(LAWFUL_BY_PUBLIC_INTEREST);
		createEReference(lawfulByPublicInterestEClass, LAWFUL_BY_PUBLIC_INTEREST__PUBLIC_INTEREST);

		lawfulByLegitimateInterestEClass = createEClass(LAWFUL_BY_LEGITIMATE_INTEREST);
		createEReference(lawfulByLegitimateInterestEClass, LAWFUL_BY_LEGITIMATE_INTEREST__LEGITIMATE_INTEREST);

		lawfulByLegalObligationEClass = createEClass(LAWFUL_BY_LEGAL_OBLIGATION);
		createEReference(lawfulByLegalObligationEClass, LAWFUL_BY_LEGAL_OBLIGATION__LEGAL_OBLIGATION);

		lawfulByVitalInterestEClass = createEClass(LAWFUL_BY_VITAL_INTEREST);
		createEReference(lawfulByVitalInterestEClass, LAWFUL_BY_VITAL_INTEREST__VITAL_INTEREST);

		// Create enums
		linkabilityEEnum = createEEnum(LINKABILITY);
		collectionMethodEEnum = createEEnum(COLLECTION_METHOD);
		durationEEnum = createEEnum(DURATION);
		pseudonymKindEEnum = createEEnum(PSEUDONYM_KIND);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		Pdp4engCommonGDPRPackage thePdp4engCommonGDPRPackage = (Pdp4engCommonGDPRPackage)EPackage.Registry.INSTANCE.getEPackage(Pdp4engCommonGDPRPackage.eNS_URI);
		UMLPackage theUMLPackage = (UMLPackage)EPackage.Registry.INSTANCE.getEPackage(UMLPackage.eNS_URI);
		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		processRequirementEClass.getESuperTypes().add(thePdp4engCommonGDPRPackage.getProcess());
		personalDataRequirementEClass.getESuperTypes().add(thePdp4engCommonGDPRPackage.getPersonalData());
		processPrincipleEClass.getESuperTypes().add(this.getGDPRPrinciple());
		purposePersonalDataPrincipleEClass.getESuperTypes().add(this.getGDPRPrinciple());
		dataMinimisationEClass.getESuperTypes().add(this.getPurposePersonalDataPrinciple());
		purposeLimitationEClass.getESuperTypes().add(this.getPurposePersonalDataPrinciple());
		accuracyEClass.getESuperTypes().add(this.getPurposePersonalDataPrinciple());
		storageLimitationEClass.getESuperTypes().add(this.getPurposePersonalDataPrinciple());
		lawfulEClass.getESuperTypes().add(this.getProcessPrinciple());
		fairlyEClass.getESuperTypes().add(this.getProcessPrinciple());
		transparencyEClass.getESuperTypes().add(this.getProcessPrinciple());
		securitySafetyEClass.getESuperTypes().add(this.getProcessPrinciple());
		dataRequirementEClass.getESuperTypes().add(thePdp4engCommonGDPRPackage.getData());
		unlinkabilityRequirementEClass.getESuperTypes().add(this.getPrivacyRequirement());
		dataUnlinkabilityRequirementEClass.getESuperTypes().add(this.getUnlinkabilityRequirement());
		undectabilityRequirementEClass.getESuperTypes().add(this.getPrivacyRequirement());
		pseudonimityRequirementEClass.getESuperTypes().add(this.getPrivacyRequirement());
		ananomityRequirementEClass.getESuperTypes().add(this.getUnlinkabilityRequirement());
		lawfulByConsentEClass.getESuperTypes().add(this.getLawful());
		lawfulByContractEClass.getESuperTypes().add(this.getLawful());
		lawfulByPublicInterestEClass.getESuperTypes().add(this.getLawful());
		lawfulByLegitimateInterestEClass.getESuperTypes().add(this.getLawful());
		lawfulByLegalObligationEClass.getESuperTypes().add(this.getLawful());
		lawfulByVitalInterestEClass.getESuperTypes().add(this.getLawful());

		// Initialize classes, features, and operations; add parameters
		initEClass(processRequirementEClass, ProcessRequirement.class, "ProcessRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getProcessRequirement_Requester(), this.getStakeholder(), null, "requester", null, 0, -1, ProcessRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(stakeholderEClass, Stakeholder.class, "Stakeholder", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStakeholder_Base_NamedElement(), theUMLPackage.getNamedElement(), null, "base_NamedElement", null, 0, 1, Stakeholder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(personalDataRequirementEClass, PersonalDataRequirement.class, "PersonalDataRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPersonalDataRequirement_Source(), theUMLPackage.getElement(), null, "source", null, 1, 1, PersonalDataRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(gdprPrincipleEClass, GDPRPrinciple.class, "GDPRPrinciple", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getGDPRPrinciple_Base_NamedElement(), theUMLPackage.getNamedElement(), null, "base_NamedElement", null, 0, 1, GDPRPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(processPrincipleEClass, ProcessPrinciple.class, "ProcessPrinciple", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getProcessPrinciple_Process(), this.getProcessRequirement(), null, "process", null, 1, 1, ProcessPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getProcessPrinciple_DataSubject(), thePdp4engCommonGDPRPackage.getDataSubject(), null, "dataSubject", null, 1, 1, ProcessPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getProcessPrinciple_PersonalData(), this.getPersonalDataRequirement(), null, "personalData", null, 1, -1, ProcessPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(purposePersonalDataPrincipleEClass, PurposePersonalDataPrinciple.class, "PurposePersonalDataPrinciple", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPurposePersonalDataPrinciple_Purpose(), thePdp4engCommonGDPRPackage.getPurpose(), null, "purpose", null, 1, 1, PurposePersonalDataPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getPurposePersonalDataPrinciple_PersonalData(), thePdp4engCommonGDPRPackage.getPersonalData(), null, "personalData", null, 1, 1, PurposePersonalDataPrinciple.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataMinimisationEClass, DataMinimisation.class, "DataMinimisation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(purposeLimitationEClass, PurposeLimitation.class, "PurposeLimitation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(accuracyEClass, Accuracy.class, "Accuracy", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(storageLimitationEClass, StorageLimitation.class, "StorageLimitation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(lawfulEClass, Lawful.class, "Lawful", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(fairlyEClass, Fairly.class, "Fairly", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(transparencyEClass, Transparency.class, "Transparency", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(securitySafetyEClass, SecuritySafety.class, "SecuritySafety", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(relatedToEClass, RelatedTo.class, "RelatedTo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRelatedTo_Sensitive(), theTypesPackage.getBoolean(), "sensitive", null, 1, 1, RelatedTo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEAttribute(getRelatedTo_Linkability(), this.getLinkability(), "linkability", null, 1, 1, RelatedTo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEAttribute(getRelatedTo_Collection(), this.getCollectionMethod(), "collection", null, 1, 1, RelatedTo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getRelatedTo_Base_Element(), theUMLPackage.getElement(), null, "base_Element", null, 0, 1, RelatedTo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(availableAtEClass, AvailableAt.class, "AvailableAt", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getAvailableAt_Duration(), this.getDuration(), "duration", null, 1, 1, AvailableAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getAvailableAt_Base_Element(), theUMLPackage.getElement(), null, "base_Element", null, 0, 1, AvailableAt.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(derivedFromEClass, DerivedFrom.class, "DerivedFrom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDerivedFrom_Base_Element(), theUMLPackage.getElement(), null, "base_Element", null, 0, 1, DerivedFrom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataRequirementEClass, DataRequirement.class, "DataRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(linkableEClass, Linkable.class, "Linkable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getLinkable_Duration(), this.getDuration(), "duration", null, 1, 1, Linkable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEAttribute(getLinkable_Linkability(), this.getLinkability(), "linkability", null, 1, 1, Linkable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getLinkable_Base_Element(), theUMLPackage.getElement(), null, "base_Element", null, 0, 1, Linkable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(generatedRequirementsEClass, GeneratedRequirements.class, "GeneratedRequirements", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getGeneratedRequirements_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, GeneratedRequirements.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataFlowRequirementEClass, DataFlowRequirement.class, "DataFlowRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataFlowRequirement_Base_Activity(), theUMLPackage.getActivity(), null, "base_Activity", null, 0, 1, DataFlowRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataSubjectsEClass, DataSubjects.class, "DataSubjects", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataSubjects_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, DataSubjects.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataRequirementsEClass, DataRequirements.class, "DataRequirements", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataRequirements_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, DataRequirements.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(availableInformationEClass, AvailableInformation.class, "AvailableInformation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getAvailableInformation_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, AvailableInformation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getAvailableInformation_Concerns(), theUMLPackage.getNamedElement(), null, "concerns", null, 1, 1, AvailableInformation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(personalInformationEClass, PersonalInformation.class, "PersonalInformation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPersonalInformation_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, PersonalInformation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getPersonalInformation_Concerns(), thePdp4engCommonGDPRPackage.getDataSubject(), null, "concerns", null, 1, 1, PersonalInformation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(availableInformationContainerEClass, AvailableInformationContainer.class, "AvailableInformationContainer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getAvailableInformationContainer_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, AvailableInformationContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(personalInformationContainerEClass, PersonalInformationContainer.class, "PersonalInformationContainer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPersonalInformationContainer_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, PersonalInformationContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(unlinkabilityRequirementEClass, UnlinkabilityRequirement.class, "UnlinkabilityRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getUnlinkabilityRequirement_Linkability(), this.getLinkability(), "linkability", null, 1, 1, UnlinkabilityRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(privacyRequirementEClass, PrivacyRequirement.class, "PrivacyRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPrivacyRequirement_Base_NamedElement(), theUMLPackage.getNamedElement(), null, "base_NamedElement", null, 0, 1, PrivacyRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getPrivacyRequirement_DataSubject(), thePdp4engCommonGDPRPackage.getDataSubject(), null, "dataSubject", null, 1, 1, PrivacyRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getPrivacyRequirement_Counterstakeholders(), theUMLPackage.getNamedElement(), null, "counterstakeholders", null, 0, -1, PrivacyRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getPrivacyRequirement_PersonalData(), thePdp4engCommonGDPRPackage.getPersonalData(), null, "personalData", null, 0, -1, PrivacyRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(dataUnlinkabilityRequirementEClass, DataUnlinkabilityRequirement.class, "DataUnlinkabilityRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataUnlinkabilityRequirement_Links(), theUMLPackage.getNamedElement(), null, "links", null, 0, -1, DataUnlinkabilityRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(controlersEClass, Controlers.class, "Controlers", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getControlers_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, Controlers.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(linkEClass, Link.class, "Link", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLink_Base_NamedElement(), theUMLPackage.getNamedElement(), null, "base_NamedElement", null, 0, 1, Link.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEAttribute(getLink_Linkability(), this.getLinkability(), "linkability", null, 1, 1, Link.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(undectabilityRequirementEClass, UndectabilityRequirement.class, "UndectabilityRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(pseudonimityRequirementEClass, PseudonimityRequirement.class, "PseudonimityRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPseudonimityRequirement_Kind(), this.getPseudonymKind(), "kind", null, 1, 1, PseudonimityRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(ananomityRequirementEClass, AnanomityRequirement.class, "AnanomityRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(dataRecordRequirementEClass, DataRecordRequirement.class, "DataRecordRequirement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataRecordRequirement_Base_DataStoreNode(), theUMLPackage.getDataStoreNode(), null, "base_DataStoreNode", null, 0, 1, DataRecordRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
		initEReference(getDataRecordRequirement_DataList(), thePdp4engCommonGDPRPackage.getData(), null, "dataList", null, 0, -1, DataRecordRequirement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(functionalRequirementsEClass, FunctionalRequirements.class, "FunctionalRequirements", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFunctionalRequirements_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, FunctionalRequirements.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(nonFunctionalRequirementsEClass, NonFunctionalRequirements.class, "NonFunctionalRequirements", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getNonFunctionalRequirements_Base_Package(), theUMLPackage.getPackage(), null, "base_Package", null, 0, 1, NonFunctionalRequirements.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByConsentEClass, LawfulByConsent.class, "LawfulByConsent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByConsent_Consent(), thePdp4engCommonGDPRPackage.getConsent(), null, "consent", null, 1, 1, LawfulByConsent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByContractEClass, LawfulByContract.class, "LawfulByContract", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByContract_Contract(), thePdp4engCommonGDPRPackage.getContract(), null, "contract", null, 1, 1, LawfulByContract.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByPublicInterestEClass, LawfulByPublicInterest.class, "LawfulByPublicInterest", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByPublicInterest_PublicInterest(), thePdp4engCommonGDPRPackage.getPublicInterest(), null, "publicInterest", null, 1, 1, LawfulByPublicInterest.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByLegitimateInterestEClass, LawfulByLegitimateInterest.class, "LawfulByLegitimateInterest", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByLegitimateInterest_LegitimateInterest(), thePdp4engCommonGDPRPackage.getLegitimateInterest(), null, "legitimateInterest", null, 1, 1, LawfulByLegitimateInterest.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByLegalObligationEClass, LawfulByLegalObligation.class, "LawfulByLegalObligation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByLegalObligation_LegalObligation(), thePdp4engCommonGDPRPackage.getLegalObligation(), null, "legalObligation", null, 1, 1, LawfulByLegalObligation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		initEClass(lawfulByVitalInterestEClass, LawfulByVitalInterest.class, "LawfulByVitalInterest", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLawfulByVitalInterest_VitalInterest(), thePdp4engCommonGDPRPackage.getVitalInterest(), null, "vitalInterest", null, 1, 1, LawfulByVitalInterest.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(linkabilityEEnum, Linkability.class, "Linkability");
		addEEnumLiteral(linkabilityEEnum, Linkability.SINGLE);
		addEEnumLiteral(linkabilityEEnum, Linkability.NOT_KNOWN);
		addEEnumLiteral(linkabilityEEnum, Linkability.SUBGROUP);
		addEEnumLiteral(linkabilityEEnum, Linkability.ANONYMOUS);

		initEEnum(collectionMethodEEnum, CollectionMethod.class, "CollectionMethod");
		addEEnumLiteral(collectionMethodEEnum, CollectionMethod.DIRECT);
		addEEnumLiteral(collectionMethodEEnum, CollectionMethod.INDIRECT);
		addEEnumLiteral(collectionMethodEEnum, CollectionMethod.REUSED);
		addEEnumLiteral(collectionMethodEEnum, CollectionMethod.EXTERNAL);

		initEEnum(durationEEnum, Duration.class, "Duration");
		addEEnumLiteral(durationEEnum, Duration.FOR_ACTION);
		addEEnumLiteral(durationEEnum, Duration.UNTIL_DELETED);
		addEEnumLiteral(durationEEnum, Duration.UNLIMITED);

		initEEnum(pseudonymKindEEnum, PseudonymKind.class, "PseudonymKind");
		addEEnumLiteral(pseudonymKindEEnum, PseudonymKind.PERSON);
		addEEnumLiteral(pseudonymKindEEnum, PseudonymKind.ROLE);
		addEEnumLiteral(pseudonymKindEEnum, PseudonymKind.RELATION_SHIP);
		addEEnumLiteral(pseudonymKindEEnum, PseudonymKind.ROLE_RELATION_SHIP);
		addEEnumLiteral(pseudonymKindEEnum, PseudonymKind.TRANSACTION);

		// Create resource
		createResource(eNS_URI);
	}

} //pdp4engReqGDPRPackageImpl
