<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element type="simulation" name="Simulation"/>

  <xs:element type="crossAssetModel" name="CrossAssetModel"/>

  <xs:complexType name="simulation">
    <xs:all>
      <xs:element type="parameters" name="Parameters" minOccurs="0" maxOccurs="1"/>
      <xs:element type="crossAssetModel" name="CrossAssetModel" minOccurs="0" maxOccurs="1"/>
      <xs:element type="market" name="Market" minOccurs="0" maxOccurs="1"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="parameters">
    <xs:all>
      <xs:element type="xs:string" name="Grid"/>
      <xs:element type="xs:string" name="Calendar"/>
      <xs:element type="dayCounter" name="DayCounter" minOccurs="0"/>
      <!-- can be multiple so we don't use calendar type -->
      <xs:element type="sequenceType" name="Sequence"/>
      <!-- does not exist anymore, keep for schema backwards compatibility -->
      <xs:element type="xs:string" name="Scenario" minOccurs="0"/>
      <!-- deprecated, this moved to crossAssetModel below -->
      <xs:element type="discretizationType" name="Discretization" minOccurs="0"/>
      <!-- FIXME: remove this -->
      <xs:element type="xs:integer" name="Seed"/>
      <xs:element type="xs:positiveInteger" name="Samples"/>
      <xs:element type="SobolBrownianGeneratorOrdering" name="Ordering" minOccurs="0"/>
      <xs:element type="SobolRsgDirectionIntegers" name="DirectionIntegers" minOccurs="0"/>
      <xs:element type="xs:string" name="CloseOutLag" minOccurs="0"/>
      <xs:element type="mporMode" name="MporMode" minOccurs="0"/>
      <xs:element type="xs:integer" name="TimeStepsPerYear" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:simpleType name="mporMode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ActualDate"/>
      <xs:enumeration value="StickyDate"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="discretizationType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Exact"/>
      <xs:enumeration value="Euler"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="SobolBrownianGeneratorOrdering">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Factors"/>
      <xs:enumeration value="Steps"/>
      <xs:enumeration value="Diagonal"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="SobolRsgDirectionIntegers">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Unit"/>
      <xs:enumeration value="Jaeckel"/>
      <xs:enumeration value="SobolLevitan"/>
      <xs:enumeration value="SobolLevitanLemieux"/>
      <xs:enumeration value="JoeKuoD5"/>
      <xs:enumeration value="JoeKuoD6"/>
      <xs:enumeration value="JoeKuoD7"/>
      <xs:enumeration value="Kuo"/>
      <xs:enumeration value="Kuo2"/>
      <xs:enumeration value="Kuo3"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="salvagingAlgoType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="None"/>
      <xs:enumeration value="Spectral"/>
      <xs:enumeration value="Hypersphere"/>
      <xs:enumeration value="LowerDiagonal"/>
      <xs:enumeration value="Higham"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="sequenceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="MersenneTwister"/>
      <xs:enumeration value="MersenneTwisterAntithetic"/>
      <xs:enumeration value="Sobol"/>
      <xs:enumeration value="SobolBrownianBridge"/>
      <xs:enumeration value="Burley2020SobolBrownianBridge"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="crossAssetModel">
    <xs:all>
      <xs:element type="currencyCode" name="DomesticCcy"/>
      <!-- FIXME: Currency not Ccy -->
      <xs:element name="Currencies" maxOccurs="1" minOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="currencyCode" name="Currency" maxOccurs="unbounded" minOccurs="1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Equities" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="Equity" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="InflationIndices" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="InflationIndex" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CreditNames" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="CreditName" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Commodities" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="Commodity" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element type="xs:float" name="BootstrapTolerance" maxOccurs="1" />
      <xs:element type="measureType" name="Measure" minOccurs="0" maxOccurs="1" />
      <xs:element type="discretizationType" name="Discretization" minOccurs="0"/>
      <xs:element type="salvagingAlgoType" name="SalvagingAlgorithm" minOccurs="0"/>
      <xs:element type="xs:string" name="IntegrationPolicy" minOccurs="0"/>
      <xs:element type="bool" name="PiecewiseIntegration" minOccurs="0"/>
      <xs:element name="InterestRateModels" maxOccurs="1" >
        <xs:complexType>
          <xs:choice>
            <xs:sequence>
              <xs:element type="lgm" name="LGM" maxOccurs="unbounded" minOccurs="1"/>
            </xs:sequence>
            <xs:sequence>
              <xs:element type="hw" name="HWModel" maxOccurs="unbounded" minOccurs="1"/>
            </xs:sequence>
          </xs:choice>
            <!-- FIXME: poor name -->
        </xs:complexType>
      </xs:element>
      <xs:element name="ForeignExchangeModels" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="crossCurrencyLGM" name="CrossCcyLGM" maxOccurs="unbounded" minOccurs="0"/>
            <!-- FIXME: poor name (Ccy & LGM) -->
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="EquityModels" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="crossAssetLGM" name="CrossAssetLGM" maxOccurs="unbounded" minOccurs="0"/>
            <!-- FIXME: poor name -->
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="InflationIndexModels" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element type="lgm" name="LGM"/>
              <xs:element type="jarrowYildrim" name="JarrowYildirim"/>
              <xs:element type="dodgsonKainth" name="DodgsonKainth"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CreditModels" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element type="crlgm" name="LGM"/>
              <xs:element type="cir" name="CIR"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CommodityModels" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="commoditySchwartz" name="CommoditySchwartz" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CreditStates" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:integer" name="NumberOfFactors"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="InstantaneousCorrelations" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Correlation" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="correlationValue">
                    <xs:attribute type="xs:string" name="factor1" use="required"/>
                    <xs:attribute type="xs:string" name="factor2" use="required"/>
                    <xs:attribute type="xs:string" name="index1"/>
                    <xs:attribute type="xs:string" name="index2"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
  </xs:complexType>

  <xs:simpleType name="correlationValue">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="-1.0"/>
      <xs:maxInclusive value="1.0"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="calibrationCpiCapFloor">
    <xs:sequence>
      <xs:element type="capFloor" name="Type"/>
      <xs:element type="xs:string" name="Maturity"/>
      <xs:element type="xs:string" name="Strike"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="calibrationYoYCapFloor">
    <xs:sequence>
      <xs:element type="capFloor" name="Type"/>
      <xs:element type="xs:string" name="Tenor"/>
      <xs:element type="xs:string" name="Strike"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="calibrationYoYSwap">
    <xs:sequence>
      <xs:element type="xs:string" name="Tenor"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="calibrationBasket">
    <xs:choice>
      <xs:element type="calibrationCpiCapFloor" name="CpiCapFloor" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element type="calibrationYoYCapFloor" name="YoYCapFloor" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element type="calibrationYoYSwap" name="YoYSwap" minOccurs="1" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attribute type="xs:string" name="parameter" />
  </xs:complexType>
  
  <xs:complexType name="lgm">
    <xs:all>
      <xs:element type="currencyCode" name="Currency" maxOccurs="1" minOccurs="0"/>
      <xs:element type="calibrationTypeType" name="CalibrationType"/>
      <xs:element name="Volatility">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="volatilityTypeType" name="VolatilityType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <!-- FIXME: comma delimited list -->
            <xs:element type="xs:string" name="InitialValue"/>
            <!-- FIXME: comma delimited list -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Reversion">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="reversionTypeType" name="ReversionType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationSwaptions" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries"/>
            <!-- FIXME: comma delimited list -->
            <xs:element type="xs:string" name="Terms"/>
            <!-- FIXME: comma delimited list -->
            <xs:element type="xs:string" name="Strikes"/>
            <!-- FIXME: comma delimited list -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationCapFloors" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="CapFloor"/>
            <xs:element type="xs:string" name="Expiries"/>
            <!-- FIXME: comma delimited list -->
            <xs:element type="xs:string" name="Strikes"/>
            <!-- FIXME: comma delimited list -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationBaskets" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="calibrationBasket" name="CalibrationBasket" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="ParameterTransformation">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:float" name="ShiftHorizon"/>
            <xs:element type="xs:float" name="Scaling"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element type="floatSpreadMappingType" name="FloatSpreadMapping" minOccurs="0"/>
    </xs:all>
    <xs:attribute type="currencyCodeWithDefault" name="ccy"/>
    <!-- FIXME: currency not ccy -->
    <xs:attribute type="xs:string" name="index" />
    <!-- FIXME: currency not ccy -->
    <xs:attribute type="xs:string" name="key" />
  </xs:complexType>

  <xs:simpleType name="floatSpreadMappingType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="NextCoupon"/>
      <xs:enumeration value="ProRata"/>
      <xs:enumeration value="Simple"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="hw">
  <xs:all>
    <xs:element type="currencyCode" name="Currency" maxOccurs="1" minOccurs="0"/>
    <xs:element type="calibrationTypeType" name="CalibrationType"/>
    <xs:element name="Volatility" minOccurs="0">
      <xs:complexType>
        <xs:all>
          <xs:element type="bool" name="Calibrate"/>
		  <xs:element type="volatilityTypeType" name="VolatilityType" minOccurs="0"/>
          <xs:element type="paramTypeType" name="ParamType"/>
          <xs:element type="xs:string" name="TimeGrid"/>
          <!-- FIXME: comma delimited list -->
          <xs:element name="InitialValue">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="Sigma" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element type="xs:string" name="Row" maxOccurs="unbounded" minOccurs="1"/>
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <!-- FIXME: comma delimited list -->
        </xs:all>
      </xs:complexType>
    </xs:element>
    <xs:element name="Reversion">
      <xs:complexType>
        <xs:all>
          <xs:element type="bool" name="Calibrate"/>
		  <xs:element type="reversionTypeType" name="ReversionType" minOccurs="0"/>
          <xs:element type="paramTypeType" name="ParamType"/>
          <xs:element type="xs:string" name="TimeGrid"/>
          <xs:element name="InitialValue" maxOccurs="1" minOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element type="xs:string" name="Kappa" maxOccurs="unbounded" minOccurs="1"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:all>
      </xs:complexType>
    </xs:element>
    <xs:element name="PCALoadings" minOccurs="0">
      <xs:complexType>
        <xs:sequence>
          <xs:element type="xs:string" name="Loadings" maxOccurs="unbounded" minOccurs="1"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    <!-- FIXME: comma delimited list -->
    <xs:element type="volatilityParameter" name="PCASigma0" minOccurs="0"/>
    <xs:element type="xs:string" name="PCASigmaRatios" minOccurs="0"/>
    <!-- FIXME: comma delimited list -->
    <xs:element name="CalibrationSwaptions" maxOccurs="1" minOccurs="0">
      <xs:complexType>
        <xs:all>
          <xs:element type="xs:string" name="Expiries"/>
          <!-- FIXME: comma delimited list -->
          <xs:element type="xs:string" name="Terms"/>
          <!-- FIXME: comma delimited list -->
          <xs:element type="xs:string" name="Strikes"/>
          <!-- FIXME: comma delimited list -->
        </xs:all>
      </xs:complexType>
    </xs:element>
  </xs:all>
  <xs:attribute type="currencyCodeWithDefault" name="ccy"/>
  <!-- FIXME: currency not ccy -->
  <xs:attribute type="xs:string" name="index"/>
  <xs:attribute type="xs:string" name="key"/>
  </xs:complexType>
  
  <xs:complexType name="volatilityParameter">
    <xs:all>
      <xs:element type="volatilityTypeType" name="VolatilityType" minOccurs="0"/>
      <xs:element type="bool" name="Calibrate"/>
      <xs:element type="paramTypeType" name="ParamType"/>
      <xs:element type="xs:string" name="TimeGrid" minOccurs="0"/>
      <xs:element type="xs:string" name="InitialValue"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="reversionParameter">
    <xs:all>
      <xs:element type="reversionTypeType" name="ReversionType"/>
      <xs:element type="bool" name="Calibrate"/>
      <xs:element type="paramTypeType" name="ParamType"/>
      <xs:element type="xs:string" name="TimeGrid" minOccurs="0"/>
      <xs:element type="xs:string" name="InitialValue"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="lgmReversionTransformation">
    <xs:sequence>
      <xs:element type="xs:float" name="ShiftHorizon"/>
      <xs:element type="xs:float" name="Scaling"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="boundaryConstraint">
    <xs:sequence>
      <xs:element type="xs:float" name="LowerBound"/>
      <xs:element type="xs:float" name="UpperBound"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="parameter" use="required"/>
  </xs:complexType>
  
  <xs:complexType name="calibrationConfiguration">
    <xs:sequence>
      <xs:element type="positiveDecimal" name="RmseTolerance" maxOccurs="1" minOccurs="0"/>
      <xs:element type="xs:positiveInteger" name="MaxIterations" maxOccurs="1" minOccurs="0"/>
      <xs:element name="Constraints" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="boundaryConstraint" name="BoundaryConstraint" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="jarrowYildrim">
    <xs:all>
      <xs:element type="currencyCode" name="Currency"/>
      <xs:element type="calibrationTypeType" name="CalibrationType"/>
      <xs:element name="CalibrationBaskets" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="calibrationBasket" name="CalibrationBasket" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="RealRate">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="volatilityParameter" name="Volatility"/>
            <xs:element type="reversionParameter" name="Reversion"/>
            <xs:element type="lgmReversionTransformation" name="ParameterTransformation"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Index">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="volatilityParameter" name="Volatility"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element type="calibrationConfiguration" name="CalibrationConfiguration" maxOccurs="1" minOccurs="0"/>
    </xs:all>
    <xs:attribute type="xs:string" name="index" />
  </xs:complexType>

  <xs:complexType name="dodgsonKainth">
    <xs:all>
      <xs:element type="currencyCode" name="Currency"/>
      <xs:element type="calibrationTypeType" name="CalibrationType"/>
      <xs:element name="CalibrationBaskets" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="calibrationBasket" name="CalibrationBasket" minOccurs="1" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Reversion">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="reversionTypeType" name="ReversionType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Volatility">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="volatilityTypeType" name="VolatilityType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <!-- FIXME: comma delimited list -->
            <xs:element type="xs:string" name="InitialValue"/>
            <!-- FIXME: comma delimited list -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="ParameterTransformation">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:float" name="ShiftHorizon"/>
            <xs:element type="xs:float" name="Scaling"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element type="calibrationConfiguration" name="CalibrationConfiguration" maxOccurs="1" minOccurs="0"/>
    </xs:all>
    <xs:attribute type="xs:string" name="index" />
  </xs:complexType>

  <xs:complexType name="cir">
    <xs:sequence>
      <xs:element type="currencyCode" name="Currency" maxOccurs="1" minOccurs="0"/>
      <xs:element type="calibrationTypeType" name="CalibrationType"/>
      <xs:element type="xs:string" name="CalibrationStrategy"/>
      <xs:element type="xs:float" name="StartValue"/>
      <xs:element type="xs:float" name="ReversionValue"/>
      <xs:element type="xs:float" name="LongTermValue"/>
      <xs:element type="xs:float" name="Volatility"/>
      <xs:element type="bool" name="RelaxedFeller"/>
      <xs:element type="xs:float" name="FellerFactor"/>
      <xs:element type="xs:float" name="Tolerance"/>
      <xs:element name="CalibrationCdsOptions">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Terms"/>
            <xs:element type="xs:string" name="Strikes"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="crlgm">
    <xs:all>
      <xs:element type="currencyCode" name="Currency" maxOccurs="1" minOccurs="0"/>
      <xs:element type="calibrationTypeType" name="CalibrationType"/>
      <xs:element name="Volatility">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="volatilityTypeType" name="VolatilityType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Reversion">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="reversionTypeType" name="ReversionType"/>
            <xs:element type="paramTypeType" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationCdsOptions" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Terms"/>
            <xs:element type="xs:string" name="Strikes"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="ParameterTransformation" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:float" name="ShiftHorizon"/>
            <xs:element type="xs:float" name="Scaling"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element type="floatSpreadMappingType" name="FloatSpreadMapping" minOccurs="0"/>
    </xs:all>
    <xs:attribute type="xs:string" name="name"/>
  </xs:complexType>

  <xs:simpleType name="calibrationTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Bootstrap"/>
      <xs:enumeration value="BestFit"/>
      <xs:enumeration value="None"/>
      <xs:enumeration value="StatisticalWithRiskNeutralVolatility"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="volatilityTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Hagan"/>
      <xs:enumeration value="HullWhite"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="paramTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Constant"/>
      <xs:enumeration value="Piecewise"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="reversionTypeType">
    <!-- just use volatilityTypeType ?-->
    <xs:restriction base="xs:string">
      <xs:enumeration value="Hagan"/>
      <xs:enumeration value="HullWhite"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="measureType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="LGM"/>
      <xs:enumeration value="BA"/>
      <xs:enumeration value=""/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="crossCurrencyLGM">
    <xs:all>
      <!-- FIXME: Why is this here every time?? -->
      <xs:element type="currencyCode" name="DomesticCcy"/>
      <!-- FIXME: Currency not Ccy -->
      <xs:element type="xs:string" name="CalibrationType"/>
      <xs:element name="Sigma">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="xs:string" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <!-- FIXME: comma delimited lists -->
            <xs:element type="xs:string" name="InitialValue"/>
            <!-- FIXME: comma delimited lists -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationOptions" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries" minOccurs="0"/>
            <!-- FIXME: comma delimited lists -->
            <xs:element type="xs:string" name="Strikes"  minOccurs="0"/>
            <!-- FIXME: comma delimited lists -->
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute type="currencyCodeWithDefault" name="foreignCcy" use="required"/>
  </xs:complexType>

  <xs:complexType name="crossAssetLGM">
    <xs:all>
      <!-- FIXME: Why is this here every time?? -->
      <xs:element type="currencyCode" name="Currency" />
      <!-- FIXME: Currency not Ccy -->
      <xs:element type="xs:string" name="CalibrationType"/>
      <xs:element name="Sigma">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="xs:string" name="ParamType"/>
            <xs:element type="xs:string" name="TimeGrid"/>
            <!-- FIXME: comma delimited lists -->
            <xs:element type="xs:string" name="InitialValue"/>
            <!-- FIXME: comma delimited lists -->
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationOptions" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries"/>
            <!-- FIXME: comma delimited lists -->
            <xs:element type="xs:string" name="Strikes"/>
            <!-- FIXME: comma delimited lists -->
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute type="xs:string" name="name" use="required"/>
  </xs:complexType>

  <xs:complexType name="commoditySchwartz">
    <xs:all>
      <xs:element type="currencyCode" name="Currency" />
      <xs:element type="xs:string" name="CalibrationType"/>
      <xs:element name="Sigma">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Kappa">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate"/>
            <xs:element type="xs:string" name="InitialValue"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Seasonality" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Calibrate" minOccurs="0"/>
            <xs:element type="paramTypeType" name="ParamType" minOccurs="0"/>
            <xs:element type="xs:string" name="TimeGrid" minOccurs="0"/>
            <xs:element type="xs:string" name="InitialValue" minOccurs="0"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CalibrationOptions" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Strikes"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element type="xs:boolean" name="DriftFreeState" minOccurs="0"/>
    </xs:all>
    <xs:attribute type="xs:string" name="name" use="required"/>
  </xs:complexType>

  <xs:simpleType name="default">
    <xs:restriction base="xs:string">
      <xs:enumeration value="default"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="currencyCodeWithDefault">
    <xs:union memberTypes="currencyCode default"/>
  </xs:simpleType>

  <xs:complexType name="market">
    <xs:all>
      <xs:element type="currencyCode" name="BaseCurrency"/>
      <xs:element name="Currencies">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="currencyCode" name="Currency" maxOccurs="unbounded" minOccurs="1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="YieldCurves">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Configuration" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:all>
                  <xs:element type="xs:string" name="Tenors"/>
                  <xs:element type="ycInterpolation" name="Interpolation" minOccurs="0"/>
                  <xs:element type="ycExtrapolation" name="Extrapolation" minOccurs="0"/>
                  <xs:element type="dayCounter" name="DayCounter" minOccurs="0"/>
                </xs:all>
                <xs:attribute name="curve" type="xs:string" use="optional" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="FxRates" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element name="CurrencyPairs" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="currencyPair" name="CurrencyPair" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Indices" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="indexNameType" name="Index" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="SwapIndices" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SwapIndex" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:all>
                  <xs:element type="xs:string" name="Name"/>
                  <xs:element type="indexNameType" name="ForwardingIndex" minOccurs="0"/>
                  <xs:element type="indexNameType" name="DiscountingIndex"/>
                </xs:all>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="DefaultCurves" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:all>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Tenors"/>
            <xs:element type="xs:boolean" name="SimulateSurvivalProbabilities" minOccurs="0"/>
            <xs:element type="xs:boolean" name="SimulateRecoveryRates" minOccurs="0"/>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Calendars" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Calendar" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
	    <xs:element type="defaultCurveExtrapolation" name="Extrapolation" minOccurs="0"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="Equities" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="SimulateEquityForecastCurve" maxOccurs="1" minOccurs="0"/>
            <xs:element type="bool" name="SimulateDividendYield" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="DividendTenors"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="SwaptionVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Keys" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Key" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
	    <!-- deprecated -->
            <xs:element name="Currencies" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="currencyCode" name="Currency" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Expiries">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string" use="optional"/>
                    <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="Terms">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string" use="optional"/>
                    <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:boolean" name="SimulateATMOnly" maxOccurs="1" minOccurs="0"/>
            <xs:element name="StrikeSpreads" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string" use="optional"/>
                    <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
			  <xs:attribute name="key" type="xs:string" use="optional"/>
			  <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="YieldVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Terms"/>
            <xs:element type="xs:boolean" name="SimulateATMOnly" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Cube" minOccurs="0">
              <xs:complexType>
                <xs:all>
                  <xs:element type="xs:string" name="StrikeSpreads" maxOccurs="1" minOccurs="0"/>
                </xs:all>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="ccy" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CapFloorVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Keys" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Key" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
	    <!-- deprecated -->
            <xs:element name="Currencies" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="currencyCode" name="Currency" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Expiries" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string" use="optional"/>
                    <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="Strikes" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string" use="optional"/>
                    <xs:attribute name="ccy" type="xs:string" use="optional"/> <!-- deprecated -->
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="ccy" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="bool" name="AdjustOptionletPillars" maxOccurs="1" minOccurs="0"/>
            <xs:element type="bool" name="UseCapAtm" maxOccurs="1" minOccurs="0"/>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CDSVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="FxVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate"  maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay" maxOccurs="1" minOccurs="0"/>
            <xs:element name="CurrencyPairs" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="currencyPair" name="CurrencyPair" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Expiries" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="ccyPair" type="xs:string" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:boolean" name="SimulateATMOnly" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Surface" minOccurs="0">
              <xs:complexType>
                <xs:choice>
                  <xs:element name="Moneyness" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="ccyPair" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="StandardDeviations" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="ccyPair" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:choice>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="ccyPair" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="EquityVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate"  maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Expiries" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="name" type="xs:string" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:boolean" name="SimulateATMOnly" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Surface" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Moneyness" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="StandardDeviations" maxOccurs="unbounded" minOccurs="0">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="BenchmarkCurves" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="BenchmarkCurve" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:all>
                  <xs:element type="currencyCode" name="Currency" maxOccurs="1"/>
                  <xs:element type="xs:string" name="Name" maxOccurs="1"/>
                </xs:all>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Securities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Names" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CPRs" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Names" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CpiIndices" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="Index" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="ZeroInflationIndexCurves" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Tenors"/>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="YYInflationIndexCurves" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:all>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Tenors"/>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="CPICapFloorVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Strikes"/>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="YYCapFloorVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Expiries"/>
            <xs:element type="xs:string" name="Strikes"/>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Commodities" maxOccurs="1" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="1" minOccurs="0"/>
            <xs:element name="Names" maxOccurs="1" minOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Name" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="Tenors" maxOccurs="unbounded" minOccurs="1">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="name" type="xs:string" use="optional"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="CommodityVolatilities" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate"  maxOccurs="1" minOccurs="0"/>
            <xs:element type="xs:boolean" name="SimulateATMOnly" maxOccurs="1" minOccurs="0"/>
            <xs:element type="timeDecayType" name="ReactionToTimeDecay"/>
            <xs:element name="Names">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="Name" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:all>
                        <xs:element type="xs:string" name="Expiries"/>
                        <xs:element type="xs:string" name="Moneyness" maxOccurs="1" minOccurs="0"/>
                      </xs:all>
                      <xs:attribute name="id" type="xs:string" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="DayCounter" maxOccurs="1" minOccurs="0"/>
            <xs:element name="SmileDynamics" maxOccurs="unbounded" minOccurs="0">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="key" type="xs:string"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AggregationScenarioDataCurrencies" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="currencyCode" name="Currency" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AggregationScenarioDataIndices" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="indexNameType" name="Index" maxOccurs="unbounded" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AggregationScenarioDataCreditStates" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:integer" name="NumberOfFactors"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="AggregationScenarioDataSurvivalWeights" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="Name" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="BaseCorrelations"  minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="bool" name="Simulate" maxOccurs="unbounded" minOccurs="0"/>
            <xs:element name="IndexNames">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="IndexName" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Terms" maxOccurs="unbounded" minOccurs="0"/>
            <xs:element type="xs:string" name="DetachmentPoints" maxOccurs="unbounded" minOccurs="0"/>
            <xs:element name="DayCounters" maxOccurs="1" minOccurs="0">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="DayCounter" maxOccurs="unbounded" minOccurs="1">
                    <xs:complexType>
                      <xs:simpleContent>
                        <xs:extension base="xs:string">
                          <xs:attribute name="name" type="xs:string" use="optional"/>
                        </xs:extension>
                      </xs:simpleContent>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Correlations" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:all>
            <xs:element type="bool" name="Simulate"  maxOccurs="1" minOccurs="0"/>
            <xs:element name="Pairs">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:string" name="Pair" maxOccurs="unbounded" minOccurs="0"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element type="xs:string" name="Expiries"/>
          </xs:all>
        </xs:complexType>
      </xs:element> 
      <xs:element name="CreditStates" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="NumberOfFactors"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element type="curveAlgebra" name="CurveAlgebra" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="curveAlgebra">
    <xs:sequence>
      <xs:element type="curveAlgebraCurve" name="Curve" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="curveAlgebraCurve">
    <xs:all>
      <xs:element type="xs:string" name="Key"/>
      <xs:element type="curveAlgebraCurveOperation" name="Operation"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="curveAlgebraCurveOperation">
    <xs:all>
      <xs:element type="xs:string" name="Type"/>
      <xs:element name="Arguments" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element type="xs:string" name="Argument" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
  </xs:complexType>

  <xs:simpleType name="ycInterpolation">
    <xs:restriction base="xs:string">
      <xs:enumeration value="LogLinear"/>
      <xs:enumeration value="LinearZero"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ycExtrapolation">
    <xs:restriction base="xs:string">
      <xs:enumeration value="FlatFwd"/>
      <xs:enumeration value="FlatZero"/>
      <!-- deprecated, for backwards compatibility only -->
      <xs:enumeration value="Y"/>
      <xs:enumeration value="YES"/>
      <xs:enumeration value="TRUE"/>
      <xs:enumeration value="True"/>
      <xs:enumeration value="true"/>
      <xs:enumeration value="1"/>
      <xs:enumeration value="N"/>
      <xs:enumeration value="NO"/>
      <xs:enumeration value="FALSE"/>
      <xs:enumeration value="False"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="0"/>
      <xs:enumeration value=""/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="defaultCurveExtrapolation">
    <xs:restriction base="xs:string">
      <xs:enumeration value="FlatFwd"/>
      <xs:enumeration value="FlatZero"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="timeDecayType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ForwardVariance"/>
      <xs:enumeration value="ConstantVariance"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
