//! AUTO-GENERATED by tools/generate_schema.py — do not edit manually.
//! Run `python3 tools/generate_schema.py` to regenerate.

#![allow(non_snake_case)]

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AdditionalInfo {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    /// Accepts both a bare string and an array of strings from LLM output.
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_vec_string_opt")]
    pub full_text: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NumericRangeWithUnitAndQualifier {
    #[serde(rename = "ExactValue", skip_serializing_if = "Option::is_none")]
    pub exact_value: Option<NumericRangeWithUnitAndQualifierExactValue>,
    #[serde(rename = "UpperValue", skip_serializing_if = "Option::is_none")]
    pub upper_value: Option<NumericRangeWithUnitAndQualifierUpperValue>,
    #[serde(rename = "LowerValue", skip_serializing_if = "Option::is_none")]
    pub lower_value: Option<NumericRangeWithUnitAndQualifierLowerValue>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NumericRangeWithUnitAndQualifierExactValue {
    #[serde(rename = "ValueSymbol", skip_serializing_if = "Option::is_none")]
    pub value_symbol: Option<String>,
    #[serde(rename = "Value", skip_serializing_if = "Option::is_none")]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NumericRangeWithUnitAndQualifierLowerValue {
    #[serde(rename = "ValueSymbol", skip_serializing_if = "Option::is_none")]
    pub value_symbol: Option<String>,
    #[serde(rename = "Value", skip_serializing_if = "Option::is_none")]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NumericRangeWithUnitAndQualifierUpperValue {
    #[serde(rename = "ValueSymbol", skip_serializing_if = "Option::is_none")]
    pub value_symbol: Option<String>,
    #[serde(rename = "Value", skip_serializing_if = "Option::is_none")]
    pub value: Option<f64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiers {
    #[serde(rename = "SubstanceNames", skip_serializing_if = "Option::is_none")]
    pub substance_names: Option<SubstanceIdentifiersSubstanceNames>,
    #[serde(rename = "CommonName", skip_serializing_if = "Option::is_none")]
    pub common_name: Option<SubstanceIdentifiersCommonName>,
    #[serde(rename = "SubstanceIdentity", skip_serializing_if = "Option::is_none")]
    pub substance_identity: Option<SubstanceIdentifiersSubstanceIdentity>,
    #[serde(rename = "CBI", skip_serializing_if = "Option::is_none")]
    pub cbi: Option<bool>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiersCommonName {
    #[serde(rename = "OtherName", skip_serializing_if = "Option::is_none")]
    pub other_name: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiersSubstanceIdentity {
    #[serde(rename = "CASno", skip_serializing_if = "Option::is_none")]
    pub ca_sno: Option<SubstanceIdentifiersSubstanceIdentityCASno>,
    #[serde(rename = "OtherNo", skip_serializing_if = "Option::is_none")]
    pub other_no: Option<Vec<SubstanceIdentifiersSubstanceIdentityOtherNo>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiersSubstanceIdentityCASno {
    /// Accepts both a bare string and an array of strings from LLM output.
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_vec_string_opt")]
    pub full_text: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiersSubstanceIdentityOtherNo {
    #[serde(rename = "IdentityName", skip_serializing_if = "Option::is_none")]
    pub identity_name: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SubstanceIdentifiersSubstanceNames {
    #[serde(rename = "IupacName", skip_serializing_if = "Option::is_none")]
    pub iupac_name: Option<String>,
    #[serde(rename = "CasInventoryName", skip_serializing_if = "Option::is_none")]
    pub cas_inventory_name: Option<String>,
    #[serde(rename = "GenericName", skip_serializing_if = "Option::is_none")]
    pub generic_name: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcotoxicityTestInfo {
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "TestGuidline", skip_serializing_if = "Option::is_none")]
    pub test_guidline: Option<String>,
    #[serde(rename = "GLP", skip_serializing_if = "Option::is_none")]
    pub glp: Option<String>,
    #[serde(rename = "Species", skip_serializing_if = "Option::is_none")]
    pub species: Option<String>,
    #[serde(rename = "TestDuration", skip_serializing_if = "Option::is_none")]
    pub test_duration: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<String>,
    #[serde(rename = "Dose/Concentration", skip_serializing_if = "Option::is_none")]
    pub dose_concentration: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "TestReference", skip_serializing_if = "Option::is_none")]
    pub test_reference: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GazetteNo {
    #[serde(rename = "CSCL", skip_serializing_if = "Option::is_none")]
    pub cscl: Option<GazetteNoCSCL>,
    #[serde(rename = "ISHA", skip_serializing_if = "Option::is_none")]
    pub isha: Option<GazetteNoISHA>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GazetteNoCSCL {
    #[serde(rename = "CsclGazetteNo", skip_serializing_if = "Option::is_none")]
    pub cscl_gazette_no: Option<Vec<String>>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<Vec<GazetteNoCSCLClassification>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GazetteNoCSCLClassification {
    #[serde(rename = "ClassificationName", skip_serializing_if = "Option::is_none")]
    pub classification_name: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GazetteNoISHA {
    #[serde(rename = "IshaGazetteNo", skip_serializing_if = "Option::is_none")]
    pub isha_gazette_no: Option<Vec<String>>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<Vec<GazetteNoISHAClassification>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct GazetteNoISHAClassification {
    #[serde(rename = "ClassificationName", skip_serializing_if = "Option::is_none")]
    pub classification_name: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicityTestInfo {
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "TestGuidline", skip_serializing_if = "Option::is_none")]
    pub test_guidline: Option<String>,
    #[serde(rename = "GLP", skip_serializing_if = "Option::is_none")]
    pub glp: Option<String>,
    #[serde(rename = "Species", skip_serializing_if = "Option::is_none")]
    pub species: Option<String>,
    #[serde(rename = "Gender", skip_serializing_if = "Option::is_none")]
    pub gender: Option<String>,
    #[serde(rename = "TestDuration", skip_serializing_if = "Option::is_none")]
    pub test_duration: Option<String>,
    #[serde(rename = "ExposureTime", skip_serializing_if = "Option::is_none")]
    pub exposure_time: Option<String>,
    #[serde(rename = "ExposureFrequency", skip_serializing_if = "Option::is_none")]
    pub exposure_frequency: Option<String>,
    #[serde(rename = "Dose/Concentration", skip_serializing_if = "Option::is_none")]
    pub dose_concentration: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<String>,
    #[serde(rename = "TestReference", skip_serializing_if = "Option::is_none")]
    pub test_reference: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasures {
    #[serde(rename = "HumanExposureAndEmergencyMeasuress", skip_serializing_if = "Option::is_none")]
    pub human_exposure_and_emergency_measuress: Option<AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuress>,
    #[serde(rename = "EnvironmentalPrecautions", skip_serializing_if = "Option::is_none")]
    pub environmental_precautions: Option<AccidentalReleaseMeasuresEnvironmentalPrecautions>,
    #[serde(rename = "ContainmentAndCleaningUp", skip_serializing_if = "Option::is_none")]
    pub containment_and_cleaning_up: Option<AccidentalReleaseMeasuresContainmentAndCleaningUp>,
    #[serde(rename = "SecondaryDisasterPreventionMeasures", skip_serializing_if = "Option::is_none")]
    pub secondary_disaster_prevention_measures: Option<AccidentalReleaseMeasuresSecondaryDisasterPreventionMeasures>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresContainmentAndCleaningUp {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "Containment", skip_serializing_if = "Option::is_none")]
    pub containment: Option<String>,
    #[serde(rename = "CleaningUp", skip_serializing_if = "Option::is_none")]
    pub cleaning_up: Option<String>,
    #[serde(rename = "ForSmallQuantity", skip_serializing_if = "Option::is_none")]
    pub for_small_quantity: Option<String>,
    #[serde(rename = "ForLargeQuantity", skip_serializing_if = "Option::is_none")]
    pub for_large_quantity: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresEnvironmentalPrecautions {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuress {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "GeneralMeasures", skip_serializing_if = "Option::is_none")]
    pub general_measures: Option<String>,
    #[serde(rename = "ForNonEmergencyPersonnel", skip_serializing_if = "Option::is_none")]
    pub for_non_emergency_personnel: Option<AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuressForNonEmergencyPersonnel>,
    #[serde(rename = "ForEmergencyResponders", skip_serializing_if = "Option::is_none")]
    pub for_emergency_responders: Option<AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuressForEmergencyResponders>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuressForEmergencyResponders {
    #[serde(rename = "PersonalProtectionEquipment", skip_serializing_if = "Option::is_none")]
    pub personal_protection_equipment: Option<String>,
    #[serde(rename = "EmergencyProcedures", skip_serializing_if = "Option::is_none")]
    pub emergency_procedures: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresHumanExposureAndEmergencyMeasuressForNonEmergencyPersonnel {
    #[serde(rename = "PersonalProtectionEquipment", skip_serializing_if = "Option::is_none")]
    pub personal_protection_equipment: Option<String>,
    #[serde(rename = "EmergencyProcedures", skip_serializing_if = "Option::is_none")]
    pub emergency_procedures: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AccidentalReleaseMeasuresSecondaryDisasterPreventionMeasures {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Composition {
    #[serde(rename = "CompositionType", skip_serializing_if = "Option::is_none")]
    pub composition_type: Option<String>,
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "Use", skip_serializing_if = "Option::is_none")]
    pub r#use: Option<String>,
    #[serde(rename = "CompositionAndConcentration", skip_serializing_if = "Option::is_none")]
    pub composition_and_concentration: Option<Vec<CompositionCompositionAndConcentration>>,
    #[serde(rename = "ImpuritiesAndStabilizingAdditives", skip_serializing_if = "Option::is_none")]
    pub impurities_and_stabilizing_additives: Option<CompositionImpuritiesAndStabilizingAdditives>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompositionCompositionAndConcentration {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "MolecularFormula", skip_serializing_if = "Option::is_none")]
    pub molecular_formula: Option<String>,
    #[serde(rename = "StructuralFormula", skip_serializing_if = "Option::is_none")]
    pub structural_formula: Option<String>,
    #[serde(rename = "StructuralFormulaPathAndFileName", skip_serializing_if = "Option::is_none")]
    pub structural_formula_path_and_file_name: Option<String>,
    #[serde(rename = "SMILES", skip_serializing_if = "Option::is_none")]
    pub smiles: Option<String>,
    #[serde(rename = "InChI", skip_serializing_if = "Option::is_none")]
    pub in_ch_i: Option<String>,
    #[serde(rename = "InChIKey", skip_serializing_if = "Option::is_none")]
    pub in_ch_i_key: Option<String>,
    #[serde(rename = "MolecularWeight", skip_serializing_if = "Option::is_none")]
    pub molecular_weight: Option<f64>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<CompositionCompositionAndConcentrationConcentration>,
    #[serde(rename = "gazetteNo", skip_serializing_if = "Option::is_none")]
    pub gazette_no: Option<GazetteNo>,
    #[serde(rename = "Use", skip_serializing_if = "Option::is_none")]
    pub r#use: Option<String>,
    #[serde(rename = "GHSinfo", skip_serializing_if = "Option::is_none")]
    pub gh_sinfo: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompositionCompositionAndConcentrationConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompositionImpuritiesAndStabilizingAdditives {
    #[serde(rename = "isPresent", skip_serializing_if = "Option::is_none")]
    pub is_present: Option<bool>,
    #[serde(rename = "SubstancesAndConcentration", skip_serializing_if = "Option::is_none")]
    pub substances_and_concentration: Option<Vec<CompositionImpuritiesAndStabilizingAdditivesSubstancesAndConcentration>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompositionImpuritiesAndStabilizingAdditivesSubstancesAndConcentration {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "MolecularFormula", skip_serializing_if = "Option::is_none")]
    pub molecular_formula: Option<String>,
    #[serde(rename = "StructuralFormula", skip_serializing_if = "Option::is_none")]
    pub structural_formula: Option<String>,
    #[serde(rename = "StructuralFormulaPathAndFileName", skip_serializing_if = "Option::is_none")]
    pub structural_formula_path_and_file_name: Option<String>,
    #[serde(rename = "SMILES", skip_serializing_if = "Option::is_none")]
    pub smiles: Option<String>,
    #[serde(rename = "InChI", skip_serializing_if = "Option::is_none")]
    pub in_ch_i: Option<String>,
    #[serde(rename = "InChIKey", skip_serializing_if = "Option::is_none")]
    pub in_ch_i_key: Option<String>,
    #[serde(rename = "MolecularWeight", skip_serializing_if = "Option::is_none")]
    pub molecular_weight: Option<f64>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<CompositionImpuritiesAndStabilizingAdditivesSubstancesAndConcentrationConcentration>,
    #[serde(rename = "gazetteNo", skip_serializing_if = "Option::is_none")]
    pub gazette_no: Option<GazetteNo>,
    #[serde(rename = "Use", skip_serializing_if = "Option::is_none")]
    pub r#use: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompositionImpuritiesAndStabilizingAdditivesSubstancesAndConcentrationConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Datasheet {
    #[serde(rename = "IssueDate", skip_serializing_if = "Option::is_none")]
    pub issue_date: Option<String>,
    #[serde(rename = "RevisionDate", skip_serializing_if = "Option::is_none")]
    pub revision_date: Option<Vec<String>>,
    #[serde(rename = "VersionNo", skip_serializing_if = "Option::is_none")]
    pub version_no: Option<Vec<String>>,
    #[serde(rename = "JISVersionNo", skip_serializing_if = "Option::is_none")]
    pub jis_version_no: Option<Vec<String>>,
    #[serde(rename = "SDS-SchemaVersionNo", skip_serializing_if = "Option::is_none")]
    pub sds_schema_version_no: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DisposalConsiderations {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "ProductWaste", skip_serializing_if = "Option::is_none")]
    pub product_waste: Option<Vec<String>>,
    #[serde(rename = "PackagingWaste", skip_serializing_if = "Option::is_none")]
    pub packaging_waste: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformation {
    #[serde(rename = "CompositionType", skip_serializing_if = "Option::is_none")]
    pub composition_type: Option<String>,
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "EcotoxicologicalInformation", skip_serializing_if = "Option::is_none")]
    pub ecotoxicological_information: Option<EcologicalInformationEcotoxicologicalInformation>,
    #[serde(rename = "PersistenceDegradability", skip_serializing_if = "Option::is_none")]
    pub persistence_degradability: Option<EcologicalInformationPersistenceDegradability>,
    #[serde(rename = "Bioaccumulation", skip_serializing_if = "Option::is_none")]
    pub bioaccumulation: Option<EcologicalInformationBioaccumulation>,
    #[serde(rename = "Mobility", skip_serializing_if = "Option::is_none")]
    pub mobility: Option<EcologicalInformationMobility>,
    #[serde(rename = "HazardousOzoneLayer", skip_serializing_if = "Option::is_none")]
    pub hazardous_ozone_layer: Option<EcologicalInformationHazardousOzoneLayer>,
    #[serde(rename = "AdditionalEcotoxInformation", skip_serializing_if = "Option::is_none")]
    pub additional_ecotox_information: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationBioaccumulation {
    #[serde(rename = "BioconcentrationFactor", skip_serializing_if = "Option::is_none")]
    pub bioconcentration_factor: Option<EcologicalInformationBioaccumulationBioconcentrationFactor>,
    #[serde(rename = "LogKoW", skip_serializing_if = "Option::is_none")]
    pub log_ko_w: Option<f64>,
    #[serde(rename = "Bioaccumulation", skip_serializing_if = "Option::is_none")]
    pub bioaccumulation: Option<String>,
    #[serde(rename = "TestReference", skip_serializing_if = "Option::is_none")]
    pub test_reference: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationBioaccumulationBioconcentrationFactor {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationEcotoxicologicalInformation {
    #[serde(rename = "AquaticAcuteToxicity", skip_serializing_if = "Option::is_none")]
    pub aquatic_acute_toxicity: Option<EcologicalInformationEcotoxicologicalInformationAquaticAcuteToxicity>,
    #[serde(rename = "AquaticChronicToxicity", skip_serializing_if = "Option::is_none")]
    pub aquatic_chronic_toxicity: Option<EcologicalInformationEcotoxicologicalInformationAquaticChronicToxicity>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationEcotoxicologicalInformationAquaticAcuteToxicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<EcologicalInformationEcotoxicologicalInformationAquaticAcuteToxicityResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationEcotoxicologicalInformationAquaticAcuteToxicityResult {
    #[serde(rename = "ecotoxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub ecotoxicity_test_info: Option<EcotoxicityTestInfo>,
    #[serde(rename = "ValueType", skip_serializing_if = "Option::is_none")]
    pub value_type: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationEcotoxicologicalInformationAquaticChronicToxicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<EcologicalInformationEcotoxicologicalInformationAquaticChronicToxicityResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationEcotoxicologicalInformationAquaticChronicToxicityResult {
    #[serde(rename = "ecotoxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub ecotoxicity_test_info: Option<EcotoxicityTestInfo>,
    #[serde(rename = "ValueType", skip_serializing_if = "Option::is_none")]
    pub value_type: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationHazardousOzoneLayer {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "AnnexMontrealProtocol", skip_serializing_if = "Option::is_none")]
    pub annex_montreal_protocol: Option<bool>,
    #[serde(rename = "OzoneDepletionPotential", skip_serializing_if = "Option::is_none")]
    pub ozone_depletion_potential: Option<f64>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationMobility {
    #[serde(rename = "AdsorptionCoefficient", skip_serializing_if = "Option::is_none")]
    pub adsorption_coefficient: Option<EcologicalInformationMobilityAdsorptionCoefficient>,
    #[serde(rename = "Mobility", skip_serializing_if = "Option::is_none")]
    pub mobility: Option<String>,
    #[serde(rename = "TestReference", skip_serializing_if = "Option::is_none")]
    pub test_reference: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationMobilityAdsorptionCoefficient {
    #[serde(rename = "KoC", skip_serializing_if = "Option::is_none")]
    pub ko_c: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Kd", skip_serializing_if = "Option::is_none")]
    pub kd: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EcologicalInformationPersistenceDegradability {
    #[serde(rename = "BiologicalDegradability", skip_serializing_if = "Option::is_none")]
    pub biological_degradability: Option<String>,
    #[serde(rename = "AbioticDegradation", skip_serializing_if = "Option::is_none")]
    pub abiotic_degradation: Option<String>,
    #[serde(rename = "RapidDegradability", skip_serializing_if = "Option::is_none")]
    pub rapid_degradability: Option<bool>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtection {
    #[serde(rename = "OccupationalExposureLimits", skip_serializing_if = "Option::is_none")]
    pub occupational_exposure_limits: Option<Vec<ExposureControlPersonalProtectionOccupationalExposureLimits>>,
    #[serde(rename = "AppropriateEngineeringControls", skip_serializing_if = "Option::is_none")]
    pub appropriate_engineering_controls: Option<Vec<String>>,
    #[serde(rename = "PersonalProtectionEquipment", skip_serializing_if = "Option::is_none")]
    pub personal_protection_equipment: Option<ExposureControlPersonalProtectionPersonalProtectionEquipment>,
    #[serde(rename = "SpecialInstructions", skip_serializing_if = "Option::is_none")]
    pub special_instructions: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimits {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "DecompositionProduct", skip_serializing_if = "Option::is_none")]
    pub decomposition_product: Option<bool>,
    #[serde(rename = "ControlConcentration", skip_serializing_if = "Option::is_none")]
    pub control_concentration: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsControlConcentration>,
    #[serde(rename = "OccupationalExposureLimit", skip_serializing_if = "Option::is_none")]
    pub occupational_exposure_limit: Option<Vec<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimit>>,
    #[serde(rename = "BiologicalLimitValue", skip_serializing_if = "Option::is_none")]
    pub biological_limit_value: Option<Vec<ExposureControlPersonalProtectionOccupationalExposureLimitsBiologicalLimitValue>>,
    #[serde(rename = "EnvironmentalExposurePrevention", skip_serializing_if = "Option::is_none")]
    pub environmental_exposure_prevention: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsEnvironmentalExposurePrevention>,
    #[serde(rename = "ExposureGuidelines", skip_serializing_if = "Option::is_none")]
    pub exposure_guidelines: Option<String>,
    #[serde(rename = "GuidelineValuesForIndoorAirConcentration", skip_serializing_if = "Option::is_none")]
    pub guideline_values_for_indoor_air_concentration: Option<String>,
    #[serde(rename = "RecommendedMonitoringProcedure", skip_serializing_if = "Option::is_none")]
    pub recommended_monitoring_procedure: Option<String>,
    #[serde(rename = "AppropriateTechnicalManagement", skip_serializing_if = "Option::is_none")]
    pub appropriate_technical_management: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsBiologicalLimitValue {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "SamplingTime", skip_serializing_if = "Option::is_none")]
    pub sampling_time: Option<String>,
    #[serde(rename = "Sample", skip_serializing_if = "Option::is_none")]
    pub sample: Option<String>,
    #[serde(rename = "substance", skip_serializing_if = "Option::is_none")]
    pub substance: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsControlConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsEnvironmentalExposurePrevention {
    #[serde(rename = "PNEC", skip_serializing_if = "Option::is_none")]
    pub pnec: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimit {
    #[serde(rename = "LimitValueTypeWithCountryOrOrganisation", skip_serializing_if = "Option::is_none")]
    pub limit_value_type_with_country_or_organisation: Option<String>,
    #[serde(rename = "LimitValue", skip_serializing_if = "Option::is_none")]
    pub limit_value: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValue>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValue {
    #[serde(rename = "Limit8H", skip_serializing_if = "Option::is_none")]
    pub limit8_h: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueLimit8H>,
    #[serde(rename = "LimitShortTerm", skip_serializing_if = "Option::is_none")]
    pub limit_short_term: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueLimitShortTerm>,
    #[serde(rename = "PeakLimitation", skip_serializing_if = "Option::is_none")]
    pub peak_limitation: Option<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValuePeakLimitation>,
    #[serde(rename = "OtherLimitation", skip_serializing_if = "Option::is_none")]
    pub other_limitation: Option<Vec<ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueOtherLimitation>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueLimit8H {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueLimitShortTerm {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValueOtherLimitation {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionOccupationalExposureLimitsOccupationalExposureLimitLimitValuePeakLimitation {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<Vec<NumericRangeWithUnitAndQualifier>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipment {
    #[serde(rename = "RespiratoryProtection", skip_serializing_if = "Option::is_none")]
    pub respiratory_protection: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentRespiratoryProtection>>,
    #[serde(rename = "HandProtection", skip_serializing_if = "Option::is_none")]
    pub hand_protection: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtection>>,
    #[serde(rename = "EyeProtection", skip_serializing_if = "Option::is_none")]
    pub eye_protection: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentEyeProtection>>,
    #[serde(rename = "SkinProtection", skip_serializing_if = "Option::is_none")]
    pub skin_protection: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtection>>,
    #[serde(rename = "SpecialTreatmentNeeded", skip_serializing_if = "Option::is_none")]
    pub special_treatment_needed: Option<ExposureControlPersonalProtectionPersonalProtectionEquipmentSpecialTreatmentNeeded>,
    #[serde(rename = "GeneralSafetyAndHealthMeasures", skip_serializing_if = "Option::is_none")]
    pub general_safety_and_health_measures: Option<String>,
    #[serde(rename = "SafetySigns", skip_serializing_if = "Option::is_none")]
    pub safety_signs: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentEyeProtection {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "SuitableEyeProtection", skip_serializing_if = "Option::is_none")]
    pub suitable_eye_protection: Option<ExposureControlPersonalProtectionPersonalProtectionEquipmentEyeProtectionSuitableEyeProtection>,
    #[serde(rename = "UnSuitableEyeProtection", skip_serializing_if = "Option::is_none")]
    pub un_suitable_eye_protection: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentEyeProtectionSuitableEyeProtection {
    #[serde(rename = "Type", skip_serializing_if = "Option::is_none")]
    pub r#type: Option<String>,
    #[serde(rename = "Standard", skip_serializing_if = "Option::is_none")]
    pub standard: Option<String>,
    #[serde(rename = "Manufacturer", skip_serializing_if = "Option::is_none")]
    pub manufacturer: Option<String>,
    #[serde(rename = "ProductInfomation", skip_serializing_if = "Option::is_none")]
    pub product_infomation: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtection {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "Type", skip_serializing_if = "Option::is_none")]
    pub r#type: Option<String>,
    #[serde(rename = "RecommendedProtectiveGloveArticles", skip_serializing_if = "Option::is_none")]
    pub recommended_protective_glove_articles: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtectionRecommendedProtectiveGloveArticles>>,
    #[serde(rename = "UnsuitableMaterials", skip_serializing_if = "Option::is_none")]
    pub unsuitable_materials: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtectionRecommendedProtectiveGloveArticles {
    #[serde(rename = "Material", skip_serializing_if = "Option::is_none")]
    pub material: Option<String>,
    #[serde(rename = "ThicknessOfGloveMaterial", skip_serializing_if = "Option::is_none")]
    pub thickness_of_glove_material: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "GloveBreakthroughTime", skip_serializing_if = "Option::is_none")]
    pub glove_breakthrough_time: Option<ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtectionRecommendedProtectiveGloveArticlesGloveBreakthroughTime>,
    #[serde(rename = "MaxWearDurationPermanentContact", skip_serializing_if = "Option::is_none")]
    pub max_wear_duration_permanent_contact: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Standard", skip_serializing_if = "Option::is_none")]
    pub standard: Option<String>,
    #[serde(rename = "Manufacturer", skip_serializing_if = "Option::is_none")]
    pub manufacturer: Option<String>,
    #[serde(rename = "ProductInfomation", skip_serializing_if = "Option::is_none")]
    pub product_infomation: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentHandProtectionRecommendedProtectiveGloveArticlesGloveBreakthroughTime {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "PermeationChart", skip_serializing_if = "Option::is_none")]
    pub permeation_chart: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentRespiratoryProtection {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "TasksNeedingRespiratoryProtection", skip_serializing_if = "Option::is_none")]
    pub tasks_needing_respiratory_protection: Option<String>,
    #[serde(rename = "SuitableRespiratoryProtectionEquipment", skip_serializing_if = "Option::is_none")]
    pub suitable_respiratory_protection_equipment: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentRespiratoryProtectionSuitableRespiratoryProtectionEquipment>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentRespiratoryProtectionSuitableRespiratoryProtectionEquipment {
    #[serde(rename = "MaskType", skip_serializing_if = "Option::is_none")]
    pub mask_type: Option<String>,
    #[serde(rename = "FilterApparatusType", skip_serializing_if = "Option::is_none")]
    pub filter_apparatus_type: Option<String>,
    #[serde(rename = "Standard", skip_serializing_if = "Option::is_none")]
    pub standard: Option<String>,
    #[serde(rename = "Description", skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(rename = "Manufacturer", skip_serializing_if = "Option::is_none")]
    pub manufacturer: Option<String>,
    #[serde(rename = "ProductInfomation", skip_serializing_if = "Option::is_none")]
    pub product_infomation: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtection {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "SuitableProtectiveClothing", skip_serializing_if = "Option::is_none")]
    pub suitable_protective_clothing: Option<ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothing>,
    #[serde(rename = "UnsuitableProtectiveClothing", skip_serializing_if = "Option::is_none")]
    pub unsuitable_protective_clothing: Option<String>,
    #[serde(rename = "AdditionalSkinProtectionMeasures", skip_serializing_if = "Option::is_none")]
    pub additional_skin_protection_measures: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothing {
    #[serde(rename = "RecommendedProtectiveClothingArticles", skip_serializing_if = "Option::is_none")]
    pub recommended_protective_clothing_articles: Option<Vec<ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothingRecommendedProtectiveClothingArticles>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothingRecommendedProtectiveClothingArticles {
    #[serde(rename = "Material", skip_serializing_if = "Option::is_none")]
    pub material: Option<String>,
    #[serde(rename = "ThicknessOfGloveMaterial", skip_serializing_if = "Option::is_none")]
    pub thickness_of_glove_material: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "GloveBreakthroughTime", skip_serializing_if = "Option::is_none")]
    pub glove_breakthrough_time: Option<ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothingRecommendedProtectiveClothingArticlesGloveBreakthroughTime>,
    #[serde(rename = "MaxWearDurationPermanentContact", skip_serializing_if = "Option::is_none")]
    pub max_wear_duration_permanent_contact: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Standard", skip_serializing_if = "Option::is_none")]
    pub standard: Option<String>,
    #[serde(rename = "Manufacturer", skip_serializing_if = "Option::is_none")]
    pub manufacturer: Option<String>,
    #[serde(rename = "ProductInfomation", skip_serializing_if = "Option::is_none")]
    pub product_infomation: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentSkinProtectionSuitableProtectiveClothingRecommendedProtectiveClothingArticlesGloveBreakthroughTime {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "PermeationChart", skip_serializing_if = "Option::is_none")]
    pub permeation_chart: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ExposureControlPersonalProtectionPersonalProtectionEquipmentSpecialTreatmentNeeded {
    #[serde(rename = "ThermalHazardsProtection", skip_serializing_if = "Option::is_none")]
    pub thermal_hazards_protection: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasures {
    #[serde(rename = "MediaToBeUsed", skip_serializing_if = "Option::is_none")]
    pub media_to_be_used: Option<FireFightingMeasuresMediaToBeUsed>,
    #[serde(rename = "MediaNotBeUsed", skip_serializing_if = "Option::is_none")]
    pub media_not_be_used: Option<FireFightingMeasuresMediaNotBeUsed>,
    #[serde(rename = "FireAndExplosionHazards", skip_serializing_if = "Option::is_none")]
    pub fire_and_explosion_hazards: Option<FireFightingMeasuresFireAndExplosionHazards>,
    #[serde(rename = "FireFightingProcedures", skip_serializing_if = "Option::is_none")]
    pub fire_fighting_procedures: Option<FireFightingMeasuresFireFightingProcedures>,
    #[serde(rename = "SpecialProtectiveEquipmentForFirefighters", skip_serializing_if = "Option::is_none")]
    pub special_protective_equipment_for_firefighters: Option<FireFightingMeasuresSpecialProtectiveEquipmentForFirefighters>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasuresFireAndExplosionHazards {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "HazardCombustionProd", skip_serializing_if = "Option::is_none")]
    pub hazard_combustion_prod: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasuresFireFightingProcedures {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "InitialFireFightingMethod", skip_serializing_if = "Option::is_none")]
    pub initial_fire_fighting_method: Option<String>,
    #[serde(rename = "LargeScaleFireFightingMethod", skip_serializing_if = "Option::is_none")]
    pub large_scale_fire_fighting_method: Option<String>,
    #[serde(rename = "SurroundingFireProcedures", skip_serializing_if = "Option::is_none")]
    pub surrounding_fire_procedures: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasuresMediaNotBeUsed {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasuresMediaToBeUsed {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FireFightingMeasuresSpecialProtectiveEquipmentForFirefighters {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "SpecialProtectiveEquipmentAndPreventiveMeasuresForFirefighters", skip_serializing_if = "Option::is_none")]
    pub special_protective_equipment_and_preventive_measures_for_firefighters: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasures {
    #[serde(rename = "ExposureRoute", skip_serializing_if = "Option::is_none")]
    pub exposure_route: Option<FirstAidMeasuresExposureRoute>,
    #[serde(rename = "DescriptionOfFirstAidMeasures", skip_serializing_if = "Option::is_none")]
    pub description_of_first_aid_measures: Option<FirstAidMeasuresDescriptionOfFirstAidMeasures>,
    #[serde(rename = "InformationToHealthProfessionals", skip_serializing_if = "Option::is_none")]
    pub information_to_health_professionals: Option<FirstAidMeasuresInformationToHealthProfessionals>,
    #[serde(rename = "MedicalAttentionAndSpecialTreatmentNeeded", skip_serializing_if = "Option::is_none")]
    pub medical_attention_and_special_treatment_needed: Option<FirstAidMeasuresMedicalAttentionAndSpecialTreatmentNeeded>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresDescriptionOfFirstAidMeasures {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresExposureRoute {
    #[serde(rename = "FirstAidInhalation", skip_serializing_if = "Option::is_none")]
    pub first_aid_inhalation: Option<FirstAidMeasuresExposureRouteFirstAidInhalation>,
    #[serde(rename = "FirstAidSkin", skip_serializing_if = "Option::is_none")]
    pub first_aid_skin: Option<FirstAidMeasuresExposureRouteFirstAidSkin>,
    #[serde(rename = "FirstAidEye", skip_serializing_if = "Option::is_none")]
    pub first_aid_eye: Option<FirstAidMeasuresExposureRouteFirstAidEye>,
    #[serde(rename = "FirstAidIngestion", skip_serializing_if = "Option::is_none")]
    pub first_aid_ingestion: Option<FirstAidMeasuresExposureRouteFirstAidIngestion>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresExposureRouteFirstAidEye {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresExposureRouteFirstAidIngestion {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresExposureRouteFirstAidInhalation {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresExposureRouteFirstAidSkin {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresInformationToHealthProfessionals {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AcuteSymptomsAndEffects", skip_serializing_if = "Option::is_none")]
    pub acute_symptoms_and_effects: Option<FirstAidMeasuresInformationToHealthProfessionalsAcuteSymptomsAndEffects>,
    #[serde(rename = "DelayedSymptomsAndEffects", skip_serializing_if = "Option::is_none")]
    pub delayed_symptoms_and_effects: Option<FirstAidMeasuresInformationToHealthProfessionalsDelayedSymptomsAndEffects>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresInformationToHealthProfessionalsAcuteSymptomsAndEffects {
    #[serde(rename = "FirstAidInhalation", skip_serializing_if = "Option::is_none")]
    pub first_aid_inhalation: Option<Vec<String>>,
    #[serde(rename = "FirstAidEye", skip_serializing_if = "Option::is_none")]
    pub first_aid_eye: Option<Vec<String>>,
    #[serde(rename = "FirstAidSkin", skip_serializing_if = "Option::is_none")]
    pub first_aid_skin: Option<Vec<String>>,
    #[serde(rename = "FirstAidIngestion", skip_serializing_if = "Option::is_none")]
    pub first_aid_ingestion: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresInformationToHealthProfessionalsDelayedSymptomsAndEffects {
    #[serde(rename = "FirstAidInhalation", skip_serializing_if = "Option::is_none")]
    pub first_aid_inhalation: Option<Vec<String>>,
    #[serde(rename = "FirstAidEye", skip_serializing_if = "Option::is_none")]
    pub first_aid_eye: Option<Vec<String>>,
    #[serde(rename = "FirstAidSkin", skip_serializing_if = "Option::is_none")]
    pub first_aid_skin: Option<Vec<String>>,
    #[serde(rename = "FirstAidIngestion", skip_serializing_if = "Option::is_none")]
    pub first_aid_ingestion: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FirstAidMeasuresMedicalAttentionAndSpecialTreatmentNeeded {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorage {
    #[serde(rename = "SafeHandling", skip_serializing_if = "Option::is_none")]
    pub safe_handling: Option<HandlingAndStorageSafeHandling>,
    #[serde(rename = "Storage", skip_serializing_if = "Option::is_none")]
    pub storage: Option<HandlingAndStorageStorage>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorageSafeHandling {
    #[serde(rename = "TechnicalMeasuresAndStorageConditions", skip_serializing_if = "Option::is_none")]
    pub technical_measures_and_storage_conditions: Option<HandlingAndStorageSafeHandlingTechnicalMeasuresAndStorageConditions>,
    #[serde(rename = "HandlingPrecautions", skip_serializing_if = "Option::is_none")]
    pub handling_precautions: Option<String>,
    #[serde(rename = "AvoidContact", skip_serializing_if = "Option::is_none")]
    pub avoid_contact: Option<String>,
    #[serde(rename = "HygienicMeasures", skip_serializing_if = "Option::is_none")]
    pub hygienic_measures: Option<String>,
    #[serde(rename = "AdditionalProcessingHazards", skip_serializing_if = "Option::is_none")]
    pub additional_processing_hazards: Option<String>,
    #[serde(rename = "FoodHygieneRegulations", skip_serializing_if = "Option::is_none")]
    pub food_hygiene_regulations: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorageSafeHandlingTechnicalMeasuresAndStorageConditions {
    #[serde(rename = "ProtectiveMeasures", skip_serializing_if = "Option::is_none")]
    pub protective_measures: Option<String>,
    #[serde(rename = "MeasuresToPreventFire", skip_serializing_if = "Option::is_none")]
    pub measures_to_prevent_fire: Option<String>,
    #[serde(rename = "GeneralOccupationalHygiene", skip_serializing_if = "Option::is_none")]
    pub general_occupational_hygiene: Option<String>,
    #[serde(rename = "VentilationCondition", skip_serializing_if = "Option::is_none")]
    pub ventilation_condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorageStorage {
    #[serde(rename = "ConditionsForSafeStorage", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_storage_conditions_opt")]
    pub conditions_for_safe_storage: Option<HandlingAndStorageStorageConditionsForSafeStorage>,
    #[serde(rename = "PackagingContainer", skip_serializing_if = "Option::is_none")]
    pub packaging_container: Option<String>,
    #[serde(rename = "SpecificEndUses", skip_serializing_if = "Option::is_none")]
    pub specific_end_uses: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorageStorageConditionsForSafeStorage {
    #[serde(rename = "TechnicalMeasuresAndStorageConditions", skip_serializing_if = "Option::is_none")]
    pub technical_measures_and_storage_conditions: Option<String>,
    #[serde(rename = "ConditionsToAvoid", skip_serializing_if = "Option::is_none")]
    pub conditions_to_avoid: Option<String>,
    #[serde(rename = "Conditions", skip_serializing_if = "Option::is_none")]
    pub conditions: Option<HandlingAndStorageStorageConditionsForSafeStorageConditions>,
    #[serde(rename = "StoragePrecautions", skip_serializing_if = "Option::is_none")]
    pub storage_precautions: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HandlingAndStorageStorageConditionsForSafeStorageConditions {
    #[serde(rename = "MaximumStoragePeriod", skip_serializing_if = "Option::is_none")]
    pub maximum_storage_period: Option<String>,
    #[serde(rename = "StorageTemperature", skip_serializing_if = "Option::is_none")]
    pub storage_temperature: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentification {
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<HazardIdentificationClassification>,
    #[serde(rename = "HazardLabelling", skip_serializing_if = "Option::is_none")]
    pub hazard_labelling: Option<HazardIdentificationHazardLabelling>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassification {
    #[serde(rename = "PhysicochemicalEffect", skip_serializing_if = "Option::is_none")]
    pub physicochemical_effect: Option<HazardIdentificationClassificationPhysicochemicalEffect>,
    #[serde(rename = "HealthEffect", skip_serializing_if = "Option::is_none")]
    pub health_effect: Option<HazardIdentificationClassificationHealthEffect>,
    #[serde(rename = "EnvironmentalEffect", skip_serializing_if = "Option::is_none")]
    pub environmental_effect: Option<HazardIdentificationClassificationEnvironmentalEffect>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationEnvironmentalEffect {
    #[serde(rename = "AquaticToxicityAcute", skip_serializing_if = "Option::is_none")]
    pub aquatic_toxicity_acute: Option<String>,
    #[serde(rename = "AquaticToxicityChronic", skip_serializing_if = "Option::is_none")]
    pub aquatic_toxicity_chronic: Option<String>,
    #[serde(rename = "HazardousOzoneLayer", skip_serializing_if = "Option::is_none")]
    pub hazardous_ozone_layer: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationHealthEffect {
    #[serde(rename = "AcuteToxicityOral", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity_oral: Option<String>,
    #[serde(rename = "AcuteToxicityDermal", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity_dermal: Option<String>,
    #[serde(rename = "AcuteToxicityInhalationGas", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity_inhalation_gas: Option<String>,
    #[serde(rename = "AcuteToxicityInhalationVapour", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity_inhalation_vapour: Option<String>,
    #[serde(rename = "AcuteToxicityInhalationDustOrMist", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity_inhalation_dust_or_mist: Option<String>,
    #[serde(rename = "SkinCorrosionIrritation", skip_serializing_if = "Option::is_none")]
    pub skin_corrosion_irritation: Option<String>,
    #[serde(rename = "EyeDamageOrIrritation", skip_serializing_if = "Option::is_none")]
    pub eye_damage_or_irritation: Option<String>,
    #[serde(rename = "RespiratorySensitisation", skip_serializing_if = "Option::is_none")]
    pub respiratory_sensitisation: Option<String>,
    #[serde(rename = "SkinSensitisation", skip_serializing_if = "Option::is_none")]
    pub skin_sensitisation: Option<String>,
    #[serde(rename = "GermCellMutagenicity", skip_serializing_if = "Option::is_none")]
    pub germ_cell_mutagenicity: Option<String>,
    #[serde(rename = "Carcinogenicity", skip_serializing_if = "Option::is_none")]
    pub carcinogenicity: Option<String>,
    #[serde(rename = "ReproductiveToxicity", skip_serializing_if = "Option::is_none")]
    pub reproductive_toxicity: Option<HazardIdentificationClassificationHealthEffectReproductiveToxicity>,
    #[serde(rename = "SpecificTargetOrganSE", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_stoase_opt")]
    pub specific_target_organ_se: Option<Vec<HazardIdentificationClassificationHealthEffectSpecificTargetOrganSE>>,
    #[serde(rename = "SpecificTargetOrganRE", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_stoare_opt")]
    pub specific_target_organ_re: Option<Vec<HazardIdentificationClassificationHealthEffectSpecificTargetOrganRE>>,
    #[serde(rename = "AspirationHazard", skip_serializing_if = "Option::is_none")]
    pub aspiration_hazard: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationHealthEffectReproductiveToxicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Lactation", skip_serializing_if = "Option::is_none")]
    pub lactation: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationHealthEffectSpecificTargetOrganRE {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "TargetOrgan", skip_serializing_if = "Option::is_none")]
    pub target_organ: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationHealthEffectSpecificTargetOrganSE {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "TargetOrgan", skip_serializing_if = "Option::is_none")]
    pub target_organ: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationClassificationPhysicochemicalEffect {
    #[serde(rename = "Explosives", skip_serializing_if = "Option::is_none")]
    pub explosives: Option<String>,
    #[serde(rename = "FlammableGases", skip_serializing_if = "Option::is_none")]
    pub flammable_gases: Option<String>,
    #[serde(rename = "FlammableAerosols", skip_serializing_if = "Option::is_none")]
    pub flammable_aerosols: Option<String>,
    #[serde(rename = "OxidisingGases", skip_serializing_if = "Option::is_none")]
    pub oxidising_gases: Option<String>,
    #[serde(rename = "GasesUnderPressure", skip_serializing_if = "Option::is_none")]
    pub gases_under_pressure: Option<String>,
    #[serde(rename = "FlammableLiquids", skip_serializing_if = "Option::is_none")]
    pub flammable_liquids: Option<String>,
    #[serde(rename = "FlammableSolids", skip_serializing_if = "Option::is_none")]
    pub flammable_solids: Option<String>,
    #[serde(rename = "SelfreactiveSubstancesAndMixtures", skip_serializing_if = "Option::is_none")]
    pub selfreactive_substances_and_mixtures: Option<String>,
    #[serde(rename = "PyrophoricLiquids", skip_serializing_if = "Option::is_none")]
    pub pyrophoric_liquids: Option<String>,
    #[serde(rename = "PyrophoricSolids", skip_serializing_if = "Option::is_none")]
    pub pyrophoric_solids: Option<String>,
    #[serde(rename = "SelfheatingSubstancesAndMixtures", skip_serializing_if = "Option::is_none")]
    pub selfheating_substances_and_mixtures: Option<String>,
    #[serde(rename = "SubstancesWhichInContactWithWaterEmitFlammableGases", skip_serializing_if = "Option::is_none")]
    pub substances_which_in_contact_with_water_emit_flammable_gases: Option<String>,
    #[serde(rename = "OxidisingLiquids", skip_serializing_if = "Option::is_none")]
    pub oxidising_liquids: Option<String>,
    #[serde(rename = "OxidisingSolids", skip_serializing_if = "Option::is_none")]
    pub oxidising_solids: Option<String>,
    #[serde(rename = "OrganicPeroxides", skip_serializing_if = "Option::is_none")]
    pub organic_peroxides: Option<String>,
    #[serde(rename = "CorrosiveToMetals", skip_serializing_if = "Option::is_none")]
    pub corrosive_to_metals: Option<String>,
    #[serde(rename = "DesensitizedExplosives", skip_serializing_if = "Option::is_none")]
    pub desensitized_explosives: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabelling {
    #[serde(rename = "HazardPictogram", skip_serializing_if = "Option::is_none")]
    pub hazard_pictogram: Option<Vec<String>>,
    #[serde(rename = "SignalWord", skip_serializing_if = "Option::is_none")]
    pub signal_word: Option<String>,
    #[serde(rename = "HazardStatement", skip_serializing_if = "Option::is_none")]
    pub hazard_statement: Option<Vec<HazardIdentificationHazardLabellingHazardStatement>>,
    #[serde(rename = "PrecautionaryStatements", skip_serializing_if = "Option::is_none")]
    pub precautionary_statements: Option<HazardIdentificationHazardLabellingPrecautionaryStatements>,
    #[serde(rename = "OtherHazardsInfo", skip_serializing_if = "Option::is_none")]
    pub other_hazards_info: Option<HazardIdentificationHazardLabellingOtherHazardsInfo>,
    #[serde(rename = "SignificantIndicatorsAndEmergencyOverview", skip_serializing_if = "Option::is_none")]
    pub significant_indicators_and_emergency_overview: Option<HazardIdentificationHazardLabellingSignificantIndicatorsAndEmergencyOverview>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingHazardStatement {
    #[serde(rename = "HazardStatementCode", skip_serializing_if = "Option::is_none")]
    pub hazard_statement_code: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingOtherHazardsInfo {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "PhysicochemicalEffect", skip_serializing_if = "Option::is_none")]
    pub physicochemical_effect: Option<String>,
    #[serde(rename = "HealthEffect", skip_serializing_if = "Option::is_none")]
    pub health_effect: Option<String>,
    #[serde(rename = "EnvironmentalEffect", skip_serializing_if = "Option::is_none")]
    pub environmental_effect: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingPrecautionaryStatements {
    #[serde(rename = "Prevention", skip_serializing_if = "Option::is_none")]
    pub prevention: Option<Vec<HazardIdentificationHazardLabellingPrecautionaryStatementsPrevention>>,
    #[serde(rename = "Response", skip_serializing_if = "Option::is_none")]
    pub response: Option<Vec<HazardIdentificationHazardLabellingPrecautionaryStatementsResponse>>,
    #[serde(rename = "Storage", skip_serializing_if = "Option::is_none")]
    pub storage: Option<Vec<HazardIdentificationHazardLabellingPrecautionaryStatementsStorage>>,
    #[serde(rename = "Disposal", skip_serializing_if = "Option::is_none")]
    pub disposal: Option<Vec<HazardIdentificationHazardLabellingPrecautionaryStatementsDisposal>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingPrecautionaryStatementsDisposal {
    #[serde(rename = "PrecautionaryStatementCode", skip_serializing_if = "Option::is_none")]
    pub precautionary_statement_code: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingPrecautionaryStatementsPrevention {
    #[serde(rename = "PrecautionaryStatementCode", skip_serializing_if = "Option::is_none")]
    pub precautionary_statement_code: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingPrecautionaryStatementsResponse {
    #[serde(rename = "PrecautionaryStatementCode", skip_serializing_if = "Option::is_none")]
    pub precautionary_statement_code: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingPrecautionaryStatementsStorage {
    #[serde(rename = "PrecautionaryStatementCode", skip_serializing_if = "Option::is_none")]
    pub precautionary_statement_code: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct HazardIdentificationHazardLabellingSignificantIndicatorsAndEmergencyOverview {
    #[serde(rename = "SignificantIndicators", skip_serializing_if = "Option::is_none")]
    pub significant_indicators: Option<String>,
    #[serde(rename = "EmergencyOverview", skip_serializing_if = "Option::is_none")]
    pub emergency_overview: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Identification {
    #[serde(rename = "TradeProductIdentity", skip_serializing_if = "Option::is_none")]
    pub trade_product_identity: Option<IdentificationTradeProductIdentity>,
    #[serde(rename = "SpecificationNo", skip_serializing_if = "Option::is_none")]
    pub specification_no: Option<Vec<String>>,
    #[serde(rename = "SupplierInformation", skip_serializing_if = "Option::is_none")]
    pub supplier_information: Option<IdentificationSupplierInformation>,
    #[serde(rename = "UseAndUseAdvisedAgainst", skip_serializing_if = "Option::is_none")]
    pub use_and_use_advised_against: Option<IdentificationUseAndUseAdvisedAgainst>,
    #[serde(rename = "DomesticManufacturerInformation", skip_serializing_if = "Option::is_none")]
    pub domestic_manufacturer_information: Option<IdentificationDomesticManufacturerInformation>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationDomesticManufacturerInformation {
    #[serde(rename = "CompanyName", skip_serializing_if = "Option::is_none")]
    pub company_name: Option<String>,
    #[serde(rename = "Department", skip_serializing_if = "Option::is_none")]
    pub department: Option<String>,
    #[serde(rename = "Name", skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(rename = "PostCode", skip_serializing_if = "Option::is_none")]
    pub post_code: Option<String>,
    #[serde(rename = "Address", skip_serializing_if = "Option::is_none")]
    pub address: Option<String>,
    #[serde(rename = "Phone", skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(rename = "WorkingHours", skip_serializing_if = "Option::is_none")]
    pub working_hours: Option<String>,
    #[serde(rename = "Fax", skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(rename = "Email", skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(rename = "CompanyUrl", skip_serializing_if = "Option::is_none")]
    pub company_url: Option<String>,
    #[serde(rename = "EmergencyContact", skip_serializing_if = "Option::is_none")]
    pub emergency_contact: Option<Vec<IdentificationDomesticManufacturerInformationEmergencyContact>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationDomesticManufacturerInformationEmergencyContact {
    #[serde(rename = "CompanyName", skip_serializing_if = "Option::is_none")]
    pub company_name: Option<String>,
    #[serde(rename = "Department", skip_serializing_if = "Option::is_none")]
    pub department: Option<String>,
    #[serde(rename = "Name", skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(rename = "PostCode", skip_serializing_if = "Option::is_none")]
    pub post_code: Option<String>,
    #[serde(rename = "Address", skip_serializing_if = "Option::is_none")]
    pub address: Option<String>,
    #[serde(rename = "Phone", skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(rename = "WorkingHours", skip_serializing_if = "Option::is_none")]
    pub working_hours: Option<String>,
    #[serde(rename = "Fax", skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(rename = "Email", skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(rename = "CompanyUrl", skip_serializing_if = "Option::is_none")]
    pub company_url: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationSupplierInformation {
    #[serde(rename = "CompanyName", skip_serializing_if = "Option::is_none")]
    pub company_name: Option<String>,
    #[serde(rename = "Department", skip_serializing_if = "Option::is_none")]
    pub department: Option<String>,
    #[serde(rename = "Name", skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(rename = "PostCode", skip_serializing_if = "Option::is_none")]
    pub post_code: Option<String>,
    #[serde(rename = "Address", skip_serializing_if = "Option::is_none")]
    pub address: Option<String>,
    #[serde(rename = "Phone", skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(rename = "WorkingHours", skip_serializing_if = "Option::is_none")]
    pub working_hours: Option<String>,
    #[serde(rename = "Fax", skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(rename = "Email", skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(rename = "CompanyUrl", skip_serializing_if = "Option::is_none")]
    pub company_url: Option<String>,
    #[serde(rename = "EmergencyContact", skip_serializing_if = "Option::is_none")]
    pub emergency_contact: Option<Vec<IdentificationSupplierInformationEmergencyContact>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationSupplierInformationEmergencyContact {
    #[serde(rename = "CompanyName", skip_serializing_if = "Option::is_none")]
    pub company_name: Option<String>,
    #[serde(rename = "Department", skip_serializing_if = "Option::is_none")]
    pub department: Option<String>,
    #[serde(rename = "Name", skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(rename = "PostCode", skip_serializing_if = "Option::is_none")]
    pub post_code: Option<String>,
    #[serde(rename = "Address", skip_serializing_if = "Option::is_none")]
    pub address: Option<String>,
    #[serde(rename = "Phone", skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(rename = "WorkingHours", skip_serializing_if = "Option::is_none")]
    pub working_hours: Option<String>,
    #[serde(rename = "Fax", skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(rename = "Email", skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(rename = "CompanyUrl", skip_serializing_if = "Option::is_none")]
    pub company_url: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationTradeProductIdentity {
    #[serde(rename = "TradeNameJP", skip_serializing_if = "Option::is_none")]
    pub trade_name_jp: Option<String>,
    #[serde(rename = "TradeNameEN", skip_serializing_if = "Option::is_none")]
    pub trade_name_en: Option<String>,
    #[serde(rename = "OtherName", skip_serializing_if = "Option::is_none")]
    pub other_name: Option<Vec<String>>,
    #[serde(rename = "ProductNoUser", skip_serializing_if = "Option::is_none")]
    pub product_no_user: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct IdentificationUseAndUseAdvisedAgainst {
    #[serde(rename = "Use", skip_serializing_if = "Option::is_none")]
    pub r#use: Option<Vec<String>>,
    #[serde(rename = "UseAdvisedAgainst", skip_serializing_if = "Option::is_none")]
    pub use_advised_against: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct OtherInformation {
    #[serde(rename = "RelatedDocuments", skip_serializing_if = "Option::is_none")]
    pub related_documents: Option<String>,
    #[serde(rename = "RevisionInformation", skip_serializing_if = "Option::is_none")]
    pub revision_information: Option<Vec<OtherInformationRevisionInformation>>,
    #[serde(rename = "Desclaimer", skip_serializing_if = "Option::is_none")]
    pub desclaimer: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct OtherInformationRevisionInformation {
    #[serde(rename = "LastUpdateDate", skip_serializing_if = "Option::is_none")]
    pub last_update_date: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalProperties {
    #[serde(rename = "BasePhysicalChemicalProperties", skip_serializing_if = "Option::is_none")]
    pub base_physical_chemical_properties: Option<PhysicalChemicalPropertiesBasePhysicalChemicalProperties>,
    #[serde(rename = "MeltingPointRelated", skip_serializing_if = "Option::is_none")]
    pub melting_point_related: Option<Vec<PhysicalChemicalPropertiesMeltingPointRelated>>,
    #[serde(rename = "BoilingPointRelated", skip_serializing_if = "Option::is_none")]
    pub boiling_point_related: Option<Vec<PhysicalChemicalPropertiesBoilingPointRelated>>,
    #[serde(rename = "Flammability", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_vec_string_or_obj_opt")]
    pub flammability: Option<Vec<String>>,
    #[serde(rename = "ExplosionLimit", skip_serializing_if = "Option::is_none")]
    pub explosion_limit: Option<Vec<PhysicalChemicalPropertiesExplosionLimit>>,
    #[serde(rename = "FlashPoint", skip_serializing_if = "Option::is_none")]
    pub flash_point: Option<Vec<PhysicalChemicalPropertiesFlashPoint>>,
    #[serde(rename = "AutoignitionTemperature", skip_serializing_if = "Option::is_none")]
    pub autoignition_temperature: Option<Vec<PhysicalChemicalPropertiesAutoignitionTemperature>>,
    #[serde(rename = "DecompositionTemperature", skip_serializing_if = "Option::is_none")]
    pub decomposition_temperature: Option<Vec<PhysicalChemicalPropertiesDecompositionTemperature>>,
    #[serde(rename = "PhValue", skip_serializing_if = "Option::is_none")]
    pub ph_value: Option<Vec<PhysicalChemicalPropertiesPhValue>>,
    #[serde(rename = "DynamicViscosity", skip_serializing_if = "Option::is_none")]
    pub dynamic_viscosity: Option<Vec<PhysicalChemicalPropertiesDynamicViscosity>>,
    #[serde(rename = "Solubilities", skip_serializing_if = "Option::is_none")]
    pub solubilities: Option<PhysicalChemicalPropertiesSolubilities>,
    #[serde(rename = "PartitionCoefficient", skip_serializing_if = "Option::is_none")]
    pub partition_coefficient: Option<Vec<PhysicalChemicalPropertiesPartitionCoefficient>>,
    #[serde(rename = "VapourPressure", skip_serializing_if = "Option::is_none")]
    pub vapour_pressure: Option<Vec<PhysicalChemicalPropertiesVapourPressure>>,
    #[serde(rename = "Densities", skip_serializing_if = "Option::is_none")]
    pub densities: Option<Vec<PhysicalChemicalPropertiesDensities>>,
    #[serde(rename = "RelativeVapourDensity", skip_serializing_if = "Option::is_none")]
    pub relative_vapour_density: Option<Vec<PhysicalChemicalPropertiesRelativeVapourDensity>>,
    #[serde(rename = "ParticleSize", skip_serializing_if = "Option::is_none")]
    pub particle_size: Option<PhysicalChemicalPropertiesParticleSize>,
    #[serde(rename = "Radioactivity", skip_serializing_if = "Option::is_none")]
    pub radioactivity: Option<Vec<PhysicalChemicalPropertiesRadioactivity>>,
    #[serde(rename = "BulkDensity", skip_serializing_if = "Option::is_none")]
    pub bulk_density: Option<Vec<PhysicalChemicalPropertiesBulkDensity>>,
    #[serde(rename = "BurningPersistence", skip_serializing_if = "Option::is_none")]
    pub burning_persistence: Option<Vec<PhysicalChemicalPropertiesBurningPersistence>>,
    #[serde(rename = "OtherPhysicalChemicalProperty", skip_serializing_if = "Option::is_none")]
    pub other_physical_chemical_property: Option<Vec<PhysicalChemicalPropertiesOtherPhysicalChemicalProperty>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesAutoignitionTemperature {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBasePhysicalChemicalProperties {
    #[serde(rename = "PhysicalState", skip_serializing_if = "Option::is_none")]
    pub physical_state: Option<String>,
    #[serde(rename = "Colour", skip_serializing_if = "Option::is_none")]
    pub colour: Option<String>,
    #[serde(rename = "Odour", skip_serializing_if = "Option::is_none")]
    pub odour: Option<String>,
    #[serde(rename = "OdourThreshold", skip_serializing_if = "Option::is_none")]
    pub odour_threshold: Option<PhysicalChemicalPropertiesBasePhysicalChemicalPropertiesOdourThreshold>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBasePhysicalChemicalPropertiesOdourThreshold {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBoilingPointRelated {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesBoilingPointRelatedCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBoilingPointRelatedCondition {
    #[serde(rename = "PressureValue", skip_serializing_if = "Option::is_none")]
    pub pressure_value: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBulkDensity {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesBurningPersistence {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesDecompositionTemperature {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesDensities {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesDynamicViscosity {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesDynamicViscosityCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesDynamicViscosityCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesExplosionLimit {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesFlashPoint {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesMeltingPointRelated {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesMeltingPointRelatedCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesMeltingPointRelatedCondition {
    #[serde(rename = "PressureValue", skip_serializing_if = "Option::is_none")]
    pub pressure_value: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesOtherPhysicalChemicalProperty {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesParticleSize {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<Vec<PhysicalChemicalPropertiesParticleSizeItemName>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesParticleSizeItemName {
    #[serde(rename = "ItemName", skip_serializing_if = "Option::is_none")]
    pub item_name: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesPartitionCoefficient {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesPartitionCoefficientCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesPartitionCoefficientCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesPhValue {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesPhValueCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesPhValueCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesRadioactivity {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesRelativeVapourDensity {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesSolubilities {
    #[serde(rename = "WaterSolubility", skip_serializing_if = "Option::is_none")]
    pub water_solubility: Option<Vec<PhysicalChemicalPropertiesSolubilitiesWaterSolubility>>,
    #[serde(rename = "OtherSolubility", skip_serializing_if = "Option::is_none")]
    pub other_solubility: Option<Vec<PhysicalChemicalPropertiesSolubilitiesOtherSolubility>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesSolubilitiesOtherSolubility {
    #[serde(rename = "Solvent", skip_serializing_if = "Option::is_none")]
    pub solvent: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesSolubilitiesOtherSolubilityCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesSolubilitiesOtherSolubilityCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesSolubilitiesWaterSolubility {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesSolubilitiesWaterSolubilityCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesSolubilitiesWaterSolubilityCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesVapourPressure {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
    #[serde(rename = "Method", skip_serializing_if = "Option::is_none")]
    pub method: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none")]
    pub condition: Option<PhysicalChemicalPropertiesVapourPressureCondition>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PhysicalChemicalPropertiesVapourPressureCondition {
    #[serde(rename = "Temperature", skip_serializing_if = "Option::is_none")]
    pub temperature: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OtherCondition", skip_serializing_if = "Option::is_none")]
    pub other_condition: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformation {
    #[serde(rename = "PRTRLaw", skip_serializing_if = "Option::is_none")]
    pub prtr_law: Option<RegulatoryInformationPRTRLaw>,
    #[serde(rename = "ISHA", skip_serializing_if = "Option::is_none")]
    pub isha: Option<RegulatoryInformationISHA>,
    #[serde(rename = "PDSCA", skip_serializing_if = "Option::is_none")]
    pub pdsca: Option<RegulatoryInformationPDSCA>,
    #[serde(rename = "OtherLegislation", skip_serializing_if = "Option::is_none")]
    pub other_legislation: Option<RegulatoryInformationOtherLegislation>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationISHA {
    #[serde(rename = "ISHAregulation", skip_serializing_if = "Option::is_none")]
    pub ish_aregulation: Option<Vec<RegulatoryInformationISHAISHAregulation>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationISHAISHAregulation {
    #[serde(rename = "RegulationName", skip_serializing_if = "Option::is_none")]
    pub regulation_name: Option<String>,
    #[serde(rename = "Composition", skip_serializing_if = "Option::is_none")]
    pub composition: Option<Vec<RegulatoryInformationISHAISHAregulationComposition>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationISHAISHAregulationComposition {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "ImplementationDate", skip_serializing_if = "Option::is_none")]
    pub implementation_date: Option<String>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<RegulatoryInformationISHAISHAregulationCompositionConcentration>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationISHAISHAregulationCompositionConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationOtherLegislation {
    #[serde(rename = "Legislation", skip_serializing_if = "Option::is_none")]
    pub legislation: Option<Vec<RegulatoryInformationOtherLegislationLegislation>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationOtherLegislationLegislation {
    #[serde(rename = "LegislationName", skip_serializing_if = "Option::is_none")]
    pub legislation_name: Option<String>,
    #[serde(rename = "Regulations", skip_serializing_if = "Option::is_none")]
    pub regulations: Option<Vec<RegulatoryInformationOtherLegislationLegislationRegulations>>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationOtherLegislationLegislationRegulations {
    #[serde(rename = "RegulationName", skip_serializing_if = "Option::is_none")]
    pub regulation_name: Option<String>,
    #[serde(rename = "Composition", skip_serializing_if = "Option::is_none")]
    pub composition: Option<Vec<RegulatoryInformationOtherLegislationLegislationRegulationsComposition>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationOtherLegislationLegislationRegulationsComposition {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "ImplementationDate", skip_serializing_if = "Option::is_none")]
    pub implementation_date: Option<String>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<RegulatoryInformationOtherLegislationLegislationRegulationsCompositionConcentration>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationOtherLegislationLegislationRegulationsCompositionConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPDSCA {
    #[serde(rename = "Composition", skip_serializing_if = "Option::is_none")]
    pub composition: Option<Vec<RegulatoryInformationPDSCAComposition>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPDSCAComposition {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "RegulationName", skip_serializing_if = "Option::is_none")]
    pub regulation_name: Option<String>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "ImplementationDate", skip_serializing_if = "Option::is_none")]
    pub implementation_date: Option<String>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<RegulatoryInformationPDSCACompositionConcentration>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPDSCACompositionConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPRTRLaw {
    #[serde(rename = "Composition", skip_serializing_if = "Option::is_none")]
    pub composition: Option<Vec<RegulatoryInformationPRTRLawComposition>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPRTRLawComposition {
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "Classification", skip_serializing_if = "Option::is_none")]
    pub classification: Option<String>,
    #[serde(rename = "JPSNo", skip_serializing_if = "Option::is_none")]
    pub jps_no: Option<String>,
    #[serde(rename = "isApplicable", skip_serializing_if = "Option::is_none")]
    pub is_applicable: Option<bool>,
    #[serde(rename = "ImplementationDate", skip_serializing_if = "Option::is_none")]
    pub implementation_date: Option<String>,
    #[serde(rename = "Concentration", skip_serializing_if = "Option::is_none")]
    pub concentration: Option<RegulatoryInformationPRTRLawCompositionConcentration>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RegulatoryInformationPRTRLawCompositionConcentration {
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct StabilityReactivity {
    #[serde(rename = "ReactivityDescription", skip_serializing_if = "Option::is_none")]
    pub reactivity_description: Option<String>,
    #[serde(rename = "StabilityDescription", skip_serializing_if = "Option::is_none")]
    pub stability_description: Option<String>,
    #[serde(rename = "HazardousReactions", skip_serializing_if = "Option::is_none")]
    pub hazardous_reactions: Option<StabilityReactivityHazardousReactions>,
    #[serde(rename = "ConditionsToAvoid", skip_serializing_if = "Option::is_none")]
    pub conditions_to_avoid: Option<String>,
    #[serde(rename = "MaterialsToAvoid", skip_serializing_if = "Option::is_none")]
    pub materials_to_avoid: Option<String>,
    #[serde(rename = "HazardousDecompositionProducts", skip_serializing_if = "Option::is_none")]
    pub hazardous_decomposition_products: Option<StabilityReactivityHazardousDecompositionProducts>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct StabilityReactivityHazardousDecompositionProducts {
    #[serde(rename = "Substance", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub substance: Option<String>,
    #[serde(rename = "Condition", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub condition: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct StabilityReactivityHazardousReactions {
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "Flammability", skip_serializing_if = "Option::is_none")]
    pub flammability: Option<String>,
    #[serde(rename = "IgnitionCharacteristics", skip_serializing_if = "Option::is_none")]
    pub ignition_characteristics: Option<String>,
    #[serde(rename = "OxidizingProperties", skip_serializing_if = "Option::is_none")]
    pub oxidizing_properties: Option<String>,
    #[serde(rename = "SelfReactivityAndExplosiveness", skip_serializing_if = "Option::is_none")]
    pub self_reactivity_and_explosiveness: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformation {
    #[serde(rename = "CompositionType", skip_serializing_if = "Option::is_none")]
    pub composition_type: Option<String>,
    #[serde(rename = "SubstanceIdentifiers", skip_serializing_if = "Option::is_none")]
    pub substance_identifiers: Option<SubstanceIdentifiers>,
    #[serde(rename = "AcuteToxicity", skip_serializing_if = "Option::is_none")]
    pub acute_toxicity: Option<ToxicologicalInformationAcuteToxicity>,
    #[serde(rename = "SkinCorrosionIrritation", skip_serializing_if = "Option::is_none")]
    pub skin_corrosion_irritation: Option<ToxicologicalInformationSkinCorrosionIrritation>,
    #[serde(rename = "EyeDamageOrIrritation", skip_serializing_if = "Option::is_none")]
    pub eye_damage_or_irritation: Option<ToxicologicalInformationEyeDamageOrIrritation>,
    #[serde(rename = "RespiratorySensitisation", skip_serializing_if = "Option::is_none")]
    pub respiratory_sensitisation: Option<ToxicologicalInformationRespiratorySensitisation>,
    #[serde(rename = "SkinSensitisation", skip_serializing_if = "Option::is_none")]
    pub skin_sensitisation: Option<ToxicologicalInformationSkinSensitisation>,
    #[serde(rename = "GermCellMutagenicity", skip_serializing_if = "Option::is_none")]
    pub germ_cell_mutagenicity: Option<ToxicologicalInformationGermCellMutagenicity>,
    #[serde(rename = "Carcinogenicity", skip_serializing_if = "Option::is_none")]
    pub carcinogenicity: Option<ToxicologicalInformationCarcinogenicity>,
    #[serde(rename = "ReproductiveToxicity", skip_serializing_if = "Option::is_none")]
    pub reproductive_toxicity: Option<ToxicologicalInformationReproductiveToxicity>,
    #[serde(rename = "SpecificTargetOrganSE", skip_serializing_if = "Option::is_none")]
    pub specific_target_organ_se: Option<ToxicologicalInformationSpecificTargetOrganSE>,
    #[serde(rename = "SpecificTargetOrganRE", skip_serializing_if = "Option::is_none")]
    pub specific_target_organ_re: Option<ToxicologicalInformationSpecificTargetOrganRE>,
    #[serde(rename = "AspirationHazard", skip_serializing_if = "Option::is_none")]
    pub aspiration_hazard: Option<ToxicologicalInformationAspirationHazard>,
    #[serde(rename = "AdditionalToxicologicalInformation", skip_serializing_if = "Option::is_none")]
    pub additional_toxicological_information: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAcuteToxicity {
    #[serde(rename = "ExposureRoute", skip_serializing_if = "Option::is_none")]
    pub exposure_route: Option<Vec<ToxicologicalInformationAcuteToxicityExposureRoute>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAcuteToxicityExposureRoute {
    #[serde(rename = "ExposureRouteName", skip_serializing_if = "Option::is_none")]
    pub exposure_route_name: Option<String>,
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationAcuteToxicityExposureRouteResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAcuteToxicityExposureRouteResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "Ate", skip_serializing_if = "Option::is_none")]
    pub ate: Option<Vec<ToxicologicalInformationAcuteToxicityExposureRouteResultAte>>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAcuteToxicityExposureRouteResultAte {
    #[serde(rename = "AteTypes", skip_serializing_if = "Option::is_none")]
    pub ate_types: Option<String>,
    #[serde(rename = "NumericRangeWithUnitAndQualifier", skip_serializing_if = "Option::is_none")]
    pub numeric_range_with_unit_and_qualifier: Option<NumericRangeWithUnitAndQualifier>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAspirationHazard {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationAspirationHazardResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationAspirationHazardResult {
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "DynamicViscosity", skip_serializing_if = "Option::is_none")]
    pub dynamic_viscosity: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationCarcinogenicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "EvaluationOrganization", skip_serializing_if = "Option::is_none")]
    pub evaluation_organization: Option<Vec<ToxicologicalInformationCarcinogenicityEvaluationOrganization>>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationCarcinogenicityResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationCarcinogenicityEvaluationOrganization {
    #[serde(rename = "OrganizationName", skip_serializing_if = "Option::is_none")]
    pub organization_name: Option<String>,
    #[serde(rename = "EvaluationResults", skip_serializing_if = "Option::is_none")]
    pub evaluation_results: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
    #[serde(rename = "ExplanatoryNotes", skip_serializing_if = "Option::is_none")]
    pub explanatory_notes: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationCarcinogenicityResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationEyeDamageOrIrritation {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationEyeDamageOrIrritationResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationEyeDamageOrIrritationResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationGermCellMutagenicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationGermCellMutagenicityResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationGermCellMutagenicityResult {
    #[serde(rename = "Species", skip_serializing_if = "Option::is_none")]
    pub species: Option<String>,
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationReproductiveToxicity {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "ReproductiveEffects", skip_serializing_if = "Option::is_none")]
    pub reproductive_effects: Option<String>,
    #[serde(rename = "DevelopmentalEffects", skip_serializing_if = "Option::is_none")]
    pub developmental_effects: Option<String>,
    #[serde(rename = "Lactation", skip_serializing_if = "Option::is_none")]
    pub lactation: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationReproductiveToxicityResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationReproductiveToxicityResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationRespiratorySensitisation {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationRespiratorySensitisationResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationRespiratorySensitisationResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSkinCorrosionIrritation {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationSkinCorrosionIrritationResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSkinCorrosionIrritationResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSkinSensitisation {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationSkinSensitisationResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSkinSensitisationResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "HumanExperience", skip_serializing_if = "Option::is_none")]
    pub human_experience: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganRE {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "TargetOrgan", skip_serializing_if = "Option::is_none")]
    pub target_organ: Option<Vec<String>>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationSpecificTargetOrganREResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganREResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "STOTData", skip_serializing_if = "Option::is_none")]
    pub stot_data: Option<Vec<ToxicologicalInformationSpecificTargetOrganREResultSTOTData>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganREResultSTOTData {
    #[serde(rename = "Dose/Concentration", skip_serializing_if = "Option::is_none")]
    pub dose_concentration: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OrganAffected", skip_serializing_if = "Option::is_none")]
    pub organ_affected: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "ResultEvaluation", skip_serializing_if = "Option::is_none")]
    pub result_evaluation: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganSE {
    #[serde(rename = "Category", skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(rename = "TargetOrgan", skip_serializing_if = "Option::is_none")]
    pub target_organ: Option<Vec<String>>,
    #[serde(rename = "Rationale", skip_serializing_if = "Option::is_none")]
    pub rationale: Option<String>,
    #[serde(rename = "Result", skip_serializing_if = "Option::is_none")]
    pub result: Option<Vec<ToxicologicalInformationSpecificTargetOrganSEResult>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganSEResult {
    #[serde(rename = "toxicityTestInfo", skip_serializing_if = "Option::is_none")]
    pub toxicity_test_info: Option<ToxicityTestInfo>,
    #[serde(rename = "STOTData", skip_serializing_if = "Option::is_none")]
    pub stot_data: Option<Vec<ToxicologicalInformationSpecificTargetOrganSEResultSTOTData>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToxicologicalInformationSpecificTargetOrganSEResultSTOTData {
    #[serde(rename = "Dose/Concentration", skip_serializing_if = "Option::is_none")]
    pub dose_concentration: Option<f64>,
    #[serde(rename = "Unit", skip_serializing_if = "Option::is_none")]
    pub unit: Option<String>,
    #[serde(rename = "OrganAffected", skip_serializing_if = "Option::is_none")]
    pub organ_affected: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "ResultEvaluation", skip_serializing_if = "Option::is_none")]
    pub result_evaluation: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformation {
    #[serde(rename = "InternationalRegulations", skip_serializing_if = "Option::is_none")]
    pub international_regulations: Option<Vec<TransportInformationInternationalRegulations>>,
    #[serde(rename = "DomesticRegulations", skip_serializing_if = "Option::is_none")]
    pub domestic_regulations: Option<Vec<TransportInformationDomesticRegulations>>,
    #[serde(rename = "SpecialPrecautionUser", skip_serializing_if = "Option::is_none")]
    pub special_precaution_user: Option<Vec<TransportInformationSpecialPrecautionUser>>,
    #[serde(rename = "SpecialProvisions", skip_serializing_if = "Option::is_none")]
    pub special_provisions: Option<Vec<TransportInformationSpecialProvisions>>,
    #[serde(rename = "AccidentalReleaseMeasures", skip_serializing_if = "Option::is_none")]
    pub accidental_release_measures: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformationDomesticRegulations {
    #[serde(rename = "TransportationType", skip_serializing_if = "Option::is_none")]
    pub transportation_type: Option<String>,
    #[serde(rename = "LegislationName", skip_serializing_if = "Option::is_none")]
    pub legislation_name: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "Erg", skip_serializing_if = "Option::is_none")]
    pub erg: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformationInternationalRegulations {
    #[serde(rename = "RegulationName", skip_serializing_if = "Option::is_none")]
    pub regulation_name: Option<Vec<TransportInformationInternationalRegulationsRegulationName>>,
    #[serde(rename = "MarinePollutant", skip_serializing_if = "Option::is_none")]
    pub marine_pollutant: Option<String>,
    #[serde(rename = "TransportInBulkSubstanceName", skip_serializing_if = "Option::is_none")]
    pub transport_in_bulk_substance_name: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformationInternationalRegulationsRegulationName {
    #[serde(rename = "TransportationType", skip_serializing_if = "Option::is_none")]
    pub transportation_type: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_string_opt")]
    pub full_text: Option<String>,
    #[serde(rename = "UnNo", skip_serializing_if = "Option::is_none")]
    pub un_no: Option<String>,
    #[serde(rename = "ProperShippingName", skip_serializing_if = "Option::is_none")]
    pub proper_shipping_name: Option<String>,
    #[serde(rename = "DangerReleasingSubstance", skip_serializing_if = "Option::is_none")]
    pub danger_releasing_substance: Option<String>,
    #[serde(rename = "PackingGroup", skip_serializing_if = "Option::is_none")]
    pub packing_group: Option<String>,
    #[serde(rename = "SubsidiaryRisk", skip_serializing_if = "Option::is_none")]
    pub subsidiary_risk: Option<String>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformationSpecialPrecautionUser {
    #[serde(rename = "TransportationType", skip_serializing_if = "Option::is_none")]
    pub transportation_type: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_vec_string_opt")]
    pub full_text: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TransportInformationSpecialProvisions {
    #[serde(rename = "TransportationType", skip_serializing_if = "Option::is_none")]
    pub transportation_type: Option<String>,
    #[serde(rename = "FullText", skip_serializing_if = "Option::is_none",
            default, deserialize_with = "crate::schema::serde_flex::flex_vec_string_opt")]
    pub full_text: Option<Vec<String>>,
    #[serde(rename = "AdditionalInfo", skip_serializing_if = "Option::is_none")]
    pub additional_info: Option<AdditionalInfo>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SdsRoot {
    #[serde(rename = "Datasheet", skip_serializing_if = "Option::is_none")]
    pub datasheet: Option<Datasheet>,
    #[serde(rename = "Identification", skip_serializing_if = "Option::is_none")]
    pub identification: Option<Identification>,
    #[serde(rename = "HazardIdentification", skip_serializing_if = "Option::is_none")]
    pub hazard_identification: Option<HazardIdentification>,
    #[serde(rename = "Composition", skip_serializing_if = "Option::is_none")]
    pub composition: Option<Composition>,
    #[serde(rename = "FirstAidMeasures", skip_serializing_if = "Option::is_none")]
    pub first_aid_measures: Option<FirstAidMeasures>,
    #[serde(rename = "FireFightingMeasures", skip_serializing_if = "Option::is_none")]
    pub fire_fighting_measures: Option<FireFightingMeasures>,
    #[serde(rename = "AccidentalReleaseMeasures", skip_serializing_if = "Option::is_none")]
    pub accidental_release_measures: Option<AccidentalReleaseMeasures>,
    #[serde(rename = "HandlingAndStorage", skip_serializing_if = "Option::is_none")]
    pub handling_and_storage: Option<HandlingAndStorage>,
    #[serde(rename = "ExposureControlPersonalProtection", skip_serializing_if = "Option::is_none")]
    pub exposure_control_personal_protection: Option<ExposureControlPersonalProtection>,
    #[serde(rename = "PhysicalChemicalProperties", skip_serializing_if = "Option::is_none")]
    pub physical_chemical_properties: Option<PhysicalChemicalProperties>,
    #[serde(rename = "StabilityReactivity", skip_serializing_if = "Option::is_none")]
    pub stability_reactivity: Option<StabilityReactivity>,
    #[serde(rename = "ToxicologicalInformation", skip_serializing_if = "Option::is_none")]
    pub toxicological_information: Option<Vec<ToxicologicalInformation>>,
    #[serde(rename = "EcologicalInformation", skip_serializing_if = "Option::is_none")]
    pub ecological_information: Option<Vec<EcologicalInformation>>,
    #[serde(rename = "DisposalConsiderations", skip_serializing_if = "Option::is_none")]
    pub disposal_considerations: Option<DisposalConsiderations>,
    #[serde(rename = "TransportInformation", skip_serializing_if = "Option::is_none")]
    pub transport_information: Option<TransportInformation>,
    #[serde(rename = "RegulatoryInformation", skip_serializing_if = "Option::is_none")]
    pub regulatory_information: Option<RegulatoryInformation>,
    #[serde(rename = "OtherInformation", skip_serializing_if = "Option::is_none")]
    pub other_information: Option<OtherInformation>,
}
