/*
 * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Martin Vojtek - 2.6.0 - initial implementation
package org.eclipse.persistence.testing.perf.largexml.bigpo.common_basic_components;

import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlElementDecl;
import jakarta.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;


/**
 * This object contains factory methods for each
 * Java content interface and Java element interface
 * generated in the org.eclipse.persistence.testing.perf.largexml.bigpo.common_basic_components package.
 * <p>An ObjectFactory allows you to programatically
 * construct new instances of the Java representation
 * for XML content. The Java representation of XML
 * content can consist of schema derived interfaces
 * and classes representing the binding of schema
 * type definitions, element declarations and model
 * groups.  Factory methods for each of these are
 * provided in this class.
 *
 */
@XmlRegistry
public class ObjectFactory {

    private final static QName _HolderName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "HolderName");
    private final static QName _BuildingNumber_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "BuildingNumber");
    private final static QName _Postbox_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Postbox");
    private final static QName _PaidAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PaidAmount");
    private final static QName _Description_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Description");
    private final static QName _MaximumAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MaximumAmount");
    private final static QName _LineExtensionAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LineExtensionAmount");
    private final static QName _TargetUnitBaseRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TargetUnitBaseRate");
    private final static QName _Region_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Region");
    private final static QName _VolumeMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "VolumeMeasure");
    private final static QName _LatitudeMinutesMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LatitudeMinutesMeasure");
    private final static QName _Department_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Department");
    private final static QName _Mail_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Mail");
    private final static QName _PlacardNotation_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PlacardNotation");
    private final static QName _PlacardEndorsement_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PlacardEndorsement");
    private final static QName _AdditionalStreetName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "AdditionalStreetName");
    private final static QName _DiscountPercent_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DiscountPercent");
    private final static QName _GrossVolumeMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "GrossVolumeMeasure");
    private final static QName _DeliveryDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DeliveryDateTime");
    private final static QName _MarkAttentionIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MarkAttentionIndicator");
    private final static QName _TotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TotalAmount");
    private final static QName _SourceCurrencyBaseRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "SourceCurrencyBaseRate");
    private final static QName _Value_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Value");
    private final static QName _Amount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Amount");
    private final static QName _ExtensionAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ExtensionAmount");
    private final static QName _Telefax_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Telefax");
    private final static QName _Floor_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Floor");
    private final static QName _TaxableAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TaxableAmount");
    private final static QName _PriceAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PriceAmount");
    private final static QName _MinimumQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MinimumQuantity");
    private final static QName _MaximumMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MaximumMeasure");
    private final static QName _Terms_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Terms");
    private final static QName _MaximumBackorderQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MaximumBackorderQuantity");
    private final static QName _CurrencyBaseRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CurrencyBaseRate");
    private final static QName _PostalZone_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PostalZone");
    private final static QName _Extension_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Extension");
    private final static QName _MaximumQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MaximumQuantity");
    private final static QName _BackorderQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "BackorderQuantity");
    private final static QName _PackQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PackQuantity");
    private final static QName _RequestedDeliveryDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "RequestedDeliveryDateTime");
    private final static QName _LongitudeMinutesMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LongitudeMinutesMeasure");
    private final static QName _TaxInclusiveTotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TaxInclusiveTotalAmount");
    private final static QName _Information_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Information");
    private final static QName _Line_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Line");
    private final static QName _RejectedQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "RejectedQuantity");
    private final static QName _ReceivedQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ReceivedQuantity");
    private final static QName _CalculationRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CalculationRate");
    private final static QName _NetNetWeightMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "NetNetWeightMeasure");
    private final static QName _Note_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Note");
    private final static QName _ReceivedDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ReceivedDate");
    private final static QName _GrossWeightMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "GrossWeightMeasure");
    private final static QName _CityName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CityName");
    private final static QName _DurationMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DurationMeasure");
    private final static QName _LatitudeDegreesMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LatitudeDegreesMeasure");
    private final static QName _District_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "District");
    private final static QName _StreetName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "StreetName");
    private final static QName _MinimumAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MinimumAmount");
    private final static QName _Instructions_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Instructions");
    private final static QName _RefrigerationOnIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "RefrigerationOnIndicator");
    private final static QName _RegistrationName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "RegistrationName");
    private final static QName _MinimumMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MinimumMeasure");
    private final static QName _Room_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Room");
    private final static QName _BuildingName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "BuildingName");
    private final static QName _Percent_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Percent");
    private final static QName _NetWeightMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "NetWeightMeasure");
    private final static QName _ShortQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ShortQuantity");
    private final static QName _CatalogueIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CatalogueIndicator");
    private final static QName _Condition_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Condition");
    private final static QName _ChargeIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ChargeIndicator");
    private final static QName _HandlingInstructions_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "HandlingInstructions");
    private final static QName _EndDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "EndDateTime");
    private final static QName _MultiplierFactorNumeric_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MultiplierFactorNumeric");
    private final static QName _Name_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Name");
    private final static QName _BackorderReason_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "BackorderReason");
    private final static QName _PromisedDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PromisedDateTime");
    private final static QName _SequenceNumeric_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "SequenceNumeric");
    private final static QName _Quantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Quantity");
    private final static QName _MaterialIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MaterialIndicator");
    private final static QName _Location_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Location");
    private final static QName _NetVolumeMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "NetVolumeMeasure");
    private final static QName _Reason_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Reason");
    private final static QName _PrepaidIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PrepaidIndicator");
    private final static QName _IssueDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "IssueDate");
    private final static QName _TechnicalName_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TechnicalName");
    private final static QName _TotalTaxAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TotalTaxAmount");
    private final static QName _LossRisk_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LossRisk");
    private final static QName _ExemptionReason_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ExemptionReason");
    private final static QName _Indicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Indicator");
    private final static QName _DeliveredQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DeliveredQuantity");
    private final static QName _SettlementDiscountPercent_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "SettlementDiscountPercent");
    private final static QName _StartDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "StartDateTime");
    private final static QName _LongitudeDegreesMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LongitudeDegreesMeasure");
    private final static QName _UnitBaseRate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "UnitBaseRate");
    private final static QName _SpecialTerms_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "SpecialTerms");
    private final static QName _TimezoneOffset_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TimezoneOffset");
    private final static QName _Measure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Measure");
    private final static QName _PaymentDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PaymentDate");
    private final static QName _InhouseMail_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "InhouseMail");
    private final static QName _ReturnableMaterialIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ReturnableMaterialIndicator");
    private final static QName _PenaltySurchargePercent_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PenaltySurchargePercent");
    private final static QName _ExtensionTotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ExtensionTotalAmount");
    private final static QName _ActualDeliveryDateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ActualDeliveryDateTime");
    private final static QName _MinimumBackorderQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MinimumBackorderQuantity");
    private final static QName _TaxTotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TaxTotalAmount");
    private final static QName _RelevantLocation_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "RelevantLocation");
    private final static QName _MarkCareIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "MarkCareIndicator");
    private final static QName _Telephone_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Telephone");
    private final static QName _SurchargePercent_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "SurchargePercent");
    private final static QName _BaseQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "BaseQuantity");
    private final static QName _WeightMeasure_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "WeightMeasure");
    private final static QName _CopyIndicator_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CopyIndicator");
    private final static QName _ExpiryDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ExpiryDate");
    private final static QName _ElectronicMail_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ElectronicMail");
    private final static QName _TaxExclusiveTotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TaxExclusiveTotalAmount");
    private final static QName _LineExtensionTotalAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "LineExtensionTotalAmount");
    private final static QName _DuePaymentDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DuePaymentDate");
    private final static QName _PackSizeNumeric_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "PackSizeNumeric");
    private final static QName _TaxAmount_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "TaxAmount");
    private final static QName _AdditionalInformation_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "AdditionalInformation");
    private final static QName _DateTime_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "DateTime");
    private final static QName _Date_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Date");
    private final static QName _CountrySubentity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "CountrySubentity");
    private final static QName _Zone_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "Zone");
    private final static QName _ValidityStartDate_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "ValidityStartDate");
    private final static QName _InvoicedQuantity_QNAME = new QName("urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", "InvoicedQuantity");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.eclipse.persistence.testing.perf.largexml.bigpo.common_basic_components
     *
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link CurrencyBaseRateType }
     *
     */
    public CurrencyBaseRateType createCurrencyBaseRateType() {
        return new CurrencyBaseRateType();
    }

    /**
     * Create an instance of {@link RefrigerationOnIndicatorType }
     *
     */
    public RefrigerationOnIndicatorType createRefrigerationOnIndicatorType() {
        return new RefrigerationOnIndicatorType();
    }

    /**
     * Create an instance of {@link InstructionsType }
     *
     */
    public InstructionsType createInstructionsType() {
        return new InstructionsType();
    }

    /**
     * Create an instance of {@link NameType }
     *
     */
    public NameType createNameType() {
        return new NameType();
    }

    /**
     * Create an instance of {@link CountrySubentityType }
     *
     */
    public CountrySubentityType createCountrySubentityType() {
        return new CountrySubentityType();
    }

    /**
     * Create an instance of {@link ZoneType }
     *
     */
    public ZoneType createZoneType() {
        return new ZoneType();
    }

    /**
     * Create an instance of {@link DateTimeType }
     *
     */
    public DateTimeType createDateTimeType() {
        return new DateTimeType();
    }

    /**
     * Create an instance of {@link ValidityStartDateType }
     *
     */
    public ValidityStartDateType createValidityStartDateType() {
        return new ValidityStartDateType();
    }

    /**
     * Create an instance of {@link TermsType }
     *
     */
    public TermsType createTermsType() {
        return new TermsType();
    }

    /**
     * Create an instance of {@link LongitudeDegreesMeasureType }
     *
     */
    public LongitudeDegreesMeasureType createLongitudeDegreesMeasureType() {
        return new LongitudeDegreesMeasureType();
    }

    /**
     * Create an instance of {@link PackQuantityType }
     *
     */
    public PackQuantityType createPackQuantityType() {
        return new PackQuantityType();
    }

    /**
     * Create an instance of {@link BuildingNumberType }
     *
     */
    public BuildingNumberType createBuildingNumberType() {
        return new BuildingNumberType();
    }

    /**
     * Create an instance of {@link IssueDateType }
     *
     */
    public IssueDateType createIssueDateType() {
        return new IssueDateType();
    }

    /**
     * Create an instance of {@link AmountType }
     *
     */
    public AmountType createAmountType() {
        return new AmountType();
    }

    /**
     * Create an instance of {@link LocationType }
     *
     */
    public LocationType createLocationType() {
        return new LocationType();
    }

    /**
     * Create an instance of {@link RegionType }
     *
     */
    public RegionType createRegionType() {
        return new RegionType();
    }

    /**
     * Create an instance of {@link DateType }
     *
     */
    public DateType createDateType() {
        return new DateType();
    }

    /**
     * Create an instance of {@link UnitBaseRateType }
     *
     */
    public UnitBaseRateType createUnitBaseRateType() {
        return new UnitBaseRateType();
    }

    /**
     * Create an instance of {@link MarkAttentionIndicatorType }
     *
     */
    public MarkAttentionIndicatorType createMarkAttentionIndicatorType() {
        return new MarkAttentionIndicatorType();
    }

    /**
     * Create an instance of {@link BuildingNameType }
     *
     */
    public BuildingNameType createBuildingNameType() {
        return new BuildingNameType();
    }

    /**
     * Create an instance of {@link DurationMeasureType }
     *
     */
    public DurationMeasureType createDurationMeasureType() {
        return new DurationMeasureType();
    }

    /**
     * Create an instance of {@link LatitudeMinutesMeasureType }
     *
     */
    public LatitudeMinutesMeasureType createLatitudeMinutesMeasureType() {
        return new LatitudeMinutesMeasureType();
    }

    /**
     * Create an instance of {@link TaxTotalAmountType }
     *
     */
    public TaxTotalAmountType createTaxTotalAmountType() {
        return new TaxTotalAmountType();
    }

    /**
     * Create an instance of {@link LatitudeDegreesMeasureType }
     *
     */
    public LatitudeDegreesMeasureType createLatitudeDegreesMeasureType() {
        return new LatitudeDegreesMeasureType();
    }

    /**
     * Create an instance of {@link MaterialIndicatorType }
     *
     */
    public MaterialIndicatorType createMaterialIndicatorType() {
        return new MaterialIndicatorType();
    }

    /**
     * Create an instance of {@link HolderNameType }
     *
     */
    public HolderNameType createHolderNameType() {
        return new HolderNameType();
    }

    /**
     * Create an instance of {@link ReasonType }
     *
     */
    public ReasonType createReasonType() {
        return new ReasonType();
    }

    /**
     * Create an instance of {@link VolumeMeasureType }
     *
     */
    public VolumeMeasureType createVolumeMeasureType() {
        return new VolumeMeasureType();
    }

    /**
     * Create an instance of {@link InformationType }
     *
     */
    public InformationType createInformationType() {
        return new InformationType();
    }

    /**
     * Create an instance of {@link RoomType }
     *
     */
    public RoomType createRoomType() {
        return new RoomType();
    }

    /**
     * Create an instance of {@link DistrictType }
     *
     */
    public DistrictType createDistrictType() {
        return new DistrictType();
    }

    /**
     * Create an instance of {@link CopyIndicatorType }
     *
     */
    public CopyIndicatorType createCopyIndicatorType() {
        return new CopyIndicatorType();
    }

    /**
     * Create an instance of {@link PlacardNotationType }
     *
     */
    public PlacardNotationType createPlacardNotationType() {
        return new PlacardNotationType();
    }

    /**
     * Create an instance of {@link IndicatorType }
     *
     */
    public IndicatorType createIndicatorType() {
        return new IndicatorType();
    }

    /**
     * Create an instance of {@link FloorType }
     *
     */
    public FloorType createFloorType() {
        return new FloorType();
    }

    /**
     * Create an instance of {@link MeasureType }
     *
     */
    public MeasureType createMeasureType() {
        return new MeasureType();
    }

    /**
     * Create an instance of {@link TotalAmountType }
     *
     */
    public TotalAmountType createTotalAmountType() {
        return new TotalAmountType();
    }

    /**
     * Create an instance of {@link ExpiryDateType }
     *
     */
    public ExpiryDateType createExpiryDateType() {
        return new ExpiryDateType();
    }

    /**
     * Create an instance of {@link RegistrationNameType }
     *
     */
    public RegistrationNameType createRegistrationNameType() {
        return new RegistrationNameType();
    }

    /**
     * Create an instance of {@link DescriptionType }
     *
     */
    public DescriptionType createDescriptionType() {
        return new DescriptionType();
    }

    /**
     * Create an instance of {@link DepartmentType }
     *
     */
    public DepartmentType createDepartmentType() {
        return new DepartmentType();
    }

    /**
     * Create an instance of {@link PostboxType }
     *
     */
    public PostboxType createPostboxType() {
        return new PostboxType();
    }

    /**
     * Create an instance of {@link NoteType }
     *
     */
    public NoteType createNoteType() {
        return new NoteType();
    }

    /**
     * Create an instance of {@link SequenceNumericType }
     *
     */
    public SequenceNumericType createSequenceNumericType() {
        return new SequenceNumericType();
    }

    /**
     * Create an instance of {@link PercentType }
     *
     */
    public PercentType createPercentType() {
        return new PercentType();
    }

    /**
     * Create an instance of {@link TaxAmountType }
     *
     */
    public TaxAmountType createTaxAmountType() {
        return new TaxAmountType();
    }

    /**
     * Create an instance of {@link ChargeIndicatorType }
     *
     */
    public ChargeIndicatorType createChargeIndicatorType() {
        return new ChargeIndicatorType();
    }

    /**
     * Create an instance of {@link WeightMeasureType }
     *
     */
    public WeightMeasureType createWeightMeasureType() {
        return new WeightMeasureType();
    }

    /**
     * Create an instance of {@link PackSizeNumericType }
     *
     */
    public PackSizeNumericType createPackSizeNumericType() {
        return new PackSizeNumericType();
    }

    /**
     * Create an instance of {@link BackorderQuantityType }
     *
     */
    public BackorderQuantityType createBackorderQuantityType() {
        return new BackorderQuantityType();
    }

    /**
     * Create an instance of {@link MultiplierFactorNumericType }
     *
     */
    public MultiplierFactorNumericType createMultiplierFactorNumericType() {
        return new MultiplierFactorNumericType();
    }

    /**
     * Create an instance of {@link StartDateTimeType }
     *
     */
    public StartDateTimeType createStartDateTimeType() {
        return new StartDateTimeType();
    }

    /**
     * Create an instance of {@link MailType }
     *
     */
    public MailType createMailType() {
        return new MailType();
    }

    /**
     * Create an instance of {@link ExtensionTotalAmountType }
     *
     */
    public ExtensionTotalAmountType createExtensionTotalAmountType() {
        return new ExtensionTotalAmountType();
    }

    /**
     * Create an instance of {@link LineType }
     *
     */
    public LineType createLineType() {
        return new LineType();
    }

    /**
     * Create an instance of {@link PriceAmountType }
     *
     */
    public PriceAmountType createPriceAmountType() {
        return new PriceAmountType();
    }

    /**
     * Create an instance of {@link ConditionType }
     *
     */
    public ConditionType createConditionType() {
        return new ConditionType();
    }

    /**
     * Create an instance of {@link EndDateTimeType }
     *
     */
    public EndDateTimeType createEndDateTimeType() {
        return new EndDateTimeType();
    }

    /**
     * Create an instance of {@link LossRiskType }
     *
     */
    public LossRiskType createLossRiskType() {
        return new LossRiskType();
    }

    /**
     * Create an instance of {@link StreetNameType }
     *
     */
    public StreetNameType createStreetNameType() {
        return new StreetNameType();
    }

    /**
     * Create an instance of {@link TelephoneType }
     *
     */
    public TelephoneType createTelephoneType() {
        return new TelephoneType();
    }

    /**
     * Create an instance of {@link SurchargePercentType }
     *
     */
    public SurchargePercentType createSurchargePercentType() {
        return new SurchargePercentType();
    }

    /**
     * Create an instance of {@link PlacardEndorsementType }
     *
     */
    public PlacardEndorsementType createPlacardEndorsementType() {
        return new PlacardEndorsementType();
    }

    /**
     * Create an instance of {@link QuantityType }
     *
     */
    public QuantityType createQuantityType() {
        return new QuantityType();
    }

    /**
     * Create an instance of {@link ValueType }
     *
     */
    public ValueType createValueType() {
        return new ValueType();
    }

    /**
     * Create an instance of {@link ExtensionAmountType }
     *
     */
    public ExtensionAmountType createExtensionAmountType() {
        return new ExtensionAmountType();
    }

    /**
     * Create an instance of {@link PaymentDateType }
     *
     */
    public PaymentDateType createPaymentDateType() {
        return new PaymentDateType();
    }

    /**
     * Create an instance of {@link CityNameType }
     *
     */
    public CityNameType createCityNameType() {
        return new CityNameType();
    }

    /**
     * Create an instance of {@link CalculationRateType }
     *
     */
    public CalculationRateType createCalculationRateType() {
        return new CalculationRateType();
    }

    /**
     * Create an instance of {@link LongitudeMinutesMeasureType }
     *
     */
    public LongitudeMinutesMeasureType createLongitudeMinutesMeasureType() {
        return new LongitudeMinutesMeasureType();
    }

    /**
     * Create an instance of {@link TimezoneOffsetType }
     *
     */
    public TimezoneOffsetType createTimezoneOffsetType() {
        return new TimezoneOffsetType();
    }

    /**
     * Create an instance of {@link TelefaxType }
     *
     */
    public TelefaxType createTelefaxType() {
        return new TelefaxType();
    }

    /**
     * Create an instance of {@link DiscountPercentType }
     *
     */
    public DiscountPercentType createDiscountPercentType() {
        return new DiscountPercentType();
    }

    /**
     * Create an instance of {@link DeliveryDateTimeType }
     *
     */
    public DeliveryDateTimeType createDeliveryDateTimeType() {
        return new DeliveryDateTimeType();
    }

    /**
     * Create an instance of {@link MarkCareIndicatorType }
     *
     */
    public MarkCareIndicatorType createMarkCareIndicatorType() {
        return new MarkCareIndicatorType();
    }

    /**
     * Create an instance of {@link ExtensionType }
     *
     */
    public ExtensionType createExtensionType() {
        return new ExtensionType();
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link HolderNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "HolderName")
    public JAXBElement<HolderNameType> createHolderName(HolderNameType value) {
        return new JAXBElement<HolderNameType>(_HolderName_QNAME, HolderNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BuildingNumberType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "BuildingNumber")
    public JAXBElement<BuildingNumberType> createBuildingNumber(BuildingNumberType value) {
        return new JAXBElement<BuildingNumberType>(_BuildingNumber_QNAME, BuildingNumberType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PostboxType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Postbox")
    public JAXBElement<PostboxType> createPostbox(PostboxType value) {
        return new JAXBElement<PostboxType>(_Postbox_QNAME, PostboxType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PaidAmount")
    public JAXBElement<AmountType> createPaidAmount(AmountType value) {
        return new JAXBElement<AmountType>(_PaidAmount_QNAME, AmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DescriptionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Description")
    public JAXBElement<DescriptionType> createDescription(DescriptionType value) {
        return new JAXBElement<DescriptionType>(_Description_QNAME, DescriptionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MaximumAmount")
    public JAXBElement<AmountType> createMaximumAmount(AmountType value) {
        return new JAXBElement<AmountType>(_MaximumAmount_QNAME, AmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExtensionAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LineExtensionAmount")
    public JAXBElement<ExtensionAmountType> createLineExtensionAmount(ExtensionAmountType value) {
        return new JAXBElement<ExtensionAmountType>(_LineExtensionAmount_QNAME, ExtensionAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link UnitBaseRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TargetUnitBaseRate")
    public JAXBElement<UnitBaseRateType> createTargetUnitBaseRate(UnitBaseRateType value) {
        return new JAXBElement<UnitBaseRateType>(_TargetUnitBaseRate_QNAME, UnitBaseRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RegionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Region")
    public JAXBElement<RegionType> createRegion(RegionType value) {
        return new JAXBElement<RegionType>(_Region_QNAME, RegionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link VolumeMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "VolumeMeasure")
    public JAXBElement<VolumeMeasureType> createVolumeMeasure(VolumeMeasureType value) {
        return new JAXBElement<VolumeMeasureType>(_VolumeMeasure_QNAME, VolumeMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LatitudeMinutesMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LatitudeMinutesMeasure")
    public JAXBElement<LatitudeMinutesMeasureType> createLatitudeMinutesMeasure(LatitudeMinutesMeasureType value) {
        return new JAXBElement<LatitudeMinutesMeasureType>(_LatitudeMinutesMeasure_QNAME, LatitudeMinutesMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DepartmentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Department")
    public JAXBElement<DepartmentType> createDepartment(DepartmentType value) {
        return new JAXBElement<DepartmentType>(_Department_QNAME, DepartmentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MailType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Mail")
    public JAXBElement<MailType> createMail(MailType value) {
        return new JAXBElement<MailType>(_Mail_QNAME, MailType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PlacardNotationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PlacardNotation")
    public JAXBElement<PlacardNotationType> createPlacardNotation(PlacardNotationType value) {
        return new JAXBElement<PlacardNotationType>(_PlacardNotation_QNAME, PlacardNotationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PlacardEndorsementType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PlacardEndorsement")
    public JAXBElement<PlacardEndorsementType> createPlacardEndorsement(PlacardEndorsementType value) {
        return new JAXBElement<PlacardEndorsementType>(_PlacardEndorsement_QNAME, PlacardEndorsementType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link StreetNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "AdditionalStreetName")
    public JAXBElement<StreetNameType> createAdditionalStreetName(StreetNameType value) {
        return new JAXBElement<StreetNameType>(_AdditionalStreetName_QNAME, StreetNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DiscountPercentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DiscountPercent")
    public JAXBElement<DiscountPercentType> createDiscountPercent(DiscountPercentType value) {
        return new JAXBElement<DiscountPercentType>(_DiscountPercent_QNAME, DiscountPercentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link VolumeMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "GrossVolumeMeasure")
    public JAXBElement<VolumeMeasureType> createGrossVolumeMeasure(VolumeMeasureType value) {
        return new JAXBElement<VolumeMeasureType>(_GrossVolumeMeasure_QNAME, VolumeMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeliveryDateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DeliveryDateTime")
    public JAXBElement<DeliveryDateTimeType> createDeliveryDateTime(DeliveryDateTimeType value) {
        return new JAXBElement<DeliveryDateTimeType>(_DeliveryDateTime_QNAME, DeliveryDateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MarkAttentionIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MarkAttentionIndicator")
    public JAXBElement<MarkAttentionIndicatorType> createMarkAttentionIndicator(MarkAttentionIndicatorType value) {
        return new JAXBElement<MarkAttentionIndicatorType>(_MarkAttentionIndicator_QNAME, MarkAttentionIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TotalAmount")
    public JAXBElement<TotalAmountType> createTotalAmount(TotalAmountType value) {
        return new JAXBElement<TotalAmountType>(_TotalAmount_QNAME, TotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CurrencyBaseRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "SourceCurrencyBaseRate")
    public JAXBElement<CurrencyBaseRateType> createSourceCurrencyBaseRate(CurrencyBaseRateType value) {
        return new JAXBElement<CurrencyBaseRateType>(_SourceCurrencyBaseRate_QNAME, CurrencyBaseRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ValueType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Value")
    public JAXBElement<ValueType> createValue(ValueType value) {
        return new JAXBElement<ValueType>(_Value_QNAME, ValueType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Amount")
    public JAXBElement<AmountType> createAmount(AmountType value) {
        return new JAXBElement<AmountType>(_Amount_QNAME, AmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExtensionAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ExtensionAmount")
    public JAXBElement<ExtensionAmountType> createExtensionAmount(ExtensionAmountType value) {
        return new JAXBElement<ExtensionAmountType>(_ExtensionAmount_QNAME, ExtensionAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TelefaxType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Telefax")
    public JAXBElement<TelefaxType> createTelefax(TelefaxType value) {
        return new JAXBElement<TelefaxType>(_Telefax_QNAME, TelefaxType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link FloorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Floor")
    public JAXBElement<FloorType> createFloor(FloorType value) {
        return new JAXBElement<FloorType>(_Floor_QNAME, FloorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TaxableAmount")
    public JAXBElement<AmountType> createTaxableAmount(AmountType value) {
        return new JAXBElement<AmountType>(_TaxableAmount_QNAME, AmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PriceAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PriceAmount")
    public JAXBElement<PriceAmountType> createPriceAmount(PriceAmountType value) {
        return new JAXBElement<PriceAmountType>(_PriceAmount_QNAME, PriceAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MinimumQuantity")
    public JAXBElement<QuantityType> createMinimumQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_MinimumQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MaximumMeasure")
    public JAXBElement<MeasureType> createMaximumMeasure(MeasureType value) {
        return new JAXBElement<MeasureType>(_MaximumMeasure_QNAME, MeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TermsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Terms")
    public JAXBElement<TermsType> createTerms(TermsType value) {
        return new JAXBElement<TermsType>(_Terms_QNAME, TermsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BackorderQuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MaximumBackorderQuantity")
    public JAXBElement<BackorderQuantityType> createMaximumBackorderQuantity(BackorderQuantityType value) {
        return new JAXBElement<BackorderQuantityType>(_MaximumBackorderQuantity_QNAME, BackorderQuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CurrencyBaseRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CurrencyBaseRate")
    public JAXBElement<CurrencyBaseRateType> createCurrencyBaseRate(CurrencyBaseRateType value) {
        return new JAXBElement<CurrencyBaseRateType>(_CurrencyBaseRate_QNAME, CurrencyBaseRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ZoneType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PostalZone")
    public JAXBElement<ZoneType> createPostalZone(ZoneType value) {
        return new JAXBElement<ZoneType>(_PostalZone_QNAME, ZoneType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExtensionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Extension")
    public JAXBElement<ExtensionType> createExtension(ExtensionType value) {
        return new JAXBElement<ExtensionType>(_Extension_QNAME, ExtensionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MaximumQuantity")
    public JAXBElement<QuantityType> createMaximumQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_MaximumQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "BackorderQuantity")
    public JAXBElement<QuantityType> createBackorderQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_BackorderQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PackQuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PackQuantity")
    public JAXBElement<PackQuantityType> createPackQuantity(PackQuantityType value) {
        return new JAXBElement<PackQuantityType>(_PackQuantity_QNAME, PackQuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeliveryDateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "RequestedDeliveryDateTime")
    public JAXBElement<DeliveryDateTimeType> createRequestedDeliveryDateTime(DeliveryDateTimeType value) {
        return new JAXBElement<DeliveryDateTimeType>(_RequestedDeliveryDateTime_QNAME, DeliveryDateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LongitudeMinutesMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LongitudeMinutesMeasure")
    public JAXBElement<LongitudeMinutesMeasureType> createLongitudeMinutesMeasure(LongitudeMinutesMeasureType value) {
        return new JAXBElement<LongitudeMinutesMeasureType>(_LongitudeMinutesMeasure_QNAME, LongitudeMinutesMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TaxInclusiveTotalAmount")
    public JAXBElement<TotalAmountType> createTaxInclusiveTotalAmount(TotalAmountType value) {
        return new JAXBElement<TotalAmountType>(_TaxInclusiveTotalAmount_QNAME, TotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InformationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Information")
    public JAXBElement<InformationType> createInformation(InformationType value) {
        return new JAXBElement<InformationType>(_Information_QNAME, InformationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LineType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Line")
    public JAXBElement<LineType> createLine(LineType value) {
        return new JAXBElement<LineType>(_Line_QNAME, LineType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "RejectedQuantity")
    public JAXBElement<QuantityType> createRejectedQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_RejectedQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ReceivedQuantity")
    public JAXBElement<QuantityType> createReceivedQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_ReceivedQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CalculationRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CalculationRate")
    public JAXBElement<CalculationRateType> createCalculationRate(CalculationRateType value) {
        return new JAXBElement<CalculationRateType>(_CalculationRate_QNAME, CalculationRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link WeightMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "NetNetWeightMeasure")
    public JAXBElement<WeightMeasureType> createNetNetWeightMeasure(WeightMeasureType value) {
        return new JAXBElement<WeightMeasureType>(_NetNetWeightMeasure_QNAME, WeightMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link NoteType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Note")
    public JAXBElement<NoteType> createNote(NoteType value) {
        return new JAXBElement<NoteType>(_Note_QNAME, NoteType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ReceivedDate")
    public JAXBElement<DateType> createReceivedDate(DateType value) {
        return new JAXBElement<DateType>(_ReceivedDate_QNAME, DateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link WeightMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "GrossWeightMeasure")
    public JAXBElement<WeightMeasureType> createGrossWeightMeasure(WeightMeasureType value) {
        return new JAXBElement<WeightMeasureType>(_GrossWeightMeasure_QNAME, WeightMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CityNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CityName")
    public JAXBElement<CityNameType> createCityName(CityNameType value) {
        return new JAXBElement<CityNameType>(_CityName_QNAME, CityNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DurationMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DurationMeasure")
    public JAXBElement<DurationMeasureType> createDurationMeasure(DurationMeasureType value) {
        return new JAXBElement<DurationMeasureType>(_DurationMeasure_QNAME, DurationMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LatitudeDegreesMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LatitudeDegreesMeasure")
    public JAXBElement<LatitudeDegreesMeasureType> createLatitudeDegreesMeasure(LatitudeDegreesMeasureType value) {
        return new JAXBElement<LatitudeDegreesMeasureType>(_LatitudeDegreesMeasure_QNAME, LatitudeDegreesMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DistrictType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "District")
    public JAXBElement<DistrictType> createDistrict(DistrictType value) {
        return new JAXBElement<DistrictType>(_District_QNAME, DistrictType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link StreetNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "StreetName")
    public JAXBElement<StreetNameType> createStreetName(StreetNameType value) {
        return new JAXBElement<StreetNameType>(_StreetName_QNAME, StreetNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link AmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MinimumAmount")
    public JAXBElement<AmountType> createMinimumAmount(AmountType value) {
        return new JAXBElement<AmountType>(_MinimumAmount_QNAME, AmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InstructionsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Instructions")
    public JAXBElement<InstructionsType> createInstructions(InstructionsType value) {
        return new JAXBElement<InstructionsType>(_Instructions_QNAME, InstructionsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RefrigerationOnIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "RefrigerationOnIndicator")
    public JAXBElement<RefrigerationOnIndicatorType> createRefrigerationOnIndicator(RefrigerationOnIndicatorType value) {
        return new JAXBElement<RefrigerationOnIndicatorType>(_RefrigerationOnIndicator_QNAME, RefrigerationOnIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RegistrationNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "RegistrationName")
    public JAXBElement<RegistrationNameType> createRegistrationName(RegistrationNameType value) {
        return new JAXBElement<RegistrationNameType>(_RegistrationName_QNAME, RegistrationNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MinimumMeasure")
    public JAXBElement<MeasureType> createMinimumMeasure(MeasureType value) {
        return new JAXBElement<MeasureType>(_MinimumMeasure_QNAME, MeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RoomType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Room")
    public JAXBElement<RoomType> createRoom(RoomType value) {
        return new JAXBElement<RoomType>(_Room_QNAME, RoomType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BuildingNameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "BuildingName")
    public JAXBElement<BuildingNameType> createBuildingName(BuildingNameType value) {
        return new JAXBElement<BuildingNameType>(_BuildingName_QNAME, BuildingNameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PercentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Percent")
    public JAXBElement<PercentType> createPercent(PercentType value) {
        return new JAXBElement<PercentType>(_Percent_QNAME, PercentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link WeightMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "NetWeightMeasure")
    public JAXBElement<WeightMeasureType> createNetWeightMeasure(WeightMeasureType value) {
        return new JAXBElement<WeightMeasureType>(_NetWeightMeasure_QNAME, WeightMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ShortQuantity")
    public JAXBElement<QuantityType> createShortQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_ShortQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link IndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CatalogueIndicator")
    public JAXBElement<IndicatorType> createCatalogueIndicator(IndicatorType value) {
        return new JAXBElement<IndicatorType>(_CatalogueIndicator_QNAME, IndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ConditionType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Condition")
    public JAXBElement<ConditionType> createCondition(ConditionType value) {
        return new JAXBElement<ConditionType>(_Condition_QNAME, ConditionType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ChargeIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ChargeIndicator")
    public JAXBElement<ChargeIndicatorType> createChargeIndicator(ChargeIndicatorType value) {
        return new JAXBElement<ChargeIndicatorType>(_ChargeIndicator_QNAME, ChargeIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InstructionsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "HandlingInstructions")
    public JAXBElement<InstructionsType> createHandlingInstructions(InstructionsType value) {
        return new JAXBElement<InstructionsType>(_HandlingInstructions_QNAME, InstructionsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link EndDateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "EndDateTime")
    public JAXBElement<EndDateTimeType> createEndDateTime(EndDateTimeType value) {
        return new JAXBElement<EndDateTimeType>(_EndDateTime_QNAME, EndDateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MultiplierFactorNumericType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MultiplierFactorNumeric")
    public JAXBElement<MultiplierFactorNumericType> createMultiplierFactorNumeric(MultiplierFactorNumericType value) {
        return new JAXBElement<MultiplierFactorNumericType>(_MultiplierFactorNumeric_QNAME, MultiplierFactorNumericType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link NameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Name")
    public JAXBElement<NameType> createName(NameType value) {
        return new JAXBElement<NameType>(_Name_QNAME, NameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ReasonType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "BackorderReason")
    public JAXBElement<ReasonType> createBackorderReason(ReasonType value) {
        return new JAXBElement<ReasonType>(_BackorderReason_QNAME, ReasonType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PromisedDateTime")
    public JAXBElement<DateTimeType> createPromisedDateTime(DateTimeType value) {
        return new JAXBElement<DateTimeType>(_PromisedDateTime_QNAME, DateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SequenceNumericType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "SequenceNumeric")
    public JAXBElement<SequenceNumericType> createSequenceNumeric(SequenceNumericType value) {
        return new JAXBElement<SequenceNumericType>(_SequenceNumeric_QNAME, SequenceNumericType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Quantity")
    public JAXBElement<QuantityType> createQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_Quantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MaterialIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MaterialIndicator")
    public JAXBElement<MaterialIndicatorType> createMaterialIndicator(MaterialIndicatorType value) {
        return new JAXBElement<MaterialIndicatorType>(_MaterialIndicator_QNAME, MaterialIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LocationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Location")
    public JAXBElement<LocationType> createLocation(LocationType value) {
        return new JAXBElement<LocationType>(_Location_QNAME, LocationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link VolumeMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "NetVolumeMeasure")
    public JAXBElement<VolumeMeasureType> createNetVolumeMeasure(VolumeMeasureType value) {
        return new JAXBElement<VolumeMeasureType>(_NetVolumeMeasure_QNAME, VolumeMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ReasonType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Reason")
    public JAXBElement<ReasonType> createReason(ReasonType value) {
        return new JAXBElement<ReasonType>(_Reason_QNAME, ReasonType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link IndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PrepaidIndicator")
    public JAXBElement<IndicatorType> createPrepaidIndicator(IndicatorType value) {
        return new JAXBElement<IndicatorType>(_PrepaidIndicator_QNAME, IndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link IssueDateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "IssueDate")
    public JAXBElement<IssueDateType> createIssueDate(IssueDateType value) {
        return new JAXBElement<IssueDateType>(_IssueDate_QNAME, IssueDateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link NameType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TechnicalName")
    public JAXBElement<NameType> createTechnicalName(NameType value) {
        return new JAXBElement<NameType>(_TechnicalName_QNAME, NameType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TotalTaxAmount")
    public JAXBElement<TaxAmountType> createTotalTaxAmount(TaxAmountType value) {
        return new JAXBElement<TaxAmountType>(_TotalTaxAmount_QNAME, TaxAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LossRiskType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LossRisk")
    public JAXBElement<LossRiskType> createLossRisk(LossRiskType value) {
        return new JAXBElement<LossRiskType>(_LossRisk_QNAME, LossRiskType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ReasonType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ExemptionReason")
    public JAXBElement<ReasonType> createExemptionReason(ReasonType value) {
        return new JAXBElement<ReasonType>(_ExemptionReason_QNAME, ReasonType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link IndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Indicator")
    public JAXBElement<IndicatorType> createIndicator(IndicatorType value) {
        return new JAXBElement<IndicatorType>(_Indicator_QNAME, IndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DeliveredQuantity")
    public JAXBElement<QuantityType> createDeliveredQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_DeliveredQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DiscountPercentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "SettlementDiscountPercent")
    public JAXBElement<DiscountPercentType> createSettlementDiscountPercent(DiscountPercentType value) {
        return new JAXBElement<DiscountPercentType>(_SettlementDiscountPercent_QNAME, DiscountPercentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link StartDateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "StartDateTime")
    public JAXBElement<StartDateTimeType> createStartDateTime(StartDateTimeType value) {
        return new JAXBElement<StartDateTimeType>(_StartDateTime_QNAME, StartDateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LongitudeDegreesMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LongitudeDegreesMeasure")
    public JAXBElement<LongitudeDegreesMeasureType> createLongitudeDegreesMeasure(LongitudeDegreesMeasureType value) {
        return new JAXBElement<LongitudeDegreesMeasureType>(_LongitudeDegreesMeasure_QNAME, LongitudeDegreesMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link UnitBaseRateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "UnitBaseRate")
    public JAXBElement<UnitBaseRateType> createUnitBaseRate(UnitBaseRateType value) {
        return new JAXBElement<UnitBaseRateType>(_UnitBaseRate_QNAME, UnitBaseRateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TermsType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "SpecialTerms")
    public JAXBElement<TermsType> createSpecialTerms(TermsType value) {
        return new JAXBElement<TermsType>(_SpecialTerms_QNAME, TermsType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TimezoneOffsetType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TimezoneOffset")
    public JAXBElement<TimezoneOffsetType> createTimezoneOffset(TimezoneOffsetType value) {
        return new JAXBElement<TimezoneOffsetType>(_TimezoneOffset_QNAME, TimezoneOffsetType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Measure")
    public JAXBElement<MeasureType> createMeasure(MeasureType value) {
        return new JAXBElement<MeasureType>(_Measure_QNAME, MeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PaymentDateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PaymentDate")
    public JAXBElement<PaymentDateType> createPaymentDate(PaymentDateType value) {
        return new JAXBElement<PaymentDateType>(_PaymentDate_QNAME, PaymentDateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MailType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "InhouseMail")
    public JAXBElement<MailType> createInhouseMail(MailType value) {
        return new JAXBElement<MailType>(_InhouseMail_QNAME, MailType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MaterialIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ReturnableMaterialIndicator")
    public JAXBElement<MaterialIndicatorType> createReturnableMaterialIndicator(MaterialIndicatorType value) {
        return new JAXBElement<MaterialIndicatorType>(_ReturnableMaterialIndicator_QNAME, MaterialIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SurchargePercentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PenaltySurchargePercent")
    public JAXBElement<SurchargePercentType> createPenaltySurchargePercent(SurchargePercentType value) {
        return new JAXBElement<SurchargePercentType>(_PenaltySurchargePercent_QNAME, SurchargePercentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExtensionTotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ExtensionTotalAmount")
    public JAXBElement<ExtensionTotalAmountType> createExtensionTotalAmount(ExtensionTotalAmountType value) {
        return new JAXBElement<ExtensionTotalAmountType>(_ExtensionTotalAmount_QNAME, ExtensionTotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DeliveryDateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ActualDeliveryDateTime")
    public JAXBElement<DeliveryDateTimeType> createActualDeliveryDateTime(DeliveryDateTimeType value) {
        return new JAXBElement<DeliveryDateTimeType>(_ActualDeliveryDateTime_QNAME, DeliveryDateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link BackorderQuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MinimumBackorderQuantity")
    public JAXBElement<BackorderQuantityType> createMinimumBackorderQuantity(BackorderQuantityType value) {
        return new JAXBElement<BackorderQuantityType>(_MinimumBackorderQuantity_QNAME, BackorderQuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxTotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TaxTotalAmount")
    public JAXBElement<TaxTotalAmountType> createTaxTotalAmount(TaxTotalAmountType value) {
        return new JAXBElement<TaxTotalAmountType>(_TaxTotalAmount_QNAME, TaxTotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link LocationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "RelevantLocation")
    public JAXBElement<LocationType> createRelevantLocation(LocationType value) {
        return new JAXBElement<LocationType>(_RelevantLocation_QNAME, LocationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MarkCareIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "MarkCareIndicator")
    public JAXBElement<MarkCareIndicatorType> createMarkCareIndicator(MarkCareIndicatorType value) {
        return new JAXBElement<MarkCareIndicatorType>(_MarkCareIndicator_QNAME, MarkCareIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TelephoneType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Telephone")
    public JAXBElement<TelephoneType> createTelephone(TelephoneType value) {
        return new JAXBElement<TelephoneType>(_Telephone_QNAME, TelephoneType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link SurchargePercentType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "SurchargePercent")
    public JAXBElement<SurchargePercentType> createSurchargePercent(SurchargePercentType value) {
        return new JAXBElement<SurchargePercentType>(_SurchargePercent_QNAME, SurchargePercentType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "BaseQuantity")
    public JAXBElement<QuantityType> createBaseQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_BaseQuantity_QNAME, QuantityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link WeightMeasureType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "WeightMeasure")
    public JAXBElement<WeightMeasureType> createWeightMeasure(WeightMeasureType value) {
        return new JAXBElement<WeightMeasureType>(_WeightMeasure_QNAME, WeightMeasureType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CopyIndicatorType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CopyIndicator")
    public JAXBElement<CopyIndicatorType> createCopyIndicator(CopyIndicatorType value) {
        return new JAXBElement<CopyIndicatorType>(_CopyIndicator_QNAME, CopyIndicatorType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExpiryDateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ExpiryDate")
    public JAXBElement<ExpiryDateType> createExpiryDate(ExpiryDateType value) {
        return new JAXBElement<ExpiryDateType>(_ExpiryDate_QNAME, ExpiryDateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link MailType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ElectronicMail")
    public JAXBElement<MailType> createElectronicMail(MailType value) {
        return new JAXBElement<MailType>(_ElectronicMail_QNAME, MailType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TaxExclusiveTotalAmount")
    public JAXBElement<TotalAmountType> createTaxExclusiveTotalAmount(TotalAmountType value) {
        return new JAXBElement<TotalAmountType>(_TaxExclusiveTotalAmount_QNAME, TotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ExtensionTotalAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "LineExtensionTotalAmount")
    public JAXBElement<ExtensionTotalAmountType> createLineExtensionTotalAmount(ExtensionTotalAmountType value) {
        return new JAXBElement<ExtensionTotalAmountType>(_LineExtensionTotalAmount_QNAME, ExtensionTotalAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PaymentDateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DuePaymentDate")
    public JAXBElement<PaymentDateType> createDuePaymentDate(PaymentDateType value) {
        return new JAXBElement<PaymentDateType>(_DuePaymentDate_QNAME, PaymentDateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link PackSizeNumericType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "PackSizeNumeric")
    public JAXBElement<PackSizeNumericType> createPackSizeNumeric(PackSizeNumericType value) {
        return new JAXBElement<PackSizeNumericType>(_PackSizeNumeric_QNAME, PackSizeNumericType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link TaxAmountType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "TaxAmount")
    public JAXBElement<TaxAmountType> createTaxAmount(TaxAmountType value) {
        return new JAXBElement<TaxAmountType>(_TaxAmount_QNAME, TaxAmountType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link InformationType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "AdditionalInformation")
    public JAXBElement<InformationType> createAdditionalInformation(InformationType value) {
        return new JAXBElement<InformationType>(_AdditionalInformation_QNAME, InformationType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DateTimeType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "DateTime")
    public JAXBElement<DateTimeType> createDateTime(DateTimeType value) {
        return new JAXBElement<DateTimeType>(_DateTime_QNAME, DateTimeType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link DateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Date")
    public JAXBElement<DateType> createDate(DateType value) {
        return new JAXBElement<DateType>(_Date_QNAME, DateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link CountrySubentityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "CountrySubentity")
    public JAXBElement<CountrySubentityType> createCountrySubentity(CountrySubentityType value) {
        return new JAXBElement<CountrySubentityType>(_CountrySubentity_QNAME, CountrySubentityType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ZoneType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "Zone")
    public JAXBElement<ZoneType> createZone(ZoneType value) {
        return new JAXBElement<ZoneType>(_Zone_QNAME, ZoneType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link ValidityStartDateType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "ValidityStartDate")
    public JAXBElement<ValidityStartDateType> createValidityStartDate(ValidityStartDateType value) {
        return new JAXBElement<ValidityStartDateType>(_ValidityStartDate_QNAME, ValidityStartDateType.class, null, value);
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link QuantityType }{@code >}}
     *
     */
    @XmlElementDecl(namespace = "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0", name = "InvoicedQuantity")
    public JAXBElement<QuantityType> createInvoicedQuantity(QuantityType value) {
        return new JAXBElement<QuantityType>(_InvoicedQuantity_QNAME, QuantityType.class, null, value);
    }

}
